Sample Page

This is an example page. It’s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

Hi there! I’m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin’ caught in the rain.)

…or something like this:

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prep Verbal · Academia de Admisión</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;1,9..144,500&family=Source+Sans+3:wght@400;500;600;700&family=IBM+Plex+Mono:wght@500;600&display=swap" rel="stylesheet">
<style>
  :root{
    --ink:#1C2541;
    --ink-soft:#39456B;
    --paper:#E7EBF1;
    --card:#FFFFFF;
    --gold:#C68E17;
    --gold-soft:#F3E4C0;
    --correct:#2F7D5A;
    --correct-bg:#E4F2EA;
    --error:#C0453B;
    --error-bg:#FBE7E4;
    --muted:#5B6478;
    --line:#D3D9E3;
    --radius:14px;
  }
  *{box-sizing:border-box;}
  html,body{margin:0;padding:0;}
  body{
    background:var(--paper);
    color:var(--ink);
    font-family:'Source Sans 3', sans-serif;
    min-height:100vh;
    -webkit-font-smoothing:antialiased;
  }
  h1,h2,h3,.display{
    font-family:'Fraunces', serif;
    color:var(--ink);
    line-height:1.15;
  }
  .eyebrow{
    font-family:'IBM Plex Mono', monospace;
    font-size:.72rem;
    letter-spacing:.12em;
    text-transform:uppercase;
    color:var(--gold);
    font-weight:600;
  }
  a{color:inherit;}
  button{font-family:inherit;}

  .shell{max-width:940px;margin:0 auto;padding:0 20px 80px;}

  header.top{padding:28px 20px 0;max-width:940px;margin:0 auto;}
  .brand{display:flex;align-items:baseline;gap:10px;margin-bottom:22px;}
  .brand .mark{
    font-family:'IBM Plex Mono', monospace;font-weight:600;font-size:.95rem;color:var(--ink);
    background:var(--gold-soft);border:1px solid var(--gold);padding:3px 8px;border-radius:6px;letter-spacing:.02em;
  }
  .brand .name{font-family:'Fraunces', serif;font-weight:600;font-size:1.15rem;}

  nav.tabs{display:flex;gap:4px;overflow-x:auto;border-bottom:1px solid var(--line);padding-bottom:0;scrollbar-width:none;}
  nav.tabs::-webkit-scrollbar{display:none;}
  nav.tabs button{
    background:none;border:none;padding:12px 14px 14px;font-size:.86rem;font-weight:600;color:var(--muted);
    cursor:pointer;white-space:nowrap;border-bottom:2px solid transparent;transition:color .15s ease, border-color .15s ease;
  }
  nav.tabs button:hover{color:var(--ink);}
  nav.tabs button.active{color:var(--ink);border-bottom-color:var(--gold);}
  nav.tabs button:focus-visible{outline:2px solid var(--gold);outline-offset:2px;}
  nav.tabs button.exam-tab{color:var(--error);}
  nav.tabs button.exam-tab.active{border-bottom-color:var(--error);color:var(--error);}

  main{padding-top:32px;}

  .link-motif{display:inline-flex;align-items:center;gap:6px;font-family:'IBM Plex Mono', monospace;color:var(--gold);font-weight:600;font-size:.85rem;}
  .link-motif .dots{letter-spacing:2px;}

  .hero{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:36px 32px;margin-bottom:24px;}
  .hero h1{font-size:2rem;margin:10px 0 14px;max-width:22ch;}
  .hero p{color:var(--muted);max-width:56ch;font-size:1.02rem;line-height:1.55;}
  .pair-demo{display:flex;align-items:center;gap:14px;margin-top:24px;flex-wrap:wrap;}
  .word-chip{background:var(--paper);border:1px solid var(--line);border-radius:8px;padding:8px 14px;font-family:'IBM Plex Mono', monospace;font-size:.85rem;font-weight:600;}
  .track-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:8px;}
  @media (max-width:640px){.track-grid{grid-template-columns:1fr;}}
  .track-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px;cursor:pointer;transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease;}
  .track-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px -12px rgba(28,37,65,.35);border-color:var(--gold);}
  .track-card h3{font-size:1.1rem;margin:6px 0 6px;}
  .track-card p{color:var(--muted);font-size:.92rem;margin:0 0 14px;line-height:1.5;}
  .track-progress-bar{height:6px;border-radius:4px;background:var(--paper);overflow:hidden;}
  .track-progress-fill{height:100%;background:var(--gold);border-radius:4px;transition:width .3s ease;}
  .track-meta{display:flex;justify-content:space-between;align-items:center;margin-top:8px;font-size:.78rem;color:var(--muted);font-family:'IBM Plex Mono', monospace;}

  .exam-banner{
    background:var(--ink);color:#fff;border-radius:var(--radius);padding:22px 26px;display:flex;
    align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:24px;
  }
  .exam-banner h3{color:#fff;margin:4px 0;font-size:1.15rem;}
  .exam-banner p{color:#C9CFE0;margin:0;font-size:.9rem;max-width:44ch;}
  .exam-banner .eyebrow{color:var(--gold);}

  .topic-header{margin-bottom:22px;}
  .topic-header h2{font-size:1.6rem;margin:8px 0 8px;}
  .topic-header p{color:var(--muted);max-width:60ch;line-height:1.55;}

  .mode-toggle{display:inline-flex;background:var(--card);border:1px solid var(--line);border-radius:999px;padding:4px;margin-bottom:26px;}
  .mode-toggle button{border:none;background:none;padding:8px 18px;border-radius:999px;font-size:.85rem;font-weight:600;color:var(--muted);cursor:pointer;}
  .mode-toggle button.active{background:var(--ink);color:#fff;}

  .lesson-card, .exercise-card, .passage-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:26px 28px;margin-bottom:18px;}
  .lesson-card h3{font-size:1.15rem;margin-top:0;}
  .lesson-card p{line-height:1.65;color:var(--ink-soft);}
  .lesson-card ul{color:var(--ink-soft);line-height:1.7;padding-left:20px;}
  .lesson-card ul.chip-list{list-style:none;padding-left:0;display:flex;flex-wrap:wrap;gap:8px;}
  .lesson-card ul.chip-list li{background:var(--paper);border:1px solid var(--line);border-radius:20px;padding:6px 14px;font-size:.82rem;color:var(--ink);}
  .strategy-box{background:var(--gold-soft);border-left:3px solid var(--gold);padding:14px 18px;border-radius:8px;margin-top:16px;font-size:.94rem;color:var(--ink);}
  .strategy-box b{font-family:'IBM Plex Mono', monospace;font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:6px;color:#8a6410;}

  .example-analogy{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0;font-family:'IBM Plex Mono', monospace;font-size:.95rem;}

  .passage-card{background:#FBFAF7;border-color:var(--line);}
  .passage-card p{line-height:1.75;color:var(--ink-soft);}
  .passage-card .eyebrow{margin-bottom:10px;display:block;}

  .progress-track{height:6px;background:var(--line);border-radius:4px;overflow:hidden;margin-bottom:20px;}
  .progress-track-fill{height:100%;background:var(--gold);transition:width .25s ease;}
  .progress-track-fill.exam{background:var(--error);}

  .exercise-card .qnum{font-family:'IBM Plex Mono', monospace;font-size:.75rem;color:var(--muted);margin-bottom:8px;display:flex;justify-content:space-between;align-items:center;}
  .exercise-card .qtext{font-size:1.08rem;font-weight:600;margin:0 0 18px;line-height:1.5;}
  .options{display:flex;flex-direction:column;gap:10px;}
  .option{
    text-align:left;padding:14px 16px;border:1px solid var(--line);background:var(--paper);border-radius:10px;
    cursor:pointer;font-size:.95rem;color:var(--ink);transition:border-color .12s ease, background .12s ease;display:flex;gap:10px;
  }
  .option .key{font-family:'IBM Plex Mono', monospace;color:var(--muted);font-size:.8rem;}
  .option:hover{border-color:var(--gold);}
  .option:focus-visible{outline:2px solid var(--gold);outline-offset:2px;}
  .option.selected{border-color:var(--ink);background:#fff;}
  .option.correct{background:var(--correct-bg);border-color:var(--correct);}
  .option.incorrect{background:var(--error-bg);border-color:var(--error);}
  .option[disabled]{cursor:default;}

  .feedback{margin-top:16px;padding:14px 16px;border-radius:10px;font-size:.92rem;line-height:1.55;display:none;}
  .feedback.show{display:block;}
  .feedback.correct{background:var(--correct-bg);color:#1e5a3f;}
  .feedback.incorrect{background:var(--error-bg);color:#8a2f27;}
  .feedback b{font-family:'IBM Plex Mono', monospace;font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:4px;}

  .nav-row{display:flex;justify-content:space-between;align-items:center;margin-top:18px;}
  .btn{font-weight:600;font-size:.88rem;padding:11px 20px;border-radius:9px;border:1px solid var(--ink);background:var(--ink);color:#fff;cursor:pointer;}
  .btn:disabled{opacity:.4;cursor:not-allowed;}
  .btn.ghost{background:none;color:var(--ink);border-color:var(--line);}
  .btn.danger{background:var(--error);border-color:var(--error);}
  .btn:focus-visible{outline:2px solid var(--gold);outline-offset:2px;}

  .result-card{text-align:center;padding:40px 28px;}
  .result-score{font-family:'Fraunces', serif;font-size:3rem;color:var(--ink);margin:6px 0;}
  .result-card p{color:var(--muted);}

  .breakdown{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin:22px 0;}
  .breakdown .chip{background:var(--paper);border:1px solid var(--line);border-radius:10px;padding:10px 16px;font-size:.82rem;text-align:left;min-width:120px;}
  .breakdown .chip b{display:block;font-family:'Fraunces',serif;font-size:1.2rem;color:var(--ink);}

  .review-list{text-align:left;margin-top:8px;}
  .review-item{border-top:1px solid var(--line);padding:16px 0;}
  .review-item .topic-tag{font-family:'IBM Plex Mono', monospace;font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);}
  .review-item .rq{font-weight:600;margin:6px 0;}
  .review-item .rline{font-size:.88rem;margin:3px 0;}
  .review-item .ryour{color:var(--error);}
  .review-item .rcorrect{color:var(--correct);}
  .review-item .rexp{color:var(--muted);font-size:.85rem;margin-top:6px;}

  .progress-list{display:flex;flex-direction:column;gap:14px;}
  .progress-row{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;}
  .progress-row .label{font-weight:600;}
  .progress-row .bar-wrap{flex:1;min-width:140px;}
  .reset-link{background:none;border:none;color:var(--muted);text-decoration:underline;font-size:.82rem;cursor:pointer;margin-top:20px;}
  .stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:22px;}
  @media (max-width:640px){.stat-grid{grid-template-columns:1fr;}}
  .stat-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;}
  .stat-card .stat-num{font-family:'Fraunces',serif;font-size:2rem;color:var(--ink);}
  .stat-card .stat-label{font-size:.8rem;color:var(--muted);}

  .timer-bar{display:flex;align-items:center;justify-content:space-between;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 18px;margin-bottom:18px;font-family:'IBM Plex Mono', monospace;}
  .timer-bar .time{font-size:1.1rem;font-weight:600;color:var(--ink);}
  .timer-bar .time.low{color:var(--error);}
  .exam-intro-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:32px;}
  .exam-intro-card ul{color:var(--ink-soft);line-height:1.8;}

  .loading-note{font-size:.85rem;color:var(--muted);font-family:'IBM Plex Mono', monospace;}
  @media (prefers-reduced-motion: reduce){*{transition:none !important;}}
</style>
</head>
<body>

<header class="top">
  <div class="brand">
    <span class="mark">A::B</span>
    <span class="name">Academia de Admisión — Verbal</span>
  </div>
  <nav class="tabs" id="tabs">
    <button data-page="home" class="active">Inicio</button>
    <button data-page="analogias">Analogías</button>
    <button data-page="oraciones">Completar oraciones</button>
    <button data-page="lectura">Lectura crítica</button>
    <button data-page="redaccion">Redacción indirecta</button>
    <button data-page="simulacro" class="exam-tab">⏱ Simulacro</button>
    <button data-page="progreso">Mi progreso</button>
  </nav>
</header>

<main class="shell" id="main"></main>

<script>
/* ============ DATA ============ */

const TOPICS = {
  analogias: {
    title: "Analogías",
    tagline: "Identifica la relación exacta entre un par de palabras y encuéntrala de nuevo en otro par.",
    lesson: {
      intro: "Una analogía compara la relación entre dos palabras con la relación entre otras dos. El truco no es el significado de las palabras por separado, sino el tipo de vínculo que las une.",
      points: [
        "Primero nombra la relación en voz alta: “A es una parte de B”, “A causa B”, “A es lo opuesto de B”.",
        "Construye una oración corta con el primer par y prueba si la misma oración funciona con el segundo par.",
        "Cuidado con relaciones parecidas pero no idénticas: “grado” no es lo mismo que “opuesto”."
      ],
      chips: ["Sinónimos", "Antónimos", "Causa → efecto", "Parte → todo", "Trabajador → herramienta", "Categoría → ejemplo", "Grado o intensidad", "Función o uso", "Creador → obra", "Individuo → grupo"],
      examples: [
        {pair:["MÉDICO","HOSPITAL"], rel:"lugar donde ejerce su oficio", test:["MAESTRO","ESCUELA"]},
        {pair:["ALTO","BAJO"], rel:"antónimos", test:["RÁPIDO","LENTO"]}
      ],
      strategy: "Si dudas entre dos opciones, verifica el orden: si el primer par va de específico a general, la respuesta también debe ir de específico a general."
    },
    questions: [
      { q:"LLAVE es a CERRADURA como CONTRASEÑA es a ___", options:["Cuenta","Candado","Usuario","Contraseña"], correct:0, exp:"La llave abre la cerradura para la que fue hecha; la contraseña da acceso a la cuenta para la que fue creada." },
      { q:"PÁGINA es a LIBRO como RAMA es a ___", options:["Hoja","Bosque","Árbol","Semilla"], correct:2, exp:"Relación parte-todo: una página es parte de un libro; una rama es parte de un árbol." },
      { q:"LLUVIA es a INUNDACIÓN como CHISPA es a ___", options:["Ceniza","Incendio","Fósforo","Humo"], correct:1, exp:"Relación de causa-efecto: la lluvia excesiva puede causar una inundación; una chispa puede causar un incendio." },
      { q:"TIBIO es a CALIENTE como FRESCO es a ___", options:["Templado","Húmedo","Frío","Cálido"], correct:2, exp:"Relación de grado en la misma escala: tibio y caliente están en la escala del calor; fresco y frío en la del frío, en el mismo orden de intensidad." },
      { q:"DIRECTOR es a PELÍCULA como ARQUITECTO es a ___", options:["Ladrillo","Edificio","Constructor","Ciudad"], correct:1, exp:"Relación de creador-obra: el director crea la película; el arquitecto crea el edificio." },
      { q:"TIMIDEZ es a EXTROVERSIÓN como AVARICIA es a ___", options:["Riqueza","Generosidad","Ambición","Pobreza"], correct:1, exp:"Relación de antónimos de carácter: timidez se opone a extroversión; avaricia se opone a generosidad." },
      { q:"PINTOR es a PINCEL como ESCRITOR es a ___", options:["Papel","Pluma","Libro","Tinta"], correct:1, exp:"Relación trabajador-herramienta: el pintor usa el pincel; el escritor usa la pluma." },
      { q:"FELIZ es a CONTENTO como TRISTE es a ___", options:["Apenado","Alegre","Furioso","Sereno"], correct:0, exp:"Relación de sinónimos: contento es sinónimo de feliz; apenado es sinónimo de triste." },
      { q:"FRUTA es a MANZANA como INSTRUMENTO MUSICAL es a ___", options:["Nota","Violín","Concierto","Orquesta"], correct:1, exp:"Relación categoría-ejemplo: la manzana es un ejemplo de fruta; el violín es un ejemplo de instrumento musical." },
      { q:"MOTOR es a AUTOMÓVIL como CORAZÓN es a ___", options:["Sangre","Cuerpo","Pulmón","Vida"], correct:1, exp:"Relación parte esencial-todo: el motor mueve el automóvil; el corazón mantiene con vida al cuerpo." },
      { q:"TIJERA es a CORTAR como MARTILLO es a ___", options:["Clavar","Construir","Herramienta","Golpe"], correct:0, exp:"Relación herramienta-función: la tijera sirve para cortar; el martillo sirve para clavar." },
      { q:"SUSURRO es a GRITO como CAMINAR es a ___", options:["Correr","Trotar","Saltar","Marchar"], correct:0, exp:"Relación de grado: de susurro a grito aumenta la intensidad del sonido; de caminar a correr aumenta la del movimiento." },
      { q:"ABEJA es a COLMENA como HORMIGA es a ___", options:["Jardín","Hormiguero","Panal","Nido"], correct:1, exp:"Relación animal-hogar: la abeja vive en la colmena; la hormiga vive en el hormiguero." },
      { q:"ÁRBITRO es a PARTIDO como JUEZ es a ___", options:["Juicio","Ley","Abogado","Sentencia"], correct:0, exp:"Relación función-contexto: el árbitro dirige el partido; el juez dirige el juicio." },
      { q:"SEMILLA es a ÁRBOL como HUEVO es a ___", options:["Nido","Ave","Pluma","Cascarón"], correct:1, exp:"Relación de origen a resultado: la semilla se convierte en árbol; el huevo se convierte en ave." },
      { q:"GENEROSO es a TACAÑO como VALIENTE es a ___", options:["Cobarde","Audaz","Fuerte","Prudente"], correct:0, exp:"Relación de antónimos: generoso se opone a tacaño; valiente se opone a cobarde." },
      { q:"PANADERO es a PAN como CARPINTERO es a ___", options:["Madera","Mueble","Clavo","Serrucho"], correct:1, exp:"Relación trabajador-producto: el panadero elabora pan; el carpintero elabora muebles." },
      { q:"CIELO es a AZUL como HIERBA es a ___", options:["Verde","Alta","Suave","Fresca"], correct:0, exp:"Relación objeto-color característico: el cielo se asocia con el azul; la hierba con el verde." },
      { q:"DÍA es a NOCHE como VERANO es a ___", options:["Otoño","Invierno","Primavera","Calor"], correct:1, exp:"Relación de opuestos cíclicos: día se opone a noche; verano se opone a invierno." },
      { q:"LIBRO es a CAPÍTULO como CASA es a ___", options:["Techo","Habitación","Puerta","Jardín"], correct:1, exp:"Relación todo-parte: el capítulo es una parte del libro; la habitación es una parte de la casa." },
      { q:"TERMÓMETRO es a TEMPERATURA como RELOJ es a ___", options:["Minutero","Tiempo","Pared","Alarma"], correct:1, exp:"Relación instrumento-lo que mide: el termómetro mide la temperatura; el reloj mide el tiempo." },
      { q:"ESCULTOR es a ESCULTURA como COMPOSITOR es a ___", options:["Sinfonía","Piano","Concierto","Nota"], correct:0, exp:"Relación creador-obra: el escultor crea la escultura; el compositor crea la sinfonía." },
      { q:"OVEJA es a REBAÑO como PEZ es a ___", options:["Acuario","Cardumen","Océano","Red"], correct:1, exp:"Relación individuo-grupo: un conjunto de ovejas forma un rebaño; un conjunto de peces forma un cardumen." },
      { q:"RÍO es a AGUA como VENA es a ___", options:["Sangre","Corazón","Piel","Pulso"], correct:0, exp:"Relación conducto-lo que transporta: el río transporta agua; la vena transporta sangre." },
      { q:"MÉDICO es a PACIENTE como ABOGADO es a ___", options:["Juez","Cliente","Tribunal","Contrato"], correct:1, exp:"Relación profesional-a quien atiende: el médico atiende al paciente; el abogado atiende al cliente." },
      { q:"ANTIGUO es a MODERNO como RÍGIDO es a ___", options:["Flexible","Duro","Firme","Estricto"], correct:0, exp:"Relación de antónimos: antiguo se opone a moderno; rígido se opone a flexible." },
      { q:"GATO es a FELINO como ÁGUILA es a ___", options:["Pluma","Ave","Nido","Vuelo"], correct:1, exp:"Relación ejemplo-categoría: el gato es un ejemplo de felino; el águila es un ejemplo de ave." },
      { q:"CHOFER es a AUTOBÚS como PILOTO es a ___", options:["Aeropuerto","Avión","Cielo","Motor"], correct:1, exp:"Relación conductor-vehículo: el chofer conduce el autobús; el piloto conduce el avión." },
      { q:"HAMBRE es a COMER como SED es a ___", options:["Beber","Agua","Vaso","Sequía"], correct:0, exp:"Relación necesidad-acción que la satisface: el hambre se satisface comiendo; la sed se satisface bebiendo." },
      { q:"ISLA es a AGUA como OASIS es a ___", options:["Palmera","Desierto","Arena","Agua"], correct:1, exp:"Relación de lo que rodea: la isla está rodeada de agua; el oasis está rodeado de desierto." },
      { q:"ÁTOMO es a MOLÉCULA como LETRA es a ___", options:["Alfabeto","Palabra","Oración","Idioma"], correct:1, exp:"Relación unidad pequeña-unidad mayor: los átomos forman moléculas; las letras forman palabras." },
      { q:"ORUGA es a MARIPOSA como RENACUAJO es a ___", options:["Rana","Sapo","Charco","Huevo"], correct:0, exp:"Relación etapa temprana-etapa adulta: la oruga se convierte en mariposa; el renacuajo se convierte en rana." },
      { q:"ELOGIO es a CRÍTICA como VICTORIA es a ___", options:["Trofeo","Derrota","Esfuerzo","Empate"], correct:1, exp:"Relación de antónimos situacionales: elogio se opone a crítica; victoria se opone a derrota." },
      { q:"TERMOSTATO es a TEMPERATURA como FRENO es a ___", options:["Velocidad","Motor","Rueda","Automóvil"], correct:0, exp:"Relación de lo que regula: el termostato regula la temperatura; el freno regula la velocidad." },
      { q:"ACTOR es a GUION como MÚSICO es a ___", options:["Instrumento","Partitura","Concierto","Escenario"], correct:1, exp:"Relación intérprete-texto que sigue: el actor sigue el guion; el músico sigue la partitura." },
      { q:"VIRUS es a INFECCIÓN como ERROR es a ___", options:["Solución","Fracaso","Corrección","Aviso"], correct:1, exp:"Relación de causa-efecto: un virus puede causar una infección; un error puede causar un fracaso." }
    ]
  },

  oraciones: {
    title: "Completar oraciones",
    tagline: "Usa las pistas lógicas y los conectores de la oración para elegir la palabra que mantiene el sentido completo.",
    lesson: {
      intro: "En estos ejercicios, una o dos palabras faltan en una oración. La respuesta correcta no solo debe tener sentido: debe encajar con la lógica que marcan los conectores (aunque, sin embargo, porque, por lo tanto, a pesar de, ya que, puesto que).",
      points: [
        "Los conectores de contraste (aunque, pero, sin embargo, a pesar de) anuncian que la segunda parte va a decir algo distinto o contrario a la primera.",
        "Los conectores de causa (porque, ya que, puesto que, por lo tanto) anuncian una explicación o consecuencia coherente con lo anterior.",
        "Lee la oración completa mentalmente con cada opción antes de decidir; elimina las que suenen forzadas o contradictorias."
      ],
      chips: ["Contraste: aunque, pero, sin embargo", "Causa: porque, ya que, puesto que", "Consecuencia: por lo tanto, así que", "Adición: además, incluso"],
      examples: [
        {sentence:"Aunque el examen era difícil, María se sintió ___ porque había estudiado mucho.", answer:"confiada", why:"“Aunque” marca contraste con la dificultad, pero la causa (estudió mucho) señala un resultado positivo: confianza."}
      ],
      strategy: "Subraya mentalmente el conector antes de mirar las opciones. Eso reduce la mitad de las alternativas casi de inmediato."
    },
    questions: [
      { q:"A pesar de la lluvia intensa, los estudiantes ___ llegaron a tiempo al examen.", options:["igualmente","tardíamente","nerviosamente","difícilmente"], correct:0, exp:"“A pesar de” anuncia contraste: llegaron a tiempo pese a la lluvia. “Igualmente” mantiene ese sentido." },
      { q:"El profesor explicó el tema con tanta claridad que hasta los estudiantes más ___ lo entendieron.", options:["avanzados","distraídos","aplicados","curiosos"], correct:1, exp:"“Hasta... los más ___” sugiere un caso extremo; “distraídos” implica que si ellos entendieron, cualquiera lo hizo." },
      { q:"El científico defendía su teoría con ___, aunque la mayoría de sus colegas la consideraban poco probable.", options:["indiferencia","convicción","duda","ligereza"], correct:1, exp:"“Aunque” marca contraste con la opinión de los colegas; el científico debe sostener su teoría con firmeza: convicción." },
      { q:"La empresa redujo sus gastos, ___ pudo mantener a todo su personal durante la crisis.", options:["por lo tanto","sin embargo","en cambio","de lo contrario"], correct:0, exp:"La reducción de gastos es la causa; mantener al personal es la consecuencia: “por lo tanto”." },
      { q:"El testigo dio una versión tan ___ de los hechos que el juez pidió que la repitiera con más detalle.", options:["detallada","vaga","extensa","convincente"], correct:1, exp:"Si el juez pide más detalle, la versión inicial fue imprecisa: vaga." },
      { q:"Aunque el actor era ___ en el escenario, en las entrevistas se mostraba sorprendentemente tímido.", options:["torpe","magnético","olvidadizo","distante"], correct:1, exp:"“Aunque” exige contraste con “tímido”: en el escenario tendría una presencia magnética." },
      { q:"Como el puente estaba en reparación, los conductores tuvieron que ___ por una ruta alterna.", options:["desviarse","acelerar","detenerse","regresar"], correct:0, exp:"“Como” introduce la causa; la consecuencia lógica es tomar otro camino: desviarse." },
      { q:"El acusado insistía en su inocencia; sin embargo, las pruebas en su contra eran ___.", options:["contundentes","escasas","ambiguas","favorables"], correct:0, exp:"“Sin embargo” marca contraste con la insistencia; las pruebas deben ser fuertes: contundentes." },
      { q:"Puesto que llevaban horas caminando bajo el sol, los excursionistas se sentían completamente ___.", options:["agotados","animados","curiosos","tranquilos"], correct:0, exp:"“Puesto que” introduce la causa; la consecuencia lógica es el cansancio: agotados." },
      { q:"El nuevo empleado, aunque ___, aprendió las funciones del puesto en pocos días.", options:["inexperto","veterano","distraído","indiferente"], correct:0, exp:"“Aunque” exige contraste con “aprendió rápido”: partir de la falta de experiencia." },
      { q:"La biblioteca amplió su horario porque la demanda de estudiantes ___ durante los exámenes finales.", options:["aumentaba","disminuía","cesaba","se mantenía igual"], correct:0, exp:"“Porque” introduce la causa de ampliar el horario: la demanda creció." },
      { q:"A pesar de las críticas iniciales, la película terminó siendo un éxito ___.", options:["rotundo","discreto","cuestionable","mediocre"], correct:0, exp:"“A pesar de” marca contraste con las críticas negativas: un éxito rotundo." },
      { q:"Como el vuelo se retrasó varias horas, los pasajeros esperaban en la sala con evidente ___.", options:["impaciencia","entusiasmo","indiferencia","alivio"], correct:0, exp:"Un retraso largo genera como consecuencia lógica impaciencia en quienes esperan." },
      { q:"El comité rechazó la propuesta porque la consideró ___ para el presupuesto disponible.", options:["excesiva","modesta","razonable","insuficiente"], correct:0, exp:"Si rechazaron la propuesta por el presupuesto, es porque resultaba demasiado costosa: excesiva." },
      { q:"Aunque el equipo perdía por dos goles, los jugadores no dejaron de mostrar ___.", options:["determinación","resignación","indiferencia","desánimo"], correct:0, exp:"“Aunque” exige contraste con la desventaja: seguir mostrando determinación." },
      { q:"Dado que las reservas de agua eran limitadas, el gobierno pidió a la población ___ su consumo.", options:["reducir","aumentar","mantener","duplicar"], correct:0, exp:"Ante reservas limitadas, la consecuencia lógica es pedir que se reduzca el consumo." },
      { q:"La conferencia fue tan ___ que varios asistentes se quedaron dormidos.", options:["monótona","fascinante","breve","interactiva"], correct:0, exp:"Que la gente se duerma es consecuencia de una charla monótona, no fascinante." },
      { q:"El equipo de rescate trabajó toda la noche, ___ localizar a los excursionistas perdidos.", options:["logrando","evitando","negando","posponiendo"], correct:0, exp:"El resultado positivo de trabajar toda la noche es lograr encontrar a los excursionistas." },
      { q:"Por más que insistieron, el gerente se mantuvo ___ en su decisión de no dar el aumento.", options:["firme","dudoso","flexible","indeciso"], correct:0, exp:"“Por más que insistieron” contrasta con mantenerse firme en la decisión." },
      { q:"La empresa lanzó un producto ___ que revolucionó el mercado en pocos meses.", options:["innovador","obsoleto","común","defectuoso"], correct:0, exp:"Revolucionar el mercado es consecuencia de un producto innovador." },
      { q:"Ya que el puente colgante mostraba señales de deterioro, las autoridades decidieron ___ su acceso.", options:["restringir","ampliar","promover","ignorar"], correct:0, exp:"Ante el deterioro, la consecuencia lógica es limitar el acceso: restringir." },
      { q:"El actor recibió tantas críticas negativas que decidió ___ su participación en la obra.", options:["reconsiderar","celebrar","ignorar","anunciar"], correct:0, exp:"Ante críticas tan negativas, la reacción lógica es reconsiderar su participación." },
      { q:"A pesar de contar con poca experiencia, el joven abogado defendió el caso con notable ___.", options:["destreza","torpeza","indiferencia","lentitud"], correct:0, exp:"“A pesar de” marca contraste con la poca experiencia: mostró destreza, no torpeza." },
      { q:"El volcán llevaba semanas ___ señales de actividad, por lo que se ordenó la evacuación preventiva.", options:["mostrando","ocultando","negando","deteniendo"], correct:0, exp:"La evacuación es consecuencia de que el volcán mostraba señales de actividad." },
      { q:"Aunque el contrato parecía ventajoso, un abogado detectó cláusulas ___ que podían perjudicar a la empresa.", options:["ocultas","evidentes","favorables","irrelevantes"], correct:0, exp:"“Aunque parecía ventajoso” contrasta con encontrar cláusulas ocultas y perjudiciales." },
      { q:"La sequía prolongada obligó a los agricultores a buscar métodos de riego más ___.", options:["eficientes","costosos","tradicionales","lentos"], correct:0, exp:"Ante la sequía, la consecuencia lógica es buscar métodos más eficientes, no más costosos o lentos." },
      { q:"El testigo cambió su declaración varias veces, lo cual generó ___ en el jurado.", options:["desconfianza","certeza","simpatía","admiración"], correct:0, exp:"Cambiar la declaración varias veces genera como consecuencia desconfianza." },
      { q:"Puesto que el laboratorio careció de fondos, los investigadores tuvieron que ___ el proyecto.", options:["posponer","acelerar","financiar","publicar"], correct:0, exp:"La falta de fondos tiene como consecuencia lógica posponer el proyecto." },
      { q:"El público aplaudió de pie porque el discurso fue sorprendentemente ___.", options:["conmovedor","aburrido","confuso","largo"], correct:0, exp:"Un aplauso de pie es consecuencia de un discurso conmovedor, no aburrido." },
      { q:"Aunque parecía un problema sencillo, la solución resultó ser mucho más ___ de lo esperado.", options:["compleja","simple","rápida","evidente"], correct:0, exp:"“Aunque parecía sencillo” contrasta con una solución compleja." },
      { q:"El nuevo reglamento, lejos de simplificar los trámites, los volvió aún más ___.", options:["burocráticos","ágiles","claros","breves"], correct:0, exp:"“Lejos de simplificar” anuncia un contraste: los trámites se volvieron más burocráticos." },
      { q:"La montaña estaba cubierta de niebla, así que los excursionistas decidieron ___ el ascenso.", options:["posponer","acelerar","disfrutar","filmar"], correct:0, exp:"Ante la niebla, la consecuencia lógica y prudente es posponer el ascenso." },
      { q:"El profesor elogió el ensayo por su argumentación ___ y bien documentada.", options:["sólida","débil","confusa","superficial"], correct:0, exp:"Un ensayo elogiado tiene una argumentación sólida, no débil ni confusa." },
      { q:"Como el precio del combustible subió drásticamente, muchas familias optaron por ___ el uso del automóvil.", options:["reducir","aumentar","ignorar","celebrar"], correct:0, exp:"Ante la subida de precios, la consecuencia lógica es reducir el uso del automóvil." },
      { q:"A pesar de su juventud, la científica fue reconocida por sus aportes ___ al campo de la genética.", options:["significativos","insignificantes","cuestionables","tardíos"], correct:0, exp:"“A pesar de su juventud” contrasta con haber logrado aportes significativos." },
      { q:"El silencio en la sala era tan ___ que se podía escuchar el tictac del reloj.", options:["absoluto","relativo","incómodo","breve"], correct:0, exp:"Escuchar el tictac del reloj es consecuencia de un silencio absoluto." }
    ]
  },

  lectura: {
    title: "Lectura crítica",
    tagline: "Lee con atención, identifica la idea principal, el tono y el significado de las palabras según el contexto.",
    lesson: {
      intro: "La lectura crítica evalúa cuatro destrezas principales: identificar la idea principal, hacer inferencias razonables, reconocer el tono del autor y deducir el significado de una palabra según el contexto en que aparece (no según su definición de diccionario).",
      points: [
        "La idea principal casi nunca es un detalle: es la afirmación que resume de qué trata todo el párrafo.",
        "Una inferencia válida se apoya en el texto; si necesitas información externa para llegar a ella, probablemente está mal.",
        "Para el significado en contexto, tapa la palabra y piensa qué palabra tuya encajaría ahí; luego busca la opción más parecida.",
        "El tono se detecta en las palabras que elige el autor, no en el tema: un tema triste puede describirse con tono neutral, irónico o alarmista."
      ],
      strategy: "Lee primero las preguntas (sin las opciones) y luego el pasaje. Así sabes qué buscar mientras lees, en lugar de releer varias veces."
    },
    passages: {
      p1: { title:"Pasaje 1", text:`Durante siglos, se pensó que dormir era simplemente una pausa obligatoria, un tiempo muerto entre un día de actividad y el siguiente. Hoy sabemos que ocurre justamente lo contrario: mientras dormimos, el cerebro entra en uno de sus periodos más activos. Consolida recuerdos recientes, descarta información irrelevante y hasta parece "limpiar" sustancias de desecho acumuladas durante las horas de vigilia. Los estudiantes que sacrifican horas de sueño para memorizar la noche antes de un examen suelen obtener el efecto contrario al que buscan: sin el tiempo necesario para consolidar lo aprendido, buena parte de esa información se pierde en cuestión de días. Los especialistas insisten en que dormir bien no es una recompensa después de estudiar, sino una parte más del proceso de aprender.` },
      p2: { title:"Pasaje 2", text:`Durante mucho tiempo, la biblioteca pública fue sinónimo de silencio absoluto y estanterías interminables. En las últimas décadas, sin embargo, muchas bibliotecas han reinventado su función: además de prestar libros, ofrecen talleres de programación, espacios de trabajo colaborativo e incluso asesoría para buscar empleo. Este cambio no responde a una moda pasajera, sino a una pregunta más profunda sobre para qué sirve una institución pública en una época donde la información parece estar a un clic de distancia. La respuesta que han encontrado muchas bibliotecas es que su valor ya no está solo en los libros que resguardan, sino en el acceso equitativo que ofrecen a herramientas, tecnología y compañía humana que no todos pueden costear por su cuenta.` },
      p3: { title:"Pasaje 3", text:`Durante buena parte del siglo XX, el crecimiento de las ciudades se midió casi exclusivamente en kilómetros de asfalto y número de edificios. Los parques y árboles se consideraban un lujo decorativo, algo que se agregaba si sobraba espacio y presupuesto, no una necesidad. Esa mentalidad ha empezado a cambiar. Estudios recientes muestran que los barrios con más áreas verdes registran temperaturas más bajas en épocas de calor extremo, mejor calidad del aire y hasta menores niveles de estrés reportados por sus habitantes. Ante este panorama, varias ciudades han comenzado a exigir que los nuevos proyectos de construcción incluyan un porcentaje mínimo de vegetación, no como un adorno estético, sino como una infraestructura tan esencial como el sistema eléctrico o el de agua potable.` }
    },
    questions: [
      { passageId:"p1", q:"¿Cuál es la idea principal del pasaje?", options:["Dormir es una pausa sin ninguna función biológica importante.","El sueño es una parte activa y necesaria del proceso de aprendizaje.","Los estudiantes nunca deben estudiar de noche.","El cerebro descansa completamente durante el sueño."], correct:1, exp:"Todo el pasaje explica que el sueño consolida el aprendizaje; la conclusión final lo resume directamente." },
      { passageId:"p1", q:"Según el pasaje, ¿qué se puede inferir sobre estudiar toda la noche antes de un examen?", options:["Es la estrategia más efectiva para memorizar.","Puede resultar contraproducente porque el cerebro no consolida lo aprendido.","No tiene ningún efecto sobre el rendimiento.","Mejora la memoria a largo plazo."], correct:1, exp:"El texto dice explícitamente que sacrificar el sueño produce “el efecto contrario al que buscan”." },
      { passageId:"p1", q:"En el contexto del pasaje, la palabra \"vigilia\" significa más precisamente:", options:["Sueño profundo","Estado de estar despierto","Una enfermedad","Un tipo de descanso"], correct:1, exp:"El texto contrasta “horas de vigilia” con el tiempo dormido, por lo que vigilia se refiere a las horas despierto." },
      { passageId:"p1", q:"El tono del autor hacia la idea de sacrificar el sueño por estudiar es:", options:["Entusiasta","De advertencia","Indiferente","Irónico"], correct:1, exp:"El autor señala una consecuencia negativa de esa práctica, lo cual es una forma de advertencia." },
      { passageId:"p1", q:"Según el pasaje, ¿qué hace el cerebro mientras dormimos, además de consolidar recuerdos?", options:["Descarta información irrelevante","Deja de funcionar por completo","Genera nuevos recuerdos falsos","Aumenta la producción de adrenalina"], correct:0, exp:"El pasaje menciona explícitamente que el cerebro “descarta información irrelevante” mientras dormimos." },
      { passageId:"p1", q:"¿Qué se puede inferir sobre la opinión de los especialistas mencionados en el pasaje?", options:["Consideran que dormir es un lujo prescindible.","Consideran que dormir es una parte esencial del aprendizaje.","Recomiendan dormir menos para rendir más.","No tienen una posición clara al respecto."], correct:1, exp:"Los especialistas insisten en que dormir es “una parte más del proceso de aprender”." },
      { passageId:"p1", q:"En el contexto del pasaje, la palabra \"consolida\" significa más precisamente:", options:["Debilita","Afirma o refuerza","Elimina","Confunde"], correct:1, exp:"“Consolida recuerdos” significa que los refuerza y los fija, no que los debilita." },
      { passageId:"p1", q:"¿Qué comparación hace el autor sobre la función del sueño?", options:["Lo compara con una recompensa después de estudiar.","Lo compara con una parte más del proceso de aprender.","Lo compara con una pérdida de tiempo.","Lo compara con una enfermedad."], correct:1, exp:"El pasaje concluye explícitamente que dormir “no es una recompensa... sino una parte más del proceso de aprender”." },
      { passageId:"p1", q:"¿Cuál sería el propósito principal del autor al escribir este pasaje?", options:["Entretener con curiosidades sobre el sueño.","Convencer al lector de la importancia del sueño en el aprendizaje.","Vender un producto relacionado con el sueño.","Narrar una historia personal."], correct:1, exp:"Todo el pasaje construye un argumento a favor de la importancia del sueño para aprender." },
      { passageId:"p2", q:"¿Cuál es la idea principal del pasaje?", options:["Las bibliotecas han desaparecido por la falta de lectores.","Las bibliotecas han ampliado su función más allá de prestar libros, ofreciendo acceso equitativo a recursos.","La tecnología ha vuelto innecesarias a las bibliotecas.","Las bibliotecas solo deben ofrecer silencio y estanterías."], correct:1, exp:"El pasaje describe nuevos servicios de las bibliotecas y concluye que su valor está en el acceso equitativo." },
      { passageId:"p2", q:"Se puede inferir que el cambio en la función de las bibliotecas responde principalmente a:", options:["Una necesidad de ofrecer acceso equitativo a recursos que no todos pueden costear.","Una orden gubernamental sin relación con los usuarios.","El deseo de competir con las librerías comerciales.","La eliminación total de los libros impresos."], correct:0, exp:"El pasaje concluye explícitamente que el valor de las bibliotecas está en “el acceso equitativo”." },
      { passageId:"p2", q:"En el contexto del pasaje, la palabra \"resguardan\" significa más precisamente:", options:["Destruyen","Protegen o conservan","Venden","Catalogan"], correct:1, exp:"“Los libros que resguardan” se refiere a los libros que la biblioteca conserva y protege." },
      { passageId:"p2", q:"El tono del autor a lo largo del pasaje es principalmente:", options:["Sarcástico","Reflexivo","Alarmista","Indiferente"], correct:1, exp:"El autor analiza con calma el cambio de función de las bibliotecas, sin burla ni alarma." },
      { passageId:"p2", q:"Según el pasaje, ¿cuál de los siguientes servicios ofrecen actualmente muchas bibliotecas?", options:["Asesoría para buscar empleo","Venta de libros usados","Clases de idiomas extranjeros","Servicio de streaming de películas"], correct:0, exp:"El pasaje menciona explícitamente “asesoría para buscar empleo” entre los nuevos servicios." },
      { passageId:"p2", q:"En el contexto del pasaje, la expresión \"moda pasajera\" significa más precisamente:", options:["Una tendencia de vestimenta","Un cambio breve y sin fundamento duradero","Una ley permanente","Un evento cultural"], correct:1, exp:"El autor usa la expresión para descartar que el cambio sea algo breve y superficial, sin fundamento real." },
      { passageId:"p2", q:"Según el pasaje, ¿qué ofrecían tradicionalmente las bibliotecas antes de este cambio?", options:["Talleres de programación","Préstamo de libros y silencio","Asesoría de empleo","Espacios de trabajo colaborativo"], correct:1, exp:"El pasaje describe que antes la biblioteca “fue sinónimo de silencio absoluto” y préstamo de libros." },
      { passageId:"p2", q:"¿Qué se puede inferir sobre el acceso a la información en la época actual, según el pasaje?", options:["Es cada vez más difícil de conseguir.","Parece estar fácilmente disponible con un clic.","Solo se consigue en bibliotecas.","Ha desaparecido por completo."], correct:1, exp:"El pasaje dice que la información “parece estar a un clic de distancia” en la época actual." },
      { passageId:"p2", q:"¿Cuál es el propósito principal del autor al escribir este pasaje?", options:["Criticar a las bibliotecas por cambiar.","Explicar por qué las bibliotecas han evolucionado y cuál es su nuevo valor.","Promocionar un servicio específico.","Narrar la historia completa de las bibliotecas."], correct:1, exp:"El pasaje explica el cambio de función de las bibliotecas y concluye señalando su nuevo valor central." },
      { passageId:"p3", q:"¿Cuál es la idea principal del pasaje?", options:["Las ciudades ya no necesitan parques porque el asfalto es más práctico.","Las áreas verdes urbanas están dejando de considerarse un lujo y empiezan a tratarse como una necesidad.","La vegetación en las ciudades es solo un elemento decorativo.","El crecimiento urbano depende únicamente del número de edificios."], correct:1, exp:"El pasaje describe el cambio de mentalidad hacia las áreas verdes, de lujo a necesidad." },
      { passageId:"p3", q:"Se puede inferir que las nuevas normativas de construcción responden principalmente a:", options:["El deseo de embellecer las ciudades sin ningún propósito práctico.","Evidencia sobre los beneficios de la vegetación en la temperatura, el aire y el estrés.","La escasez de terrenos disponibles para construir.","Una moda pasajera sin respaldo de estudios."], correct:1, exp:"El pasaje cita estudios sobre beneficios concretos que respaldan las nuevas exigencias." },
      { passageId:"p3", q:"En el contexto del pasaje, la palabra \"panorama\" significa más precisamente:", options:["Vista desde una montaña","Situación general de un tema","Un tipo de fotografía panorámica","Un edificio alto"], correct:1, exp:"“Ante este panorama” se refiere a la situación general descrita, no a un paisaje literal." },
      { passageId:"p3", q:"En el contexto del pasaje, la palabra \"infraestructura\" significa más precisamente:", options:["Un edificio de gran altura","Un elemento decorativo","Un conjunto de servicios y elementos básicos necesarios","Un tipo de vegetación"], correct:2, exp:"Se compara la vegetación con el sistema eléctrico o de agua: un servicio básico necesario." },
      { passageId:"p3", q:"El tono del autor a lo largo del pasaje es principalmente:", options:["Alarmista","Crítico con el pasado y esperanzador con el presente","Indiferente","Humorístico"], correct:1, exp:"El autor cuestiona la mentalidad antigua y describe con optimismo el cambio actual." },
      { passageId:"p3", q:"Según el pasaje, ¿qué beneficio NO se menciona explícitamente sobre las áreas verdes?", options:["Menor temperatura en climas cálidos","Mejor calidad del aire","Aumento del valor de las propiedades","Menores niveles de estrés"], correct:2, exp:"El pasaje menciona temperatura, calidad del aire y estrés, pero no el valor de las propiedades." },
      { passageId:"p3", q:"¿Qué actitud tenían las ciudades hacia los parques durante buena parte del siglo XX, según el pasaje?", options:["Los consideraban una prioridad de infraestructura.","Los veían como un lujo decorativo y prescindible.","Los prohibían por completo.","Los usaban solo para eventos deportivos."], correct:1, exp:"El pasaje dice explícitamente que se consideraban “un lujo decorativo”." },
      { passageId:"p3", q:"¿Qué exigen ahora varias ciudades a los nuevos proyectos de construcción, según el pasaje?", options:["Un porcentaje mínimo de vegetación","La eliminación total del asfalto","La construcción exclusiva de parques","La reducción del número de edificios"], correct:0, exp:"El pasaje lo indica directamente: exigen “un porcentaje mínimo de vegetación”." },
      { passageId:"p3", q:"En el contexto del pasaje, la palabra \"exclusivamente\" significa más precisamente:", options:["Únicamente","Parcialmente","Nunca","Nuevamente"], correct:0, exp:"“Se midió casi exclusivamente” equivale a decir que se medía casi únicamente de esa forma." }
    ]
  },

  redaccion: {
    title: "Redacción indirecta",
    tagline: "Reconoce errores de gramática, concordancia y estilo, y elige la versión más clara y correcta de una oración.",
    lesson: {
      intro: "La redacción indirecta no pide que escribas: pide que detectes errores o mejores una oración ya escrita. Los errores más comunes giran alrededor de cinco áreas: concordancia (sujeto-verbo, género-número), uso de pronombres, tiempos verbales, conectores lógicos y redundancia o claridad.",
      points: [
        "Concordancia: el verbo debe coincidir en número con el sujeto real de la oración, no con la palabra más cercana.",
        "Pronombres: cada pronombre (él, ella, este, quien) debe tener un referente claro; cuidado con el laísmo (“la dijeron” en vez de “le dijeron”).",
        "Tiempos verbales: si una oración empieza en pasado, no debe saltar sin razón al presente o futuro.",
        "Redundancia: elimina palabras que repiten una idea ya expresada (“subir arriba”, “volver a repetir”).",
        "Dequeísmo y queísmo: “pienso que” (no “pienso de que”); “estoy seguro de que” (no “estoy seguro que”).",
        "La opción correcta suele ser la más simple y directa, no la más larga o adornada."
      ],
      chips: ["Concordancia sujeto-verbo", "Pronombres y referentes", "Tiempos verbales", "Redundancia", "Dequeísmo / queísmo", "Acentuación diacrítica", "Claridad y economía"],
      strategy: "Lee la oración en voz alta (mentalmente). Los errores de concordancia y de tiempo verbal casi siempre “suenan mal” antes de que sepas explicar por qué."
    },
    questions: [
      { q:"Identifica la oración correctamente escrita:", options:["El grupo de estudiantes llegaron tarde a la conferencia.","El grupo de estudiantes llegó tarde a la conferencia.","El grupo de estudiantes ha llegaron tarde a la conferencia.","El grupo de estudiantes llegando tarde a la conferencia."], correct:1, exp:"El sujeto real es “el grupo” (singular); el verbo debe concordar en singular: “llegó”." },
      { q:"¿Cuál versión corrige el error de la oración: “Cada uno de los candidatos presentaron su propuesta”?", options:["Cada uno de los candidatos presentó su propuesta.","Cada uno de los candidatos presenta sus propuestas.","Cada una de los candidatos presentaron su propuesta.","Cada uno de los candidatos presentaron sus propuesta."], correct:0, exp:"“Cada uno” es singular y rige el verbo en singular: “presentó”." },
      { q:"Elige la oración sin ambigüedad en el uso del pronombre:", options:["Cuando Carlos habló con su hermano, él se molestó mucho.","Cuando Carlos habló con su hermano, su hermano se molestó mucho.","Él se molestó mucho cuando Carlos habló con su hermano.","Se molestó mucho cuando habló con su hermano."], correct:1, exp:"En la primera opción no queda claro a quién se refiere “él”. Repetir “su hermano” elimina la ambigüedad." },
      { q:"¿Cuál oración mantiene el tiempo verbal de forma consistente?", options:["Ayer llovió toda la tarde y los ríos se desbordan.","Ayer llueve toda la tarde y los ríos se desbordaron.","Ayer llovió toda la tarde y los ríos se desbordaron.","Ayer ha llovido toda la tarde y los ríos se desbordarán."], correct:2, exp:"Toda la oración describe un evento pasado; ambos verbos deben estar en pretérito." },
      { q:"Selecciona la oración sin redundancia:", options:["Subió arriba para revisar el tanque de agua.","Subió para revisar el tanque de agua.","Volvió a subir arriba de nuevo otra vez.","Subió hacia arriba para revisar el tanque."], correct:1, exp:"“Subir” ya implica ir hacia arriba, así que “arriba” es redundante." },
      { q:"¿Cuál es la versión más clara y directa de la idea?", options:["Debido al hecho de que llovía, decidimos cancelar el evento que habíamos planeado.","Como llovía, decidimos cancelar el evento.","En vista del hecho de la lluvia, se tomó la decisión de la cancelación del evento.","Por causa de que estaba lloviendo fue que cancelamos el evento planeado."], correct:1, exp:"La redacción indirecta premia la claridad y la economía de palabras." },
      { q:"Identifica el error en: “Entre tú y yo, no hay ningún secreto entre nosotros dos.”", options:["No tiene ningún error.","Falta un verbo en la oración.","Hay redundancia: “entre nosotros dos” repite la idea de “entre tú y yo”.","El pronombre “tú” está mal usado."], correct:2, exp:"La oración repite la misma idea dos veces; basta con “no hay ningún secreto entre nosotros”." },
      { q:"¿Cuál oración usa correctamente el conector lógico?", options:["Estudió toda la semana, sin embargo, aprobó el examen con la nota más alta.","Estudió toda la semana, porque aprobó el examen con la nota más alta.","Estudió toda la semana, por lo tanto, aprobó el examen con la nota más alta.","Estudió toda la semana, aunque no aprobó, sacó la nota más alta."], correct:2, exp:"Estudiar y aprobar con la nota más alta es causa-efecto; “por lo tanto” es el conector correcto." },
      { q:"¿Cuál oración corrige correctamente la concordancia del pronombre relativo?", options:["Los alumnos, quien llegaron tarde, no pudieron entrar.","Los alumnos, quienes llegaron tarde, no pudieron entrar.","Los alumnos, cual llegaron tarde, no pudieron entrar.","Los alumnos, que llegó tarde, no pudieron entrar."], correct:1, exp:"El pronombre relativo debe concordar en número con “los alumnos”: “quienes”." },
      { q:"Elige la oración con el uso correcto de la preposición:", options:["El proyecto consiste de tres partes.","El proyecto consiste en tres partes.","El proyecto consiste con tres partes.","El proyecto consiste para tres partes."], correct:1, exp:"El verbo “consistir” rige la preposición “en”, no “de”." },
      { q:"¿Cuál versión evita la cadena confusa de gerundios?", options:["Salió corriendo con un paraguas roto porque la lluvia era intensa.","Salió corriendo llevando un paraguas roto siendo la lluvia intensa.","Saliendo corriendo, llevando paraguas roto, la lluvia siendo intensa.","Salió, corriendo, llevando, un paraguas roto, lluvia intensa."], correct:0, exp:"Encadenar gerundios (llevando... siendo...) es confuso; es más claro usar “porque”." },
      { q:"¿Cuál oración usa correctamente las comas para una cláusula explicativa?", options:["Mi hermano, que vive en Madrid llegó ayer.","Mi hermano que vive en Madrid, llegó ayer.","Mi hermano, que vive en Madrid, llegó ayer.","Mi hermano que, vive en Madrid llegó, ayer."], correct:2, exp:"Una cláusula explicativa debe ir entre comas por ambos lados." },
      { q:"Identifica la oración sin dequeísmo:", options:["Pienso de que la reunión fue un éxito.","Pienso que la reunión fue un éxito.","Pienso en que la reunión fue un éxito.","Pienso a que la reunión fue un éxito."], correct:1, exp:"El verbo “pensar” (opinar) no lleva “de”: lo correcto es “pienso que”." },
      { q:"¿Cuál oración evita el laísmo?", options:["A María la dijeron que había ganado el premio.","A María le dijeron que había ganado el premio.","A María les dijeron que había ganado el premio.","A María se dijeron que había ganado el premio."], correct:1, exp:"“Decir” rige un objeto indirecto (le), no directo (la); usar “la” aquí es laísmo." },
      { q:"¿Cuál oración usa correctamente el verbo impersonal \"haber\"?", options:["Habían muchas personas en la fiesta.","Había muchas personas en la fiesta.","Habían muchos personas en la fiesta.","Había muchos persona en la fiesta."], correct:1, exp:"El “haber” impersonal siempre va en singular, sin importar cuántas personas haya: “había”." },
      { q:"Identifica la oración sin queísmo:", options:["Estoy seguro que ganaremos.","Estoy seguro de que ganaremos.","Estoy seguro en que ganaremos.","Estoy seguro por que ganaremos."], correct:1, exp:"“Estar seguro” rige la preposición “de”: “estoy seguro de que”." },
      { q:"¿Cuál versión evita el gerundio de posterioridad, incorrecto en español?", options:["Estudió toda la noche, aprobando el examen al día siguiente.","Estudió toda la noche y aprobó el examen al día siguiente.","Habiendo estudiado toda la noche, aprobando el examen al día siguiente.","Estudió toda la noche, y aprobando, el examen al día siguiente."], correct:1, exp:"El gerundio no debe expresar una acción posterior; lo correcto es usar “y” más el verbo conjugado." },
      { q:"¿Cuál versión es más clara y natural?", options:["El pastel fue comido por los niños en cinco minutos.","Los niños comieron el pastel en cinco minutos.","El pastel es comido siendo por los niños en cinco minutos.","Fue el pastel comido por los niños en cinco minutos."], correct:1, exp:"La voz activa suele ser más clara y directa que la pasiva innecesaria." },
      { q:"¿Cuál oración usa correctamente \"sino que\"?", options:["No vino a la fiesta, si no que se quedó trabajando.","No vino a la fiesta, sino que se quedó trabajando.","No vino a la fiesta, sino se quedó trabajando quedándose.","No vino a la fiesta si no se quedó trabajando."], correct:1, exp:"Para contraponer dos acciones con verbo propio se usa “sino que”, escrito junto." },
      { q:"¿Cuál oración usa correctamente \"mas\" con el sentido de \"pero\"?", options:["Quería ir, más no tenía tiempo.","Quería ir, mas no tenía tiempo.","Quería ir mas, no tenía tiempo.","Quería ir, masno tenía tiempo."], correct:1, exp:"“Mas” sin tilde equivale a “pero”; “más” con tilde indica cantidad." },
      { q:"¿Cuál oración usa correctamente \"sé\" del verbo saber?", options:["Se que la respuesta es correcta.","Sé que la respuesta es correcta.","Sé, que la respuesta es correcta.","Se qué la respuesta es correcta."], correct:1, exp:"“Sé” (con tilde) es la forma del verbo saber; “se” sin tilde es un pronombre." },
      { q:"¿Cuál oración usa correctamente \"por qué\" y \"porque\"?", options:["¿Porque llegaste tarde? Por qué el autobús se retrasó.","¿Por qué llegaste tarde? Porque el autobús se retrasó.","¿Por qué llegaste tarde? Por que el autobús se retrasó.","¿Porqué llegaste tarde? Porque el autobús se retrasó."], correct:1, exp:"La pregunta usa “por qué” (separado, con tilde); la respuesta usa “porque” (junto, sin tilde)." },
      { q:"Selecciona la oración sin pleonasmo:", options:["Prefiero entrar adentro para protegerme de la lluvia.","Prefiero entrar para protegerme de la lluvia.","Prefiero entrar hacia adentro para protegerme de la lluvia.","Prefiero entrarme adentro para protegerme de la lluvia."], correct:1, exp:"“Entrar” ya implica ir hacia adentro; agregar “adentro” es redundante." },
      { q:"¿Cuál oración presenta el orden más claro de las ideas?", options:["De la ventana por la que ayer se asomó Juan cayó una maceta.","Ayer, una maceta cayó de la ventana por la que se asomó Juan.","Cayó una maceta de la ventana ayer por la que se asomó Juan.","Por la que se asomó Juan ayer, de la ventana, cayó una maceta."], correct:1, exp:"Un orden más directo (sujeto y acción antes del detalle) resulta mucho más claro de seguir." },
      { q:"¿Cuál oración respeta la correlación correcta de tiempos verbales?", options:["Le pedí que llegue temprano.","Le pedí que llegara temprano.","Le pediré que llegara temprano.","Le pedí que ha llegado temprano."], correct:1, exp:"Un verbo principal en pasado (pedí) exige el subjuntivo también en pasado: “llegara”." },
      { q:"Identifica la oración con la concordancia de género correcta:", options:["La programa de televisión fue cancelada.","El programa de televisión fue cancelado.","El programa de televisión fue cancelada.","La programa de televisión fue cancelado."], correct:1, exp:"“Programa” es un sustantivo masculino: “el programa... cancelado”." },
      { q:"¿Cuál oración distingue correctamente \"a ver\" de \"haber\"?", options:["Vamos haber la película esta noche.","Vamos a ver la película esta noche.","Vamos aver la película esta noche.","Vamos, haber la película, esta noche."], correct:1, exp:"Cuando se trata del verbo “ver” (mirar), se escribe “a ver”, separado." },
      { q:"¿Cuál oración usa correctamente la forma \"haya\"?", options:["Espero que todo se halla resuelto.","Espero que todo se haya resuelto.","Espero que todo se allá resuelto.","Espero que todo se aya resuelto."], correct:1, exp:"“Haya” es la forma del verbo haber en subjuntivo; “halla” viene de “hallar” y “allá” es un adverbio de lugar." },
      { q:"Identifica la oración con la concordancia correcta:", options:["Los medio de comunicaciones informaron del incidente.","Los medios de comunicación informaron del incidente.","Los medios de comunicaciones informó del incidente.","El medios de comunicación informaron del incidente."], correct:1, exp:"La expresión fija es “los medios de comunicación”, con “medios” en plural y “comunicación” en singular." },
      { q:"¿Cuál oración usa correctamente el pronombre interrogativo \"cuál\"?", options:["¿Cual es tu nombre?","¿Cuál es tu nombre?","¿Cuáles es tu nombre?","¿Cual es tu nombres?"], correct:1, exp:"En preguntas directas, “cuál” lleva tilde y debe concordar en número con lo que pregunta." },
      { q:"¿Cuál oración usa correctamente \"adónde\"?", options:["¿Adonde vas esta tarde?","¿Adónde vas esta tarde?","¿A donde vas esta tarde?","¿Aonde vas esta tarde?"], correct:1, exp:"El interrogativo de dirección se escribe junto y con tilde: “adónde”." },
      { q:"Identifica la oración con la concordancia correcta de \"ambos\":", options:["Ambos estudiante aprobó el examen.","Ambos estudiantes aprobaron el examen.","Ambos estudiantes aprobó el examen.","Ambo estudiantes aprobaron el examen."], correct:1, exp:"“Ambos” y el sustantivo que acompaña deben ir en plural, igual que el verbo." },
      { q:"Selecciona la oración sin redundancia con \"sendos\":", options:["Los ganadores recibieron sendos premios, uno cada uno.","Los ganadores recibieron sendos premios.","Los ganadores recibió sendos premios.","Los ganador recibieron sendos premio."], correct:1, exp:"“Sendos” ya significa “uno para cada uno”; añadir “uno cada uno” es redundante." },
      { q:"¿Cuál oración corrige el anacoluto (ruptura de la estructura) de la original?", options:["El problema con los estudiantes que no entregan sus tareas a tiempo, el maestro debe llamarles la atención.","Cuando los estudiantes no entregan sus tareas a tiempo, el maestro debe llamarles la atención.","El problema, los estudiantes no entregan sus tareas, el maestro llamarles la atención.","Los estudiantes que no entregan sus tareas a tiempo, el maestro, debe llamarles la atención."], correct:1, exp:"La oración original empieza una estructura (“el problema con...”) que nunca se completa; reorganizarla con “cuando” la hace coherente." },
      { q:"Selecciona la oración sin redundancia:", options:["El gobierno busca erradicar completamente la enfermedad.","El gobierno busca erradicar la enfermedad.","El gobierno busca erradicar totalmente y completamente la enfermedad.","El gobierno busca erradicar de raíz completamente la enfermedad."], correct:1, exp:"“Erradicar” ya significa eliminar por completo; agregar “completamente” es redundante." },
      { q:"¿Cuál oración usa correctamente \"para\" con sentido de destinatario?", options:["Este regalo es por ti.","Este regalo es para ti.","Este regalo es de por ti.","Este regalo es para de ti."], correct:1, exp:"Para indicar el destinatario de algo se usa “para”, no “por”." },
      { q:"¿Cuál oración usa correctamente el impersonal \"haber\" en tiempo compuesto?", options:["Han habido muchos cambios este año.","Ha habido muchos cambios este año.","Ha habidos muchos cambios este año.","Han habidos muchos cambios este año."], correct:1, exp:"El “haber” impersonal no se pluraliza ni siquiera en tiempos compuestos: “ha habido”." },
      { q:"¿Cuál oración usa correctamente \"sino\" para contraponer sustantivos?", options:["No es un problema técnico, sino que humano.","No es un problema técnico, sino humano.","No es un problema técnico, pero humano.","No es un problema técnico, si no humano."], correct:1, exp:"Para contraponer dos sustantivos (no dos acciones) se usa “sino”, sin “que”." },
      { q:"¿Cuál oración sigue el uso estándar recomendado del objeto directo de persona?", options:["Vi a Pedro y le saludé.","Vi a Pedro y lo saludé.","Vi a Pedro y la saludé.","Vi a Pedro y se saludé."], correct:1, exp:"“Saludar” es transitivo directo; lo recomendado para un referente masculino es “lo”, evitando el leísmo." },
      { q:"¿Cuál oración usa correctamente el conector \"de manera que\"?", options:["Estudió con dedicación, de manera que obtuvo excelentes resultados.","Estudió con dedicación, de manera de obtuvo excelentes resultados.","Estudió con dedicación, de manera a obtener excelentes resultados.","Estudió con dedicación, en manera que obtuvo excelentes resultados."], correct:0, exp:"El conector consecutivo correcto es “de manera que”, seguido de un verbo conjugado." },
      { q:"¿Cuál oración usa correctamente el relativo posesivo \"cuyo\"?", options:["El escritor que su libro ganó el premio será entrevistado.","El escritor cuyo libro ganó el premio será entrevistado.","El escritor cuyo su libro ganó el premio será entrevistado.","El escritor, que el libro ganó el premio, será entrevistado."], correct:1, exp:"“Cuyo” ya indica posesión; no debe combinarse con “su”: “cuyo libro”, no “que su libro”." },
      { q:"Selecciona la oración sin redundancia temporal:", options:["Volveré a repetir la explicación una vez más.","Repetiré la explicación.","Volveré a explicar de nuevo otra vez.","Repetiré de nuevo la explicación una vez más."], correct:1, exp:"“Volver a”, “repetir” y “una vez más” expresan la misma idea tres veces; basta con “repetiré”." }
    ]
  }
};

const TOPIC_ORDER = ["analogias","oraciones","lectura","redaccion"];
const EXAM_PICKS = { analogias:6, oraciones:6, lectura:6, redaccion:9 };
const EXAM_SECONDS = 24*60;

/* ============ STATE ============ */

let state = {
  page: "home",
  mode: "lesson",
  qIndex: 0,
  answers: {},
  progress: {},
  sessions: {}
};

TOPIC_ORDER.forEach(t=>{
  state.answers[t] = {};
  state.progress[t] = {done:false, score:0, total:TOPICS[t].questions.length};
});

let examState = null;
let examBest = null;

/* ============ STORAGE ============ */

async function loadProgress(){
  try{
    const res = await window.storage.get('paa-progress', false);
    if(res && res.value){
      const saved = JSON.parse(res.value);
      state.progress = Object.assign(state.progress, saved.progress || {});
      examBest = saved.examBest || null;
    }
  }catch(e){ /* sin progreso guardado todavía */ }
}

async function saveProgress(){
  try{
    await window.storage.set('paa-progress', JSON.stringify({
      progress: state.progress,
      examBest: examBest
    }), false);
  }catch(e){ console.warn('No se pudo guardar el progreso', e); }
}

/* ============ HELPERS ============ */

function el(tag, attrs={}, children=[]){
  const e = document.createElement(tag);
  Object.entries(attrs).forEach(([k,v])=>{
    if(k === 'class') e.className = v;
    else if(k === 'html') e.innerHTML = v;
    else if(k === 'disabled'){ if(v) e.setAttribute('disabled','true'); }
    else if(k.startsWith('on')) e.addEventListener(k.substring(2), v);
    else e.setAttribute(k, v);
  });
  (Array.isArray(children)?children:[children]).forEach(c=>{
    if(c === null || c === undefined) return;
    if(typeof c === 'string') e.appendChild(document.createTextNode(c));
    else e.appendChild(c);
  });
  return e;
}

function setActiveTab(page){
  document.querySelectorAll('#tabs button').forEach(b=>{
    b.classList.toggle('active', b.dataset.page === page);
  });
}

function shuffle(arr){
  const a = arr.slice();
  for(let i=a.length-1;i>0;i--){
    const j = Math.floor(Math.random()*(i+1));
    [a[i],a[j]] = [a[j],a[i]];
  }
  return a;
}

function fmtTime(sec){
  const m = Math.floor(sec/60).toString().padStart(2,'0');
  const s = (sec%60).toString().padStart(2,'0');
  return m+':'+s;
}

/* Builds a freshly shuffled practice session: question order AND option order randomized */
function buildSession(key){
  const t = TOPICS[key];
  const order = shuffle(t.questions.map((_,i)=>i));
  return order.map(origIdx=>{
    const q = t.questions[origIdx];
    const optOrder = shuffle(q.options.map((_,i)=>i));
    return {
      qText: q.q,
      passageId: q.passageId || null,
      exp: q.exp,
      options: optOrder.map(oi=>q.options[oi]),
      correct: optOrder.indexOf(q.correct)
    };
  });
}

/* ============ PAGES ============ */

function renderHome(){
  const main = document.getElementById('main');
  main.innerHTML = '';

  const hero = el('div',{class:'hero'},[
    el('span',{class:'eyebrow'},'Preparación · Sección verbal'),
    el('h1',{},'Domina las analogías, la lógica de las oraciones, la lectura crítica y la redacción indirecta.'),
    el('p',{},'Cada tema empieza con una lección corta y estrategias concretas, y termina con ejercicios de práctica al estilo del examen. Las preguntas y sus opciones se reparten en un orden distinto cada vez que repites un tema.'),
    el('div',{class:'pair-demo'},[
      el('span',{class:'word-chip'},'MÉDICO'),
      el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
      el('span',{class:'word-chip'},'HOSPITAL'),
      el('span',{style:'color:var(--muted);font-size:.85rem;'},'como'),
      el('span',{class:'word-chip'},'MAESTRO'),
      el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
      el('span',{class:'word-chip'},'?')
    ])
  ]);

  const examBanner = el('div',{class:'exam-banner'},[
    el('div',{},[
      el('span',{class:'eyebrow'},'Modo examen'),
      el('h3',{},'Simulacro cronometrado de 24 minutos'),
      el('p',{},'27 preguntas mezcladas de los cuatro temas, en un orden nuevo cada vez — igual que el día del examen.')
    ]),
    el('button',{class:'btn danger', onclick:()=>goTo('simulacro')},'Comenzar →')
  ]);

  const grid = el('div',{class:'track-grid'});
  TOPIC_ORDER.forEach(key=>{
    const t = TOPICS[key];
    const p = state.progress[key];
    const pct = p.total ? Math.round((p.score/p.total)*100) : 0;
    const card = el('div',{class:'track-card', onclick:()=>{ goTo(key); }},[
      el('span',{class:'eyebrow'}, p.done ? 'Completado' : 'Por practicar'),
      el('h3',{}, t.title),
      el('p',{}, t.tagline),
      el('div',{class:'track-progress-bar'},[el('div',{class:'track-progress-fill', style:`width:${pct}%`})]),
      el('div',{class:'track-meta'},[
        el('span',{}, p.done ? `${p.score}/${p.total} correctas` : `${t.questions.length} ejercicios`),
        el('span',{}, '→')
      ])
    ]);
    grid.appendChild(card);
  });

  main.appendChild(hero);
  main.appendChild(examBanner);
  main.appendChild(grid);
}

function renderProgress(){
  const main = document.getElementById('main');
  main.innerHTML = '';

  const header = el('div',{class:'topic-header'},[
    el('span',{class:'eyebrow'},'Resumen'),
    el('h2',{},'Mi progreso'),
    el('p',{},'Tu avance se guarda automáticamente en este dispositivo.')
  ]);

  let totalScore=0, totalQ=0, topicsDone=0;
  TOPIC_ORDER.forEach(k=>{
    const p = state.progress[k];
    if(p.done){ totalScore+=p.score; totalQ+=p.total; topicsDone++; }
  });
  const overallPct = totalQ ? Math.round((totalScore/totalQ)*100) : 0;

  const stats = el('div',{class:'stat-grid'},[
    el('div',{class:'stat-card'},[el('div',{class:'stat-num'}, `${topicsDone}/${TOPIC_ORDER.length}`), el('div',{class:'stat-label'},'temas completados')]),
    el('div',{class:'stat-card'},[el('div',{class:'stat-num'}, totalQ ? overallPct+'%' : '—'), el('div',{class:'stat-label'},'aciertos en práctica')]),
    el('div',{class:'stat-card'},[el('div',{class:'stat-num'}, examBest ? `${examBest.score}/${examBest.total}` : '—'), el('div',{class:'stat-label'},'mejor simulacro')])
  ]);

  const list = el('div',{class:'progress-list'});
  TOPIC_ORDER.forEach(key=>{
    const t = TOPICS[key];
    const p = state.progress[key];
    const pct = p.total ? Math.round((p.score/p.total)*100) : 0;
    const row = el('div',{class:'progress-row'},[
      el('span',{class:'label'}, t.title),
      el('div',{class:'bar-wrap'},[
        el('div',{class:'track-progress-bar'},[el('div',{class:'track-progress-fill', style:`width:${pct}%`})])
      ]),
      el('span',{class:'eyebrow', style:'color:var(--muted)'}, p.done ? `${p.score}/${p.total}` : 'sin empezar')
    ]);
    list.appendChild(row);
  });

  const resetBtn = el('button',{class:'reset-link', onclick: async ()=>{
    if(confirm('¿Borrar todo tu progreso guardado, incluyendo tu mejor simulacro?')){
      TOPIC_ORDER.forEach(t=>{
        state.progress[t] = {done:false, score:0, total:TOPICS[t].questions.length};
        state.answers[t] = {};
        state.sessions[t] = null;
      });
      examBest = null;
      await saveProgress();
      renderProgress();
    }
  }}, 'Borrar progreso');

  main.appendChild(header);
  main.appendChild(stats);
  main.appendChild(list);
  main.appendChild(resetBtn);
}

function renderTopic(key){
  const main = document.getElementById('main');
  main.innerHTML = '';
  const t = TOPICS[key];

  const header = el('div',{class:'topic-header'},[
    el('span',{class:'eyebrow'}, key === 'redaccion' ? 'Redacción indirecta' : 'Sección verbal'),
    el('h2',{}, t.title),
    el('p',{}, t.tagline)
  ]);

  const toggle = el('div',{class:'mode-toggle'},[
    el('button',{class: state.mode==='lesson' ? 'active':'', onclick:()=>{state.mode='lesson'; renderTopic(key);}}, 'Lección'),
    el('button',{class: state.mode==='practice' ? 'active':'', onclick:()=>{
      state.mode='practice'; state.qIndex=0;
      if(!state.sessions[key]) state.sessions[key] = buildSession(key);
      renderTopic(key);
    }}, 'Práctica')
  ]);

  main.appendChild(header);
  main.appendChild(toggle);

  if(state.mode === 'lesson'){
    main.appendChild(renderLesson(t, key));
  } else {
    if(!state.sessions[key]) state.sessions[key] = buildSession(key);
    main.appendChild(renderPractice(t, key));
  }
}

function renderLesson(t, key){
  const wrap = el('div',{});

  const card = el('div',{class:'lesson-card'},[
    el('h3',{},'Cómo pensar este tipo de ejercicio'),
    el('p',{}, t.lesson.intro)
  ]);

  const ul = el('ul',{});
  t.lesson.points.forEach(pt=> ul.appendChild(el('li',{}, pt)));
  card.appendChild(ul);

  if(t.lesson.chips){
    const chipList = el('ul',{class:'chip-list'});
    t.lesson.chips.forEach(c=> chipList.appendChild(el('li',{}, c)));
    card.appendChild(chipList);
  }

  if(t.lesson.examples){
    t.lesson.examples.forEach(ex=>{
      if(ex.pair){
        const row = el('div',{class:'example-analogy'},[
          el('span',{class:'word-chip'}, ex.pair[0]),
          el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
          el('span',{class:'word-chip'}, ex.pair[1]),
          el('span',{style:'color:var(--muted);font-size:.85rem;'},'→ ' + ex.rel + ' →'),
          el('span',{class:'word-chip'}, ex.test[0]),
          el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
          el('span',{class:'word-chip'}, ex.test[1])
        ]);
        card.appendChild(row);
      } else if(ex.sentence){
        card.appendChild(el('p',{style:'font-style:italic;color:var(--ink-soft);'}, '“' + ex.sentence + '”'));
        card.appendChild(el('p',{style:'color:var(--muted);font-size:.9rem;'}, 'Respuesta: ' + ex.answer + ' — ' + ex.why));
      }
    });
  }

  const strat = el('div',{class:'strategy-box'},[
    el('b',{},'Estrategia'),
    document.createTextNode(t.lesson.strategy)
  ]);
  card.appendChild(strat);
  wrap.appendChild(card);

  if(t.passages){
    Object.values(t.passages).forEach(pg=>{
      const p = el('div',{class:'passage-card'},[
        el('span',{class:'eyebrow'}, pg.title),
        el('p',{}, pg.text)
      ]);
      wrap.appendChild(p);
    });
  }

  const cta = el('div',{style:'text-align:center;margin-top:8px;'},[
    el('button',{class:'btn', onclick:()=>{
      state.mode='practice'; state.qIndex=0;
      if(!state.sessions[key]) state.sessions[key] = buildSession(key);
      renderTopic(key);
    }}, 'Ir a practicar →')
  ]);
  wrap.appendChild(cta);

  return wrap;
}

function renderPractice(t, key){
  const wrap = el('div',{});
  const session = state.sessions[key];
  const total = session.length;
  const i = state.qIndex;

  if(i >= total){
    const answered = state.answers[key];
    let score = 0;
    const missed = [];
    session.forEach((item, idx)=>{
      const a = answered[idx];
      if(a && a.correct) score++;
      else if(a) missed.push({item, idx, selected:a.selected});
    });
    state.progress[key] = {done:true, score, total};
    saveProgress();

    const result = el('div',{class:'exercise-card result-card'},[
      el('span',{class:'eyebrow'},'Resultado'),
      el('div',{class:'result-score'}, `${score} / ${total}`),
      el('p',{}, score === total ? '¡Excelente! Dominas este tema.' : 'Revisa las explicaciones de lo que falló y vuelve a intentarlo cuando quieras — las preguntas y opciones se repartirán en otro orden.'),
      el('div',{style:'display:flex;gap:10px;justify-content:center;margin-top:18px;'},[
        el('button',{class:'btn ghost', onclick:()=>{ state.qIndex=0; state.answers[key]={}; state.sessions[key]=buildSession(key); renderTopic(key); }}, 'Intentar de nuevo'),
        el('button',{class:'btn', onclick:()=>{ goTo('home'); }}, 'Volver al inicio')
      ])
    ]);

    if(missed.length){
      const reviewWrap = el('div',{class:'review-list'});
      reviewWrap.appendChild(el('h3',{style:'font-size:1rem;margin-top:24px;'}, `Repasa lo que falló (${missed.length})`));
      missed.forEach(m=>{
        reviewWrap.appendChild(el('div',{class:'review-item'},[
          el('div',{class:'rq'}, m.item.qText),
          el('div',{class:'rline ryour'}, 'Tu respuesta: ' + m.item.options[m.selected]),
          el('div',{class:'rline rcorrect'}, 'Correcta: ' + m.item.options[m.item.correct]),
          el('div',{class:'rexp'}, m.item.exp)
        ]));
      });
      result.appendChild(reviewWrap);
    }

    wrap.appendChild(result);
    return wrap;
  }

  const item = session[i];
  const already = state.answers[key][i];

  wrap.appendChild(el('div',{class:'progress-track'},[
    el('div',{class:'progress-track-fill', style:`width:${(i/total)*100}%`})
  ]));

  const card = el('div',{class:'exercise-card'});

  if(item.passageId && t.passages){
    const pg = t.passages[item.passageId];
    card.appendChild(el('div',{class:'passage-card', style:'margin:-4px 0 20px;'},[
      el('span',{class:'eyebrow'}, pg.title),
      el('p',{}, pg.text)
    ]));
  }

  card.appendChild(el('div',{class:'qnum'},[
    el('span',{}, `Ejercicio ${i+1} de ${total}`)
  ]));
  card.appendChild(el('p',{class:'qtext'}, item.qText));

  const optionsWrap = el('div',{class:'options'});
  item.options.forEach((opt, idx)=>{
    const optBtn = el('button',{class:'option'},[
      el('span',{class:'key'}, String(idx+1)),
      el('span',{}, opt)
    ]);
    if(already){
      optBtn.setAttribute('disabled','true');
      if(idx === item.correct) optBtn.classList.add('correct');
      if(idx === already.selected && idx !== item.correct) optBtn.classList.add('incorrect');
    }
    optBtn.addEventListener('click', ()=>{
      if(state.answers[key][i]) return;
      state.answers[key][i] = {selected: idx, correct: idx === item.correct};
      saveProgress();
      renderTopic(key);
    });
    optionsWrap.appendChild(optBtn);
  });
  card.appendChild(optionsWrap);

  const feedback = el('div',{class:'feedback' + (already ? ' show ' + (already.correct?'correct':'incorrect') : '')},[
    el('b',{}, already ? (already.correct ? 'Correcto' : 'No es la respuesta') : ''),
    document.createTextNode(already ? item.exp : '')
  ]);
  card.appendChild(feedback);

  const navRow = el('div',{class:'nav-row'},[
    el('button',{class:'btn ghost', disabled: i===0, onclick:()=>{ state.qIndex--; renderTopic(key); }}, '← Anterior'),
    el('button',{class:'btn', disabled: !already, onclick:()=>{ state.qIndex++; renderTopic(key); }}, i === total-1 ? 'Ver resultado' : 'Siguiente →')
  ]);
  card.appendChild(navRow);

  wrap.appendChild(card);
  return wrap;
}

/* ============ EXAM MODE ============ */

function buildExam(){
  const list = [];
  TOPIC_ORDER.forEach(key=>{
    const t = TOPICS[key];
    const n = Math.min(EXAM_PICKS[key], t.questions.length);
    const idxs = shuffle(t.questions.map((_,i)=>i)).slice(0, n);
    idxs.forEach(idx=>{
      const q = t.questions[idx];
      const optOrder = shuffle(q.options.map((_,i)=>i));
      list.push({
        topic:key,
        qText: q.q,
        passageId: q.passageId || null,
        exp: q.exp,
        options: optOrder.map(oi=>q.options[oi]),
        correct: optOrder.indexOf(q.correct)
      });
    });
  });
  return shuffle(list);
}

function startExam(){
  examState = {
    questions: buildExam(),
    answers: {},
    index: 0,
    timeLeft: EXAM_SECONDS,
    finished: false
  };
  examState.timerId = setInterval(()=>{
    examState.timeLeft--;
    if(examState.timeLeft <= 0){
      clearInterval(examState.timerId);
      examState.timeLeft = 0;
      finishExam();
      return;
    }
    const tEl = document.getElementById('exam-timer');
    if(tEl){
      tEl.textContent = fmtTime(examState.timeLeft);
      tEl.classList.toggle('low', examState.timeLeft <= 60);
    }
  },1000);
  renderExam();
}

function finishExam(){
  if(examState && examState.timerId) clearInterval(examState.timerId);
  if(examState) examState.finished = true;
  let score = 0;
  const byTopic = {};
  TOPIC_ORDER.forEach(k=> byTopic[k] = {score:0,total:0});
  examState.questions.forEach((item, idx)=>{
    byTopic[item.topic].total++;
    const a = examState.answers[idx];
    if(a && a.selected === item.correct){ score++; byTopic[item.topic].score++; }
  });
  const total = examState.questions.length;
  if(!examBest || score > examBest.score){
    examBest = {score, total, date: new Date().toISOString().slice(0,10)};
    saveProgress();
  }
  examState.result = {score, total, byTopic};
  renderExam();
}

function renderExam(){
  const main = document.getElementById('main');
  main.innerHTML = '';

  if(!examState){
    const intro = el('div',{class:'exam-intro-card'},[
      el('span',{class:'eyebrow'},'Modo examen'),
      el('h2',{}, 'Simulacro cronometrado'),
      el('p',{style:'color:var(--muted);max-width:60ch;line-height:1.6;'}, 'Este simulacro mezcla preguntas de los cuatro temas, sin mostrarte la lección de por medio, igual que el día real del examen. Cada vez que lo comienzas, las preguntas y las opciones se reparten en un orden nuevo.'),
      el('ul',{},[
        el('li',{}, `27 preguntas: ${EXAM_PICKS.analogias} de analogías, ${EXAM_PICKS.oraciones} de completar oraciones, ${EXAM_PICKS.lectura} de lectura crítica y ${EXAM_PICKS.redaccion} de redacción indirecta.`),
        el('li',{}, `Tienes ${EXAM_SECONDS/60} minutos en total. El simulacro se cierra automáticamente cuando el tiempo termina.`),
        el('li',{}, 'No verás si acertaste hasta el final — así practicas el ritmo real del examen.'),
        el('li',{}, 'Al terminar, obtienes tu puntaje por sección y un repaso de cada pregunta que fallaste.')
      ]),
      el('button',{class:'btn danger', style:'margin-top:10px;', onclick: startExam}, 'Comenzar simulacro')
    ]);
    main.appendChild(intro);
    return;
  }

  if(examState.finished){
    renderExamResult();
    return;
  }

  const total = examState.questions.length;
  const i = examState.index;
  const item = examState.questions[i];
  const already = examState.answers[i];

  const timerBar = el('div',{class:'timer-bar'},[
    el('span',{}, `Pregunta ${i+1} de ${total} · ${TOPICS[item.topic].title}`),
    el('span',{class:'time' + (examState.timeLeft<=60?' low':''), id:'exam-timer'}, fmtTime(examState.timeLeft))
  ]);
  main.appendChild(timerBar);

  main.appendChild(el('div',{class:'progress-track'},[
    el('div',{class:'progress-track-fill exam', style:`width:${(i/total)*100}%`})
  ]));

  const card = el('div',{class:'exercise-card'});

  if(item.passageId){
    const pg = TOPICS.lectura.passages[item.passageId];
    card.appendChild(el('div',{class:'passage-card', style:'margin:-4px 0 20px;'},[
      el('span',{class:'eyebrow'}, pg.title),
      el('p',{}, pg.text)
    ]));
  }

  card.appendChild(el('p',{class:'qtext'}, item.qText));

  const optionsWrap = el('div',{class:'options'});
  item.options.forEach((opt, idx)=>{
    const optBtn = el('button',{class:'option' + (already && already.selected===idx ? ' selected':'')},[
      el('span',{class:'key'}, String(idx+1)),
      el('span',{}, opt)
    ]);
    optBtn.addEventListener('click', ()=>{
      examState.answers[i] = {selected: idx};
      renderExam();
    });
    optionsWrap.appendChild(optBtn);
  });
  card.appendChild(optionsWrap);

  const navRow = el('div',{class:'nav-row'},[
    el('button',{class:'btn ghost', disabled: i===0, onclick:()=>{ examState.index--; renderExam(); }}, '← Anterior'),
    i === total-1
      ? el('button',{class:'btn danger', onclick: finishExam}, 'Finalizar simulacro')
      : el('button',{class:'btn', onclick:()=>{ examState.index++; renderExam(); }}, 'Siguiente →')
  ]);
  card.appendChild(navRow);

  main.appendChild(card);
}

function renderExamResult(){
  const main = document.getElementById('main');
  const r = examState.result;

  const result = el('div',{class:'exercise-card result-card'},[
    el('span',{class:'eyebrow'},'Resultado del simulacro'),
    el('div',{class:'result-score'}, `${r.score} / ${r.total}`),
    el('p',{}, examBest && examBest.score===r.score ? '¡Nuevo mejor resultado guardado!' : 'Así te fue en este intento.')
  ]);

  const breakdown = el('div',{class:'breakdown'});
  TOPIC_ORDER.forEach(k=>{
    const b = r.byTopic[k];
    if(b.total===0) return;
    breakdown.appendChild(el('div',{class:'chip'},[
      el('b',{}, `${b.score}/${b.total}`),
      TOPICS[k].title
    ]));
  });
  result.appendChild(breakdown);

  result.appendChild(el('div',{style:'display:flex;gap:10px;justify-content:center;margin-top:8px;'},[
    el('button',{class:'btn ghost', onclick:()=>{ examState=null; renderExam(); }}, 'Nuevo simulacro'),
    el('button',{class:'btn', onclick:()=>{ goTo('home'); }}, 'Volver al inicio')
  ]));

  const missed = [];
  examState.questions.forEach((item, idx)=>{
    const a = examState.answers[idx];
    if(!a || a.selected !== item.correct) missed.push({item, idx, selected: a ? a.selected : null});
  });

  if(missed.length){
    const reviewWrap = el('div',{class:'review-list'});
    reviewWrap.appendChild(el('h3',{style:'font-size:1rem;margin-top:24px;'}, `Repasa lo que falló o dejaste en blanco (${missed.length})`));
    missed.forEach(m=>{
      const item = m.item;
      reviewWrap.appendChild(el('div',{class:'review-item'},[
        el('span',{class:'topic-tag'}, TOPICS[item.topic].title),
        el('div',{class:'rq'}, item.qText),
        el('div',{class:'rline ryour'}, m.selected===null ? 'No respondiste esta pregunta.' : 'Tu respuesta: ' + item.options[m.selected]),
        el('div',{class:'rline rcorrect'}, 'Correcta: ' + item.options[item.correct]),
        el('div',{class:'rexp'}, item.exp)
      ]));
    });
    result.appendChild(reviewWrap);
  }

  main.innerHTML = '';
  main.appendChild(result);
}

/* ============ ROUTER ============ */

let currentTopicKey = null;

function goTo(page){
  state.page = page;
  state.mode = 'lesson';
  state.qIndex = 0;
  setActiveTab(page);
  if(page === 'home') renderHome();
  else if(page === 'progreso') renderProgress();
  else if(page === 'simulacro'){ examState = null; renderExam(); }
  else { currentTopicKey = page; renderTopic(page); }
  window.scrollTo({top:0, behavior:'auto'});
}

document.getElementById('tabs').addEventListener('click', (e)=>{
  const btn = e.target.closest('button[data-page]');
  if(!btn) return;
  goTo(btn.dataset.page);
});

document.addEventListener('keydown', (e)=>{
  if(!['1','2','3','4'].includes(e.key)) return;
  const opts = document.querySelectorAll('.option:not([disabled])');
  const idx = parseInt(e.key,10) - 1;
  if(opts[idx]) opts[idx].click();
});

/* ============ INIT ============ */

(async function init(){
  const main = document.getElementById('main');
  main.innerHTML = '<p class="loading-note">Cargando tu progreso…</p>';
  await loadProgress();
  goTo('home');
})();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prep Verbal · Academia de Admisión</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;1,9..144,500&family=Source+Sans+3:wght@400;500;600;700&family=IBM+Plex+Mono:wght@500;600&display=swap" rel="stylesheet">
<style>
  :root{
    --ink:#1C2541;
    --ink-soft:#39456B;
    --paper:#E7EBF1;
    --card:#FFFFFF;
    --gold:#C68E17;
    --gold-soft:#F3E4C0;
    --correct:#2F7D5A;
    --correct-bg:#E4F2EA;
    --error:#C0453B;
    --error-bg:#FBE7E4;
    --muted:#5B6478;
    --line:#D3D9E3;
    --radius:14px;
  }
  *{box-sizing:border-box;}
  html,body{margin:0;padding:0;}
  body{
    background:var(--paper);
    color:var(--ink);
    font-family:'Source Sans 3', sans-serif;
    min-height:100vh;
    -webkit-font-smoothing:antialiased;
  }
  h1,h2,h3,.display{
    font-family:'Fraunces', serif;
    color:var(--ink);
    line-height:1.15;
  }
  .eyebrow{
    font-family:'IBM Plex Mono', monospace;
    font-size:.72rem;
    letter-spacing:.12em;
    text-transform:uppercase;
    color:var(--gold);
    font-weight:600;
  }
  a{color:inherit;}
  button{font-family:inherit;}

  .shell{max-width:940px;margin:0 auto;padding:0 20px 80px;}

  header.top{padding:28px 20px 0;max-width:940px;margin:0 auto;}
  .brand{display:flex;align-items:baseline;gap:10px;margin-bottom:22px;}
  .brand .mark{
    font-family:'IBM Plex Mono', monospace;font-weight:600;font-size:.95rem;color:var(--ink);
    background:var(--gold-soft);border:1px solid var(--gold);padding:3px 8px;border-radius:6px;letter-spacing:.02em;
  }
  .brand .name{font-family:'Fraunces', serif;font-weight:600;font-size:1.15rem;}

  nav.tabs{display:flex;gap:4px;overflow-x:auto;border-bottom:1px solid var(--line);padding-bottom:0;scrollbar-width:none;}
  nav.tabs::-webkit-scrollbar{display:none;}
  nav.tabs button{
    background:none;border:none;padding:12px 14px 14px;font-size:.86rem;font-weight:600;color:var(--muted);
    cursor:pointer;white-space:nowrap;border-bottom:2px solid transparent;transition:color .15s ease, border-color .15s ease;
  }
  nav.tabs button:hover{color:var(--ink);}
  nav.tabs button.active{color:var(--ink);border-bottom-color:var(--gold);}
  nav.tabs button:focus-visible{outline:2px solid var(--gold);outline-offset:2px;}
  nav.tabs button.exam-tab{color:var(--error);}
  nav.tabs button.exam-tab.active{border-bottom-color:var(--error);color:var(--error);}

  main{padding-top:32px;}

  .link-motif{display:inline-flex;align-items:center;gap:6px;font-family:'IBM Plex Mono', monospace;color:var(--gold);font-weight:600;font-size:.85rem;}
  .link-motif .dots{letter-spacing:2px;}

  .hero{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:36px 32px;margin-bottom:24px;}
  .hero h1{font-size:2rem;margin:10px 0 14px;max-width:22ch;}
  .hero p{color:var(--muted);max-width:56ch;font-size:1.02rem;line-height:1.55;}
  .pair-demo{display:flex;align-items:center;gap:14px;margin-top:24px;flex-wrap:wrap;}
  .word-chip{background:var(--paper);border:1px solid var(--line);border-radius:8px;padding:8px 14px;font-family:'IBM Plex Mono', monospace;font-size:.85rem;font-weight:600;}
  .track-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:8px;}
  @media (max-width:640px){.track-grid{grid-template-columns:1fr;}}
  .track-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px;cursor:pointer;transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease;}
  .track-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px -12px rgba(28,37,65,.35);border-color:var(--gold);}
  .track-card h3{font-size:1.1rem;margin:6px 0 6px;}
  .track-card p{color:var(--muted);font-size:.92rem;margin:0 0 14px;line-height:1.5;}
  .track-progress-bar{height:6px;border-radius:4px;background:var(--paper);overflow:hidden;}
  .track-progress-fill{height:100%;background:var(--gold);border-radius:4px;transition:width .3s ease;}
  .track-meta{display:flex;justify-content:space-between;align-items:center;margin-top:8px;font-size:.78rem;color:var(--muted);font-family:'IBM Plex Mono', monospace;}

  .exam-banner{
    background:var(--ink);color:#fff;border-radius:var(--radius);padding:22px 26px;display:flex;
    align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:24px;
  }
  .exam-banner h3{color:#fff;margin:4px 0;font-size:1.15rem;}
  .exam-banner p{color:#C9CFE0;margin:0;font-size:.9rem;max-width:44ch;}
  .exam-banner .eyebrow{color:var(--gold);}

  .topic-header{margin-bottom:22px;}
  .topic-header h2{font-size:1.6rem;margin:8px 0 8px;}
  .topic-header p{color:var(--muted);max-width:60ch;line-height:1.55;}

  .mode-toggle{display:inline-flex;background:var(--card);border:1px solid var(--line);border-radius:999px;padding:4px;margin-bottom:26px;}
  .mode-toggle button{border:none;background:none;padding:8px 18px;border-radius:999px;font-size:.85rem;font-weight:600;color:var(--muted);cursor:pointer;}
  .mode-toggle button.active{background:var(--ink);color:#fff;}

  .lesson-card, .exercise-card, .passage-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:26px 28px;margin-bottom:18px;}
  .lesson-card h3{font-size:1.15rem;margin-top:0;}
  .lesson-card p{line-height:1.65;color:var(--ink-soft);}
  .lesson-card ul{color:var(--ink-soft);line-height:1.7;padding-left:20px;}
  .lesson-card ul.chip-list{list-style:none;padding-left:0;display:flex;flex-wrap:wrap;gap:8px;}
  .lesson-card ul.chip-list li{background:var(--paper);border:1px solid var(--line);border-radius:20px;padding:6px 14px;font-size:.82rem;color:var(--ink);}
  .strategy-box{background:var(--gold-soft);border-left:3px solid var(--gold);padding:14px 18px;border-radius:8px;margin-top:16px;font-size:.94rem;color:var(--ink);}
  .strategy-box b{font-family:'IBM Plex Mono', monospace;font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:6px;color:#8a6410;}

  .example-analogy{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0;font-family:'IBM Plex Mono', monospace;font-size:.95rem;}

  .passage-card{background:#FBFAF7;border-color:var(--line);}
  .passage-card p{line-height:1.75;color:var(--ink-soft);}
  .passage-card .eyebrow{margin-bottom:10px;display:block;}

  .progress-track{height:6px;background:var(--line);border-radius:4px;overflow:hidden;margin-bottom:20px;}
  .progress-track-fill{height:100%;background:var(--gold);transition:width .25s ease;}
  .progress-track-fill.exam{background:var(--error);}

  .exercise-card .qnum{font-family:'IBM Plex Mono', monospace;font-size:.75rem;color:var(--muted);margin-bottom:8px;display:flex;justify-content:space-between;align-items:center;}
  .exercise-card .qtext{font-size:1.08rem;font-weight:600;margin:0 0 18px;line-height:1.5;}
  .options{display:flex;flex-direction:column;gap:10px;}
  .option{
    text-align:left;padding:14px 16px;border:1px solid var(--line);background:var(--paper);border-radius:10px;
    cursor:pointer;font-size:.95rem;color:var(--ink);transition:border-color .12s ease, background .12s ease;display:flex;gap:10px;
  }
  .option .key{font-family:'IBM Plex Mono', monospace;color:var(--muted);font-size:.8rem;}
  .option:hover{border-color:var(--gold);}
  .option:focus-visible{outline:2px solid var(--gold);outline-offset:2px;}
  .option.selected{border-color:var(--ink);background:#fff;}
  .option.correct{background:var(--correct-bg);border-color:var(--correct);}
  .option.incorrect{background:var(--error-bg);border-color:var(--error);}
  .option[disabled]{cursor:default;}

  .feedback{margin-top:16px;padding:14px 16px;border-radius:10px;font-size:.92rem;line-height:1.55;display:none;}
  .feedback.show{display:block;}
  .feedback.correct{background:var(--correct-bg);color:#1e5a3f;}
  .feedback.incorrect{background:var(--error-bg);color:#8a2f27;}
  .feedback b{font-family:'IBM Plex Mono', monospace;font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:4px;}

  .nav-row{display:flex;justify-content:space-between;align-items:center;margin-top:18px;}
  .btn{font-weight:600;font-size:.88rem;padding:11px 20px;border-radius:9px;border:1px solid var(--ink);background:var(--ink);color:#fff;cursor:pointer;}
  .btn:disabled{opacity:.4;cursor:not-allowed;}
  .btn.ghost{background:none;color:var(--ink);border-color:var(--line);}
  .btn.danger{background:var(--error);border-color:var(--error);}
  .btn:focus-visible{outline:2px solid var(--gold);outline-offset:2px;}

  .result-card{text-align:center;padding:40px 28px;}
  .result-score{font-family:'Fraunces', serif;font-size:3rem;color:var(--ink);margin:6px 0;}
  .result-card p{color:var(--muted);}

  .breakdown{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin:22px 0;}
  .breakdown .chip{background:var(--paper);border:1px solid var(--line);border-radius:10px;padding:10px 16px;font-size:.82rem;text-align:left;min-width:120px;}
  .breakdown .chip b{display:block;font-family:'Fraunces',serif;font-size:1.2rem;color:var(--ink);}

  .review-list{text-align:left;margin-top:8px;}
  .review-item{border-top:1px solid var(--line);padding:16px 0;}
  .review-item .topic-tag{font-family:'IBM Plex Mono', monospace;font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);}
  .review-item .rq{font-weight:600;margin:6px 0;}
  .review-item .rline{font-size:.88rem;margin:3px 0;}
  .review-item .ryour{color:var(--error);}
  .review-item .rcorrect{color:var(--correct);}
  .review-item .rexp{color:var(--muted);font-size:.85rem;margin-top:6px;}

  .progress-list{display:flex;flex-direction:column;gap:14px;}
  .progress-row{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;}
  .progress-row .label{font-weight:600;}
  .progress-row .bar-wrap{flex:1;min-width:140px;}
  .reset-link{background:none;border:none;color:var(--muted);text-decoration:underline;font-size:.82rem;cursor:pointer;margin-top:20px;}
  .stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:22px;}
  @media (max-width:640px){.stat-grid{grid-template-columns:1fr;}}
  .stat-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;}
  .stat-card .stat-num{font-family:'Fraunces',serif;font-size:2rem;color:var(--ink);}
  .stat-card .stat-label{font-size:.8rem;color:var(--muted);}

  .timer-bar{display:flex;align-items:center;justify-content:space-between;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 18px;margin-bottom:18px;font-family:'IBM Plex Mono', monospace;}
  .timer-bar .time{font-size:1.1rem;font-weight:600;color:var(--ink);}
  .timer-bar .time.low{color:var(--error);}
  .exam-intro-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:32px;}
  .exam-intro-card ul{color:var(--ink-soft);line-height:1.8;}

  .loading-note{font-size:.85rem;color:var(--muted);font-family:'IBM Plex Mono', monospace;}
  @media (prefers-reduced-motion: reduce){*{transition:none !important;}}
</style>
</head>
<body>

<header class="top">
  <div class="brand">
    <span class="mark">A::B</span>
    <span class="name">Academia de Admisión — Verbal</span>
  </div>
  <nav class="tabs" id="tabs">
    <button data-page="home" class="active">Inicio</button>
    <button data-page="analogias">Analogías</button>
    <button data-page="oraciones">Completar oraciones</button>
    <button data-page="lectura">Lectura crítica</button>
    <button data-page="redaccion">Redacción indirecta</button>
    <button data-page="simulacro" class="exam-tab">⏱ Simulacro</button>
    <button data-page="progreso">Mi progreso</button>
  </nav>
</header>

<main class="shell" id="main"></main>

<script>
/* ============ DATA ============ */

const TOPICS = {
  analogias: {
    title: "Analogías",
    tagline: "Identifica la relación exacta entre un par de palabras y encuéntrala de nuevo en otro par.",
    lesson: {
      intro: "Una analogía compara la relación entre dos palabras con la relación entre otras dos. El truco no es el significado de las palabras por separado, sino el tipo de vínculo que las une.",
      points: [
        "Primero nombra la relación en voz alta: “A es una parte de B”, “A causa B”, “A es lo opuesto de B”.",
        "Construye una oración corta con el primer par y prueba si la misma oración funciona con el segundo par.",
        "Cuidado con relaciones parecidas pero no idénticas: “grado” no es lo mismo que “opuesto”."
      ],
      chips: ["Sinónimos", "Antónimos", "Causa → efecto", "Parte → todo", "Trabajador → herramienta", "Categoría → ejemplo", "Grado o intensidad", "Función o uso", "Creador → obra", "Individuo → grupo"],
      examples: [
        {pair:["MÉDICO","HOSPITAL"], rel:"lugar donde ejerce su oficio", test:["MAESTRO","ESCUELA"]},
        {pair:["ALTO","BAJO"], rel:"antónimos", test:["RÁPIDO","LENTO"]}
      ],
      strategy: "Si dudas entre dos opciones, verifica el orden: si el primer par va de específico a general, la respuesta también debe ir de específico a general."
    },
    questions: [
      { q:"LLAVE es a CERRADURA como CONTRASEÑA es a ___", options:["Cuenta","Candado","Usuario","Contraseña"], correct:0, exp:"La llave abre la cerradura para la que fue hecha; la contraseña da acceso a la cuenta para la que fue creada." },
      { q:"PÁGINA es a LIBRO como RAMA es a ___", options:["Hoja","Bosque","Árbol","Semilla"], correct:2, exp:"Relación parte-todo: una página es parte de un libro; una rama es parte de un árbol." },
      { q:"LLUVIA es a INUNDACIÓN como CHISPA es a ___", options:["Ceniza","Incendio","Fósforo","Humo"], correct:1, exp:"Relación de causa-efecto: la lluvia excesiva puede causar una inundación; una chispa puede causar un incendio." },
      { q:"TIBIO es a CALIENTE como FRESCO es a ___", options:["Templado","Húmedo","Frío","Cálido"], correct:2, exp:"Relación de grado en la misma escala: tibio y caliente están en la escala del calor; fresco y frío en la del frío, en el mismo orden de intensidad." },
      { q:"DIRECTOR es a PELÍCULA como ARQUITECTO es a ___", options:["Ladrillo","Edificio","Constructor","Ciudad"], correct:1, exp:"Relación de creador-obra: el director crea la película; el arquitecto crea el edificio." },
      { q:"TIMIDEZ es a EXTROVERSIÓN como AVARICIA es a ___", options:["Riqueza","Generosidad","Ambición","Pobreza"], correct:1, exp:"Relación de antónimos de carácter: timidez se opone a extroversión; avaricia se opone a generosidad." },
      { q:"PINTOR es a PINCEL como ESCRITOR es a ___", options:["Papel","Pluma","Libro","Tinta"], correct:1, exp:"Relación trabajador-herramienta: el pintor usa el pincel; el escritor usa la pluma." },
      { q:"FELIZ es a CONTENTO como TRISTE es a ___", options:["Apenado","Alegre","Furioso","Sereno"], correct:0, exp:"Relación de sinónimos: contento es sinónimo de feliz; apenado es sinónimo de triste." },
      { q:"FRUTA es a MANZANA como INSTRUMENTO MUSICAL es a ___", options:["Nota","Violín","Concierto","Orquesta"], correct:1, exp:"Relación categoría-ejemplo: la manzana es un ejemplo de fruta; el violín es un ejemplo de instrumento musical." },
      { q:"MOTOR es a AUTOMÓVIL como CORAZÓN es a ___", options:["Sangre","Cuerpo","Pulmón","Vida"], correct:1, exp:"Relación parte esencial-todo: el motor mueve el automóvil; el corazón mantiene con vida al cuerpo." },
      { q:"TIJERA es a CORTAR como MARTILLO es a ___", options:["Clavar","Construir","Herramienta","Golpe"], correct:0, exp:"Relación herramienta-función: la tijera sirve para cortar; el martillo sirve para clavar." },
      { q:"SUSURRO es a GRITO como CAMINAR es a ___", options:["Correr","Trotar","Saltar","Marchar"], correct:0, exp:"Relación de grado: de susurro a grito aumenta la intensidad del sonido; de caminar a correr aumenta la del movimiento." },
      { q:"ABEJA es a COLMENA como HORMIGA es a ___", options:["Jardín","Hormiguero","Panal","Nido"], correct:1, exp:"Relación animal-hogar: la abeja vive en la colmena; la hormiga vive en el hormiguero." },
      { q:"ÁRBITRO es a PARTIDO como JUEZ es a ___", options:["Juicio","Ley","Abogado","Sentencia"], correct:0, exp:"Relación función-contexto: el árbitro dirige el partido; el juez dirige el juicio." },
      { q:"SEMILLA es a ÁRBOL como HUEVO es a ___", options:["Nido","Ave","Pluma","Cascarón"], correct:1, exp:"Relación de origen a resultado: la semilla se convierte en árbol; el huevo se convierte en ave." },
      { q:"GENEROSO es a TACAÑO como VALIENTE es a ___", options:["Cobarde","Audaz","Fuerte","Prudente"], correct:0, exp:"Relación de antónimos: generoso se opone a tacaño; valiente se opone a cobarde." },
      { q:"PANADERO es a PAN como CARPINTERO es a ___", options:["Madera","Mueble","Clavo","Serrucho"], correct:1, exp:"Relación trabajador-producto: el panadero elabora pan; el carpintero elabora muebles." },
      { q:"CIELO es a AZUL como HIERBA es a ___", options:["Verde","Alta","Suave","Fresca"], correct:0, exp:"Relación objeto-color característico: el cielo se asocia con el azul; la hierba con el verde." },
      { q:"DÍA es a NOCHE como VERANO es a ___", options:["Otoño","Invierno","Primavera","Calor"], correct:1, exp:"Relación de opuestos cíclicos: día se opone a noche; verano se opone a invierno." },
      { q:"LIBRO es a CAPÍTULO como CASA es a ___", options:["Techo","Habitación","Puerta","Jardín"], correct:1, exp:"Relación todo-parte: el capítulo es una parte del libro; la habitación es una parte de la casa." },
      { q:"TERMÓMETRO es a TEMPERATURA como RELOJ es a ___", options:["Minutero","Tiempo","Pared","Alarma"], correct:1, exp:"Relación instrumento-lo que mide: el termómetro mide la temperatura; el reloj mide el tiempo." },
      { q:"ESCULTOR es a ESCULTURA como COMPOSITOR es a ___", options:["Sinfonía","Piano","Concierto","Nota"], correct:0, exp:"Relación creador-obra: el escultor crea la escultura; el compositor crea la sinfonía." },
      { q:"OVEJA es a REBAÑO como PEZ es a ___", options:["Acuario","Cardumen","Océano","Red"], correct:1, exp:"Relación individuo-grupo: un conjunto de ovejas forma un rebaño; un conjunto de peces forma un cardumen." },
      { q:"RÍO es a AGUA como VENA es a ___", options:["Sangre","Corazón","Piel","Pulso"], correct:0, exp:"Relación conducto-lo que transporta: el río transporta agua; la vena transporta sangre." },
      { q:"MÉDICO es a PACIENTE como ABOGADO es a ___", options:["Juez","Cliente","Tribunal","Contrato"], correct:1, exp:"Relación profesional-a quien atiende: el médico atiende al paciente; el abogado atiende al cliente." },
      { q:"ANTIGUO es a MODERNO como RÍGIDO es a ___", options:["Flexible","Duro","Firme","Estricto"], correct:0, exp:"Relación de antónimos: antiguo se opone a moderno; rígido se opone a flexible." },
      { q:"GATO es a FELINO como ÁGUILA es a ___", options:["Pluma","Ave","Nido","Vuelo"], correct:1, exp:"Relación ejemplo-categoría: el gato es un ejemplo de felino; el águila es un ejemplo de ave." },
      { q:"CHOFER es a AUTOBÚS como PILOTO es a ___", options:["Aeropuerto","Avión","Cielo","Motor"], correct:1, exp:"Relación conductor-vehículo: el chofer conduce el autobús; el piloto conduce el avión." },
      { q:"HAMBRE es a COMER como SED es a ___", options:["Beber","Agua","Vaso","Sequía"], correct:0, exp:"Relación necesidad-acción que la satisface: el hambre se satisface comiendo; la sed se satisface bebiendo." },
      { q:"ISLA es a AGUA como OASIS es a ___", options:["Palmera","Desierto","Arena","Agua"], correct:1, exp:"Relación de lo que rodea: la isla está rodeada de agua; el oasis está rodeado de desierto." },
      { q:"ÁTOMO es a MOLÉCULA como LETRA es a ___", options:["Alfabeto","Palabra","Oración","Idioma"], correct:1, exp:"Relación unidad pequeña-unidad mayor: los átomos forman moléculas; las letras forman palabras." },
      { q:"ORUGA es a MARIPOSA como RENACUAJO es a ___", options:["Rana","Sapo","Charco","Huevo"], correct:0, exp:"Relación etapa temprana-etapa adulta: la oruga se convierte en mariposa; el renacuajo se convierte en rana." },
      { q:"ELOGIO es a CRÍTICA como VICTORIA es a ___", options:["Trofeo","Derrota","Esfuerzo","Empate"], correct:1, exp:"Relación de antónimos situacionales: elogio se opone a crítica; victoria se opone a derrota." },
      { q:"TERMOSTATO es a TEMPERATURA como FRENO es a ___", options:["Velocidad","Motor","Rueda","Automóvil"], correct:0, exp:"Relación de lo que regula: el termostato regula la temperatura; el freno regula la velocidad." },
      { q:"ACTOR es a GUION como MÚSICO es a ___", options:["Instrumento","Partitura","Concierto","Escenario"], correct:1, exp:"Relación intérprete-texto que sigue: el actor sigue el guion; el músico sigue la partitura." },
      { q:"VIRUS es a INFECCIÓN como ERROR es a ___", options:["Solución","Fracaso","Corrección","Aviso"], correct:1, exp:"Relación de causa-efecto: un virus puede causar una infección; un error puede causar un fracaso." }
    ]
  },

  oraciones: {
    title: "Completar oraciones",
    tagline: "Usa las pistas lógicas y los conectores de la oración para elegir la palabra que mantiene el sentido completo.",
    lesson: {
      intro: "En estos ejercicios, una o dos palabras faltan en una oración. La respuesta correcta no solo debe tener sentido: debe encajar con la lógica que marcan los conectores (aunque, sin embargo, porque, por lo tanto, a pesar de, ya que, puesto que).",
      points: [
        "Los conectores de contraste (aunque, pero, sin embargo, a pesar de) anuncian que la segunda parte va a decir algo distinto o contrario a la primera.",
        "Los conectores de causa (porque, ya que, puesto que, por lo tanto) anuncian una explicación o consecuencia coherente con lo anterior.",
        "Lee la oración completa mentalmente con cada opción antes de decidir; elimina las que suenen forzadas o contradictorias."
      ],
      chips: ["Contraste: aunque, pero, sin embargo", "Causa: porque, ya que, puesto que", "Consecuencia: por lo tanto, así que", "Adición: además, incluso"],
      examples: [
        {sentence:"Aunque el examen era difícil, María se sintió ___ porque había estudiado mucho.", answer:"confiada", why:"“Aunque” marca contraste con la dificultad, pero la causa (estudió mucho) señala un resultado positivo: confianza."}
      ],
      strategy: "Subraya mentalmente el conector antes de mirar las opciones. Eso reduce la mitad de las alternativas casi de inmediato."
    },
    questions: [
      { q:"A pesar de la lluvia intensa, los estudiantes ___ llegaron a tiempo al examen.", options:["igualmente","tardíamente","nerviosamente","difícilmente"], correct:0, exp:"“A pesar de” anuncia contraste: llegaron a tiempo pese a la lluvia. “Igualmente” mantiene ese sentido." },
      { q:"El profesor explicó el tema con tanta claridad que hasta los estudiantes más ___ lo entendieron.", options:["avanzados","distraídos","aplicados","curiosos"], correct:1, exp:"“Hasta... los más ___” sugiere un caso extremo; “distraídos” implica que si ellos entendieron, cualquiera lo hizo." },
      { q:"El científico defendía su teoría con ___, aunque la mayoría de sus colegas la consideraban poco probable.", options:["indiferencia","convicción","duda","ligereza"], correct:1, exp:"“Aunque” marca contraste con la opinión de los colegas; el científico debe sostener su teoría con firmeza: convicción." },
      { q:"La empresa redujo sus gastos, ___ pudo mantener a todo su personal durante la crisis.", options:["por lo tanto","sin embargo","en cambio","de lo contrario"], correct:0, exp:"La reducción de gastos es la causa; mantener al personal es la consecuencia: “por lo tanto”." },
      { q:"El testigo dio una versión tan ___ de los hechos que el juez pidió que la repitiera con más detalle.", options:["detallada","vaga","extensa","convincente"], correct:1, exp:"Si el juez pide más detalle, la versión inicial fue imprecisa: vaga." },
      { q:"Aunque el actor era ___ en el escenario, en las entrevistas se mostraba sorprendentemente tímido.", options:["torpe","magnético","olvidadizo","distante"], correct:1, exp:"“Aunque” exige contraste con “tímido”: en el escenario tendría una presencia magnética." },
      { q:"Como el puente estaba en reparación, los conductores tuvieron que ___ por una ruta alterna.", options:["desviarse","acelerar","detenerse","regresar"], correct:0, exp:"“Como” introduce la causa; la consecuencia lógica es tomar otro camino: desviarse." },
      { q:"El acusado insistía en su inocencia; sin embargo, las pruebas en su contra eran ___.", options:["contundentes","escasas","ambiguas","favorables"], correct:0, exp:"“Sin embargo” marca contraste con la insistencia; las pruebas deben ser fuertes: contundentes." },
      { q:"Puesto que llevaban horas caminando bajo el sol, los excursionistas se sentían completamente ___.", options:["agotados","animados","curiosos","tranquilos"], correct:0, exp:"“Puesto que” introduce la causa; la consecuencia lógica es el cansancio: agotados." },
      { q:"El nuevo empleado, aunque ___, aprendió las funciones del puesto en pocos días.", options:["inexperto","veterano","distraído","indiferente"], correct:0, exp:"“Aunque” exige contraste con “aprendió rápido”: partir de la falta de experiencia." },
      { q:"La biblioteca amplió su horario porque la demanda de estudiantes ___ durante los exámenes finales.", options:["aumentaba","disminuía","cesaba","se mantenía igual"], correct:0, exp:"“Porque” introduce la causa de ampliar el horario: la demanda creció." },
      { q:"A pesar de las críticas iniciales, la película terminó siendo un éxito ___.", options:["rotundo","discreto","cuestionable","mediocre"], correct:0, exp:"“A pesar de” marca contraste con las críticas negativas: un éxito rotundo." },
      { q:"Como el vuelo se retrasó varias horas, los pasajeros esperaban en la sala con evidente ___.", options:["impaciencia","entusiasmo","indiferencia","alivio"], correct:0, exp:"Un retraso largo genera como consecuencia lógica impaciencia en quienes esperan." },
      { q:"El comité rechazó la propuesta porque la consideró ___ para el presupuesto disponible.", options:["excesiva","modesta","razonable","insuficiente"], correct:0, exp:"Si rechazaron la propuesta por el presupuesto, es porque resultaba demasiado costosa: excesiva." },
      { q:"Aunque el equipo perdía por dos goles, los jugadores no dejaron de mostrar ___.", options:["determinación","resignación","indiferencia","desánimo"], correct:0, exp:"“Aunque” exige contraste con la desventaja: seguir mostrando determinación." },
      { q:"Dado que las reservas de agua eran limitadas, el gobierno pidió a la población ___ su consumo.", options:["reducir","aumentar","mantener","duplicar"], correct:0, exp:"Ante reservas limitadas, la consecuencia lógica es pedir que se reduzca el consumo." },
      { q:"La conferencia fue tan ___ que varios asistentes se quedaron dormidos.", options:["monótona","fascinante","breve","interactiva"], correct:0, exp:"Que la gente se duerma es consecuencia de una charla monótona, no fascinante." },
      { q:"El equipo de rescate trabajó toda la noche, ___ localizar a los excursionistas perdidos.", options:["logrando","evitando","negando","posponiendo"], correct:0, exp:"El resultado positivo de trabajar toda la noche es lograr encontrar a los excursionistas." },
      { q:"Por más que insistieron, el gerente se mantuvo ___ en su decisión de no dar el aumento.", options:["firme","dudoso","flexible","indeciso"], correct:0, exp:"“Por más que insistieron” contrasta con mantenerse firme en la decisión." },
      { q:"La empresa lanzó un producto ___ que revolucionó el mercado en pocos meses.", options:["innovador","obsoleto","común","defectuoso"], correct:0, exp:"Revolucionar el mercado es consecuencia de un producto innovador." },
      { q:"Ya que el puente colgante mostraba señales de deterioro, las autoridades decidieron ___ su acceso.", options:["restringir","ampliar","promover","ignorar"], correct:0, exp:"Ante el deterioro, la consecuencia lógica es limitar el acceso: restringir." },
      { q:"El actor recibió tantas críticas negativas que decidió ___ su participación en la obra.", options:["reconsiderar","celebrar","ignorar","anunciar"], correct:0, exp:"Ante críticas tan negativas, la reacción lógica es reconsiderar su participación." },
      { q:"A pesar de contar con poca experiencia, el joven abogado defendió el caso con notable ___.", options:["destreza","torpeza","indiferencia","lentitud"], correct:0, exp:"“A pesar de” marca contraste con la poca experiencia: mostró destreza, no torpeza." },
      { q:"El volcán llevaba semanas ___ señales de actividad, por lo que se ordenó la evacuación preventiva.", options:["mostrando","ocultando","negando","deteniendo"], correct:0, exp:"La evacuación es consecuencia de que el volcán mostraba señales de actividad." },
      { q:"Aunque el contrato parecía ventajoso, un abogado detectó cláusulas ___ que podían perjudicar a la empresa.", options:["ocultas","evidentes","favorables","irrelevantes"], correct:0, exp:"“Aunque parecía ventajoso” contrasta con encontrar cláusulas ocultas y perjudiciales." },
      { q:"La sequía prolongada obligó a los agricultores a buscar métodos de riego más ___.", options:["eficientes","costosos","tradicionales","lentos"], correct:0, exp:"Ante la sequía, la consecuencia lógica es buscar métodos más eficientes, no más costosos o lentos." },
      { q:"El testigo cambió su declaración varias veces, lo cual generó ___ en el jurado.", options:["desconfianza","certeza","simpatía","admiración"], correct:0, exp:"Cambiar la declaración varias veces genera como consecuencia desconfianza." },
      { q:"Puesto que el laboratorio careció de fondos, los investigadores tuvieron que ___ el proyecto.", options:["posponer","acelerar","financiar","publicar"], correct:0, exp:"La falta de fondos tiene como consecuencia lógica posponer el proyecto." },
      { q:"El público aplaudió de pie porque el discurso fue sorprendentemente ___.", options:["conmovedor","aburrido","confuso","largo"], correct:0, exp:"Un aplauso de pie es consecuencia de un discurso conmovedor, no aburrido." },
      { q:"Aunque parecía un problema sencillo, la solución resultó ser mucho más ___ de lo esperado.", options:["compleja","simple","rápida","evidente"], correct:0, exp:"“Aunque parecía sencillo” contrasta con una solución compleja." },
      { q:"El nuevo reglamento, lejos de simplificar los trámites, los volvió aún más ___.", options:["burocráticos","ágiles","claros","breves"], correct:0, exp:"“Lejos de simplificar” anuncia un contraste: los trámites se volvieron más burocráticos." },
      { q:"La montaña estaba cubierta de niebla, así que los excursionistas decidieron ___ el ascenso.", options:["posponer","acelerar","disfrutar","filmar"], correct:0, exp:"Ante la niebla, la consecuencia lógica y prudente es posponer el ascenso." },
      { q:"El profesor elogió el ensayo por su argumentación ___ y bien documentada.", options:["sólida","débil","confusa","superficial"], correct:0, exp:"Un ensayo elogiado tiene una argumentación sólida, no débil ni confusa." },
      { q:"Como el precio del combustible subió drásticamente, muchas familias optaron por ___ el uso del automóvil.", options:["reducir","aumentar","ignorar","celebrar"], correct:0, exp:"Ante la subida de precios, la consecuencia lógica es reducir el uso del automóvil." },
      { q:"A pesar de su juventud, la científica fue reconocida por sus aportes ___ al campo de la genética.", options:["significativos","insignificantes","cuestionables","tardíos"], correct:0, exp:"“A pesar de su juventud” contrasta con haber logrado aportes significativos." },
      { q:"El silencio en la sala era tan ___ que se podía escuchar el tictac del reloj.", options:["absoluto","relativo","incómodo","breve"], correct:0, exp:"Escuchar el tictac del reloj es consecuencia de un silencio absoluto." }
    ]
  },

  lectura: {
    title: "Lectura crítica",
    tagline: "Lee con atención, identifica la idea principal, el tono y el significado de las palabras según el contexto.",
    lesson: {
      intro: "La lectura crítica evalúa cuatro destrezas principales: identificar la idea principal, hacer inferencias razonables, reconocer el tono del autor y deducir el significado de una palabra según el contexto en que aparece (no según su definición de diccionario).",
      points: [
        "La idea principal casi nunca es un detalle: es la afirmación que resume de qué trata todo el párrafo.",
        "Una inferencia válida se apoya en el texto; si necesitas información externa para llegar a ella, probablemente está mal.",
        "Para el significado en contexto, tapa la palabra y piensa qué palabra tuya encajaría ahí; luego busca la opción más parecida.",
        "El tono se detecta en las palabras que elige el autor, no en el tema: un tema triste puede describirse con tono neutral, irónico o alarmista."
      ],
      strategy: "Lee primero las preguntas (sin las opciones) y luego el pasaje. Así sabes qué buscar mientras lees, en lugar de releer varias veces."
    },
    passages: {
      p1: { title:"Pasaje 1", text:`Durante siglos, se pensó que dormir era simplemente una pausa obligatoria, un tiempo muerto entre un día de actividad y el siguiente. Hoy sabemos que ocurre justamente lo contrario: mientras dormimos, el cerebro entra en uno de sus periodos más activos. Consolida recuerdos recientes, descarta información irrelevante y hasta parece "limpiar" sustancias de desecho acumuladas durante las horas de vigilia. Los estudiantes que sacrifican horas de sueño para memorizar la noche antes de un examen suelen obtener el efecto contrario al que buscan: sin el tiempo necesario para consolidar lo aprendido, buena parte de esa información se pierde en cuestión de días. Los especialistas insisten en que dormir bien no es una recompensa después de estudiar, sino una parte más del proceso de aprender.` },
      p2: { title:"Pasaje 2", text:`Durante mucho tiempo, la biblioteca pública fue sinónimo de silencio absoluto y estanterías interminables. En las últimas décadas, sin embargo, muchas bibliotecas han reinventado su función: además de prestar libros, ofrecen talleres de programación, espacios de trabajo colaborativo e incluso asesoría para buscar empleo. Este cambio no responde a una moda pasajera, sino a una pregunta más profunda sobre para qué sirve una institución pública en una época donde la información parece estar a un clic de distancia. La respuesta que han encontrado muchas bibliotecas es que su valor ya no está solo en los libros que resguardan, sino en el acceso equitativo que ofrecen a herramientas, tecnología y compañía humana que no todos pueden costear por su cuenta.` },
      p3: { title:"Pasaje 3", text:`Durante buena parte del siglo XX, el crecimiento de las ciudades se midió casi exclusivamente en kilómetros de asfalto y número de edificios. Los parques y árboles se consideraban un lujo decorativo, algo que se agregaba si sobraba espacio y presupuesto, no una necesidad. Esa mentalidad ha empezado a cambiar. Estudios recientes muestran que los barrios con más áreas verdes registran temperaturas más bajas en épocas de calor extremo, mejor calidad del aire y hasta menores niveles de estrés reportados por sus habitantes. Ante este panorama, varias ciudades han comenzado a exigir que los nuevos proyectos de construcción incluyan un porcentaje mínimo de vegetación, no como un adorno estético, sino como una infraestructura tan esencial como el sistema eléctrico o el de agua potable.` }
    },
    questions: [
      { passageId:"p1", q:"¿Cuál es la idea principal del pasaje?", options:["Dormir es una pausa sin ninguna función biológica importante.","El sueño es una parte activa y necesaria del proceso de aprendizaje.","Los estudiantes nunca deben estudiar de noche.","El cerebro descansa completamente durante el sueño."], correct:1, exp:"Todo el pasaje explica que el sueño consolida el aprendizaje; la conclusión final lo resume directamente." },
      { passageId:"p1", q:"Según el pasaje, ¿qué se puede inferir sobre estudiar toda la noche antes de un examen?", options:["Es la estrategia más efectiva para memorizar.","Puede resultar contraproducente porque el cerebro no consolida lo aprendido.","No tiene ningún efecto sobre el rendimiento.","Mejora la memoria a largo plazo."], correct:1, exp:"El texto dice explícitamente que sacrificar el sueño produce “el efecto contrario al que buscan”." },
      { passageId:"p1", q:"En el contexto del pasaje, la palabra \"vigilia\" significa más precisamente:", options:["Sueño profundo","Estado de estar despierto","Una enfermedad","Un tipo de descanso"], correct:1, exp:"El texto contrasta “horas de vigilia” con el tiempo dormido, por lo que vigilia se refiere a las horas despierto." },
      { passageId:"p1", q:"El tono del autor hacia la idea de sacrificar el sueño por estudiar es:", options:["Entusiasta","De advertencia","Indiferente","Irónico"], correct:1, exp:"El autor señala una consecuencia negativa de esa práctica, lo cual es una forma de advertencia." },
      { passageId:"p1", q:"Según el pasaje, ¿qué hace el cerebro mientras dormimos, además de consolidar recuerdos?", options:["Descarta información irrelevante","Deja de funcionar por completo","Genera nuevos recuerdos falsos","Aumenta la producción de adrenalina"], correct:0, exp:"El pasaje menciona explícitamente que el cerebro “descarta información irrelevante” mientras dormimos." },
      { passageId:"p1", q:"¿Qué se puede inferir sobre la opinión de los especialistas mencionados en el pasaje?", options:["Consideran que dormir es un lujo prescindible.","Consideran que dormir es una parte esencial del aprendizaje.","Recomiendan dormir menos para rendir más.","No tienen una posición clara al respecto."], correct:1, exp:"Los especialistas insisten en que dormir es “una parte más del proceso de aprender”." },
      { passageId:"p1", q:"En el contexto del pasaje, la palabra \"consolida\" significa más precisamente:", options:["Debilita","Afirma o refuerza","Elimina","Confunde"], correct:1, exp:"“Consolida recuerdos” significa que los refuerza y los fija, no que los debilita." },
      { passageId:"p1", q:"¿Qué comparación hace el autor sobre la función del sueño?", options:["Lo compara con una recompensa después de estudiar.","Lo compara con una parte más del proceso de aprender.","Lo compara con una pérdida de tiempo.","Lo compara con una enfermedad."], correct:1, exp:"El pasaje concluye explícitamente que dormir “no es una recompensa... sino una parte más del proceso de aprender”." },
      { passageId:"p1", q:"¿Cuál sería el propósito principal del autor al escribir este pasaje?", options:["Entretener con curiosidades sobre el sueño.","Convencer al lector de la importancia del sueño en el aprendizaje.","Vender un producto relacionado con el sueño.","Narrar una historia personal."], correct:1, exp:"Todo el pasaje construye un argumento a favor de la importancia del sueño para aprender." },
      { passageId:"p2", q:"¿Cuál es la idea principal del pasaje?", options:["Las bibliotecas han desaparecido por la falta de lectores.","Las bibliotecas han ampliado su función más allá de prestar libros, ofreciendo acceso equitativo a recursos.","La tecnología ha vuelto innecesarias a las bibliotecas.","Las bibliotecas solo deben ofrecer silencio y estanterías."], correct:1, exp:"El pasaje describe nuevos servicios de las bibliotecas y concluye que su valor está en el acceso equitativo." },
      { passageId:"p2", q:"Se puede inferir que el cambio en la función de las bibliotecas responde principalmente a:", options:["Una necesidad de ofrecer acceso equitativo a recursos que no todos pueden costear.","Una orden gubernamental sin relación con los usuarios.","El deseo de competir con las librerías comerciales.","La eliminación total de los libros impresos."], correct:0, exp:"El pasaje concluye explícitamente que el valor de las bibliotecas está en “el acceso equitativo”." },
      { passageId:"p2", q:"En el contexto del pasaje, la palabra \"resguardan\" significa más precisamente:", options:["Destruyen","Protegen o conservan","Venden","Catalogan"], correct:1, exp:"“Los libros que resguardan” se refiere a los libros que la biblioteca conserva y protege." },
      { passageId:"p2", q:"El tono del autor a lo largo del pasaje es principalmente:", options:["Sarcástico","Reflexivo","Alarmista","Indiferente"], correct:1, exp:"El autor analiza con calma el cambio de función de las bibliotecas, sin burla ni alarma." },
      { passageId:"p2", q:"Según el pasaje, ¿cuál de los siguientes servicios ofrecen actualmente muchas bibliotecas?", options:["Asesoría para buscar empleo","Venta de libros usados","Clases de idiomas extranjeros","Servicio de streaming de películas"], correct:0, exp:"El pasaje menciona explícitamente “asesoría para buscar empleo” entre los nuevos servicios." },
      { passageId:"p2", q:"En el contexto del pasaje, la expresión \"moda pasajera\" significa más precisamente:", options:["Una tendencia de vestimenta","Un cambio breve y sin fundamento duradero","Una ley permanente","Un evento cultural"], correct:1, exp:"El autor usa la expresión para descartar que el cambio sea algo breve y superficial, sin fundamento real." },
      { passageId:"p2", q:"Según el pasaje, ¿qué ofrecían tradicionalmente las bibliotecas antes de este cambio?", options:["Talleres de programación","Préstamo de libros y silencio","Asesoría de empleo","Espacios de trabajo colaborativo"], correct:1, exp:"El pasaje describe que antes la biblioteca “fue sinónimo de silencio absoluto” y préstamo de libros." },
      { passageId:"p2", q:"¿Qué se puede inferir sobre el acceso a la información en la época actual, según el pasaje?", options:["Es cada vez más difícil de conseguir.","Parece estar fácilmente disponible con un clic.","Solo se consigue en bibliotecas.","Ha desaparecido por completo."], correct:1, exp:"El pasaje dice que la información “parece estar a un clic de distancia” en la época actual." },
      { passageId:"p2", q:"¿Cuál es el propósito principal del autor al escribir este pasaje?", options:["Criticar a las bibliotecas por cambiar.","Explicar por qué las bibliotecas han evolucionado y cuál es su nuevo valor.","Promocionar un servicio específico.","Narrar la historia completa de las bibliotecas."], correct:1, exp:"El pasaje explica el cambio de función de las bibliotecas y concluye señalando su nuevo valor central." },
      { passageId:"p3", q:"¿Cuál es la idea principal del pasaje?", options:["Las ciudades ya no necesitan parques porque el asfalto es más práctico.","Las áreas verdes urbanas están dejando de considerarse un lujo y empiezan a tratarse como una necesidad.","La vegetación en las ciudades es solo un elemento decorativo.","El crecimiento urbano depende únicamente del número de edificios."], correct:1, exp:"El pasaje describe el cambio de mentalidad hacia las áreas verdes, de lujo a necesidad." },
      { passageId:"p3", q:"Se puede inferir que las nuevas normativas de construcción responden principalmente a:", options:["El deseo de embellecer las ciudades sin ningún propósito práctico.","Evidencia sobre los beneficios de la vegetación en la temperatura, el aire y el estrés.","La escasez de terrenos disponibles para construir.","Una moda pasajera sin respaldo de estudios."], correct:1, exp:"El pasaje cita estudios sobre beneficios concretos que respaldan las nuevas exigencias." },
      { passageId:"p3", q:"En el contexto del pasaje, la palabra \"panorama\" significa más precisamente:", options:["Vista desde una montaña","Situación general de un tema","Un tipo de fotografía panorámica","Un edificio alto"], correct:1, exp:"“Ante este panorama” se refiere a la situación general descrita, no a un paisaje literal." },
      { passageId:"p3", q:"En el contexto del pasaje, la palabra \"infraestructura\" significa más precisamente:", options:["Un edificio de gran altura","Un elemento decorativo","Un conjunto de servicios y elementos básicos necesarios","Un tipo de vegetación"], correct:2, exp:"Se compara la vegetación con el sistema eléctrico o de agua: un servicio básico necesario." },
      { passageId:"p3", q:"El tono del autor a lo largo del pasaje es principalmente:", options:["Alarmista","Crítico con el pasado y esperanzador con el presente","Indiferente","Humorístico"], correct:1, exp:"El autor cuestiona la mentalidad antigua y describe con optimismo el cambio actual." },
      { passageId:"p3", q:"Según el pasaje, ¿qué beneficio NO se menciona explícitamente sobre las áreas verdes?", options:["Menor temperatura en climas cálidos","Mejor calidad del aire","Aumento del valor de las propiedades","Menores niveles de estrés"], correct:2, exp:"El pasaje menciona temperatura, calidad del aire y estrés, pero no el valor de las propiedades." },
      { passageId:"p3", q:"¿Qué actitud tenían las ciudades hacia los parques durante buena parte del siglo XX, según el pasaje?", options:["Los consideraban una prioridad de infraestructura.","Los veían como un lujo decorativo y prescindible.","Los prohibían por completo.","Los usaban solo para eventos deportivos."], correct:1, exp:"El pasaje dice explícitamente que se consideraban “un lujo decorativo”." },
      { passageId:"p3", q:"¿Qué exigen ahora varias ciudades a los nuevos proyectos de construcción, según el pasaje?", options:["Un porcentaje mínimo de vegetación","La eliminación total del asfalto","La construcción exclusiva de parques","La reducción del número de edificios"], correct:0, exp:"El pasaje lo indica directamente: exigen “un porcentaje mínimo de vegetación”." },
      { passageId:"p3", q:"En el contexto del pasaje, la palabra \"exclusivamente\" significa más precisamente:", options:["Únicamente","Parcialmente","Nunca","Nuevamente"], correct:0, exp:"“Se midió casi exclusivamente” equivale a decir que se medía casi únicamente de esa forma." }
    ]
  },

  redaccion: {
    title: "Redacción indirecta",
    tagline: "Reconoce errores de gramática, concordancia y estilo, y elige la versión más clara y correcta de una oración.",
    lesson: {
      intro: "La redacción indirecta no pide que escribas: pide que detectes errores o mejores una oración ya escrita. Los errores más comunes giran alrededor de cinco áreas: concordancia (sujeto-verbo, género-número), uso de pronombres, tiempos verbales, conectores lógicos y redundancia o claridad.",
      points: [
        "Concordancia: el verbo debe coincidir en número con el sujeto real de la oración, no con la palabra más cercana.",
        "Pronombres: cada pronombre (él, ella, este, quien) debe tener un referente claro; cuidado con el laísmo (“la dijeron” en vez de “le dijeron”).",
        "Tiempos verbales: si una oración empieza en pasado, no debe saltar sin razón al presente o futuro.",
        "Redundancia: elimina palabras que repiten una idea ya expresada (“subir arriba”, “volver a repetir”).",
        "Dequeísmo y queísmo: “pienso que” (no “pienso de que”); “estoy seguro de que” (no “estoy seguro que”).",
        "La opción correcta suele ser la más simple y directa, no la más larga o adornada."
      ],
      chips: ["Concordancia sujeto-verbo", "Pronombres y referentes", "Tiempos verbales", "Redundancia", "Dequeísmo / queísmo", "Acentuación diacrítica", "Claridad y economía"],
      strategy: "Lee la oración en voz alta (mentalmente). Los errores de concordancia y de tiempo verbal casi siempre “suenan mal” antes de que sepas explicar por qué."
    },
    questions: [
      { q:"Identifica la oración correctamente escrita:", options:["El grupo de estudiantes llegaron tarde a la conferencia.","El grupo de estudiantes llegó tarde a la conferencia.","El grupo de estudiantes ha llegaron tarde a la conferencia.","El grupo de estudiantes llegando tarde a la conferencia."], correct:1, exp:"El sujeto real es “el grupo” (singular); el verbo debe concordar en singular: “llegó”." },
      { q:"¿Cuál versión corrige el error de la oración: “Cada uno de los candidatos presentaron su propuesta”?", options:["Cada uno de los candidatos presentó su propuesta.","Cada uno de los candidatos presenta sus propuestas.","Cada una de los candidatos presentaron su propuesta.","Cada uno de los candidatos presentaron sus propuesta."], correct:0, exp:"“Cada uno” es singular y rige el verbo en singular: “presentó”." },
      { q:"Elige la oración sin ambigüedad en el uso del pronombre:", options:["Cuando Carlos habló con su hermano, él se molestó mucho.","Cuando Carlos habló con su hermano, su hermano se molestó mucho.","Él se molestó mucho cuando Carlos habló con su hermano.","Se molestó mucho cuando habló con su hermano."], correct:1, exp:"En la primera opción no queda claro a quién se refiere “él”. Repetir “su hermano” elimina la ambigüedad." },
      { q:"¿Cuál oración mantiene el tiempo verbal de forma consistente?", options:["Ayer llovió toda la tarde y los ríos se desbordan.","Ayer llueve toda la tarde y los ríos se desbordaron.","Ayer llovió toda la tarde y los ríos se desbordaron.","Ayer ha llovido toda la tarde y los ríos se desbordarán."], correct:2, exp:"Toda la oración describe un evento pasado; ambos verbos deben estar en pretérito." },
      { q:"Selecciona la oración sin redundancia:", options:["Subió arriba para revisar el tanque de agua.","Subió para revisar el tanque de agua.","Volvió a subir arriba de nuevo otra vez.","Subió hacia arriba para revisar el tanque."], correct:1, exp:"“Subir” ya implica ir hacia arriba, así que “arriba” es redundante." },
      { q:"¿Cuál es la versión más clara y directa de la idea?", options:["Debido al hecho de que llovía, decidimos cancelar el evento que habíamos planeado.","Como llovía, decidimos cancelar el evento.","En vista del hecho de la lluvia, se tomó la decisión de la cancelación del evento.","Por causa de que estaba lloviendo fue que cancelamos el evento planeado."], correct:1, exp:"La redacción indirecta premia la claridad y la economía de palabras." },
      { q:"Identifica el error en: “Entre tú y yo, no hay ningún secreto entre nosotros dos.”", options:["No tiene ningún error.","Falta un verbo en la oración.","Hay redundancia: “entre nosotros dos” repite la idea de “entre tú y yo”.","El pronombre “tú” está mal usado."], correct:2, exp:"La oración repite la misma idea dos veces; basta con “no hay ningún secreto entre nosotros”." },
      { q:"¿Cuál oración usa correctamente el conector lógico?", options:["Estudió toda la semana, sin embargo, aprobó el examen con la nota más alta.","Estudió toda la semana, porque aprobó el examen con la nota más alta.","Estudió toda la semana, por lo tanto, aprobó el examen con la nota más alta.","Estudió toda la semana, aunque no aprobó, sacó la nota más alta."], correct:2, exp:"Estudiar y aprobar con la nota más alta es causa-efecto; “por lo tanto” es el conector correcto." },
      { q:"¿Cuál oración corrige correctamente la concordancia del pronombre relativo?", options:["Los alumnos, quien llegaron tarde, no pudieron entrar.","Los alumnos, quienes llegaron tarde, no pudieron entrar.","Los alumnos, cual llegaron tarde, no pudieron entrar.","Los alumnos, que llegó tarde, no pudieron entrar."], correct:1, exp:"El pronombre relativo debe concordar en número con “los alumnos”: “quienes”." },
      { q:"Elige la oración con el uso correcto de la preposición:", options:["El proyecto consiste de tres partes.","El proyecto consiste en tres partes.","El proyecto consiste con tres partes.","El proyecto consiste para tres partes."], correct:1, exp:"El verbo “consistir” rige la preposición “en”, no “de”." },
      { q:"¿Cuál versión evita la cadena confusa de gerundios?", options:["Salió corriendo con un paraguas roto porque la lluvia era intensa.","Salió corriendo llevando un paraguas roto siendo la lluvia intensa.","Saliendo corriendo, llevando paraguas roto, la lluvia siendo intensa.","Salió, corriendo, llevando, un paraguas roto, lluvia intensa."], correct:0, exp:"Encadenar gerundios (llevando... siendo...) es confuso; es más claro usar “porque”." },
      { q:"¿Cuál oración usa correctamente las comas para una cláusula explicativa?", options:["Mi hermano, que vive en Madrid llegó ayer.","Mi hermano que vive en Madrid, llegó ayer.","Mi hermano, que vive en Madrid, llegó ayer.","Mi hermano que, vive en Madrid llegó, ayer."], correct:2, exp:"Una cláusula explicativa debe ir entre comas por ambos lados." },
      { q:"Identifica la oración sin dequeísmo:", options:["Pienso de que la reunión fue un éxito.","Pienso que la reunión fue un éxito.","Pienso en que la reunión fue un éxito.","Pienso a que la reunión fue un éxito."], correct:1, exp:"El verbo “pensar” (opinar) no lleva “de”: lo correcto es “pienso que”." },
      { q:"¿Cuál oración evita el laísmo?", options:["A María la dijeron que había ganado el premio.","A María le dijeron que había ganado el premio.","A María les dijeron que había ganado el premio.","A María se dijeron que había ganado el premio."], correct:1, exp:"“Decir” rige un objeto indirecto (le), no directo (la); usar “la” aquí es laísmo." },
      { q:"¿Cuál oración usa correctamente el verbo impersonal \"haber\"?", options:["Habían muchas personas en la fiesta.","Había muchas personas en la fiesta.","Habían muchos personas en la fiesta.","Había muchos persona en la fiesta."], correct:1, exp:"El “haber” impersonal siempre va en singular, sin importar cuántas personas haya: “había”." },
      { q:"Identifica la oración sin queísmo:", options:["Estoy seguro que ganaremos.","Estoy seguro de que ganaremos.","Estoy seguro en que ganaremos.","Estoy seguro por que ganaremos."], correct:1, exp:"“Estar seguro” rige la preposición “de”: “estoy seguro de que”." },
      { q:"¿Cuál versión evita el gerundio de posterioridad, incorrecto en español?", options:["Estudió toda la noche, aprobando el examen al día siguiente.","Estudió toda la noche y aprobó el examen al día siguiente.","Habiendo estudiado toda la noche, aprobando el examen al día siguiente.","Estudió toda la noche, y aprobando, el examen al día siguiente."], correct:1, exp:"El gerundio no debe expresar una acción posterior; lo correcto es usar “y” más el verbo conjugado." },
      { q:"¿Cuál versión es más clara y natural?", options:["El pastel fue comido por los niños en cinco minutos.","Los niños comieron el pastel en cinco minutos.","El pastel es comido siendo por los niños en cinco minutos.","Fue el pastel comido por los niños en cinco minutos."], correct:1, exp:"La voz activa suele ser más clara y directa que la pasiva innecesaria." },
      { q:"¿Cuál oración usa correctamente \"sino que\"?", options:["No vino a la fiesta, si no que se quedó trabajando.","No vino a la fiesta, sino que se quedó trabajando.","No vino a la fiesta, sino se quedó trabajando quedándose.","No vino a la fiesta si no se quedó trabajando."], correct:1, exp:"Para contraponer dos acciones con verbo propio se usa “sino que”, escrito junto." },
      { q:"¿Cuál oración usa correctamente \"mas\" con el sentido de \"pero\"?", options:["Quería ir, más no tenía tiempo.","Quería ir, mas no tenía tiempo.","Quería ir mas, no tenía tiempo.","Quería ir, masno tenía tiempo."], correct:1, exp:"“Mas” sin tilde equivale a “pero”; “más” con tilde indica cantidad." },
      { q:"¿Cuál oración usa correctamente \"sé\" del verbo saber?", options:["Se que la respuesta es correcta.","Sé que la respuesta es correcta.","Sé, que la respuesta es correcta.","Se qué la respuesta es correcta."], correct:1, exp:"“Sé” (con tilde) es la forma del verbo saber; “se” sin tilde es un pronombre." },
      { q:"¿Cuál oración usa correctamente \"por qué\" y \"porque\"?", options:["¿Porque llegaste tarde? Por qué el autobús se retrasó.","¿Por qué llegaste tarde? Porque el autobús se retrasó.","¿Por qué llegaste tarde? Por que el autobús se retrasó.","¿Porqué llegaste tarde? Porque el autobús se retrasó."], correct:1, exp:"La pregunta usa “por qué” (separado, con tilde); la respuesta usa “porque” (junto, sin tilde)." },
      { q:"Selecciona la oración sin pleonasmo:", options:["Prefiero entrar adentro para protegerme de la lluvia.","Prefiero entrar para protegerme de la lluvia.","Prefiero entrar hacia adentro para protegerme de la lluvia.","Prefiero entrarme adentro para protegerme de la lluvia."], correct:1, exp:"“Entrar” ya implica ir hacia adentro; agregar “adentro” es redundante." },
      { q:"¿Cuál oración presenta el orden más claro de las ideas?", options:["De la ventana por la que ayer se asomó Juan cayó una maceta.","Ayer, una maceta cayó de la ventana por la que se asomó Juan.","Cayó una maceta de la ventana ayer por la que se asomó Juan.","Por la que se asomó Juan ayer, de la ventana, cayó una maceta."], correct:1, exp:"Un orden más directo (sujeto y acción antes del detalle) resulta mucho más claro de seguir." },
      { q:"¿Cuál oración respeta la correlación correcta de tiempos verbales?", options:["Le pedí que llegue temprano.","Le pedí que llegara temprano.","Le pediré que llegara temprano.","Le pedí que ha llegado temprano."], correct:1, exp:"Un verbo principal en pasado (pedí) exige el subjuntivo también en pasado: “llegara”." },
      { q:"Identifica la oración con la concordancia de género correcta:", options:["La programa de televisión fue cancelada.","El programa de televisión fue cancelado.","El programa de televisión fue cancelada.","La programa de televisión fue cancelado."], correct:1, exp:"“Programa” es un sustantivo masculino: “el programa... cancelado”." },
      { q:"¿Cuál oración distingue correctamente \"a ver\" de \"haber\"?", options:["Vamos haber la película esta noche.","Vamos a ver la película esta noche.","Vamos aver la película esta noche.","Vamos, haber la película, esta noche."], correct:1, exp:"Cuando se trata del verbo “ver” (mirar), se escribe “a ver”, separado." },
      { q:"¿Cuál oración usa correctamente la forma \"haya\"?", options:["Espero que todo se halla resuelto.","Espero que todo se haya resuelto.","Espero que todo se allá resuelto.","Espero que todo se aya resuelto."], correct:1, exp:"“Haya” es la forma del verbo haber en subjuntivo; “halla” viene de “hallar” y “allá” es un adverbio de lugar." },
      { q:"Identifica la oración con la concordancia correcta:", options:["Los medio de comunicaciones informaron del incidente.","Los medios de comunicación informaron del incidente.","Los medios de comunicaciones informó del incidente.","El medios de comunicación informaron del incidente."], correct:1, exp:"La expresión fija es “los medios de comunicación”, con “medios” en plural y “comunicación” en singular." },
      { q:"¿Cuál oración usa correctamente el pronombre interrogativo \"cuál\"?", options:["¿Cual es tu nombre?","¿Cuál es tu nombre?","¿Cuáles es tu nombre?","¿Cual es tu nombres?"], correct:1, exp:"En preguntas directas, “cuál” lleva tilde y debe concordar en número con lo que pregunta." },
      { q:"¿Cuál oración usa correctamente \"adónde\"?", options:["¿Adonde vas esta tarde?","¿Adónde vas esta tarde?","¿A donde vas esta tarde?","¿Aonde vas esta tarde?"], correct:1, exp:"El interrogativo de dirección se escribe junto y con tilde: “adónde”." },
      { q:"Identifica la oración con la concordancia correcta de \"ambos\":", options:["Ambos estudiante aprobó el examen.","Ambos estudiantes aprobaron el examen.","Ambos estudiantes aprobó el examen.","Ambo estudiantes aprobaron el examen."], correct:1, exp:"“Ambos” y el sustantivo que acompaña deben ir en plural, igual que el verbo." },
      { q:"Selecciona la oración sin redundancia con \"sendos\":", options:["Los ganadores recibieron sendos premios, uno cada uno.","Los ganadores recibieron sendos premios.","Los ganadores recibió sendos premios.","Los ganador recibieron sendos premio."], correct:1, exp:"“Sendos” ya significa “uno para cada uno”; añadir “uno cada uno” es redundante." },
      { q:"¿Cuál oración corrige el anacoluto (ruptura de la estructura) de la original?", options:["El problema con los estudiantes que no entregan sus tareas a tiempo, el maestro debe llamarles la atención.","Cuando los estudiantes no entregan sus tareas a tiempo, el maestro debe llamarles la atención.","El problema, los estudiantes no entregan sus tareas, el maestro llamarles la atención.","Los estudiantes que no entregan sus tareas a tiempo, el maestro, debe llamarles la atención."], correct:1, exp:"La oración original empieza una estructura (“el problema con...”) que nunca se completa; reorganizarla con “cuando” la hace coherente." },
      { q:"Selecciona la oración sin redundancia:", options:["El gobierno busca erradicar completamente la enfermedad.","El gobierno busca erradicar la enfermedad.","El gobierno busca erradicar totalmente y completamente la enfermedad.","El gobierno busca erradicar de raíz completamente la enfermedad."], correct:1, exp:"“Erradicar” ya significa eliminar por completo; agregar “completamente” es redundante." },
      { q:"¿Cuál oración usa correctamente \"para\" con sentido de destinatario?", options:["Este regalo es por ti.","Este regalo es para ti.","Este regalo es de por ti.","Este regalo es para de ti."], correct:1, exp:"Para indicar el destinatario de algo se usa “para”, no “por”." },
      { q:"¿Cuál oración usa correctamente el impersonal \"haber\" en tiempo compuesto?", options:["Han habido muchos cambios este año.","Ha habido muchos cambios este año.","Ha habidos muchos cambios este año.","Han habidos muchos cambios este año."], correct:1, exp:"El “haber” impersonal no se pluraliza ni siquiera en tiempos compuestos: “ha habido”." },
      { q:"¿Cuál oración usa correctamente \"sino\" para contraponer sustantivos?", options:["No es un problema técnico, sino que humano.","No es un problema técnico, sino humano.","No es un problema técnico, pero humano.","No es un problema técnico, si no humano."], correct:1, exp:"Para contraponer dos sustantivos (no dos acciones) se usa “sino”, sin “que”." },
      { q:"¿Cuál oración sigue el uso estándar recomendado del objeto directo de persona?", options:["Vi a Pedro y le saludé.","Vi a Pedro y lo saludé.","Vi a Pedro y la saludé.","Vi a Pedro y se saludé."], correct:1, exp:"“Saludar” es transitivo directo; lo recomendado para un referente masculino es “lo”, evitando el leísmo." },
      { q:"¿Cuál oración usa correctamente el conector \"de manera que\"?", options:["Estudió con dedicación, de manera que obtuvo excelentes resultados.","Estudió con dedicación, de manera de obtuvo excelentes resultados.","Estudió con dedicación, de manera a obtener excelentes resultados.","Estudió con dedicación, en manera que obtuvo excelentes resultados."], correct:0, exp:"El conector consecutivo correcto es “de manera que”, seguido de un verbo conjugado." },
      { q:"¿Cuál oración usa correctamente el relativo posesivo \"cuyo\"?", options:["El escritor que su libro ganó el premio será entrevistado.","El escritor cuyo libro ganó el premio será entrevistado.","El escritor cuyo su libro ganó el premio será entrevistado.","El escritor, que el libro ganó el premio, será entrevistado."], correct:1, exp:"“Cuyo” ya indica posesión; no debe combinarse con “su”: “cuyo libro”, no “que su libro”." },
      { q:"Selecciona la oración sin redundancia temporal:", options:["Volveré a repetir la explicación una vez más.","Repetiré la explicación.","Volveré a explicar de nuevo otra vez.","Repetiré de nuevo la explicación una vez más."], correct:1, exp:"“Volver a”, “repetir” y “una vez más” expresan la misma idea tres veces; basta con “repetiré”." }
    ]
  }
};

const TOPIC_ORDER = ["analogias","oraciones","lectura","redaccion"];
const EXAM_PICKS = { analogias:6, oraciones:6, lectura:6, redaccion:9 };
const EXAM_SECONDS = 24*60;

/* ============ STATE ============ */

let state = {
  page: "home",
  mode: "lesson",
  qIndex: 0,
  answers: {},
  progress: {},
  sessions: {}
};

TOPIC_ORDER.forEach(t=>{
  state.answers[t] = {};
  state.progress[t] = {done:false, score:0, total:TOPICS[t].questions.length};
});

let examState = null;
let examBest = null;

/* ============ STORAGE ============ */

async function loadProgress(){
  try{
    const res = await window.storage.get('paa-progress', false);
    if(res && res.value){
      const saved = JSON.parse(res.value);
      state.progress = Object.assign(state.progress, saved.progress || {});
      examBest = saved.examBest || null;
    }
  }catch(e){ /* sin progreso guardado todavía */ }
}

async function saveProgress(){
  try{
    await window.storage.set('paa-progress', JSON.stringify({
      progress: state.progress,
      examBest: examBest
    }), false);
  }catch(e){ console.warn('No se pudo guardar el progreso', e); }
}

/* ============ HELPERS ============ */

function el(tag, attrs={}, children=[]){
  const e = document.createElement(tag);
  Object.entries(attrs).forEach(([k,v])=>{
    if(k === 'class') e.className = v;
    else if(k === 'html') e.innerHTML = v;
    else if(k === 'disabled'){ if(v) e.setAttribute('disabled','true'); }
    else if(k.startsWith('on')) e.addEventListener(k.substring(2), v);
    else e.setAttribute(k, v);
  });
  (Array.isArray(children)?children:[children]).forEach(c=>{
    if(c === null || c === undefined) return;
    if(typeof c === 'string') e.appendChild(document.createTextNode(c));
    else e.appendChild(c);
  });
  return e;
}

function setActiveTab(page){
  document.querySelectorAll('#tabs button').forEach(b=>{
    b.classList.toggle('active', b.dataset.page === page);
  });
}

function shuffle(arr){
  const a = arr.slice();
  for(let i=a.length-1;i>0;i--){
    const j = Math.floor(Math.random()*(i+1));
    [a[i],a[j]] = [a[j],a[i]];
  }
  return a;
}

function fmtTime(sec){
  const m = Math.floor(sec/60).toString().padStart(2,'0');
  const s = (sec%60).toString().padStart(2,'0');
  return m+':'+s;
}

/* Builds a freshly shuffled practice session: question order AND option order randomized */
function buildSession(key){
  const t = TOPICS[key];
  const order = shuffle(t.questions.map((_,i)=>i));
  return order.map(origIdx=>{
    const q = t.questions[origIdx];
    const optOrder = shuffle(q.options.map((_,i)=>i));
    return {
      qText: q.q,
      passageId: q.passageId || null,
      exp: q.exp,
      options: optOrder.map(oi=>q.options[oi]),
      correct: optOrder.indexOf(q.correct)
    };
  });
}

/* ============ PAGES ============ */

function renderHome(){
  const main = document.getElementById('main');
  main.innerHTML = '';

  const hero = el('div',{class:'hero'},[
    el('span',{class:'eyebrow'},'Preparación · Sección verbal'),
    el('h1',{},'Domina las analogías, la lógica de las oraciones, la lectura crítica y la redacción indirecta.'),
    el('p',{},'Cada tema empieza con una lección corta y estrategias concretas, y termina con ejercicios de práctica al estilo del examen. Las preguntas y sus opciones se reparten en un orden distinto cada vez que repites un tema.'),
    el('div',{class:'pair-demo'},[
      el('span',{class:'word-chip'},'MÉDICO'),
      el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
      el('span',{class:'word-chip'},'HOSPITAL'),
      el('span',{style:'color:var(--muted);font-size:.85rem;'},'como'),
      el('span',{class:'word-chip'},'MAESTRO'),
      el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
      el('span',{class:'word-chip'},'?')
    ])
  ]);

  const examBanner = el('div',{class:'exam-banner'},[
    el('div',{},[
      el('span',{class:'eyebrow'},'Modo examen'),
      el('h3',{},'Simulacro cronometrado de 24 minutos'),
      el('p',{},'27 preguntas mezcladas de los cuatro temas, en un orden nuevo cada vez — igual que el día del examen.')
    ]),
    el('button',{class:'btn danger', onclick:()=>goTo('simulacro')},'Comenzar →')
  ]);

  const grid = el('div',{class:'track-grid'});
  TOPIC_ORDER.forEach(key=>{
    const t = TOPICS[key];
    const p = state.progress[key];
    const pct = p.total ? Math.round((p.score/p.total)*100) : 0;
    const card = el('div',{class:'track-card', onclick:()=>{ goTo(key); }},[
      el('span',{class:'eyebrow'}, p.done ? 'Completado' : 'Por practicar'),
      el('h3',{}, t.title),
      el('p',{}, t.tagline),
      el('div',{class:'track-progress-bar'},[el('div',{class:'track-progress-fill', style:`width:${pct}%`})]),
      el('div',{class:'track-meta'},[
        el('span',{}, p.done ? `${p.score}/${p.total} correctas` : `${t.questions.length} ejercicios`),
        el('span',{}, '→')
      ])
    ]);
    grid.appendChild(card);
  });

  main.appendChild(hero);
  main.appendChild(examBanner);
  main.appendChild(grid);
}

function renderProgress(){
  const main = document.getElementById('main');
  main.innerHTML = '';

  const header = el('div',{class:'topic-header'},[
    el('span',{class:'eyebrow'},'Resumen'),
    el('h2',{},'Mi progreso'),
    el('p',{},'Tu avance se guarda automáticamente en este dispositivo.')
  ]);

  let totalScore=0, totalQ=0, topicsDone=0;
  TOPIC_ORDER.forEach(k=>{
    const p = state.progress[k];
    if(p.done){ totalScore+=p.score; totalQ+=p.total; topicsDone++; }
  });
  const overallPct = totalQ ? Math.round((totalScore/totalQ)*100) : 0;

  const stats = el('div',{class:'stat-grid'},[
    el('div',{class:'stat-card'},[el('div',{class:'stat-num'}, `${topicsDone}/${TOPIC_ORDER.length}`), el('div',{class:'stat-label'},'temas completados')]),
    el('div',{class:'stat-card'},[el('div',{class:'stat-num'}, totalQ ? overallPct+'%' : '—'), el('div',{class:'stat-label'},'aciertos en práctica')]),
    el('div',{class:'stat-card'},[el('div',{class:'stat-num'}, examBest ? `${examBest.score}/${examBest.total}` : '—'), el('div',{class:'stat-label'},'mejor simulacro')])
  ]);

  const list = el('div',{class:'progress-list'});
  TOPIC_ORDER.forEach(key=>{
    const t = TOPICS[key];
    const p = state.progress[key];
    const pct = p.total ? Math.round((p.score/p.total)*100) : 0;
    const row = el('div',{class:'progress-row'},[
      el('span',{class:'label'}, t.title),
      el('div',{class:'bar-wrap'},[
        el('div',{class:'track-progress-bar'},[el('div',{class:'track-progress-fill', style:`width:${pct}%`})])
      ]),
      el('span',{class:'eyebrow', style:'color:var(--muted)'}, p.done ? `${p.score}/${p.total}` : 'sin empezar')
    ]);
    list.appendChild(row);
  });

  const resetBtn = el('button',{class:'reset-link', onclick: async ()=>{
    if(confirm('¿Borrar todo tu progreso guardado, incluyendo tu mejor simulacro?')){
      TOPIC_ORDER.forEach(t=>{
        state.progress[t] = {done:false, score:0, total:TOPICS[t].questions.length};
        state.answers[t] = {};
        state.sessions[t] = null;
      });
      examBest = null;
      await saveProgress();
      renderProgress();
    }
  }}, 'Borrar progreso');

  main.appendChild(header);
  main.appendChild(stats);
  main.appendChild(list);
  main.appendChild(resetBtn);
}

function renderTopic(key){
  const main = document.getElementById('main');
  main.innerHTML = '';
  const t = TOPICS[key];

  const header = el('div',{class:'topic-header'},[
    el('span',{class:'eyebrow'}, key === 'redaccion' ? 'Redacción indirecta' : 'Sección verbal'),
    el('h2',{}, t.title),
    el('p',{}, t.tagline)
  ]);

  const toggle = el('div',{class:'mode-toggle'},[
    el('button',{class: state.mode==='lesson' ? 'active':'', onclick:()=>{state.mode='lesson'; renderTopic(key);}}, 'Lección'),
    el('button',{class: state.mode==='practice' ? 'active':'', onclick:()=>{
      state.mode='practice'; state.qIndex=0;
      if(!state.sessions[key]) state.sessions[key] = buildSession(key);
      renderTopic(key);
    }}, 'Práctica')
  ]);

  main.appendChild(header);
  main.appendChild(toggle);

  if(state.mode === 'lesson'){
    main.appendChild(renderLesson(t, key));
  } else {
    if(!state.sessions[key]) state.sessions[key] = buildSession(key);
    main.appendChild(renderPractice(t, key));
  }
}

function renderLesson(t, key){
  const wrap = el('div',{});

  const card = el('div',{class:'lesson-card'},[
    el('h3',{},'Cómo pensar este tipo de ejercicio'),
    el('p',{}, t.lesson.intro)
  ]);

  const ul = el('ul',{});
  t.lesson.points.forEach(pt=> ul.appendChild(el('li',{}, pt)));
  card.appendChild(ul);

  if(t.lesson.chips){
    const chipList = el('ul',{class:'chip-list'});
    t.lesson.chips.forEach(c=> chipList.appendChild(el('li',{}, c)));
    card.appendChild(chipList);
  }

  if(t.lesson.examples){
    t.lesson.examples.forEach(ex=>{
      if(ex.pair){
        const row = el('div',{class:'example-analogy'},[
          el('span',{class:'word-chip'}, ex.pair[0]),
          el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
          el('span',{class:'word-chip'}, ex.pair[1]),
          el('span',{style:'color:var(--muted);font-size:.85rem;'},'→ ' + ex.rel + ' →'),
          el('span',{class:'word-chip'}, ex.test[0]),
          el('span',{class:'link-motif'},[el('span',{class:'dots'},'::')]),
          el('span',{class:'word-chip'}, ex.test[1])
        ]);
        card.appendChild(row);
      } else if(ex.sentence){
        card.appendChild(el('p',{style:'font-style:italic;color:var(--ink-soft);'}, '“' + ex.sentence + '”'));
        card.appendChild(el('p',{style:'color:var(--muted);font-size:.9rem;'}, 'Respuesta: ' + ex.answer + ' — ' + ex.why));
      }
    });
  }

  const strat = el('div',{class:'strategy-box'},[
    el('b',{},'Estrategia'),
    document.createTextNode(t.lesson.strategy)
  ]);
  card.appendChild(strat);
  wrap.appendChild(card);

  if(t.passages){
    Object.values(t.passages).forEach(pg=>{
      const p = el('div',{class:'passage-card'},[
        el('span',{class:'eyebrow'}, pg.title),
        el('p',{}, pg.text)
      ]);
      wrap.appendChild(p);
    });
  }

  const cta = el('div',{style:'text-align:center;margin-top:8px;'},[
    el('button',{class:'btn', onclick:()=>{
      state.mode='practice'; state.qIndex=0;
      if(!state.sessions[key]) state.sessions[key] = buildSession(key);
      renderTopic(key);
    }}, 'Ir a practicar →')
  ]);
  wrap.appendChild(cta);

  return wrap;
}

function renderPractice(t, key){
  const wrap = el('div',{});
  const session = state.sessions[key];
  const total = session.length;
  const i = state.qIndex;

  if(i >= total){
    const answered = state.answers[key];
    let score = 0;
    const missed = [];
    session.forEach((item, idx)=>{
      const a = answered[idx];
      if(a && a.correct) score++;
      else if(a) missed.push({item, idx, selected:a.selected});
    });
    state.progress[key] = {done:true, score, total};
    saveProgress();

    const result = el('div',{class:'exercise-card result-card'},[
      el('span',{class:'eyebrow'},'Resultado'),
      el('div',{class:'result-score'}, `${score} / ${total}`),
      el('p',{}, score === total ? '¡Excelente! Dominas este tema.' : 'Revisa las explicaciones de lo que falló y vuelve a intentarlo cuando quieras — las preguntas y opciones se repartirán en otro orden.'),
      el('div',{style:'display:flex;gap:10px;justify-content:center;margin-top:18px;'},[
        el('button',{class:'btn ghost', onclick:()=>{ state.qIndex=0; state.answers[key]={}; state.sessions[key]=buildSession(key); renderTopic(key); }}, 'Intentar de nuevo'),
        el('button',{class:'btn', onclick:()=>{ goTo('home'); }}, 'Volver al inicio')
      ])
    ]);

    if(missed.length){
      const reviewWrap = el('div',{class:'review-list'});
      reviewWrap.appendChild(el('h3',{style:'font-size:1rem;margin-top:24px;'}, `Repasa lo que falló (${missed.length})`));
      missed.forEach(m=>{
        reviewWrap.appendChild(el('div',{class:'review-item'},[
          el('div',{class:'rq'}, m.item.qText),
          el('div',{class:'rline ryour'}, 'Tu respuesta: ' + m.item.options[m.selected]),
          el('div',{class:'rline rcorrect'}, 'Correcta: ' + m.item.options[m.item.correct]),
          el('div',{class:'rexp'}, m.item.exp)
        ]));
      });
      result.appendChild(reviewWrap);
    }

    wrap.appendChild(result);
    return wrap;
  }

  const item = session[i];
  const already = state.answers[key][i];

  wrap.appendChild(el('div',{class:'progress-track'},[
    el('div',{class:'progress-track-fill', style:`width:${(i/total)*100}%`})
  ]));

  const card = el('div',{class:'exercise-card'});

  if(item.passageId && t.passages){
    const pg = t.passages[item.passageId];
    card.appendChild(el('div',{class:'passage-card', style:'margin:-4px 0 20px;'},[
      el('span',{class:'eyebrow'}, pg.title),
      el('p',{}, pg.text)
    ]));
  }

  card.appendChild(el('div',{class:'qnum'},[
    el('span',{}, `Ejercicio ${i+1} de ${total}`)
  ]));
  card.appendChild(el('p',{class:'qtext'}, item.qText));

  const optionsWrap = el('div',{class:'options'});
  item.options.forEach((opt, idx)=>{
    const optBtn = el('button',{class:'option'},[
      el('span',{class:'key'}, String(idx+1)),
      el('span',{}, opt)
    ]);
    if(already){
      optBtn.setAttribute('disabled','true');
      if(idx === item.correct) optBtn.classList.add('correct');
      if(idx === already.selected && idx !== item.correct) optBtn.classList.add('incorrect');
    }
    optBtn.addEventListener('click', ()=>{
      if(state.answers[key][i]) return;
      state.answers[key][i] = {selected: idx, correct: idx === item.correct};
      saveProgress();
      renderTopic(key);
    });
    optionsWrap.appendChild(optBtn);
  });
  card.appendChild(optionsWrap);

  const feedback = el('div',{class:'feedback' + (already ? ' show ' + (already.correct?'correct':'incorrect') : '')},[
    el('b',{}, already ? (already.correct ? 'Correcto' : 'No es la respuesta') : ''),
    document.createTextNode(already ? item.exp : '')
  ]);
  card.appendChild(feedback);

  const navRow = el('div',{class:'nav-row'},[
    el('button',{class:'btn ghost', disabled: i===0, onclick:()=>{ state.qIndex--; renderTopic(key); }}, '← Anterior'),
    el('button',{class:'btn', disabled: !already, onclick:()=>{ state.qIndex++; renderTopic(key); }}, i === total-1 ? 'Ver resultado' : 'Siguiente →')
  ]);
  card.appendChild(navRow);

  wrap.appendChild(card);
  return wrap;
}

/* ============ EXAM MODE ============ */

function buildExam(){
  const list = [];
  TOPIC_ORDER.forEach(key=>{
    const t = TOPICS[key];
    const n = Math.min(EXAM_PICKS[key], t.questions.length);
    const idxs = shuffle(t.questions.map((_,i)=>i)).slice(0, n);
    idxs.forEach(idx=>{
      const q = t.questions[idx];
      const optOrder = shuffle(q.options.map((_,i)=>i));
      list.push({
        topic:key,
        qText: q.q,
        passageId: q.passageId || null,
        exp: q.exp,
        options: optOrder.map(oi=>q.options[oi]),
        correct: optOrder.indexOf(q.correct)
      });
    });
  });
  return shuffle(list);
}

function startExam(){
  examState = {
    questions: buildExam(),
    answers: {},
    index: 0,
    timeLeft: EXAM_SECONDS,
    finished: false
  };
  examState.timerId = setInterval(()=>{
    examState.timeLeft--;
    if(examState.timeLeft <= 0){
      clearInterval(examState.timerId);
      examState.timeLeft = 0;
      finishExam();
      return;
    }
    const tEl = document.getElementById('exam-timer');
    if(tEl){
      tEl.textContent = fmtTime(examState.timeLeft);
      tEl.classList.toggle('low', examState.timeLeft <= 60);
    }
  },1000);
  renderExam();
}

function finishExam(){
  if(examState && examState.timerId) clearInterval(examState.timerId);
  if(examState) examState.finished = true;
  let score = 0;
  const byTopic = {};
  TOPIC_ORDER.forEach(k=> byTopic[k] = {score:0,total:0});
  examState.questions.forEach((item, idx)=>{
    byTopic[item.topic].total++;
    const a = examState.answers[idx];
    if(a && a.selected === item.correct){ score++; byTopic[item.topic].score++; }
  });
  const total = examState.questions.length;
  if(!examBest || score > examBest.score){
    examBest = {score, total, date: new Date().toISOString().slice(0,10)};
    saveProgress();
  }
  examState.result = {score, total, byTopic};
  renderExam();
}

function renderExam(){
  const main = document.getElementById('main');
  main.innerHTML = '';

  if(!examState){
    const intro = el('div',{class:'exam-intro-card'},[
      el('span',{class:'eyebrow'},'Modo examen'),
      el('h2',{}, 'Simulacro cronometrado'),
      el('p',{style:'color:var(--muted);max-width:60ch;line-height:1.6;'}, 'Este simulacro mezcla preguntas de los cuatro temas, sin mostrarte la lección de por medio, igual que el día real del examen. Cada vez que lo comienzas, las preguntas y las opciones se reparten en un orden nuevo.'),
      el('ul',{},[
        el('li',{}, `27 preguntas: ${EXAM_PICKS.analogias} de analogías, ${EXAM_PICKS.oraciones} de completar oraciones, ${EXAM_PICKS.lectura} de lectura crítica y ${EXAM_PICKS.redaccion} de redacción indirecta.`),
        el('li',{}, `Tienes ${EXAM_SECONDS/60} minutos en total. El simulacro se cierra automáticamente cuando el tiempo termina.`),
        el('li',{}, 'No verás si acertaste hasta el final — así practicas el ritmo real del examen.'),
        el('li',{}, 'Al terminar, obtienes tu puntaje por sección y un repaso de cada pregunta que fallaste.')
      ]),
      el('button',{class:'btn danger', style:'margin-top:10px;', onclick: startExam}, 'Comenzar simulacro')
    ]);
    main.appendChild(intro);
    return;
  }

  if(examState.finished){
    renderExamResult();
    return;
  }

  const total = examState.questions.length;
  const i = examState.index;
  const item = examState.questions[i];
  const already = examState.answers[i];

  const timerBar = el('div',{class:'timer-bar'},[
    el('span',{}, `Pregunta ${i+1} de ${total} · ${TOPICS[item.topic].title}`),
    el('span',{class:'time' + (examState.timeLeft<=60?' low':''), id:'exam-timer'}, fmtTime(examState.timeLeft))
  ]);
  main.appendChild(timerBar);

  main.appendChild(el('div',{class:'progress-track'},[
    el('div',{class:'progress-track-fill exam', style:`width:${(i/total)*100}%`})
  ]));

  const card = el('div',{class:'exercise-card'});

  if(item.passageId){
    const pg = TOPICS.lectura.passages[item.passageId];
    card.appendChild(el('div',{class:'passage-card', style:'margin:-4px 0 20px;'},[
      el('span',{class:'eyebrow'}, pg.title),
      el('p',{}, pg.text)
    ]));
  }

  card.appendChild(el('p',{class:'qtext'}, item.qText));

  const optionsWrap = el('div',{class:'options'});
  item.options.forEach((opt, idx)=>{
    const optBtn = el('button',{class:'option' + (already && already.selected===idx ? ' selected':'')},[
      el('span',{class:'key'}, String(idx+1)),
      el('span',{}, opt)
    ]);
    optBtn.addEventListener('click', ()=>{
      examState.answers[i] = {selected: idx};
      renderExam();
    });
    optionsWrap.appendChild(optBtn);
  });
  card.appendChild(optionsWrap);

  const navRow = el('div',{class:'nav-row'},[
    el('button',{class:'btn ghost', disabled: i===0, onclick:()=>{ examState.index--; renderExam(); }}, '← Anterior'),
    i === total-1
      ? el('button',{class:'btn danger', onclick: finishExam}, 'Finalizar simulacro')
      : el('button',{class:'btn', onclick:()=>{ examState.index++; renderExam(); }}, 'Siguiente →')
  ]);
  card.appendChild(navRow);

  main.appendChild(card);
}

function renderExamResult(){
  const main = document.getElementById('main');
  const r = examState.result;

  const result = el('div',{class:'exercise-card result-card'},[
    el('span',{class:'eyebrow'},'Resultado del simulacro'),
    el('div',{class:'result-score'}, `${r.score} / ${r.total}`),
    el('p',{}, examBest && examBest.score===r.score ? '¡Nuevo mejor resultado guardado!' : 'Así te fue en este intento.')
  ]);

  const breakdown = el('div',{class:'breakdown'});
  TOPIC_ORDER.forEach(k=>{
    const b = r.byTopic[k];
    if(b.total===0) return;
    breakdown.appendChild(el('div',{class:'chip'},[
      el('b',{}, `${b.score}/${b.total}`),
      TOPICS[k].title
    ]));
  });
  result.appendChild(breakdown);

  result.appendChild(el('div',{style:'display:flex;gap:10px;justify-content:center;margin-top:8px;'},[
    el('button',{class:'btn ghost', onclick:()=>{ examState=null; renderExam(); }}, 'Nuevo simulacro'),
    el('button',{class:'btn', onclick:()=>{ goTo('home'); }}, 'Volver al inicio')
  ]));

  const missed = [];
  examState.questions.forEach((item, idx)=>{
    const a = examState.answers[idx];
    if(!a || a.selected !== item.correct) missed.push({item, idx, selected: a ? a.selected : null});
  });

  if(missed.length){
    const reviewWrap = el('div',{class:'review-list'});
    reviewWrap.appendChild(el('h3',{style:'font-size:1rem;margin-top:24px;'}, `Repasa lo que falló o dejaste en blanco (${missed.length})`));
    missed.forEach(m=>{
      const item = m.item;
      reviewWrap.appendChild(el('div',{class:'review-item'},[
        el('span',{class:'topic-tag'}, TOPICS[item.topic].title),
        el('div',{class:'rq'}, item.qText),
        el('div',{class:'rline ryour'}, m.selected===null ? 'No respondiste esta pregunta.' : 'Tu respuesta: ' + item.options[m.selected]),
        el('div',{class:'rline rcorrect'}, 'Correcta: ' + item.options[item.correct]),
        el('div',{class:'rexp'}, item.exp)
      ]));
    });
    result.appendChild(reviewWrap);
  }

  main.innerHTML = '';
  main.appendChild(result);
}

/* ============ ROUTER ============ */

let currentTopicKey = null;

function goTo(page){
  state.page = page;
  state.mode = 'lesson';
  state.qIndex = 0;
  setActiveTab(page);
  if(page === 'home') renderHome();
  else if(page === 'progreso') renderProgress();
  else if(page === 'simulacro'){ examState = null; renderExam(); }
  else { currentTopicKey = page; renderTopic(page); }
  window.scrollTo({top:0, behavior:'auto'});
}

document.getElementById('tabs').addEventListener('click', (e)=>{
  const btn = e.target.closest('button[data-page]');
  if(!btn) return;
  goTo(btn.dataset.page);
});

document.addEventListener('keydown', (e)=>{
  if(!['1','2','3','4'].includes(e.key)) return;
  const opts = document.querySelectorAll('.option:not([disabled])');
  const idx = parseInt(e.key,10) - 1;
  if(opts[idx]) opts[idx].click();
});

/* ============ INIT ============ */

(async function init(){
  const main = document.getElementById('main');
  main.innerHTML = '<p class="loading-note">Cargando tu progreso…</p>';
  await loadProgress();
  goTo('home');
})();
</script>
</body>
</html>