/* =========================================================================
   SMS Masivos — Modo oscuro (eje de modo)
   -------------------------------------------------------------------------
   Capa SEMÁNTICA de superficies/texto/bordes + overrides de modo oscuro.

   Eje ORTOGONAL al acento (UsuarioPanelColor / [data-theme]). El acento
   (--app-primary, #1aa5fc etc.) NO cambia entre modos — solo cambian las
   superficies neutras. Por eso no hace falta crear blue-dark/green-dark…:
   son ~12 tokens redefinidos UNA vez bajo [data-mode="dark"].

   Activación: atributo data-mode="light|dark" en <html>, aplicado por un
   script inline blocking en view.general.php (anti-flash, igual que
   data-theme). La preferencia se decide SERVER-SIDE: se persiste por usuario
   en usuarioConf.UsuarioConfColorMode, se hidrata en $_SESSION["UsuarioColorMode"]
   (Sessions::updateUserSession) y PHP la hornea en el HTML. localStorage queda
   como espejo para feedback inmediato del toggle. Default light.

   Carga: view.generalassets.php::loadCSS(), DESPUÉS de
   smsmasivos-design-tokens-color.css y del chrome legacy (style-base,
   general.style, panel, menu) ⇒ gana por orden de cascada. Paleta dark
   armonizada con el modo oscuro de la documentación de la API.

   IMPORTANTE: todas las reglas de dark viven bajo [data-mode="dark"]. En
   light el selector no matchea ⇒ el modo claro queda IDÉNTICO (aditivo).
   ========================================================================= */

/* =========================================================================
   1. TOKENS SEMÁNTICOS — light (= valores neutrals actuales, sin regresión)
   -------------------------------------------------------------------------
   Cualquier override de [data-mode="dark"] consume estos tokens; en light
   resuelven a los mismos valores que el panel ya usa.
   ========================================================================= */
:root {
	--app-bg:            var(--app-neutral-100);   /* #f8fafc — fondo de página */
	--app-surface:       var(--app-neutral-white); /* #ffffff — cards, modales, inputs */
	--app-surface-2:     var(--app-neutral-200);   /* #f1f5f9 — sidebar, topbar, thead */
	--app-surface-3:     var(--app-neutral-300);   /* #e2e8f0 — hover de filas/items, code */
	--app-text:          var(--app-neutral-800);   /* #1e293b — texto principal */
	--app-text-strong:   var(--app-neutral-700);   /* #334155 — headings */
	--app-text-muted:    var(--app-neutral-600);   /* #64748b — captions, .text-muted */
	--app-text-disabled: var(--app-neutral-500);   /* #94a3b8 — disabled */
	--app-border:        var(--app-neutral-300);   /* #e2e8f0 — bordes/dividers */
	--app-border-strong: var(--app-neutral-400);   /* #cbd5e1 — bordes hover/focus */
	--app-shadow-color:  rgba(0, 0, 0, 0.10);
	--app-overlay:       rgba(15, 23, 42, 0.5);
}

/* =========================================================================
   2. TOKENS SEMÁNTICOS — dark (paleta armonizada con la documentación API)
   ========================================================================= */
[data-mode="dark"] {
	color-scheme: dark;

	/* Paleta "Graphite" — gris neutro-cálido (familia Tailwind zinc), inspirada en
	   Vercel / Linear / shadcn / Material. Reemplaza el slate frío azulado anterior por
	   un gris neutro; el accent de marca (--app-primary) queda intacto sobre el lienzo
	   neutro (combo superficies-neutras + accent-de-color, muy usado en sitios modernos).
	   Ganadora del banco de paletas (de feature/dark-palette-experiments). */
	--app-bg:            #18181b;   /* canvas: página + sidebar + topbar (zinc-900) */
	/* Variante "surface-darker" (v2, casi fusionado con --app-bg): la primera pasada
	   (#232326) seguía leyendo con demasiado contraste. Se pide expresamente BAJO
	   contraste vs --app-bg — casi imperceptible, apoyándose en que .card/.modal-content
	   ya se delimitan por border-color, no por el fill. #1b1b1e mantiene el orden de
	   elevación bg < surface < surface-2 < surface-3 (afecta TODOS los consumidores de
	   --app-surface: cards, modales, dropdowns, tablas, dropify, .screen-wrap...). */
	--app-surface:       #1b1b1e;   /* cards, modales, dropdowns, .screen-wrap */
	--app-surface-2:     #1f1f23;   /* secundaria: thead, striped, addons */
	--app-surface-3:     #323238;   /* hover / activo */
	--app-slate:         #2f3d4a;   /* slate de acento dark: burbuja SMS, tarjeta/badge seleccionado, divisores del wizard, bordes de datasource */
	--app-text:          #d4d4d8;   /* zinc-300 */
	--app-text-strong:   #fafafa;   /* zinc-50 */
	--app-text-muted:    #a1a1aa;   /* zinc-400 */
	--app-text-disabled: #71717a;   /* zinc-500 */
	--app-border:        #2e2e33;
	--app-border-strong: #3f3f46;   /* zinc-700 */
	--app-shadow-color:  rgba(0, 0, 0, 0.45);
	--app-overlay:       rgba(0, 0, 0, 0.65);

	/* Acento atenuado (reemplaza --app-primary ENTERO en dark, no solo el menú):
	   el vívido original --app-primary-base "no convencía" repetido en todo el panel
	   (menú, botones, links, badges, focus rings...) sin variación. Se deriva de
	   --app-primary-base (nunca de --app-primary mismo — auto-referencia = ciclo
	   inválido en CSS) mezclado con --app-text-muted, theme-agnostic. Con esto TODO
	   consumidor existente de var(--app-primary) hereda el mismo tono suavizado de
	   forma automática y consistente (sin tokens dedicados por componente). Contraste
	   vs --app-bg ~6.4-6.5:1 en los 6 temas (pasa AA/AAA). */
	--app-primary: color-mix(in srgb, var(--app-primary-base) 55%, var(--app-text-muted));
	/* hover/light recalculados a partir del --app-primary YA atenuado (no del base)
	   para conservar la relación "un paso más oscuro/claro" del botón; si quedaran
	   fijos en el valor vívido original, el hover se vería más saturado que el propio
	   botón en reposo — la misma inconsistencia que se está corrigiendo. */
	--app-primary-hover: color-mix(in srgb, var(--app-primary) 82%, black);
	--app-primary-light: color-mix(in srgb, var(--app-primary) 75%, white);

	/* Accent tinteado (R1): el --app-primary-muted base es 10% (afinado para fondo claro)
	   y casi no se ve sobre oscuro. color-mix lo deriva del --app-primary del tema
	   activo ⇒ theme-agnostic.
	   Variante "surface-highlight": el tinte azul (1.43:1 vs --app-bg, no pasa SC 1.4.11
	   3:1) se reemplaza por la superficie neutra elevada — el acento queda solo en
	   texto/ícono/borde del ítem activo, desacoplando los dos requisitos de contraste
	   que competían por ser el mismo hue. */
	--app-primary-muted: var(--app-surface-3);

	/* Navy adaptado (R3): --app-deep (#14477e en blue) es ilegible sobre oscuro; se mapea
	   al accent del tema (ya atenuado arriba) para que cualquier consumidor de
	   var(--app-deep) se adapte solo (sustituye los parches manuales caso-por-caso
	   del resto del archivo). Esto incluye los íconos/encabezados del menú
	   (style-base.css:6744,6764) — ya no hacen falta overrides dedicados: heredan el
	   mismo --app-primary atenuado que el resto del panel. */
	--app-deep: var(--app-primary);

	/* Estados (R2): el background tinted sube a 0.18 (contraste sobre superficie oscura) y
	   el FG se aclara al nivel 400 — los 500/600 afinados para claro "vibran" en dark. */
	--app-success: #34d399;
	--app-error:   #f87171;
	--app-warning: #fbbf24;
	--app-info:    #60a5fa;
	--app-success-muted: rgba(16, 185, 129, 0.18);
	--app-error-muted:   rgba(239, 68, 68, 0.18);
	--app-warning-muted: rgba(245, 158, 11, 0.18);
	--app-info-muted:    rgba(59, 130, 246, 0.18);

	/* Tokens namespaced de subaccountDetails.css: se usan SIEMPRE con fallback
	   (var(--sad-x, <claro>)) y NUNCA se definen ⇒ al darles valor aquí se
	   adaptan de una vez sus 15 usos: bordes de tarjetas de permisos/ajustes,
	   fondo del header de "Otros", textos secundarios y acento de las tabs del
	   modal de edición. Namespaced ⇒ sin colisión con otras vistas. */
	--sad-border-color: var(--app-border);
	--sad-text-light:   var(--app-text-muted);
	--sad-bg-light:     var(--app-surface-2);
	--sad-primary:      var(--app-primary);
}

/* =========================================================================
   3. BASE — html / body / scrollbars
   ========================================================================= */
/* data-mode vive EN el <html>, por eso el propio <html> se selecciona con
   html[data-mode="dark"] (no con el combinador descendente, que buscaría un
   <html> anidado e inexistente). El <body> sí es descendiente. */
html[data-mode="dark"],
[data-mode="dark"] body {
	background: var(--app-bg) !important;
	color: var(--app-text);
}

[data-mode="dark"] ::-webkit-scrollbar { width: 12px; height: 12px; }
[data-mode="dark"] ::-webkit-scrollbar-track { background: var(--app-surface-2); }
[data-mode="dark"] ::-webkit-scrollbar-thumb {
	background: var(--app-border-strong);
	border-radius: var(--app-radius-full);
	border: 3px solid var(--app-surface-2);
}
[data-mode="dark"] { scrollbar-color: var(--app-border-strong) var(--app-surface-2); }

/* Selección de texto (R5): por defecto el navegador usa su azul; la tematizamos con un
   tinte del accent del tema para coherencia en dark. */
[data-mode="dark"] ::selection {
	background: color-mix(in srgb, var(--app-primary) 32%, transparent);
	color: var(--app-text-strong);
}

/* =========================================================================
   4. SHELL — topbar, page-wrapper, sidebar
   ========================================================================= */
[data-mode="dark"] .page-wrapper,
[data-mode="dark"] .container-fluid {
	background: var(--app-bg) !important;
}

/* Barra de encabezado de página (.page-titles): style-default.css:2483 la pinta
   #ffffff con borde inferior #cccccc. En dark se mimetiza con el fondo de página
   (#1b1d23, ~--app-bg) en vez de quedar como barra elevada — los títulos no deben
   resaltar sobre el contenido. */
[data-mode="dark"] .page-titles {
	background: var(--app-bg) !important;
	border-bottom-color: var(--app-border) !important;
}
/* Excepción: loadModalLayout (view.general.php:726) inyecta la barra .page-titles
   DENTRO de .modal-content > .modal-body. Ahí el #1b1d23 (color de página) rompe la
   unificación con la superficie del modal (--app-surface). Scoped al modal → transparente
   para mimetizarse con la superficie. Cubre todos los modales armados con el helper. */
[data-mode="dark"] .modal-content .page-titles {
	background: transparent !important;
}

[data-mode="dark"] .topbar {
	background: var(--app-bg) !important;
	border-bottom: 1px solid var(--app-border) !important;
}
[data-mode="dark"] .topbar .top-navbar .navbar-nav > .nav-item > .nav-link,
[data-mode="dark"] .topbar .nav-link {
	color: var(--app-text);
}

[data-mode="dark"] .left-sidebar,
[data-mode="dark"] .sidebar-footer {
	background: var(--app-bg) !important;
}
/* Fondo de scroll-sidebar y sidebar-nav SOLO en sidebar expandido. En
   mini-sidebar estos wrappers tienen overflow:visible y el <a> proyectado
   en hover (260px) sale del rail de 60px; si tuvieran fondo oscuro parecería
   que el sidebar entero se expandió. Mismo guard que el legacy -color.css:114-120
   (el data-theme$="-dark" legacy no aplica en este eje data-mode). */
[data-mode="dark"] body:not(.mini-sidebar) .scroll-sidebar,
[data-mode="dark"] body:not(.mini-sidebar) .sidebar-nav {
	background: var(--app-bg) !important;
}
/* El borde derecho del sidebar es #14477e (deep blue) en style-base.css.
   Se adapta al borde neutro del modo oscuro. */
[data-mode="dark"] .left-sidebar { border-right-color: var(--app-border) !important; }
/* Menú "cortado" en compacto: el body es `fix-sidebar mini-sidebar`, y el
   template revierte el sidebar a `position:absolute` SOLO en mini-sidebar
   (.mini-sidebar.fix-sidebar .left-sidebar{position:absolute}). Como #main-wrapper
   no tiene altura, el height:100% del sidebar no llega al fondo del documento y
   queda a la altura de su contenido ⇒ debajo asoma la página (#1a1d23). En full
   el sidebar ya es fixed (no se corta); en mini no. Forzamos fixed + 100vh (lo
   mismo que hace fix-sidebar en modo full) para que el fondo cubra la ventana
   completa en cualquier scroll. Solo-dark; el scroll del menú lo maneja el
   .scroll-sidebar interno (slimscroll). */
[data-mode="dark"] .left-sidebar {
	position: fixed !important;
	height: 100vh !important;
}
[data-mode="dark"] .sidebar-nav ul li a { color: var(--app-text); }
[data-mode="dark"] .sidebar-nav ul li a:hover { background: var(--app-surface-3); }
[data-mode="dark"] .sidebar-footer a { color: var(--app-text-muted); }
/* Ícono top-level en reposo (style-base.css:6764, .sidebar-nav>ul>li>a i) y encabezado
   de sección (style-base.css:6744, .sidebar-nav ul li.nav-small-cap) heredan
   --app-deep, que arriba ya se redefine como el --app-primary atenuado ⇒ no hace
   falta ningún override dedicado aquí: quedan en el mismo tono suave que el resto
   del panel (antes: azul vívido, indistinguible del ítem activo). */

/* Sub-menú flotante en mini-sidebar — flota SOBRE el contenido ⇒ elevación (surface),
   no el bg del riel, para que se lea como panel emergente y no como extensión del rail. */
[data-mode="dark"] .mini-sidebar .sidebar-nav #sidebarnav > li > ul {
	background: var(--app-surface);
}

/* Ítem proyectado en hover (mini-sidebar). El <a> sale del rail oscuro; le
   damos una superficie elevada (--app-border-strong #3a4047, por encima del
   rail --app-surface-2 y del hover genérico --app-surface-3) para leer como
   "tab". !important para ganar sobre el tinte de los ítems .active (que sí
   aplica aquí porque viene del acento data-theme). Espejo de -color.css:128-139. */
@media (min-width: 768px) {
	[data-mode="dark"] .mini-sidebar .sidebar-nav #sidebarnav > li:hover > a,
	[data-mode="dark"] .mini-sidebar .sidebar-nav #sidebarnav > li.active:hover > a,
	[data-mode="dark"] .mini-sidebar .sidebar-nav #sidebarnav > li:hover > a.active {
		background: var(--app-border-strong) !important;
	}
}

/* =========================================================================
   5. TIPOGRAFÍA — headings, texto principal, muted
   -------------------------------------------------------------------------
   Los links/acentos quedan intactos (vienen de --app-primary). Aquí solo se
   invierten los neutros de texto que en light son oscuros.
   ========================================================================= */
[data-mode="dark"] h1,
[data-mode="dark"] h2,
[data-mode="dark"] h3,
[data-mode="dark"] h4,
[data-mode="dark"] h5,
[data-mode="dark"] .page-titles h3,
[data-mode="dark"] .card-title,
[data-mode="dark"] .modal-title {
	color: var(--app-text-strong);
}
[data-mode="dark"] p,
[data-mode="dark"] label,
[data-mode="dark"] .control-label,
[data-mode="dark"] li,
[data-mode="dark"] span:not(.badge):not(.label),
[data-mode="dark"] dt,
[data-mode="dark"] dd {
	color: inherit;
}
[data-mode="dark"] small:not(.label),
[data-mode="dark"] .text-muted,
[data-mode="dark"] .card-subtitle {
	color: var(--app-text-muted) !important;
}
[data-mode="dark"] .text-dark { color: var(--app-text) !important; }
/* Acento como TEXTO: el template hardcodea `html body .text-primary { color:#14477e !important }`
   (navy, specificity 0,1,2) que GANA al token `.text-primary{color:var(--app-primary)}` (0,1,0).
   Ese navy es legible en light (sobre blanco) pero se pierde sobre superficies dark. Restauramos
   el acento del panel (var(--app-primary), brillante y adaptado por tema). Selector (0,2,1) +
   !important vence al template (0,1,2). Va `body` y NO `html` por el eje data-mode (gotcha #1). */
[data-mode="dark"] body .text-primary { color: var(--app-primary) !important; }
[data-mode="dark"] hr { border-color: var(--app-border); }

/* =========================================================================
   6. COMPONENTES — cards, modales, dropdowns, forms, tablas, botones, etc.
   ========================================================================= */

/* Cards / cajas blancas / wells */
[data-mode="dark"] .card,
[data-mode="dark"] .white-box,
[data-mode="dark"] .card-radius {
	background: var(--app-surface) !important;
	border-color: var(--app-border) !important;
	color: var(--app-text);
}
[data-mode="dark"] .well {
	background: var(--app-surface-2);
	border-color: var(--app-border);
}
/* Encabezado de card / acordeón (.card-header — Bootstrap 4, bootstrap.css:4488):
   usa rgba(0,0,0,0.03) + borde rgba(0,0,0,0.125), que sobre superficie oscura casi
   no se ven. Lo pasamos a un tinte blanco translúcido (mismo "ligeramente distinto"
   que en claro, pero adaptado a oscuro) + borde neutro. */
[data-mode="dark"] .card-header {
	background-color: rgba(255, 255, 255, 0.03);
	border-bottom-color: var(--app-border);
	color: var(--app-text);
}

/* Modales */
[data-mode="dark"] .modal-content {
	background: var(--app-surface) !important;
	color: var(--app-text);
	/* R4: en dark la sombra (rgba negro) es invisible; un borde 1px define el modal
	   (el .modal-content base trae border:none). */
	border: 1px solid var(--app-border) !important;
}
[data-mode="dark"] .modal-header { border-bottom-color: var(--app-border); }
[data-mode="dark"] .modal-footer { border-top-color: var(--app-border); }
[data-mode="dark"] .modal-backdrop.in { opacity: 0.7; }
[data-mode="dark"] .close { color: var(--app-text); text-shadow: none; opacity: 0.7; }

/* Dropdowns */
[data-mode="dark"] .dropdown-menu {
	background: var(--app-surface) !important;
	border-color: var(--app-border) !important;
}
[data-mode="dark"] .dropdown-menu > li > a,
[data-mode="dark"] .dropdown-item { color: var(--app-text); }
[data-mode="dark"] .dropdown-menu > li > a:hover,
[data-mode="dark"] .dropdown-menu > li > a:focus,
[data-mode="dark"] .dropdown-item:hover { background: var(--app-surface-3); color: var(--app-text); }
[data-mode="dark"] .dropdown-divider,
[data-mode="dark"] .dropdown-menu .divider { background-color: var(--app-border); }

/* Dropdown de perfil en la topbar (.dropdown-menu.scale-up): sus items van dentro
   de <ul.dropdown-user>, así que el selector genérico .dropdown-menu > li > a (hijo
   directo) NO los alcanza. style-default.css:2422 les fija color #6b7c85 y hover
   #EFF1F3, por eso en dark se veían distintos al resto del menú. Los alineamos al
   color de los items del menú principal (sidebar → --app-text). */
[data-mode="dark"] .topbar ul.dropdown-user li a { color: var(--app-text); }
[data-mode="dark"] .topbar ul.dropdown-user li a:hover,
[data-mode="dark"] .topbar ul.dropdown-user li a:hover i,
[data-mode="dark"] .topbar ul.dropdown-user li a:active,
[data-mode="dark"] .topbar ul.dropdown-user li a:active i {
	background: var(--app-surface-3);
	color: var(--app-text);
}
[data-mode="dark"] .topbar ul.dropdown-user li.divider { background-color: var(--app-border); }

/* Inputs / forms */
[data-mode="dark"] .form-control,
[data-mode="dark"] input[type="text"],
[data-mode="dark"] input[type="email"],
[data-mode="dark"] input[type="password"],
[data-mode="dark"] input[type="number"],
[data-mode="dark"] input[type="tel"],
[data-mode="dark"] input[type="url"],
[data-mode="dark"] input[type="search"],
[data-mode="dark"] input[type="date"],
[data-mode="dark"] input[type="time"],
[data-mode="dark"] input[type="datetime-local"],
[data-mode="dark"] textarea,
[data-mode="dark"] select {
	background: var(--app-surface) !important;
	color: var(--app-text) !important;
	border-color: var(--app-border) !important;
}
[data-mode="dark"] .form-control::placeholder { color: var(--app-text-muted); }
[data-mode="dark"] .form-control:disabled,
[data-mode="dark"] .form-control[readonly] { background: var(--app-surface-2) !important; color: var(--app-text-disabled) !important; }
[data-mode="dark"] .input-group-addon {
	background: var(--app-surface-2);
	border-color: var(--app-border);
	color: var(--app-text-muted);
}

/* Tablas */
[data-mode="dark"] .table,
[data-mode="dark"] table.dataTable { color: var(--app-text); }
[data-mode="dark"] .table td,
[data-mode="dark"] .table th { border-color: var(--app-border) !important; color: var(--app-text); }
[data-mode="dark"] .table thead th,
[data-mode="dark"] table.dataTable thead th {
	color: var(--app-text-strong);
	border-bottom-color: var(--app-border) !important;
}
[data-mode="dark"] .table-striped > tbody > tr:nth-of-type(odd),
[data-mode="dark"] .table-striped > tbody > tr:nth-of-type(odd) > td {
	background: var(--app-surface-2);
}
/* DataTables core pinta las filas en #ffffff y la fila seleccionada en #B0BED9.
   Esto cubre TODAS las DataTables del panel (agendas, reportes, contactos…). */
[data-mode="dark"] table.dataTable tbody tr { background-color: var(--app-surface) !important; }
[data-mode="dark"] table.dataTable tbody td { color: var(--app-text); border-color: var(--app-border) !important; }
[data-mode="dark"] table.dataTable tbody tr.selected,
[data-mode="dark"] table.dataTable tbody tr.selected td { background-color: var(--app-surface-3) !important; }

/* Botones secundarios (los primary/info/danger vienen del acento — intactos).
   .btn-light no está definido (clase de BS4/5; este template es BS3) ⇒ queda como
   .btn base transparente y se veía blanco sobre el modal. .modalcancelar = cancelar
   de modales. .btn-secondary (cancelar gris) solo dentro de modales, para NO tocar
   los toggles .btn-group label.btn-secondary. */
[data-mode="dark"] .btn-default,
[data-mode="dark"] .btn-white,
[data-mode="dark"] .btn-white.disabled,
[data-mode="dark"] .btn-light,
[data-mode="dark"] .modalcancelar,
[data-mode="dark"] .modal-content .btn-secondary,
[data-mode="dark"] .btn-outline-secondary {
	background: var(--app-surface) !important;
	color: var(--app-text) !important;
	border-color: var(--app-border-strong) !important;
}
[data-mode="dark"] .btn-default:hover,
[data-mode="dark"] .btn-white:hover,
[data-mode="dark"] .btn-light:hover,
[data-mode="dark"] .modalcancelar:hover,
[data-mode="dark"] .modal-content .btn-secondary:hover,
[data-mode="dark"] .btn-outline-secondary:hover {
	background: var(--app-surface-3) !important;
}
/* El chevron del perfil usa .btn-outline-secondary como ícono — solo color */
[data-mode="dark"] .profile-account-icon.btn-outline-secondary {
	background: transparent !important;
	border: none !important;
	color: var(--app-text-muted) !important;
}

/* .btn-danger: en light es rojo sólido (--app-error, color.css:193). En dark lo
   pasamos a relleno rojo translúcido (#ef44441f ≈ 12% sobre la superficie) con
   borde rojo, para que pese menos visualmente sin perder la semántica. No hay
   estados :hover/:focus propios ⇒ esta regla base cubre todo. */
[data-mode="dark"] .btn-danger {
	background-color: #ef44441f !important;
	border-color: var(--app-error) !important;
	color: #ffffff !important;
}

/* .btn-success: mismo problema que .btn-danger tenía — en light es verde menta
   sólido hardcoded (#49DA96, style-base.css:1356-1384, NI SIQUIERA usa el token
   --app-success) + texto blanco. Mismo criterio: relleno translúcido (reusa
   --app-success-muted, ya definido) + borde --app-success, en vez del fill
   sólido que cansaba la vista. */
[data-mode="dark"] .btn-success {
	background-color: var(--app-success-muted) !important;
	border-color: var(--app-success) !important;
	color: #ffffff !important;
}

/* Tabs */
[data-mode="dark"] .nav-tabs { border-bottom-color: var(--app-border); }
[data-mode="dark"] .nav-tabs > li > a { color: var(--app-text-muted); }
[data-mode="dark"] .nav-tabs > li.active > a,
[data-mode="dark"] .nav-tabs > li.active > a:focus,
[data-mode="dark"] .nav-tabs > li.active > a:hover { color: var(--app-text) !important; }
/* Tab activo estilo Bootstrap 4 (.nav-link.active — mycampaigns, reports, etc.):
   bootstrap.css:3889 lo pinta background-color:#fff con bordes claros, y la regla
   BS3 de arriba NO lo alcanza (aquí el .active va en el <a>, no en el <li>). Lo
   hacemos transparente para que se mimetice con el fondo. NO tocamos border-bottom-
   color → el subrayado activo de .customtab (#99abb4) se conserva. */
[data-mode="dark"] .nav-tabs .nav-link.active,
[data-mode="dark"] .nav-tabs .nav-item.show .nav-link {
	color: var(--app-text);
	background-color: var(--app-surface-3);
	border-top-color: var(--app-border);
	border-left-color: var(--app-border);
	border-right-color: var(--app-border);
}

/* Tabs verticales (.vtabs.customvtab .tabs-vertical — cuenta/myaccount; style-default.css:4757,4778):
   items inactivos en #263238 (invisible sobre el fondo oscuro) → muted legible; activo/hover/focus
   con fondo blanco + texto/borde #99abb4 → caja oscura elevada + acento (selected). Se quita el
   outline punteado del focus (el border-right + bg ya indican el estado). */
[data-mode="dark"] .vtabs .tabs-vertical li .nav-link {
	color: var(--app-text-muted) !important;
}
[data-mode="dark"] .customvtab .tabs-vertical li .nav-link.active,
[data-mode="dark"] .customvtab .tabs-vertical li .nav-link:focus,
[data-mode="dark"] .customvtab .tabs-vertical li .nav-link:hover {
	background: var(--app-surface-3) !important;
	color: var(--app-primary) !important;
	border-right-color: var(--app-primary) !important;
	outline: none !important;
}

/* Relleno completo con var(--app-primary) sólido + texto blanco cansaba la vista
   (glare: fondo saturado + texto blanco apilados). Combo de reemplazo (dado por
   el user): background var(--app-slate), border var(--app-primary), texto
   #e3f2fd fijo (mismo valor que .label-light-primary, no deriva por tema). Bg y
   borde SÍ son theme-adaptive (reusan tokens existentes), solo el texto es
   literal. General para TODO .btn-primary/.btn-info (CTAs como Siguiente/Comprar
   mensajes, y los toggles que reusan la misma clase para marcar selección —
   campaignType, paginate-business, btn-filter-time — quedan cubiertos por el
   selector base, sin necesidad de listarlos aparte) + los estados "seleccionado/
   activo" de plugins que no son botones (pagination, select2, DataTables,
   daterangepicker). Las progress bars NO se tocan (no llevan texto encima). */
[data-mode="dark"] .btn-primary,
[data-mode="dark"] .btn-info,
[data-mode="dark"] .pagination > .active > a,
[data-mode="dark"] .pagination > .active > span,
[data-mode="dark"] .pagination > .active > a:hover,
[data-mode="dark"] .pagination > .active > span:hover,
[data-mode="dark"] .select2-container--default .select2-results__option--highlighted[aria-selected],
[data-mode="dark"] .dataTables_wrapper .dataTables_paginate .paginate_button.current,
[data-mode="dark"] .daterangepicker td.active,
[data-mode="dark"] .daterangepicker td.active:hover,
[data-mode="dark"] .daterangepicker .ranges li.active {
	background-color: var(--app-slate) !important;
	border-color: var(--app-primary) !important;
	color: #e3f2fd !important;
}
/* Solo :hover (feedback pasajero de mouse, termina al sacar el cursor). :focus
   NO se toca acá — al hacer click, el botón (ej. .campaignType) queda enfocado Y
   seleccionado a la vez; si :focus tuviera un look distinto del estado
   "seleccionado" en reposo (arriba), se ve un parpadeo/discrepancia de color
   apenas se hace click, y persiste igual mientras el botón conserva el foco. */
[data-mode="dark"] .btn-primary:hover,
[data-mode="dark"] .btn-info:hover {
	background-color: var(--app-border-strong) !important;
	border-color: var(--app-primary) !important;
	color: #e3f2fd !important;
}
/* bootstrap.min.css:6 define el anillo de foco con azul fijo sin adaptar
   (.btn:focus → rgba(0,123,255,.25)) — se ve como un resplandor azul desalineado
   con la paleta. Se retinta con --app-primary. Excluye .btn-primary/.btn-info
   (mismo motivo que arriba: no debe divergir del estado "seleccionado"). */
[data-mode="dark"] .btn.focus,
[data-mode="dark"] .btn:focus {
	box-shadow: 0 0 0 3px color-mix(in srgb, var(--app-primary) 25%, transparent) !important;
}
[data-mode="dark"] .btn-primary.focus,
[data-mode="dark"] .btn-primary:focus,
[data-mode="dark"] .btn-info.focus,
[data-mode="dark"] .btn-info:focus {
	box-shadow: none !important;
}

/* Paginación (la página activa se pinta arriba) */
[data-mode="dark"] .pagination > li > a,
[data-mode="dark"] .pagination > li > span {
	background: var(--app-surface);
	border-color: var(--app-border);
	color: var(--app-text-strong);
}
[data-mode="dark"] .pagination > li > a:hover { background: var(--app-surface-3); }

/* Code / pre / kbd */
[data-mode="dark"] code,
[data-mode="dark"] kbd,
[data-mode="dark"] pre,
[data-mode="dark"] samp {
	background: var(--app-surface-3) !important;
	color: var(--app-text);
	border-color: var(--app-border);
}

/* Alerts — el texto de hue oscuro hardcodeado (#065f46…) no contrasta en
   dark; lo subimos al color claro del propio estado. El background usa el
   muted ya engrosado arriba. */
[data-mode="dark"] .alert-success { color: var(--app-success); }
[data-mode="dark"] .alert-danger  { color: var(--app-error); }
[data-mode="dark"] .alert-warning { color: var(--app-warning); }
[data-mode="dark"] .alert-info    { color: var(--app-info); }
/* .alert-primary: bootstrap la define hardcoded (#cce5ff/#004085/#b8daff) y NO usa token
   como las demás alert-*. Sin relleno: transparent (no se puede solo OMITIR el background,
   porque entonces se asoma el #cce5ff azul-claro de bootstrap). Solo borde + texto acento. */
[data-mode="dark"] .alert-primary {
	background: transparent !important;
	border-color: var(--app-border) !important;
	color: var(--app-primary) !important;
}

/* Bordes/cabeceras de paneles y list-groups genéricos */
[data-mode="dark"] .panel,
[data-mode="dark"] .list-group-item {
	background: var(--app-surface);
	border-color: var(--app-border);
	color: var(--app-text);
}
[data-mode="dark"] .panel-heading,
[data-mode="dark"] .panel-footer {
	background: var(--app-surface-2);
	border-color: var(--app-border);
}

/* Utilidades de fondo claro repartidas por todo el panel — mapearlas a la
   superficie evita el "whack-a-mole" de cajas blancas en cada vista. */
[data-mode="dark"] .bg-white,
[data-mode="dark"] .bg-light,
[data-mode="dark"] .white-bg,
[data-mode="dark"] .box {
	background: var(--app-bg) !important;
	color: var(--app-text);
}
/* Datasource (body.datasource-view): sus cajas usan un gris ligeramente más claro
   (#1e2228, ~--app-surface) que el #1b1d23 global. Scope por la clase del <body>
   ⇒ especificidad (0,3,0) gana sobre la regla global (0,2,0). */
[data-mode="dark"] .datasource-view .bg-white,
[data-mode="dark"] .datasource-view .bg-light,
[data-mode="dark"] .datasource-view .white-bg,
[data-mode="dark"] .datasource-view .box {
	background: var(--app-surface) !important;
	color: var(--app-text);
}

/* Tarjetas de fuentes de datos / Google contacts / Google sheet (datasource y
   sendby): el borde fuente es #E5E5E5 (gris claro, sendbymain.css:69). En dark
   pasa a slate #2f3d4a. La especificidad (0,2,0) gana sobre la fuente (0,1,0). */
[data-mode="dark"] .googlecontacts-wrapper,
[data-mode="dark"] .carddatasources-wrapper,
[data-mode="dark"] .googlesheet-wrapper {
	border-color: var(--app-slate);
}
/* Hover: la animación de barras diagonales usa #F6F6F6 (claro, sendbymain.css:78)
   que en dark se ve mal. Mismo patrón pero con un shimmer translúcido claro, sutil
   sobre el fondo oscuro. Solo se cambia el color del gradient; la animación
   "stripes" (que mueve background-position) se conserva. */
[data-mode="dark"] .googlecontacts-wrapper:hover,
[data-mode="dark"] .carddatasources-wrapper:hover,
[data-mode="dark"] .googlesheet-wrapper:hover {
	background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent);
	background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0.05) 75%, transparent 75%, transparent);
}

/* =========================================================================
   7. PLUGINS GLOBALES (Select2, nice-select, DataTables, Dropify, SweetAlert,
      Toastr, Datepicker, x-editable). Solo wrappers visibles.
   ========================================================================= */

/* Select2 */
[data-mode="dark"] .select2-container--default .select2-selection--single,
[data-mode="dark"] .select2-container--default .select2-selection--multiple {
	background: var(--app-surface) !important;
	border-color: var(--app-border) !important;
}
[data-mode="dark"] .select2-container--default .select2-selection--single .select2-selection__rendered { color: var(--app-text); }
[data-mode="dark"] .select2-dropdown {
	background: var(--app-surface);
	border-color: var(--app-border);
}
[data-mode="dark"] .select2-results__option { color: var(--app-text); }
/* .select2-results__option--highlighted[aria-selected]: ver bloque "seleccionado/
   activo" (slate+borde primary+texto claro) más arriba en este archivo. */
[data-mode="dark"] .select2-search--dropdown .select2-search__field {
	background: var(--app-surface-2);
	color: var(--app-text);
	border-color: var(--app-border);
}
[data-mode="dark"] .select2-container--default .select2-selection--multiple .select2-selection__choice {
	background: var(--app-surface-3);
	border-color: var(--app-border);
	color: var(--app-text);
}

/* nice-select */
[data-mode="dark"] .nice-select {
	background: var(--app-surface);
	border-color: var(--app-border);
	color: var(--app-text);
}
[data-mode="dark"] .nice-select .list { background: var(--app-surface); border-color: var(--app-border); }
[data-mode="dark"] .nice-select .option { color: var(--app-text); }
[data-mode="dark"] .nice-select .option:hover,
[data-mode="dark"] .nice-select .option.focus,
[data-mode="dark"] .nice-select .option.selected.focus { background: var(--app-surface-3); }

/* country-select (selector de país con bandera — countrySelect.css). Plugin global
   (autorespuesta/automatizaciones, whatsappinstancia, restapi, etc.) → se tematiza una vez.
   El <input> base no lleva type → la regla global input[type=text] no lo alcanza; aquí se
   cubre vía .country-select input. El dropdown .country-list era blanco con borde #ccc. */
[data-mode="dark"] .country-select input,
[data-mode="dark"] .country-select input[type=text] {
	background-color: var(--app-surface) !important;
	color: var(--app-text) !important;
	border-color: var(--app-border) !important;
}
[data-mode="dark"] .country-select .country-list {
	background-color: var(--app-surface) !important;
	border-color: var(--app-border) !important;
	color: var(--app-text);
}
[data-mode="dark"] .country-select .country-list .divider { border-bottom-color: var(--app-border) !important; }
[data-mode="dark"] .country-select .country-list .country.highlight { background-color: rgba(255, 255, 255, 0.06) !important; }
[data-mode="dark"] .country-select.inside .flag-dropdown:hover .selected-flag { background-color: rgba(255, 255, 255, 0.06) !important; }
[data-mode="dark"] .country-select .selected-flag .arrow { border-top-color: var(--app-text-muted) !important; }
[data-mode="dark"] .country-select .selected-flag .arrow.up { border-bottom-color: var(--app-text-muted) !important; }

/* DataTables — controles (la tabla en sí hereda de .table) */
[data-mode="dark"] .dataTables_wrapper,
[data-mode="dark"] .dataTables_info,
[data-mode="dark"] .dataTables_length,
[data-mode="dark"] .dataTables_filter { color: var(--app-text-muted); }
[data-mode="dark"] .dataTables_wrapper .dataTables_paginate .paginate_button {
	color: var(--app-text) !important;
	background: var(--app-surface);
	border-color: var(--app-border);
}
/* .paginate_button.current: ver bloque "seleccionado/activo" más arriba en este
   archivo (slate+borde primary+texto claro). */
/* Overlay "Procesando" al recargar la tabla: jquery.dataTables.min.css:372 lo pinta
   con un gradient blanco (rgba(255,255,255,0.9)) + color #333. El core carga después
   de dark.css ⇒ !important. Replicamos el gradient con la superficie oscura
   (rgb(30,34,41) = #1e2229 = --app-surface) para que el difuminado sea dark. */
[data-mode="dark"] .dataTables_wrapper .dataTables_processing {
	color: var(--app-text) !important;
	background-color: var(--app-surface) !important;
	background: linear-gradient(to right,
		rgba(30, 34, 41, 0) 0%,
		rgba(30, 34, 41, 0.92) 25%,
		rgba(30, 34, 41, 0.92) 75%,
		rgba(30, 34, 41, 0) 100%) !important;
}

/* Dropify */
[data-mode="dark"] .dropify-wrapper {
	background: var(--app-surface-2);
	color: var(--app-text-muted);
	border-color: var(--app-border);
}
[data-mode="dark"] .dropify-wrapper .dropify-message span.file-icon { color: var(--app-text-muted); }
/* Estado con archivo cargado: el plugin pinta el preview/render en #FFF (dropify.css:136,153)
   → caja blanca al cargar un archivo. (.dropify-wrapper input es opacity:0, no es lo visible.)
   El overlay .dropify-infos ya es rgba(0,0,0,.7) con texto blanco, se respeta. */
[data-mode="dark"] .dropify-wrapper .dropify-preview { background-color: var(--app-surface-2) !important; }
[data-mode="dark"] .dropify-wrapper .dropify-preview .dropify-render img { background-color: var(--app-surface-2) !important; }
[data-mode="dark"] .dropify-wrapper .dropify-preview .dropify-render i { color: var(--app-text-muted) !important; }

/* SweetAlert (v1 .sweet-alert y v2 .swal2-popup) */
[data-mode="dark"] .sweet-alert,
[data-mode="dark"] .swal2-popup {
	background: var(--app-surface) !important;
	color: var(--app-text) !important;
	border: 1px solid var(--app-border) !important;   /* R4: definición sin depender de sombra */
}
[data-mode="dark"] .sweet-alert h2,
[data-mode="dark"] .sweet-alert p,
[data-mode="dark"] .swal2-title,
[data-mode="dark"] .swal2-html-container { color: var(--app-text) !important; }

/* Toastr — mantiene los colores de estado; solo asegura texto legible */
[data-mode="dark"] #toast-container > div { box-shadow: 0 0 12px var(--app-shadow-color); }

/* Bootstrap Datepicker */
[data-mode="dark"] .datepicker,
[data-mode="dark"] .datepicker-dropdown {
	background: var(--app-surface);
	border-color: var(--app-border);
	color: var(--app-text);
}
[data-mode="dark"] .datepicker table tr td,
[data-mode="dark"] .datepicker table tr th { color: var(--app-text); }
[data-mode="dark"] .datepicker table tr td.day:hover,
[data-mode="dark"] .datepicker table tr td.focused { background: var(--app-surface-3); }
[data-mode="dark"] .datepicker table tr td.old,
[data-mode="dark"] .datepicker table tr td.new { color: var(--app-text-disabled); }

/* x-editable popover */
[data-mode="dark"] .editable-container.popover,
[data-mode="dark"] .popover {
	background: var(--app-surface);
	border-color: var(--app-border);
	color: var(--app-text);
}
[data-mode="dark"] .popover-title { background: var(--app-surface-2); color: var(--app-text-strong); border-bottom-color: var(--app-border); }
[data-mode="dark"] .popover.bottom > .arrow:after { border-bottom-color: var(--app-surface); }
[data-mode="dark"] .popover.top > .arrow:after { border-top-color: var(--app-surface); }
/* Popover Bootstrap 4 (markup .popover-header/.popover-body + flechas .bs-popover-*): el
   plugin los pinta claros — header #f7f7f7, body texto #212529 (invisible en dark), arrow
   ::after #fff. El BS3 (.popover-title/.top>.arrow) ya está arriba; esto cubre el BS4. */
[data-mode="dark"] .popover-header {
	background-color: var(--app-surface-2) !important;
	color: var(--app-text-strong) !important;
	border-bottom-color: var(--app-border) !important;
}
[data-mode="dark"] .popover-body { color: var(--app-text) !important; }
/* Flecha: ::after = fondo del popover (era #fff), ::before = borde (era rgba(0,0,0,.25)) */
[data-mode="dark"] .popover.bs-popover-top .arrow::after,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="top"] .arrow::after { border-top-color: var(--app-surface) !important; }
[data-mode="dark"] .popover.bs-popover-bottom .arrow::after,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after { border-bottom-color: var(--app-surface) !important; }
[data-mode="dark"] .popover.bs-popover-left .arrow::after,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="left"] .arrow::after { border-left-color: var(--app-surface) !important; }
[data-mode="dark"] .popover.bs-popover-right .arrow::after,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="right"] .arrow::after { border-right-color: var(--app-surface) !important; }
[data-mode="dark"] .popover.bs-popover-top .arrow::before,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="top"] .arrow::before { border-top-color: var(--app-border) !important; }
[data-mode="dark"] .popover.bs-popover-bottom .arrow::before,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before { border-bottom-color: var(--app-border) !important; }
[data-mode="dark"] .popover.bs-popover-left .arrow::before,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="left"] .arrow::before { border-left-color: var(--app-border) !important; }
[data-mode="dark"] .popover.bs-popover-right .arrow::before,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="right"] .arrow::before { border-right-color: var(--app-border) !important; }
/* Conector del header en placement bottom (era #f7f7f7) */
[data-mode="dark"] .popover.bs-popover-bottom .popover-header::before,
[data-mode="dark"] .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before { border-bottom-color: var(--app-surface-2) !important; }

/* =========================================================================
   8. ENVÍOS — smart-wizard "Crea tu campaña" + previsualización de teléfono
   -------------------------------------------------------------------------
   El wizard es componente compartido (varios flujos multi-paso). Sus CSS
   (smart_wizard*.css, sendbygeneral.css, sendbymain.css) pintan blanco
   hardcodeado y cargan DESPUÉS de este archivo ⇒ override con !important.
   Criterio de unificación: los paneles ESTRUCTURALES del wizard van a ras de
   la página (--app-bg, sin costura entre panel y fondo); el mockup del
   teléfono se unifica como pantalla oscura cohesiva (la burbuja azul del SMS
   se mantiene; el bisel .screen-preview es un gradiente gris y se respeta).
   ========================================================================= */

/* Paneles estructurales del wizard → mismo color que la página (unificado) */
[data-mode="dark"] .sw-theme-dots,
[data-mode="dark"] .sw-theme-default,
[data-mode="dark"] .sw-theme-dots .sw-container,
[data-mode="dark"] .sw-theme-dots .step-content,
[data-mode="dark"] .sw-theme-default .step-content,
[data-mode="dark"] .sw-theme-dots .sw-toolbar,
[data-mode="dark"] .sw-theme-default .sw-toolbar,
[data-mode="dark"] .sw-toolbar-bottom {
	background: var(--app-bg) !important;
	color: var(--app-text);
}
[data-mode="dark"] .sw-theme-dots > ul.step-anchor { background: transparent !important; }
[data-mode="dark"] .sw-toolbar { border-top-color: var(--app-border) !important; }
/* El plugin (smart_wizard.css:66,70 y smart_wizard_theme_dots.css:36,40) define su
   PROPIO border #ddd !important en .sw-toolbar-top/.sw-toolbar-bottom con la misma
   especificidad que la regla de arriba (2 clases) — ganaba por orden de carga,
   dejando un borde gris claro "colgado" arriba del botón Siguiente (mucho más
   visible en dark). Se iguala el selector exacto del plugin para ganar por
   especificidad (3 clases), sin depender del orden de carga. */
[data-mode="dark"] .sw-theme-dots .sw-toolbar-top,
[data-mode="dark"] .sw-theme-default .sw-toolbar-top {
	border-bottom-color: var(--app-border) !important;
}
[data-mode="dark"] .sw-theme-dots .sw-toolbar-bottom,
[data-mode="dark"] .sw-theme-default .sw-toolbar-bottom {
	border-top-color: var(--app-border) !important;
	border-bottom-color: var(--app-border) !important;
}

/* Excepción: el wizard de automatizaciones vive dentro del modal #automations-details
   (view.automatizaciones.php:127), no full-page como el de envíos. Ahí el --app-bg de la
   regla anterior no se funde con la superficie del modal (.modal-content = --app-surface).
   Scope al id del modal → #1e2228 (≈ --app-surface) para que el wizard se mimetice con el
   resto del modal. El id (1,x,0) gana en especificidad a la regla global (0,x,0). */
[data-mode="dark"] #automations-details .sw-theme-dots,
[data-mode="dark"] #automations-details .sw-theme-default,
[data-mode="dark"] #automations-details .sw-theme-dots .sw-container,
[data-mode="dark"] #automations-details .sw-theme-dots .step-content,
[data-mode="dark"] #automations-details .sw-theme-default .step-content,
[data-mode="dark"] #automations-details .sw-theme-dots .sw-toolbar,
[data-mode="dark"] #automations-details .sw-theme-default .sw-toolbar,
[data-mode="dark"] #automations-details .sw-toolbar-bottom {
	background: var(--app-surface) !important;
	color: var(--app-text);
}

/* Divisores que el smart-wizard inyecta por JS con #e5e5e5 (claro): el de abajo
   de los pasos (#smartwizard-container-steps) y el de arriba de la barra de botones
   (.sw-btn-group). El <style> inyectado los acota a #${wizardId} (que varía por
   vista: wizard_content en envíos, smartwizard en datasource, etc.), por eso una
   regla atada a un id concreto no aplica en todas las vistas. Como #smartwizard-
   container-steps es un id global único y el JS NO usa !important en estos bordes,
   un selector genérico + !important gana en TODOS los wizards. */
[data-mode="dark"] #smartwizard-container-steps { border-bottom-color: var(--app-slate) !important; }
[data-mode="dark"] .sw-btn-group { border-top-color: var(--app-slate) !important; }

/* Dots numerados de los pasos (círculos inactivos) */
[data-mode="dark"] .sw-theme-dots > ul.step-anchor > li > a:before {
	background: var(--app-surface-3) !important;
	border-color: var(--app-border-strong) !important;
}

/* Botones claros del wizard (anterior / display) */
[data-mode="dark"] .sw-btn-prev,
[data-mode="dark"] .btn-display {
	background: var(--app-surface) !important;
	color: var(--app-text) !important;
	border-color: var(--app-border-strong) !important;
}

/* Estado disabled del selector de tipo de envío (#f5f5f5) */
[data-mode="dark"] .campaignType.btn-outline-primary:disabled,
[data-mode="dark"] .campaignType.btn-outline-primary.disabled {
	background: var(--app-surface-2) !important;
	border-color: var(--app-border) !important;
	color: var(--app-text-disabled) !important;
}

/* Títulos de las tarjetas de canal (SMS/RCS): #66615b no contrasta en dark.
   Las .card-dashed tienen fondo transparente ⇒ heredan la superficie oscura. */
[data-mode="dark"] .content-type-send .card-dashed h5,
[data-mode="dark"] .content-type-send .card-dashed:not(.card-dashed-selected) h5 {
	color: var(--app-text);
}
/* Tarjeta seleccionada (.card-dashed-selected — agenda elegida en datasource,
   datasource.js:745). Borde con el acento + fondo slate para marcar la selección
   en dark. */
[data-mode="dark"] .card-dashed-selected {
	border: 1px solid var(--app-primary) !important;
	background-color: var(--app-slate) !important;
}

/* Previsualización del teléfono → mockup oscuro cohesivo. La pantalla
   (.screen-wrap) y el backdrop (.content-preview-message #eeeeee) se
   oscurecen; el bisel metálico (.screen-preview, gradiente gris) se respeta. */
[data-mode="dark"] .wizard-content-custom-preview {
	background: var(--app-bg) !important;
	/* Fondo PLANO = mismo tono que el resto del panel (se quitó el gradiente azul).
	   El único hijo de esta columna es .keep-on-display (position:fixed) ⇒ no aporta
	   altura; la columna solo se estira por flex igualando a la del formulario. Si el
	   form es más corto que el viewport, min-height asegura que el fondo plano cubra
	   hasta el final. Solo-dark, no altera el layout del modo claro. */
	min-height: 100vh;
	/* Ambas columnas (formulario | preview) comparten el mismo tono ⇒ un borde 1px
	   izquierdo señala la división, mismo lenguaje que el borde sidebar↔contenido.
	   En modo claro la división la da el gris base (#efefef, general.style.css:1608). */
	border-left: 1px solid var(--app-border);
}
/* .biolink-preview = bisel del teléfono. Fondo slate translúcido (#4d4d6b4a,
   ~29% alpha) que deja ver el gradiente azul del .wizard-content-custom-preview
   detrás (efecto glass). Gana sobre las reglas `.biolink-preview { background:
   white / gradient }` de origen por especificidad ([data-mode] + clase)
   reforzada con !important. El borde lo maneja el propio CSS del wizard. */
[data-mode="dark"] .biolink-preview {
	background: #4d4d6b4a !important;
}
[data-mode="dark"] .biolink-preview .iframe-wrap-custom { background: transparent !important; }
[data-mode="dark"] .content-preview-message { background: var(--app-bg) !important; }
[data-mode="dark"] .screen-wrap { background: var(--app-surface) !important; }
[data-mode="dark"] .screen-wrap .t-screen-sender { color: var(--app-text) !important; }

/* Burbuja del preview de SMS (.box3, fondo --app-primary azul) y su cola
   (.sb14:before, coloreada en border-right/top) → slate en oscuro. */
[data-mode="dark"] .box3 { background: var(--app-slate) !important; }
[data-mode="dark"] .sb14:before {
	border-right-color: var(--app-slate) !important;
	border-top-color: var(--app-slate) !important;
}

/* Badge .label-light-primary (chips "X contacto(s)" en agendas): se invierte
   a fondo slate + texto azul claro para contraste en oscuro. */
[data-mode="dark"] .label-light-primary {
	background-color: var(--app-slate) !important;
	color: #e3f2fd !important;
}
/* Badge .label-light-danger (fuente: #f9e7eb / #eb5653): mismo patrón, fondo rojo
   oscuro + texto rojo claro para contraste en oscuro. */
[data-mode="dark"] .label-light-danger {
	background-color: rgb(66 52 52) !important;
	color: rgb(235, 86, 83) !important;
}
/* Badge .label-light-warning (fuente: #fff8ec / #fcb140): fondo ámbar oscuro +
   texto ámbar para contraste en oscuro. */
[data-mode="dark"] .label-light-warning {
	background-color: #3d3934 !important;
	color: #fcb140 !important;
}
/* Badge .label-light-success (fuente: #e8fdeb / #79c89e): fondo verde oscuro +
   texto verde para contraste en oscuro. */
[data-mode="dark"] .label-light-success {
	background-color: #2c3b33 !important;
	color: #79c89e !important;
}
/* Badge .label-light-info (style-default.css:792 — #cfecfe / #99abb4): fondo cian-slate
   oscuro + texto cian claro para contraste en oscuro. */
[data-mode="dark"] .label-light-info {
	background-color: #243a44 !important;
	color: #a7cbdb !important;
}
/* Badge .label-light-inverse (style-blue.css:817 — #f6f6f6 / #2f3d4a — gris neutro/default,
   ej. "Todos los permisos" en herramientausuarios): badge neutro ⇒ superficie elevada neutra
   + texto claro fuerte para contraste en oscuro. */
[data-mode="dark"] .label-light-inverse {
	background-color: var(--app-surface-3) !important;   /* era #f6f6f6 */
	color: var(--app-text-strong) !important;            /* era #2f3d4a */
}
/* Badge método de pago OXXO/DigitalFemsa (solicitudpagos.css:543 — #defaff / #006c80):
   mismo patrón, fondo teal oscuro + texto cian claro para contraste en oscuro. */
[data-mode="dark"] .badge-digitalfemsa-oxxo {
	background-color: #1e373c !important;
	color: #5fc6d8 !important;
}

/* Labels de tipos de automatización (automatizaciones.css:24+): mismo patrón badge — cada
   uno conserva su hue pero con fondo oscuro tintado + texto claro para contraste en oscuro. */
[data-mode="dark"] .label-light-birthdate {     /* base: #cde2ff / rgb(101,119,153) — azul */
	background-color: #26354a !important;
	color: #a9c4ec !important;
}
[data-mode="dark"] .label-light-winback {       /* base: #ccf3f9 / rgb(100,156,157) — cian */
	background-color: #1e3a3d !important;
	color: #7fcdd3 !important;
}
[data-mode="dark"] .label-light-blacklist {     /* base: #797979 / blanco — gris */
	background-color: #3a3d42 !important;
	color: #c8ccd2 !important;
}
[data-mode="dark"] .label-digital-promotion {   /* base: #749778 / blanco — verde */
	background-color: #2a3a2e !important;
	color: #86c191 !important;
}
[data-mode="dark"] .label-loyalty-expiry {      /* base: #c293c1 / blanco — malva */
	background-color: #3a2d3a !important;
	color: #cfa3ce !important;
}
[data-mode="dark"] .label-light-pr {            /* base: #f7f7bc / rgb(98,98,98) — amarillo */
	background-color: #3a3a26 !important;
	color: #dede9a !important;
}
[data-mode="dark"] .label-light-rba {           /* base: bisque (#ffe4c4) / #877a36 — ámbar */
	background-color: #3a3225 !important;
	color: #d8b985 !important;
}
[data-mode="dark"] .label-light-survey {        /* base: #bf94a1 / blanco — rosa */
	background-color: #3a2d32 !important;
	color: #d2a4b0 !important;
}
[data-mode="dark"] .label-light-automations {   /* base: #fbeaff / #847191 — lavanda */
	background-color: #332a3a !important;
	color: #c4b0d4 !important;
}

/* Editor de SMS (texteditor.css — envíos, inbox, lealtad, cupones). El editor
   pinta superficies claras (#efefef/#f3f3f3/#fff) y textos oscuros (#333/#555/
   #777) hardcodeados. .baloon = lienzo de escritura; .tags-wrapper = barra de
   tags; .autocount = contador; .tag3/.baloon span = chips de variables. */
[data-mode="dark"] .tags-wrapper,
[data-mode="dark"] .tags-wrapper_ws,
[data-mode="dark"] .autocount {
	background-color: var(--app-surface) !important;   /* = #242a33 */
	color: var(--app-text) !important;
}
[data-mode="dark"] .tags-wrapper,
[data-mode="dark"] .tags-wrapper_ws { border-color: var(--app-border) !important; }
[data-mode="dark"] .baloon {
	background: var(--app-surface) !important;
	color: var(--app-text) !important;
}
[data-mode="dark"] .baloon span,
[data-mode="dark"] .tag3 {
	background-color: var(--app-surface-3) !important;
	color: var(--app-text) !important;
}
/* Botones-paleta de campos personalizados (#shortcode_tags_mytexteditor →
   .btn-texteditor-tag): en light tokens.css:181 les fuerza background-color:#fff,
   así que en dark salían como cajas blancas. Los volvemos chips outline tintados
   con el acento (que se adapta por tema; el borde primary viene de -color.css). */
[data-mode="dark"] .btn.btn-texteditor-tag,
[data-mode="dark"] #shortcode_tags_mytexteditor .btn.btn-texteditor-tag {
	background-color: var(--app-primary-muted) !important;
	color: var(--app-primary) !important;
}

/* =========================================================================
   Step 5 del wizard de automatizaciones (editor de mensajes WhatsApp/SMS).
   (A) sistema de tabs custom (automatizaciones.css:310+) y (B) piezas del editor
   de texto "compact" (texteditor.css) que quedaban claras. Design del editor = compact.
   ========================================================================= */
/* (A) Tabs custom: contenido blanco + tab activo azul claro */
[data-mode="dark"] .tabs .tab,
[data-mode="dark"] .resources .resource {
	background: var(--app-surface) !important;          /* era #fff */
	border-top-color: var(--app-border) !important;     /* era #82868a36 */
}
[data-mode="dark"] .tabs .mylabels { color: var(--app-text-muted); }   /* labels inactivos */
[data-mode="dark"] .tabs input[type=radio]:checked + label,
[data-mode="dark"] .resources input[type=radio]:checked + label {
	background: var(--app-primary-muted) !important;    /* era #92b9de29 */
	color: var(--app-primary) !important;               /* era #1f3852 */
}
[data-mode="dark"] .nota-editor { color: var(--app-text-muted); }      /* era #7f7f7f */

/* (B) Editor compact: globo flotante de tags (texteditor.css:152), chips, notas,
   placeholder, checkbox de confirmación de lectura y divisores de herramientas. */
[data-mode="dark"] .baloon-container {
	background-color: var(--app-surface) !important;    /* era white */
	border: 1px solid var(--app-border);
}
[data-mode="dark"] .baloon-container:before {           /* flecha del globo (era #fff) */
	border-left-color: var(--app-surface) !important;
	border-top-color: var(--app-surface) !important;
}
[data-mode="dark"] .baloon span { border-color: var(--app-border) !important; }              /* era #dadada */
[data-mode="dark"] .baloon span:hover { border-color: var(--app-border-strong) !important; } /* era #aaa */
[data-mode="dark"] .texteditor_sms:empty:before { color: var(--app-text-muted) !important; } /* placeholder, era #a3a9af */
[data-mode="dark"] .note { color: var(--app-text-muted); }              /* era #777 */
[data-mode="dark"] .tools-indications { color: var(--app-text-muted); } /* era #9b9b9b */
[data-mode="dark"] .indications2 { color: var(--app-text); }            /* era #6b6661 */
[data-mode="dark"] .indications2 span { color: var(--app-text-muted); } /* era #9b9b9b */
[data-mode="dark"] .tools-section { border-bottom-color: var(--app-border) !important; }     /* era #dcdcdc */
[data-mode="dark"] .div_hover button:focus { border-color: var(--app-border) !important; }   /* era #fff */
/* Checkbox "confirmación de lectura" sin marcar (borde claro). El marcado usa
   var(--app-deep) + check blanco, legible en dark, se respeta. */
[data-mode="dark"] .texteditor-options [type="checkbox"].filled-in:not(:checked)+label:after {
	border-color: var(--app-border-strong) !important;  /* era #b1b8bb */
}

/* Controles del carrusel del editor de ruleta (spineditor) — spin.css:683-714:
   cajas blancas (#fff) con flechas inconsistentes (#14477e la izq, gray la der).
   En dark se oscurece la caja a superficie elevada y se unifican ambas flechas al
   texto claro; hover/focus → acento. */
[data-mode="dark"] .ctrl-left,
[data-mode="dark"] .ctrl-right {
	background-color: var(--app-bg) !important;
	color: var(--app-text) !important;
}
[data-mode="dark"] .carousel-control-prev-icon,
[data-mode="dark"] .carousel-control-next-icon {
	color: var(--app-text) !important;
}
[data-mode="dark"] .ctrl-left:hover .carousel-control-prev-icon,
[data-mode="dark"] .ctrl-left:focus .carousel-control-prev-icon,
[data-mode="dark"] .ctrl-right:hover .carousel-control-next-icon,
[data-mode="dark"] .ctrl-right:focus .carousel-control-next-icon {
	color: var(--app-primary) !important;
}

/* Cards de probabilidades del editor de ruleta (spineditor) — spin.css:832-942.
   Todas asumen fondo blanco: card #fff, header con gradientes pastel (g1–g6),
   título #222, mensaje #999, track de barra #eef0f3, ícono editar en círculo blanco,
   prefijo .ocre #795d39. Adaptación dark: superficie + borde (la sombra clara no se ve
   en dark), header con versiones dark de los 6 gradientes (g1–g6) que conservan la
   identidad de color tintando tonos oscuros, textos a tokens, track oscuro.
   La barra de progreso (gradiente verde, texto blanco) y el PNG del premio se dejan. */
[data-mode="dark"] .spin-card {
	background: var(--app-surface) !important;
	border: 1px solid var(--app-border);
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.45);
}
[data-mode="dark"] .spin-card:hover {
	box-shadow: 0 5px 18px rgba(0, 0, 0, 0.55);
}
/* Header de la card: fallback neutro (cards sin clase de gradiente) seguido de las
   versiones dark de g1–g6. Misma especificidad (0,2,0) y sin !important → el orden en
   fuente hace que cada --gN gane al fallback, y ambos ganan a la base (0,1,0). */
[data-mode="dark"] .spin-card__img { background: var(--app-surface-2); }
[data-mode="dark"] .spin-card__img--g1 { background: linear-gradient(135deg, #1b2530 0%, #18271f 100%); }
[data-mode="dark"] .spin-card__img--g2 { background: linear-gradient(135deg, #2b2718 0%, #2c1c22 100%); }
[data-mode="dark"] .spin-card__img--g3 { background: linear-gradient(135deg, #20223a 0%, #2c1c22 100%); }
[data-mode="dark"] .spin-card__img--g4 { background: linear-gradient(135deg, #15272b 0%, #231b2e 100%); }
[data-mode="dark"] .spin-card__img--g5 { background: linear-gradient(135deg, #242913 0%, #18271f 100%); }
[data-mode="dark"] .spin-card__img--g6 { background: linear-gradient(135deg, #2c1d18 0%, #2b2718 100%); }
[data-mode="dark"] .spin-card__img-text { color: var(--app-text-muted); }
[data-mode="dark"] .spin-card__title { color: var(--app-text-strong); }
[data-mode="dark"] .spin-card .message-content { color: var(--app-text-muted); }
[data-mode="dark"] .spin-card .ocre { color: #c9a96a; }
[data-mode="dark"] .spin-card__progress { background: var(--app-surface-3); }
[data-mode="dark"] .spin-card__edit {
	background: var(--app-surface-3);
	color: var(--app-text-muted);
	box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
}
[data-mode="dark"] .spin-card__edit:hover,
[data-mode="dark"] .spin-card__edit:focus-visible { color: var(--app-text); }

/* Drag-list de campos configurables del editor de ruleta — spin.css:50-95: cada <li> es
   blanco (background:white, sin borde, sombra clara) y sus zonas funcionales (.drag-area
   el handle de arrastre, .showFieldSettings el toggle) también blancas. Adaptación dark. */
[data-mode="dark"] .drag-list > li {
	background: var(--app-surface) !important;
	border: 1px solid var(--app-border) !important;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45) !important;
	color: var(--app-text);
}
[data-mode="dark"] .drag-list .drag-area,
[data-mode="dark"] .showFieldSettings {
	background: var(--app-surface) !important;
	color: var(--app-text);
}

/* EXCEPCIÓN — preview del widget público (#form-wrapper, view.spin.php:1064): replica la
   herramienta que se sirve del lado de tools, donde NO existe modo oscuro, por lo que debe
   verse SIEMPRE clara aunque el panel esté en dark. Se revierten al estado light los
   overrides dark globales que la alcanzan: .box (el widget usa un panel translúcido oscuro
   rgb(46 46 46 / 54%) con texto claro, no el #1b1d23 global) y .form-control (bg/color/border
   con !important). El selector usa #form-wrapper como ancla; aplica a todas las instancias
   del preview en la vista. */
[data-mode="dark"] #form-wrapper .box {
	background: rgb(46 46 46 / 54%) !important;
	color: #ffffff !important;
}
[data-mode="dark"] #form-wrapper .form-control,
[data-mode="dark"] #form-wrapper input {
	background-color: #ffffff !important;
	color: #555555 !important;
	border-color: #cccccc !important;
}
[data-mode="dark"] #form-wrapper .form-control::placeholder {
	color: #999999 !important;
}

/* EXCEPCIÓN — inputs del preview en spcreate (#previewContainerHtml, view.paymentrequest.php:591):
   replican la herramienta pública (que NO se sirve en dark), así que deben conservar su color
   original. Los .customInput son type="email" → los alcanza la regla global input[type=email]
   (línea 244) y los oscurecía. Revert a light: blanco, texto oscuro, subrayado #4476bd al focus
   (spcreate.css:514). El label flotante ya conserva su color por mayor especificidad propia. */
[data-mode="dark"] #previewContainerHtml .customInput {
	background: #ffffff !important;
	color: #333333 !important;
	border-color: #4476bd !important;
}

/* Botón "Connect Google Calendar" (googlecalendar.css:12): pill blanco (#fff) con borde
   gris, hover #eeeeee. En dark → superficie elevada + borde + texto claro; el hover se
   invierte (en light oscurece, en dark aclara). El logo multicolor de Google se respeta. */
[data-mode="dark"] .btnConnectGoogleCalendar {
	background: var(--app-surface-3) !important;
	border-color: var(--app-border-strong) !important;
	color: var(--app-text) !important;
}
[data-mode="dark"] .btnConnectGoogleCalendar:hover {
	background-color: var(--app-slate) !important;
}

/* =========================================================================
   Vista marcablanca — todo su contenido vive en .tabs-container
   (view.marcablanca.php:28). marcablanca.css tiene un diseño claro muy específico;
   estos overrides van scopeados al contenedor (no contaminan otras vistas). Valor
   base de cada propiedad entre paréntesis. Se conservan a propósito los elementos
   que ya funcionan en dark: badges sólidos (.badge-info teal, .badge-mejora ámbar),
   .btn-warning, .btn-change (índigo), tooltips (#333 ya oscuro) y overlays sobre imagen.
   ========================================================================= */
/* Tabs custom */
[data-mode="dark"] .tabs-container .nav-tabs-custom {
	background: transparent !important;                 /* #ffffff */
	border-bottom-color: var(--app-border) !important;  /* #e9ecef */
}
[data-mode="dark"] .tabs-container .nav-tabs-custom .nav-link { color: var(--app-text-muted) !important; }  /* #6c757d */
[data-mode="dark"] .tabs-container .nav-tabs-custom .nav-link:hover:not(.disabled) {
	color: var(--app-text) !important;                  /* #495057 */
	background: rgba(255, 255, 255, 0.04) !important;    /* rgba(0,0,0,0.02) */
}
/* Activo: el subrayado ::after (acento, ya token) marca el estado → fondo transparente */
[data-mode="dark"] .tabs-container .nav-tabs-custom .nav-link.active { background: transparent !important; }  /* #fff */
[data-mode="dark"] .tabs-container .nav-tabs-custom .nav-link.disabled { color: var(--app-text-disabled) !important; }  /* #adb5bd */

/* Overlay de upgrade (sobre contenido bloqueado) */
[data-mode="dark"] .tabs-container .upgrade-overlay { background: rgba(0, 0, 0, 0.45) !important; }  /* rgb(255 255 255/45%) */
[data-mode="dark"] .tabs-container .upgrade-message h4 { color: var(--app-text-strong) !important; }  /* #333 */
[data-mode="dark"] .tabs-container .upgrade-message p { color: var(--app-text-muted) !important; }    /* #6c757d */

/* Sección de logotipos */
[data-mode="dark"] .tabs-container .logo-item {
	background: var(--app-surface-2) !important;        /* #f8f9fa */
	border-color: var(--app-border) !important;         /* #e9ecef */
}
[data-mode="dark"] .tabs-container .logo-info .text-gray,
[data-mode="dark"] .tabs-container .logo-info p { color: var(--app-text-muted) !important; }  /* #6c757d */
[data-mode="dark"] .tabs-container .preview-container,
[data-mode="dark"] .tabs-container .preview-container.preview-login {
	background: var(--app-surface-2) !important;        /* #fff / white */
	border-color: var(--app-border) !important;         /* #dee2e6 */
}
[data-mode="dark"] .tabs-container .preview-placeholder { color: var(--app-text-muted) !important; }  /* #adb5bd */

/* Paleta de colores (el borde #5b73e8 de hover/active se conserva como indicador) */
[data-mode="dark"] .tabs-container .color-item { border-color: var(--app-border) !important; }  /* #e9ecef */
[data-mode="dark"] .tabs-container .color-item.active { background: rgba(91, 115, 232, 0.15) !important; }  /* #f0f3ff */
[data-mode="dark"] .tabs-container .color-name { color: var(--app-text) !important; }  /* #495057 */
[data-mode="dark"] .tabs-container .template-preview { background: var(--app-surface-2) !important; }  /* #f8f9fa */
[data-mode="dark"] .tabs-container .template-preview h6 { color: var(--app-text) !important; }  /* #495057 */
[data-mode="dark"] .tabs-container .template-preview img { border-color: var(--app-border) !important; }  /* #dee2e6 */

/* DNS */
[data-mode="dark"] .tabs-container .dns-instructions { background: var(--app-surface-2) !important; }  /* #f8f9fa */
[data-mode="dark"] .tabs-container .table-dns { background: transparent !important; }  /* #fff */
[data-mode="dark"] .tabs-container .table-dns thead th {
	color: var(--app-text) !important;                  /* #495057 */
	border-bottom-color: var(--app-border) !important;  /* #dee2e6 */
}
[data-mode="dark"] .tabs-container .table-dns code {
	background: var(--app-surface-3) !important;        /* #e9ecef */
	color: #f191b6 !important;                           /* #e83e8c (pink aclarado) */
}
[data-mode="dark"] .tabs-container .alert-info {
	background: var(--app-info-muted) !important;       /* #e7f3ff */
	border-color: rgba(59, 130, 246, 0.20) !important;  /* #b3d9ff */
	color: var(--app-info) !important;                  /* #004085 */
}

/* URL config */
[data-mode="dark"] .tabs-container .url-input-group { background: var(--app-surface-2) !important; }  /* #f8f9fa */
[data-mode="dark"] .tabs-container .url-input-group label { color: var(--app-text) !important; }  /* #495057 */

/* Card específico (borde claro propio sobre el genérico) + divisor + disabled input */
[data-mode="dark"] .tabs-container .card { border-color: var(--app-border) !important; }  /* #e9ecef */
[data-mode="dark"] .tabs-container .section { background-color: var(--app-border) !important; }  /* #eaecee (línea 1px) */
[data-mode="dark"] .tabs-container .disabled-input {
	background-color: var(--app-surface-2) !important;  /* #e9ecef */
	color: var(--app-text-disabled) !important;         /* #67757c */
}

/* Slider de logos (drop zone + thumbnails) */
[data-mode="dark"] .tabs-container .slider-main-upload {
	background: var(--app-surface-2) !important;        /* #f8f9fa */
	border-color: var(--app-border) !important;         /* #dee2e6 */
}
[data-mode="dark"] .tabs-container .slider-main-upload:hover { background: var(--app-primary-muted) !important; }  /* #e7f1ff */
[data-mode="dark"] .tabs-container .slider-main-upload .upload-icon,
[data-mode="dark"] .tabs-container .slider-main-upload .upload-icon p { color: var(--app-text-muted) !important; }  /* #6c757d */
[data-mode="dark"] .tabs-container .slider-main-upload .upload-icon h5 { color: var(--app-text) !important; }  /* #495057 */
[data-mode="dark"] .tabs-container .slider-thumbnail-item {
	background: var(--app-surface-2) !important;        /* #fff */
	border-color: var(--app-border) !important;         /* #dee2e6 */
}
[data-mode="dark"] .tabs-container .code-textarea { border-color: var(--app-border) !important; }  /* #333 (subtle en dark) */

/* Etiquetas izquierdas de la carátula bancaria SPEI (.background-blue-light,
   style-extras.css:98): tinte azul claro #EEF4FB !important sobre el card. Usada SOLO
   por estos chips SPEI (clabespei + bloque idéntico en checkout) ⇒ override global.
   En dark pasa a una superficie neutra MÁS oscura que el card (#13151a): la letra de
   acento (.text-primary = var(--app-primary)) resalta por luminancia, no por hue
   (surface-3 #263238 era azulado y "muddeaba" el texto azul). Fiel al claro, donde el
   chip ya es ligeramente más oscuro que el card blanco (#EEF4FB vs #fff).
   Specificity (0,2,0) + !important vence a .background-blue-light (0,1,0) !important. */
[data-mode="dark"] .background-blue-light {
	background: var(--app-surface-2) !important;  /* era #EEF4FB (azul claro) */
}

/* =========================================================================
   Date Range Picker (plugin bootstrap-daterangepicker,
   assets/plugins/daterangepicker/daterangepicker.css) — popup global de rango de fechas
   (movimientosadmin, reportes, etc.). El plugin se appendea a <body> con fondo #fff
   hardcoded ⇒ override GLOBAL en dark. !important porque el CSS del plugin carga después.
   ========================================================================= */
/* Contenedor + texto base + flechita (:after = relleno del triángulo, :before = su borde) */
[data-mode="dark"] .daterangepicker {
	background-color: var(--app-surface) !important;  /* era #fff */
	border-color: var(--app-border) !important;       /* era #ddd */
	color: var(--app-text) !important;                /* era inherit */
}
[data-mode="dark"] .daterangepicker:after { border-bottom-color: var(--app-surface) !important; }       /* era #fff */
[data-mode="dark"] .daterangepicker.drop-up:after { border-top-color: var(--app-surface) !important; }  /* era #fff */
[data-mode="dark"] .daterangepicker:before { border-bottom-color: var(--app-border) !important; }       /* era #ccc */
[data-mode="dark"] .daterangepicker.drop-up:before { border-top-color: var(--app-border) !important; }  /* era #ccc */
/* Tabla del calendario */
[data-mode="dark"] .daterangepicker .calendar-table {
	background-color: var(--app-surface) !important;  /* era #fff */
	border-color: var(--app-surface) !important;      /* era #fff */
}
/* Chevrons prev/next: el triángulo lo dibuja el `border: solid black` → invisible en dark */
[data-mode="dark"] .daterangepicker .calendar-table .next span,
[data-mode="dark"] .daterangepicker .calendar-table .prev span { border-color: var(--app-text) !important; }  /* era black */
/* Hover de día disponible */
[data-mode="dark"] .daterangepicker td.available:hover,
[data-mode="dark"] .daterangepicker th.available:hover { background-color: var(--app-surface-3) !important; }  /* era #eee */
/* Días de otro mes (off) */
[data-mode="dark"] .daterangepicker td.off,
[data-mode="dark"] .daterangepicker td.off.in-range,
[data-mode="dark"] .daterangepicker td.off.start-date,
[data-mode="dark"] .daterangepicker td.off.end-date {
	background-color: var(--app-surface) !important;       /* era #fff */
	color: var(--app-text-disabled) !important;            /* era #999 */
}
/* Días dentro del rango seleccionado */
[data-mode="dark"] .daterangepicker td.in-range {
	background-color: var(--app-primary-muted) !important; /* era #ebf4f8 (azul claro) */
	color: var(--app-text) !important;                     /* era #000 */
}
/* Día(s) seleccionado(s): ver bloque "seleccionado/activo" más arriba en este
   archivo (slate+borde primary+texto claro, en vez del azul fijo #357ebd del
   plugin ni el fill sólido var(--app-primary) que cansaba la vista). */
/* Selects de mes/año/hora */
[data-mode="dark"] .daterangepicker select.monthselect,
[data-mode="dark"] .daterangepicker select.yearselect,
[data-mode="dark"] .daterangepicker select.hourselect,
[data-mode="dark"] .daterangepicker select.minuteselect,
[data-mode="dark"] .daterangepicker select.secondselect,
[data-mode="dark"] .daterangepicker select.ampmselect {
	background-color: var(--app-surface-2) !important;  /* hour/min/sec era #eee; month/year browser-default */
	border-color: var(--app-border) !important;
	color: var(--app-text) !important;
}
/* Footer + divisores */
[data-mode="dark"] .daterangepicker .drp-buttons { border-top-color: var(--app-border) !important; }              /* era #ddd */
[data-mode="dark"] .daterangepicker.show-ranges .calendar.left { border-left-color: var(--app-border) !important; } /* era #ddd */
/* Lista de rangos predefinidos (Hoy, Última semana, …) */
[data-mode="dark"] .daterangepicker .ranges li:hover { background-color: var(--app-surface-3) !important; }  /* era #eee */
/* .ranges li.active: ver bloque "seleccionado/activo" más arriba en este archivo
   (slate+borde primary+texto claro, en vez del azul fijo #08c del plugin). */

/* -------------------------------------------------------------------------
   Componente: ion-rangeslider — skin "round" (assets/plugins/ion-rangeslider)
   Selector de cantidad de SMS en outbound (#range_slider-credits) y demás
   sliders. Solo se re-tematizan las piezas que quedan claras sobre fondo
   oscuro: el track y la burbuja de valor. Se MANTIENEN a propósito:
     • .irs-bar  (#49DA96 verde) — relleno/progreso, legible en dark.
     • .irs-handle (pomo blanco) — buen contraste como thumb sobre el track.
   ------------------------------------------------------------------------- */
[data-mode="dark"] .irs--round .irs-line {
	background-color: var(--app-surface-3) !important;  /* track, era #dee4ec */
}
/* Burbuja de valor flotante: era #ffffff con texto navy #14477e (ilegible
   como tooltip oscuro). Se vuelve superficie elevada + texto fuerte. */
[data-mode="dark"] .irs--round .irs-from,
[data-mode="dark"] .irs--round .irs-to,
[data-mode="dark"] .irs--round .irs-single {
	background-color: var(--app-surface-3) !important;  /* era #ffffff */
	color: var(--app-text-strong) !important;           /* era #14477e */
}
[data-mode="dark"] .irs--round .irs-from:before,
[data-mode="dark"] .irs--round .irs-to:before,
[data-mode="dark"] .irs--round .irs-single:before {
	border-top-color: var(--app-surface-3) !important;  /* flecha de la burbuja, era #ffffff */
}

/* -------------------------------------------------------------------------
   outbound — #label-creditos: el "0" grande del carrito lleva un subrayado
   decorativo `border-bottom: 5px dashed #14477e` (outbound.css) que en navy
   es invisible sobre el fondo oscuro. Se baja a un divisor sutil.
   ------------------------------------------------------------------------- */
[data-mode="dark"] #label-creditos {
	border-bottom-color: var(--app-border-strong) !important;  /* era #14477e */
}

/* -------------------------------------------------------------------------
   Componente: subaccountDetails — .sad-icon-circle (assets/css/subaccountDetails.css)
   Las tarjetas de stats traen el color inline: `--icon-bg` (tinte casi blanco:
   #E6F6FF, #E4F0FA, #FFF9E6, #FDEEEE, #E8F5E9, #FFF4E5) + `--icon-color` (ícono
   saturado). En dark el tinte claro rompe el fondo oscuro. Se pisa la variable
   --icon-bg con un tinte OSCURO translúcido del mismo color (una familia por
   regla) y se mantiene el ícono brillante. Único ajuste de ícono: el navy
   #14477E es ilegible sobre oscuro → azul acero #5B9BD5. Se matchea por
   --icon-color (identifica cada familia unívocamente). El inline es
   non-important, así que el !important del stylesheet gana.
   ------------------------------------------------------------------------- */
[data-mode="dark"] .sad-icon-circle[style*="--icon-color: #1AA5FC"] {
	--icon-bg: rgba(26, 165, 252, 0.18) !important;   /* era #E6F6FF */
}
[data-mode="dark"] .sad-icon-circle[style*="--icon-color: #14477E"] {
	--icon-bg: rgba(91, 155, 213, 0.18) !important;   /* era #E4F0FA */
	--icon-color: #5B9BD5 !important;                 /* navy #14477E ilegible en dark */
}
[data-mode="dark"] .sad-icon-circle[style*="--icon-color: #FFC107"] {
	--icon-bg: rgba(255, 193, 7, 0.18) !important;    /* era #FFF9E6 */
}
[data-mode="dark"] .sad-icon-circle[style*="--icon-color: #F44336"] {
	--icon-bg: rgba(244, 67, 54, 0.18) !important;    /* era #FDEEEE */
}
[data-mode="dark"] .sad-icon-circle[style*="--icon-color: #4CAF50"] {
	--icon-bg: rgba(76, 175, 80, 0.18) !important;    /* era #E8F5E9 */
}
[data-mode="dark"] .sad-icon-circle[style*="--icon-color: #FF9800"] {
	--icon-bg: rgba(255, 152, 0, 0.18) !important;    /* era #FFF4E5 */
}

/* -------------------------------------------------------------------------
   subaccountDetails — repaso general de la vista/tabs (subaccountDetails.css).
   YA hereda dark (no se repite): .card / .card-header / .modal-content y la
   barra .tabs-container .nav-tabs-custom (borde, link muted, hover, activo en
   fondo transparente) + el texto global p·label·span. Los bordes/textos vía
   var(--sad-*) se resuelven con los tokens definidos arriba. Aquí van solo los
   restos hardcodeados o con var(--app-deep) (navy, no se redefine en dark).
   ------------------------------------------------------------------------- */

/* Tab activo de subcuentas: el texto ya cae a muted por la regla global de
   .nav-tabs-custom, pero color y SUBRAYADO usan var(--app-deep) (navy #14477e)
   ⇒ activo sin acento visible. Se sube al acento del panel. */
[data-mode="dark"] .sad-nav-tabs .nav-link.active,
[data-mode="dark"] .sad-nav-tabs .nav-link:hover {
	color: var(--app-primary) !important;               /* era var(--app-deep) navy */
	border-bottom-color: var(--app-primary) !important; /* subrayado del activo */
}

/* Divisor claro fijo (#e9ecef) del panel lateral. */
[data-mode="dark"] .sad-divider { border-top-color: var(--app-border); }

/* Textos navy/near-black que se vuelven casi invisibles sobre oscuro. */
[data-mode="dark"] .sad-filter-bar .form-label,
[data-mode="dark"] .sad-profile-sidebar .sad-profile-name {
	color: var(--app-text-strong);   /* era #212529 */
}
/* Grises fijos #6c757d / #727272 → token muted. */
[data-mode="dark"] .sad-stats-card .sad-card-text,
[data-mode="dark"] .sad-balance-card .sad-balance-title,
[data-mode="dark"] .sad-subaccount-switcher .sad-switcher-label,
[data-mode="dark"] .sad-profile-sidebar .sad-profile-text,
[data-mode="dark"] .no_addons_message-container,
[data-mode="dark"] .sad-settings-card .sad-settings-title {
	color: var(--app-text-muted);
}
/* Avatar de iniciales: borde claro fijo. */
[data-mode="dark"] .profile-capitals { border-color: var(--app-border-strong); }

/* Permisos — header del acordeón. OJO: subaccountDetails.css carga DESPUÉS de
   dark.css, así que `.sad-permission-card .card-header {background:#fff}` (0,2,0)
   le gana por orden al global `.card-header` (0,2,0, sin !important). Se necesita
   un selector sad-scopeado (0,3,0)+!important para el estado CERRADO. */
[data-mode="dark"] .sad-permission-card .card-header {
	background-color: var(--app-surface) !important;   /* era #fff */
}
/* Estado ABIERTO: :has() pinta el header #f9f9f9 (specificity 0,3,2) ⇒ se baja a
   superficie hundida para diferenciarlo del cerrado. */
[data-mode="dark"] .sad-permission-header:has(h5.sad-permission-title > span:not(.collapsed)) {
	background-color: var(--app-surface-2) !important;  /* era #f9f9f9 */
}

/* Modal Editar subcuenta — pestaña activa con fondo blanco fijo. */
[data-mode="dark"] .sad-modal-tabs .nav-link.active {
	background-color: var(--app-surface) !important;    /* era #fff */
}

/* Add-ons — placeholder vacío, contador y overlay de carga, todos claros. */
[data-mode="dark"] #no_addons_message {
	background: var(--app-surface-2) !important;        /* era white */
	border-color: var(--app-border-strong) !important;  /* dashed, era #dee2e6 */
}
[data-mode="dark"] .addon-count {
	background-color: var(--app-surface-2) !important;  /* era #f8f9fa */
	color: var(--app-text-muted) !important;            /* era gray */
	border-color: var(--app-border) !important;         /* era #e5e5e5 */
}
[data-mode="dark"] .addon-list-overlay {
	background-color: rgba(19, 21, 26, 0.75) !important; /* era rgba(255,255,255,.75) */
}

/* Badges de tipo de herramienta (tabla de Herramientas): texto navy
   var(--app-deep) ⇒ ilegible. Al acento del panel. */
[data-mode="dark"] .badge-cuponeras,
[data-mode="dark"] .badge-digital-promotion,
[data-mode="dark"] .badge-monederos,
[data-mode="dark"] .badge-tarjetas,
[data-mode="dark"] .badge-spin,
[data-mode="dark"] .badge-poster,
[data-mode="dark"] .badge-solicitud-pago,
[data-mode="dark"] .badge-encuesta,
[data-mode="dark"] .badge-imagen-adjunta,
[data-mode="dark"] .badge-formulario,
[data-mode="dark"] .badge-landings,
[data-mode="dark"] .badge-membership {
	color: var(--app-primary) !important;   /* era var(--app-deep) navy */
}
/* Badge genérico con fondo blanco fijo. */
[data-mode="dark"] .custom-badge {
	background-color: var(--app-surface-3) !important;  /* era white */
	border-color: var(--app-border) !important;         /* era #e9e9e9 */
	color: var(--app-text-strong) !important;           /* era #585ec3 */
}

/* Modales del mismo feature (no son tabs, pero quedaban claros): reporte de
   herramientas de fidelización y vista JSON legible. */
[data-mode="dark"] .loyalty-report-metric-value { color: var(--app-text-strong); }  /* era #212529 */
[data-mode="dark"] .loyalty-report-metric-label,
[data-mode="dark"] .loyalty-report-metric-sub { color: var(--app-text-muted); }      /* era #6c757d */
[data-mode="dark"] .loyalty-report-action-bar,
[data-mode="dark"] .loyalty-report-tool-card { border-color: var(--app-border); }    /* era #e9ecef */
[data-mode="dark"] .loyalty-report-error-banner {
	background: var(--app-warning-muted);   /* era #fff8e1 */
	border-color: var(--app-border-strong); /* era #ffe082 */
	color: var(--app-text);                 /* era #856404 */
}
[data-mode="dark"] .sad-readable-json-view {
	background-color: var(--app-surface-2);  /* era #f7f7f7 */
	border-color: var(--app-border);
}
[data-mode="dark"] .sad-readable-json-view dt { color: var(--app-text-strong); }     /* era #495057 */

/* -------------------------------------------------------------------------
   Componente: editor WYSIWYG (assets/plugins/wysiwyg/wysiwyg-editor.css) —
   global, usado en lealtadtarjeta (#txt_loyality_card_description_content) y
   demás. El área editable .wysiwyg-editor NO tiene fondo y .wysiwyg-container
   solo borde rgba(0,0,0,.15) (invisible en dark) ⇒ el campo se funde con la
   card. Se le da superficie hundida + borde visible (look de .form-control) y
   se aclaran íconos del toolbar (#333/#67757c) y bordes internos.
   ------------------------------------------------------------------------- */
[data-mode="dark"] .wysiwyg-container {
	background-color: var(--app-surface-2);   /* era transparente */
	border-color: var(--app-border);          /* era rgba(0,0,0,.15) */
}
[data-mode="dark"] .wysiwyg-editor {
	background-color: var(--app-surface-2);   /* asegura distinción aunque el editor se use suelto */
	color: var(--app-text);
}
[data-mode="dark"] .wysiwyg-placeholder { color: var(--app-text-muted); }  /* era #858f96 */
[data-mode="dark"] .wysiwyg-toolbar-top { border-bottom-color: var(--app-border); }   /* era rgba(0,0,0,.15) */
[data-mode="dark"] .wysiwyg-toolbar-bottom { border-top-color: var(--app-border); }
[data-mode="dark"] .wysiwyg-toolbar a,
[data-mode="dark"] .wysiwyg-toolbar-icon {
	color: var(--app-text) !important;        /* era #67757c / #333333 (invisibles en dark) */
}
/* Popups de insertar enlace/imagen/color: eran blancos con texto negro. */
[data-mode="dark"] .wysiwyg-popup {
	background: var(--app-surface) !important;
	color: var(--app-text);
	border-color: var(--app-border);
}

/* -------------------------------------------------------------------------
   Vista posters — wizard de diseño de pósters (posters.css + view.posters.php).
   El PÓSTER en sí (#image_brochures/.posterTitle/.posterSubtitulo… con
   background:#000 y color:#fff inline) es el LIENZO que el usuario diseña ⇒ NO
   se toca. Aquí solo el chrome del formulario. Ya heredan dark: nice-select,
   .form-control, .btn-light (toggles styleselecta) y el smart-wizard.
   ------------------------------------------------------------------------- */
/* Labels de sección con negro inline (style="color:#000000") ⇒ invisibles sobre
   oscuro. Inline (1,0,0) sólo se vence con !important. Scopeado a #wizardPosters
   para NO tocar el lienzo (que usa color:#fff, nunca #000 en labels). */
[data-mode="dark"] #wizardPosters label[style*="color: #000000"] {
	color: var(--app-text-strong) !important;
}
/* Selector de íconos del QR (#ejemplo_logos): labels near-black. */
[data-mode="dark"] #ejemplo_logos label { color: var(--app-text-strong); }   /* era #212529 */
/* Input de archivo (Bootstrap custom-file): label blanco + botón "Browse" gris. */
[data-mode="dark"] .custom-file-label {
	background-color: var(--app-surface-2);   /* era #fff */
	color: var(--app-text);                   /* era #495057 */
	border-color: var(--app-border);          /* era #ced4da */
}
[data-mode="dark"] .custom-file-label:after {
	background-color: var(--app-surface-3);   /* era #e9ecef */
	color: var(--app-text);                   /* era #495057 */
}
/* Trigger del colorpicker (asColorPicker): borde claro. */
[data-mode="dark"] .asColorPicker-trigger { border-color: var(--app-border); }   /* era #e8e8e8 */

/* -------------------------------------------------------------------------
   Componente global: slider de carga de imágenes (.slider-upload-area —
   mktcupones.css / manageimagesupload.css). Ya existía tematizado pero SOLO
   bajo .tabs-container (vista whitelabel); en mktcupones vive FUERA de ese
   contenedor ⇒ quedaba claro. Esta es la versión GLOBAL + las piezas que
   faltaban (small ya es muted por la regla global de <small>). Se MANTIENEN
   (ya oscuras en ambos modos): .thumbnail-overlay (rgba negro), su botón
   blanco circular y .thumbnail-number (badge negro).
   ------------------------------------------------------------------------- */
[data-mode="dark"] .slider-main-upload {
	background: var(--app-surface-2) !important;        /* era #f8f9fa */
	border-color: var(--app-border-strong) !important;  /* dashed, era #dee2e6 */
}
/* hover: el border #1ba5fc (acento) se conserva como indicador; solo el fondo. */
[data-mode="dark"] .slider-main-upload:hover { background: var(--app-primary-muted) !important; }  /* era #e7f1ff */
[data-mode="dark"] .slider-main-upload .upload-icon,
[data-mode="dark"] .slider-main-upload .upload-icon p { color: var(--app-text-muted) !important; }  /* era #6c757d */
[data-mode="dark"] .slider-main-upload .upload-icon h5 { color: var(--app-text) !important; }       /* era #495057 */
[data-mode="dark"] .slider-main-upload .upload-icon i { color: var(--app-primary) !important; }     /* era #0d6efd */
[data-mode="dark"] .slider-thumbnail-item {
	background: var(--app-surface-2) !important;        /* era #fff */
	border-color: var(--app-border) !important;         /* era #dee2e6 */
}
/* Imagen cargada con marco Bootstrap .img-thumbnail (fondo/borde blancos). */
[data-mode="dark"] .slider-thumbnail-item img {
	background-color: var(--app-surface-2) !important;  /* era #fff */
	border-color: var(--app-border) !important;         /* era #dee2e6 */
}
[data-mode="dark"] .preview-placeholder { color: var(--app-text-muted) !important; }  /* era #adb5bd */

/* -------------------------------------------------------------------------
   Vista optinforms — constructor de formularios (optinforms.css; el builder lo
   arma optinforms.js). Se tematiza el CHROME del builder. Se MANTIENE el LIENZO
   del formulario (.form-main-content / #previewform) porque representa el form
   publicado que ve el cliente final (mismo criterio que el lienzo del póster).
   ------------------------------------------------------------------------- */
/* Paleta de elementos arrastrables. */
[data-mode="dark"] .draggable-element {
	background: var(--app-surface-2);          /* era white */
	border-color: var(--app-border);           /* era rgb(196,196,196) */
	color: var(--app-text);                    /* era rgb(51,51,51) */
}
/* Filas de campos agregados al formulario. */
[data-mode="dark"] .drag-list > li {
	background: var(--app-surface);            /* era white */
}
/* Contenedor del wizard del builder (id ⇒ se unifica con la página). */
[data-mode="dark"] #smartwizard { background: transparent !important; }   /* era white */
/* Overlays de acción/ajustes sobre cada campo. */
[data-mode="dark"] .action-btn-list,
[data-mode="dark"] .showFieldSettings { background: var(--app-surface-3); }   /* era #ffffff */
/* Grid del buscador de imágenes (Unsplash). */
[data-mode="dark"] .grid-item { background-color: var(--app-surface-2); }   /* era rgba(255,255,255,.8) */
[data-mode="dark"] #col-uploadimage { border-left-color: var(--app-border); }   /* era #cdd3d6 */
/* Checkbox custom (.chiller_cb): caja blanca sin marcar ⇒ superficie + borde.
   El marcado (rojo + check) se conserva. */
[data-mode="dark"] .chiller_cb span {
	background: var(--app-surface-3);          /* era white */
	border-color: var(--app-border-strong);    /* era #fff */
}
/* Borde claro del primer botón de los btn-group. */
[data-mode="dark"] .btn-group > .btn:first-child { border-color: var(--app-border); }   /* era #e8e8e8 */

/* Lista de campos/preguntas (survey.inputs.css — compartido por survey y el
   builder de optinforms): filas blancas, handle de arrastre blanco y bordes
   lightgrey. El .drag-area (handle) es el fondo blanco que "se interpone". */
[data-mode="dark"] .drag-list-fields > li,
[data-mode="dark"] .drag-list-questions > li {
	background: var(--app-surface);            /* era white */
}
[data-mode="dark"] .drag-list-fields > li { border-bottom-color: var(--app-border); }   /* era lightgrey */
[data-mode="dark"] .drag-list-fields .drag-area {
	background: var(--app-surface);            /* era rgb(255,255,255) */
}
[data-mode="dark"] .drag-list-questions div.accordion,
[data-mode="dark"] .drag-list-questions > li > .card { border-color: var(--app-border); }   /* era lightgrey */
/* Switch on/off custom (.slider, optinforms.css:106-128 — NO es el mismo
   componente que .slider-main-upload de arriba). Solo se oscurece el riel
   (track); la perilla (:before) se mantiene blanca a propósito — es la
   convención universal de switches iOS/Android, se lee bien sobre riel
   oscuro sin necesidad de cambiarla. */
[data-mode="dark"] .slider { background-color: var(--app-border-strong); }   /* era #ccc */

/* -------------------------------------------------------------------------
   Vista misoptinforms (misoptinforms.css) — modal de generar QR y utilidades
   asociadas. Sin cobertura previa.
   ------------------------------------------------------------------------- */
[data-mode="dark"] .asColorPicker-trigger { border-color: var(--app-border); }   /* era #e8e8e8 */
/* Input de archivo estilo Bootstrap 4 (label + segmento "Browse"). */
[data-mode="dark"] label.custom-file-label {
	color: var(--app-text) !important;                 /* era #495057 */
	background-color: var(--app-surface) !important;   /* era white */
	border-color: var(--app-border) !important;        /* era #ced4da */
}
[data-mode="dark"] .custom-file-label:after {
	color: var(--app-text-muted) !important;         /* era #495057 */
	background-color: var(--app-surface-2) !important;  /* era #e9ecef */
}

/* =========================================================================
   9. TOGGLE de modo (botón en el topbar) — moon/sun
   ========================================================================= */
.app-mode-toggle { cursor: pointer; }
.app-mode-toggle i { transition: color var(--app-transition-fast); }

/* =========================================================================
   10. VISTA CONECTARIA (assets/css/conectaria.css)
   -------------------------------------------------------------------------
   El preview de código (.ia-code-block/.ia-code-header/.ia-code-content) en
   claro es un tono VSCode Dark+ fijo (#1e1e1e/#2d2d2d) pensado para
   contrastar contra el fondo BLANCO de la card. En oscuro ese mismo hex es
   un gris "de VSCode", NO el mismo tono que usan las demás cards del panel
   (--app-surface) — no se funde con el resto de la paleta, se ve como un
   parche aislado. Se adapta a los tokens de superficie para que quede
   consistente con cualquier otra card oscura. El texto de código
   (#d4d4d4/#aaa/#9cdcfe, resaltado tipo sintaxis) SÍ se mantiene fijo — es
   legible sobre --app-surface igual que sobre el #1e1e1e original. */
[data-mode="dark"] .ia-code-block { border-color: var(--app-border); }
[data-mode="dark"] .ia-code-header {
	background: var(--app-surface-2) !important;
	border-bottom: 1px solid var(--app-border);
}
[data-mode="dark"] .ia-code-content { background: var(--app-surface) !important; }

/* Insignia circular del número de paso (.bg-primary + texto blanco fijo en
   conectaria.css): mismo problema que .btn-primary/.btn-info (relleno
   --app-deep→--app-primary atenuado + blanco falla contraste). Se aplica el
   mismo combo ya estandarizado para "elemento con acento sólido" en vez de
   tocar .bg-primary global (usado en decenas de lugares fuera de esta
   vista). */
[data-mode="dark"] .ia-step-number.bg-primary {
	background-color: var(--app-slate) !important;
	color: #e3f2fd !important;
}

/* =========================================================================
   11. PLUGINS de terceros usados por optinforms (Switchery, font-picker,
   ion-rangeslider skin Modern) — aplican también a otras vistas que
   comparten el mismo plugin, no solo optinforms.
   ========================================================================= */

/* Switchery (assets/plugins/switchery): el estado APAGADO pinta background/
   border/box-shadow vía JS inline style (switchery.js:147-149, defaults
   secondaryColor #dfdfdf, bg #fff) — !important necesario para ganarle al
   inline style. El estado ENCENDIDO (verde #64bd63, this.colorize()) y la
   perilla (jackColor #fff siempre) se dejan igual — buen contraste ya. */
[data-mode="dark"] .switchery {
	background-color: var(--app-surface-3) !important;   /* era #fff */
	border-color: var(--app-border-strong) !important;    /* era #dfdfdf */
	box-shadow: inset 0 0 0 0 var(--app-border-strong) !important;
}

/* font-picker (assets/plugins/font-picker/font-picker.js): plugin de
   terceros que INYECTA su propio <style> por JS (línea ~109, css hardcoded
   #cbcbcb/#bebebe/#eaeaea/#dddddd/#d1d1d1/#000). No hay archivo CSS que
   editar — se sobrescribe con los mismos selectores + !important. El texto
   base (color: inherit en el plugin) ya hereda var(--app-text) del body,
   sin necesidad de tocarlo. */
[data-mode="dark"] div[id^="font-picker"] .dropdown-button {
	background: var(--app-surface-3) !important;   /* era #cbcbcb */
}
[data-mode="dark"] div[id^="font-picker"] .dropdown-button:hover,
[data-mode="dark"] div[id^="font-picker"] .dropdown-button:focus {
	background: var(--app-border-strong) !important;   /* era #bebebe */
}
[data-mode="dark"] div[id^="font-picker"] .dropdown-icon.loading::before {
	border-color: var(--app-border-strong) !important;         /* era #b2b2b2 */
	border-top-color: var(--app-text) !important;              /* era #000 */
}
[data-mode="dark"] div[id^="font-picker"] .dropdown-icon.finished::before {
	border-top-color: var(--app-text) !important;   /* era #000 (flecha invisible en dark) */
}
[data-mode="dark"] div[id^="font-picker"] ul {
	background: var(--app-surface) !important;   /* era #eaeaea */
}
[data-mode="dark"] div[id^="font-picker"] ul li button:hover,
[data-mode="dark"] div[id^="font-picker"] ul li button:focus {
	background: var(--app-surface-3) !important;   /* era #dddddd */
}
[data-mode="dark"] div[id^="font-picker"] ul li button.active-font {
	background: var(--app-primary-muted) !important;   /* era #d1d1d1 */
	color: var(--app-primary) !important;
}

/* ion-rangeslider skin "Modern" (ion.rangeSlider.skinModern.css) — usada en
   12 vistas (optinforms, misoptinforms, spineditor, posters, encuesta,
   spin, reports, solicitudpagos, outbound, mismonederos, miscuponeras,
   mktmiscupones), sin cobertura previa (el bloque de arriba es para el skin
   "round", selectores .irs--round, DISTINTO). El track/bar/thumb de este
   skin se dibujan con un sprite PNG (background: url(...) repeat-x) — no
   son recoloreables por CSS sin reemplazar el sprite, se dejan igual. Solo
   se tematizan las etiquetas de texto (min/max, grid), que sí son CSS
   plano. */
[data-mode="dark"] .irs-min,
[data-mode="dark"] .irs-max {
	background: var(--app-surface-3) !important;   /* era #e1e4e9 */
	color: var(--app-text-muted) !important;        /* era #999 */
}
[data-mode="dark"] .irs-grid-pol { background: var(--app-border-strong) !important; }   /* era #c0c0c0 */
[data-mode="dark"] .irs-grid-text { color: var(--app-text-muted) !important; }           /* era #c0c0c0 */

/* =========================================================================
   12. LOGO en dark — swap a la versión clara (#1073)
   -------------------------------------------------------------------------
   loadSectionLogo() (view.general.php) ya emite AMBAS variantes (.dark-logo
   con el logo real de la cuenta, .light-logo con el asset estático claro
   dado por el user — solo válido para cuentas sin marca blanca, que son las
   únicas que reciben dark mode, ver gate SubdomainActive). El legacy
   (style-base.css:2310) oculta .light-logo SIEMPRE vía display:none — acá
   se invierte cuál se ve según el modo. */
[data-mode="dark"] .topbar .top-navbar .navbar-header .navbar-brand .dark-logo {
	display: none !important;
}
[data-mode="dark"] .topbar .top-navbar .navbar-header .navbar-brand .light-logo {
	display: inline !important;
}
