/* ═══════════════════════════════════════
   ▓ COMPONENTE · IconoAnimado — gemelo vanilla ▓
   v1.15 · 2026-10-27 (reloj «r: A» y Personas A, pestañas de RH; v1.13 · 2026-10-06 abajo). Ficha: `design-system/COMPONENTE_ICONO_ANIMADO.md`
   Kit: `catalogo-cd/components/IconoAnimado.jsx`
   Decisión de origen: `plans/decisiones/_decision_iconos_animados_2026-09-08.html` (v3)
   Correcciones aplicadas: `plans/decisiones/_correcciones_iconos_2026-09-08.md`
   ⛔ v1.13 (2026-10-06) — LOS GESTOS DEL SHELL DEL BACKOFFICE SE REHACEN CON LA GRAMÁTICA «MUEVE LA
   PARTE QUE SIGNIFICA» + LUCIDE ANIMATED COMO FUENTE DEL MOVIMIENTO (no como dependencia).
   `DECISION-FUENTE: Ricardo, 2026-10-06 — «aprobado», sobre la frase: «Un ícono animado mueve la parte que lleva su significado, y la mueve haciendo lo que esa parte hace: una flecha avanza, una tapa se abre, una campana suena. Mover, girar o agrandar el ícono entero no es un gesto, salvo que eso sea literalmente lo que el ícono significa.»`
   `DECISION-FUENTE: Ricardo, 2026-10-06 — «La animación tiene que estar diseñada para coincidir con los estados inactivo, hover y activo (módulo abierto)»` → dos familias, POSE y SUCESO (ver la sección de recetas más abajo).
   `DECISION-FUENTE: Ricardo, 2026-10-06 — «Aprobado. 500»`, sobre «que todo tenga en Shell un mismo ritmo»: todo gesto del shell dura --ritmo-shell (500 ms).
   `DECISION-FUENTE: Ricardo, 2026-10-06 — «Cartera. El icono crece verticalmente tanto que el borde superior se corta.»` → overflow visible en el svg de los íconos del shell.
   Nacen los marcadores `lupa`, `persona-marco`, `carroceria`, `interrog` (ahora con gesto), `llave`, `onda-int`/`onda-ext`;
   Admin cambia a wrench e Integraciones a radio. Se retiran las reglas sustituidas (nota más abajo).
   AVISO DE AUTORÍA: los movimientos de wrench, radio, circle-help, search, file-text, shield-check, tag, truck y
   user-round se traducen a CSS desde Lucide Animated (lucide-animated.com · github.com/pqoqubbw/icons), licencia
   MIT, Copyright (c) 2024-2026 pqoqubbw, verificada el 2026-10-06. No se instala ni se importa: es fuente del movimiento.
   ⛔ v1.12 (2026-09-12) — LOS CUATRO ÍCONOS DEL RIEL DEL PORTAL DEL CLIENTE ESTRENAN GESTO
   (Inicio, Solicitar, Contratos, Mi información — Solicitudes ya lo tenía, `layers`,
   v1.11-portal). `DECISION-FUENTE: Ricardo, 2026-09-12 — «que mande dibujo»`, sobre
   `plans/decisiones/_decision_gesto_iconos_familia_fuerte_2026-09-12.html`: se midieron
   dos familias de gesto ya vivas en el backoffice — la ENVOLTORIO (objeto entero, ~8-13 %,
   como `data-lupa`/`data-doc`/`data-escudo`/`data-signo`) y la FUERTE (una parte suelta se
   traslada dentro de un dibujo compuesto, ~22-24 %, como Dashboard/Cartera) — y se decidió
   por la GEOMETRÍA del dibujo, no por la uniformidad de la barra (que ya convive con las
   dos familias desde el 2026-09-09 sin que se reportara como defecto).
     1. INICIO (`house`) y SOLICITAR (`send`) son objetos RÍGIDOS Y CERRADOS — una casa, un
        avión de papel — sin ninguna parte que se pueda aislar sin romper el dibujo (Regla
        dura 7). Se quedan en la familia ENVOLTORIO, nacen `data-casa` (scale) y `data-avion`
        (rotate), calibrados en `_decision_gesto_iconos_portal_2026-09-12.html` de 1.12/-7°
        (8.7 %/8.3 %, «se veía como un bug») a **1.18/-11° (13.0 %/12.4 %)** — por encima del
        techo previo de la familia (Avisos, 11.8 %).
     2. CONTRATOS (`folder-pen`) y MI INFORMACIÓN (`file-user`) SÍ tienen una parte suelta:
        la PLUMA es un `<path>` cerrado e independiente (folder-pen); la PERSONA son un
        círculo y un arco agrupables en un `<g>` (file-user). Nacen `data-part="pluma"` y
        `data-part="persona"`, mismo mecanismo de traslación que Dashboard/Cartera,
        calibrados al **24,0 % típico de la familia fuerte** — por encima de la vara del
        22 %, no necesitan `MOTION-ALLOW`.
   ⛔ v1.10 (2026-09-10) — RICARDO, MIRANDO PRODUCCIÓN: «con movimiento, cuando se selecciona
   uno, queda en su estado de movimiento […] la lupa de mesa de control queda en Zoom […] el
   estado activo debe de ser el ícono en su forma original». RETIRA `.is-active` como
   DISPARADOR PERMANENTE de los 20 gestos B (navegación): el módulo activo se pintaba con
   `.is-active` puesto para SIEMPRE mientras esa pantalla siguiera abierta (`_sbxSync()`,
   `admin/js/backoffice/backoffice-2.js`), y la regla `.exds-ic-g.is-active [data-*]` lo
   dejaba transformado sin fin — exactamente lo contrario de la REGLA DURA 2 (el gesto es
   reversible). Los 30 selectores de Gesto B pierden su cláusula `.is-active`: hoy sólo
   `:hover` y `.play` mueven una parte. «Quedar activo» pasa a ser un `.play` DE UNA VEZ
   (mismo mecanismo ya usado por `dispararGestoTab` en `facturacion.js`/`stp.js`
   y por `exdsGestoActualizar` en `boton-actualizar.js`: temporizador determinista que cancela el anterior, nunca
   colgado de una promesa de animación — INC-208), disparado por `_dispararGestoActivo()`
   sólo cuando el ícono activo CAMBIA de verdad. Gesto C (morfo/estado real: `data-morph`,
   `data-check`, `data-punto`) NO se toca — ahí `.is-active` sigue siendo el disparador
   correcto porque representa un ESTADO que de verdad cambió (abierto/cerrado, confirmado,
   aviso pendiente), no "este módulo está seleccionado".
   v1.9 (2026-09-10) sustituye TRES íconos, no gestos nuevos: Mesa de control (search →
   folder-search), Mesa de crédito (dollar-sign → file-search-corner) y Finanzas
   (clipboard-list → circle-dollar-sign).
   `DECISION-FUENTE: Ricardo, 2026-09-10 — «iconos aprobada tu recomendacion de los 3», sobre
   `plans/decisiones/_decision_gestos_tres_iconos_2026-09-10.html` (opción A en los tres).`
     1. MESA DE CONTROL — mismo mecanismo ya aprobado (`[data-lupa] scale(1.12)`), geometría
        nueva. Se retiran los marcadores internos `lupa-aro`/`lupa-mango`: folder-search no
        tiene esas dos partes.
     2. MESA DE CRÉDITO — se SUMA a la receta de `[data-doc] rotate(-7deg)` (la de Finanzas/
        Auditoría). Se retira `[data-part="peso"] translateY(-2.9px) scale(1.15)`: era el ÚNICO
        usuario de ese marcador, sin sujeto que lo herede.
     3. FINANZAS — SALE de `data-doc` y nace el QUINTO envoltorio, `data-moneda`:
        `rotate(360deg)` en 340 ms, un giro plano completo. Se retira `data-fila` del todo (el
        ícono nuevo no tiene filas de texto).
   Amplitudes medidas: Mesa de control 8,3 % · Mesa de crédito 7,5 % (igual que Auditoría) ·
   Finanzas 28,3 % — por ENCIMA de la vara del 22 %, el mayor recorrido de los 20 gestos, y no
   necesita `MOTION-ALLOW` (el instrumento sólo exige un piso). Se documenta igual junto a su
   regla: un giro de 360° es mayor por naturaleza que uno parcial.
   v1.8 (2026-09-09) cierra los DOS montajes que quedaban en rojo al ampliarse
   `lint_amplitud_gesto.js` para ver también los cuatro anfitriones `<button>` de la barra
   superior (20 montajes, antes 16). Y se resuelven de forma DISTINTA a propósito:
     1. AJUSTES · el engrane baja de 400 ms (`--motion-slow`) a 340 ms. La VELOCIDAD es un
        valor, y la vara la fijó Ricardo: se homologa. El giro de 40° no se toca.
     2. AVISOS · la campana se DECLARA con `MOTION-ALLOW` por distancia (11,8 % medido, frente
        al 22 % de la vara). La DISTANCIA aquí es un imposible geométrico —un vaivén de ±11°
        sobre una pieza que llena el dibujo no alcanza esa cifra se mida como se mida—, y la
        amplitud ya la aprobó él a tamaño real.
   ⛔ La distinción no es de conveniencia: lo que tiene un valor correcto en el canon se
   HOMOLOGA; lo que el gesto no puede alcanzar por su forma se DECLARA, con su medida.
   v1.7 (2026-09-09) desbloquea la BARRA SUPERIOR con dos cambios pequeños:
     1. Nace el CUARTO envoltorio, `data-signo` (Ayuda): el círculo entero se acerca con
        `scale(1.12)`, la misma constante de la lupa y del escudo. RETIRA el gesto anterior de
        Ayuda —`[data-part="interrog"]`, el signo asomando dentro de su círculo—, que es el
        mecanismo que descentra lo contenido: el mismo que Ricardo rechazó esa mañana en el
        escudo de Cumplimiento. Se escribió antes de que existiera la REGLA DURA 7.
        `DECISION-FUENTE: Ricardo, 2026-09-09 — hoja
        `plans/decisiones/_decision_gestos_barra_superior_2026-09-09.html`: «sí a tus
        recomendaciones», y la recomendada para Ayuda era la B: «el círculo entero se acerca».`
     2. La CAMPANA de Avisos baja de 620 ms a 340 ms. No es diseño: es homologar a la vara de
        Dashboard (250 ms, banda 150–360 ms) que él aprobó el mismo día. La forma del vaivén
        —fotogramas y ángulos— no se toca.
   El marcador `interrog` se CONSERVA sin regla, como `lupa-aro`, `data-fila`, `data-texto` y
   `data-check-nav`: es con lo que se mide que el signo no se desplaza respecto de su círculo.
   ⚠ SUPERADO en v1.13 (2026-10-06): `interrog`, `data-texto` y `data-check-nav` VUELVEN a tener
   gesto propio por decisión de Ricardo (gramática «mueve la parte que significa»); ver § v1.13.
   v1.6 (2026-09-09) cierra la pieza con los CUATRO gestos que faltaban — Mesa de control,
   Finanzas y Auditoría (comparten causa), Admin y Cumplimiento.
   `DECISION-FUENTE: Ricardo, 2026-09-09 — sobre la hoja
   `plans/decisiones/_decision_gestos_cuatro_2026-09-09.html`, que le presentaba los cuatro
   casos con dos propuestas cada uno: «B,A,B,A».`
   Los cuatro SUSTITUYEN al gesto anterior, no se acumulan: se retiran el aro y el mango que
   se movían en direcciones opuestas (Mesa de control), el desplazamiento de `data-fila`
   (Finanzas), el trazado de `data-texto` (Auditoría), el re-trazado de la estrella y el de
   `data-check-nav` — con sus keyframes `exds-ic-escribir` y `exds-ic-retrazar-estrella`, que
   quedaban huérfanos. `exds-ic-retrazar-check` SE CONSERVA: lo sigue usando `data-check`, la
   insignia «Confirmado» (gesto C), que es otro marcador y no se toca.
   Marcadores nuevos, los tres ENVOLTORIOS del dibujo entero: `data-lupa`, `data-doc`,
   `data-escudo`. (v1.7 añade el cuarto, `data-signo`.)
   v1.5 (2026-09-09) sube NUEVE gestos a la vara de Dashboard y les cambia el mecanismo a
   los dos que rompían el dibujo — Operación, Ventas, Mesa de crédito, Contactos,
   Integraciones y las cuatro pestañas (Recibidas · Emitidas · Abonos · Cargos); Dashboard
   NO se toca porque ES la vara. Además arregla el anclaje del tallo de Cargos.
   Decisión: `plans/decisiones/_decision_gestos_barra_real_2026-09-09.html` (Ricardo,
   2026-09-09: «Todo lo demás se ve bien»). Diagnóstico: `plans/PLAN_GESTOS_PERCEPTIBLES.md`.
   ⛔ REGLA DURA que nace aquí: LA AMPLITUD SE MIDE EN PÍXELES REALES DE MONTAJE, NUNCA EN
   UNIDADES DEL LIENZO — el lienzo Lucide es 24 y la barra pinta a 19 (factor 0,79), las
   pestañas a 16 (0,67): «1,1 unidades» son 0,87 px de pantalla. Ver la ficha.
   ⚠ Aquí decía que esos cinco «siguen pendientes de decisión de Ricardo»: ya no lo están,
   los decidió el 2026-09-09 y v1.6 los aplica.
   v1.4 renombra en los comentarios de esta hoja los gestos que tienen un único destino en
   el menú del módulo real (Ricardo, 2026-09-08 — ver ficha § decisión de renombrado):
   Buscar→Mesa de control, Panel→Dashboard, Compartir/Operación→Operación,
   Etiquetas→Ventas, Solicitudes→Finanzas, Cobranza→Mesa de crédito,
   Verificación(navegación)→Cumplimiento, Clientes→Contactos, Favoritos→Admin,
   Documentos→Auditoría, Actividad→Integraciones. Los marcadores `data-part`/`data-morph`/
   etc. NO cambian — sólo el nombre en prosa y la clave de `RECETAS` en el kit.
   v1.2 corrige Favoritos (contorno trazado, dasharray 68.342 medido — antes 64 estimado,
   quedaba un hueco), Filtrar (scaleX escalonado — antes translateX), Compartir/Operación
   (traza los caminos, no mueve los nodos; direcciones de dashoffset corregidas y subido a
   --motion-slow con opacidad desde 0). Etiquetas queda IGUAL — Ricardo, 2026-09-08.

   El gesto de un ícono: no un ícono nuevo, una CONDUCTA que se le añade a la
   geometría Lucide-verbatim que `COMPONENTE_ICONO.md` ya gobierna. Gesto B
   (micro-gesto) para navegación · gesto C (morfo/estado) para cambios de
   estado reales. Las dos reglas viven en la misma hoja porque comparten el
   mismo mecanismo: transformar UNA parte marcada con `data-*`, nunca el
   `<svg>` entero.

   REQUISITOS DEL ANFITRIÓN:
     1. Los tokens de movimiento del canon (`colors_and_type.css`):
        --motion-fast/base/slow, --ease-default/emphasis/settle/shake.
     2. El `<svg>` va INLINE, con sus partes marcadas por atributo
        (`data-part`, `data-self`, `data-morph`, `data-check`, `data-check-nav`,
        `data-texto`, `data-punto`, `data-onda`, `data-nodo`, y los cinco
        ENVOLTORIOS `data-lupa`, `data-doc`, `data-escudo`, `data-signo`, `data-moneda`)
        — NUNCA por `<use href="#pl-…">`.
        Ver la ficha § Composición: el `<use>` clona su símbolo a un shadow
        tree que esta hoja no puede alcanzar. La geometría de cada
        `<path>`/`<g>` es, aun así, BYTE A BYTE la del `<symbol>` correspondiente
        del sprite.
   ═══════════════════════════════════════ */

/* ── el anfitrión: el elemento que hospeda el ícono (botón, tab, ítem de menú) ── */
.exds-ic-g { display: inline-flex; }

/* ── REGLA DURA 1 · el eje de TODO giro/desplazamiento es el centro del ÍCONO ──
   `transform-box: view-box` ancla el sistema de coordenadas al viewBox del
   <svg> (0 0 24 24), no a la caja de cada trozo — así que `transform-origin:
   12px 12px` es siempre el centro del DIBUJO, sin importar qué tan chico sea
   el trozo que se mueve. Con `fill-box`+`center` (el error que se cazó:
   `plans/decisiones/_decision_iconos_animados_2026-09-08.html` §1) cada trozo
   gira sobre SU PROPIA caja: la flecha de «Actualizar» se despegaba y la
   «Bandeja» se abría en dos. */
.exds-ic-g svg [data-part] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}

/* La ÚNICA excepción genérica: una parte que legítimamente gira sobre SÍ MISMA
   (ninguno de los 24 la usa hoy; queda declarada para el día que haga falta,
   con su razón exigida en el propio marcado — ver README «Cuándo usar
   data-self»). La excepción DECLARADA de las parejas espejo (pestañas) vive
   más abajo, junto a su regla. */
.exds-ic-g svg [data-self] {
  transform-box: fill-box;
  transform-origin: center;
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}

/* ── LOS MARCADORES CONSERVADOS SIN GESTO PROPIO (v1.6) ──
   `data-texto` (Auditoría) y `data-check-nav` (el escudo de Cumplimiento) dejaron de tener
   gesto el 2026-09-09: ahora se mueve el objeto entero que los contiene (`data-doc` /
   `data-escudo`). Se conservan en el marcado, y esta regla les deja FIJADO su sistema de
   coordenadas —el mismo de todas las partes— por dos razones concretas:
     1. quien vuelva a darles un transform no tiene que redescubrir el eje (regla dura 1);
     2. los medidores DERIVAN sus marcadores de esta hoja: sin esta declaración, Auditoría y
        Cumplimiento desaparecen del denominador en vez de salir como «sin el marcador de su
        receta», y un montaje que se esfuma se lee igual que uno que aprueba.
   ⚠ SUPERADO en v1.13 (2026-10-06): `data-texto` y `data-check-nav` vuelven a moverse por
   decisión de Ricardo (opción B de Lucide Animated); `data-escudo` se retiró. Lo de abajo es historia.
   ⚠ NO llevan `transition`: no se mueven. Si alguna vez vuelve a moverse una de estas partes
   por su cuenta, es el defecto que Ricardo rechazó el 2026-09-09.
   ⛔ RETIRADO 2026-09-10: `data-fila` (Finanzas). El ícono nuevo de Finanzas
   (`circle-dollar-sign`) no tiene filas de texto — no hay nada que conservar. */
.exds-ic-g svg [data-texto] {
  transform-box: view-box;
  transform-origin: 12px 12px;
}
/* v1.13: data-check-nav ya NO es un marcador sin gesto: Cumplimiento marca su palomita (receta más abajo). */

/* ═══ GESTO B · micro-gesto (navegación) ═══════════════════════════════════
   Dispara en HOVER, o cuando quien monta la pieza pide un disparo puntual de
   JavaScript (`.play` — «una vez al cambiar»: una pestaña, un módulo de la
   barra lateral que se acaba de seleccionar, el engrane de Ajustes). Los dos
   disparadores usan la MISMA transición: es un solo gesto con dos maneras de
   encenderlo, nunca dos gestos distintos.
   ⛔ `.is-active` YA NO dispara este gesto (v1.10, 2026-09-10 — Ricardo: «el
   estado activo debe de ser el ícono en su forma original»). Antes compartía
   selector con `:hover`/`.play` y, como `.is-active` se queda puesto mientras
   el módulo sigue siendo el activo, el ícono quedaba transformado SIN FIN —
   la lupa de Mesa de control «en zoom», el documento de Auditoría/Mesa de
   crédito inclinado — el contrario exacto de la Regla dura 2 (el gesto es
   reversible). «Quedar activo» ahora es un `.play` de una sola vez, disparado
   por `_dispararGestoActivo()` en `admin/js/backoffice/backoffice-2.js` sólo
   cuando el ícono activo CAMBIA (no en cada re-sync del mismo módulo), y el
   ícono vuelve SOLO a su forma de reposo al terminar. */

/* ── REGLA DURA 1-bis · LOS CINCO ENVOLTORIOS: cuando el gesto manipula el OBJETO ENTERO ──
   `data-lupa`, `data-doc`, `data-escudo`, `data-signo` y `data-moneda` NO marcan una parte:
   marcan un `<g>` que envuelve TODO el dibujo del ícono. Los tres primeros nacen el 2026-09-09
   de los cuatro rechazos de Ricardo; el cuarto, `data-signo` (Ayuda), nace el mismo día de la
   barra superior; el quinto, `data-moneda` (Finanzas), nace el 2026-09-10 de los tres íconos
   nuevos. Los cinco comparten el mismo eje que cualquier otra parte (centro del viewBox, 12,12)
   porque lo que giran o escalan es el dibujo completo.
   `DECISION-FUENTE: Ricardo, 2026-09-09 — hoja `plans/decisiones/_decision_gestos_cuatro_2026-09-09.html`: «B,A,B,A».`
   `DECISION-FUENTE: Ricardo, 2026-09-09 — hoja `plans/decisiones/_decision_gestos_barra_superior_2026-09-09.html`: «sí a tus recomendaciones», y la recomendada para Ayuda era la B: «el círculo entero se acerca».`
   `DECISION-FUENTE: Ricardo, 2026-09-10 — hoja `plans/decisiones/_decision_gestos_tres_iconos_2026-09-10.html`: «iconos aprobada tu recomendacion de los 3» (opción A en los tres).`
   ⚠ MONTAJE: el envoltorio se añade SIN tocar la geometría — mismo orden, mismos trazos, mismos
   marcadores internos. Los internos se conservan a propósito aunque ya no lleven regla: sirven
   para MEDIR que ninguna parte se mueve por su cuenta (que era justo el defecto rechazado). */
.exds-ic-g svg [data-doc] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}

/* ⛔ RETIRADO 2026-10-06 (v1.13) — los gestos sustituidos por la decisión de los gestos del shell.
   Se retiran las reglas de `data-lupa` (Mesa de control), `data-escudo` (Cumplimiento), `data-signo` (Ayuda),
   `data-tarjeta` (Contactos y Flota), `data-onda` (Integraciones), `data-part="estrella"` (Admin),
   `data-part="etiqueta"` con translateY+rotate (Ventas) y `data-part="persona-2a/2b"` (Contactos), con sus
   MOTION-ALLOW. Sus usuarios eran exactamente los íconos del shell que esta versión sustituye; se buscó
   antes en todo design-system/ y exante-git/ y ningún otro montaje (portal, pestañas, insignias) los usa.
   `data-doc` SE CONSERVA: lo usa la pestaña Cuadre (calendario, Conciliación) y Auditoría lo sobrescribe
   sólo dentro de `.exds-sb` (abajo). Detalle y citas: COMPONENTE_ICONO_ANIMADO.md v1.13. */

/* GATE-ALLOW: parejas espejo (pestañas) ancladas en el extremo que NO se mueve, no en el
   centro del ícono · el dibujo ya era espejo sobre y=10; con un origen común (12,12) el
   gesto se encogía hacia el mismo lado en las dos — Ricardo, 2026-09-08, corrección #6.
   `baja-*` = Recibidas / Abonos (arrow-down-to-line) · `sube-*` = Emitidas / Cargos
   (arrow-up-from-line).

   ⛔ EL ANCLAJE DEL TALLO VA A SU PROPIA CAJA (`fill-box`), NUNCA A COORDENADAS DEL LIENZO
   — defecto MEDIDO el 2026-09-09, y es la segunda vez que esta pareja se despega.
   QUÉ SE ROMPÍA: `sube-tallo` llevaba `transform-origin: 12px 3px`, que es el extremo del
   tallo de EMITIDAS (`M12 3v14`, de y=3 a y=17). La pestaña CARGOS de Finanzas › STP, montada
   el 2026-09-09, reutiliza la receta con OTRO dibujo —su línea va arriba (`M5 3h14`) y su
   tallo va de y=7 a y=21— así que ese origen le caía CUATRO unidades FUERA del tallo.
   QUÉ SE MIDIÓ (`node design-system/lint_amplitud_gesto.js`): el tallo de Cargos recorría
   2,16 px (23,7 %) contra los 1,68 px (18,4 %) de Abonos y Emitidas, y el punto que debía
   quedarse QUIETO se movía — la flecha se despegaba. Es el mismo modo de fallo que esta
   misma declaración dice haber resuelto en agosto, reintroducido al montar otra geometría.
   POR QUÉ ESTA FORMA NO VUELVE A ENVEJECER: `fill-box` + `center top` / `center bottom`
   ancla el tallo al extremo de SU PROPIO trazo, sea cual sea su geometría. Un número
   absoluto del lienzo sólo vale para UN dibujo; el siguiente que se monte lo rompe otra vez.
   ⚠ Los dos dibujos son distintos A PROPÓSITO (decisión de Ricardo: la línea va del lado por
   donde el dinero cruza). Lo que se homologa es el ANCLAJE, nunca el dibujo.
   ⚠ El origen de las FLECHAS es inerte —su gesto es un `translateY` puro, y una traslación no
   depende del origen— y se conserva para que la pareja se lea junta. */
.exds-ic-g svg [data-part="baja-flecha"], .exds-ic-g svg [data-part="sube-flecha"] { transform-origin: 12px 10px; }
.exds-ic-g svg [data-part="baja-tallo"] { transform-box: fill-box; transform-origin: center bottom; }
.exds-ic-g svg [data-part="sube-tallo"] { transform-box: fill-box; transform-origin: center top; }
.exds-ic-g:hover [data-part="baja-flecha"], .exds-ic-g.play [data-part="baja-flecha"] { transform: translateY(2.8px); }
.exds-ic-g:hover [data-part="baja-tallo"], .exds-ic-g.play [data-part="baja-tallo"] { transform: scaleY(.76); }
.exds-ic-g:hover [data-part="sube-flecha"], .exds-ic-g.play [data-part="sube-flecha"] { transform: translateY(-2.8px); }
.exds-ic-g:hover [data-part="sube-tallo"], .exds-ic-g.play [data-part="sube-tallo"] { transform: scaleY(.76); }

/* Descargas (barra lateral) — mismo gesto que Recibidas: la flecha baja Y el tallo se acorta
   anclado en el extremo cercano a la flecha (mismo defecto medido y mismo remedio que la
   pareja espejo Recibidas/Emitidas — corrección 2026-09-08 «la flecha se despega ~2.2px»,
   porque antes el tallo quedaba quieto mientras la flecha se movía). */
/* El anclaje pasa a `fill-box` por la misma razón que la pareja de arriba. Es un
   EQUIVALENTE EXACTO, no un cambio de gesto: el tallo es `M12 15V3` (de y=3 a y=15),
   así que su borde inferior ES y=15 — el número que estaba escrito a mano. */
.exds-ic-g svg [data-part="dl-tallo"] { transform-box: fill-box; transform-origin: center bottom; }
.exds-ic-g:hover [data-part="dl-flecha"], .exds-ic-g.play [data-part="dl-flecha"] { transform: translateY(2.2px); }
.exds-ic-g:hover [data-part="dl-tallo"], .exds-ic-g.play [data-part="dl-tallo"] { transform: scaleY(.82); }


/* Ajustes — el engrane gira 40°.
   ⛔ 400 ms (`--motion-slow`) → 340 ms (v1.8, 2026-09-09). NO es una decisión de diseño: es
   HOMOLOGAR a la vara que Ricardo aprobó el 2026-09-09 —Dashboard, 250 ms; la banda que el
   medidor deriva de ella es 150–360 ms— y `--motion-slow` vale 400, que se sale del techo. Es
   el MISMO criterio y el MISMO valor con el que ese día bajó la campana de Avisos de 620 a
   340 ms. El GIRO no se toca: siguen siendo 40°, que recorren el 29 % de la pieza, de sobra
   por encima del 22 % de la vara. Se comprobó en navegador que a 340 ms sigue leyéndose como
   un giro y no como un tirón.
   `DECISION-FUENTE: Ricardo, 2026-09-09 — «si puedes utilizar ese módulo como barra a medir
   tanto en velocidad del movimiento como en distancia recorrida» (sobre Dashboard).` */
.exds-ic-g:hover [data-part="engrane"], .exds-ic-g.play [data-part="engrane"] { transform: rotate(40deg); transition-duration: 340ms; }


/* ⛔ ASISTENTE · LA ESTRELLA SOLA EN REPOSO, LAS CHISPAS APARECEN AL HOVER.
   `DECISION-FUENTE: Ricardo, 2026-09-08 — «sobre asistente te propongo que el estado en
   reposo del ícono sea solamente la estrella principal y el estado hover sea con los dos
   destellos apareciendo».`
   ⛔ EXCEPCIÓN DECLARADA a la regla dura «el reposo siempre está dibujado» (misma fecha):
   las chispitas NO son el ícono — son accesorios decorativos que Ricardo quiere ver NACER,
   nunca la geometría base del símbolo (que es sólo la estrella, siempre visible sin marca).
   Antes las chispas estaban a opacity:.45 en reposo y centelleaban; ahora parten invisibles
   y aparecen — es la única de los 25 gestos con este comportamiento, y es a propósito.
   La estrella grande sigue sin marcador y sin moverse (principio ya fijado el mismo día:
   se mueve lo que SIGNIFICA, no la masa principal — mismo criterio que Solicitudes). */
.exds-ic-g svg [data-part="chispita"] { opacity: 0; transform-box: view-box; transform-origin: center; transform: scale(.4);
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1)),
              opacity var(--motion-base, 250ms) linear; }
.exds-ic-g:hover [data-part="chispita"], .exds-ic-g.play [data-part="chispita"] { opacity: 1; transform: scale(1); }
/* la segunda entra tarde: dos chispas a la vez leen como un parpadeo, escalonadas leen como magia */
.exds-ic-g:hover [data-part="chispita"] + [data-part="chispita"], .exds-ic-g.play [data-part="chispita"] + [data-part="chispita"] { transition-delay: 110ms; }

/* Avisos — la campana se mece (animación con vaivén: campanear).
   ⛔ 620 ms → 340 ms (v1.7, 2026-09-09). NO es una decisión de diseño: es HOMOLOGAR a la vara que
   Ricardo aprobó ese día —Dashboard, 250 ms; la banda que el medidor deriva de ella es 150–360 ms—
   y 620 ms era casi el doble de su techo, el gesto más lento que quedaba en la hoja. La FORMA del
   vaivén no se toca: mismos fotogramas (22 / 52 / 78 %) y mismos ángulos (−11° / 8° / −4°), sólo
   se acorta el tiempo. Se comprobó en navegador que sigue leyéndose como un meneo —tres vaivenes
   completos, el mismo perfil de ángulos— y no como un tic.
   `DECISION-FUENTE: Ricardo, 2026-09-09 — «si puedes utilizar ese módulo como barra a medir tanto
   en velocidad del movimiento como en distancia recorrida», y sobre la hoja
   `plans/decisiones/_decision_gestos_barra_superior_2026-09-09.html`: «sí a tus recomendaciones»,
   donde la recomendación decía «lo único que cambio es que la campana pase de 620 a 340
   milésimas, para que vaya al ritmo» del resto.` */
/* MOTION-ALLOW: Avisos mece la CAMPANA ENTERA en un vaivén de ±11° y recorre el 11,8 % de su
   tamaño, por debajo del 22 % de la vara de Dashboard · lo que se mueve es el OBJETO COMPLETO
   —la campana, que ocupa 15,8 px de los 19 del dibujo—, no una parte pequeña dentro de él: la
   vara mide recorrido RELATIVO al tamaño de la parte y está calibrada con gestos que mueven
   una pieza chica dentro del icono, así que exigirle el 22 % de sus 15,8 px serían más de
   3 px de balanceo y no caben en la caja. Es un imposible geométrico del gesto, no un gesto
   flojo: un vaivén de rotación sobre una pieza que llena el dibujo no alcanza esa cifra se
   mida como se mida. Ricardo lo aprobó viéndolo a tamaño real el 2026-09-09 —«sí a tus
   recomendaciones» sobre la hoja `_decision_gestos_barra_superior_2026-09-09.html`, donde a la
   campana se le presentaba «se mece, bajada de 620 a 340 ms» con la pieza viva a 19 px—, así
   que subir la amplitud reabriría una decisión de diseño ya tomada. Ampara DISTANCIA, no
   velocidad: la velocidad sí se homologó, de 620 a 340 ms. */
.exds-ic-g:hover [data-part="campana"], .exds-ic-g.play [data-part="campana"] { animation: exds-ic-campanear 340ms var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1)); }
@keyframes exds-ic-campanear { 0%, 100% { transform: rotate(0); } 22% { transform: rotate(-11deg); } 52% { transform: rotate(8deg); } 78% { transform: rotate(-4deg); } }

/* Dashboard — los módulos se abren */
.exds-ic-g:hover [data-part="q1"], .exds-ic-g.play [data-part="q1"] { transform: translate(-1.1px, -1.1px); }
.exds-ic-g:hover [data-part="q2"], .exds-ic-g.play [data-part="q2"] { transform: translate(1.1px, -1.1px); }
.exds-ic-g:hover [data-part="q3"], .exds-ic-g.play [data-part="q3"] { transform: translate(1.1px, 1.1px); }
.exds-ic-g:hover [data-part="q4"], .exds-ic-g.play [data-part="q4"] { transform: translate(-1.1px, 1.1px); }

/* Operación — los TRES NODOS se abren desde el centro, coordinados: el mecanismo de
   Dashboard, que es la vara que Ricardo aprobó. Los CAMINOS quedan quietos y SIEMPRE
   DIBUJADOS.
   DECISION-FUENTE: Ricardo, 2026-09-09 — «Todo lo demás se ve bien» (hoja
   `plans/decisiones/_decision_gestos_barra_real_2026-09-09.html`, columna PROPUESTA).
   ⛔ RETIRA el re-trazado de los caminos (v1.4, Ricardo 2026-09-08). No se corrige porque
   estuviera mal escrito: se corrige porque el mecanismo BORRABA el dibujo. Medido con
   `node design-system/lint_gesto_no_rompe.js`: a los 0 ms los dos caminos estaban a
   opacidad 0,00 (reposo 1,00) y con el 100 % del trazo sin pintar — durante 400 ms el ícono
   se veía como tres círculos sueltos. Y `lint_amplitud_gesto` lo daba por INMEDIBLE: un
   re-trazado no desplaza nada, así que ninguna vara podía afirmar que se viera.
   Los caminos pierden su `stroke-dasharray`, su opacidad y su animación: se quedan como los
   dibujó Lucide. Con eso desaparecen también los keyframes `exds-ic-retrazar-camino-a/b`.
   ⚠ MONTAJE: los tres círculos tienen que llevar `data-nodo="a|b|c"` — a = arriba-derecha
   (cx 18, cy 5) · b = izquierda (cx 6, cy 12) · c = abajo-derecha (cx 18, cy 19). Sin esos
   marcadores el ícono queda QUIETO: el gesto ya no vive en los caminos. */
.exds-ic-g svg [data-nodo] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}
.exds-ic-g:hover [data-nodo="a"], .exds-ic-g.play [data-nodo="a"] { transform: translate(1.17px, -1.37px); }
.exds-ic-g:hover [data-nodo="b"], .exds-ic-g.play [data-nodo="b"] { transform: translate(-1.8px, 0); }
.exds-ic-g:hover [data-nodo="c"], .exds-ic-g.play [data-nodo="c"] { transform: translate(1.17px, 1.37px); }


/* Mesa de crédito y Auditoría — el DOCUMENTO ENTERO se inclina, con su texto dentro (`data-doc`).
   Los dos comparten receta porque el gesto es exactamente el mismo verbo: levantar un papel
   para leerlo mejor.
   `DECISION-FUENTE: Ricardo, 2026-09-09 — hoja de los cuatro gestos, caso 2: «A» (con Finanzas,
   que hoy ya no usa esta receta — ver abajo).`
   `DECISION-FUENTE: Ricardo, 2026-09-10 — hoja de los tres íconos: opción A. Mesa de crédito
   SUSTITUYE a `dollar-sign` por `file-search-corner` y se SUMA a esta receta, reusando el
   mecanismo tal cual, sin geometría reinterpretada.`
   ⛔ RETIRADO 2026-09-10: FINANZAS SALE de esta receta — su ícono nuevo (`circle-dollar-sign`)
   ya no es un documento, gira como una moneda (ver `data-moneda`, abajo). Con eso se retira
   también el marcador `data-fila="1|2"` del todo: el ícono nuevo no tiene filas de texto que
   conservar. `data-texto="1|2|3"` (Auditoría) SÍ se conserva: Auditoría no cambió de ícono. */
/* MOTION-ALLOW: Mesa de crédito y Auditoría inclinan el DOCUMENTO ENTERO 7° y recorren el
   7,5 % de su tamaño, por debajo del 22 % de la vara de Dashboard · lo que se mueve es el
   OBJETO COMPLETO —la hoja con su texto dentro—, no una línea suelta: exigirle el 22 % de sus
   15,8 px serían más de 3 px de recorrido, y no caben en una caja de 19 px. Es el mismo
   imposible geométrico ya declarado para este mecanismo desde el 2026-09-09; subirlo reabriría
   una decisión de diseño ya tomada. */
.exds-ic-g:hover [data-doc], .exds-ic-g.play [data-doc] { transform: rotate(-7deg); }

/* Finanzas — la MONEDA gira un giro plano completo, como sobre una mesa vista desde arriba.
   `DECISION-FUENTE: Ricardo, 2026-09-10 — hoja de los tres íconos, opción A: sustituye a
   `clipboard-list` por `circle-dollar-sign`.`
   Rotación pura sobre el centro del ícono (12,12, la misma regla dura 1 de todos los demás
   gestos), cero deformación: físicamente posible porque una moneda plana SÍ gira así — es la
   regla dura 7 aplicada al pie de la letra (manipulación, no deformación). Nace el marcador
   `data-moneda`, quinto envoltorio. 340 ms, no 250: mismo ritmo que Ajustes y Avisos
   (homologados a la banda 150–360 ms de la vara el 2026-09-09).
   ⛔ RETIRADO 2026-09-10: el gesto viejo de Finanzas era `[data-doc] rotate(-7deg)`, compartido
   con Auditoría (ver arriba). Se retira sin geometría que heredar: el nuevo `circle-dollar-sign`
   no es un documento. */
/* MOTION-ALLOW: 340ms · la escala de duraciones (120/250/400) NO tiene nombre para esta velocidad,
   y 340 no se eligió aquí: es la VARA a la que el 2026-09-09 se homologaron el engrane de Ajustes
   (bajó de 400) y la campana de Avisos (bajó de 620), aprobada por Ricardo viendo las piezas a
   tamaño real. Teclearla es la consecuencia de que el catálogo tenga una velocidad de gesto que
   todavía no es token — se retira el día que la escala la declare. ⚠ Y esta regla usa `transition`,
   no `animation`, que es la única razón por la que el medidor la ve a ella y no a la campana, que
   lleva el MISMO número: el hueco es del instrumento, no del canon.
   Finanzas gira 360° y recorre el 28,3 % del tamaño del dibujo (esquina de la caja, medido
   2026-09-10) — POR ENCIMA del 22 % de la vara de Dashboard, así que no necesita `MOTION-ALLOW`
   (el instrumento sólo exige un piso, `lint_amplitud_gesto.js` no reprueba por exceso). Se
   documenta igual, porque es con mucho el mayor recorrido de los 20 gestos: no es un exceso a
   corregir, es la naturaleza del gesto — un giro completo de una moneda es mayor por definición
   que un giro parcial de 6° o 40°; «medio giro» ya no se leería como un giro. Ricardo lo aprobó
   viendo la pieza a tamaño real y sabiendo que era el mayor recorrido del catálogo (hoja del
   2026-09-10, opción recomendada, con el riesgo declarado en la propia hoja: «se midió si sigue
   leyéndose elegante y no como un efecto de carga»). */
.exds-ic-g svg [data-moneda] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform 340ms var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}
.exds-ic-g:hover [data-moneda], .exds-ic-g.play [data-moneda] { transform: rotate(360deg); }

/* ⛔ CARTERA · `data-part="capa-1|2|3"` — LA PILA SE ABRE: la capa de arriba sube, la de
   abajo baja, la del medio queda quieta (2026-09-10).
   `DECISION-FUENTE: Ricardo, 2026-09-10 — «layes» sobre
   `plans/decisiones/_decision_gesto_cartera_2026-09-10.html`, eligiendo la geometria `layers`
   entre las tres que se le midieron (file-stack · gallery-vertical-end · layers) y la variante
   recomendada de las dos de `layers` (las capas se separan, no solo la tapa).`
   SUSTITUYE el icono: `briefcase` (maletin) → `layers`. Cartera era el UNICO de los 12 modulos
   del riel sin gesto — medido, no supuesto — y su `.exds-sb-ico` ni siquiera llevaba
   `.exds-ic-g`, retirada a proposito el 2026-09-10 por no tener movimiento que hospedar.
   POR QUE CAMBIA EL DIBUJO Y NO SOLO SE LE AÑADE UN GESTO: el maletin es una pieza RIGIDA.
   Se probo alzar su asa —23 % de recorrido, dentro de la vara— y se DESCARTO porque el asa se
   despega del cuerpo: es el mismo rechazo que la lupa de Mesa de control («se rompe el dibujo»,
   Regla dura 7). Sin partes que se puedan mover, al maletin solo le quedaban gestos del objeto
   entero, y sus dos verbos (acercarse, inclinarse) ya los usan seis modulos del riel.
   FISICAMENTE POSIBLE (regla dura 7): una pila de capas se abre. Mecanismo ya aprobado dos
   veces —Dashboard (`q1..q4`) y Operacion (`data-nodo`)—: partes que se separan desde el centro,
   coordinadas, mismo eje (12,12) y misma duracion de la vara (250 ms).
   SIN MARCADOR NUEVO, a proposito: son PARTES del dibujo, no un envoltorio del objeto entero,
   asi que heredan el sistema de coordenadas de la regla generica `[data-part]` y no necesitan
   los cinco envoltorios ni uno sexto.
   `capa-2` se marca y NO se mueve: sirve para MEDIR que la del medio queda quieta, igual que
   `lupa-aro`, `data-texto` y `data-check-nav`.
   ⛔ MOTION-ALLOW: Cartera abre la pila 1,9 unidades y recorre el 9,7 % de su tamaño, por DEBAJO
   de la vara del 22 % · es un IMPOSIBLE GEOMETRICO, no una eleccion: la capa de arriba nace en
   y=2 y la de abajo termina en y=22, asi que el dibujo solo tiene ~1,9 unidades de aire por lado.
   MEDIDO: con 3,6 unidades el gesto se sale del lienzo 1,68 unidades y el navegador lo recorta.
   Entra amparado por la misma declaracion que los otros siete gestos sutiles del riel; la vara
   NO se toca. Masa 21,5 px², muy por encima del minimo de 5,1 — lo que le falta de recorrido lo
   tiene de tinta. */
.exds-ic-g:hover [data-part="capa-1"], .exds-ic-g.play [data-part="capa-1"] { transform: translateY(-1.9px); }
/* ⛔ MOTION-ALLOW: la capa de abajo baja las mismas 1,9 unidades y recorre el mismo 9,7 %, por
   DEBAJO de la vara del 22 % · mismo imposible geometrico que su gemela de arriba, declarado
   aqui tambien porque el amparo se lee REGLA POR REGLA: una declaracion encima de la primera no
   cubre a la segunda, y el montaje entero salia «NO LLEGA» por la mitad no declarada. */
.exds-ic-g:hover [data-part="capa-3"], .exds-ic-g.play [data-part="capa-3"] { transform: translateY(1.9px); }



/* Auditoría — comparte receta con Finanzas: el documento entero se inclina (`data-doc`, arriba).
   ⚠ SUPERADO en v1.13 (2026-10-06): en el menú del backoffice la hoja se acerca y sus renglones
   2 y 3 se reescriben (receta v1.13, abajo); la inclinación −7° queda sólo en la pestaña Cuadre.
   ⛔ RETIRADO el trazado de `data-texto="1|2|3"` (`stroke-dasharray` propio por línea,
   `@keyframes exds-ic-escribir`, escalonado 80 ms) — y con él, su keyframe, que quedaba
   huérfano. Medido con `lint_gesto_no_rompe`: la línea 1 estaba a los 0 ms con el 100 % del
   trazo sin pintar, y las otras dos por encima del 78 % a media animación.
   `DECISION-FUENTE: Ricardo, 2026-09-09 — hoja de los cuatro gestos, caso 2: «A».` */


/* Actualizar — ARREGLADO: el grupo entero gira sobre 12,12 (era el defecto medido).
   ⛔ SOLO AL CLIC (y teclado): SIN :hover. DECISION-FUENTE: Ricardo, 2026-09-28 — «El giro del
   icono del boton actualizar solamente debe aparecer cuando el usuario da clic. No, hover.»
   Retira "hover / activo" de la fila 1 de COMPONENTE_ICONO_ANIMADO. El disparo es .play, que
   pone boton-actualizar.js al hacer clic; mientras la recarga trabaja lo sustituye el bucle
   (COMPONENTE_BOTON, Variante Actualizar). */
.exds-ic-g.play [data-part="refrescar"] { transform: rotate(-150deg); }

/* Bandeja — ARREGLADO: sólo la boca se hunde, el contorno no se mueve. La masa principal
   (el cuerpo entero) NO crece: es el mismo principio que ya retiró el crecimiento de la
   estrella del Asistente y el tablero de Finanzas — se mueve lo que ES el suceso (algo
   cae dentro), nunca el contenedor completo (defecto medido 2026-09-08). */
/* MOTION-ALLOW: [data-part="boca"] no llega al 22 % de la vara de Dashboard · receta
   aprobada por Ricardo, 2026-09-08, para pestañas con contador («dejarlo así», ver
   COMPONENTE_ICONO_ANIMADO.md § «Bandeja — revisado y CONSERVADO»), y vuelta a ver y
   confirmar el 2026-09-27 en la vista ampliada en bucle de la opción A de íconos de
   Conciliación (`_decision_conciliacion_f3_2026-09-27.html`, D-F3-1: «bandeja con gesto
   "Bandeja" en Acciones requeridas»); subir la amplitud reabriría una decisión ya tomada. */
.exds-ic-g:hover [data-part="boca"], .exds-ic-g.play [data-part="boca"] { transform: translateY(1.6px); }

/* Filtrar — de muchos quedan pocos: las tres líneas se ACORTAN (scaleX), no se
   desplazan de lado (Ricardo, 2026-09-08, aprobado tal cual). El translateX leía
   «ordenar»; el acortamiento escalonado 60ms de arriba abajo lee «de muchos quedan
   pocos». Las tres líneas ya están centradas en x=12 (2–22, 6–18, 9–15), así que con
   el transform-origin: 12px 12px que ya traen (regla dura 1) se encogen simétricas. */
.exds-ic-g:hover [data-part="f1"], .exds-ic-g.play [data-part="f1"] { transform: scaleX(.55); }
.exds-ic-g:hover [data-part="f2"], .exds-ic-g.play [data-part="f2"] { transform: scaleX(.62); transition-delay: 60ms; }
.exds-ic-g:hover [data-part="f3"], .exds-ic-g.play [data-part="f3"] { transform: scaleX(.70); transition-delay: 120ms; }

/* ═══ GESTO C · morfo / estado — ⛔ NUNCA `:hover` en estos selectores ═══════
   Dispara cuando el ESTADO cambia de verdad — quien monta la pieza añade/
   quita `.is-active` (o `.play` para un disparo puntual) al mismo tiempo que
   cambia el estado real (aria-expanded, la respuesta del servidor, la
   confirmación). Nunca al simple paso del ratón: aquí el ratón no es el
   evento, el estado sí.

   ⛔ DEFECTO MEDIDO 2026-09-08: los cinco gestos de este bloque incluían
   `:hover` en su selector — la regla vivía en ESTE comentario, no en el
   selector, y un comentario no obliga a nadie. Con eso, pasar el ratón hacía
   NACER el punto de aviso, TRAZAR la palomita, GIRAR el chevron/«+» y
   SACUDIR la alerta sin que ningún estado real hubiera cambiado — cinco
   afirmaciones falsas por simple paso del cursor. Se retira `:hover` de los
   cinco; sólo `.is-active`/`.play` disparan gesto C. (Los gestos de
   NAVEGACIÓN, arriba, sí admiten `:hover` — ahí el ratón SÍ es el evento.) */
.exds-ic-g svg [data-morph] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform var(--motion-base, 250ms) var(--ease-default, cubic-bezier(0.32, 0.72, 0, 1));
}

/* Agregar → cerrar: el «+» gira 45° y se lee como «×» */
.exds-ic-g.is-active [data-morph="mas"], .exds-ic-g.play [data-morph="mas"] { transform: rotate(45deg); }

/* Abrir / cerrar: el chevron gira 180° */
.exds-ic-g.is-active [data-morph="chevron"], .exds-ic-g.play [data-morph="chevron"] { transform: rotate(180deg); }

/* GATE-ALLOW: LA PALOMITA NO RECOLOREA (Ricardo, 2026-09-08, correcciones #3 y #4: «no te
   salgas del color base, no recolorees verde»). El gesto es únicamente el TRAZO en
   `currentColor`; retirado `data-ring` y todo `--color-accent-green` de esta pieza. El color
   de éxito, si lo hay, lo decide el ESTADO de la pantalla (p. ej. una pastilla), nunca la
   animación del ícono.
   ⛔ REPOSO SIEMPRE DIBUJADO — RETIRA una decisión del mismo día (Ricardo, 2026-09-08):
   este marcador («insignia Confirmado») se había dejado invisible en reposo A PROPÓSITO
   para que la palomita «naciera» al confirmarse. Instrucción posterior, el mismo día:
   «para este ícono y para todos los demás, el estado en reposo siempre es dibujado.
   Ningún icono puede estar desaparecido y que el hover lo dibuje.» La instrucción nueva
   manda: la palomita reposa YA TRAZADA (dashoffset:0) y `.is-active`/`.play` la RE-TRAZA
   como floreo — nunca la hace nacer de la nada.
   ⚠ Desde v1.6 éste es el ÚNICO marcador de la pieza que se re-traza. El escudo de NAVEGACIÓN
   (`data-check-nav`) dejó de tener gesto propio: su módulo, Cumplimiento, ahora pulsa entero
   con `data-escudo` (Ricardo, 2026-09-09). Los dos marcadores siguen siendo distintos —
   NAVEGACIÓN admite `:hover` y ESTADO no (defecto medido 2026-09-08)— y por eso no se funden. */
.exds-ic-g svg [data-check] { stroke-dasharray: 20; stroke-dashoffset: 0; }
.exds-ic-g.is-active [data-check], .exds-ic-g.play [data-check] {
  animation: exds-ic-retrazar-check 460ms var(--ease-settle, cubic-bezier(0.22, 1, 0.36, 1)) 80ms;
}
/* El keyframe vive AQUÍ desde v1.6: `data-check` es su único usuario. Antes se declaraba junto
   a `data-check-nav`, que lo compartía; al retirarse aquel gesto habría quedado declarado
   lejos de quien lo usa. */
@keyframes exds-ic-retrazar-check { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }

/* Atención: se sacude (una sola vez, no persiste como .is-active — se dispara con .play) */
.exds-ic-g.is-active [data-morph="alerta"], .exds-ic-g.play [data-morph="alerta"] { animation: exds-ic-nudge 420ms var(--ease-shake, cubic-bezier(0.36, 0.07, 0.19, 0.97)); }
@keyframes exds-ic-nudge { 0%, 100% { transform: translateX(0); } 20% { transform: translateX(-1.6px); } 45% { transform: translateX(1.6px); } 72% { transform: translateX(-.8px); } }

/* Punto de aviso: aparece (escala de 0 a 1), no gira ni se traslada — nace en su propio centro
   (19,5). Nunca en hover: un punto de aviso que aparece al pasar el ratón miente sobre si hay
   algo pendiente (el propio README ya lo advertía; el CSS no lo cumplía — defecto medido
   2026-09-08).
   ⛔ EXCEPCIÓN DECLARADA a la regla dura «el reposo siempre está dibujado» (Ricardo,
   2026-09-08): este marcador NO es el ícono — es un INDICADOR DE ESTADO (badge) que sólo
   existe cuando hay avisos sin leer. Nacer de scale(0) es su comportamiento correcto: un
   punto que estuviera siempre dibujado mentiría igual que uno que apareciera con el simple
   paso del ratón. Es la segunda de las dos únicas excepciones de este componente (la otra
   son las chispitas del Asistente, arriba). */
.exds-ic-g svg [data-punto] {
  transform-box: view-box;
  transform-origin: 19px 5px;
  transform: scale(0);
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}
.exds-ic-g.is-active [data-punto], .exds-ic-g.play [data-punto] { transform: scale(1); }

/* ═══ PORTAL DEL CLIENTE · los cuatro íconos del riel (2026-09-12) ═══════════
   `DECISION-FUENTE: Ricardo, 2026-09-12 — «que mande dibujo», sobre
   `plans/decisiones/_decision_gesto_iconos_familia_fuerte_2026-09-12.html` (ver header). */

/* Inicio — la CASA ENTERA se acerca. Familia ENVOLTORIO (objeto rígido y cerrado, Regla
   dura 7: una casa no tiene parte que se pueda aislar sin romper el dibujo), mismo
   mecanismo que `data-lupa`/`data-doc`/`data-escudo`/`data-signo` (scale sobre el dibujo
   completo, eje 12,12). Calibrado en `_decision_gesto_iconos_portal_2026-09-12.html`: sube
   de scale(1.12) (8,7 %, «se veía como un bug») a scale(1.18) (13,0 %). */
.exds-ic-g svg [data-casa] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}
/* MOTION-ALLOW: Inicio acerca la CASA entera y recorre el 13,0 % de su tamaño, por debajo
   del 22 % de la vara de Dashboard · lo que se mueve es el OBJETO COMPLETO (Regla dura 7),
   no una parte pequeña dentro del dibujo — mismo imposible geométrico ya declarado para
   Mesa de control, Cumplimiento, Ayuda, Contactos, Mesa de crédito, Auditoría, Cartera y
   Admin: exigirle el 22 % de sus ~15,8 px serían más de 3 px de recorrido, y no caben en
   una caja de 19 px. */
.exds-ic-g:hover [data-casa], .exds-ic-g.play [data-casa] { transform: scale(1.18); }

/* Solicitar — el AVIÓN DE PAPEL ENTERO se inclina, como si virara. Familia ENVOLTORIO
   (objeto rígido de silueta única, Regla dura 7), mismo mecanismo que `data-doc`
   (rotate sobre el dibujo completo, eje 12,12). Calibrado en
   `_decision_gesto_iconos_portal_2026-09-12.html`: sube de rotate(-7deg) (8,3 %) a
   rotate(-11deg) (12,4 %). */
.exds-ic-g svg [data-avion] {
  transform-box: view-box;
  transform-origin: 12px 12px;
  transition: transform var(--motion-base, 250ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1));
}
/* MOTION-ALLOW: Solicitar inclina el AVIÓN entero y recorre el 12,4 % de su tamaño, por
   debajo del 22 % de la vara · mismo imposible geométrico que el resto de la familia
   envoltorio (objeto completo, Regla dura 7). */
.exds-ic-g:hover [data-avion], .exds-ic-g.play [data-avion] { transform: rotate(-11deg); }

/* Contratos — la PLUMA se levanta. Familia FUERTE: `folder-pen` tiene una parte suelta y
   ajena a la carpeta (la pluma, un `<path>` cerrado e independiente, dibujada encima) —
   por eso puede llevar la magnitud fuerte del backoffice (mecanismo de Dashboard/Cartera:
   translate de una parte, eje 12,12 heredado de la regla genérica `[data-part]`) en vez
   de quedarse en la familia envoltorio. `data-part="pluma"` marca sólo ese `<path>`, sin
   tocar ni un punto de ningún trazo. 24,0 % medido — POR ENCIMA de la vara de Dashboard
   (22 %): no necesita `MOTION-ALLOW`. */
.exds-ic-g:hover [data-part="pluma"], .exds-ic-g.play [data-part="pluma"] { transform: translate(0px, -2.16px); }

/* Mi información — la PERSONA se asoma. Familia FUERTE: `file-user` tiene una parte con
   postura propia (el círculo de la cabeza + el arco del cuerpo — el papel no se mueve
   solo), agrupada en `<g data-part="persona">` sin tocar ningún trazo. Mismo mecanismo
   que Contratos. 24,0 % medido — POR ENCIMA de la vara: no necesita `MOTION-ALLOW`. */
.exds-ic-g:hover [data-part="persona"], .exds-ic-g.play [data-part="persona"] { transform: translate(0px, 1.80px); }

/* ═══ v1.13 · GESTOS DEL SHELL · gramática del movimiento + Lucide Animated (MIT, Copyright (c) 2024-2026 pqoqubbw) ═══
   `DECISION-FUENTE: Ricardo, 2026-10-06 — «aprobado», sobre la frase: «Un ícono animado mueve la parte que lleva su significado, y la mueve haciendo lo que esa parte hace: una flecha avanza, una tapa se abre, una campana suena. Mover, girar o agrandar el ícono entero no es un gesto, salvo que eso sea literalmente lo que el ícono significa.»`
   Dos familias por ESTADO (Ricardo, 2026-10-06: «la animación tiene que estar diseñada para coincidir con
   los estados inactivo, hover y activo (módulo abierto)»):
   · POSE — al pasar el cursor la parte va a una pose y se QUEDA mientras dure el cursor; al salir vuelve.
     Al abrir el módulo (.play) hace la misma pose y vuelve: el ícono activo queda en su forma original.
   · SUCESO — al pasar el cursor la parte hace su movimiento UNA vez y acaba en su forma original (como la
     campana). Al abrir el módulo lo repite una vez. Nunca queda a medias.
   Excepción a la gramática, decidida por Ricardo sabiendo que mueve el ícono entero (se le advirtió por escrito en
   la hoja): Ventas (la etiqueta se mece) y Auditoría (la hoja se acerca ×1.05).
   RITMO UNICO (cada gesto lo declara aparte, con su cita, encima de su propia regla) · 500ms · el ritmo único del shell supera la banda 150-360 ms de la vara de Dashboard: Ricardo,
   2026-10-06, «realiza una revisión general para determinar si hay más íconos que transcurren demasiado rápido.
   Me gustaría que todo tenga en Shell un mismo ritmo» y «Aprobado. 500». No se afloja el umbral: el valor entra por
   esta declaración, con su cita, y vive en --ritmo-shell (respaldo 500 ms) para poder cambiarlo en un solo sitio. */
.exds-ic-g svg [data-part="lupa"], .exds-ic-g svg [data-part="persona-marco"], .exds-ic-g svg [data-part="carroceria"],
.exds-ic-g svg [data-part="interrog"] { transform-box: fill-box; transform-origin: center; }

/* AYUDA · SUCESO · el «?» se ladea dentro del círculo quieto (circle-help). Retira data-signo scale(1.12). */
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html (Ayuda en el piloto, «apruebo»); Ayuda: el signo se ladea dentro del círculo quieto, recorre el 9,3 % de su tamaño medido con lint_amplitud_gesto --catalogo, frente al 22 % de la vara; no se afloja el umbral, el valor entra por esta declaración. */
.exds-ic-g:hover [data-part="interrog"], .exds-ic-g.play [data-part="interrog"] { animation: exds-ic-ladear var(--ritmo-shell, 500ms) var(--ease-shake, cubic-bezier(0.36, 0.07, 0.19, 0.97)); }
@keyframes exds-ic-ladear { 0%, 100% { transform: none; } 25% { transform: rotate(-10deg); } 50% { transform: rotate(10deg); } 75% { transform: rotate(-6deg); } }

/* MESA DE CONTROL · MESA DE CRÉDITO · POSE · la lupa sube a buscar (folder-search, file-search-corner) */
.exds-ic-g svg [data-part="lupa"] { transition: transform var(--ritmo-shell, 500ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1)); }
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html (opción B Mesa de control Mesa de crédito); Mesa de control y Mesa de crédito: la lupa sube a buscar; por encima del 22 % en distancia, amparada sólo en velocidad, recorre el 37,3-42,6 % de su tamaño medido con lint_amplitud_gesto --catalogo, frente al 22 % de la vara; no se afloja el umbral, el valor entra por esta declaración. */
.exds-ic-g:hover [data-part="lupa"], .exds-ic-g.play [data-part="lupa"] { transform: translate(-1.5px, -2.5px); }

/* FINANZAS · POSE · se conserva su gesto ORIGINAL — la moneda da un giro completo (data-moneda, v1.9) —
   Ricardo, 2026-10-06: «regresa a finanzas a su efecto original. Sólo mantén la velocidad de acuerdo a los
   botones». Sólo cambia su duración, que pasa al ritmo único (bloque de ritmo, abajo). */

/* AUDITORÍA · RETIRADA 2026-10-07 · el módulo de primer nivel «Auditoría» desaparece del riel: pasa a ser el
   submódulo «Registro de actividad» de Admin (ícono history, estático: los submódulos no animan).
   DECISION-FUENTE: Ricardo, 2026-10-07 — «Auditoría» se reserva para un módulo futuro. Se retiran del
   gemelo la pose de la hoja (scale 1.05 acotada a .exds-sb), el re-escrito de los renglones
   data-texto="2|3" y el @keyframes exds-ic-renglon-8 (su único usuario). SE CONSERVA data-doc
   rotate(-7deg) (pestaña Cuadre, fuera del catálogo del riel). Historia de la receta: ficha
   COMPONENTE_ICONO_ANIMADO.md § GEOMETRIA fila 12 (tachada, no borrada). */

/* CUMPLIMIENTO · SUCESO · la palomita se marca: se traza y crece de la mitad a su tamaño (shield-check).
   Retira data-escudo scale(1.12): la palomita ya no se descentra porque nace en su propio centro. */
.exds-ic-g svg [data-check-nav] { stroke-dasharray: 8.485; transform-box: fill-box; transform-origin: center; }
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html («Aprobado. 500»); no se afloja el umbral de la vara, el valor entra por esta declaración (la palomita de Cumplimiento se traza y crece; el medidor de dibujo roto lo ve como tal y es el gesto decidido). */
.exds-ic-g:hover [data-check-nav], .exds-ic-g.play [data-check-nav] { animation: exds-ic-marcar var(--ritmo-shell, 500ms) var(--ease-settle, cubic-bezier(0.22, 1, 0.36, 1)) both; }
@keyframes exds-ic-marcar { from { stroke-dashoffset: 8.485; transform: scale(.5); } to { stroke-dashoffset: 0; transform: none; } }

/* ADMIN · SUCESO · la llave aprieta: gira desde su boca, como al apretar una tuerca (wrench, Lucide Animated,
   directo) — Ricardo, 2026-10-06, cambia el ícono de Admin (star → wrench): «Mejor wrench». Girar el ícono
   entero es aquí lo que la llave HACE: la excepción que la regla prevé. */
.exds-ic-g svg [data-part="llave"] { transform-box: fill-box; transform-origin: 90% 10%; }
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html («Aprobado. 500»); no se afloja el umbral de la vara, el valor entra por esta declaración (la llave de Admin gira entera desde su boca). */
.exds-ic-g:hover [data-part="llave"], .exds-ic-g.play [data-part="llave"] { animation: exds-ic-apretar var(--ritmo-shell, 500ms) ease-in-out; }
@keyframes exds-ic-apretar { 0%, 100% { transform: none; } 42% { transform: rotate(12deg); } 68% { transform: rotate(-14deg); } 88% { transform: rotate(4deg); } }

/* INTEGRACIONES · SUCESO · las ondas se apagan y se vuelven a encender, las de dentro primero (radio, Lucide
   Animated, directo) — Ricardo, 2026-10-06, cambia el ícono (rss → radio): «Integraciones por "radio" de lucide.
   Directo» y elige este gesto */
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html («Aprobado. 500»); no se afloja el umbral de la vara, el valor entra por esta declaración (ondas interiores de Integraciones). */
.exds-ic-g:hover [data-part="onda-int"], .exds-ic-g.play [data-part="onda-int"] { animation: exds-ic-onda-int var(--ritmo-shell, 500ms) var(--ease-default, cubic-bezier(0.32, 0.72, 0, 1)); }
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html («Aprobado. 500»); no se afloja el umbral de la vara, el valor entra por esta declaración (ondas exteriores de Integraciones). */
.exds-ic-g:hover [data-part="onda-ext"], .exds-ic-g.play [data-part="onda-ext"] { animation: exds-ic-onda-ext var(--ritmo-shell, 500ms) var(--ease-default, cubic-bezier(0.32, 0.72, 0, 1)); }
@keyframes exds-ic-onda-int { 0%, 70%, 100% { opacity: 1; } 35% { opacity: 0; } }
@keyframes exds-ic-onda-ext { 0%, 100% { opacity: 1; } 35%, 55% { opacity: 0; } }

/* VENTAS · SUCESO · la etiqueta se mece (tag) — elegido por Ricardo sabiendo que mueve el ícono entero */
.exds-ic-g svg [data-part="etiqueta"] { transform-box: fill-box; transform-origin: center; }
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html («Aprobado. 500»); no se afloja el umbral de la vara, el valor entra por esta declaración (Ventas mece la etiqueta entera: excepción a la gramática que Ricardo eligió sabiéndolo; recorrido de 11,2 %, por debajo del 22 % de la vara). */
.exds-ic-g:hover [data-part="etiqueta"], .exds-ic-g.play [data-part="etiqueta"] { transform: none; animation: exds-ic-mecer var(--ritmo-shell, 500ms) var(--ease-shake, cubic-bezier(0.36, 0.07, 0.19, 0.97)); }
@keyframes exds-ic-mecer { 0%, 100% { transform: none; } 25% { transform: rotate(-10deg); } 50% { transform: rotate(10deg); } 75% { transform: rotate(-6deg); } }

/* CONTACTOS · POSE · la persona se asoma dentro de su marco quieto (square-user-round).
   ⚠ El marcador es `persona-marco` y NO `persona`: `data-part="persona"` ya lo usa «Mi información» del riel del
   portal (file-user, baja 1,8 px) y un mismo marcador no puede subir en un sitio y bajar en otro. */
.exds-ic-g svg [data-part="persona-marco"] { transition: transform var(--ritmo-shell, 500ms) var(--ease-emphasis, cubic-bezier(0.34, 1.26, 0.58, 1)); }
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html (opción A Contactos); Contactos: la persona se asoma dentro de su marco quieto, recorre el 13,1 % de su tamaño medido con lint_amplitud_gesto --catalogo, frente al 22 % de la vara; no se afloja el umbral, el valor entra por esta declaración. */
.exds-ic-g:hover [data-part="persona-marco"], .exds-ic-g.play [data-part="persona-marco"] { transform: translateY(-1.8px); }

/* PESTAÑAS DE RECURSOS HUMANOS · POSE · RELOJ (Lucide clock) y PERSONAS (Lucide users).
   `DECISION-FUENTE: Ricardo, 2026-10-27 — «2. Tu recomendación 3. Tu recomendación»` sobre `plans/decisiones/_decision_iconos_pestanas_rh_2026-10-27.html` (Personas A; el reloj lo reemplaza la decisión siguiente).
   `DECISION-FUENTE: Ricardo, 2026-10-27 — «r: A» sobre plans/decisiones/_decision_reloj_masa_2026-10-27.html (eligió A sabiendo que la recomendación era B).`
   Reloj (v1.15): las dos manecillas llevan la parte manecillas; el horario gira 30° y el minutero (último hijo) 90° sobre el centro (12,12); el círculo queda quieto.
   Personas A: la persona de atrás se asoma arriba a la derecha; la de frente queda quieta.
   Sin transition propia: heredan la regla común de arriba (var(--motion-base, 250ms) · var(--ease-emphasis)) y su eje en
   el centro del dibujo (view-box, 12px 12px). Disparador :hover y .play, nunca .is-active. */
.exds-ic-g:hover [data-part="manecillas"], .exds-ic-g.play [data-part="manecillas"] { transform: rotate(30deg); }
.exds-ic-g:hover [data-part="manecillas"]:last-child, .exds-ic-g.play [data-part="manecillas"]:last-child { transform: rotate(90deg); }
/* MOTION-ALLOW: distancia 12,4 % · Personas A, aprobado por Ricardo, 2026-10-27, viendo la pieza viva a 16 px en _decision_iconos_pestanas_rh_2026-10-27.html (3. Tu recomendación); la persona de atrás se asoma recorriendo el 12,4 % de su tamaño medido con lint_amplitud_gesto --catalogo, frente al 22 % de la vara; no se afloja el umbral, el valor entra por esta declaración, y la duración (250 ms) y la masa (11,9 px²) sí llegan. */
.exds-ic-g:hover [data-part="persona-atras"], .exds-ic-g.play [data-part="persona-atras"] { transform: translate(1.2px, -1.8px); }

/* FLOTA · SUCESO · la carrocería rebota sobre su suspensión; las ruedas no se mueven (car-front) */
/* MOTION-ALLOW: 500ms · ritmo único del shell y gesto de la parte, aprobados por Ricardo, 2026-10-06, viendo la pieza viva a 19 px en _decision_gestos_estados_2026-10-06.html (opción A Flota); Flota: la carrocería rebota sobre su suspensión, recorre el 7,8 % de su tamaño medido con lint_amplitud_gesto --catalogo, frente al 22 % de la vara; no se afloja el umbral, el valor entra por esta declaración. */
.exds-ic-g:hover [data-part="carroceria"], .exds-ic-g.play [data-part="carroceria"] { animation: exds-ic-rebote var(--ritmo-shell, 500ms) var(--ease-default, cubic-bezier(0.32, 0.72, 0, 1)); }
@keyframes exds-ic-rebote { 0%, 100% { transform: none; } 30% { transform: translateY(-1.4px); } 60% { transform: none; } 80% { transform: translateY(-.6px); } }

/* ═══ RITMO ÚNICO DEL SHELL · ACOTADO AL SHELL DEL BACKOFFICE ═══
   Todo gesto del shell dura lo mismo: --ritmo-shell. Lo que antes iba a 250 ms (poses) y a 340 ms (sucesos y el
   engrane) se iguala. Los retrasos internos (el 2.º destello) escalan con el ritmo.
   ⛔ El riel del PORTAL también es `.exds-sb` (app/mi-exante.html), con sus propios gestos (capas de Cartera
   en Solicitudes, Inicio, Contratos, Mi información) que NO cambian de ritmo. El discriminador es que la lateral
   del backoffice lleva el buscador `.exds-sb-search` y la del portal no: `.exds-sb:has(.exds-sb-search)`.
   Medido en navegador (riel del portal entero, antes y después): sin cambio de duración. La barra superior
   `.exds-tb` del portal no monta ningún `.exds-ic-g`, así que no necesita discriminador. Un Shell del catálogo
   sin buscador queda fuera del ritmo único, a propósito. El overflow visible sólo quita un recorte. */
.exds-sb:has(.exds-sb-search) .exds-ic-g svg { overflow: visible; }
.exds-sb:has(.exds-sb-search) .exds-ic-g svg [data-part]:where(:not([data-part="pluma"], [data-part="persona"])), .exds-sb:has(.exds-sb-search) .exds-ic-g svg [data-nodo], .exds-sb:has(.exds-sb-search) .exds-ic-g svg [data-moneda] { transition-duration: var(--ritmo-shell, 500ms); }
.exds-sb:has(.exds-sb-search) .exds-ic-g:hover [data-part="engrane"], .exds-sb:has(.exds-sb-search) .exds-ic-g.play [data-part="engrane"] { transition-duration: var(--ritmo-shell, 500ms); }
.exds-sb:has(.exds-sb-search) .exds-ic-g:hover [data-part="chispita"] + [data-part="chispita"], .exds-sb:has(.exds-sb-search) .exds-ic-g.play [data-part="chispita"] + [data-part="chispita"] { transition-delay: calc(var(--ritmo-shell, 500ms) * .3); transition-duration: calc(var(--ritmo-shell, 500ms) * .7); }
.exds-sb:has(.exds-sb-search) .exds-ic-g:hover [data-part="campana"], .exds-sb:has(.exds-sb-search) .exds-ic-g.play [data-part="campana"] { animation-duration: var(--ritmo-shell, 500ms); }
.exds-tb .exds-ic-g svg { overflow: visible; }
.exds-tb .exds-ic-g svg [data-part]:where(:not([data-part="pluma"], [data-part="persona"])), .exds-tb .exds-ic-g svg [data-nodo], .exds-tb .exds-ic-g svg [data-moneda] { transition-duration: var(--ritmo-shell, 500ms); }
.exds-tb .exds-ic-g:hover [data-part="engrane"], .exds-tb .exds-ic-g.play [data-part="engrane"] { transition-duration: var(--ritmo-shell, 500ms); }
.exds-tb .exds-ic-g:hover [data-part="chispita"] + [data-part="chispita"], .exds-tb .exds-ic-g.play [data-part="chispita"] + [data-part="chispita"] { transition-delay: calc(var(--ritmo-shell, 500ms) * .3); transition-duration: calc(var(--ritmo-shell, 500ms) * .7); }
.exds-tb .exds-ic-g:hover [data-part="campana"], .exds-tb .exds-ic-g.play [data-part="campana"] { animation-duration: var(--ritmo-shell, 500ms); }

/* ═══ REGLA DURA 3 · prefers-reduced-motion apaga TODO ═══════════════════════
   `transition:none` y `animation:none` quitan el MOVIMIENTO, no el estado
   final: si `.is-active`/`.play` ya está puesto, la palomita queda trazada,
   el punto queda visible y el chevron queda girado — de golpe, sin recorrido.
   El significado del estado se sigue viendo; sólo desaparece el gesto. */
@media (prefers-reduced-motion: reduce) {
  .exds-ic-g svg *,
  .exds-ic-g svg { animation: none !important; transition: none !important; }
}
