/* Formulario de contacto/captación ([formulario_contacto]). */

#dr-contacto-v2.ctc-wrap {
    --ctc-blue: var(--color-azul-digital, #2c3fcd);
    --ctc-dark: var(--color-azul-oscuro, #0a1444);
    --ctc-sky: var(--color-azul-cielo, #378de2);
    --ctc-green: var(--vital-green, #17c384);
    position: relative;
    width: 100%;
}
#dr-contacto-v2 * { box-sizing: border-box; }

#dr-contacto-v2 .ctc-section {
    width: 100%;
    padding: clamp(56px, 8vw, 100px) clamp(20px, 4vw, 40px);
    font-family: 'Plus Jakarta Sans', -apple-system, sans-serif;
    background-color: #FAFBFD;
    display: flex;
    justify-content: center;
    position: relative;
    overflow: hidden;
}

#dr-contacto-v2 .ctc-overlay {
    position: absolute; inset: 0; z-index: 1;
    background: radial-gradient(circle at 50% 30%, rgba(255,255,255,0.5) 0%, #FAFBFD 72%);
}
#dr-contacto-v2 .ctc-grid-bg {
    position: absolute; inset: 0; z-index: 1;
    background-image: linear-gradient(rgba(10,20,68,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(10,20,68,0.03) 1px, transparent 1px);
    background-size: 56px 56px;
    mask-image: radial-gradient(circle at 50% 30%, black 15%, transparent 70%);
    -webkit-mask-image: radial-gradient(circle at 50% 30%, black 15%, transparent 70%);
}

/* ---- Fondo animado: orbes difuminados en colores de marca, igual patrón
   que .dgd-glow de [servicios_diagnostico] ---- */
#dr-contacto-v2 .ctc-glow {
    position: absolute;
    border-radius: 50%;
    filter: blur(100px);
    z-index: 1;
    pointer-events: none;
    animation: ctcGlowPulse 6.5s ease-in-out infinite;
}
#dr-contacto-v2 .ctc-glow--a {
    width: 420px; height: 420px;
    background: radial-gradient(circle, rgba(44,63,205,0.22), transparent 70%);
    top: -8%; left: -4%;
}
#dr-contacto-v2 .ctc-glow--b {
    width: 380px; height: 380px;
    background: radial-gradient(circle, rgba(55,141,226,0.22), transparent 70%);
    bottom: -10%; right: 2%;
    animation-delay: 1.4s;
}
#dr-contacto-v2 .ctc-glow--c {
    width: 320px; height: 320px;
    background: radial-gradient(circle, rgba(23,195,132,0.16), transparent 70%);
    top: 40%; right: 20%;
    animation-delay: 2.6s;
}

/* ---- Layout de dos columnas: formulario a la izquierda + visual (Doqui)
   a la derecha ---- */
.ctc-layout {
    position: relative;
    z-index: 3;
    display: grid;
    grid-template-columns: minmax(0, 60%) minmax(0, 40%);
    justify-content: center;
    align-items: center;
    gap: clamp(28px, 5vw, 72px);
    max-width: 1180px;
    width: 100%;
    margin: 0 auto;
}

@media (max-width: 900px) {
    .ctc-layout {
        grid-template-columns: 1fr;
        justify-items: center;
        gap: 40px;
    }
    /* En móvil, Doqui va primero: es el gancho visual antes del formulario. */
    .ctc-visual { order: -1; }
}

/* ---- Columna visual: título + Doqui flotando con halo/órbita + CTA de
   WhatsApp funcional y pulsante ---- */
.ctc-visual {
    --ctc-tilt-x: 0deg;
    --ctc-tilt-y: 0deg;
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    width: 100%;
    padding: 12px;
    perspective: 1200px;
    /* Aura radial suave detrás de todo (título + Doqui): le da profundidad
       a la columna sin competir con el halo/blob que ya tiene la imagen. */
    background: radial-gradient(circle, rgba(55,141,226,0.12) 0%, transparent 70%);
}

.ctc-visual-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-family: 'Space Mono', monospace;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--ctc-blue, #2c3fcd);
    margin: 0 0 10px;
}

/* Icono de mensaje "pensando": se balancea suavemente y una aura pulsa
   detrás, como si estuviera generando ideas — continuo, no una ráfaga
   puntual como el wiggle de Doqui. */
.ctc-thinking-icon {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    animation: ctcThinkTilt 2.6s ease-in-out infinite;
}
.ctc-thinking-icon::before {
    content: "";
    position: absolute;
    inset: -5px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(44, 63, 205, 0.2), transparent 70%);
    animation: ctcThinkGlow 2.6s ease-in-out infinite;
}
.ctc-thinking-icon i {
    position: relative;
    z-index: 1;
}
.ctc-visual-titulo {
    font-family: 'Literata', serif;
    font-style: italic;
    font-weight: 700;
    font-size: clamp(1.9rem, 3.6vw, 2.7rem);
    color: var(--ctc-dark, #0a1444);
    letter-spacing: -0.02em;
    line-height: 1.15;
    margin: 0 0 6px;
}
.ctc-visual-titulo span {
    background: linear-gradient(120deg, var(--ctc-blue), var(--ctc-sky));
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}
.ctc-visual-nota {
    max-width: 300px;
    font-size: 13.5px;
    font-weight: 600;
    line-height: 1.5;
    color: #5b6472;
    margin: 14px 0 0;
}

.ctc-visual-float {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 340px;
    margin-top: 18px;
    animation: ctcFloat 6s ease-in-out infinite;
}

/* Aro discontinuo que gira lentamente detrás de Doqui — toque premium/tech. */
.ctc-visual-orbit {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 112%;
    aspect-ratio: 1;
    transform: translate(-50%, -50%);
    border-radius: 50%;
    border: 1.5px dashed rgba(44, 63, 205, 0.28);
    animation: ctcOrbitSpin 26s linear infinite;
    z-index: 0;
    pointer-events: none;
}
.ctc-visual-blob {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 82%;
    aspect-ratio: 1;
    transform: translate(-50%, -50%);
    z-index: 0;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(44,63,205,0.3), rgba(23,195,132,0.14) 55%, transparent 75%);
    filter: blur(50px);
    animation: ctcBlobPulse 5.5s ease-in-out infinite;
    pointer-events: none;
}

/* Envoltura solo para el wiggle de la patita: separada de .ctc-visual-img
   (que ya usa su propio transform para el parallax del mouse) para que las
   dos animaciones no se pisen — ambos transforms se componen en cascada
   sin conflicto porque viven en elementos anidados distintos. El pivote
   (transform-origin) está puesto sobre el hombro de la patita levantada de
   Doqui (no en el centro de la imagen), así que al rotar el cuerpo entero
   unos pocos grados, la patita —la parte más lejana del pivote— es la que
   se percibe moviéndose, no la cabeza ni el resto del cuerpo. */
.ctc-visual-wiggle {
    display: block;
    width: 100%;
    transform-origin: 30% 48%;
    animation: ctcPataWiggle 7s ease-in-out infinite;
}

.ctc-visual-img {
    position: relative;
    z-index: 1;
    display: block;
    width: 100%;
    height: auto;
    filter: drop-shadow(0 30px 55px rgba(10, 20, 68, 0.22));
    transform: rotateX(var(--ctc-tilt-x)) rotateY(var(--ctc-tilt-y));
    transition: transform 0.25s ease-out;
    will-change: transform;
}

/* Sombra de "suelo" bajo Doqui — la ancla visualmente en vez de dejarla
   flotando sin referencia, aspecto 3D integrado. */
.ctc-visual-suelo {
    position: absolute;
    z-index: 0;
    left: 50%;
    bottom: 4%;
    width: 55%;
    height: 22px;
    transform: translateX(-50%);
    background: radial-gradient(ellipse at center, rgba(10,20,68,0.28) 0%, rgba(10,20,68,0.1) 55%, transparent 75%);
    filter: blur(7px);
    border-radius: 50%;
    animation: ctcSueloPulse 6s ease-in-out infinite;
    pointer-events: none;
}

/* ---- Micro-badges flotantes alrededor de Doqui ---- */
.ctc-micro-badge {
    position: absolute;
    z-index: 2;
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 9px 14px;
    background: #ffffff;
    border-radius: 14px;
    box-shadow: 0 10px 25px rgba(0, 0, 0, 0.06);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 12px;
    font-weight: 700;
    color: var(--ctc-dark, #0a1444);
    white-space: nowrap;
    animation: ctcWaFloat 5s ease-in-out infinite;
}
.ctc-micro-badge--a {
    top: 6%;
    left: -10%;
    animation-delay: 0.4s;
}
.ctc-micro-badge--b {
    bottom: 14%;
    right: -10%;
    animation-delay: 1.8s;
}

@media (max-width: 900px) {
    .ctc-micro-badge--a { left: -2%; }
    .ctc-micro-badge--b { right: -2%; }
}
@media (max-width: 480px) {
    .ctc-micro-badge { display: none; }
}

/* ---- CTA de WhatsApp: pastilla funcional (enlaza a wa.me) flotando junto
   a Doqui, con anillo tipo "ping" para que se lea como algo vivo/real. ---- */
.ctc-wa-cta {
    position: absolute;
    z-index: 3;
    top: 6%;
    right: -16%;
    display: inline-flex;
    align-items: center;
    gap: 10px;
    padding: 7px 18px 7px 8px;
    background: #ffffff;
    border-radius: 999px;
    border: none !important;
    box-shadow: 0 18px 36px rgba(10, 20, 68, 0.16), 0 0 0 1px rgba(10, 20, 68, 0.05);
    text-decoration: none !important;
    animation: ctcWaFloat 4.2s ease-in-out infinite;
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.ctc-wa-cta,
.ctc-wa-cta:hover,
.ctc-wa-cta:focus,
.ctc-wa-cta:active {
    text-decoration: none !important;
    border: none !important;
}
.ctc-wa-cta:hover {
    transform: translateY(-4px) scale(1.05);
    box-shadow: 0 22px 46px rgba(37, 211, 102, 0.32);
}
.ctc-wa-texto {
    font-family: 'Space Mono', monospace;
    font-size: 12px;
    font-weight: 700;
    color: var(--ctc-dark, #0a1444);
    white-space: nowrap;
    text-decoration: none !important;
    border: none !important;
    box-shadow: none;
}
.ctc-wa-icono {
    position: relative;
    display: grid;
    place-items: center;
    flex-shrink: 0;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: #25D366;
    color: #fff;
    font-size: 18px;
    box-shadow: 0 8px 18px rgba(37, 211, 102, 0.5);
}
.ctc-wa-ping {
    position: absolute;
    inset: -5px;
    border-radius: 50%;
    border: 2px solid #25D366;
    animation: ctcWaPing 2s cubic-bezier(0, 0, 0.2, 1) infinite;
}

@media (max-width: 900px) {
    .ctc-visual-float { max-width: 300px; }
    .ctc-wa-cta { top: 4%; right: -8%; }
}
@media (max-width: 480px) {
    .ctc-visual-float { max-width: 240px; }
    .ctc-wa-cta { top: 2%; padding: 6px 14px 6px 6px; right: -4%; }
    .ctc-wa-texto { font-size: 11px; }
    .ctc-wa-icono { width: 34px; height: 34px; font-size: 15px; }
}

/* ---- Card del formulario ---- */
.dr-contacto-card {
    position: relative;
    z-index: 3;
    width: 100%;
    max-width: 100%;
    margin: 0 auto;
    padding: clamp(28px, 4vw, 44px);
    background:
        linear-gradient(#ffffff, #ffffff) padding-box,
        linear-gradient(135deg, rgba(44,63,205,0.5), rgba(55,141,226,0.4), rgba(23,195,132,0.35)) border-box;
    border: 1.5px solid transparent;
    border-radius: 28px;
    box-shadow: 0 25px 60px rgba(10, 20, 68, 0.09);
    box-sizing: border-box;
    transition: box-shadow 0.4s ease, transform 0.4s ease;
    animation: ctcCardGlow 7s ease-in-out infinite;
}
.dr-contacto-card,
.dr-contacto-card * {
    box-sizing: border-box;
}
.dr-contacto-card:hover,
.dr-contacto-card:focus-within {
    transform: translateY(-3px);
    box-shadow: 0 32px 70px rgba(10, 20, 68, 0.14);
}

/* ---- Revelado al hacer scroll (activado por contacto-ajax.js vía
   IntersectionObserver; sin JS o con reduced-motion, ambos bloques ya
   incluyen la clase is-visible desde el arranque). ---- */
[data-ctc-reveal] {
    opacity: 0;
    transform: translateY(28px);
    transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}
[data-ctc-reveal].is-visible {
    opacity: 1;
    transform: translateY(0);
}
.ctc-visual[data-ctc-reveal] { transition-delay: 0s; }
.dr-contacto-card[data-ctc-reveal] { transition-delay: 0.15s; }

/* ---- Encabezado del card ---- */
.dr-contacto-encabezado { margin-bottom: 30px; }
.dr-contacto-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-family: 'Space Mono', monospace;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--ctc-blue, #2c3fcd);
    margin: 0 0 16px;
}
.dr-contacto-eyebrow-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--ctc-green, #17c384);
    animation: ctcDotPulse 1.6s ease-out infinite;
}
.dr-contacto-titulo {
    font-family: 'Literata', serif;
    font-style: italic;
    font-size: clamp(1.7rem, 3vw, 2.3rem);
    font-weight: 700;
    color: var(--ctc-dark, #0a1444);
    letter-spacing: -0.02em;
    margin: 0 0 10px;
    line-height: 1.18;
}
.dr-contacto-subtitulo {
    font-size: 14.5px;
    line-height: 1.6;
    color: #4A5568;
    font-weight: 500;
    margin: 0;
}

.dr-contacto-form {
    display: block;
    width: 100%;
    font-family: inherit;
}

/* Nombre+Especialidad y Correo+Teléfono en 2 columnas en desktop, 1 en móvil. */
.dr-contacto-fila-2col {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0 16px;
}
@media (max-width: 640px) {
    .dr-contacto-fila-2col {
        grid-template-columns: 1fr;
    }
}

.dr-contacto-field {
    display: flex;
    flex-direction: column;
}
.dr-contacto-field-encabezado {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
}
.dr-contacto-field label {
    font-size: 12.5px;
    font-weight: 700;
    color: var(--ctc-dark, #0a1444);
    margin-bottom: 7px;
    letter-spacing: 0.01em;
}
.dr-contacto-contador {
    font-family: 'Space Mono', monospace;
    font-size: 11.5px;
    font-weight: 700;
    color: rgba(10, 20, 68, 0.4);
    margin-bottom: 7px;
    white-space: nowrap;
}
.dr-contacto-contador.dr-contacto-contador-limite {
    color: #b3435c;
}

.dr-contacto-field input,
.dr-contacto-field select,
.dr-contacto-field textarea {
    width: 100%;
    padding: 10px 16px;
    border: 1.5px solid rgba(10, 20, 68, 0.1);
    border-radius: 14px;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    font-weight: 500;
    color: var(--ctc-dark, #0a1444);
    background-color: #FAFBFD;
    transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
    margin-bottom: 13px;
}
.dr-contacto-field textarea {
    resize: vertical;
    min-height: 64px;
}
.dr-contacto-field input::placeholder,
.dr-contacto-field textarea::placeholder {
    /* Auditoría a11y: #94A3B8 sobre #FAFBFD daba 2.48:1 (falla WCAG AA,
       que exige 4.5:1) — #647085 da 4.83:1, mismo tono de gris azulado. */
    color: #647085;
    opacity: 1;
}
.dr-contacto-field input:hover,
.dr-contacto-field select:hover,
.dr-contacto-field textarea:hover {
    border-color: rgba(10, 20, 68, 0.2);
}
.dr-contacto-field input:focus,
.dr-contacto-field select:focus,
.dr-contacto-field textarea:focus {
    outline: none;
    border-color: var(--ctc-blue, #2c3fcd);
    background-color: #ffffff;
    box-shadow: 0 0 0 4px rgba(44, 63, 205, 0.12);
}

/* Estado inválido (validación en vivo de contacto-ajax.js). */
.dr-contacto-field input.dr-contacto-input-invalido,
.dr-contacto-field select.dr-contacto-input-invalido,
.dr-contacto-field textarea.dr-contacto-input-invalido {
    border-color: #e8a3b3;
    background-color: #fdf5f6;
}
.dr-contacto-field input.dr-contacto-input-invalido:focus,
.dr-contacto-field select.dr-contacto-input-invalido:focus,
.dr-contacto-field textarea.dr-contacto-input-invalido:focus {
    border-color: #d1607c;
    box-shadow: 0 0 0 4px rgba(209, 96, 124, 0.14);
}

/* Mensaje de campo obligatorio: rosa/rojo pastel, se acomoda debajo del
   input tirando de su propio margen sin desplazar el resto del grid. */
.dr-contacto-hint {
    margin: -10px 0 12px;
    padding: 6px 10px;
    font-size: 12.5px;
    font-weight: 600;
    line-height: 1.4;
    color: #b3435c;
    background: #fdf1f3;
    border-radius: 8px;
}

/* Select de especialidad médica con flecha propia (appearance:none quita la
   nativa del navegador, que no se puede colorear/posicionar). */
.dr-contacto-select-wrap { position: relative; }
.dr-contacto-field select {
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    padding-right: 40px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230a1444' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 14px center;
    background-size: 16px;
    cursor: pointer;
}

/* Pie del formulario: checkbox de privacidad, Turnstile y botón, agrupados y
   espaciados de forma consistente para que se vean parte del mismo card. */
.dr-contacto-footer {
    display: flex;
    flex-direction: column;
    margin-top: 4px;
}

.dr-contacto-checkbox-row {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    font-size: 13px;
    line-height: 1.5;
    color: #4A5568;
    font-weight: 500;
    cursor: pointer;
    margin-bottom: 4px;
}
.dr-contacto-checkbox-row input {
    margin: 2px 0 0;
    width: auto;
    flex-shrink: 0;
    accent-color: var(--ctc-blue, #2c3fcd);
}
.dr-contacto-checkbox-row a { color: var(--ctc-blue, #2c3fcd); font-weight: 700; }

/* Honeypot: invisible para personas, presente en el DOM para bots que
   rellenan cualquier <input> que encuentren. */
.dr-contacto-honeypot {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* Turnstile: bloque centrado con su propio ancho (no estirado a lo ancho del
   card), separado del checkbox y del botón. */
.dr-contacto-turnstile {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
    max-width: 300px;
    margin: 16px auto;
    min-height: 65px;
    box-sizing: border-box;
}

.dr-contacto-error {
    font-family: 'Plus Jakarta Sans', sans-serif;
    color: #b91c1c;
    background: #FEF2F2;
    border-radius: 10px;
    padding: 11px 16px;
    font-size: 13px;
    font-weight: 700;
    margin: 0 0 16px;
}
.dr-contacto-exito {
    font-family: 'Plus Jakarta Sans', sans-serif;
    color: #0f7a4e;
    background: #e6f7ef;
    border-radius: 10px;
    padding: 11px 16px;
    font-size: 13px;
    font-weight: 700;
    margin: 0 0 16px;
}

/* ---- Botón: misma familia visual que .pl3-cta (píldora + círculo con
   icono que rota al pasar el mouse) en vez del rectángulo genérico anterior. ---- */
.dr-contacto-btn-primary {
    -webkit-tap-highlight-color: transparent;
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    width: 100%;
    background: var(--ctc-blue, #2c3fcd);
    color: #fff;
    border: none;
    padding: 8px 10px 8px 26px;
    border-radius: 999px;
    font-family: 'Space Mono', monospace;
    font-weight: 700;
    font-size: 14.5px;
    cursor: pointer;
    box-shadow: 0 10px 24px rgba(44, 63, 205, 0.3);
    transition: box-shadow 0.3s ease, transform 0.3s ease, background 0.3s ease;
    min-height: 52px;
}
.dr-contacto-btn-texto { position: relative; z-index: 1; }
.dr-contacto-btn-icono {
    position: relative;
    z-index: 1;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.22);
    display: grid;
    place-items: center;
    flex-shrink: 0;
    margin-left: auto;
    transition: transform 0.45s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.3s ease;
}
.dr-contacto-btn-primary:hover:not(:disabled) {
    background: var(--ctc-dark, #0a1444);
    transform: translateY(-2px);
    box-shadow: 0 14px 30px rgba(10, 20, 68, 0.32);
}
.dr-contacto-btn-primary:hover:not(:disabled) .dr-contacto-btn-icono {
    background: var(--ctc-sky, #378de2);
    transform: rotate(45deg);
}
.dr-contacto-btn-primary:active:not(:disabled) { transform: translateY(0); }
.dr-contacto-btn-primary:disabled { opacity: 0.55; cursor: not-allowed; box-shadow: none; }
.dr-contacto-btn-primary:focus-visible { outline: 2px solid var(--ctc-dark, #0a1444); outline-offset: 3px; }

/* Spinner de carga: reemplaza el círculo del ícono mientras se envía
   (contacto-ajax.js agrega/quita la clase is-loading, no reemplaza el texto). */
.dr-contacto-spinner {
    display: none;
    width: 16px;
    height: 16px;
    margin-left: auto;
    border: 2px solid rgba(255, 255, 255, 0.4);
    border-top-color: #fff;
    border-radius: 50%;
    animation: dr-contacto-spin 0.6s linear infinite;
}
.dr-contacto-btn-primary.is-loading { cursor: wait; }
.dr-contacto-btn-primary.is-loading .dr-contacto-btn-icono { display: none; }
.dr-contacto-btn-primary.is-loading .dr-contacto-spinner { display: inline-block; }
@keyframes dr-contacto-spin {
    to { transform: rotate(360deg); }
}
@keyframes ctcDotPulse {
    0% { box-shadow: 0 0 0 0 rgba(23,195,132,0.4); }
    70% { box-shadow: 0 0 0 6px rgba(23,195,132,0); }
    100% { box-shadow: 0 0 0 0 rgba(23,195,132,0); }
}
@keyframes ctcGlowPulse {
    0%, 100% { opacity: 0.7; transform: scale(1); }
    50% { opacity: 1; transform: scale(1.08); }
}
@keyframes ctcBlobPulse {
    0%, 100% { opacity: 0.6; transform: translate(-50%, -50%) scale(1) rotate(0deg); }
    50% { opacity: 0.9; transform: translate(-50%, -50%) scale(1.1) rotate(6deg); }
}
@keyframes ctcOrbitSpin {
    from { transform: translate(-50%, -50%) rotate(0deg); }
    to { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes ctcFloat {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-14px); }
}
@keyframes ctcWaFloat {
    0%, 100% { transform: translateY(0) rotate(-2deg); }
    50% { transform: translateY(-8px) rotate(1deg); }
}
@keyframes ctcWaPing {
    0% { transform: scale(0.7); opacity: 0.9; }
    100% { transform: scale(1.6); opacity: 0; }
}
@keyframes ctcThinkTilt {
    0%, 100% { transform: rotate(0deg) translateY(0); }
    25% { transform: rotate(-12deg) translateY(-1px); }
    50% { transform: rotate(0deg) translateY(-2px); }
    75% { transform: rotate(12deg) translateY(-1px); }
}
@keyframes ctcThinkGlow {
    0%, 100% { opacity: 0.4; transform: scale(0.85); }
    50% { opacity: 1; transform: scale(1.15); }
}
@keyframes ctcSueloPulse {
    0%, 100% { transform: translateX(-50%) scale(1); opacity: 0.9; }
    50% { transform: translateX(-50%) scale(0.85); opacity: 0.55; }
}
/* Reposo la mayor parte del ciclo (0%-75%) + una ráfaga corta de 3 wiggles
   (75%-95%) — así se lee como "cada cierto tiempo saluda", no como un tic
   constante. */
@keyframes ctcPataWiggle {
    0%, 75% { transform: rotate(0deg); }
    79% { transform: rotate(-6deg); }
    83% { transform: rotate(5deg); }
    87% { transform: rotate(-4deg); }
    91% { transform: rotate(3deg); }
    95%, 100% { transform: rotate(0deg); }
}
@keyframes ctcCardGlow {
    0%, 100% { box-shadow: 0 25px 60px rgba(10, 20, 68, 0.09); }
    50% { box-shadow: 0 30px 70px rgba(44, 63, 205, 0.14); }
}

@media (prefers-reduced-motion: reduce) {
    #dr-contacto-v2 * { animation: none !important; transition: none !important; }
    [data-ctc-reveal] { opacity: 1 !important; transform: none !important; }
}

@media (max-width: 640px) {
    #dr-contacto-v2 .ctc-section { padding: 40px 16px; }
    .dr-contacto-card { padding: 24px 20px; }
    .dr-contacto-titulo { font-size: 22px; }
}
