/*? =====================================================================
    TEMA DE MARCA — IESDE
    Plugin de tema; requiere la capa de roles (en style.css) cargada antes.

    Fuente de verdad: iesde-sistema-de-diseno-2.html ("Fundamentos
    actualizados · v2"), que sustituye a iesde-sistema-de-diseno.html (v1) y
    a iesde-sistema-de-diseno.md. Cuando discrepan, manda el HTML de v2.
    Los valores marcados "derivado" NO vienen del sistema: se infirieron aquí.

    ---------------------------------------------------------------------
    QUÉ CAMBIÓ EN v2  (sep 2026)
    ---------------------------------------------------------------------
      · SE RETIRA EL DORADO. #c89e4a no aparece ni una vez en v2: se van
        --iesde-gold*, --iesde-shadow-floating y la variante de botón
        .__iesde-gold (el "botón flotante"). La paleta ampliada queda en
        cuatro grises.
      · Radio principal 20px (antes 14px en card) para cards, paneles y
        superficies de contenido.
      · Dos familias de color nuevas: VERDES DE INTERACCIÓN (el turquesa
        identifica, estos accionan) y ocho GRADIENTES de marca, siempre
        azul → turquesa.
      · Fundamentos que v1 no traía: sombras en tres niveles + elevación de
        las cards del home, escala de espaciado, rejilla de 12 columnas con
        breakpoints reales y motion (≤250ms).
      · Patrones de página nuevos: footer del home, acordeón de oferta
        académica, plan de estudios y característica destacada. Van en la
        capa 4 como clases de marca (__iesde-*), no como componentes.
      · Se define el error (#b3261e) y el anillo de foco pasa a ser
        obligatorio en todo control interactivo.

    ---------------------------------------------------------------------
    ALCANCE — se activa en CUALQUIER elemento, no solo en <html>
    ---------------------------------------------------------------------
    Todos los selectores son `[data-brand="iesde"] …`, así que la marca vale
    para el subárbol donde se ponga el atributo. Eso permite mezclar marcas
    en una misma página:

        <html data-brand="upaep">
          …
          <section data-brand="iesde"> … </section>   … isla IESDE
          …
        </html>

    Dos consecuencias que hay que tener presentes:
      · los overlays que el runtime mueve a <body> (modales, dropdowns,
        tooltips) SALEN del subárbol y vuelven a la marca del ancestro;
      · el modo oscuro se resuelve abajo con tres selectores para que
        funcione tanto si `data-theme` está en el mismo elemento como en un
        ancestro o un descendiente.
    ===================================================================== */

/*? Fuentes del sistema IESDE. Mismo mecanismo que usa el core del uikit
    para Fira Sans (@import de Google Fonts al inicio de style.css). */
@import url("https://fonts.googleapis.com/css2?family=Sora:wght@300;400;500;600;700&family=Manuale:ital,wght@0,300;0,500&display=swap");

/*? =====================================================================
    1. TOKENS
    ===================================================================== */

[data-brand="iesde"] {

    /*? --- Primitivos IESDE (paleta cruda del sistema) --------------------- */
    --iesde-navy: #0b2b40;
    --iesde-navy-deep: #0c2a3f;         /* navy de barra: navbar y pie */
    --iesde-navy-active: #1d335b;
    --iesde-turquoise: #22a798;         /* acento de marca */
    --iesde-turquoise-deep: #186d63;    /* turquesa accionable */
    --iesde-blue: #174480;
    --iesde-blue-light: #386db4;
    --iesde-gray-dark: #464442;
    --iesde-gray-medium: #6e6b68;
    --iesde-gray-light: #edece3;
    --iesde-gray-light-2: #c4beb9;
    --iesde-border-card: #ececec;       /* borde de card — NO el de campos */
    --iesde-tab-inactive-bg: #e1e1e1;
    --iesde-font-editorial: "Manuale", Georgia, serif;

    /*? --- Verdes de interacción (v2) --------------------------------------
        Familia verde del home. NO sustituye al turquesa de marca: el
        turquesa identifica, estos accionan. */
    --iesde-green-active: #2a736f;      /* tarjeta abierta */
    --iesde-green-inactive: #3e7b76;    /* tarjeta cerrada */
    --iesde-green-cta: #1e8a6e;         /* CTA sólido */
    --iesde-green-ring: #35c2b0;        /* aro del retrato */
    --iesde-green-eyebrow: #7fd8cd;     /* antetítulo sobre fondo oscuro */
    --iesde-green-chip: #f1f7f6;        /* chip claro */

    /*? --- Neutros de los patrones de página (v2) ---------------------------
        Grises que v2 usa en los bloques de la capa 4 y que NO coinciden con
        los roles del core: la prosa de panel es un punto más cálida que
        --ui-text-muted, y las pastillas numéricas tienen fondo propio. */
    --iesde-prose: #5a5e63;             /* cuerpo de card y de panel */
    --iesde-text-meta: #8a9096;         /* fecha, dato secundario */
    --iesde-text-faint: #b8babc;        /* texto tenue: campo deshabilitado */
    --iesde-border-tile: #eceff2;       /* borde de ficha de temario */
    --iesde-border-chip: #cfd5d8;       /* contorno del chip "volver" */
    --iesde-zebra: #f4f7f9;             /* fondo alterno de ficha */
    --iesde-num-turquoise: #eaf6f4;     /* pastilla numérica turquesa */
    --iesde-num-blue: #eaf0f8;          /* pastilla numérica azul */
    --iesde-dots-bg: #edeff2;           /* barra de puntos del carrusel */
    --iesde-placeholder: #7f96a8;       /* hueco de foto del collage */

    /*? --- Estados por variante de botón (el core no tiene roles) ---------- */
    --iesde-primary-hover: #021622;
    --iesde-primary-disabled: #6e9db9;
    --iesde-secondary-hover: #0e463f;
    --iesde-secondary-disabled: #8fb3af;
    --iesde-dark-hover: #1c1b1a;
    --iesde-dark-disabled: #dfdbd7;
    --iesde-cta-hover: var(--iesde-turquoise-deep);
    --iesde-cta-disabled: #8fb3af;

    /*? --- Radios ---------------------------------------------------------
        ⚠ El core NO tiene roles --ui-radius-*: se aplican componente a
        componente en la capa 3.

        v2 fija 20px como radio PRINCIPAL (cards, paneles y superficies de
        contenido); el resto son excepciones por rol. */
    --iesde-radius-main: 20px;
    --iesde-radius-pill: 30px;
    --iesde-radius-card: var(--iesde-radius-main);
    --iesde-radius-accordion: 13px;     /* tarjeta de oferta académica */
    --iesde-radius-tab: 10px;
    --iesde-radius-md: 12px;
    --iesde-radius-sm: 10px;            /* campo de formulario */
    --iesde-radius-xs: 8px;             /* fila anidada */
    --iesde-radius-hairline: 4px;

    /*? --- Escala de espaciado (v2) ----------------------------------------
        Base 4. La escala salta 5 y 7 a propósito: no existen en el sistema. */
    --iesde-space-1: 4px;
    --iesde-space-2: 8px;
    --iesde-space-3: 12px;
    --iesde-space-4: 16px;
    --iesde-space-6: 24px;
    --iesde-space-8: 32px;
    --iesde-space-12: 48px;
    --iesde-space-16: 64px;
    --iesde-space-18: 72px;

    /*? --- Motion (v2) -----------------------------------------------------
        Nada pasa de 250ms y ninguna curva sobrepasa su destino. */
    --iesde-transition-fast: 150ms;         /* color: hover, borde */
    --iesde-transition-medium: 200ms;       /* transformaciones cortas */
    --iesde-transition-accordion: 250ms ease;
    --iesde-ease-lift: cubic-bezier(.22, .61, .36, 1);

    /*? --- Rejilla (v2) ----------------------------------------------------
        Mobile first: 4 → 8 → 12 columnas. Los breakpoints viven en la
        capa 5; aquí solo la métrica del contenedor. */
    --iesde-container: 1180px;
    --iesde-gutter: 24px;
    --iesde-page-margin: 56px;

    /*? --- Escala tipográfica ----------------------------------------------
        ⚠ El core solo tiene roles de FAMILIA: la escala vive como token de
        marca y la consume la capa 2. */
    --iesde-text-h1-hero: 700 56px/1.1 "Sora", system-ui, sans-serif;
    --iesde-text-h1-section: 600 48px/1.1 "Sora", system-ui, sans-serif;
    --iesde-text-h2-entry-semibold: 600 32px/1.25 "Sora", system-ui, sans-serif;
    --iesde-text-h3-entry-light: 300 32px/1.25 "Sora", system-ui, sans-serif;
    --iesde-text-h4-subtitle: 600 24px/1.3 "Sora", system-ui, sans-serif;
    --iesde-text-editorial-h1-banner: 300 60px/1.05 "Manuale", Georgia, serif;
    --iesde-text-editorial-h2-section: 500 50px/1.05 "Manuale", Georgia, serif;
    --iesde-text-editorial-h3-subtitle: 500 32px/1.2 "Manuale", Georgia, serif;
    --iesde-text-p1-large: 400 20px/1.5 "Sora", system-ui, sans-serif;
    --iesde-text-p1-bold: 600 18px/1.5 "Sora", system-ui, sans-serif;
    --iesde-text-p2-body: 400 16px/1.5 "Sora", system-ui, sans-serif;
    --iesde-text-p3-medium: 400 14px/1.5 "Sora", system-ui, sans-serif;
    --iesde-text-p4-small: 400 12px/1.5 "Sora", system-ui, sans-serif;

    /*? --- Sombras ----------------------------------------------------------
        v2 fija TRES niveles y nada más: plano (solo borde), card y
        destacado. El contraste de color hace el trabajo jerárquico. */
    --iesde-shadow-card: 0 1px 3px rgba(0, 0, 0, .04);          /* nivel 1 */
    --iesde-shadow-card-strong: 0 8px 24px rgba(11, 43, 64, .1);/* nivel 2 */

    /*? --- Elevación de las cards del home (v2) ----------------------------
        Sombra propia, más profunda y siempre en tono navy. El hover no
        cambia el color: sube la pieza y profundiza la sombra. */
    --iesde-shadow-home: 0 6px 20px rgba(11, 43, 64, .1);
    --iesde-shadow-home-hover: 0 20px 42px rgba(11, 43, 64, .22);
    --iesde-shadow-panel: 0 10px 30px rgba(11, 43, 64, .1);
    --iesde-shadow-testimonial: 0 22px 46px rgba(4, 20, 32, .28);
    --iesde-shadow-offer-active: 0 10px 26px rgba(11, 43, 64, .16);
    --iesde-lift-home: -6px;            /* translateY del hover de card */

    /*? --- Gradientes de marca (v2) -----------------------------------------
        Regla del sistema: SIEMPRE azul → turquesa, nunca al revés. */
    --iesde-gradient-empresario: linear-gradient(105deg, #2e5fa8 0%, #1b4a85 52%, #0b2b40 100%);
    --iesde-gradient-directivo: linear-gradient(105deg, #12554f 0%, #1b7f63 55%, #2fa678 100%);
    --iesde-gradient-medida: linear-gradient(105deg, #22a798 0%, #1c6f92 55%, #174480 100%);
    --iesde-gradient-band: linear-gradient(34deg, #1d4a88 0%, #2a5b9e 46%, #2e7f9d 76%, #23a795 100%);
    --iesde-gradient-testimonial: linear-gradient(#0c2a3f 0%, #155b62 46%, #35c2a2 100%);
    --iesde-gradient-testimonial-2: linear-gradient(#2c4657 0%, #3f7b80 46%, #5fc5ae 100%);
    --iesde-gradient-knowhower: linear-gradient(#0f5a54 0%, #1b8c79 62%, #25a98c 100%);
    --iesde-gradient-section: linear-gradient(#e5e9ef 0%, #e1e7ef 42%, #d5deeb 100%);
    --iesde-veil-video: linear-gradient(rgba(11, 35, 70, .42) 0%, rgba(12, 38, 76, .62) 35%, rgba(14, 45, 88, .78) 85%);

    /*? --- Acción ---------------------------------------------------------
        El primario de IESDE es el NAVY. El turquesa de marca (#22a798) da
        2.98:1 con blanco: no sirve como superficie de acción, vive en
        --ui-accent. */
    --ui-primary: var(--iesde-navy);
    --ui-primary-hover: var(--iesde-primary-hover);
    --ui-primary-border: var(--iesde-primary-hover);
    --ui-on-primary: #ffffff;

    --ui-secondary: var(--iesde-turquoise-deep);
    --ui-secondary-hover: var(--iesde-secondary-hover);
    --ui-secondary-border: var(--iesde-secondary-hover);
    --ui-on-secondary: #ffffff;

    --ui-tertiary: #ffffff;
    --ui-tertiary-hover: #f5f5f5;
    --ui-tertiary-border: #dbdbdb;
    --ui-on-tertiary: #000000;

    --ui-accent: var(--iesde-turquoise);
    /*? El texto sobre el acento institucional daba 2.98:1. Se cambia el TEXTO, no el
       color de la marca: la identidad es intocable, su par legible no. */
    --ui-on-accent: #14161d;                         /* 6.06:1 */

    /*? --- Superficies ----------------------------------------------------- */
    --ui-surface: #ffffff;
    --ui-surface-2: #fafafa;
    --ui-surface-2-border: #eeeeee;
    --ui-surface-3: #f5f5f5;
    --ui-surface-hover: #f5f5f5;

    /*? --- Texto -----------------------------------------------------------
        IESDE invierte el criterio de UPAEP: cuerpo casi-negro, encabezados
        navy (en UPAEP el cuerpo es navy y el fuerte, negro). */
    --ui-text: #1d1d1f;
    --ui-text-strong: var(--iesde-navy);
    --ui-text-muted: #52565a;
    --ui-text-on-surface: var(--iesde-gray-dark);

    /*? --- Bordes ------------------------------------------------------------ */
    /*? U-07 · LIMITE de control (1.4.11, 3:1). Los separadores decorativos no
       usan este rol y quedan como estaban. */
    --ui-border: #8d8d8d;                            /* 1.27 -> 3.04:1 */
    --ui-border-subtle: #eeeeee;
    --ui-divider: #eeeeee;

    /*? --- Foco, sombra ------------------------------------------------------
        v2 hace el anillo de foco OBLIGATORIO en todo control interactivo:
        3px de turquesa al 15%. */
    --ui-focus-ring: rgba(34, 167, 152, .15);
    --ui-control-ring: rgba(34, 167, 152, .15);
    --ui-shadow: var(--iesde-shadow-card);

    /*? --- Neutros y contadores ----------------------------------------------- */
    --ui-neutral: var(--iesde-gray-dark);
    --ui-on-neutral: #ffffff;
    --ui-counter: var(--iesde-navy);
    --ui-on-counter: #ffffff;

    /*? --- Enlaces -------------------------------------------------------------- */
    --ui-link: var(--iesde-blue-light);
    --ui-link-hover: var(--iesde-blue);

    /*? --- Tipografía ------------------------------------------------------------ */
    --ui-font-base: "Sora", system-ui, sans-serif;
    --ui-font-heading: "Sora", system-ui, sans-serif;

    /*? --- Semánticos ------------------------------------------------------------
        v2 SÍ define el error (matriz de estados del campo): #b3261e con
        anillo propio al 12%, y marca el acierto con el turquesa accionable.
        ⚠ PENDIENTE: warning e info siguen sin especificar y se heredan
        de UPAEP. */
    --iesde-error: #b3261e;
    --iesde-error-ring: rgba(179, 38, 30, .12);

    --ui-danger: var(--iesde-error);
    --ui-danger-border: var(--iesde-error);
    --ui-danger-hover: var(--iesde-error);
    --ui-danger-subtle: var(--iesde-error-ring);

    --ui-success: var(--iesde-turquoise-deep);
    --ui-success-border: var(--iesde-turquoise-deep);
    --ui-success-hover: var(--iesde-secondary-hover);
}

/*? ---------------------------------------------------------------------
    MODO OSCURO — derivado, el sistema IESDE no lo especifica.
    Tres selectores para que funcione con el atributo en el mismo elemento,
    en un ancestro o en un descendiente (ver nota de ALCANCE arriba).
    Paleta tintada de navy para que el oscuro siga sabiendo a IESDE en vez
    de ser un gris neutro.
    --------------------------------------------------------------------- */
[data-brand="iesde"][data-theme="dark"],
[data-theme="dark"] [data-brand="iesde"],
[data-brand="iesde"] [data-theme="dark"]:not(:where([data-brand])) {

    /* Superficies: azules muy oscuros, no grises. */
    --ui-surface: #0f2029;
    --ui-surface-2: #081419;
    --ui-surface-2-border: #24404d;
    --ui-surface-3: #16303c;
    --ui-surface-hover: #16303c;
    --ui-surface-inverse: #061015;

    /* Texto: 14:1 sobre la superficie base. */
    --ui-text: #e6eef2;
    --ui-text-strong: #ffffff;
    --ui-text-muted: #9db2bd;
    --ui-text-on-surface: #c6d5dd;

    --ui-border: #5c7a89;                            /* U-07 oscuro · 1.54 -> 3.02:1 */
    --ui-border-subtle: #24404d;
    --ui-divider: #1c3543;

    /* El navy primario desaparece sobre fondo oscuro: la acción principal
       pasa al turquesa aclarado con texto navy encima (#4FA99C / #0b2b40 =
       5.22:1). */
    --ui-primary: #4fa99c;
    --ui-primary-hover: #6fbdb1;
    --ui-primary-border: #6fbdb1;
    --ui-on-primary: #06212b;

    --ui-secondary: #2e8b7f;
    --ui-secondary-hover: #3aa294;
    --ui-secondary-border: #3aa294;
    --ui-on-secondary: #ffffff;

    --ui-tertiary: #16303c;
    --ui-tertiary-hover: #1e3d4b;
    --ui-tertiary-border: #2f4d5c;
    --ui-on-tertiary: #e6eef2;

    /* Acento más brillante: sobre fondo oscuro el #22a798 se apaga. */
    --ui-accent: #35c4b3;
    --ui-on-accent: #06212b;

    --ui-neutral: #24404d;
    --ui-on-neutral: #ffffff;
    --ui-counter: #4fa99c;
    --ui-on-counter: #06212b;

    --ui-link: #7fb4e8;
    --ui-link-hover: #a6ccf1;

    --ui-focus-ring: rgba(79, 169, 156, .35);
    --ui-control-ring: rgba(79, 169, 156, .35);
    --ui-shadow: 0 2px 10px rgba(0, 0, 0, .55);

    /* Primitivos que también cambian en oscuro. */
    --iesde-navy: #0f2029;
    --iesde-navy-deep: #0b1a22;
    --iesde-border-card: #24404d;
    --iesde-tab-inactive-bg: #1c3543;
    --iesde-primary-hover: #6fbdb1;
    --iesde-primary-disabled: #2b4b58;
    --iesde-secondary-disabled: #2a4f4a;
    --iesde-dark-disabled: #2a3f49;
    --iesde-cta-disabled: #2a4f4a;
    --iesde-gray-light: #24404d;

    /* Los verdes de interacción se aclaran: sobre fondo oscuro el
       #2a736f y el #3e7b76 se confunden con la superficie. */
    --iesde-green-active: #2e8b7f;
    --iesde-green-inactive: #1f4f4c;
    --iesde-green-cta: #2aa384;
    --iesde-green-chip: #16303c;

    /* Las sombras dejan de ser navy translúcido —invisible sobre oscuro— y
       pasan a negro con más opacidad. */
    --iesde-shadow-card: 0 2px 10px rgba(0, 0, 0, .55);
    --iesde-shadow-card-strong: 0 8px 24px rgba(0, 0, 0, .55);
    --iesde-shadow-home: 0 6px 20px rgba(0, 0, 0, .5);
    --iesde-shadow-home-hover: 0 20px 42px rgba(0, 0, 0, .65);
    --iesde-shadow-panel: 0 10px 30px rgba(0, 0, 0, .5);
    --iesde-shadow-testimonial: 0 22px 46px rgba(0, 0, 0, .68);
    --iesde-shadow-offer-active: 0 10px 26px rgba(0, 0, 0, .55);

    /* El gradiente de sección es el único que no sobrevive: sus grises
       azulados son claros por definición. */
    --iesde-gradient-section: linear-gradient(#0f2029 0%, #122732 42%, #16303c 100%);

    --iesde-error: #f2837a;
    --iesde-error-ring: rgba(242, 131, 122, .18);
    /*? U-04 · En oscuro el rojo de error se aclara para verse sobre el fondo; con
       texto blanco encima daba 2.53:1. El relleno claro pide texto oscuro. */
    --ui-on-danger: #14161d;                         /* 7.14:1 */

    /* Neutros de los patrones: los claros no sirven de nada en oscuro. */
    --iesde-prose: #c6d5dd;
    --iesde-text-meta: #9db2bd;
    --iesde-text-faint: #6e8a97;
    --iesde-border-tile: #24404d;
    --iesde-border-chip: #2f4d5c;
    --iesde-zebra: #122732;
    --iesde-num-turquoise: #16303c;
    --iesde-num-blue: #16303c;
    --iesde-dots-bg: #16303c;
    --iesde-placeholder: #24404d;
}

/*? =====================================================================
    2. TIPOGRAFÍA
    Se aplica a las ETIQUETAS reales (h1—h4, p) dentro del alcance de la
    marca. Los modificadores cubren los estilos que no tienen etiqueta
    propia; van en inglés, como el resto del uikit.

      h1              H1 secciones     600 · 48
      h1.__hero       H1 hero          700 · 56
      h2              H2 entrada       600 · 32
      h2.__light      H3 entrada light 300 · 32
      h3              H4 subtítulo     600 · 24
      h4              (derivado)       600 · 20
      p               P2 cuerpo        400 · 16
      p.__lead        P1 grande        400 · 20
      p.__bold        P1 bold          600 · 18
      p.__small       P3 medio         400 · 14
      p.__caption     P4 pequeño       400 · 12
      .__editorial    cambia a Manuale (h1/h2/h3)
    ===================================================================== */

[data-brand="iesde"] {
    font-family: var(--ui-font-base);
    color: var(--ui-text);
}

:where([data-brand="iesde"]) h1 {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h1 {
    font: var(--iesde-text-h1-section);
    letter-spacing: -.5px;
    margin: 0 0 .5rem;
}

:where([data-brand="iesde"]) h1.__hero {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h1.__hero {
    font: var(--iesde-text-h1-hero);
}

:where([data-brand="iesde"]) h2 {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h2 {
    font: var(--iesde-text-h2-entry-semibold);
    letter-spacing: -.5px;
    margin: 0 0 .5rem;
}

:where([data-brand="iesde"]) h2.__light {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h2.__light {
    font: var(--iesde-text-h3-entry-light);
}

:where([data-brand="iesde"]) h3 {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h3 {
    font: var(--iesde-text-h4-subtitle);
    margin: 2rem 0 1rem;
}

/* El sistema no define un quinto nivel: este es derivado. */
:where([data-brand="iesde"]) h4 {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h4 {
    font: 600 20px/1.35 "Sora", system-ui, sans-serif;
    margin: 1.5rem 0 .75rem;
}

:where([data-brand="iesde"]) p {
    color: var(--ui-text);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) p {
    font: var(--iesde-text-p2-body);
    margin: 0 0 1rem;
}

:where([data-brand="iesde"]) p.__lead {
    color: var(--ui-text-muted);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) p.__lead {
    font: var(--iesde-text-p1-large);
}

:where([data-brand="iesde"]) p.__bold {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) p.__bold {
    font: var(--iesde-text-p1-bold);
}

:where([data-brand="iesde"]) p.__small {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) p.__small {
    font: var(--iesde-text-p3-medium);
}

:where([data-brand="iesde"]) p.__caption {
    color: var(--ui-text-muted);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) p.__caption {
    font: var(--iesde-text-p4-small);
}

/* Variante editorial en Manuale. Manuale se carga solo en 300 y 500 y sin
   eje itálico: no hay editorial en negrita ni en cursiva real. */
:where([data-brand="iesde"]) h1.__editorial {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h1.__editorial {
    font: var(--iesde-text-editorial-h1-banner);
}

:where([data-brand="iesde"]) h2.__editorial {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h2.__editorial {
    font: var(--iesde-text-editorial-h2-section);
}

:where([data-brand="iesde"]) h3.__editorial {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h3.__editorial {
    font: var(--iesde-text-editorial-h3-subtitle);
}

[data-brand="iesde"] .__editorial {
    font-family: var(--iesde-font-editorial);
}

/* Puente con las clases tipográficas propias del uikit, para que un bloque
   escrito con ellas también hable IESDE. */
[data-brand="iesde"] .upaep__title {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__title {
    font: var(--iesde-text-h2-entry-semibold);
}

[data-brand="iesde"] .upaep__subtitle {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__subtitle {
    font: var(--iesde-text-h4-subtitle);
}

[data-brand="iesde"] .upaep__subtitle-2 {
    color: var(--ui-text-strong);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__subtitle-2 {
    font: var(--iesde-text-p1-bold);
}

[data-brand="iesde"] .upaep__text {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__text {
    font: var(--iesde-text-p2-body);
}

[data-brand="iesde"] .upaep__subtext {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__subtext {
    font: var(--iesde-text-p3-medium);
}

[data-brand="iesde"] .upaep__caption {
    color: var(--ui-text-muted);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__caption {
    font: var(--iesde-text-p4-small);
}

/* Antetítulo de sección. ⚠ Va por las VARIABLES del componente, no por
   `color`/`font` a pelo: esta regla pesa (0,2,0) y el componente pinta su
   color con (0,1,0), así que un `color:` aquí gana a cualquier ajuste
   posterior hecho por token —y deja muertas las variables para todos los
   que revistan un overline más abajo—. Solo van como propiedad las tres
   cosas que el componente NO expone: familia, interlínea y versalitas. */
[data-brand="iesde"] .upaep__overline {
    --upaep-overline-color: var(--iesde-turquoise-deep);
    font-family: var(--ui-font-base);
    text-transform: uppercase;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__overline {
    --upaep-overline-fw: var(--upaep-fw-semibold);
    --upaep-overline-fz: 12px;
    line-height: 1.4;
    letter-spacing: 2px;
}

/*? =====================================================================
    3. COMPONENTES
    Reviste componentes EXISTENTES del uikit a través de sus propias
    variables. No define componentes nuevos; cuando la marca pide una
    variante que el uikit no tiene, se añade como MODIFICADOR.
    ===================================================================== */

/*? ------ Botón ------
    Pastilla de 30px, 15px/500, padding 10px 24px. Los colores llegan por
    los roles; aquí van forma y los deshabilitados, que el sistema define
    con color propio por variante (no con opacidad). */
/* ⚠ La FORMA (pastilla, alto, ancho mínimo) va SOLO en las variantes
   públicas, nunca en la clase base `.upaep__btn`.

   Motivo: el runtime construye los botones internos de muchos componentes
   con esa misma clase base —`upaep__btn __selectpicker is-close`,
   `upaep__btn __dropzone`, `upaep__btn __back`, el +/− del Numberpicker…—.
   Vestir la base les mete 140px de ancho mínimo y pastilla de 30px, y los
   deforma. Regla general de esta capa: revestir variantes, no bases.

   ⚠ La lista se amplía con cuidado: hay variantes de COLOR que también son
   internas. `__success` y `__blue` parecen hermanas de `__primary`, pero el
   runtime las construye siempre junto a `__signature`
   (`upaep__btn __signature __rounded __success __save`), así que vestirlas
   deforma los botones del componente Signature. Comprobado en script.js. */
[data-brand="iesde"] .upaep__btn.__primary,
[data-brand="iesde"] .upaep__btn.__secondary,
[data-brand="iesde"] .upaep__btn.__tertiary,
[data-brand="iesde"] .upaep__btn.__dark,
[data-brand="iesde"] .upaep__btn.__iesde-cta,
[data-brand="iesde"] .upaep__btn.__underline,
[data-brand="iesde"] .upaep__btn.__light {
    --upaep-btn-opacity-disabled: 1;
    white-space: nowrap;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__primary,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__secondary,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__tertiary,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__dark,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__iesde-cta,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__underline,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__light {
    --upaep-btn-border-radius: var(--iesde-radius-pill);
    --upaep-btn-hover-border-radius: var(--iesde-radius-pill);
    --upaep-btn-padding: 10px 24px;
    --upaep-btn-margin: 0;
    --upaep-btn-fz: 15px;
    --upaep-btn-fw: var(--upaep-fw-medium);
    --upaep-btn-cont-fz: 15px;
    min-width: 140px;
    gap: 10px;
}

[data-brand="iesde"] .upaep__btn.__primary svg,
[data-brand="iesde"] .upaep__btn.__secondary svg,
[data-brand="iesde"] .upaep__btn.__tertiary svg,
[data-brand="iesde"] .upaep__btn.__dark svg,
[data-brand="iesde"] .upaep__btn.__iesde-cta svg,
[data-brand="iesde"] .upaep__btn.__underline svg,
[data-brand="iesde"] .upaep__btn.__light svg {
    flex: 0 0 auto;
}

[data-brand="iesde"] .upaep__btn.__primary {
    --upaep-btn-disabled-bg: var(--iesde-primary-disabled);
    --upaep-btn-disabled-border-color: var(--iesde-primary-disabled);
    --upaep-btn-disabled-color: #ffffff;
    --upaep-btn-disabled-cont-color: #ffffff;
}

[data-brand="iesde"] .upaep__btn.__secondary {
    --upaep-btn-disabled-bg: var(--iesde-secondary-disabled);
    --upaep-btn-disabled-border-color: var(--iesde-secondary-disabled);
    --upaep-btn-disabled-color: #ffffff;
    --upaep-btn-disabled-cont-color: #ffffff;
}

[data-brand="iesde"] .upaep__btn.__dark {
    --upaep-btn-bg: var(--iesde-gray-dark);
    --upaep-btn-border-color: var(--iesde-gray-dark);
    --upaep-btn-color: #ffffff;
    --upaep-btn-cont-color: #ffffff;
    --upaep-btn-hover-bg: var(--iesde-dark-hover);
    --upaep-btn-hover-border-color: var(--iesde-dark-hover);
    --upaep-btn-hover-color: #ffffff;
    --upaep-btn-disabled-bg: var(--iesde-dark-disabled);
    --upaep-btn-disabled-border-color: var(--iesde-dark-disabled);
    --upaep-btn-disabled-color: #ffffff;
}

/* CTA verde sólido (v2). Modificador de .upaep__btn: el uikit no tiene una
   variante verde, y esta no es el secundario —el secundario es el turquesa
   accionable #186d63, y aquí ese tono es el HOVER—.

   Es el único botón del sistema que se mueve al pasar el ratón: la matriz de
   estados de v2 lo define como "#186d63 + translateY(-2px)". El
   desplazamiento va aquí y no en una variable del core porque el componente
   no expone transform. */
[data-brand="iesde"] .upaep__btn.__iesde-cta {
    --upaep-btn-bg: var(--iesde-green-cta);
    --upaep-btn-border-color: var(--iesde-green-cta);
    --upaep-btn-color: #ffffff;
    --upaep-btn-cont-color: #ffffff;
    --upaep-btn-hover-bg: var(--iesde-cta-hover);
    --upaep-btn-hover-border-color: var(--iesde-cta-hover);
    --upaep-btn-hover-color: #ffffff;
    --upaep-btn-disabled-bg: var(--iesde-cta-disabled);
    --upaep-btn-disabled-border-color: var(--iesde-cta-disabled);
    --upaep-btn-disabled-color: #ffffff;
    transition: background var(--iesde-transition-fast) ease-out,
        transform var(--iesde-transition-fast) ease-out;
}

[data-brand="iesde"] .upaep__btn.__iesde-cta:hover:not(:disabled) {
    transform: translateY(-2px);
}

/* v2: "los estados deshabilitados no cambian de tamaño ni pierden el icono:
   solo bajan de contraste y cambian el cursor". */
[data-brand="iesde"] .upaep__btn.__iesde-cta:disabled {
    transform: none;
}

/* Texto con subrayado de acento: el uikit ya lo pinta con --ui-accent. */
[data-brand="iesde"] .upaep__btn.__underline {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__underline {
    --upaep-btn-border-radius: 0;
    --upaep-btn-hover-border-radius: 0;
    --upaep-btn-padding: 6px 2px;
    min-width: auto;
}

/* Enlace de texto azul. */
[data-brand="iesde"] .upaep__btn.__light {
    --upaep-btn-bg: transparent;
    --upaep-btn-border-color: transparent;
    --upaep-btn-color: var(--ui-link);
    --upaep-btn-cont-color: var(--ui-link);
    --upaep-btn-hover-bg: transparent;
    --upaep-btn-hover-border-color: transparent;
    --upaep-btn-hover-color: var(--ui-link-hover);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__light {
    --upaep-btn-padding: 10px 0;
    min-width: auto;
}

/*? ------ Navbar ------
    Tres cosas del componente que condicionan el revestido:
      · el FONDO y la ALTURA viven en .upaep__navbar-content, no en el <nav>
        → el radio y el overflow van ahí;
      · los 84px no pueden ser `height` fijo: el -collapse es hijo del
        -content y en móvil se abre con max-height → altura auto + min-height;
      · --upaep-navbar-item-padding se aplica al <li> Y al <a> (mismo
        selector) → se deja en 0 y el respiro va solo en el enlace. */
[data-brand="iesde"] .upaep__navbar {
    /* v2 pinta la barra con el navy de BARRA (#0c2a3f), un punto más oscuro
       que el navy de marca (#0b2b40) que usan los fondos y los títulos. */
    --upaep-navbar-bg: var(--iesde-navy-deep);
    --upaep-navbar-boxshadow: none;
    --upaep-navbar-brand-color: #ffffff;
    --upaep-navbar-item-color: #ffffff;
    --upaep-navbar-item-bg: transparent;
    --upaep-navbar-item-hover-color: #ffffff;
    --upaep-navbar-item-hover-bg: transparent;
    --upaep-navbar-item-active-color: #ffffff;
    --upaep-navbar-item-active-bg: transparent;
    --upaep-navbar-btn-mark-color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar {
    --upaep-navbar-height: auto;
    --upaep-navbar-padding: 0 40px;
    --upaep-navbar-items-padding: 0;
    --upaep-navbar-item-padding: 0;
    --upaep-navbar-item-fz: 13px;
    --upaep-navbar-item-fw: var(--upaep-fw-regular);
    --upaep-navbar-item-hover-fz: 13px;
    --upaep-navbar-item-hover-fw: var(--upaep-fw-regular);
    --upaep-navbar-item-active-fz: 13px;
    --upaep-navbar-item-active-fw: var(--upaep-fw-regular);
}

[data-brand="iesde"] .upaep__navbar .upaep__navbar-content {
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-content {
    min-height: 84px;
    border-radius: var(--iesde-radius-tab);
}

[data-brand="iesde"] .upaep__navbar .upaep__navbar-brand {
    display: flex;
    align-items: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-brand {
    gap: 12px;
}

[data-brand="iesde"] .upaep__navbar .upaep__navbar-brand img {
    display: block;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-brand img {
    height: 30px;
    width: auto;
}

[data-brand="iesde"] .upaep__navbar .upaep__navbar-items {
    flex-wrap: wrap;
    align-items: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-items {
    gap: 22px;
}

/* El realce no es un fondo: es un subrayado turquesa. */
[data-brand="iesde"] .upaep__navbar .upaep__navbar-link {
    white-space: nowrap;
    text-decoration-line: underline;
    text-decoration-thickness: 2px;
    text-underline-offset: 5px;
    text-decoration-color: transparent;
    transition: text-decoration-color var(--iesde-transition-fast);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-link {
    padding-bottom: 3px;
    letter-spacing: .3px;
}

[data-brand="iesde"] .upaep__navbar .upaep__navbar-link:hover,
[data-brand="iesde"] .upaep__navbar .upaep__navbar-link.is-active {
    text-decoration-color: var(--iesde-turquoise);
}

/*? ------ Tabs ------
    OJO: el componente cambia padding, tamaño y peso en :hover y en
    .is-active:hover con variables PROPIAS (--…-hover-fz/-fw/-padding, cuyos
    defaults son .5rem / 16px / bold). Si solo se define el estado normal, al
    pasar el ratón la pestaña salta de tamaño. Por eso aquí se declaran los
    cuatro estados con los mismos valores: en IESDE el hover NO cambia la
    métrica, solo el color.

    Métrica del sistema: 16px en todas; la activa se distingue por color
    navy + negrita + riel inferior navy-activo (NO crece). */
[data-brand="iesde"] .upaep__tab {



    --upaep-tab-tabitem-color: var(--ui-text-muted);
    --upaep-tab-tabitem-hover-color: var(--ui-text-strong);
    --upaep-tab-tabitem-active-color: var(--ui-text-strong);
    --upaep-tab-tabitem-active-hover-color: var(--ui-text-strong);

    --upaep-tab-tabitem-bg: transparent;
    --upaep-tab-tabitem-hover-bg: transparent;
    --upaep-tab-tabitem-active-bg: transparent;
    --upaep-tab-tabitem-active-hover-bg: transparent;


    --upaep-tab-tabitem-hover-boxshadow: none;
    --upaep-tab-boxshadow: none;
    --upaep-tab-tabscontent-bg: transparent;
    --upaep-tab-tabscontent-boxshadow: none;

    /* El riel NO se dibuja con el borde del contenedor ni con el elemento
       "underline" del uikit: en el sistema cada pestaña lleva SU propio
       border-bottom de 4px, y la activa solo le cambia el color. Con las dos
       piezas del uikit el riel gris y el navy quedan en alturas distintas y
       se ve un escalón. */
    --upaep-tab-tabitem-underline-height: 0;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tab {
    --upaep-tab-tabitem-padding: 10px 26px;
    --upaep-tab-tabitem-hover-padding: 10px 26px;
    --upaep-tab-tabitem-active-padding: 10px 26px;
    --upaep-tab-tabitem-active-hover-padding: 10px 26px;
    --upaep-tab-tabitem-fz: 16px;
    --upaep-tab-tabitem-hover-fz: 16px;
    --upaep-tab-tabitem-active-fz: 16px;
    --upaep-tab-tabitem-active-hover-fz: 16px;
    --upaep-tab-tabitem-fw: var(--upaep-fw-regular);
    --upaep-tab-tabitem-hover-fw: var(--upaep-fw-regular);
    --upaep-tab-tabitem-active-fw: var(--upaep-fw-bold);
    --upaep-tab-tabitem-active-hover-fw: var(--upaep-fw-bold);
    --upaep-tab-tabitem-border-radius: 0;
    --upaep-tab-tabitem-hover-border-radius: 0;
    --upaep-tab-tabitem-active-border-radius: 0;
    --upaep-tab-tabitem-active-hover-border-radius: 0;
    --upaep-tab-tabscontent-padding: 16px 0 0;
    --upaep-tab-tabs-border-bottom-size: 0;
}

/* Las pestañas se reparten el ancho por igual. `white-space` y `word-break`
   son necesarios porque el componente trae `text-wrap: balance` y
   `word-break: break-word`: sin esto, "Ed. continua" y "Opción 2" se parten
   en dos renglones y las pestañas quedan de distinta altura. */
[data-brand="iesde"] .upaep__tab .upaep__tab-item {
    flex: 1 0 0;
    text-align: center;
    white-space: nowrap;
    text-wrap: nowrap;
    word-break: normal;
    border-bottom: 4px solid var(--ui-border-subtle);
}

[data-brand="iesde"] .upaep__tab .upaep__tab-item.is-active {
    border-bottom-color: var(--iesde-navy-active);
}

/* Variante sólida: todas a 18px sobre gris, la activa en turquesa de marca.
   ⚠ Blanco sobre #22a798 = 2.98:1 — es como lo define IESDE. */
[data-brand="iesde"] .upaep__tab.__iesde-solid {

    --upaep-tab-tabitem-bg: var(--iesde-tab-inactive-bg);
    --upaep-tab-tabitem-hover-bg: var(--iesde-tab-inactive-bg);
    --upaep-tab-tabitem-active-bg: var(--iesde-turquoise);
    --upaep-tab-tabitem-active-hover-bg: var(--iesde-turquoise);
    --upaep-tab-tabitem-active-color: #ffffff;
    --upaep-tab-tabitem-active-hover-color: #ffffff;


    --upaep-tab-tabitem-underline-height: 0;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tab.__iesde-solid {
    --upaep-tab-tabitem-fz: 18px;
    --upaep-tab-tabitem-hover-fz: 18px;
    --upaep-tab-tabitem-active-fz: 18px;
    --upaep-tab-tabitem-active-hover-fz: 18px;
    --upaep-tab-tabitem-border-radius: 8px 8px 0 0;
    --upaep-tab-tabitem-hover-border-radius: 8px 8px 0 0;
    --upaep-tab-tabitem-active-border-radius: 8px 8px 0 0;
    --upaep-tab-tabitem-active-hover-border-radius: 8px 8px 0 0;
    --upaep-tab-tabs-border-bottom-size: 0;
}

[data-brand="iesde"] .upaep__tab.__iesde-solid .upaep__tab-item,
[data-brand="iesde"] .upaep__tab.__iesde-pill .upaep__tab-item {
    border-bottom: none;
}

[data-brand="iesde"] .upaep__tab.__iesde-solid .upaep__tab-item {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tab.__iesde-solid .upaep__tab-item {
    margin-right: 2px;
}

[data-brand="iesde"] .upaep__tab.__iesde-solid .upaep__tab-item:last-child {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tab.__iesde-solid .upaep__tab-item:last-child {
    margin-right: 0;
}

/* Variante de pastillas separadas.
   ⚠ La guía la marca como posiblemente experimental y su azul #0085FF no
   pertenece a ninguna de las dos paletas de la marca. */
[data-brand="iesde"] .upaep__tab.__iesde-pill {

    --upaep-tab-tabitem-bg: var(--ui-surface-3);
    --upaep-tab-tabitem-hover-bg: var(--ui-surface-3);
    --upaep-tab-tabitem-active-bg: rgba(0, 133, 255, .1);
    --upaep-tab-tabitem-active-hover-bg: rgba(0, 133, 255, .1);
    --upaep-tab-tabitem-active-color: #0085ff;
    --upaep-tab-tabitem-active-hover-color: #0085ff;


    --upaep-tab-tabitem-underline-height: 0;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tab.__iesde-pill {
    --upaep-tab-tabitem-fz: 18px;
    --upaep-tab-tabitem-hover-fz: 18px;
    --upaep-tab-tabitem-active-fz: 18px;
    --upaep-tab-tabitem-active-hover-fz: 18px;
    --upaep-tab-tabitem-border-radius: 8px;
    --upaep-tab-tabitem-hover-border-radius: 8px;
    --upaep-tab-tabitem-active-border-radius: 8px;
    --upaep-tab-tabitem-active-hover-border-radius: 8px;
    --upaep-tab-tabs-border-bottom-size: 0;
}

/* El uikit no expone separación por pestaña: va como gap del contenedor. */
[data-brand="iesde"] .upaep__tab.__iesde-pill .upaep__tabs-item {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tab.__iesde-pill .upaep__tabs-item {
    gap: 10px;
}

/*? ------ Acordeón (details/summary, sin JS) ------
    Cabecera alta, separador grueso y marca circular turquesa de la marca. */
[data-brand="iesde"] .upaep__details-accordion {
    --upaep-details-accordion-bg: var(--ui-surface);
    --upaep-details-accordion-border-color: var(--ui-border-subtle);
    --upaep-details-accordion-summary-color: var(--ui-text);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion {
    --upaep-details-accordion-border-size: 3px;
    --upaep-details-accordion-border-radius: 0;
    --upaep-details-accordion-padding: 22px 28px;
    --upaep-details-accordion-summary-fz: 22px;
    --upaep-details-accordion-summary-fw: var(--upaep-fw-semibold);
}

/* El componente baja la opacidad del resumen a .75; IESDE lo quiere pleno. */
[data-brand="iesde"] .upaep__details-accordion .upaep__details-summary {
    opacity: 1;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion .upaep__details-summary {
    gap: 20px;
}

/* La marca del uikit es un background-image en ::after y se cambia por otra
   imagen al abrir. IESDE no cambia de icono: GIRA el mismo "+" 45° hasta
   convertirlo en "×", y eso una imagen de fondo no lo puede hacer. Por eso
   se apaga la marca del componente y el icono va inline en el <summary>. */
/* ⚠ El `:not(.__iesde-offer)` es imprescindible: sin él esta regla (0,3,0)
   apaga TAMBIÉN la marca del acordeón de oferta académica de la capa 4, que
   sí se apoya en el ::after del componente —ahí el icono no gira, se
   sustituye— y se quedaría sin galón. */
[data-brand="iesde"] .upaep__details-accordion:not(.__iesde-offer) .upaep__details-summary::after {
    content: none;
}

[data-brand="iesde"] .upaep__details-accordion .__iesde-acc-icon {
    flex: 0 0 auto;
    color: var(--iesde-turquoise);
    transition: transform var(--iesde-transition-medium);
}

[data-brand="iesde"] .upaep__details-accordion[open] .__iesde-acc-icon {
    transform: rotate(45deg);
}

/* Contenido: color y tamaño del sistema. */
[data-brand="iesde"] .upaep__details-accordion>div {
    color: var(--ui-text-muted);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion>div {
    font: var(--iesde-text-p2-body);
}

/* Variante de pregunta grande (Sora Light). */
[data-brand="iesde"] .upaep__details-accordion.__iesde-lg {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-lg {
    --upaep-details-accordion-summary-fz: 30px;
    --upaep-details-accordion-summary-fw: var(--upaep-fw-light);
}

/* Grupo de acordeones: en el sistema, la caja con borde y sombra envuelve al
   conjunto, no a cada pregunta. El uikit no tiene contenedor de grupo para
   la variante <details>, así que esto es una clase decorativa de marca —no un
   componente— y por eso lleva el prefijo __iesde-. */
[data-brand="iesde"] .__iesde-accordion-group {
    background: var(--ui-surface);
    border: 1px solid var(--iesde-border-card);
    box-shadow: var(--ui-shadow);
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-accordion-group {
    border-radius: var(--iesde-radius-xs);
}

/*? ------ Cards ------
    Las del sistema son .upaep__card con un modificador; se apoyan en sus
    hijos reales (-img, -content, -title, -subtitle, -text). El card del
    uikit es `flex-direction: column; align-items: center`, así que lo que
    debe ocupar el ancho lo pide explícitamente.

    Mapa v2 → modificador de esta capa:
      card de elección (Soy empresario / Soy directivo) .__iesde-promo
      KnowhowerCard (carrusel de claustro)              .__iesde-compact
      card editorial / blog                             .__iesde-editorial
      card de testimonial                               .__iesde-testimonial
      card de atributo con riel                         .__iesde-feature

    ⚠ .__iesde-feature viene de v1 y v2 no la incluye en su set de cards,
    pero tampoco la retira (a diferencia del dorado, que desaparece de la
    hoja entera). Se conserva. */
/* OJO al contrato del componente: `--upaep-card-img-*` y `--upaep-card-icon-*`
   dimensionan la <img> INTERIOR; el contenedor se controla con
   `--upaep-card-img-content-*` y `--upaep-card-icon_content-*` (sí, con guion
   bajo). Como aquí dentro va un <div> y no una <img>, hay que usar los
   `-content-`: con los otros el contenedor se queda en su 100% por defecto. */
[data-brand="iesde"] .upaep__card {
    --upaep-card-bg: var(--ui-surface);
    --upaep-card-boxshadow: var(--ui-shadow);
    --upaep-card-border-color: var(--iesde-border-card);
    /* sin esto la card no puede encogerse y desborda su celda del grid */
    --upaep-card-title-color: var(--ui-text-strong);
    --upaep-card-subtitle-color: var(--ui-text-muted);
    --upaep-card-text-color: var(--ui-text);
    --upaep-card-header-bg: transparent;
    --upaep-card-header-color: var(--ui-text-strong);
    --upaep-card-header-border-bottom-color: var(--iesde-border-card);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card {
    --upaep-card-border-radius: var(--iesde-radius-card);
    --upaep-card-border-size: 1px;
    --upaep-card-content-padding: 24px;
    --upaep-card-margin: 0;
    --upaep-card-minwidth: 0;
    min-width: 0;
    --upaep-card-title-fw: var(--upaep-fw-semibold);
}

/* Los títulos y textos del card son <p>: hay que neutralizar el margen que
   la capa tipográfica les pone. */
[data-brand="iesde"] .upaep__card p {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card p {
    margin: 0;
}

/*? Elevación de las cards del home (v2) ------------------------------------
    Las cards de marketing no usan el nivel 1 de sombra: tienen la suya,
    más profunda y en tono navy. El hover NO cambia el color de nada, solo
    sube la pieza 6px y profundiza la sombra.

    Va como clase aparte y no en el modificador de cada variante porque en
    v2 la elevación es una propiedad del CONTEXTO (una card del home), no de
    la variante: la misma card editorial va elevada en el home y plana en un
    listado. Se combina: `upaep__card __iesde-editorial __iesde-elevated`. */
[data-brand="iesde"] .upaep__card.__iesde-elevated,
[data-brand="iesde"] .__iesde-elevated {
    --upaep-card-boxshadow: var(--iesde-shadow-home);
    box-shadow: var(--iesde-shadow-home);
    transition: transform 280ms var(--iesde-ease-lift),
        box-shadow 280ms ease-out;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-elevated,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-elevated {
    --upaep-card-border-size: 0;
}

[data-brand="iesde"] .upaep__card.__iesde-elevated:hover,
[data-brand="iesde"] .__iesde-elevated:hover {
    --upaep-card-boxshadow: var(--iesde-shadow-home-hover);
    box-shadow: var(--iesde-shadow-home-hover);
    transform: translateY(var(--iesde-lift-home));
}

/* 1 · Card de elección ("Soy empresario" / "Soy directivo").
   v2 la rehace: se van la franja turquesa del 16% y la esquina con textura,
   y la barra inferior deja de ser navy plano para llevar un GRADIENTE de
   marca. El gradiente no se fija aquí: se pasa por --iesde-card-bar, así que
   la misma clase sirve para las dos cards del home (azul empresario y verde
   directivo) sin un modificador por color. */
[data-brand="iesde"] .upaep__card.__iesde-promo {
    --iesde-card-bar: var(--iesde-gradient-empresario);
    --upaep-card-boxshadow: var(--iesde-shadow-home);
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-promo {
    --upaep-card-maxwidth: none;
    --upaep-card-border-radius: var(--iesde-radius-main);
    --upaep-card-border-size: 0;
    --upaep-card-content-padding: 0;
    --upaep-card-content-width: 100%;
    --upaep-card-img-content-width: 100%;
    --upaep-card-img-content-height: 240px;
    --upaep-card-img-content-border-radius: 0;
    width: 100%;
}

[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-img {
    overflow: hidden;
}

[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-content {
    display: flex;
    align-items: center;
    background: var(--iesde-card-bar);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-content {
    gap: 16px;
    padding: 26px;
    min-height: 110px;
}

[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-title {
    flex: 1 1 auto;
    color: #ffffff;
    text-align: left;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-title {
    font: 600 23px/1.22 var(--ui-font-base);
}

/* La acción ya no es un bloque de 88px a sangre: es un aro de 34px con un
   "+" dentro, sobre el propio gradiente. */
[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-button {
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    border: 1.6px solid rgba(255, 255, 255, .9);
    background: transparent;
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-button {
    width: 34px;
    height: 34px;
    border-radius: 50%;
}

/* Las dos cards del home: mismo patrón, distinto gradiente. */
[data-brand="iesde"] .upaep__card.__iesde-promo.__iesde-directivo {
    --iesde-card-bar: var(--iesde-gradient-directivo);
}

[data-brand="iesde"] .upaep__card.__iesde-promo.__iesde-medida {
    --iesde-card-bar: var(--iesde-gradient-medida);
}


/*? ⚠ El reparto vertical de la card: `flex: 0 0 auto` en las dos piezas.
    -----------------------------------------------------------------------
    El core deja `.upaep__card-content` con `flex: 1 1 auto` y el
    `.upaep__card-img` con el shrink por defecto. En una card cuyas dos
    piezas tienen alto propio —foto de 240px + barra de 110px— eso hace que
    el contenido CREZCA y la foto se COMPRIMA: medido, la foto de la card de
    elección caía de 240px a 133px y la barra del gradiente se estiraba a
    217px, que es lo que la hacía verse desproporcionada. En el testimonial
    el mismo efecto achataba el retrato circular a 120×91 y lo dejaba
    elíptico.

    Se fija en las variantes que tienen alto propio; no en la base, para no
    tocar las cards que sí quieren que el contenido llene. */
[data-brand="iesde"] .upaep__card:is(.__iesde-promo, .__iesde-testimonial, .__iesde-compact, .__iesde-editorial)>.upaep__card-img,
[data-brand="iesde"] .upaep__card:is(.__iesde-promo, .__iesde-testimonial, .__iesde-compact, .__iesde-editorial)>.upaep__card-content {
    flex: 0 0 auto;
    /* El core le pone `height: 100%`, que en una columna flex se resuelve
       contra el alto de la card y la vuelve a estirar. */
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card:is(.__iesde-promo, .__iesde-testimonial, .__iesde-compact, .__iesde-editorial)>.upaep__card-img,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card:is(.__iesde-promo, .__iesde-testimonial, .__iesde-compact, .__iesde-editorial)>.upaep__card-content {
    height: auto;
}

/* 2 · Testimonial. v2 lo rehace por completo: deja el navy plano y el
   retrato rectangular a sangre, y pasa a GRADIENTE vertical con un retrato
   CIRCULAR de 120px con aro turquesa. El cargo sigue en Manuale pero ya no
   va en cursiva (v2 lo declara en redonda).

   El retrato deja de ser el -img a sangre: al ser circular y centrado, va
   dentro del -content, así que aquí el contenedor de imagen se apaga. */
[data-brand="iesde"] .upaep__card.__iesde-testimonial {
    --upaep-card-boxshadow: var(--iesde-shadow-testimonial);
    --upaep-card-bg: transparent;
    background: var(--iesde-gradient-testimonial);
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial {
    --upaep-card-maxwidth: none;
    --upaep-card-border-radius: var(--iesde-radius-main);
    --upaep-card-border-size: 0;
    --upaep-card-img-content-width: 120px;
    --upaep-card-img-content-height: 120px;
    --upaep-card-img-content-border-radius: 50%;
    --upaep-card-content-width: 100%;
    --upaep-card-content-padding: 22px 26px 0;
    width: 100%;
    padding: 30px 26px 36px;
}

/* El aro del retrato: 3px del turquesa claro de la familia verde. */
[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-img {
    border: 3px solid var(--iesde-green-ring);
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-img {
    width: 120px;
    height: 120px;
    margin-inline: auto;
    border-radius: 50%;
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-content {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-title {
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-title {
    font: 400 27px/1.2 var(--ui-font-base);
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-subtitle {
    color: rgba(255, 255, 255, .9);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-subtitle {
    font: 400 17px/1.4 var(--iesde-font-editorial);
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-text {
    color: rgba(255, 255, 255, .94);
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-text {
    font: 400 16px/1.5 var(--ui-font-base);
}

/* Variante secundaria del carrusel: el mismo patrón en el gradiente pálido.
   En v2 la pieza CENTRAL del carrusel es la que va con el gradiente fuerte y
   escala 1.075; las laterales llevan este. */
[data-brand="iesde"] .upaep__card.__iesde-testimonial.__iesde-muted {
    background: var(--iesde-gradient-testimonial-2);
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial.__iesde-featured {
    transform: scale(1.075);
}

/* 3 · Compacta (KnowhowerCard) — la ficha del carrusel de claustro.
   v2 le cambia el pie: deja el gris oscuro plano y toda la card pasa a un
   gradiente verde. Ancho fijo de 168px porque vive en una fila deslizable,
   no en una rejilla. */
[data-brand="iesde"] .upaep__card.__iesde-compact {
    --upaep-card-boxshadow: 0 6px 20px rgba(11, 43, 64, .14);
    --upaep-card-bg: transparent;
    --upaep-card-content-bg: transparent;
    flex: 0 0 168px;
    background: var(--iesde-gradient-knowhower);
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-compact {
    --upaep-card-maxwidth: none;
    --upaep-card-border-radius: var(--iesde-radius-main);
    --upaep-card-border-size: 0;
    --upaep-card-img-content-width: 100%;
    --upaep-card-img-content-height: 120px;
    --upaep-card-img-content-border-radius: 0;
    --upaep-card-content-width: 100%;
    --upaep-card-content-padding: 16px 14px 18px;
    width: 168px;
}

[data-brand="iesde"] .upaep__card.__iesde-compact .upaep__card-content {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    background: transparent;
}

[data-brand="iesde"] .upaep__card.__iesde-compact .upaep__card-title {
    color: #ffffff;
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-compact .upaep__card-title {
    font: 400 15px/1.25 var(--ui-font-base);
}

/* Regla divisoria de las dos cards de perfil. v2 las separa: la del
   testimonial va a todo el ancho y DEGRADADA (se apaga en los extremos); la
   de la knowhower sigue siendo una línea plana al 78%. */
[data-brand="iesde"] .upaep__card.__iesde-testimonial hr,
[data-brand="iesde"] .upaep__card.__iesde-compact hr {
    border: 0;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial hr,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-compact hr {
    height: 1px;
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial hr {
    background: linear-gradient(90deg,
            rgba(255, 255, 255, .05),
            rgba(255, 255, 255, .6),
            rgba(255, 255, 255, .05));
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial hr {
    width: 100%;
    margin: 14px 0 0;
}

[data-brand="iesde"] .upaep__card.__iesde-compact hr {
    background: rgba(255, 255, 255, .4);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-compact hr {
    width: 78%;
    margin: 14px auto;
}

/* Acción centrada de ambas cards de perfil. */
[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-button,
[data-brand="iesde"] .upaep__card.__iesde-compact .upaep__card-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-button,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-compact .upaep__card-button {
    gap: 8px;
    font-weight: var(--upaep-fw-regular);
    font-size: 13px;
}

[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-button {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-button {
    margin-top: 20px;
}

/* 4 · Editorial / blog (v2, nueva). Foto arriba, antetítulo turquesa + fecha
   en una línea, título navy y "Leer más" en versalitas.

   El antetítulo y la fecha comparten renglón y se separan a los extremos;
   como el card del uikit centra sus hijos, el par va en un -header al que
   aquí se le quitan el fondo y el borde inferior. */
[data-brand="iesde"] .upaep__card.__iesde-editorial {
    --upaep-card-boxshadow: var(--iesde-shadow-home);
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial {
    --upaep-card-maxwidth: none;
    --upaep-card-border-radius: var(--iesde-radius-main);
    --upaep-card-border-size: 0;
    --upaep-card-img-content-width: 100%;
    --upaep-card-img-content-height: 210px;
    --upaep-card-img-content-border-radius: 0;
    --upaep-card-content-width: 100%;
    --upaep-card-content-padding: 24px 26px 26px;
    width: 100%;
}

[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-header {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    background: transparent;
    border-bottom: 0;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-header {
    gap: 14px;
    width: 100%;
    padding: 0;
}

[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-content {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
}

/* Antetítulo de categoría: versalitas turquesa. Por variable, no con `font`
   y `color` a pelo (ver la nota de la clase base en la capa 2). */
[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__overline {
    --upaep-overline-color: var(--iesde-turquoise-deep);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__overline {
    --upaep-overline-fw: var(--upaep-fw-bold);
    --upaep-overline-fz: 12px;
    letter-spacing: .08em;
}

[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-subtitle {
    color: var(--iesde-text-meta);
    white-space: nowrap;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-subtitle {
    font: 400 13px var(--ui-font-base);
}

[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-title {
    color: var(--iesde-navy);
    text-align: left;
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-title {
    margin-top: 14px;
    font: 700 21px/1.3 var(--ui-font-base);
}

[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-text {
    color: var(--iesde-prose);
    text-align: left;
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-text {
    margin-top: 12px;
    font: 400 15px/1.55 var(--ui-font-base);
}

/* "Leer más": el gesto del hover es que la flecha se SEPARA del texto
   (crece el gap), no que cambie de color de fondo. */
[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-button {
    display: inline-flex;
    align-items: center;
    text-transform: uppercase;
    color: var(--iesde-navy);
    transition: gap 180ms ease-out, color 180ms ease-out;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial .upaep__card-button {
    gap: 10px;
    margin-top: 28px;
    font: 700 13px var(--ui-font-base);
    letter-spacing: .08em;
}

[data-brand="iesde"] .upaep__card.__iesde-editorial:hover .upaep__card-button {
    color: var(--iesde-turquoise-deep);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-editorial:hover .upaep__card-button {
    gap: 16px;
}

/* 5 · Feature — riel turquesa con caja de icono, cuerpo azul medio.
   ⚠ Viene de v1: v2 no la lista entre sus cards, pero tampoco la retira. */
[data-brand="iesde"] .upaep__card.__iesde-feature {
    --upaep-card-boxshadow: none;
    --upaep-card-bg: var(--iesde-blue);
    /* Contenedores, no la <img>: el riel y la caja del icono. */
    flex-direction: row;
    align-items: stretch;
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature {
    --upaep-card-maxwidth: none;
    --upaep-card-minheight: 260px;
    --upaep-card-border-radius: 2px;
    --upaep-card-border-size: 0;
    --upaep-card-content-padding: 28px 32px;
    --upaep-card-img-content-width: 72px;
    --upaep-card-img-content-height: auto;
    --upaep-card-img-content-border-radius: 0;
    --upaep-card-icon_content-width: 72px;
    --upaep-card-icon_content-height: 62px;
    --upaep-card-icon_content-border-radius: 0;
    width: 100%;
}

/* El riel: 72px de ancho, turquesa, de arriba abajo, con la caja del icono
   pegada arriba (el componente centra sus hijos por defecto). */
[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-img {
    flex: 0 0 72px;
    align-self: stretch;
    align-items: flex-start;
    justify-content: flex-start;
    background: var(--iesde-turquoise);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-img {
    width: 72px;
}

[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-icon {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--iesde-gray-light);
    color: var(--iesde-navy);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-icon {
    width: 72px;
    height: 62px;
    border-radius: 0;
}

[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-content {
    flex: 1 1 auto;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-content {
    min-width: 0;
}

[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-content {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-content {
    gap: 16px;
}

[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-title {
    color: #ffffff;
    text-align: left;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-title {
    font: 600 26px/1.2 var(--ui-font-base);
}

[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-text {
    color: #ffffff;
    text-align: left;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-text {
    font: 400 15px/1.55 var(--ui-font-base);
}

/* La pastilla blanca: es el botón terciario, sin borde y con texto navy. */
[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__btn.__tertiary {
    --upaep-btn-bg: #ffffff;
    --upaep-btn-hover-bg: #ffffff;
    --upaep-btn-color: var(--iesde-navy);
    --upaep-btn-cont-color: var(--iesde-navy);
    --upaep-btn-hover-color: var(--iesde-navy);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__btn.__tertiary {
    --upaep-btn-border-size: 0;
    --upaep-btn-fw: var(--upaep-fw-semibold);
    --upaep-btn-fz: 14px;
    --upaep-btn-padding: 11px 22px;
    min-width: auto;
}

/*? ------ Campos de formulario ------
    El input del uikit trae borde de 2px y ADEMÁS un borde inferior propio
    (--upaep-input-border-bottom-*, gris oscuro por defecto): esa es la línea
    rara que se ve debajo. IESDE usa un borde parejo de 1px, así que el
    inferior se iguala al resto.
    El <select> es su propia clase (.upaep__select) con sus propias
    variables: no hereda nada de .upaep__input. */
/* ⚠ Misma trampa que con .upaep__btn: `.upaep__input` es una PRIMITIVA
   compartida. El runtime la genera dentro de Selectpicker
   (`upaep__input __selectpicker`), Autocomplete, Tokenfield, Datepicker y el
   Numberpicker. Vestir la clase a secas les cambia relleno, radio y borde de
   foco, y descuadra el control.

   Por eso la geometría se aplica solo cuando el input está dentro de sus
   contenedores de CAMPO —los que se escriben a mano en un formulario—, no
   cuando lo construye otro componente.

   NOTA: un <textarea> se marca con `.upaep__input`, no con `.upaep__textarea`.
   Esa segunda clase solo existe en el core anidada dentro de
   `.upaep__input-group` / `.__float-label` y NO consume las variables
   `--upaep-input-*`, así que vestirla no hace nada. */
[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input {
    --upaep-input-border-color: var(--ui-border);
    --upaep-input-border-bottom-color: var(--ui-border);
    --upaep-input-color: var(--ui-text);
    --upaep-input-bg: var(--ui-surface);
    --upaep-input-placeholder-color: var(--ui-text-muted);

    --upaep-input-hover-bg: var(--ui-surface);
    --upaep-input-hover-border-color: var(--iesde-turquoise-deep);
    --upaep-input-hover-border-bottom-color: var(--iesde-turquoise-deep);
    --upaep-input-hover-color: var(--ui-text);

    --upaep-input-focus-bg: var(--ui-surface);
    --upaep-input-focus-color: var(--ui-text);
    --upaep-input-focus-border-color: var(--iesde-turquoise);

    --upaep-input-disabled-bg: var(--ui-surface-3);
    --upaep-input-disabled-opacity: .55;
    --upaep-input-readonly-bg: var(--ui-surface-3);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input {
    --upaep-input-border-size: 1px;
    --upaep-input-border-bottom-size: 1px;
    --upaep-input-border-radius: var(--iesde-radius-sm);
    --upaep-input-padding: 12px 15px;
    --upaep-input-height: auto;
    --upaep-input-fz: 15px;
    --upaep-input-fw: var(--upaep-fw-regular);
    --upaep-input-placeholder-fz: 15px;
    --upaep-input-hover-border-size: 1px;
    --upaep-input-hover-fz: 15px;
    --upaep-input-hover-fw: var(--upaep-fw-regular);
    --upaep-input-focus-border-size: 1px;
}

[data-brand="iesde"] .upaep__select {
    --upaep-select-border-color: var(--ui-border);
    --upaep-select-color: var(--ui-text);
    --upaep-select-bg: var(--ui-surface);
    --upaep-select-focus-bg: var(--ui-surface);
    --upaep-select-focus-color: var(--ui-text);
    --upaep-select-focus-border-color: var(--iesde-turquoise);
    --upaep-select-bg-disabled: var(--ui-surface-3);
    --upaep-select-disabled-opacity: .55;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__select {
    --upaep-select-border-size: 1px;
    --upaep-select-border-radius: var(--iesde-radius-sm);
    --upaep-select-padding: 12px 15px;
    --upaep-select-height: auto;
    --upaep-select-margin: 0;
    --upaep-select-fz: 15px;
    --upaep-select-fw: var(--upaep-fw-regular);
    --upaep-select-focus-border-size: 1px;
}

/* El componente vuelve a declarar `border-bottom` DESPUÉS del `border`
   completo en :hover y :focus, y siempre con la misma variable. Por eso los
   otros tres lados cambian de color y el inferior se queda gris: hay que
   igualarlo estado por estado. */
/* ⚠ Estas dos tienen que EXCLUIR los estados de validación.

   El `border-bottom-color` se declara aquí a pelo porque el componente lo
   re-declara después del `border` completo (ver nota de arriba). El problema
   es la especificidad: `:hover:not(:disabled):not([readonly])` pesa (0,6,0)
   y la regla de error, `…>.upaep__input:is(.is-error, .is-invalid)`, solo
   (0,4,0) —`:is()` cuenta como su argumento más específico, un clase—. Sin
   los `:not()` de abajo, al enfocar o pasar el ratón por un campo con error
   el borde INFERIOR se volvía turquesa mientras los otros tres seguían
   rojos. Excluir los estados aquí es mejor que subir la especificidad de las
   reglas de error: deja que cada estado mande en su propio bloque. */
[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:hover:not(:disabled):not([readonly]):not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    border-bottom-color: var(--iesde-turquoise-deep);
}

[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:focus:not(:disabled):not([readonly]):not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    border-bottom-color: var(--iesde-turquoise);
}

/*? Error y acierto — TODOS los controles (v2) -------------------------------
    v2 añade la matriz de estados del control. Tres decisiones:

    1. NO se toca el `box-shadow`. El anillo de foco del core ya sale de un
       rol —`0 0 0 .25rem var(--ui-control-ring)`— y la marca ya define ese
       rol, así que el anillo es turquesa de IESDE sin sobrescribir nada. La
       geometría (.25rem) es la del componente y se respeta.

    2. El ICONO del estado se queda SIEMPRE visible. El core lo pinta como
       `background-image` en el estado base y lo vuelve a declarar en un
       bloque anidado `&:hover, &:focus` que pesa (0,5,0).
       ⚠ Apagarlo con `background-image: none` desde la marca (0,4,0) hacía
       precisamente lo contrario de lo que parece: lo quitaba en reposo pero
       la regla anidada del core se lo devolvía al pasar el ratón o enfocar,
       así que el icono solo aparecía en hover/focus. Aquí NO se apaga; solo
       se recolorea, y se recolorea en LOS DOS sitios (base y hover/focus)
       para que no cambie de tono al interactuar. El relleno derecho que el
       core reserva para el icono se deja tal cual.

    3. El error vale para TODO el formulario, no solo para el input. Y ahí
       la buena noticia: `.upaep__select`, `.upaep__checkbox`,
       `.upaep__checkbox.__switch` y `.upaep__radio` ya derivan su estado de
       `--ui-danger` / `--ui-danger-hover`, así que basta con que la marca
       defina esos roles —lo hace en la capa 1— y con añadir el `-hover`,
       que faltaba. No hay que repetir el bloque por componente. */

/* El icono de aviso del core viene en el rojo de Bootstrap (#dc3545). Mismo
   glifo, en el rojo de IESDE. */
[data-brand="iesde"] {
    --iesde-icon-error: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' fill='%23b3261e'%3E%3Cpath d='M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3E%3C/svg%3E");
    --iesde-icon-success: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' fill='%23186d63'%3E%3Cpath d='m424-296 282-282-56-56-226 226-114-114-56 56 170 170Zm56 216q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z'/%3E%3C/svg%3E");
}

/* --- Error ---------------------------------------------------------------- */
[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:is(.is-error, .is-invalid) {
    --upaep-input-border-color: var(--iesde-error);
    --upaep-input-border-bottom-color: var(--iesde-error);
    --upaep-input-hover-border-color: var(--iesde-error);
    --upaep-input-hover-border-bottom-color: var(--iesde-error);
    --upaep-input-focus-border-color: var(--iesde-error);
    border-bottom-color: var(--iesde-error);
    background-image: var(--iesde-icon-error);

    /* ⚠ El ALTO del control. Para hacer sitio al icono, el core no añade
       relleno a la derecha: reescribe el padding ENTERO a
       `.35rem 1.8rem .35rem 1rem`, y ese `.35rem` (5.6px) no es el vertical
       de IESDE (12px). Medido: el campo en error/acierto salía a 35.7px y
       todos los demás a 48.5px — el control cambiaba de tamaño al validarse.

       Y NO se arregla por la variable. La regla del core vive en una LISTA
       de selectores cuyo miembro más específico es
       `.was-validated .upaep__input:valid:not(…):not(.upaep__input.__selectpicker):not(…)`
       = (0,7,0); como `&` toma la especificidad del MÁS ALTO de la lista, su
       bloque anidado pesa (0,10,1) y gana a cualquier cosa razonable que se
       escriba aquí. Así que se declara el `padding` como PROPIEDAD REAL: el
       componente solo lo aplica una vez, con `padding: var(…)` a (0,1,0), y
       eso sí se gana sin escalar nada. Se conserva el hueco derecho de
       1.8rem para el icono. */
    &:not([type="color"]):not([type="range"]):not(textarea):not(.__icon) {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *) & {
        padding: 12px 1.8rem 12px 15px;
    }

    &~.upaep__label,
    &~span .upaep__label {
        --upaep-label-color: var(--iesde-error);
    }
}

/* --- Acierto -------------------------------------------------------------- */
[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:is(.is-success, .is-valid) {
    --upaep-input-border-color: var(--iesde-turquoise-deep);
    --upaep-input-border-bottom-color: var(--iesde-turquoise-deep);
    --upaep-input-hover-border-color: var(--iesde-turquoise-deep);
    --upaep-input-hover-border-bottom-color: var(--iesde-turquoise-deep);
    --upaep-input-focus-border-color: var(--iesde-turquoise-deep);
    border-bottom-color: var(--iesde-turquoise-deep);
    background-image: var(--iesde-icon-success);

    /* Mismo motivo que en el error: recuperar el alto del control. */
    &:not([type="color"]):not([type="range"]):not(textarea):not(.__icon) {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *) & {
        padding: 12px 1.8rem 12px 15px;
    }
}

/*? El icono de estado en HOVER y FOCO -------------------------------------
    ⚠ El core re-declara el `background-image` del icono en un bloque
    anidado `&:hover, &:focus, &:focus:hover`. Y ese bloque pesa MUCHO: su
    lista de selectores padre incluye
    `.was-validated .upaep__input:valid:not(…):not(.upaep__input.__selectpicker):not(…)`
    = (0,7,0), y como `&` toma la especificidad del MÁS ALTO de la lista, el
    anidado llega a (0,10,0).

    Un bloque anidado equivalente dentro de la regla de marca solo alcanza
    (0,7,0) y PIERDE: el icono se veía en el rojo/verde de IESDE en reposo y
    saltaba al de Bootstrap al enfocar o pasar el ratón. Por eso estas dos
    reglas van sueltas y suben a (0,11,0) con los `:not()` que el propio core
    usa —todos ciertos en un campo normal, así que no cambian a quién
    aplican, solo el peso—. */
[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:is(.is-error, .is-invalid):not(.upaep__input-tokenfield):not(.upaep__autocomplete-input):not(.__selectpicker):not(.__icon):is(:hover, :focus):not(:disabled):not([readonly]) {
    background-image: var(--iesde-icon-error);
}

[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:is(.is-success, .is-valid):not(.upaep__input-tokenfield):not(.upaep__autocomplete-input):not(.__selectpicker):not(.__icon):is(:hover, :focus):not(:disabled):not([readonly]) {
    background-image: var(--iesde-icon-success);
}

/* El <select> trae su propio galón como background-image y el core le suma
   el icono de estado en un segundo plano: se recolorea igual. */
[data-brand="iesde"] .upaep__select:is(.is-error, .is-invalid) {
    --upaep-select-border-color: var(--iesde-error);
    --upaep-select-focus-border-color: var(--iesde-error);
}

[data-brand="iesde"] .upaep__select:is(.is-success, .is-valid) {
    --upaep-select-border-color: var(--iesde-turquoise-deep);
    --upaep-select-focus-border-color: var(--iesde-turquoise-deep);
}

/*? Deshabilitado (v2) -------------------------------------------------------
    ⚠ El componente solo expone `--upaep-input-disabled-bg` y
    `-disabled-opacity`: ni borde ni color de texto. Y v2 NO usa opacidad
    —lavaría el borde junto con todo lo demás—, sino colores propios: borde
    en el filete SUAVE (#eeeeee, más claro que el normal), texto tenue y
    fondo de superficie 2. Así que la opacidad se anula y los dos colores
    van como propiedad. */
[data-brand="iesde"] :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:disabled {
    --upaep-input-disabled-opacity: 1;
    border-color: var(--ui-border-subtle);
    border-bottom-color: var(--ui-border-subtle);
    color: var(--iesde-text-faint);
    cursor: not-allowed;
}

/* v2 apaga también la etiqueta del campo deshabilitado. El core no tiene
   regla para esto, así que se enlaza con `:has()` desde la etiqueta al
   control que la sigue. */
[data-brand="iesde"] .upaep__label:has(+ :is(.upaep__input-container, .upaep__input-wrapper)>.upaep__input:disabled) {
    --upaep-label-color: var(--iesde-text-faint);
}

/* El mensaje: v2 lo pone en 12px regular, no en el bold del core. */
[data-brand="iesde"] .upaep__feedback {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__feedback {
    --upaep-feedback-fz: 12px;
    --upaep-feedback-fw: var(--upaep-fw-regular);
    --upaep-feedback-margin: 6px 0 0;
}

[data-brand="iesde"] .upaep__feedback.__invalid,
[data-brand="iesde"] .upaep__feedback.__error {
    --upaep-feedback-color: var(--iesde-error);
}

/* Texto de ayuda bajo el campo: gris tenue, mismo tamaño. */
[data-brand="iesde"] .__iesde-hint {
    display: block;
    color: var(--ui-text-muted);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-hint {
    margin-top: 6px;
    font: 400 12px var(--ui-font-base);
}

[data-brand="iesde"] .upaep__select:hover {
    border-color: var(--iesde-turquoise-deep);
}

/*? ------ Checkbox, radio y switch ------
    El uikit los pinta con gris neutro por defecto (decisión deliberada del
    core: la selección no sigue la marca). IESDE sí quiere marca, así que se
    remapean al turquesa accionable — el mismo que el botón secundario, que
    es el que pasa AA sobre blanco.

    Dos trampas del componente que hay que desactivar:
      · en :hover y :focus vuelve a declarar el `border` COMPLETO con su
        propio grosor (2px por defecto). Si solo se cambia el color, la caja
        engorda al pasar el ratón → hay que fijar los tres grosores en 1px.
      · `--upaep-checkbox-focus-bg` es BLANCO por defecto y la regla
        `:focus:checked` lo repinta: al enfocar, una casilla marcada se
        vaciaba. El fondo de foco tiene que ser el mismo turquesa.

    ⚠ Y los `:not()` de validación son imprescindibles: estas reglas pesan
    (0,2,0), igual que `.upaep__checkbox.is-invalid` del core, y van DESPUÉS
    —así que le ganaban y devolvían el borde gris a una casilla en error—.
    Es la misma trampa del carril del switch, un nivel más abajo. El estado
    de error de checkbox, radio y select ya sale de `--ui-danger`, que la
    marca define en la capa 1: no hay que repetirlo por componente, solo no
    pisarlo. */
[data-brand="iesde"] .upaep__checkbox:not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    --upaep-checkbox-border-color: var(--ui-border);
    --upaep-checkbox-bg: var(--ui-surface);

    --upaep-checkbox-hover-bg: var(--ui-surface);
    --upaep-checkbox-hover-border-color: var(--iesde-turquoise-deep);

    --upaep-checkbox-checked-bg: var(--iesde-turquoise-deep);
    --upaep-checkbox-checked-color: #ffffff;

    --upaep-checkbox-active-bg: var(--iesde-turquoise-deep);
    --upaep-checkbox-active-border-color: var(--iesde-turquoise-deep);

    --upaep-checkbox-focus-bg: var(--iesde-turquoise-deep);
    --upaep-checkbox-focus-border-color: var(--iesde-turquoise-deep);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__checkbox:not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    --upaep-checkbox-border-size: 1px;
    --upaep-checkbox-border-radius: 4px;
    --upaep-checkbox-hover-border-size: 1px;
    --upaep-checkbox-active-border-size: 1px;
    --upaep-checkbox-focus-border-size: 1px;
}

[data-brand="iesde"] .upaep__radio:not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    --upaep-radio-border-color: var(--ui-border);
    --upaep-radio-bg: var(--ui-surface);

    --upaep-radio-hover-bg: var(--ui-surface);
    --upaep-radio-hover-border-color: var(--iesde-turquoise-deep);

    --upaep-radio-checked-color: var(--iesde-turquoise-deep);

    --upaep-radio-active-bg: var(--ui-surface);
    --upaep-radio-active-border-color: var(--iesde-turquoise-deep);

    --upaep-radio-focus-bg: var(--ui-surface);
    --upaep-radio-focus-border-color: var(--iesde-turquoise-deep);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__radio:not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    --upaep-radio-border-size: 1px;
    --upaep-radio-hover-border-size: 1px;
    --upaep-radio-active-border-size: 1px;
    --upaep-radio-focus-border-size: 1px;
}

/* Sin marcar, la casilla enfocada no debe rellenarse de turquesa.
   El switch se excluye: su carril nunca es blanco (ver abajo). */
[data-brand="iesde"] .upaep__checkbox:not(.__switch):focus:not(:checked) {
    background: var(--ui-surface);
    border-color: var(--iesde-turquoise-deep);
}

/*? Switch — el carril SIEMPRE va relleno; lo que se mueve es la perilla
    blanca. Apagado: gris. Encendido: turquesa.

    ⚠ La regla genérica de arriba pone `--upaep-checkbox-bg: var(--ui-surface)`
    (blanco) y tiene la MISMA especificidad que `.upaep__checkbox.__switch` del
    core, pero se carga después → le ganaba. Resultado: carril blanco con
    perilla blanca, o sea invisible cuando estaba apagado. Por eso aquí hay que
    volver a declarar los cuatro fondos, no solo el de marcado. */
[data-brand="iesde"] .upaep__checkbox.__switch:not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    --upaep-checkbox-checked-color: #ffffff;
    --upaep-checkbox-bg: var(--ui-border);
    --upaep-checkbox-hover-bg: var(--ui-border);
    --upaep-checkbox-focus-bg: var(--ui-border);
    --upaep-checkbox-active-bg: var(--ui-border);
    --upaep-checkbox-checked-bg: var(--iesde-turquoise-deep);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__checkbox.__switch:not(.is-error):not(.is-invalid):not(.is-success):not(.is-valid) {
    --upaep-checkbox-border-radius: 50px;
    --upaep-checkbox-border-size: 0;
}

/* Encendido: el carril se mantiene turquesa en reposo, hover y foco. */
[data-brand="iesde"] .upaep__checkbox.__switch:checked,
[data-brand="iesde"] .upaep__checkbox.__switch:checked:hover,
[data-brand="iesde"] .upaep__checkbox.__switch:checked:focus {
    background: var(--iesde-turquoise-deep);
}

/* Apagado: se mantiene gris en reposo, hover y foco. */
[data-brand="iesde"] .upaep__checkbox.__switch:not(:checked),
[data-brand="iesde"] .upaep__checkbox.__switch:not(:checked):hover,
[data-brand="iesde"] .upaep__checkbox.__switch:not(:checked):focus {
    background: var(--ui-border);
}

/* Etiqueta de campo: bloque con respiro sobre el control.
   ⚠ `.upaep__label` es otra primitiva compartida —el runtime la genera en
   Payment (`upaep__balances-item`, `upaep__methods-item`) y en las opciones
   del Selectpicker—, y ahí forzar `display: block` rompe la fila. Por eso
   solo se viste la etiqueta que precede a un campo de formulario. */
[data-brand="iesde"] .upaep__label:has(+ :is(.upaep__input-container, .upaep__input-wrapper, .upaep__input, .upaep__select, .upaep__textarea)) {
    color: var(--ui-text-strong);
    display: block;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__label:has(+ :is(.upaep__input-container, .upaep__input-wrapper, .upaep__input, .upaep__select, .upaep__textarea)) {
    font-weight: var(--upaep-fw-semibold);
    font-size: 14px;
    margin-bottom: 7px;
}

/* Dentro de un checkbox/radio la etiqueta va AL LADO del control, no encima:
   ni bloque, ni margen, ni negrita.

   El grupo es `display: flex` SIN `align-items`, así que por defecto es
   `stretch`: la etiqueta ocupa todo el alto y su texto queda arriba, más alto
   que la casilla. Centrarlo es lo que los alinea. */
[data-brand="iesde"] .upaep__checkbox-group,
[data-brand="iesde"] .upaep__radio-group {
    align-items: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__checkbox-group,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__radio-group {
    gap: 8px;
    margin-bottom: 6px;
}

[data-brand="iesde"] .upaep__checkbox-group .upaep__label,
[data-brand="iesde"] .upaep__radio-group .upaep__label {
    display: inline;
    color: var(--ui-text);
    cursor: pointer;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__checkbox-group .upaep__label,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__radio-group .upaep__label {
    margin: 0;
    line-height: 1.2;
    font-weight: var(--upaep-fw-regular);
}

/* El margen propio del control sobra: la separación la da el `gap`. */
[data-brand="iesde"] .upaep__checkbox-group .upaep__checkbox,
[data-brand="iesde"] .upaep__radio-group .upaep__radio {
    flex: 0 0 auto;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__checkbox-group .upaep__checkbox,
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__radio-group .upaep__radio {
    --upaep-checkbox-margin: 0;
    margin: 0;
}

/*? =====================================================================
    4. PATRONES DE PÁGINA  (v2)
    Cuatro bloques que v2 documenta y que NO son componentes del uikit:
    footer del home, acordeón de oferta académica, plan de estudios y
    característica destacada.

    Por eso van como clases DECORATIVAS de marca con prefijo __iesde-, igual
    que .__iesde-accordion-group: no hay componente del kit al que
    revestirlos, y crear componentes nuevos queda fuera del encargo. El HTML
    que esperan está en iesde.md y en el demo.

    Dentro sí se usan piezas del kit donde encajan (.upaep__btn, .upaep__card,
    .upaep__details-accordion), así que estos bloques son maquetación, no
    reimplementaciones.
    ===================================================================== */

/*? --- Animaciones del sistema (v2 las declara con nombre propio) ---------
    Las dos primeras solo sirven para DEMOSTRAR el motion en la hoja de
    documentación: v2 las usa en las barras que ilustran cada duración. Van
    en la hoja de marca —y no en el demo— porque el nombre lo declara el
    sistema, igual que iesde-acordeon. */
@keyframes iesde-fade {
    0% {
        opacity: .15;
    }

    50% {
        opacity: 1;
    }

    100% {
        opacity: .15;
    }
}

@keyframes iesde-slide {
    0% {
        transform: translateX(0);
    }

    50% {
        transform: translateX(180px);
    }

    100% {
        transform: translateX(0);
    }
}

/*? --- Animaciones del sistema (v2 las declara con nombre propio) --------- */
@keyframes iesde-acordeon {
    from {
        opacity: 0;
        transform: translate3d(0, -6px, 0);
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)from {
        max-height: 0;
    }

    to {
        opacity: 1;
        transform: none;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)to {
        max-height: 640px;
    }
}

@keyframes iesde-acordeon-fila {
    from {
        opacity: 0;
        transform: translate3d(-10px, 0, 0);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

/*? --- Piezas compartidas de los patrones ---------------------------------
    Estas dos NO son clases de marca: son componentes del kit vestidos. El
    antetítulo es .upaep__overline y el chip de atributo es .upaep__tag. Lo
    único que añade la marca es lo que el componente no expone —el
    letter-spacing y las versalitas del overline— y los colores. */

/* v2 tiene DOS antetítulos, no uno: el de SECCIÓN (12px, tracking 2px, ya
   definido en la capa 2 sobre la clase base) y este, el de CARD o PANEL, más
   corto y más pesado. Va como modificador y no redefiniendo la clase base:
   dos reglas genéricas sobre `.upaep__overline` en la misma hoja se pisan
   por orden de aparición, no por intención. */
[data-brand="iesde"] .upaep__overline.__iesde-strong {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__overline.__iesde-strong {
    --upaep-overline-fw: var(--upaep-fw-bold);
    --upaep-overline-fz: 13px;
    letter-spacing: .08em;
}

/* Sobre fondo oscuro el turquesa accionable se apaga: pasa al claro. */
[data-brand="iesde"] .upaep__overline.__on-dark {
    --upaep-overline-color: var(--iesde-green-eyebrow);
}

/* Chip de atributo (duración, modalidad…). Es .upaep__tag: el componente ya
   trae alto, radio, fondo y padding por variable, así que v2 se expresa
   entero con ellas. */
[data-brand="iesde"] .upaep__tag {
    /* `minheight` y no `height`: el rótulo largo de un programa puede caer a
       dos renglones y con alto fijo se recorta. */
    --upaep-tag-bg: var(--iesde-green-chip);
    /* ⚠ El color y la tipografía del rótulo NO son --upaep-tag-color/-fz/-fw
       (no existen): el texto vive en .upaep__tag-text y se viste con
       --upaep-tag-text-*. */
    --upaep-tag-text-color: var(--iesde-navy);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tag {
    --upaep-tag-minheight: 36px;
    --upaep-tag-height: auto;
    --upaep-tag-border-radius: var(--iesde-radius-main);
    --upaep-tag-padding: 8px 14px;
    --upaep-tag-border-size: 0;
    --upaep-tag-text-fz: 13px;
    --upaep-tag-text-fw: var(--upaep-fw-medium);
    --upaep-tag-text-margin: 0;
}

/* Variante "volver": contorno y texto turquesa sobre blanco. */
[data-brand="iesde"] .upaep__tag.__iesde-back {
    --upaep-tag-bg: var(--ui-surface);
    --upaep-tag-text-color: var(--iesde-turquoise-deep);
    --upaep-tag-border-color: var(--iesde-border-chip);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__tag.__iesde-back {
    --upaep-tag-text-fw: var(--upaep-fw-semibold);
    --upaep-tag-border-size: 1px;
}

/*? --- 1 · Footer del home ------------------------------------------------
    Gris obscuro #464442 con logo, dirección y teléfonos, columna de trámites
    y redes; cierra con una barra navy separada por un filete turquesa de 2px.

    ⚠ NO usa el componente .upaep__footer, y por una razón concreta: dos de
    sus reglas están cableadas sin variable y rompen este pie.
      · `.upaep__footer-logo img` lleva `object-fit: cover` con un
        `max-width` propio → RECORTA el lockup horizontal de IESDE (se ve
        "IESD" en vez de la marca completa);
      · `.upaep__footer-direccion` lleva `text-align: center` a pelo → la
        dirección y los teléfonos salen centrados, y v2 los quiere a la
        izquierda.
    Ninguna de las dos se puede apagar por token, así que aquí sale más
    barato maquetar el pie que pelearse con el componente. Lo que SÍ se
    reutiliza dentro son .upaep__list para las dos columnas de enlaces.

    ⚠ Va sobre la etiqueta <footer>, y el core la viste a secas: hay que
    neutralizar sus variables (--footer-bg negro fijo, --footer-zindex) o el
    fondo se cuela y el pie se pone por encima de los overlays. */
[data-brand="iesde"] footer.__iesde-footer {
    --footer-bg: transparent;
    --footer-width: 100%;
    --footer-minheigth: 0;
    --footer-padding: 0;
    --footer-border-top: 0;
    --footer-zindex: auto;
    position: static;

    overflow: hidden;
    background: var(--iesde-gray-dark);
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] footer.__iesde-footer {
    border-radius: var(--iesde-radius-main);
}

/* La fila: logo, dirección, trámites y redes al extremo. */
[data-brand="iesde"] .__iesde-footer-row {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-row {
    gap: var(--iesde-space-8);
    padding: 44px 40px;
}

[data-brand="iesde"] .__iesde-footer-brand {
    flex: 0 1 auto;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-brand {
    min-width: 170px;
}

/* `contain` y no `cover`: el lockup es horizontal y `cover` lo recortaría,
   que es justo el fallo del componente. */
[data-brand="iesde"] .__iesde-footer-brand img {
    object-fit: contain;
    display: block;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-brand img {
    height: 58px;
    width: auto;
    max-width: 100%;
}

[data-brand="iesde"] .__iesde-footer-block {
    flex: 1 1 220px;
    text-align: left;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block {
    min-width: 200px;
}

[data-brand="iesde"] .__iesde-footer-block.__wide {
    flex: 1 1 240px;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block.__wide {
    min-width: 210px;
}

[data-brand="iesde"] .__iesde-footer-block h4 {
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block h4 {
    margin: 0 0 18px;
    font: 600 21px var(--ui-font-base);
}

[data-brand="iesde"] .__iesde-footer-block p {
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block p {
    margin: 0 0 var(--iesde-space-4);
    font: 400 15px/1.85 var(--ui-font-base);
}

/* Las columnas de enlaces sí son .upaep__list: se apagan filetes y marca y
   el respiro lo da el gap. */
[data-brand="iesde"] .__iesde-footer .upaep__list {
    --upaep-list-item-hover-bg: transparent;
    display: grid;
    list-style: none;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer .upaep__list {
    --upaep-list-padding: 0;
    --upaep-list-margin: 0;
    --upaep-list-item-padding: 0;
    --upaep-list-item-height: auto;
    --upaep-list-item-border-bottom-size: 0;
    --upaep-list-item-hover-border-bottom-size: 0;
    gap: 14px;
}

/* Enlaces de contacto y trámites. ⚠ Acotado a `.__iesde-footer-block`, no
   a `.__iesde-footer`: con el selector amplio (0,3,1) también alcanzaba a
   los enlaces de REDES y le ganaba a su regla (0,2,1), imponiéndoles
   `display: inline-flex` con `align-items: flex-start`. Eso dejaba el icono
   pegado a la esquina superior izquierda del cuadro de 44px en vez de
   centrado — el `place-items: center` del bloque de redes ni se aplicaba. */
[data-brand="iesde"] .__iesde-footer-block .upaep__list-item a {
    display: inline-flex;
    align-items: flex-start;
    color: #ffffff;
    text-decoration: none;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block .upaep__list-item a {
    gap: var(--iesde-space-3);
    min-height: 24px;
    font: 400 15px var(--ui-font-base);
}

[data-brand="iesde"] .__iesde-footer-block .upaep__list-item a:hover {
    color: var(--iesde-green-eyebrow);
}

/* Iconos en línea de los bloques de contacto y trámites.

   ⚠ El selector se acota a `.__iesde-footer-block` a propósito. Con
   `.__iesde-footer .upaep__list-item svg` (0,3,1) también alcanzaba a los
   iconos de REDES y le ganaba a su propia regla (0,2,1): los cuadros de
   44px recibían un icono de 20px con `margin-top: 2px`, que dentro de un
   `place-items: center` los descentraba y los dejaba recortados arriba.

   El SVG necesita `flex: 0 0 auto` o el flex del enlace lo comprime. */
[data-brand="iesde"] .__iesde-footer-block .upaep__list-item svg {
    flex: 0 0 auto;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block .upaep__list-item svg {
    width: 20px;
    height: 20px;
    margin-top: 2px;
}

/* v2 baja el icono de teléfono a 19px; es el único que cambia de tamaño. */
[data-brand="iesde"] .__iesde-footer-block:not(.__wide) .upaep__list-item svg {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-block:not(.__wide) .upaep__list-item svg {
    width: 19px;
    height: 19px;
}

/* Redes: cuadros turquesa de 44px. */
[data-brand="iesde"] .__iesde-footer-social {
    flex: 0 0 auto;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-social {
    margin-left: auto;
}

/* ⚠ `flex-direction: row` es imprescindible, y es la trampa fácil de pasar
   por alto: la base de .upaep__list es `display: flex` pero con
   `flex-direction: COLUMN`. Poner solo `display: flex` no cambia nada —ya lo
   era— y los cinco cuadros salían apilados en vertical, con el <ul> midiendo
   44px de ancho (el de un solo icono). `--upaep-list-width: auto` evita
   además que el `width: 100%` de la base se resuelva contra un contenedor
   que a su vez depende del contenido. */
[data-brand="iesde"] .__iesde-footer-social .upaep__list {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: flex-end;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-social .upaep__list {
    --upaep-list-width: auto;
    gap: var(--iesde-space-3);
}

[data-brand="iesde"] .__iesde-footer-social .upaep__list-item {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-social .upaep__list-item {
    width: auto;
}

[data-brand="iesde"] .__iesde-footer-social .upaep__list-item a {
    display: grid;
    place-items: center;
    background: var(--iesde-turquoise);
    color: #ffffff;
    transition: background var(--iesde-transition-fast) ease-out;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-social .upaep__list-item a {
    width: 44px;
    height: 44px;
    border-radius: var(--iesde-radius-xs);
}

[data-brand="iesde"] .__iesde-footer-social .upaep__list-item a:hover {
    background: var(--iesde-turquoise-deep);
}

[data-brand="iesde"] .__iesde-footer-social .upaep__list-item svg {
    fill: currentColor;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-social .upaep__list-item svg {
    width: 21px;
    height: 21px;
    margin: 0;
}

/* La barra de cierre. */
[data-brand="iesde"] .__iesde-footer-bar {
    border-top: 2px solid var(--iesde-turquoise);
    background: var(--iesde-navy-deep);
    color: #ffffff;
    text-align: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-bar {
    padding: var(--iesde-space-4) 40px;
    font: 400 14px var(--ui-font-base);
}

/*? --- 2 · Acordeón de oferta académica -----------------------------------
    Navegación por líneas: tarjetas verdes apiladas y, al lado, el panel de
    detalle del programa elegido.

    Usa el acordeón NATIVO del kit —.upaep__details-accordion, o sea
    <details>/<summary>—, no el .upaep__accordion de JavaScript. Dos ventajas
    que deciden:
      · cero JS, y por tanto la cabecera es un <summary> de verdad: entra por
        teclado y anuncia su estado. El .upaep__accordion hace clicable un
        <div> con el rótulo en un <a> sin href;
      · la exclusividad la da el atributo `name` del propio <details> (todos
        los del grupo comparten nombre), que es la forma nativa de que al
        abrir uno se cierre el resto — justo lo que pide v2.

    Dentro, la lista de programas es .upaep__list con `is-active`.

    ⚠ El componente pinta su marca con `background-image` en el ::after del
    summary y la CAMBIA al abrir (mark-inactive → mark-active). Aquí eso
    sirve: v2 no gira el icono, lo sustituye (galón a la derecha → hacia
    abajo). Basta cambiar las dos imágenes y agrandar la caja a 30px, porque
    el componente la deja en 1rem. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer {
    --upaep-details-accordion-bg: var(--iesde-green-inactive);
    --upaep-details-accordion-summary-color: #ffffff;

    /* Disco blanco con galón: a la derecha cerrado, hacia abajo abierto. */
    --upaep-details-accordion-mark-inactive: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Ccircle cx='15' cy='15' r='15' fill='%23ffffff'/%3E%3Cpath d='M12 9l6 6-6 6' fill='none' stroke='%232a736f' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    --upaep-details-accordion-mark-active: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Ccircle cx='15' cy='15' r='15' fill='%23ffffff'/%3E%3Cpath d='M9 12l6 6 6-6' fill='none' stroke='%232a736f' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");

    overflow: hidden;
    transition: background var(--iesde-transition-accordion),
        box-shadow var(--iesde-transition-accordion);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer {
    --upaep-details-accordion-border-size: 0;
    --upaep-details-accordion-border-radius: var(--iesde-radius-accordion);
    --upaep-details-accordion-padding: var(--iesde-space-4) 20px;
    --upaep-details-accordion-summary-fz: 21px;
    --upaep-details-accordion-summary-fw: var(--upaep-fw-semibold);
    border-radius: var(--iesde-radius-accordion);
}

/* Abierta: sube de verde y se despega con sombra propia. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer[open] {
    --upaep-details-accordion-bg: var(--iesde-green-active);
    box-shadow: var(--iesde-shadow-offer-active);
}

/* El componente deja la marca en 1rem: v2 la quiere en 30px. Y el `float`
   del ::after sobra, porque el summary ya es flex con space-between. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer>.upaep__details-summary::after {
    /* `content` explícito: la regla que apaga la marca en la variante de FAQ
       usa `content: none`, y basta con que se le olvide el :not() para que
       aquí desaparezca el galón. Declarándolo, esta variante se sostiene
       sola. */
    content: "";
    float: none;
    flex: 0 0 auto;
    background-size: 30px auto;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer>.upaep__details-summary::after {
    width: 30px;
    height: 30px;
}

/* El rótulo y sus antetítulos van apilados; el summary es flex con la marca
   al final, así que el texto va en un <div> que ocupa el resto. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer>.upaep__details-summary {
    align-items: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer>.upaep__details-summary {
    gap: 14px;
    line-height: 1.2;
}

[data-brand="iesde"] .upaep__details-accordion.__iesde-offer>.upaep__details-summary>div {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer>.upaep__details-summary>div {
    min-width: 0;
    gap: 3px;
}

/* Al abrir, el componente separa el summary 1rem del contenido; aquí ese
   respiro lo da el padding de la lista. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer[open]>.upaep__details-summary {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer[open]>.upaep__details-summary {
    margin-bottom: 9px;
}

/* Los antetítulos de la tarjeta: versalitas blancas, no turquesa. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__overline {
    --upaep-overline-color: rgba(255, 255, 255, .94);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__overline {
    --upaep-overline-fz: 13px;
    --upaep-overline-fw: var(--upaep-fw-medium);
    --upaep-overline-margin: 0;
    letter-spacing: .05em;
}

/* La lista de programas: filas de 8px sobre el verde de la tarjeta. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list {
    --upaep-list-item-bg: rgba(255, 255, 255, .07);
    --upaep-list-item-hover-bg: rgba(255, 255, 255, .16);
    --upaep-list-item-active-bg: rgba(255, 255, 255, .24);
    --upaep-list-item-color: rgba(255, 255, 255, .94);
    --upaep-list-item-hover-color: #ffffff;
    --upaep-list-item-active-color: #ffffff;
    display: flex;
    flex-direction: column;
    border-top: 1px solid rgba(255, 255, 255, .28);
    list-style: none;
    animation: iesde-acordeon var(--iesde-transition-accordion) both;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list {
    --upaep-list-padding: 0;
    --upaep-list-margin: 0;
    --upaep-list-item-padding: 8px 10px;
    --upaep-list-item-border-radius: var(--iesde-radius-xs);
    --upaep-list-item-height: auto;
    --upaep-list-item-border-bottom-size: 0;
    --upaep-list-item-hover-border-bottom-size: 0;
    --upaep-list-item-active-border-bottom-size: 0;
    gap: 2px;
    padding-top: 9px;
}

[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list-item {
    display: flex;
    align-items: baseline;
    text-wrap: pretty;
    cursor: pointer;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list-item {
    gap: 9px;
    min-height: 44px;
    font: 400 14px/1.4 var(--ui-font-base);
}

/* La sigla del programa (MBA, DIR, PDG) y el guion separador. */
[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list-item b {
    flex: 0 0 auto;
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list-item b {
    font: 700 14px var(--ui-font-base);
}

[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list-item b+span {
    flex: 0 0 auto;
    color: rgba(255, 255, 255, .55);
}

[data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list-item>span:last-child {
    flex: 1 1 auto;
}

/* Las tarjetas apiladas: el grupo da la separación, no el margen de cada
   una (el componente no expone margen). */
[data-brand="iesde"] .__iesde-offer-stack {
    display: flex;
    flex-direction: column;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-offer-stack {
    gap: 11px;
}

/* La rejilla del bloque: acordeón a la izquierda, panel a la derecha, sobre
   el gradiente de sección. */
[data-brand="iesde"] .__iesde-offer-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    align-items: start;
    background: var(--iesde-gradient-section);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-offer-grid {
    gap: var(--iesde-space-6);
    padding: var(--iesde-space-6);
    border-radius: var(--iesde-radius-main);
}

/*? Panel de detalle del programa.
    ⚠ NO usa .upaep__card. El card del kit es `flex-direction: column;
    align-items: center` y su `-content` es `display: flex` SIN
    `flex-direction`, o sea una FILA centrada: el antetítulo, el título, el
    cuerpo y el botón salían uno al lado del otro. Se puede forzar a columna,
    pero entre eso, el `justify-content: center` y el contrato de
    `--upaep-card-img-content-*` para la foto, sale más barato maquetar la
    superficie. Dentro sí se usan .upaep__tag y .upaep__btn. */
[data-brand="iesde"] .__iesde-panel {
    background: var(--ui-surface);
    box-shadow: var(--iesde-shadow-panel);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel {
    border-radius: var(--iesde-radius-main);
    padding: var(--iesde-space-6);
}

[data-brand="iesde"] .__iesde-panel-media {
    overflow: hidden;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel-media {
    height: 170px;
    border-radius: var(--iesde-radius-sm);
    margin-bottom: 20px;
}

/* ⚠ .upaep__tag-group trae un CONTORNO de 1px y radio de 10px por defecto
   —está pensado como caja de tokens tipo campo—, y v2 no lleva ninguna caja
   alrededor de los chips. Se apaga por sus variables, que son
   `--upaep-taggroup-*`, SIN guion entre tag y group. */
[data-brand="iesde"] .__iesde-panel .upaep__tag-group {
    display: flex;
    flex-wrap: wrap;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel .upaep__tag-group {
    --upaep-taggroup-border-size: 0;
    --upaep-taggroup-border-bottom-size: 0;
    --upaep-taggroup-border-radius: 0;
    --upaep-taggroup-padding: 0;
    gap: var(--iesde-space-3);
    margin-bottom: 18px;
}

[data-brand="iesde"] .__iesde-panel h4 {
    color: var(--iesde-navy);
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel h4 {
    margin: 10px 0 0;
    font: 700 26px/1.2 var(--ui-font-base);
}

[data-brand="iesde"] .__iesde-panel p {
    color: var(--iesde-prose);
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel p {
    margin: var(--iesde-space-3) 0 0;
    font: 400 16px/1.55 var(--ui-font-base);
    max-width: 60ch;
}

[data-brand="iesde"] .__iesde-panel .upaep__btn {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel .upaep__btn {
    margin-top: 22px;
}

/*? --- 3 · Plan de estudios -----------------------------------------------
    Título arriba, temario en dos columnas de fichas numeradas y, a la
    derecha, el fondo vertical de marca.

    La CAJA es propia y no .upaep__card, por el mismo motivo que el panel de
    oferta: `-content` es `display: flex` sin `flex-direction`, o sea una
    fila centrada, y el título "Contenidos" salía al lado del temario en vez
    de encima.

    El TEMARIO sí es del kit: <ol class="upaep__list">, una sola lista
    repartida en dos columnas con `columns`. Así el orden de lectura es el
    correcto y no hay que trocear la lista ni llevar la cuenta a mano.

    ⚠ TRES trampas encadenadas con la numeración:
      1. La pastilla circular NO puede ser el ::marker nativo: ese
         pseudo-elemento solo acepta color, tipografía y content —ni fondo ni
         tamaño de caja—.
      2. Tampoco sirve --upaep-list-item-mark-content: es un valor FIJO para
         toda la lista, no un contador.
      3. Y no se puede usar el contador `list-item`: el componente pone los
         items en `display: flex` (regla `:not(.__style-normal)`), y un
         elemento que no es `display: list-item` NO incrementa ese contador
         —saldrían las trece fichas con el mismo número—.
    Solución: contador PROPIO (`iesde-syllabus`) sobre el ::before.

    Como el ::before ya existe en el componente (es su marca), hay que
    apagarla con `__nomark` y reescribir `font` COMPLETO: la regla del core
    le impone `font-family: var(--upaep-ff-fontawesome)` y los dígitos
    saldrían en la tipografía de iconos. Y `list-style: none`, porque la base
    de .upaep__list no lo pone (solo lo hace su variante __native-marker). */
[data-brand="iesde"] .__iesde-syllabus-box {
    background: var(--ui-surface);
    border: 1px solid var(--iesde-border-card);
    box-shadow: var(--iesde-shadow-card);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-box {
    border-radius: var(--iesde-radius-main);
    padding: 40px;
}

[data-brand="iesde"] .__iesde-syllabus-box>h3 {
    color: var(--iesde-navy);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-box>h3 {
    margin: 0 0 30px;
    font: 700 42px/1.1 var(--ui-font-base);
    letter-spacing: -.5px;
}

/* El temario (que ya se reparte solo en dos columnas) y el fondo vertical.
   El temario se queda con dos tercios. */
[data-brand="iesde"] .__iesde-syllabus-grid {
    display: grid;
    grid-template-columns: 2fr 1fr;
    align-items: start;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-grid {
    gap: var(--iesde-space-6);
}

[data-brand="iesde"] .upaep__list.__iesde-syllabus {
    --upaep-list-item-bg: var(--ui-surface);
    --upaep-list-item-hover-bg: var(--iesde-zebra);
    /* ⚠ `display: block` es imprescindible: la base de .upaep__list es
       `display: flex; flex-direction: column`, y el multicolumna NO se
       aplica a un contenedor flex —`columns` se ignora en silencio y las
       trece fichas salen en una sola columna—. */
    display: block;
    columns: 2;
    list-style: none;
    counter-reset: iesde-syllabus;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-syllabus {
    --upaep-list-padding: 0;
    --upaep-list-margin: 0;
    --upaep-list-item-padding: var(--iesde-space-4) 18px;
    --upaep-list-item-border-radius: var(--iesde-radius-xs);
    --upaep-list-item-height: auto;
    --upaep-list-item-border-bottom-size: 0;
    --upaep-list-item-hover-border-bottom-size: 0;
    column-gap: var(--iesde-gutter);
}

/* Las fichas alternan el filete de 4px entre turquesa y azul claro. */
[data-brand="iesde"] .upaep__list.__iesde-syllabus .upaep__list-item {
    display: flex;
    align-items: center;
    border: 1px solid var(--iesde-border-tile);
    border-left-width: 4px;
    border-left-color: var(--iesde-turquoise);
    color: var(--iesde-navy);
    text-wrap: pretty;
    counter-increment: iesde-syllabus;
    /* Sin esto una ficha se puede partir entre las dos columnas. */
    break-inside: avoid;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-syllabus .upaep__list-item {
    gap: 14px;
    margin-bottom: var(--iesde-space-3);
    font: 400 14px/1.45 var(--ui-font-base);
}

[data-brand="iesde"] .upaep__list.__iesde-syllabus .upaep__list-item:nth-child(even) {
    border-left-color: var(--iesde-blue-light);
}

/* La pastilla: contador de dos dígitos en disco de 30px. */
[data-brand="iesde"] .upaep__list.__iesde-syllabus .upaep__list-item::before {
    content: counter(iesde-syllabus, decimal-leading-zero);
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    background: var(--iesde-num-turquoise);
    color: var(--iesde-turquoise-deep);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-syllabus .upaep__list-item::before {
    width: 30px;
    height: 30px;
    border-radius: 50%;
    font: 700 12px var(--ui-font-base);
}

[data-brand="iesde"] .upaep__list.__iesde-syllabus .upaep__list-item:nth-child(even)::before {
    background: var(--iesde-num-blue);
    color: var(--iesde-blue);
}

[data-brand="iesde"] .__iesde-syllabus-aside {
    align-self: stretch;
    overflow: hidden;
    background: var(--iesde-navy);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-aside {
    min-height: 520px;
    border-radius: var(--iesde-radius-main);
}

[data-brand="iesde"] .__iesde-syllabus-aside img {
    object-fit: cover;
    object-position: center top;
    display: block;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-aside img {
    width: 100%;
    height: 100%;
    min-height: 520px;
}

/* El botón de descarga cierra el bloque, debajo del temario. */
[data-brand="iesde"] .__iesde-syllabus-box>.upaep__btn {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-box>.upaep__btn {
    margin-top: var(--iesde-space-6);
}

/*? --- 4 · Característica destacada ---------------------------------------
    Banda a sangre con el gradiente azul → turquesa: texto a la izquierda
    (sobre el extremo azul, donde el contraste aguanta) y collage a la
    derecha.

    La lista de beneficios es <ol class="upaep__list">, igual que el
    temario, y el rótulo del collage es .upaep__badge. Lo que queda como
    marca es la banda y la rejilla del collage: eso es layout. */
[data-brand="iesde"] .__iesde-feature-band {
    overflow: hidden;
    background: var(--iesde-gradient-band);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band {
    border-radius: var(--iesde-radius-main);
}

[data-brand="iesde"] .__iesde-feature-band-inner {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band-inner {
    gap: var(--iesde-space-12);
    padding: var(--iesde-space-12);
}

[data-brand="iesde"] .__iesde-feature-band-inner>div {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band-inner>div {
    min-width: 0;
}

[data-brand="iesde"] .__iesde-feature-band h3 {
    color: #ffffff;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band h3 {
    margin: 14px 0 0;
    font: 700 44px/1.1 var(--ui-font-base);
    letter-spacing: -.5px;
}

[data-brand="iesde"] .__iesde-feature-band .__iesde-feature-lead {
    color: #ffffff;
    text-wrap: pretty;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band .__iesde-feature-lead {
    margin: 34px 0 0;
    font: 600 19px/1.5 var(--ui-font-base);
    max-width: 46ch;
}

/* Los beneficios: mismo componente de lista, aquí en dos columnas de rejilla
   (número | texto) y con filete de separación. El número lleva su propio
   subrayado turquesa, que es lo que distingue a este bloque del temario. */
[data-brand="iesde"] .upaep__list.__iesde-feature-list {
    --upaep-list-item-bg: transparent;
    --upaep-list-item-hover-bg: transparent;
    --upaep-list-item-border-bottom-color: rgba(255, 255, 255, .25);
    --upaep-list-item-hover-border-bottom-color: rgba(255, 255, 255, .25);
    display: grid;
    list-style: none;
    counter-reset: iesde-feature;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-feature-list {
    --upaep-list-padding: 0;
    --upaep-list-margin: 0;
    --upaep-list-item-padding: 18px 0;
    --upaep-list-item-height: auto;
    margin-top: 26px;
}

[data-brand="iesde"] .upaep__list.__iesde-feature-list .upaep__list-item {
    display: grid;
    grid-template-columns: 44px 1fr;
    color: #ffffff;
    text-wrap: pretty;
    counter-increment: iesde-feature;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-feature-list .upaep__list-item {
    gap: 14px;
    font: 400 15px/1.55 var(--ui-font-base);
}

/* Mismo motivo que en el temario: contador propio, no `list-item`, y `font`
   completo para no heredar la tipografía de iconos del ::before del core. */
[data-brand="iesde"] .upaep__list.__iesde-feature-list .upaep__list-item::before {
    content: counter(iesde-feature, decimal-leading-zero);
    align-self: start;
    border-bottom: 2px solid var(--iesde-green-eyebrow);
    color: var(--iesde-green-eyebrow);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-feature-list .upaep__list-item::before {
    padding-bottom: 4px;
    font: 600 16px var(--ui-font-base);
}

/* El collage: recorte circular, dos piezas pequeñas y una foto ancla. Nunca
   lleva bordes ni sombras. */
[data-brand="iesde"] .__iesde-feature-collage {
    display: flex;
    flex-direction: column;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-collage {
    gap: var(--iesde-space-3);
}

[data-brand="iesde"] .__iesde-feature-collage .upaep__badge {
    --upaep-badge-bg: #ffffff;
    --upaep-badge-color: var(--iesde-navy);
    align-self: flex-end;
    text-transform: uppercase;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-collage .upaep__badge {
    --upaep-badge-border-radius: var(--iesde-radius-hairline);
    --upaep-badge-padding: 8px 14px;
    --upaep-badge-fz: 11px;
    --upaep-badge-fw: var(--upaep-fw-bold);
    --upaep-badge-height: auto;
    letter-spacing: .06em;
}

[data-brand="iesde"] .__iesde-feature-grid {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-grid {
    gap: var(--iesde-space-2);
}

[data-brand="iesde"] .__iesde-feature-grid>* {
    background: var(--iesde-placeholder);
    overflow: hidden;
}

[data-brand="iesde"] .__iesde-feature-grid img {
    object-fit: cover;
    display: block;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-grid img {
    width: 100%;
    height: 100%;
}

/* Las cinco piezas del collage, en el orden de v2. */
[data-brand="iesde"] .__iesde-feature-grid> :nth-child(1) {
    grid-column: span 3;
    aspect-ratio: 1;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-grid> :nth-child(1) {
    border-radius: 50%;
}

[data-brand="iesde"] .__iesde-feature-grid> :nth-child(2) {
    grid-column: span 1;
    align-self: center;
    aspect-ratio: 1;
}

[data-brand="iesde"] .__iesde-feature-grid> :nth-child(3) {
    grid-column: span 2;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-grid> :nth-child(3) {
    min-height: 150px;
}

[data-brand="iesde"] .__iesde-feature-grid> :nth-child(4) {
    grid-column: span 1;
    align-self: start;
    aspect-ratio: .8;
}

[data-brand="iesde"] .__iesde-feature-grid> :nth-child(5) {
    grid-column: span 5;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-grid> :nth-child(5) {
    min-height: 210px;
}

/* Pie del collage: punto turquesa + texto. */
[data-brand="iesde"] .__iesde-feature-caption {
    align-self: flex-end;
    display: inline-flex;
    align-items: center;
    color: rgba(255, 255, 255, .9);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-caption {
    gap: var(--iesde-space-2);
    font: 400 12px var(--ui-font-base);
}

[data-brand="iesde"] .__iesde-feature-caption::before {
    content: "";
    background: var(--iesde-green-eyebrow);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-caption::before {
    width: var(--iesde-space-2);
    height: var(--iesde-space-2);
    border-radius: 50%;
}

/*? --- Carrusel: puntos de paginación -------------------------------------
    El kit no tiene componente de paginación de carrusel, así que esto es
    marca. La pastilla activa se alarga en vez de cambiar de color. */
[data-brand="iesde"] .__iesde-dots {
    display: inline-flex;
    /* v2 lo centra en su columna. Sin esto, dentro de un contenedor flex
       en columna el `align-items: stretch` por defecto lo estira a todo el
       ancho y la pastilla deja de ser una pastilla. */
    align-self: center;
    align-items: center;
    justify-content: center;
    background: var(--iesde-dots-bg);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-dots {
    gap: 14px;
    padding: var(--iesde-space-2) 14px;
    border-radius: var(--iesde-radius-pill);
}

[data-brand="iesde"] .__iesde-dots-items {
    display: flex;
    align-items: center;
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-dots-items {
    gap: 7px;
}

[data-brand="iesde"] .__iesde-dots-items>span {
    background: var(--iesde-navy);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-dots-items>span {
    width: var(--iesde-space-2);
    height: var(--iesde-space-2);
    border-radius: 50%;
}

[data-brand="iesde"] .__iesde-dots-items>span.is-active {
    background: var(--iesde-green-cta);
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-dots-items>span.is-active {
    width: 26px;
    border-radius: 6px;
}
/*? =====================================================================
    5. RESPONSIVE
    v1 no traía ni una media query. v2 SÍ define la rejilla y sus cortes,
    así que estos cuatro puntos ya no son derivados:

      Mobile    < 600px      4 columnas · gutter 16 · margen 20
      Tablet    600–1023px   8 columnas · gutter 20 · margen 32
      Laptop    1024–1439px  12 columnas · gutter 24 · margen 40
      Desktop   ≥ 1440px     12 columnas · gutter 24 · máx. 1180

    Los dos breakpoints de abajo (924px y 720px) son de COMPONENTE, no de
    rejilla: 924px es donde el uikit saca el botón hamburguesa y 720px donde
    la tipografía de v2 deja de caber. Se conservan.
    ===================================================================== */

/*? Métrica de rejilla por breakpoint. Se aplica a la clase de contenedor,
    para que una página pueda usarla sin recalcular nada. */
[data-brand="iesde"] .__iesde-container {
}

/*? geometria del sistema institucional — solo en el lienzo (U-32) */
:is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-container {
    width: 100%;
    max-width: var(--iesde-container);
    margin-inline: auto;
    padding-inline: var(--iesde-page-margin);
}

@media (width < 1440px) {
    [data-brand="iesde"] {
        --iesde-page-margin: 40px;
    }
}

@media (width < 1024px) {
    [data-brand="iesde"] {
        --iesde-gutter: 20px;
        --iesde-page-margin: 32px;
    }
}

@media (width < 600px) {
    [data-brand="iesde"] {
        --iesde-gutter: 16px;
        --iesde-page-margin: 20px;
    }
}

/* Navbar: mismo punto en que el uikit saca el botón hamburguesa. */
@media (width < 924px) {
    [data-brand="iesde"] .upaep__navbar {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar {
        --upaep-navbar-padding: 0 20px;
    }

    [data-brand="iesde"] .upaep__navbar .upaep__navbar-items {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-items {
        gap: 4px;
        width: 100%;
    }

    [data-brand="iesde"] .upaep__navbar .upaep__navbar-link {
        display: block;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__navbar .upaep__navbar-link {
        padding: 10px 0;
    }
}

@media (width < 720px) {

    /* Tipografía: 48px y 56px no caben en un móvil. */
    :where([data-brand="iesde"]) h1 {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h1 {
        font-size: 34px;
    }

    :where([data-brand="iesde"]) h1.__hero {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h1.__hero {
        font-size: 38px;
    }

    :where([data-brand="iesde"]) h2 {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h2 {
        font-size: 26px;
    }

    :where([data-brand="iesde"]) h2.__light {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h2.__light {
        font-size: 26px;
    }

    :where([data-brand="iesde"]) h3 {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h3 {
        font-size: 20px;
    }

    :where([data-brand="iesde"]) h1.__editorial {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h1.__editorial {
        font-size: 38px;
    }

    :where([data-brand="iesde"]) h2.__editorial {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h2.__editorial {
        font-size: 32px;
    }

    :where([data-brand="iesde"]) h3.__editorial {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *):where([data-brand="iesde"]) h3.__editorial {
        font-size: 24px;
    }

    /* Las pestañas dejan de repartirse el ancho y se deslizan: repartido,
       "OFERTA ACADÉMICA" caería en tres renglones. */
    [data-brand="iesde"] .upaep__tab .upaep__tabs-item {
        overflow-x: auto;
        /* se puede deslizar, pero sin barra a la vista */
        scrollbar-width: none;
    }

    [data-brand="iesde"] .upaep__tab .upaep__tabs-item::-webkit-scrollbar {
        display: none;
    }

    [data-brand="iesde"] .upaep__tab .upaep__tab-item {
        flex: 0 0 auto;
        white-space: nowrap;
    }

    /* Acordeón: 22px/30px de pregunta es demasiado. */
    [data-brand="iesde"] .upaep__details-accordion {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion {
        --upaep-details-accordion-padding: 16px 18px;
        --upaep-details-accordion-summary-fz: 17px;
    }

    [data-brand="iesde"] .upaep__details-accordion.__iesde-lg {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-lg {
        --upaep-details-accordion-summary-fz: 22px;
    }

    [data-brand="iesde"] .upaep__details-accordion .upaep__details-summary::after {
        background-size: 22px auto;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion .upaep__details-summary::after {
        height: 22px;
        width: 22px;
    }

    /* El feature card apila riel y cuerpo. */
    [data-brand="iesde"] .upaep__card.__iesde-feature {
        flex-direction: column;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature {
        --upaep-card-img-content-width: 100%;
        --upaep-card-img-content-height: 62px;
    }

    [data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-img {
        flex: 0 0 62px;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-feature .upaep__card-img {
        width: 100%;
    }

    [data-brand="iesde"] .upaep__card.__iesde-compact {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-compact {
        --upaep-card-maxwidth: 100%;
    }

    [data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-title {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-title {
        padding: 18px 20px;
        font-size: 22px;
    }

    [data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-button {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-promo .upaep__card-button {
        width: 64px;
    }

    [data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-title {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__card.__iesde-testimonial .upaep__card-title {
        font-size: 24px;
    }

    /* Los botones sueltan los 140px para no desbordar en fila. Mismas
       variantes que arriba: nunca la clase base. */
    [data-brand="iesde"] .upaep__btn.__primary,
    [data-brand="iesde"] .upaep__btn.__secondary,
    [data-brand="iesde"] .upaep__btn.__tertiary,
    [data-brand="iesde"] .upaep__btn.__dark,
    [data-brand="iesde"] .upaep__btn.__iesde-cta {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__primary,
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__secondary,
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__tertiary,
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__dark,
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__btn.__iesde-cta {
        min-width: auto;
    }
}

/*? Patrones de página en móvil. Los cuatro bloques de la capa 4 nacen a
    ancho de escritorio (paddings de 40–48px y tipografía de 42–44px), así
    que aquí se aprietan. Va en su propio bloque y no en el de 720px de
    arriba para no mezclar componentes del kit con patrones de marca. */
@media (width < 900px) {

    /* El temario y su panel se apilan. */
    [data-brand="iesde"] .__iesde-syllabus-grid {
        grid-template-columns: 1fr;
    }

    /* El panel de imagen del temario deja de reservar 520px: en una sola
       columna esa altura es media pantalla de hueco. */
    [data-brand="iesde"] .__iesde-syllabus-aside {

        & img {
        }

        /*? geometria del sistema institucional — solo en el lienzo (U-32) */
        :is([data-brand-canvas], [data-brand-canvas] *) & {
            min-height: 220px;
        }
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-aside {
        min-height: 220px;
    }
}

@media (width < 620px) {

    /* El temario pasa a una sola columna: con dos, cada ficha se queda en
       unos 130px y el rótulo cae en cinco renglones. */
    [data-brand="iesde"] .upaep__list.__iesde-syllabus {
        columns: 1;
    }
}

@media (width < 720px) {
    [data-brand="iesde"] .__iesde-footer-row {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-row {
        padding: 32px 22px;
        gap: var(--iesde-space-6);
    }

    /* Las redes dejan de irse a la derecha: en una columna quedarían
       colgadas del borde. */
    [data-brand="iesde"] .__iesde-footer-social {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-social {
        margin-left: 0;
    }

    [data-brand="iesde"] .__iesde-footer-social .upaep__list {
        justify-content: flex-start;
    }

    [data-brand="iesde"] .__iesde-footer-bar {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-footer-bar {
        padding: var(--iesde-space-4) 22px;
    }

    [data-brand="iesde"] .__iesde-offer-grid {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-offer-grid {
        padding: var(--iesde-space-4);
    }

    [data-brand="iesde"] .upaep__details-accordion.__iesde-offer {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__details-accordion.__iesde-offer {
        --upaep-details-accordion-summary-fz: 18px;
    }

    [data-brand="iesde"] .__iesde-panel {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel {
        padding: 18px;
    }

    [data-brand="iesde"] .__iesde-panel h4 {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-panel h4 {
        font-size: 21px;
    }

    [data-brand="iesde"] .__iesde-syllabus-box {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-box {
        padding: 22px;
    }

    [data-brand="iesde"] .__iesde-syllabus-box>h3 {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-syllabus-box>h3 {
        margin-bottom: 20px;
        font-size: 28px;
    }

    [data-brand="iesde"] .__iesde-feature-band-inner {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band-inner {
        gap: var(--iesde-space-6);
        padding: 26px 22px;
    }

    [data-brand="iesde"] .__iesde-feature-band h3 {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band h3 {
        font-size: 30px;
    }

    [data-brand="iesde"] .__iesde-feature-band .__iesde-feature-lead {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-band .__iesde-feature-lead {
        margin-top: 22px;
        font-size: 17px;
    }

    /* La lista numerada estrecha su primera columna: 44px de canal sobran
       cuando el texto solo tiene 300px. */
    [data-brand="iesde"] .upaep__list.__iesde-feature-list {
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-feature-list {
        --upaep-list-item-padding: 14px 0;
    }

    [data-brand="iesde"] .upaep__list.__iesde-feature-list .upaep__list-item {
        grid-template-columns: 32px 1fr;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .upaep__list.__iesde-feature-list .upaep__list-item {
        gap: 10px;
    }

    /* El collage se simplifica a dos piezas por fila. */
    [data-brand="iesde"] .__iesde-feature-grid {
        grid-template-columns: repeat(4, 1fr);
    }

    [data-brand="iesde"] .__iesde-feature-grid> :nth-child(1) {
        grid-column: span 2;
    }

    [data-brand="iesde"] .__iesde-feature-grid> :nth-child(5) {
        grid-column: span 4;
    }

    /*? geometria del sistema institucional — solo en el lienzo (U-32) */
    :is([data-brand-canvas], [data-brand-canvas] *)[data-brand="iesde"] .__iesde-feature-grid> :nth-child(5) {
        min-height: 160px;
    }

    /* El testimonial destacado pierde el escalado: a un ancho de móvil se
       sale de la caja. */
    [data-brand="iesde"] .upaep__card.__iesde-testimonial.__iesde-featured {
        transform: none;
    }
}

/*? El sistema pide respetar prefers-reduced-motion. El core ya lo hace con
    sus propias transiciones; esto cubre las animaciones y la elevación que
    añade esta hoja. */
@media (prefers-reduced-motion: reduce) {

    [data-brand="iesde"] .upaep__details-accordion.__iesde-offer .upaep__list {
        animation: none;
    }

    [data-brand="iesde"] .upaep__card.__iesde-elevated,
    [data-brand="iesde"] .__iesde-elevated,
    [data-brand="iesde"] .upaep__btn.__iesde-cta {
        transition: none;
    }

    [data-brand="iesde"] .upaep__card.__iesde-elevated:hover,
    [data-brand="iesde"] .__iesde-elevated:hover,
    [data-brand="iesde"] .upaep__btn.__iesde-cta:hover:not(:disabled) {
        transform: none;
    }
}
