# Hub de Autogestión WooCommerce (`hub-woo.html`) — Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Build a single-file, self-contained HTML deliverable (`hub-woo.html`) that lets a non-tech-savvy WooCommerce store owner self-manage their store, with bilingual ES/EN content, interactive checklists, search, progress/achievements, and agency-friendly share links.

**Architecture:** One self-contained HTML file with three `<script>` blocks (CONFIG → DATA → ENGINE). Content lives as data objects (not hand-written HTML); a vanilla-JS engine renders sections, tutorials, steps, SVG panel mockups, checklists, and widgets. A Node validation script (`validate-hub.js`) verifies data integrity without a browser.

**Tech Stack:** Vanilla HTML5 + CSS3 (custom properties, CSS variables for dark/light) + Vanilla JS (no libraries, no build step). Node.js (only for the optional data-validation script). LocalStorage for persistence. YouTube iframe embeds.

**Deliverable location:** `C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html`

**Supporting files:**
- `C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\validate-hub.js` — Node validation script
- `C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\docs\superpowers\specs\2026-09-01-hub-woocommerce-design.md` — approved spec (source of truth)

---

## File Structure

The deliverable is a single file, so the "files" here are the sections inside `hub-woo.html` plus one helper script:

| Section | Responsibility |
|---|---|
| `<head>` + CSS | Design system, dark/light variables, responsive layout, animations, print |
| `<body>` shell | Header, sidebar, main, footer, floating WhatsApp button, toast container |
| `<script id="hub-config">` | `CONFIG` object — client-editable data (name, URLs, WhatsApp, videos map) |
| `<script id="hub-data">` | `DATA` — secciones, tutoriales, glosario, faq, logros, MOCKUPS, ZONAS, I18N |
| `<script id="hub-engine">` | Engine — router, renderers, search, checklists, progress, toggles, tooltips |
| `validate-hub.js` | Node script that evals CONFIG+DATA and asserts integrity |

**Data contract (used across all tasks — do not deviate):**

```js
CONFIG = {
  clientName:   { es: "Tu Tienda", en: "Your Store" },
  storeUrl:     "https://tutienda.com",
  loginUrl:     "https://tutienda.com/wp-admin",
  whatsappNumber: "50200000000",            // international digits, no + or spaces
  email:        "agencia@coordenadas.co",
  defaultLang:  "es",                       // "es" | "en"
  videos: { "crear-producto": "6OJSAn6A5mA" }  // tutorial-id -> youtube key (string OR array)
}

DATA = {
  secciones: [ { id, icono, color, etiqueta?, titulo: {es,en} } ],
  tutoriales: [ TUTORIAL ],
  glosario:  [ { termino: {es,en}, def: {es,en} } ],
  faq:       [ { q: {es,en}, a: {es,en} } ],
  logros:    [ { id, icono, titulo: {es,en}, condicion } ],   // condicion = tutorial id
  MOCKUPS:   { name: { title, body } },                       // SVG snippet builders
  ZONAS:     { mockupName: [ { id, x, y, label } ] }          // highlight targets in px
}

TUTORIAL = {
  id, sec,                            // sec must match a seccion.id
  titulo: {es,en},
  duracion: {es,en},                  // e.g. {es:"3 min", en:"3 min"}
  video: "crear-producto",            // key into CONFIG.videos; omit if none
  keywords: [ "producto", "agregar" ],
  intro: {es,en},
  pasos: [ { texto: {es,en}, mockup, resaltar: [zonaId,...] } ],
  checklist: [ { id, texto: {es,en} } ]
}

I18N = { es: { ... }, en: { ... } }   // identical key sets in both languages
```

**Section and tutorial IDs (canonical — reused verbatim across tasks):**

Sections: `acceso`, `productos`, `pedidos`, `cupones`, `web`, `pagos`, `clientes`, `reportes`, `correos`, `avanzados`.

Tutorials:
- acceso: `entrar-tienda`, `recuperar-contrasena`, `seguridad-basica`
- productos: `crear-producto`, `tipos-producto`, `subir-fotos`, `cambiar-precio-stock`, `categorias-etiquetas`, `imagen-categoria`, `variaciones`, `producto-agrupado`, `quitar-producto`
- pedidos: `ver-pedidos`, `cambiar-estado`, `ver-factura`, `devoluciones-reembolsos`, `notas-cliente`, `costos-envio`
- cupones: `crear-cupon`, `envio-gratis`, `promo-fechas`, `restricciones`
- web: `editar-texto`, `banner-portada`, `pagina-nueva-menu`, `menu-navegacion`, `footer-astra`
- pagos: `verificar-pago`, `conectar-paypal`, `conectar-stripe`, `configurar-impuestos`, `donde-cae-dinero`, `factura-recibo`
- clientes: `lista-clientes`, `responder-resenas`, `roles-usuario`
- reportes: `cuanto-vendi`, `producto-mas-vendido`, `analytics-simple`
- correos: `correos-automaticos`, `configurar-correos`
- avanzados: `ajustes-productos`, `ajustes-impuestos`, `ajustes-ejemplo-impuesto`, `ajustes-zonas-envio`, `ajustes-envio-plano`, `ajustes-retiro-tienda`, `ajustes-envio-gratis`, `ajustes-checkout`, `ajustes-cuentas`, `ajustes-correos`

**Video catalog (from spec §4.1 — map into `CONFIG.videos`):**

```
crear-producto: 6OJSAn6A5mA          tipos-producto: HhOf9260a2o
subir-fotos: 9wte-83NSnI             categorias-etiquetas: kPJnJomWU4Y
imagen-categoria: oTaBcQG9oNI        variaciones: lWQkNR38_EM
producto-agrupado: MahrLowOGng       ver-pedidos: ["rjS3mbiLN_c","3nfmJcPR3I4"]
devoluciones-reembolsos: mFNAY2dsXwY costos-envio: 3d7yNpIi2_8
crear-cupon: gi-MhzDSdb4             editar-texto: Z4fUt4WpRhE
pagina-nueva-menu: ZsbVIO-1u8g       menu-navegacion: Zyl-lRH-5Os
footer-astra: FOU5UzlRyhk            conectar-paypal: 5tCIpGAxUh4
conectar-stripe: h0vvueoj16k         configurar-impuestos: s-fgmY6nwJA
cuanto-vendi: B6XS3Z1reVw            correos-automaticos: g_wR3VWvATg
configurar-correos: 2vtzGc92tFU      ajustes-productos: FEmwJsE8xDY
ajustes-impuestos: 0aPtye5ba4A       ajustes-ejemplo-impuesto: HC2IUnJSJro
ajustes-zonas-envio: 1HhBEbIMqAQ     ajustes-envio-plano: a5N99INu6Fs
ajustes-retiro-tienda: HHYOQbcD2KE   ajustes-envio-gratis: 7s-SHvVR2Os
ajustes-checkout: zoejwJfXops        ajustes-cuentas: AGZSeX5I-wo
ajustes-correos: 2vtzGc92tFU
```

**Achievements (from spec §5):** `logro-primer-producto` (🏆, condicion `crear-producto`), `logro-primer-pedido` (🚀, condicion `cambiar-estado`), `logro-primera-promo` (🎉, condicion `crear-cupon`), `logro-vi-ventas` (💰, condicion `cuanto-vendi`).

---

### Task 1: Scaffold the file skeleton, CSS design system, and shell

**Files:**
- Create: `C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html`

- [ ] **Step 1: Create the initial HTML file with head, design-system CSS, and body shell**

Write the full file. This is the complete scaffold — later tasks insert content into the three script blocks and wire CSS selectors. Use CSS custom properties for theming.

```html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, nofollow">
<title>Guía de tu Tienda · Coordenadas.co</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=Inter:wght@300;400;500;600;700;800&family=Baloo+2:wght@500;600;700;800&display=swap" rel="stylesheet">
<style>
:root{
  --green:#20C162; --yellow:#FCCC09; --blue:#01C7FE; --orange:#FF4200;
  --font-display:'Baloo 2',system-ui,sans-serif;
  --font-body:'Inter',system-ui,sans-serif;
  --radius:14px; --radius-sm:8px; --ease:250ms cubic-bezier(.16,1,.3,1);
  --sidebar-w:264px;
}
[data-theme="dark"]{
  --bg:#000000; --bg-alt:#0a0a0a; --bg-card:#111;
  --text:#ffffff; --text-body:#e7ece8; --text-dim:#93a097; --text-muted:#6f7b73;
  --border:rgba(255,255,255,.08); --border-strong:rgba(255,255,255,.16);
  --card-bg:rgba(255,255,255,.03);
  --shadow:0 10px 40px rgba(0,0,0,.5);
}
[data-theme="light"]{
  --bg:#ffffff; --bg-alt:#f6f8f7; --bg-card:#ffffff;
  --text:#0a0f0c; --text-body:#1f2a24; --text-dim:#5c6a62; --text-muted:#84918a;
  --border:rgba(0,0,0,.09); --border-strong:rgba(0,0,0,.18);
  --card-bg:#ffffff;
  --shadow:0 10px 40px rgba(20,40,30,.12);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--font-body);background:var(--bg);color:var(--text-body);line-height:1.6;-webkit-font-smoothing:antialiased;transition:background var(--ease),color var(--ease)}
body::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(ellipse 55% 40% at 20% 0%,rgba(32,193,98,.07),transparent 60%),
             radial-gradient(ellipse 50% 35% at 80% 30%,rgba(252,204,9,.05),transparent 60%)}
a{color:var(--green);text-decoration:none}
button{font-family:var(--font-body);cursor:pointer;border:none;background:none;color:inherit}
#app{position:relative;z-index:1;min-height:100vh}

/* ---------- Top bar ---------- */
.topbar{position:sticky;top:0;z-index:50;display:flex;align-items:center;gap:14px;height:60px;padding:0 20px;
  background:color-mix(in srgb,var(--bg) 82%,transparent);backdrop-filter:blur(16px);border-bottom:1px solid var(--border)}
.topbar .logo{display:flex;align-items:center;gap:9px;font-family:var(--font-display);font-weight:700;color:var(--text);font-size:1.05rem}
.topbar .logo svg{width:24px;height:24px;flex-shrink:0}
.topbar .spacer{flex:1}
.tb-btn{display:inline-flex;align-items:center;gap:7px;padding:7px 13px;border-radius:20px;font-size:.82rem;font-weight:600;
  border:1px solid var(--border);color:var(--text-dim);transition:all var(--ease)}
.tb-btn:hover{border-color:var(--border-strong);color:var(--text)}
.tb-btn.active{background:rgba(32,193,98,.12);color:var(--green);border-color:rgba(32,193,98,.35)}

/* ---------- Layout ---------- */
.layout{display:flex;min-height:calc(100vh - 60px)}
.sidebar{width:var(--sidebar-w);flex-shrink:0;padding:24px 18px;border-right:1px solid var(--border);position:sticky;top:60px;height:calc(100vh - 60px);overflow-y:auto}
.main{flex:1;min-width:0;padding:34px 40px 80px;max-width:1040px;margin:0 auto}
@media(max-width:900px){ .sidebar{display:none} .main{padding:24px 18px 90px} }

/* ---------- Sidebar ---------- */
.sb-group{margin-bottom:20px}
.sb-group h4{font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;color:var(--text-muted);margin:0 0 8px 10px;font-weight:700}
.sb-link{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:10px;color:var(--text-dim);font-size:.9rem;font-weight:500;transition:all var(--ease)}
.sb-link:hover{background:var(--card-bg);color:var(--text)}
.sb-link.active{background:rgba(32,193,98,.12);color:var(--green);font-weight:600}
.sb-link .ic{width:22px;text-align:center;flex-shrink:0}
.progress-wrap{margin:6px 4px 26px;padding:14px;background:var(--card-bg);border:1px solid var(--border);border-radius:var(--radius-sm)}
.progress-bar{height:8px;background:var(--border);border-radius:6px;overflow:hidden}
.progress-fill{height:100%;background:linear-gradient(90deg,var(--green),var(--blue));border-radius:6px;width:0;transition:width .5s var(--ease)}
.progress-label{font-size:.72rem;color:var(--text-dim);margin-top:7px;font-weight:600}
.progress-pct{font-family:var(--font-display);color:var(--green);font-weight:700}

/* ---------- Home ---------- */
.hero{text-align:center;padding:30px 0 26px}
.hero h1{font-family:var(--font-display);font-size:clamp(1.8rem,4vw,2.9rem);font-weight:800;color:var(--text);line-height:1.1;letter-spacing:-.02em}
.hero .subtitle{color:var(--text-dim);font-size:1rem;max-width:640px;margin:10px auto 0}
.search-box{max-width:620px;margin:26px auto 0;position:relative}
.search-box input{width:100%;padding:16px 20px 16px 48px;font-size:1rem;border-radius:16px;border:1px solid var(--border-strong);
  background:var(--bg-card);color:var(--text);outline:none;transition:border var(--ease),box-shadow var(--ease)}
.search-box input:focus{border-color:var(--green);box-shadow:0 0 0 3px rgba(32,193,98,.18)}
.search-box .s-ic{position:absolute;left:17px;top:50%;transform:translateY(-50%);font-size:1.05rem;color:var(--text-muted)}
.search-results{max-width:620px;margin:14px auto 0;text-align:left}
.sr-item{display:block;padding:12px 16px;border-radius:12px;border:1px solid var(--border);background:var(--card-bg);margin-bottom:8px;color:var(--text-body);transition:all var(--ease)}
.sr-item:hover{border-color:var(--green);transform:translateY(-1px)}
.sr-item .sr-sec{font-size:.68rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.08em}
.sr-item .sr-t{font-weight:600;font-size:.95rem;margin-top:2px}
.sr-empty{text-align:center;color:var(--text-dim);padding:18px}

/* ---------- Cards grid ---------- */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:14px;margin-top:30px}
.card{display:flex;flex-direction:column;gap:8px;padding:18px;border-radius:var(--radius);border:1px solid var(--border);
  background:var(--card-bg);color:var(--text-body);text-align:left;transition:all var(--ease);position:relative;overflow:hidden}
.card:hover{border-color:var(--border-strong);transform:translateY(-2px);box-shadow:var(--shadow)}
.card .ci{font-size:1.6rem;line-height:1}
.card .ct{font-family:var(--font-display);font-weight:700;font-size:1.05rem;color:var(--text)}
.card .cd{font-size:.8rem;color:var(--text-dim)}
.card .chip{position:absolute;top:12px;right:12px;font-size:.62rem;font-weight:700;padding:2px 9px;border-radius:12px;background:var(--yellow);color:#000}
.chip-green{background:var(--green)!important;color:#fff!important}

/* ---------- Sections & tutorials ---------- */
.section-head{display:flex;align-items:center;gap:14px;margin-bottom:8px}
.section-head .big-ic{font-size:2rem}
.section-head h2{font-family:var(--font-display);font-size:1.7rem;font-weight:800;color:var(--text)}
.section-desc{color:var(--text-dim);font-size:.92rem;margin-bottom:22px}
.tut-item{display:flex;align-items:center;gap:13px;width:100%;padding:15px 18px;border-radius:var(--radius);
  border:1px solid var(--border);background:var(--card-bg);color:var(--text-body);text-align:left;margin-bottom:10px;transition:all var(--ease)}
.tut-item:hover{border-color:var(--border-strong);transform:translateX(3px)}
.tut-item .tt{flex:1}
.tut-item .tt .t{font-weight:600;font-size:.98rem}
.tut-item .tt .m{font-size:.74rem;color:var(--text-muted);margin-top:2px}
.tut-item .arr{color:var(--text-muted);transition:transform var(--ease)}
.tut-item:hover .arr{transform:translateX(3px);color:var(--green)}
.tut-check{width:20px;height:20px;border-radius:6px;border:2px solid var(--border-strong);flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:.7rem;transition:all var(--ease)}
.tut-check.done{background:var(--green);border-color:var(--green);color:#fff}
.badge{display:inline-block;font-size:.66rem;font-weight:700;padding:3px 10px;border-radius:14px;letter-spacing:.03em}
.badge.pri{background:rgba(255,66,0,.14);color:var(--orange)}
.badge.adv{background:rgba(252,204,9,.16);color:#c9a305}

/* ---------- Tutorial page ---------- */
.tut-back{display:inline-flex;align-items:center;gap:6px;color:var(--text-dim);font-size:.85rem;font-weight:600;margin-bottom:18px}
.tut-back:hover{color:var(--green)}
.tut-title{font-family:var(--font-display);font-size:1.6rem;font-weight:800;color:var(--text);margin-bottom:4px}
.tut-meta{display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin:8px 0 20px;font-size:.8rem;color:var(--text-dim)}
.tut-meta .pill{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:14px;border:1px solid var(--border);font-weight:600}
.tut-intro{background:var(--card-bg);border:1px solid var(--border);border-radius:var(--radius);padding:18px 20px;margin-bottom:24px;font-size:.95rem}
.video-wrap{position:relative;width:100%;aspect-ratio:16/9;border-radius:var(--radius);overflow:hidden;border:1px solid var(--border);background:#000;margin-bottom:26px}
.video-wrap iframe{position:absolute;inset:0;width:100%;height:100%}
.video-fallback{display:none;position:absolute;inset:0;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:#0d0d0d;color:#eee;text-align:center;padding:20px}
.video-fallback a{color:var(--green);font-weight:700}

/* ---------- Steps ---------- */
.step{display:flex;gap:16px;padding:20px 0;border-bottom:1px solid var(--border)}
.step:last-child{border-bottom:none}
.step-num{flex-shrink:0;width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--green),var(--blue));
  color:#fff;font-family:var(--font-display);font-weight:800;display:flex;align-items:center;justify-content:center;font-size:1rem;box-shadow:0 4px 12px rgba(32,193,98,.35)}
.step-body{flex:1;min-width:0}
.step-text{font-size:.95rem;margin-bottom:12px}
.step-text strong{color:var(--text)}
.mockup{border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;background:#fafafa;margin-bottom:4px}
.mockup svg{display:block;width:100%;height:auto}
.mockup-cap{font-size:.72rem;color:var(--text-muted);margin-top:6px;display:flex;align-items:center;gap:6px}
.mockup-cap .pulse-dot{width:8px;height:8px;border-radius:50%;background:var(--orange);animation:pulse 1.2s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}

/* ---------- Checklists ---------- */
.checklist{margin-top:26px;padding:20px;border:1px solid var(--border);border-radius:var(--radius);background:var(--card-bg)}
.checklist-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}
.checklist-head h3{font-family:var(--font-display);font-weight:700;font-size:1.05rem;color:var(--text)}
.cl-progress{font-size:.76rem;color:var(--text-dim);font-weight:600}
.cl-item{display:flex;align-items:flex-start;gap:12px;padding:9px 0}
.cl-item label{display:flex;align-items:flex-start;gap:12px;flex:1;cursor:pointer;font-size:.9rem}
.cl-item input{width:19px;height:19px;margin-top:2px;accent-color:var(--green);cursor:pointer}
.cl-item .cl-t{flex:1}
.cl-item.done .cl-t{text-decoration:line-through;color:var(--text-muted)}
.btn-reset{font-size:.72rem;color:var(--text-muted);border:1px solid var(--border);padding:5px 12px;border-radius:12px;font-weight:600;transition:all var(--ease)}
.btn-reset:hover{color:var(--orange);border-color:var(--orange)}

/* ---------- FAQ / Glossary ---------- */
.acc{border:1px solid var(--border);border-radius:var(--radius-sm);margin-bottom:10px;overflow:hidden;background:var(--card-bg)}
.acc-head{width:100%;display:flex;justify-content:space-between;align-items:center;gap:12px;padding:15px 18px;font-weight:600;color:var(--text);text-align:left;font-size:.93rem}
.acc-head .acc-ic{transition:transform var(--ease);color:var(--green);flex-shrink:0}
.acc.open .acc-head .acc-ic{transform:rotate(45deg)}
.acc-body{display:none;padding:0 18px 16px;color:var(--text-dim);font-size:.9rem}
.acc.open .acc-body{display:block}
.gloss-item{padding:13px 0;border-bottom:1px solid var(--border)}
.gloss-item .g-t{font-weight:700;color:var(--text);font-size:.95rem}
.gloss-item .g-d{color:var(--text-dim);font-size:.88rem;margin-top:3px}
.gloss-term{border-bottom:1px dashed var(--text-muted);cursor:help;color:var(--text);font-weight:500}
.tooltip{position:relative}
.tooltip .tt-bubble{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%) scale(.95);min-width:200px;max-width:280px;
  padding:10px 14px;border-radius:10px;background:var(--bg-alt);border:1px solid var(--border-strong);color:var(--text-body);
  font-size:.8rem;font-weight:400;line-height:1.45;opacity:0;pointer-events:none;transition:all var(--ease);box-shadow:var(--shadow);z-index:60;text-align:left}
.tooltip:hover .tt-bubble,.tooltip:focus-visible .tt-bubble{opacity:1;transform:translateX(-50%) scale(1)}
.tooltip .tt-bubble .tt-t{display:block;font-weight:700;color:var(--green);margin-bottom:3px}

/* ---------- Achievements / toast ---------- */
.logros-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px;margin-top:16px}
.logro{padding:16px;border-radius:var(--radius);border:1px solid var(--border);background:var(--card-bg);text-align:center}
.logro .li{font-size:1.7rem}
.logro .lt{font-weight:600;font-size:.82rem;color:var(--text-dim);margin-top:6px}
.logro.unlocked{border-color:rgba(32,193,98,.4);background:rgba(32,193,98,.06)}
.logro.unlocked .lt{color:var(--green);font-weight:700}
.logro.locked{opacity:.45;filter:grayscale(1)}
#toast{position:fixed;bottom:90px;left:50%;transform:translateX(-50%) translateY(20px);z-index:100;
  background:var(--bg-alt);border:1px solid rgba(32,193,98,.4);color:var(--text);padding:14px 22px;border-radius:14px;
  box-shadow:var(--shadow);display:flex;align-items:center;gap:12px;font-weight:600;font-size:.9rem;opacity:0;pointer-events:none;transition:all var(--ease)}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ---------- Floating WhatsApp ---------- */
.fab{position:fixed;bottom:24px;right:24px;z-index:90;display:flex;align-items:center;gap:10px;padding:14px 20px;border-radius:30px;
  background:#25D366;color:#fff;font-weight:700;font-size:.9rem;box-shadow:0 8px 30px rgba(37,211,102,.45);transition:transform var(--ease)}
.fab:hover{transform:translateY(-2px) scale(1.02)}
.fab .fab-ic{font-size:1.2rem}

/* ---------- Copy-link toast ---------- */
.copy-btn{display:inline-flex;align-items:center;gap:7px;font-size:.76rem;font-weight:700;color:var(--text-dim);border:1px solid var(--border);padding:6px 13px;border-radius:12px;transition:all var(--ease)}
.copy-btn:hover{color:var(--blue);border-color:var(--blue)}
.back-to-top{position:fixed;bottom:24px;left:24px;z-index:90;width:44px;height:44px;border-radius:50%;border:1px solid var(--border);
  background:var(--bg-alt);color:var(--text-dim);font-size:1.1rem;display:none;align-items:center;justify-content:center;box-shadow:var(--shadow)}
.back-to-top.show{display:flex}

/* ---------- Quick mode ---------- */
.quick-mode .tut-intro,.quick-mode .video-wrap,.quick-mode .tut-meta .pill.video-pill{display:none!important}

/* ---------- Misc ---------- */
h3.blk{font-family:var(--font-display);font-weight:700;font-size:1.15rem;color:var(--text);margin:30px 0 10px}
.small{font-size:.78rem;color:var(--text-muted)}
.access-card{padding:18px;border:1px solid var(--border);border-radius:var(--radius);background:var(--card-bg);margin:14px 0;display:flex;flex-wrap:wrap;gap:16px;align-items:center}
.access-card .a-url{flex:1;min-width:200px}
.access-card .a-url code{display:block;font-size:.85rem;color:var(--green);background:rgba(32,193,98,.08);padding:8px 12px;border-radius:8px;margin-top:4px;word-break:break-all}
.a-btn{display:inline-flex;align-items:center;gap:7px;background:var(--green);color:#fff;font-weight:700;padding:11px 20px;border-radius:12px;font-size:.9rem;transition:transform var(--ease)}
.a-btn:hover{transform:translateY(-1px)}
.note{border-left:3px solid var(--yellow);background:rgba(252,204,9,.07);padding:12px 16px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;font-size:.88rem;margin:16px 0;color:var(--text-dim)}
.footer{text-align:center;padding:26px 0 10px;color:var(--text-muted);font-size:.75rem;border-top:1px solid var(--border);margin-top:40px}
</style>
</head>
<body data-theme="dark">
<div id="app">
  <header class="topbar">
    <a href="#/" class="logo">
      <svg viewBox="0 0 1080 1080"><path fill="#20C162" d="M727.95,261.22c38.22,37.59,47.63,78.95,27.27,119.9c-28.11,56.55-102.53,71.83-149.14,29.11c-52.98-48.57-113.07-70.55-184.47-54.44c-75.58,17.05-133.96,82.11-143.87,158.99c-10.45,81.13,29.39,157.17,102.09,194.83c69.59,36.05,154.5,24.82,212.49-27.46c10.52-9.49,21.94-18.75,34.47-25.1c42.02-21.32,94.04-7.92,120.99,29.82c27.2,38.1,23.22,89.89-9.59,124.52C624.9,930.94,430.24,959.02,281.76,877.21C55.66,752.65,13.75,445.18,198.24,264.56C343.14,122.7,585.55,121.17,727.95,261.22z"/><path fill="#FCCC09" d="M1008.8,543.49c-1.57,66.87-57.21,120.76-124.09,120.31c-36.05-0.24-68.43-15.96-90.82-40.84c-26.2-29.11-63.92-45.17-103.09-45.17h-7.07c-39.17,0-76.89,16.07-103.09,45.18c-22.39,24.88-54.78,40.6-90.84,40.83c-66.88,0.44-122.52-53.45-124.09-120.32c-1.63-69.44,54.19-126.24,123.26-126.24c33.76,0,64.35,13.57,86.61,35.55c26.68,26.35,62.28,41.71,99.78,41.71h23.8c37.49,0,73.09-15.36,99.77-41.7c22.27-21.98,52.86-35.56,86.63-35.56C954.64,417.25,1010.43,474.05,1008.8,543.49z"/></svg>
      <span>coordenadas.co · <span data-i18n="topbar.brand">Guía de tu Tienda</span></span>
    </a>
    <div class="spacer"></div>
    <button class="tb-btn" id="btn-lang" title="Change language / Cambiar idioma"><span class="lang-ic">🌐</span> <span id="lang-label">ES / EN</span></button>
    <button class="tb-btn" id="btn-theme" title="Theme"><span id="theme-ic">🌙</span></button>
    <button class="tb-btn" id="btn-quick" title="Modo rápido / Quick mode"><span>⚡</span> <span id="quick-label">Modo rápido</span></button>
  </header>

  <div class="layout">
    <aside class="sidebar" id="sidebar"></aside>
    <main class="main" id="main"></main>
  </div>

  <footer class="footer">
    <span data-i18n="footer.made">Hecho con</span> <span style="color:var(--orange)">♥</span> <span data-i18n="footer.by">por Coordenadas.co</span> ·
    <span data-i18n="footer.shop">Guía de autogestión de tu tienda online</span>
  </footer>
</div>

<button class="fab" id="fab-help"><span class="fab-ic">💬</span> <span data-i18n="fab.help">Necesito ayuda</span></button>
<button class="back-to-top" id="btn-top" aria-label="Volver arriba">↑</button>
<div id="toast"></div>

<script id="hub-config"></script>
<script id="hub-data"></script>
<script id="hub-engine"></script>
</body>
</html>
```

- [ ] **Step 2: Sanity check the scaffold**

Run:
```
Get-Content "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" | Select-String -Pattern 'id="hub-config"','id="hub-data"','id="hub-engine"','data-theme="dark"'
```
Expected: 4 matches. The page will render an empty shell (sidebar/main empty) — that's fine until engine is added.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add tutorial data for pagos, clientes, reportes, correos, avanzados"
```

---

### Task 7: DATA — MOCKUPS (SVG del panel) y ZONAS

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-data">`, add `MOCKUPS` and `ZONAS` after the `tutoriales` array closes (before `logros:`).

- [ ] **Step 1: Insert `MOCKUPS` and `ZONAS`**

Insert between the end of `tutoriales` (`],`) and `logros:`:

```html
  /* Plantillas SVG del panel de WooCommerce (ilustrativas, textos neutros).
     Cada plantilla recibe un objeto de zona -> {x,y} en coordenadas del viewBox
     (preset 1000x560). Las zonas se usan para pintar el círculo rojo pulsante. */
  MOCKUPS: {
    "dashboard": { icono: "📊", titulo: "Panel de control", color: "#20C162" },
    "login": { icono: "🔐", titulo: "Iniciar sesión", color: "#01C7FE" },
    "lista-productos": { icono: "📦", titulo: "Productos", color: "#20C162" },
    "editor-producto": { icono: "📝", titulo: "Editar producto", color: "#20C162" },
    "categorias": { icono: "🏷️", titulo: "Categorías de producto", color: "#20C162" },
    "variaciones": { icono: "🎨", titulo: "Variaciones", color: "#20C162" },
    "lista-pedidos": { icono: "🛒", titulo: "Pedidos", color: "#01C7FE" },
    "detalle-pedido": { icono: "🧾", titulo: "Detalle del pedido", color: "#01C7FE" },
    "detalle-producto-resenas": { icono: "⭐", titulo: "Reseñas del producto", color: "#01C7FE" },
    "lista-cupones": { icono: "🎟️", titulo: "Cupones", color: "#FCCC09" },
    "editor-cupon": { icono: "🎟️", titulo: "Editar cupón", color: "#FCCC09" },
    "lista-paginas": { icono: "📄", titulo: "Páginas", color: "#01C7FE" },
    "editor-elementor": { icono: "✏️", titulo: "Editor Elementor", color: "#01C7FE" },
    "menu": { icono: "🧭", titulo: "Menús", color: "#01C7FE" },
    "footer-astra": { icono: "🦶", titulo: "Personalizar (Astra)", color: "#01C7FE" },
    "ajustes-pagos": { icono: "💳", titulo: "Pagos", color: "#FCCC09" },
    "pago-detalle": { icono: "💰", titulo: "Transacción", color: "#FCCC09" },
    "ajustes-impuestos": { icono: "🧾", titulo: "Impuestos", color: "#FCCC09" },
    "ajustes-envio": { icono: "🚚", titulo: "Envío", color: "#FCCC09" },
    "lista-clientes": { icono: "👥", titulo: "Clientes", color: "#01C7FE" },
    "lista-usuarios": { icono: "👤", titulo: "Usuarios", color: "#01C7FE" },
    "editor-usuario": { icono: "👤", titulo: "Añadir usuario", color: "#01C7FE" },
    "reportes": { icono: "📊", titulo: "Analytics", color: "#20C162" },
    "ajustes-correos": { icono: "📧", titulo: "Correos electrónicos", color: "#FCCC09" },
    "ajustes-generales": { icono: "⚙️", titulo: "Ajustes", color: "#FF4200" }
  },

  /* Zonas resaltables por plantilla. Coordenadas {x,y} del viewBox 1000x560.
     r = radio del círculo de resaltado. label = texto corto (ES) debajo. */
  ZONAS: {
    "dashboard": [
      { id: "barra-direccion", x: 500, y: 34, r: 26, label: "Barra del navegador" },
      { id: "panel-bienvenida", x: 560, y: 140, r: 40, label: "Panel de control" },
      { id: "menu-cerrar", x: 96, y: 512, r: 22, label: "Cerrar sesión" }
    ],
    "login": [
      { id: "campo-usuario", x: 500, y: 250, r: 26, label: "Escribe aquí tu usuario o correo" },
      { id: "btn-login", x: 500, y: 330, r: 26, label: "Entrar" },
      { id: "link-perdida", x: 500, y: 378, r: 20, label: "¿Perdiste tu contraseña?" }
    ],
    "lista-productos": [
      { id: "btn-nuevo", x: 862, y: 58, r: 22, label: "Añadir nuevo" },
      { id: "fila-producto", x: 500, y: 200, r: 34, label: "Haz clic en el producto" },
      { id: "acciones-fila", x: 905, y: 200, r: 20, label: "Menú de acciones" }
    ],
    "editor-producto": [
      { id: "campo-titulo", x: 500, y: 88, r: 24, label: "Título del producto" },
      { id: "campo-desc", x: 500, y: 200, r: 36, label: "Descripción" },
      { id: "campo-precio", x: 812, y: 252, r: 22, label: "Precio" },
      { id: "campo-stock", x: 812, y: 320, r: 22, label: "Stock" },
      { id: "select-tipo", x: 810, y: 170, r: 22, label: "Tipo de producto" },
      { id: "img-drop", x: 812, y: 84, r: 30, label: "Imagen del producto" },
      { id: "caja-categorias", x: 812, y: 410, r: 30, label: "Categorías" },
      { id: "campo-buscar-agrupado", x: 500, y: 330, r: 30, label: "Buscar productos" },
      { id: "btn-publicar", x: 918, y: 44, r: 22, label: "Publicar" },
      { id: "btn-actualizar", x: 890, y: 44, r: 22, label: "Actualizar" },
      { id: "select-estado", x: 812, y: 470, r: 22, label: "Estado" }
    ],
    "categorias": [
      { id: "btn-nueva-cat", x: 862, y: 58, r: 22, label: "Añadir nueva categoría" },
      { id: "campo-nombre-cat", x: 300, y: 200, r: 24, label: "Nombre de la categoría" },
      { id: "img-cat", x: 700, y: 200, r: 26, label: "Imagen de la categoría" },
      { id: "btn-actualizar-cat", x: 500, y: 480, r: 22, label: "Actualizar" }
    ],
    "variaciones": [
      { id: "tab-atributos", x: 300, y: 150, r: 20, label: "Pestaña Atributos" },
      { id: "btn-generar-var", x: 700, y: 380, r: 24, label: "Generar variaciones" },
      { id: "btn-var-save", x: 870, y: 44, r: 22, label: "Guardar" }
    ],
    "lista-pedidos": [
      { id: "filtro-estado", x: 360, y: 58, r: 24, label: "Filtros de estado" },
      { id: "fila-pedido", x: 500, y: 220, r: 36, label: "Haz clic en el pedido" }
    ],
    "detalle-pedido": [
      { id: "select-estado", x: 300, y: 90, r: 24, label: "Estado del pedido" },
      { id: "btn-actualizar-pedido", x: 700, y: 90, r: 22, label: "Actualizar" },
      { id: "info-cliente", x: 800, y: 220, r: 40, label: "Datos del cliente" },
      { id: "btn-factura", x: 800, y: 420, r: 24, label: "Factura" },
      { id: "btn-reembolso", x: 700, y: 480, r: 24, label: "Reembolsar" },
      { id: "caja-notas", x: 300, y: 460, r: 34, label: "Notas del pedido" },
      { id: "estado-pago", x: 500, y: 150, r: 22, label: "Estado de pago" }
    ],
    "detalle-producto-resenas": [
      { id: "lista-resenas", x: 400, y: 220, r: 40, label: "Reseñas" },
      { id: "btn-responder", x: 700, y: 220, r: 22, label: "Responder" }
    ],
    "lista-cupones": [
      { id: "btn-nuevo-cupon", x: 862, y: 58, r: 22, label: "Añadir cupón" },
      { id: "fila-cupon", x: 500, y: 220, r: 36, label: "Abre el cupón" }
    ],
    "editor-cupon": [
      { id: "campo-codigo", x: 500, y: 100, r: 24, label: "Código del cupón" },
      { id: "campo-descuento", x: 810, y: 220, r: 22, label: "Tipo y valor" },
      { id: "tipo-envio-gratis", x: 810, y: 300, r: 22, label: "Permitir envío gratis" },
      { id: "campo-fechas", x: 810, y: 380, r: 24, label: "Fechas del cupón" },
      { id: "tab-restricciones", x: 400, y: 170, r: 20, label: "Pestaña Restricciones" },
      { id: "campo-minimo", x: 810, y: 430, r: 22, label: "Monto mínimo" },
      { id: "campo-limite", x: 810, y: 480, r: 22, label: "Límite de uso" },
      { id: "btn-publicar", x: 918, y: 44, r: 22, label: "Publicar" }
    ],
    "lista-paginas": [
      { id: "fila-pagina", x: 500, y: 180, r: 32, label: "Abre la página" },
      { id: "btn-elementor", x: 800, y: 180, r: 22, label: "Editar con Elementor" },
      { id: "btn-nueva-pagina", x: 862, y: 58, r: 22, label: "Añadir nueva" }
    ],
    "editor-elementor": [
      { id: "texto-editable", x: 470, y: 250, r: 34, label: "Haz clic en el texto" },
      { id: "seccion-banner", x: 470, y: 120, r: 50, label: "Sección del banner" },
      { id: "panel-elementor", x: 90, y: 300, r: 40, label: "Panel de Elementor" },
      { id: "btn-elementor-update", x: 820, y: 40, r: 24, label: "Actualizar" }
    ],
    "menu": [
      { id: "lista-paginas-disponibles", x: 250, y: 220, r: 34, label: "Páginas disponibles" },
      { id: "item-menu", x: 700, y: 220, r: 36, label: "Elementos del menú" },
      { id: "btn-guardar-menu", x: 870, y: 60, r: 22, label: "Guardar menú" }
    ],
    "footer-astra": [
      { id: "seccion-footer", x: 500, y: 480, r: 50, label: "Footer (pie de página)" },
      { id: "btn-publicar", x: 920, y: 40, r: 24, label: "Publicar" }
    ],
    "ajustes-pagos": [
      { id: "fila-paypal", x: 400, y: 180, r: 30, label: "PayPal" },
      { id: "fila-stripe", x: 400, y: 260, r: 30, label: "Stripe" },
      { id: "btn-conectar", x: 810, y: 180, r: 22, label: "Conectar / Configurar" },
      { id: "btn-guardar-pagos", x: 500, y: 500, r: 24, label: "Guardar cambios" }
    ],
    "pago-detalle": [
      { id: "buscar-pago", x: 700, y: 60, r: 22, label: "Buscar transacción" },
      { id: "saldo-retiro", x: 500, y: 300, r: 40, label: "Saldo / Payouts" }
    ],
    "ajustes-impuestos": [
      { id: "btn-calcular-impuestos", x: 500, y: 140, r: 24, label: "Activar impuestos" },
      { id: "fila-tasa", x: 400, y: 320, r: 26, label: "Tasa de impuesto" },
      { id: "btn-guardar-impuestos", x: 500, y: 500, r: 24, label: "Guardar cambios" },
      { id: "pestaña-impuestos", x: 300, y: 100, r: 20, label: "Pestaña Impuestos" }
    ],
    "ajustes-envio": [
      { id: "zona-envio", x: 400, y: 180, r: 30, label: "Zona de envío" },
      { id: "btn-add-zona", x: 810, y: 60, r: 22, label: "Añadir zona de envío" },
      { id: "btn-add-metodo", x: 700, y: 320, r: 24, label: "Añadir método de envío" },
      { id: "campo-tarifa", x: 500, y: 400, r: 24, label: "Costo" },
      { id: "campo-titulo-metodo", x: 500, y: 360, r: 24, label: "Título del método" },
      { id: "campo-minimo-envio", x: 500, y: 420, r: 24, label: "Monto mínimo" },
      { id: "btn-guardar-envio", x: 500, y: 500, r: 24, label: "Guardar cambios" }
    ],
    "lista-clientes": [
      { id: "campo-buscar", x: 500, y: 60, r: 24, label: "Buscar cliente" },
      { id: "fila-cliente", x: 500, y: 200, r: 36, label: "Abre el cliente" }
    ],
    "lista-usuarios": [
      { id: "btn-nuevo-usuario", x: 862, y: 58, r: 22, label: "Añadir nuevo" }
    ],
    "editor-usuario": [
      { id: "campo-usuario-nuevo", x: 500, y: 140, r: 24, label: "Nombre de usuario" },
      { id: "select-rol", x: 500, y: 280, r: 24, label: "Rol" },
      { id: "btn-add-usuario", x: 500, y: 360, r: 22, label: "Añadir nuevo usuario" }
    ],
    "reportes": [
      { id: "kpi-ingresos", x: 200, y: 180, r: 40, label: "Ingresos" },
      { id: "kpi-pedidos", x: 430, y: 180, r: 40, label: "Pedidos" },
      { id: "rango-fechas", x: 810, y: 60, r: 24, label: "Rango de fechas" },
      { id: "tabla-top", x: 500, y: 380, r: 50, label: "Top de productos" }
    ],
    "ajustes-correos": [
      { id: "lista-correos", x: 400, y: 240, r: 44, label: "Lista de correos" },
      { id: "editar-correo", x: 400, y: 200, r: 30, label: "Editar este correo" },
      { id: "btn-guardar-correos", x: 500, y: 500, r: 24, label: "Guardar cambios" }
    ],
    "ajustes-generales": [
      { id: "pestaña-productos", x: 300, y: 120, r: 22, label: "Pestaña Productos" },
      { id: "pestaña-checkout", x: 420, y: 120, r: 22, label: "Pestaña Finalizar compra" },
      { id: "pestaña-cuentas", x: 520, y: 120, r: 22, label: "Pestaña Cuentas" },
      { id: "btn-guardar-gen", x: 500, y: 500, r: 24, label: "Guardar cambios" }
    ]
  },
```

- [ ] **Step 2: Verify data integrity with a quick grep**

Run:
```
Select-String -Path "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" -Pattern '"MOCKUPS"','"ZONAS"','btn-publicar","editor-producto"' | Measure-Object
```
Expected: count >= 3.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add SVG mockup templates and highlight zones"
```

---

### Task 8: ENGINE — núcleo (estado, i18n, tema, helpers, router)

**Files:**
- Modify: `hub-woo.html` — insert into `<script id="hub-engine">`

- [ ] **Step 1: Insert engine core**

Replace the empty tag `<script id="hub-engine"></script>` with the core engine (state, persistence wrapper, i18n, theme, escaping, router). Later tasks append functions inside the same IIFE before the `init()` call.

```html
<script id="hub-engine">
(function () {
  "use strict";

  /* ---------- Estado y persistencia ---------- */
  var mem = {};
  var storageOk = true;
  try { localStorage.setItem("__hub_t", "1"); localStorage.removeItem("__hub_t"); }
  catch (e) { storageOk = false; }

  function save(key, val) {
    try { localStorage.setItem(key, val); }
    catch (e) { mem[key] = val; }
  }
  function load(key) {
    try { return localStorage.getItem(key); }
    catch (e) { return mem[key] || null; }
  }

  var lang = load("hub-lang") || CONFIG.defaultLang;
  if (lang !== "es" && lang !== "en") lang = "es";
  var theme = load("hub-theme") || "dark";

  function L(key) {
    return (DATA.I18N[lang] && DATA.I18N[lang][key]) || DATA.I18N.es[key] || key;
  }
  function pick(obj) { return (obj && obj[lang]) ? obj[lang] : (obj ? obj.es : ""); }

  function esc(s) {
    return String(s == null ? "" : s)
      .replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;").replace(/'/g, "&#39;");
  }

  function secById(id) {
    return DATA.secciones.find(function (s) { return s.id === id; });
  }
  function tutById(id) {
    return DATA.tutoriales.find(function (t) { return t.id === id; });
  }
  function tuteosDeSec(secId) {
    return DATA.tutoriales.filter(function (t) { return t.sec === secId; });
  }

  /* ---------- Acceso directo desde la URL (ancla) ---------- */
  // Si la URL trae #/tut/<id> o #/sec/<id>, el router lo atiende. La agencia
  // comparte estos enlaces: hub-woo.html#/tut/crear-producto

  /* ---------- Temas y funciones globales (expuestas) ---------- */
  window.Hub = {
    t: function (id) { return tutById(id); },
    tutUrl: function (id) { return "#/tut/" + encodeURIComponent(id); },
    setLang: function (l) { lang = l; save("hub-lang", l); renderAll(); },
    getLang: function () { return lang; },
    setTheme: function (th) { theme = th; document.body.dataset.theme = th; save("hub-theme", th); },
    getTheme: function () { return theme; },
    L: L, pick: pick, esc: esc,
    tutsOf: tuteosDeSec,
    completed: function (tutId) {
      var t = tutById(tutId);
      if (!t || !t.checklist || !t.checklist.length) return false;
      var done = getChecklist(tutId);
      return t.checklist.every(function (c) { return done.indexOf(c.id) >= 0; });
    },
    progress: function () {
      var total = DATA.tutoriales.filter(function (t) { return t.checklist && t.checklist.length; }).length;
      var done = DATA.tutoriales.filter(function (t) { return window.Hub.completed(t.id); }).length;
      return { done: done, total: total, pct: total ? Math.round(done / total * 100) : 0 };
    },
    unlockToast: function (tutId) { maybeAchievement(tutId); }
  };

  function getChecklist(tutId) {
    try { return JSON.parse(load("hub-cl-" + tutId) || "[]") || []; }
    catch (e) { return []; }
  }
  function setChecklistItem(tutId, itemId, on) {
    var list = getChecklist(tutId);
    var idx = list.indexOf(itemId);
    if (on && idx < 0) list.push(itemId);
    if (!on && idx >= 0) list.splice(idx, 1);
    save("hub-cl-" + tutId, JSON.stringify(list));
    afterChecklist(tutId);
  }
  function resetChecklist(tutId) { save("hub-cl-" + tutId, "[]"); afterChecklist(tutId); }

  var toastTimer = null;
  function toast(html) {
    var el = document.getElementById("toast");
    el.innerHTML = html;
    el.classList.add("show");
    clearTimeout(toastTimer);
    toastTimer = setTimeout(function () { el.classList.remove("show"); }, 3200);
  }
  function maybeAchievement(tutId) {
    var l = DATA.logros.filter(function (lg) { return lg.condicion === tutId && !isUnlocked(lg.id); });
    l.forEach(function (lg) { unlock(lg); });
  }
  function isUnlocked(id) {
    return (load("hub-logro-" + id) === "1");
  }
  function unlock(lg) {
    save("hub-logro-" + lg.id, "1");
    toast("<span style='font-size:1.6rem;margin-right:4px'>" + lg.icono + "</span> " +
      esc(L("notif.unlock")) + ": " + esc(pick(lg.titulo)));
    if (typeof renderAll === "function") renderAll();
  }

  function afterChecklist(tutId) {
    window.Hub.completed(tutId);
    maybeAchievement(tutId);
    if (typeof renderAll === "function") renderAll();
  }

  /* ---------- Router ---------- */
  function safeDecode(s) { try { return decodeURIComponent(s); } catch (e) { return s; } }
  function parseHash() {
    var h = location.hash || "#/";
    if (h.indexOf("#/tut/") === 0) return { page: "tut", id: safeDecode(h.slice(6)) };
    if (h.indexOf("#/sec/") === 0) return { page: "sec", id: safeDecode(h.slice(6)) };
    if (h.indexOf("#/faq") === 0) return { page: "faq" };
    if (h.indexOf("#/glosario") === 0) return { page: "glosario" };
    return { page: "home" };
  }

  window.addEventListener("hashchange", function () {
    if (typeof renderAll === "function") renderAll();
  });

  function go(hash) {
    if (location.hash === hash) renderAll();
    else location.hash = hash;
  }

  /* (Los renderizadores y el resto del engine se añaden en las tareas 9-13
     dentro de esta misma IIFE, justo antes del init() final.) */
})();
</script>
```

- [ ] **Step 2: Verify no syntax errors yet**

Run:
```
node --check "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" 2>&1 | Out-Null
```
(Expected: this will fail because hub-woo.html is HTML, not JS. Instead extract the engine and check it.)

Instead run the real check (extract script content and syntax-check with Node):
```powershell
$html = Get-Content -Raw "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html"
$m = [regex]::Match($html, '<script id="hub-engine">(.*?)</script>', 'Singleline')
Set-Content -Path "$env:TEMP\engine.js" -Value $m.Groups[1].Value
node --check "$env:TEMP\engine.js"
```
Expected: no output (no syntax errors). NOTE: `node --check` succeeds only if the snippet parses; the IIFE references undefined functions (renderAll etc.) but that's runtime, not syntax — OK.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add engine core (state, i18n, theme, router)"
```

---

### Task 9: ENGINE — renderizador de mockups SVG

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-engine">`, append inside the IIFE (after the router section, before the closing `})();`).

- [ ] **Step 1: Add the SVG mockup renderer**

Insert before the `})();` that closes the engine IIFE:

```js
  /* ---------- Mockups SVG del panel (ilustrativos) ---------- */
  // Dibuja un panel tipo WordPress/WooCommerce genérico con menú lateral,
  // y sobrepinta los círculos de resaltado de las zonas del paso.
  var MENU_ITEMS = [
    { ic: "🏠", es: "Panel", en: "Dashboard" },
    { ic: "📦", es: "Productos", en: "Products" },
    { ic: "🛒", es: "Pedidos", en: "Orders" },
    { ic: "🎟️", es: "Cupones", en: "Coupons" },
    { ic: "📄", es: "Páginas", en: "Pages" },
    { ic: "👥", es: "Clientes", en: "Customers" },
    { ic: "📊", es: "Reportes", en: "Reports" },
    { ic: "⚙️", es: "Ajustes", en: "Settings" }
  ];

  function svgText(x, y, text, size, fill, weight, anchor) {
    return "<text x='" + x + "' y='" + y + "' font-family='Inter,sans-serif' font-size='" + (size||14) + "' fill='" + (fill||"#1a1a1a") + "' font-weight='" + (weight||400) + "' text-anchor='" + (anchor||"start") + "'>" + esc(text) + "</text>";
  }

  function svgMockup(mockName, resaltarIds) {
    var cfg = DATA.MOCKUPS[mockName] || { titulo: mockName, color: "#20C162" };
    var zones = DATA.ZONAS[mockName] || [];
    var want = (resaltarIds || []).slice();
    var active = zones.filter(function (z) { return want.indexOf(z.id) >= 0; });
    var s = [];
    s.push("<svg viewBox='0 0 1000 560' xmlns='http://www.w3.org/2000/svg' role='img' aria-label='" + esc(cfg.titulo) + "'>");

    /* Fondo del panel */
    s.push("<rect x='0' y='0' width='1000' height='560' fill='#f0f0f1' rx='8'/>");
    /* Barra superior del navegador */
    s.push("<rect x='0' y='0' width='1000' height='34' fill='#e5e5e7'/>");
    s.push("<rect x='14' y='11' width='160' height='12' rx='6' fill='#fff'/>");
    s.push(svgText(500, 22, cfg.titulo, 12, "#666", 600, "middle"));
    s.push("<rect x='932' y='9' width='54' height='16' rx='8' fill='" + cfg.color + "'/>");
    s.push(svgText(959, 21, "Publicar", 11, "#fff", 700, "middle"));

    /* Menú lateral izquierdo */
    s.push("<rect x='0' y='34' width='200' height='526' fill='#1d2327'/>");
    s.push(svgText(22, 70, "📊  WooCommerce", 14, "#fff", 700));
    MENU_ITEMS.forEach(function (m, i) {
      var y = 104 + i * 42;
      s.push("<rect x='10' y='" + (y - 17) + "' width='180' height='34' rx='6' fill='" + (i === 1 ? "rgba(255,255,255,0.12)" : "transparent") + "'/>");
      s.push(svgText(30, y, m.ic + "  " + (lang === "es" ? m.es : m.en), 13, i === 1 ? "#fff" : "#b8c0c8", i === 1 ? 700 : 400));
    });

    /* Área de contenido */
    s.push("<rect x='214' y='50' width='772' height='496' fill='#fff' rx='8'/>");
    s.push(svgText(240, 92, cfg.titulo, 22, "#1a1a1a", 700));
    s.push("<rect x='240' y='104' width='250' height='6' rx='3' fill='" + cfg.color + "'/>");

    /* Fila tipo "tabla" ilustrativa */
    for (var r = 0; r < 5; r++) {
      var y = 150 + r * 56;
      s.push("<rect x='240' y='" + y + "' width='520' height='40' rx='6' fill='" + (r % 2 ? "#f6f7f7" : "#fff") + "' stroke='#e2e4e7'/>");
      s.push("<rect x='252' y='" + (y + 10) + "' width='170' height='10' rx='5' fill='#c9cdd1'/>");
      s.push("<rect x='440' y='" + (y + 10) + "' width='90' height='10' rx='5' fill='#e0e3e6'/>");
      s.push("<rect x='550' y='" + (y + 8) + "' width='60' height='22' rx='11' fill='" + cfg.color + "' opacity='0.28'/>");
      s.push("<rect x='700' y='" + (y + 8) + "' width='40' height='22' rx='6' fill='#d7f0e2'/>");
    }

    /* Zonas resaltadas (círculo rojo pulsante + etiqueta) */
    active.forEach(function (z) {
      s.push("<circle cx='" + z.x + "' cy='" + z.y + "' r='" + z.r + "' fill='none' stroke='#FF4200' stroke-width='4'/>");
      s.push("<circle cx='" + z.x + "' cy='" + z.y + "' r='" + (z.r - 5) + "' fill='rgba(255,66,0,0.25)'/>");
      s.push("<g transform='translate(" + z.x + "," + (z.y + z.r + 26) + ")'>");
      s.push("<rect x='-90' y='-14' width='180' height='24' rx='12' fill='#FF4200'/>");
      s.push(svgText(0, 3, z.label || "Aquí", 12, "#fff", 700, "middle"));
      s.push("</g>");
    });

    s.push("</svg>");
    return s.join("");
  }
```

- [ ] **Step 2: Syntax-check the engine**

Re-run the extraction + `node --check` from Task 8 Step 2. Expected: no output.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add SVG mockup renderer with zone highlights"
```

---

### Task 10: ENGINE — renderizadores de páginas (home, sección, tutorial)

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-engine">`, append inside the IIFE.

- [ ] **Step 1: Add page renderers (home, section, tutorial)**

Insert before the `})();` that closes the engine IIFE (after the mockup renderer):

```js
  /* ---------- Renderizadores de páginas ---------- */
  function renderSidebar(activeTutId, activeSecId) {
    var el = document.getElementById("sidebar");
    var p = window.Hub.progress();
    var h = [];
    h.push("<div class='progress-wrap'>");
    h.push("<div class='progress-bar'><div class='progress-fill' style='width:" + p.pct + "%'></div></div>");
    h.push("<div class='progress-label'>" + esc(L("sidebar.progress")) + " <span class='progress-pct'>" + p.pct + "%</span></div>");
    h.push("</div>");

    h.push("<nav>");
    h.push("<div class='sb-group'><a class='sb-link" + (activeSecId ? "" : " active") + "' href='#/'><span class='ic'>🏠</span> " + esc(L("sidebar.home")) + "</a></div>");

    DATA.secciones.forEach(function (sec) {
      var active = activeSecId === sec.id;
      var n = tuteosDeSec(sec.id).length;
      var cls = "sb-link" + (active ? " active" : "");
      var chip = sec.etiqueta === "top" ? "<span class='badge pri'>TOP</span> " : (sec.etiqueta === "adv" ? "<span class='badge adv'>" + esc(L("adv.title")) + "</span> " : "");
      h.push("<div class='sb-group'><h4>" + sec.icono + " " + esc(pick(sec.titulo)) + "</h4>");
      h.push("<a class='" + cls + "' href='#/sec/" + sec.id + "'><span class='ic'>" + sec.icono + "</span> " + esc(pick(sec.titulo)) + " <span style='margin-left:auto;font-size:.72rem;color:var(--text-muted)'>" + n + "</span></a>");
      h.push("</div>");
    });

    h.push("<div class='sb-group'><a class='sb-link' href='#/faq'><span class='ic'>❓</span> " + esc(L("faq.title")) + "</a></div>");
    h.push("<div class='sb-group'><a class='sb-link' href='#/glosario'><span class='ic'>📖</span> " + esc(L("glossary.title")) + "</a></div>");
    h.push("</nav>");
    el.innerHTML = h.join("");
  }

  function renderHome() {
    var main = document.getElementById("main");
    var h = [];
    h.push("<section class='hero'>");
    h.push("<h1>👋 " + esc(L("hero.title")) + "</h1>");
    h.push("<p class='subtitle'>" + esc(L("hero.subtitle")) + "</p>");
    h.push("<div class='search-box'><span class='s-ic'>🔍</span><input id='search-input' type='search' placeholder='" + esc(L("search.ph")) + "' autocomplete='off'/></div>");
    h.push("<div class='search-results' id='search-results'></div>");
    h.push("</section>");

    h.push("<section style='margin-top:20px'>");
    h.push("<h3 class='blk'>" + esc(L("home.sec")) + "</h3>");
    h.push("<div class='grid'>");

    /* Tarjeta de acceso (Empieza aquí) */
    h.push("<a class='card' href='#/sec/acceso'><span class='chip chip-green'>★ " + esc(L("home.start")) + "</span><div class='ci'>🔑</div><div class='ct'>" + esc(L("home.access")) + "</div><div class='cd'>" + esc(L("home.start.d")) + "</div></a>");

    DATA.secciones.forEach(function (sec) {
      if (sec.id === "acceso") return;
      var n = tuteosDeSec(sec.id).length;
      h.push("<a class='card' href='#/sec/" + sec.id + "'>");
      if (sec.etiqueta === "top") h.push("<span class='chip'>TOP</span>");
      if (sec.etiqueta === "adv") h.push("<span class='chip' style='background:var(--orange);color:#fff'>" + esc(L("adv.title")) + "</span>");
      h.push("<div class='ci'>" + sec.icono + "</div><div class='ct'>" + esc(pick(sec.titulo)) + "</div><div class='cd'>" + n + " " + esc(L("tut.steps").toLowerCase()) + "</div>");
      h.push("</a>");
    });
    h.push("</div></section>");

    h.push("<section><h3 class='blk'>🏆 " + esc(L("sidebar.achieve")) + "</h3><div class='logros-grid' id='logros-grid'></div></section>");
    main.innerHTML = h.join("");
    renderLogros();
    bindSearch();
  }

  function renderLogros() {
    var grid = document.getElementById("logros-grid");
    if (!grid) return;
    var h = [];
    DATA.logros.forEach(function (lg) {
      var ok = isUnlocked(lg.id);
      h.push("<div class='logro " + (ok ? "unlocked" : "locked") + "'><div class='li'>" + lg.icono + "</div><div class='lt'>" + esc(pick(lg.titulo)) + "</div></div>");
    });
    grid.innerHTML = h.join("");
  }

  function renderSection(secId) {
    var sec = secById(secId);
    var main = document.getElementById("main");
    if (!sec) { location.hash = "#/"; return; }
    var h = [];
    h.push("<a class='tut-back' href='#/'>" + esc(L("tut.back")) + "</a>");
    h.push("<div class='section-head'><span class='big-ic'>" + sec.icono + "</span><h2>" + esc(pick(sec.titulo)) + "</h2></div>");
    if (sec.etiqueta === "adv") h.push("<p class='section-desc'>" + esc(L("adv.desc")) + "</p>");
    else h.push("<p class='section-desc'>" + esc(L("hero.subtitle")) + "</p>");

    tuteosDeSec(secId).forEach(function (t) {
      var done = window.Hub.completed(t.id);
      var meta = pick(t.duracion);
      var vid = t.video ? " · 🎬" : "";
      h.push("<button class='tut-item' data-tut='" + t.id + "' onclick='location.hash=\"" + window.Hub.tutUrl(t.id) + "\"'>");
      h.push("<span class='tut-check" + (done ? " done" : "") + "'>" + (done ? "✓" : "") + "</span>");
      h.push("<span class='tt'><span class='t'>" + esc(pick(t.titulo)) + "</span><span class='m'>" + esc(meta) + vid + "</span></span>");
      h.push("<span class='arr'>→</span>");
      h.push("</button>");
    });
    main.innerHTML = h.join("");
  }

  function renderTutorial(tutId) {
    var t = tutById(tutId);
    var main = document.getElementById("main");
    if (!t) { location.hash = "#/"; return; }
    var sec = secById(t.sec);
    var h = [];
    h.push("<a class='tut-back' href='#/sec/" + t.sec + "'>" + esc(L("tut.back")) + " · " + esc(pick(sec.titulo)) + "</a>");
    h.push("<div style='display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap'>");
    h.push("<div><div class='tut-title'>" + esc(pick(t.titulo)) + "</div>");
    h.push("<div class='tut-meta'><span class='pill'>⏱ " + esc(L("tut.duration")) + ": " + esc(pick(t.duracion)) + "</span>");
    if (t.video) h.push("<span class='pill video-pill'>🎬 " + esc(L("tut.video")) + "</span>");
    h.push("</div></div>");
    h.push("<button class='copy-btn' onclick='HubCopy(\"" + t.id + "\")'>🔗 " + esc(L("tut.copy")) + "</button>");
    h.push("</div>");

    h.push("<div class='tut-intro'>" + esc(pick(t.intro)) + "</div>");

    if (t.video) {
      var vkeys = CONFIG.videos[t.video];
      var vlist = (Array.isArray(vkeys) ? vkeys : [vkeys]);
      var fallbackUrl = "https://www.youtube.com/watch?v=" + vlist[0];
      h.push("<div class='video-wrap'><div class='video-fallback' id='vf-" + t.id + "'><span style='font-size:1.6rem'>🎬</span><span>" + esc(L("notif.title")) + "</span><a target='_blank' rel='noopener' href='" + fallbackUrl + "'>" + esc(L("tut.watch")) + "</a></div></div>");
    }

    h.push("<h3 class='blk'>" + esc(L("tut.steps")) + "</h3>");
    t.pasos.forEach(function (p, i) {
      h.push("<div class='step'><div class='step-num'>" + (i + 1) + "</div><div class='step-body'>");
      h.push("<div class='step-text'>" + esc(pick(p.texto)) + "</div>");
      h.push("<div class='mockup'>" + svgMockup(p.mockup, p.resaltar) + "</div>");
      h.push("<div class='mockup-cap'><span class='pulse-dot'></span> " + esc(L("tut.clickHere")) + "</div>");
      h.push("</div></div>");
    });

    if (t.checklist && t.checklist.length) {
      renderChecklist(h, t);
    }

    h.push("<div style='margin-top:34px;padding:20px;border:1px dashed var(--border-strong);border-radius:var(--radius);text-align:center'>");
    h.push("<strong>" + esc(L("help.still")) + "</strong><br><span class='small'>" + esc(L("help.text")) + "</span><br><br>");
    h.push("<a class='a-btn' target='_blank' rel='noopener' href='" + waHref(t) + "'>💬 " + esc(L("fab.help")) + "</a>");
    h.push("</div>");

    main.innerHTML = h.join("");
    bindVideo(t.id, t.video);
    bindChecklist(t.id);
  }

  function waHref(t) {
    var base = "https://wa.me/" + CONFIG.whatsappNumber + "?text=";
    var msg = L("msg.help") + ": " + pick(t.titulo) + " · " + location.href.split("#")[0] + "#/tut/" + t.id;
    return base + encodeURIComponent(msg);
  }

  function renderAll() {
    if (storageOk === false && !document.getElementById("storage-note")) {
      var note = document.createElement("div");
      note.id = "storage-note";
      note.className = "note";
      note.textContent = L("notif.storage");
      document.getElementById("app").appendChild(note);
    }
    var r = parseHash();
    var activeTut = (r.page === "tut") ? r.id : null;
    var activeSec = (r.page === "sec") ? r.id : (activeTut ? (tutById(activeTut) || {}).sec : null);
    renderSidebar(activeTut, activeSec);
    if (r.page === "tut") renderTutorial(r.id);
    else if (r.page === "sec") renderSection(r.id);
    else if (r.page === "faq") renderFaq();
    else if (r.page === "glosario") renderGlosario();
    else renderHome();
    applyLang();
    window.scrollTo(0, 0);
  }
```

- [ ] **Step 2: Syntax-check the engine**

Re-run the extraction + `node --check` from Task 8 Step 2. Expected: no output.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add page renderers (home, section, tutorial) and sidebar"
```

---

### Task 11: ENGINE — buscador, checklists, video, FAQ, glosario, toggles, init

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-engine">`, append inside the IIFE (these complete the functions referenced by earlier tasks: `bindSearch`, `renderChecklist`, `bindChecklist`, `bindVideo`, `renderFaq`, `renderGlosario`, `applyLang`, `init`, `HubCopy`).

- [ ] **Step 1: Add search + checklists + video + FAQ + glossary + toggles + init**

Insert before the `})();` that closes the engine IIFE:

```js
  /* ---------- Buscador ---------- */
  function bindSearch() {
    var input = document.getElementById("search-input");
    var results = document.getElementById("search-results");
    if (!input) return;
    input.addEventListener("input", function () {
      var q = input.value.trim().toLowerCase();
      if (q.length < 2) { results.innerHTML = ""; return; }
      var found = [];
      DATA.tutoriales.forEach(function (t) {
        var hay = [pick(t.titulo), pick(t.intro), t.keywords.join(" ")].join(" ").toLowerCase();
        t.pasos.forEach(function (p) { hay += " " + pick(p.texto).toLowerCase(); });
        if (hay.indexOf(q) >= 0) found.push(t);
      });
      if (!found.length) {
        var wa = "https://wa.me/" + CONFIG.whatsappNumber + "?text=" + encodeURIComponent(L("search.empty") + " · \"" + q + "\"");
        results.innerHTML = "<div class='sr-empty'>" + esc(L("search.empty")) + "<br><br><a class='a-btn' target='_blank' rel='noopener' href='" + wa + "'>💬 WhatsApp</a></div>";
        return;
      }
      var h = [];
      found.slice(0, 8).forEach(function (t) {
        var sec = secById(t.sec);
        h.push("<a class='sr-item' href='" + window.Hub.tutUrl(t.id) + "'><span class='sr-sec'>" + sec.icono + " " + esc(pick(sec.titulo)) + "</span><span class='sr-t'>" + esc(pick(t.titulo)) + "</span></a>");
      });
      results.innerHTML = h.join("");
    });
  }

  /* ---------- Checklists ---------- */
  function renderChecklist(h, t) {
    var done = getChecklist(t.id);
    h.push("<div class='checklist' id='cl-" + t.id + "'>");
    h.push("<div class='checklist-head'><h3>✅ " + esc(L("tut.checklist")) + "</h3><div style='display:flex;align-items:center;gap:12px'>");
    h.push("<span class='cl-progress'>" + done.length + "/" + t.checklist.length + "</span>");
    h.push("<button class='btn-reset' onclick='HubReset(\"" + t.id + "\")'>↺ " + esc(L("tut.reset")) + "</button></div></div>");
    t.checklist.forEach(function (c) {
      var is = done.indexOf(c.id) >= 0;
      h.push("<div class='cl-item" + (is ? " done" : "") + "'><label><input type='checkbox' data-tut='" + t.id + "' data-item='" + c.id + "' " + (is ? "checked" : "") + "/><span class='cl-t'>" + esc(pick(c.texto)) + "</span></label></div>");
    });
    h.push("</div>");
  }

  function bindChecklist(tutId) {
    var box = document.getElementById("cl-" + tutId);
    if (!box) return;
    box.querySelectorAll("input[type=checkbox]").forEach(function (cb) {
      cb.addEventListener("change", function () {
        setChecklistItem(tutId, cb.dataset.item, cb.checked);
        var done = getChecklist(tutId);
        var total = (tutById(tutId).checklist || []).length;
        var label = box.querySelector(".cl-progress");
        if (label) label.textContent = done.length + "/" + total;
        cb.closest(".cl-item").classList.toggle("done", cb.checked);
      });
    });
  }

  window.HubReset = function (tutId) { resetChecklist(tutId); };

  /* ---------- Videos ---------- */
  function bindVideo(tutId, videoKey) {
    var wrap = document.querySelector(".video-wrap");
    if (!videoKey || !wrap) return;
    var keys = CONFIG.videos[videoKey];
    if (!keys) return;
    var list = (Array.isArray(keys) ? keys : [keys]);
    var html = "";
    list.forEach(function (key) {
      html += "<iframe src='https://www.youtube-nocookie.com/embed/" + esc(key) + "?rel=0' title='YouTube video player' frameborder='0' allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture' allowfullscreen loading='lazy'></iframe>";
    });
    var fb = document.getElementById("vf-" + tutId);
    wrap.insertAdjacentHTML("afterbegin", html);
    wrap.querySelectorAll("iframe").forEach(function (f) {
      f.addEventListener("error", function () { if (fb) fb.style.display = "flex"; });
    });
  }

  /* ---------- FAQ ---------- */
  function renderFaq() {
    var main = document.getElementById("main");
    var h = [];
    h.push("<a class='tut-back' href='#/'>" + esc(L("tut.back")) + "</a>");
    h.push("<div class='section-head'><span class='big-ic'>❓</span><h2>" + esc(L("faq.title")) + "</h2></div>");
    DATA.faq.forEach(function (f, i) {
      h.push("<div class='acc'><button class='acc-head' data-i='" + i + "'><span>" + esc(pick(f.q)) + "</span><span class='acc-ic'>+</span></button><div class='acc-body'>" + esc(pick(f.a)) + "</div></div>");
    });
    main.innerHTML = h.join("");
    document.querySelectorAll(".acc-head").forEach(function (btn) {
      btn.addEventListener("click", function () {
        var acc = btn.closest(".acc");
        acc.classList.toggle("open");
        var body = acc.querySelector(".acc-body");
        body.style.display = acc.classList.contains("open") ? "block" : "none";
      });
    });
  }

  /* ---------- Glosario ---------- */
  function renderGlosario() {
    var main = document.getElementById("main");
    var h = [];
    h.push("<a class='tut-back' href='#/'>" + esc(L("tut.back")) + "</a>");
    h.push("<div class='section-head'><span class='big-ic'>📖</span><h2>" + esc(L("glossary.title")) + "</h2></div>");
    h.push("<p class='section-desc'>" + esc(L("glossary.d")) + "</p>");
    DATA.glosario.forEach(function (g) {
      h.push("<div class='gloss-item'><div class='g-t'>" + esc(pick(g.termino)) + "</div><div class='g-d'>" + esc(pick(g.def)) + "</div></div>");
    });
    main.innerHTML = h.join("");
  }

  /* ---------- i18n en vivo ---------- */
  function applyLang() {
    document.documentElement.lang = lang;
    document.querySelectorAll("[data-i18n]").forEach(function (el) {
      var k = el.getAttribute("data-i18n");
      if (DATA.I18N[lang] && DATA.I18N[lang][k]) el.textContent = DATA.I18N[lang][k];
    });
    var ql = document.getElementById("quick-label");
    if (ql) ql.textContent = L("topbar.quick");
  }

  /* ---------- Toggles de tema e idioma ---------- */
  function bindToggles() {
    var th = document.getElementById("btn-theme");
    var lg = document.getElementById("btn-lang");
    var qk = document.getElementById("btn-quick");
    if (th) th.addEventListener("click", function () {
      window.Hub.setTheme(theme === "dark" ? "light" : "dark");
      document.getElementById("theme-ic").textContent = theme === "dark" ? "🌙" : "☀️";
    });
    if (lg) lg.addEventListener("click", function () {
      window.Hub.setLang(lang === "es" ? "en" : "es");
      document.getElementById("lang-label").textContent = lang.toUpperCase() + " / " + (lang === "es" ? "EN" : "ES");
      renderAll();
    });
    if (qk) qk.addEventListener("click", function () {
      document.body.classList.toggle("quick-mode");
      qk.classList.toggle("active");
      var ql = document.getElementById("quick-label");
      if (ql) ql.textContent = document.body.classList.contains("quick-mode") ? "⚡ " + L("topbar.quick") + " ✓" : L("topbar.quick");
    });
  }

  /* ---------- Copiar enlace directo ---------- */
  window.HubCopy = function (tutId) {
    var url = location.href.split("#")[0] + "#/tut/" + tutId;
    function done() { toast("✅ " + esc(L("toast.copy"))); }
    if (navigator.clipboard && navigator.clipboard.writeText) {
      navigator.clipboard.writeText(url).then(done, function () { fallbackCopy(url, done); });
    } else fallbackCopy(url, done);
  };
  function fallbackCopy(text, done) {
    var ta = document.createElement("textarea");
    ta.value = text; ta.style.position = "fixed"; ta.style.opacity = "0";
    document.body.appendChild(ta); ta.select();
    try { document.execCommand("copy"); } catch (e) {}
    document.body.removeChild(ta); done();
  }

  /* ---------- Botón flotante (contexto) ---------- */
  function bindFab() {
    var fab = document.getElementById("fab-help");
    if (!fab) return;
    fab.addEventListener("click", function () {
      var r = parseHash();
      var t = (r.page === "tut") ? tutById(r.id) : null;
      var base = "https://wa.me/" + CONFIG.whatsappNumber + "?text=";
      var msg;
      if (t) msg = L("msg.help") + ": " + pick(t.titulo) + " · " + location.href.split("#")[0] + "#/tut/" + t.id;
      else msg = L("msg.help");
      window.open(base + encodeURIComponent(msg), "_blank");
    });
  }

  /* ---------- Volver arriba ---------- */
  function bindTop() {
    var btn = document.getElementById("btn-top");
    window.addEventListener("scroll", function () {
      btn.classList.toggle("show", window.scrollY > 400);
    });
    btn.addEventListener("click", function () { window.scrollTo({ top: 0, behavior: "smooth" }); });
  }

  /* ---------- Init ---------- */
  function init() {
    document.body.dataset.theme = theme;
    document.getElementById("theme-ic").textContent = theme === "dark" ? "🌙" : "☀️";
    document.getElementById("lang-label").textContent = lang.toUpperCase() + " / " + (lang === "es" ? "EN" : "ES");
    bindToggles();
    bindFab();
    bindTop();
    window.Hub.setTheme(theme);
    renderAll();
  }

  window.addEventListener("DOMContentLoaded", init);
  if (document.readyState !== "loading") init();
})();
</script>
```

- [ ] **Step 2: Verify the engine is complete and references resolve**

Run:
```
$html = Get-Content -Raw "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html"
$m = [regex]::Match($html, '<script id="hub-engine">(.*?)</script>', 'Singleline')
Set-Content -Path "$env:TEMP\engine.js" -Value $m.Groups[1].Value
node --check "$env:TEMP\engine.js"
```
Expected: no output.

Then confirm every function referenced in engine exists:
```
Select-String -Path "$env:TEMP\engine.js" -Pattern 'function (init|renderAll|bindSearch|bindChecklist|renderChecklist|bindVideo|renderFaq|renderGlosario|renderSidebar|renderHome|renderSection|renderTutorial|renderLogros|applyLang|bindToggles|bindFab|bindTop)'
```
Expected: 16 matches.

- [ ] **Step 3: Open the file in a browser and smoke-test**

Open `hub-woo.html` in Chrome (double-click). Expected:
- Dark theme, "coordenadas.co · Guía de tu Tienda" in the header
- Sidebar shows progress bar (0%) + sections
- Home shows hero search + "Empieza aquí" card + section cards + achievements row
- Click "Productos y catálogo" → section page with tutorial list
- Click "Agregar un producto nuevo" → tutorial page with steps, mockups (SVG), checklist, WhatsApp help box
- Video block renders a YouTube iframe (may be slow offline; fallback visible only if error)

If anything is broken, fix before committing.

- [ ] **Step 4: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add search, checklists, video, FAQ, glossary, toggles, init"
```

---

### Task 12: Validation script (`validate-hub.js`)

**Files:**
- Create: `C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\validate-hub.js`

- [ ] **Step 1: Create the validation script**

```js
// validate-hub.js
// Verifica la integridad de los datos del hub sin abrir un navegador.
// Uso: node validate-hub.js [ruta-al-hub-woo.html]
const fs = require("fs");
const path = require("path");

const htmlPath = process.argv[2] || path.join(__dirname, "hub-woo.html");
const html = fs.readFileSync(htmlPath, "utf8");

function grab(id) {
  const m = html.match(new RegExp(`<script id="${id}">([\\s\\S]*?)<\\/script>`));
  if (!m) throw new Error(`No se encontró <script id="${id}">`);
  return m[1];
}

// Evalúa CONFIG y DATA en un sandbox y expone las constantes.
const sandbox = {};
const code = grab("hub-config") + "\n;" + grab("hub-data");
try {
  new Function("sandbox", code + "\n; sandbox.CONFIG = CONFIG; sandbox.DATA = DATA; sandbox.I18N = DATA.I18N;")(sandbox);
} catch (e) {
  console.error(`Error al evaluar CONFIG/DATA: ${e.message}`);
  process.exit(1);
}

const CONFIG = sandbox.CONFIG;
const DATA = sandbox.DATA;
let errors = 0;
const fail = (msg) => { errors++; console.error("  ✗ " + msg); };
const ok = (msg) => console.log("  ✓ " + msg);
const requireDataKey = (key) => {
  if (!DATA) {
    console.error("DATA faltante");
    process.exit(1);
  }
  if (!DATA[key]) {
    console.error(`DATA.${key} faltante`);
    process.exit(1);
  }
};

console.log("Validando hub-woo.html…");

// 1. Config básica
console.log("· CONFIG");
["storeUrl", "loginUrl", "whatsappNumber", "email"].forEach((k) => {
  if (!CONFIG[k]) fail(`CONFIG.${k} faltante`);
  else ok(`CONFIG.${k} presente`);
});
if (!/^\d+$/.test(String(CONFIG.whatsappNumber))) fail("whatsappNumber debe ser solo dígitos (con código de país, sin + ni espacios)");
else ok("whatsappNumber es numérico");

// 2. Secciones
console.log("· Secciones");
requireDataKey("secciones");
const secIds = DATA.secciones.map((s) => s.id);
if (new Set(secIds).size !== secIds.length) fail("ids de secciones duplicados");
else ok("ids de secciones únicos");
DATA.secciones.forEach((s) => {
  if (!s.id || !s.titulo || !s.titulo.es || !s.titulo.en) fail(`sección sin campos completos: ${s.id}`);
});
ok(`${DATA.secciones.length} secciones`);

// 3. Tutoriales
console.log("· Tutoriales");
requireDataKey("tutoriales");
requireDataKey("MOCKUPS");
requireDataKey("ZONAS");
const tutIds = DATA.tutoriales.map((t) => t.id);
if (new Set(tutIds).size !== tutIds.length) fail("ids de tutoriales duplicados");
else ok("ids de tutoriales únicos");
DATA.tutoriales.forEach((t) => {
  if (!t.id || !t.sec) fail(`tutorial sin id/sec: ${t.id}`);
  if (!secIds.includes(t.sec)) fail(`tutorial ${t.id} referencia sección inexistente: ${t.sec}`);
  if (!t.titulo || !t.titulo.es || !t.titulo.en) fail(`tutorial ${t.id} sin título bilingüe`);
  if (!t.intro || !t.intro.es || !t.intro.en) fail(`tutorial ${t.id} sin intro bilingüe`);
  if (!t.pasos || !t.pasos.length) fail(`tutorial ${t.id} sin pasos`);
  t.pasos.forEach((p, i) => {
    if (!p.texto || !p.texto.es || !p.texto.en) fail(`tutorial ${t.id} paso ${i + 1} sin texto bilingüe`);
    if (!p.mockup) fail(`tutorial ${t.id} paso ${i + 1} sin mockup`);
    else if (!DATA.MOCKUPS[p.mockup]) fail(`tutorial ${t.id} paso ${i + 1} mockup inexistente: ${p.mockup}`);
    if (p.resaltar) p.resaltar.forEach((z) => {
      if (!DATA.ZONAS[p.mockup] || !DATA.ZONAS[p.mockup].find((z2) => z2.id === z)) {
        fail(`tutorial ${t.id} paso ${i + 1} zona inexistente: ${p.mockup}/${z}`);
      }
    });
  });
  if (t.video) {
    if (!(CONFIG.videos || {})[t.video]) fail(`tutorial ${t.id} video sin entrada en CONFIG.videos: ${t.video}`);
  }
  if (t.checklist) {
    const cids = t.checklist.map((c) => c.id);
    if (new Set(cids).size !== cids.length) fail(`tutorial ${t.id} ids de checklist duplicados`);
    t.checklist.forEach((c) => {
      if (!c.id || !c.texto || !c.texto.es || !c.texto.en) fail(`tutorial ${t.id} checklist incompleto`);
    });
  }
});
ok(`${DATA.tutoriales.length} tutoriales`);

// 4. Logros apuntan a tutoriales existentes
console.log("· Logros");
requireDataKey("logros");
DATA.logros.forEach((lg) => {
  if (!tutIds.includes(lg.condicion)) fail(`logro ${lg.id} condicion apunta a tutorial inexistente: ${lg.condicion}`);
});
ok(`${DATA.logros.length} logros`);

// 5. I18N claves idénticas entre es/en
console.log("· I18N");
requireDataKey("I18N");
const esKeys = Object.keys(DATA.I18N.es).sort();
const enKeys = Object.keys(DATA.I18N.en).sort();
if (JSON.stringify(esKeys) !== JSON.stringify(enKeys)) fail("claves I18N difieren entre es y en");
else ok("I18N es/en con mismas claves");

// 6. Videos en CONFIG referenciados (o huérfanos)
console.log("· Videos");
Object.keys(CONFIG.videos || {}).forEach((k) => {
  if (!tutIds.includes(k)) fail(`CONFIG.videos tiene clave sin tutorial: ${k}`);
});
ok(`${Object.keys(CONFIG.videos || {}).length} videos mapeados`);

console.log(errors === 0 ? "\n✅ Hub válido" : `\n❌ ${errors} error(es)`);
process.exit(errors === 0 ? 0 : 1);
```

- [ ] **Step 2: Run the validator**

Run:
```
node validate-hub.js
```
Expected: all checks pass and exit code 0 (last line `✅ Hub válido`).

If failures appear, fix the corresponding data in `hub-woo.html` and re-run until clean.

- [ ] **Step 3: Commit**

```bash
git add validate-hub.js
git commit -m "feat: add data validation script for the hub"
```

---

### Task 13: Final verification (full QA pass)

**Files:** (no changes — verification only)

- [ ] **Step 1: Functional QA in three browsers**

Open `hub-woo.html` in Chrome, Edge, and Firefox. For each, verify:

1. **Theme toggle** (`🌙/☀️`): switches dark↔light, persists after reload.
2. **Language toggle** (`ES/EN`): all labels switch; persists after reload.
3. **Search**: type "cupón" → shows "Crear un cupón"; type "pedido" → shows order tutorials; type "no me llegan los pedidos" → shows related items or the WhatsApp empty state; type gibberish "zzzzz" → empty-state message + WhatsApp button.
4. **Checklists**: open a tutorial, tick 2 boxes, reload page → still checked; progress bar updates.
5. **Reset checklist** button works.
6. **Copy-link** button: copies `...#/tut/<id>`; paste into the address bar → lands on the same tutorial (deep link works).
7. **Floating WhatsApp button**: on a tutorial page, opens `wa.me` with the tutorial title + URL in the message.
8. **Quick mode** (`⚡`): hides intro/video, keeps steps.
9. **Achievements**: complete all steps of "crear-producto" → toast "¡Logro desbloqueado!" + 🏆 lights up in the home achievements grid.
10. **FAQ & Glossary**: accordions expand/collapse; glossary shows all terms.
11. **Videos**: tutorial with a video shows an iframe (offline → fallback "Ver en YouTube").
12. **Mobile**: narrow the window (<900px) — sidebar hides, page still usable; tap targets work.

- [ ] **Step 2: Verify deep links used by the agency**

Run:
```
Select-String -Path "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" -Pattern '#/tut/' | Measure-Object
```
Expected: no matches in the file (hash links are built at runtime via `Hub.tutUrl`), but confirm manually that a URL like `file:///.../hub-woo.html#/tut/crear-producto` opens directly on that tutorial. Also confirm the same works when the file is hosted (test after uploading).

- [ ] **Step 3: Print summary**

Run:
```
node validate-hub.js
Select-String -Path "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" -Pattern '<script id="hub-config"','<script id="hub-data"','<script id="hub-engine"'
(Get-Item "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html").Length
```
Expected: validator passes; three script tags present; file size in a reasonable range (roughly 60–120 KB).

- [ ] **Step 4: Final commit**

```bash
git add hub-woo.html validate-hub.js
git commit -m "feat: complete and verified hub-woo.html deliverable"
```

---

## Self-Review notes

**Spec coverage:**
- All 11 sections + FAQ + glossary → Tasks 3–6 (data) + Task 10 (renderers). ✅
- All 51 tutorials with videos mapped → Tasks 4–6 + CONFIG Task 2. ✅
- Widgets (search, checklists+localStorage, progress+achievements, quick mode, collapsible, glossary tooltips) → Tasks 8–11. ✅
- SVG mockups with highlight zones → Task 7 (data) + Task 9 (renderer). ✅
- ES/EN toggle, dark/light toggle → Task 11 (`applyLang`, `bindToggles`). ✅
- Copy-link + WhatsApp-with-context for the agency → Task 11 (`HubCopy`, `bindFab`). ✅
- Edge cases: storage blocked (`storageOk` note), empty search, video fallback, no-checklist tutorials, `file://` works (no external deps), accessibility basics (focusable buttons, aria-labels on mockups). ✅
- Verification → Tasks 12–13. ✅

**Placeholder scan:** Every code step contains full code; no TBD/TODO. The only intentional "runtime" gaps are functions added in later tasks within the same IIFE — the plan orders them so each task references only functions defined earlier or by the same task. ✅

**Type consistency:** IDs used in `ZONAS` match `resaltar` references in tutorials (verified by `validate-hub.js` in Task 12). Section IDs match `sec` fields. Video keys match `CONFIG.videos`. ✅

---

### Task 6: DATA — tutoriales de Pagos, Clientes, Reportes, Correos y Avanzados

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-data">`, append to the `tutoriales` array (after the `footer-astra` entry).

- [ ] **Step 1: Append tutorials part 3 (pagos + clientes + reportes + correos + avanzados)**

Find the closing of the `footer-astra` entry followed by `]` and `,` (end of tutoriales array). Insert these entries right before that closing `]`:

```html
    /* ---------- 💰 Pagos y facturación ---------- */
    {
      id: "verificar-pago", sec: "pagos",
      titulo: { es: "Verificar que un pago llegó", en: "Verify a payment arrived" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["pago","verificar","llego","confirmar","pago recibido","orden"],
      intro: { es: "Cuando un cliente dice que pagó pero no ves el pedido, verifica en el panel de tu pasarela de pago.", en: "When a customer says they paid but you don't see the order, check your payment gateway's panel." },
      pasos: [
        { texto: { es: "Primero revisa <strong>Pedidos</strong>: si el pedido existe, el pago casi siempre está.", en: "First check <strong>Orders</strong>: if the order exists, the payment is almost always there." }, mockup: "lista-pedidos", resaltar: ["fila-pedido"] },
        { texto: { es: "Abre el pedido y mira el <strong>estado de pago</strong>: 'Procesando' = pagado; 'Pendiente de pago' = no.", en: "Open the order and check the <strong>payment status</strong>: 'Processing' = paid; 'Pending payment' = not." }, mockup: "detalle-pedido", resaltar: ["estado-pago"] },
        { texto: { es: "Si hay duda, entra a tu pasarela (PayPal o Stripe) y busca la transacción por el nombre del cliente o el monto.", en: "If in doubt, log into your gateway (PayPal or Stripe) and search the transaction by customer name or amount." }, mockup: "pago-detalle", resaltar: ["buscar-pago"] }
      ],
      checklist: [
        { id: "vp1", texto: { es: "Sé verificar si un pago llegó", en: "I know how to verify a payment arrived" } }
      ]
    },
    {
      id: "conectar-paypal", sec: "pagos",
      titulo: { es: "Conectar PayPal con tu tienda", en: "Connect PayPal to your store" },
      duracion: { es: "3 min", en: "3 min" },
      video: "conectar-paypal",
      keywords: ["paypal","conectar","pago","pasarela","cuenta paypal"],
      intro: { es: "Con PayPal conectado, tus clientes pagan con su cuenta PayPal o tarjeta. El dinero llega a tu cuenta de PayPal.", en: "With PayPal connected, your customers pay with their PayPal account or card. The money goes to your PayPal account." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Pagos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Payments</strong>." }, mockup: "ajustes-pagos", resaltar: ["fila-paypal"] },
        { texto: { es: "Localiza <strong>PayPal</strong> y pulsa <strong>Administrar</strong> (o Configurar).", en: "Find <strong>PayPal</strong> and press <strong>Manage</strong> (or Set up)." }, mockup: "ajustes-pagos", resaltar: ["fila-paypal"] },
        { texto: { es: "Pulsa <strong>Conectar con PayPal</strong> e inicia sesión con tu cuenta. Autoriza la conexión.", en: "Press <strong>Connect with PayPal</strong> and log in with your account. Authorize the connection." }, mockup: "ajustes-pagos", resaltar: ["btn-conectar"] },
        { texto: { es: "Guarda los cambios. Haz una compra de prueba pequeña para confirmar que todo funciona.", en: "Save changes. Do a small test purchase to confirm everything works." }, mockup: "ajustes-pagos", resaltar: ["btn-guardar-pagos"] }
      ],
      checklist: [
        { id: "cp1", texto: { es: "Conecté PayPal", en: "Connected PayPal" } },
        { id: "cp2", texto: { es: "Hice una compra de prueba", en: "Did a test purchase" } }
      ]
    },
    {
      id: "conectar-stripe", sec: "pagos",
      titulo: { es: "Conectar Stripe con tu tienda", en: "Connect Stripe to your store" },
      duracion: { es: "3 min", en: "3 min" },
      video: "conectar-stripe",
      keywords: ["stripe","conectar","tarjeta","pago","pasarela","credito"],
      intro: { es: "Con Stripe, tus clientes pagan con tarjeta de crédito/débito directamente. Los fondos van a tu cuenta bancaria.", en: "With Stripe, your customers pay directly with credit/debit cards. Funds go to your bank account." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Pagos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Payments</strong>." }, mockup: "ajustes-pagos", resaltar: ["fila-stripe"] },
        { texto: { es: "Localiza <strong>Stripe</strong> y pulsa <strong>Configurar</strong>.", en: "Find <strong>Stripe</strong> and press <strong>Set up</strong>." }, mockup: "ajustes-pagos", resaltar: ["fila-stripe"] },
        { texto: { es: "Sigue el asistente: crea o conecta tu cuenta de Stripe y completa tus datos bancarios.", en: "Follow the wizard: create or connect your Stripe account and complete your banking details." }, mockup: "ajustes-pagos", resaltar: ["btn-conectar"] },
        { texto: { es: "Guarda y haz una compra de prueba con tarjeta.", en: "Save and do a test purchase with a card." }, mockup: "ajustes-pagos", resaltar: ["btn-guardar-pagos"] }
      ],
      checklist: [
        { id: "cs1", texto: { es: "Conecté Stripe", en: "Connected Stripe" } },
        { id: "cs2", texto: { es: "Hice una compra de prueba", en: "Did a test purchase" } }
      ]
    },
    {
      id: "configurar-impuestos", sec: "pagos",
      titulo: { es: "Configurar impuestos", en: "Set up taxes" },
      duracion: { es: "3 min", en: "3 min" },
      video: "configurar-impuestos",
      keywords: ["impuesto","impuestos","iva","tax","porcentaje","factura"],
      intro: { es: "Si debes cobrar impuesto (ej. IVA), configúralo para que se sume automáticamente al precio al pagar.", en: "If you must charge tax (e.g. VAT), set it up so it's added automatically at checkout." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Impuestos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Tax</strong>." }, mockup: "ajustes-impuestos", resaltar: ["btn-calcular-impuestos"] },
        { texto: { es: "Marca <strong>Activar impuestos</strong> y elige si los precios ya lo incluyen o no.", en: "Check <strong>Enable taxes</strong> and choose whether prices include it or not." }, mockup: "ajustes-impuestos", resaltar: ["btn-calcular-impuestos"] },
        { texto: { es: "En <strong>Tasas de impuesto estándar</strong> pulsa <strong>Insertar fila</strong>, pon el país y el porcentaje (ej. 13%).", en: "Under <strong>Standard tax rates</strong> press <strong>Insert row</strong>, set the country and percentage (e.g. 13%)." }, mockup: "ajustes-impuestos", resaltar: ["fila-tasa"] },
        { texto: { es: "<strong>Guarda los cambios</strong> y prueba una compra para ver el impuesto aplicado.", en: "<strong>Save changes</strong> and test a purchase to see the tax applied." }, mockup: "ajustes-impuestos", resaltar: ["btn-guardar-impuestos"] }
      ],
      checklist: [
        { id: "ci1", texto: { es: "Activé los impuestos", en: "Enabled taxes" } },
        { id: "ci2", texto: { es: "Configuré mi tasa (país y %)", en: "Set my rate (country and %)" } }
      ]
    },
    {
      id: "donde-cae-dinero", sec: "pagos",
      titulo: { es: "Dónde cae el dinero (retiros)", en: "Where the money goes (payouts)" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["dinero","retiro","transferencia","banco","payout","donde"],
      intro: { es: "Entender a dónde va tu dinero según la pasarela evita confusiones con tus ventas.", en: "Understanding where your money goes per gateway avoids confusion about your sales." },
      pasos: [
        { texto: { es: "<strong>PayPal</strong>: el dinero queda en tu saldo de PayPal. Puedes transferirlo a tu banco desde la app/web de PayPal.", en: "<strong>PayPal</strong>: money stays in your PayPal balance. Transfer it to your bank from the PayPal app/website." }, mockup: "pago-detalle", resaltar: ["saldo-retiro"] },
        { texto: { es: "<strong>Stripe</strong>: los fondos se depositan automáticamente a tu cuenta bancaria cada 1-2 días (según tu configuración).", en: "<strong>Stripe</strong>: funds deposit automatically to your bank account every 1-2 days (depending on your settings)." }, mockup: "pago-detalle", resaltar: ["saldo-retiro"] },
        { texto: { es: "En el panel de la pasarela (sección <strong>Saldo / Payouts</strong>) ves el dinero disponible y el historial de transferencias.", en: "In the gateway's panel (<strong>Balance / Payouts</strong> section) you see available money and transfer history." }, mockup: "pago-detalle", resaltar: ["saldo-retiro"] }
      ],
      checklist: [
        { id: "dd1", texto: { es: "Sé dónde está mi dinero de ventas", en: "I know where my sales money is" } }
      ]
    },
    {
      id: "factura-recibo", sec: "pagos",
      titulo: { es: "Emitir factura o recibo al cliente", en: "Issue an invoice or receipt" },
      duracion: { es: "2 min", en: "2 min" },
      keywords: ["factura","recibo","comprobante","cliente","impuesto","pdf"],
      intro: { es: "Aunque el cliente recibe un correo con su recibo al comprar, a veces pide una factura formal. Se la envías desde el pedido.", en: "Although the customer gets a receipt email on purchase, sometimes they ask for a formal invoice. Send it from the order." },
      pasos: [
        { texto: { es: "Abre el pedido del cliente.", en: "Open the customer's order." }, mockup: "lista-pedidos", resaltar: ["fila-pedido"] },
        { texto: { es: "Busca el enlace/botón <strong>Factura</strong> o el bloque de <strong>Detalles de pago</strong>.", en: "Find the <strong>Invoice</strong> link/button or the <strong>Payment details</strong> block." }, mockup: "detalle-pedido", resaltar: ["btn-factura"] },
        { texto: { es: "Descarga el PDF y envíalo por correo o WhatsApp al cliente.", en: "Download the PDF and send it to the customer by email or WhatsApp." }, mockup: "detalle-pedido", resaltar: ["btn-factura"] }
      ],
      checklist: [
        { id: "fr1", texto: { es: "Envié una factura a un cliente", en: "Sent an invoice to a customer" } }
      ]
    },

    /* ---------- 👥 Clientes y cuentas ---------- */
    {
      id: "lista-clientes", sec: "clientes",
      titulo: { es: "Ver clientes y su historial", en: "View customers and their history" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["cliente","clientes","historial","lista","compras","cuenta"],
      intro: { es: "Cada compra queda asociada a un cliente. Aquí ves quién ha comprado y cuánto.", en: "Each purchase is linked to a customer. Here you see who has bought and how much." },
      pasos: [
        { texto: { es: "Ve a <strong>Usuarios</strong> (o WooCommerce → Clientes).", en: "Go to <strong>Users</strong> (or WooCommerce → Customers)." }, mockup: "lista-clientes", resaltar: ["campo-buscar"] },
        { texto: { es: "Usa el <strong>buscador</strong> para encontrar a un cliente por nombre o correo.", en: "Use the <strong>search</strong> to find a customer by name or email." }, mockup: "lista-clientes", resaltar: ["campo-buscar"] },
        { texto: { es: "Abre su perfil para ver sus pedidos y compras anteriores.", en: "Open their profile to see their orders and past purchases." }, mockup: "lista-clientes", resaltar: ["fila-cliente"] }
      ],
      checklist: [
        { id: "lc1", texto: { es: "Encontré la lista de clientes", en: "Found the customers list" } }
      ]
    },
    {
      id: "responder-resenas", sec: "clientes",
      titulo: { es: "Responder a una reseña", en: "Reply to a review" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["resena","reseñas","comentario","responder","valoracion","producto"],
      intro: { es: "Responder las reseñas de tus productos genera confianza. Es una acción corta y muy valiosa.", en: "Replying to your product reviews builds trust. It's a short, very valuable action." },
      pasos: [
        { texto: { es: "Ve a <strong>Productos</strong> → el producto con reseñas, o a <strong>Comentarios</strong> en el menú.", en: "Go to <strong>Products</strong> → the product with reviews, or <strong>Comments</strong> in the menu." }, mockup: "detalle-producto-resenas", resaltar: ["lista-resenas"] },
        { texto: { es: "Busca la reseña y pulsa <strong>Responder</strong> (o Responder en el comentario).", en: "Find the review and press <strong>Reply</strong> (or Reply on the comment)." }, mockup: "detalle-producto-resenas", resaltar: ["btn-responder"] },
        { texto: { es: "Agradece y resuelve lo que se pueda. Publica tu respuesta.", en: "Thank them and address what you can. Publish your reply." }, mockup: "detalle-producto-resenas", resaltar: ["btn-responder"] }
      ],
      checklist: [
        { id: "rr1", texto: { es: "Respondí a una reseña", en: "Replied to a review" } }
      ]
    },
    {
      id: "roles-usuario", sec: "clientes",
      titulo: { es: "Agregar un empleado (roles)", en: "Add an employee (roles)" },
      duracion: { es: "2 min", en: "2 min" },
      keywords: ["usuario","empleado","rol","agregar","crear cuenta","permisos"],
      intro: { es: "Puedes darle acceso a tu tienda a un empleado sin que pueda tocar la configuración técnica.", en: "You can give an employee store access without letting them touch technical settings." },
      pasos: [
        { texto: { es: "Ve a <strong>Usuarios</strong> → <strong>Añadir nuevo</strong>.", en: "Go to <strong>Users</strong> → <strong>Add New</strong>." }, mockup: "lista-usuarios", resaltar: ["btn-nuevo-usuario"] },
        { texto: { es: "Llena nombre de usuario y correo, y asigna una contraseña.", en: "Fill username and email, and assign a password." }, mockup: "editor-usuario", resaltar: ["campo-usuario-nuevo"] },
        { texto: { es: "En <strong>Rol</strong> elige <strong>Empleado de tienda</strong> (ve pedidos y productos, no ajustes).", en: "Under <strong>Role</strong> pick <strong>Shop manager</strong> (sees orders and products, not settings)." }, mockup: "editor-usuario", resaltar: ["select-rol"] },
        { texto: { es: "Pulsa <strong>Añadir nuevo usuario</strong>. Ese empleado ya puede entrar con su propio acceso.", en: "Press <strong>Add New User</strong>. That employee can now log in with their own access." }, mockup: "editor-usuario", resaltar: ["btn-add-usuario"] }
      ],
      checklist: [
        { id: "ru1", texto: { es: "Agregué un empleado a mi tienda", en: "Added an employee to my store" } }
      ]
    },

    /* ---------- 📊 Reportes y ventas ---------- */
    {
      id: "cuanto-vendi", sec: "reportes",
      titulo: { es: "Ver cuánto vendí", en: "See how much I sold" },
      duracion: { es: "1 min", en: "1 min" },
      video: "cuanto-vendi",
      keywords: ["vendi","ventas","ingresos","reporte","total","dinero","cuanto"],
      intro: { es: "Los reportes de WooCommerce te dicen cuánto has vendido en un período y el estado de tus pedidos.", en: "WooCommerce reports tell you how much you've sold in a period and your order status." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Analytics</strong> → <strong>Ingresos</strong> (o Reportes).", en: "Go to <strong>WooCommerce</strong> → <strong>Analytics</strong> → <strong>Revenue</strong> (or Reports)." }, mockup: "reportes", resaltar: ["kpi-ingresos"] },
        { texto: { es: "Elige el <strong>rango de fechas</strong> (ej. últimos 30 días) arriba a la derecha.", en: "Pick the <strong>date range</strong> (e.g. last 30 days) on the top right." }, mockup: "reportes", resaltar: ["rango-fechas"] },
        { texto: { es: "Lee el <strong>ingreso total</strong> y la <strong>cantidad de pedidos</strong> en las tarjetas principales.", en: "Read the <strong>total revenue</strong> and <strong>order count</strong> on the main cards." }, mockup: "reportes", resaltar: ["kpi-ingresos"] }
      ],
      checklist: [
        { id: "cv1", texto: { es: "Vi mis ventas del último mes", en: "Saw my sales for the last month" } }
      ]
    },
    {
      id: "producto-mas-vendido", sec: "reportes",
      titulo: { es: "Producto más vendido", en: "Best-selling product" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["producto","mas vendido","top","mejor","ranking","reporte"],
      intro: { es: "Saber qué producto vende más te ayuda a promocionar lo correcto y a manejar stock.", en: "Knowing your best-seller helps you promote the right thing and manage stock." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Analytics</strong> → <strong>Productos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Analytics</strong> → <strong>Products</strong>." }, mockup: "reportes", resaltar: ["tabla-top"] },
        { texto: { es: "La lista ordena por <strong>items vendidos</strong>. El primero es tu producto estrella.", en: "The list sorts by <strong>items sold</strong>. The first is your star product." }, mockup: "reportes", resaltar: ["tabla-top"] },
        { texto: { es: "Usa el filtro de fechas para ver el top del mes o del año.", en: "Use the date filter to see the top of the month or year." }, mockup: "reportes", resaltar: ["rango-fechas"] }
      ],
      checklist: [
        { id: "pmv1", texto: { es: "Identifiqué mi producto más vendido", en: "Identified my best-selling product" } }
      ]
    },
    {
      id: "analytics-simple", sec: "reportes",
      titulo: { es: "Entender tus números en simple", en: "Understand your numbers simply" },
      duracion: { es: "2 min", en: "2 min" },
      keywords: ["analytics","numeros","metricas","visitas","entender","reporte"],
      intro: { es: "No necesitas ser experto: estas 4 cifras te dicen la salud de tu tienda.", en: "You don't need to be an expert: these 4 numbers tell you your store's health." },
      pasos: [
        { texto: { es: "<strong>Ingresos</strong>: cuánto dinero entró. Es tu número más importante.", en: "<strong>Revenue</strong>: how much money came in. Your most important number." }, mockup: "reportes", resaltar: ["kpi-ingresos"] },
        { texto: { es: "<strong>Pedidos</strong>: cuántas ventas (pedidos) se hicieron en el período.", en: "<strong>Orders</strong>: how many sales (orders) were made in the period." }, mockup: "reportes", resaltar: ["kpi-pedidos"] },
        { texto: { es: "<strong>Productos vendidos</strong>: cuántas unidades se fueron (te dice qué reponer).", en: "<strong>Items sold</strong>: how many units went out (tells you what to restock)." }, mockup: "reportes", resaltar: ["tabla-top"] },
        { texto: { es: "<strong>Valor medio del pedido</strong>: ingreso ÷ pedidos. Si sube, tus clientes compran más.", en: "<strong>Average order value</strong>: revenue ÷ orders. If it goes up, customers buy more." }, mockup: "reportes", resaltar: ["kpi-pedidos"] }
      ],
      checklist: [
        { id: "as1", texto: { es: "Entiendo mis 4 números clave", en: "I understand my 4 key numbers" } }
      ]
    },

    /* ---------- 📧 Correos de tu tienda ---------- */
    {
      id: "correos-automaticos", sec: "correos",
      titulo: { es: "Qué correos envía tu tienda sola", en: "Emails your store sends automatically" },
      duracion: { es: "2 min", en: "2 min" },
      video: "correos-automaticos",
      keywords: ["correo","correos","email","automatico","pedido nuevo","pago fallido","cuenta nueva"],
      intro: { es: "Tu tienda envía correos solos, sin que hagas nada. Estos son los principales y cómo se activan.", en: "Your store sends emails on its own, without you doing anything. These are the main ones and how they trigger." },
      pasos: [
        { texto: { es: "<strong>Pedido nuevo</strong>: se envía al cliente y a ti cuando alguien compra. Confirma la venta.", en: "<strong>New order</strong>: sent to the customer and to you when someone buys. Confirms the sale." }, mockup: "ajustes-correos", resaltar: ["lista-correos"] },
        { texto: { es: "<strong>Cuenta nueva / Usuario nuevo</strong>: bienvenida cuando alguien crea una cuenta en tu tienda.", en: "<strong>New account / New user</strong>: welcome when someone creates an account on your store." }, mockup: "ajustes-correos", resaltar: ["lista-correos"] },
        { texto: { es: "<strong>Pago fallido</strong>: avisa al cliente cuando su tarjeta no pudo pagar, para que lo intente de nuevo.", en: "<strong>Failed payment</strong>: tells the customer when their card couldn't pay, so they can retry." }, mockup: "ajustes-correos", resaltar: ["lista-correos"] },
        { texto: { es: "<strong>Reembolso / Devolución</strong>: avisa cuando haces un reembolso desde el pedido.", en: "<strong>Refund</strong>: notifies when you issue a refund from the order." }, mockup: "ajustes-correos", resaltar: ["lista-correos"] }
      ],
      checklist: [
        { id: "ca1", texto: { es: "Sé qué correos envía mi tienda sola", en: "I know which emails my store sends automatically" } }
      ]
    },
    {
      id: "configurar-correos", sec: "correos",
      titulo: { es: "Configurar los correos del sitio", en: "Configure site emails" },
      duracion: { es: "3 min", en: "3 min" },
      video: "configurar-correos",
      keywords: ["correo","configurar","email settings","remitente","notificaciones","ajustar"],
      intro: { es: "Puedes cambiar el texto y el remitente de cada correo, y decidir si te llegan a ti también.", en: "You can change each email's text and sender, and decide if you also receive them." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Correos electrónicos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Emails</strong>." }, mockup: "ajustes-correos", resaltar: ["lista-correos"] },
        { texto: { es: "Verás la lista de correos. Haz clic en uno (ej. 'Pedido nuevo') para editarlo.", en: "You'll see the email list. Click one (e.g. 'New order') to edit it." }, mockup: "ajustes-correos", resaltar: ["editar-correo"] },
        { texto: { es: "Puedes cambiar el <strong>asunto</strong> y el <strong>texto</strong>, y con 'Recibir una copia' que te llegue a ti.", en: "You can change the <strong>subject</strong> and <strong>text</strong>, and use 'Send a copy' to receive it too." }, mockup: "ajustes-correos", resaltar: ["editar-correo"] },
        { texto: { es: "<strong>Guarda los cambios</strong> y haz un pedido de prueba para ver el correo real.", en: "<strong>Save changes</strong> and make a test order to see the real email." }, mockup: "ajustes-correos", resaltar: ["btn-guardar-correos"] }
      ],
      checklist: [
        { id: "ccor1", texto: { es: "Ajusté el texto de un correo", en: "Adjusted an email's text" } },
        { id: "ccor2", texto: { es: "Verifiqué que me llegan los correos", en: "Verified I receive the emails" } }
      ]
    },

    /* ---------- ⚙️ Ajustes avanzados (rara vez) ---------- */
    {
      id: "ajustes-productos", sec: "avanzados",
      titulo: { es: "Configuración de productos", en: "Products settings" },
      duracion: { es: "3 min", en: "3 min" },
      video: "ajustes-productos",
      keywords: ["productos","ajustes","configuracion","peso","dimensiones","tienda"],
      intro: { es: "Configuración general de cómo se manejan los productos en tu tienda (peso, dimensiones, reseñas).", en: "General settings for how products behave in your store (weight, dimensions, reviews)." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Productos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Products</strong>." }, mockup: "ajustes-generales", resaltar: ["pestaña-productos"] },
        { texto: { es: "Ahí defines peso/dimensiones por defecto y si los clientes pueden dejar reseñas.", en: "There you set default weight/dimensions and whether customers can leave reviews." }, mockup: "ajustes-generales", resaltar: ["pestaña-productos"] },
        { texto: { es: "<strong>Guarda los cambios</strong> al terminar.", en: "<strong>Save changes</strong> when done." }, mockup: "ajustes-generales", resaltar: ["btn-guardar-gen"] }
      ],
      checklist: [
        { id: "ap1", texto: { es: "Revisé los ajustes de productos", en: "Reviewed product settings" } }
      ]
    },
    {
      id: "ajustes-impuestos", sec: "avanzados",
      titulo: { es: "Ajustes de impuestos (avanzado)", en: "Tax settings (advanced)" },
      duracion: { es: "3 min", en: "3 min" },
      video: "ajustes-impuestos",
      keywords: ["impuesto","ajustes","tax","configuracion","avanzado"],
      intro: { es: "Visión completa de la configuración de impuestos de tu tienda.", en: "Full view of your store's tax configuration." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Impuestos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Tax</strong>." }, mockup: "ajustes-impuestos", resaltar: ["pestaña-impuestos"] },
        { texto: { es: "Configura si los precios incluyen impuestos y cómo se calculan.", en: "Set whether prices include tax and how it's calculated." }, mockup: "ajustes-impuestos", resaltar: ["btn-calcular-impuestos"] },
        { texto: { es: "<strong>Guarda los cambios</strong>. Si tienes dudas, escríbenos antes de tocar esto.", en: "<strong>Save changes</strong>. If in doubt, message us before touching this." }, mockup: "ajustes-impuestos", resaltar: ["btn-guardar-impuestos"] }
      ],
      checklist: [
        { id: "ai1", texto: { es: "Revisé los ajustes de impuestos", en: "Reviewed tax settings" } }
      ]
    },
    {
      id: "ajustes-ejemplo-impuesto", sec: "avanzados",
      titulo: { es: "Ejemplo de tasa de impuesto", en: "Tax rate example" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ajustes-ejemplo-impuesto",
      keywords: ["impuesto","tasa","ejemplo","porcentaje","como calcular"],
      intro: { es: "Cómo se ve y se configura una tasa de impuesto concreta, paso a paso.", en: "What a specific tax rate looks like and how to configure it, step by step." },
      pasos: [
        { texto: { es: "En Impuestos → <strong>Tasas de impuesto estándar</strong>, cada fila es una tasa.", en: "In Tax → <strong>Standard tax rates</strong>, each row is a rate." }, mockup: "ajustes-impuestos", resaltar: ["fila-tasa"] },
        { texto: { es: "Coloca el <strong>país/código postal</strong> y el <strong>porcentaje</strong> (ej. Costa Rica, 13%).", en: "Set the <strong>country/postcode</strong> and <strong>percentage</strong> (e.g. Costa Rica, 13%)." }, mockup: "ajustes-impuestos", resaltar: ["fila-tasa"] },
        { texto: { es: "Guarda y prueba con una compra: el impuesto se suma automáticamente.", en: "Save and test with a purchase: the tax is added automatically." }, mockup: "ajustes-impuestos", resaltar: ["btn-guardar-impuestos"] }
      ],
      checklist: [
        { id: "aei1", texto: { es: "Entendí cómo funciona una tasa", en: "Understood how a rate works" } }
      ]
    },
    {
      id: "ajustes-zonas-envio", sec: "avanzados",
      titulo: { es: "Zonas de envío (físicos)", en: "Shipping zones (physical)" },
      duracion: { es: "3 min", en: "3 min" },
      video: "ajustes-zonas-envio",
      keywords: ["zona","envio","zona de envio","pais","region","shipping"],
      intro: { es: "Las zonas de envío definen a qué lugares envías y con qué costos. Solo aplica a productos físicos.", en: "Shipping zones define where you ship and at what cost. Only applies to physical products." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Envío</strong> → <strong>Zonas de envío</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Shipping</strong> → <strong>Shipping zones</strong>." }, mockup: "ajustes-envio", resaltar: ["zona-envio"] },
        { texto: { es: "Pulsa <strong>Añadir zona de envío</strong> y elige la región (ej. tu país).", en: "Press <strong>Add shipping zone</strong> and choose the region (e.g. your country)." }, mockup: "ajustes-envio", resaltar: ["btn-add-zona"] },
        { texto: { es: "Dentro de la zona, <strong>Añadir método de envío</strong> (tarifa fija, gratis, retiro).", en: "Inside the zone, <strong>Add shipping method</strong> (flat rate, free, pickup)." }, mockup: "ajustes-envio", resaltar: ["btn-add-metodo"] },
        { texto: { es: "<strong>Guarda los cambios</strong>. Cada país puede tener su propia zona.", en: "<strong>Save changes</strong>. Each country can have its own zone." }, mockup: "ajustes-envio", resaltar: ["btn-guardar-envio"] }
      ],
      checklist: [
        { id: "az1", texto: { es: "Revisé mis zonas de envío", en: "Reviewed my shipping zones" } }
      ]
    },
    {
      id: "ajustes-envio-plano", sec: "avanzados",
      titulo: { es: "Envío plano (tarifa fija)", en: "Flat rate shipping" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ajustes-envio-plano",
      keywords: ["envio","plano","fijo","tarifa","costo envio","flat rate"],
      intro: { es: "El envío plano cobra un precio fijo a todos los pedidos (ej. $5). Simple y predecible.", en: "Flat rate shipping charges a fixed price to all orders (e.g. $5). Simple and predictable." },
      pasos: [
        { texto: { es: "En tu zona de envío, pulsa <strong>Añadir método de envío</strong> → <strong>Tarifa fija</strong>.", en: "In your shipping zone, press <strong>Add shipping method</strong> → <strong>Flat rate</strong>." }, mockup: "ajustes-envio", resaltar: ["btn-add-metodo"] },
        { texto: { es: "Configura el <strong>costo</strong> en el campo 'Costo' (ej. 5).", en: "Set the <strong>cost</strong> in the 'Cost' field (e.g. 5)." }, mockup: "ajustes-envio", resaltar: ["campo-tarifa"] },
        { texto: { es: "<strong>Guarda los cambios</strong>. El cliente verá el costo al pagar.", en: "<strong>Save changes</strong>. The customer will see the cost at checkout." }, mockup: "ajustes-envio", resaltar: ["btn-guardar-envio"] }
      ],
      checklist: [
        { id: "aep1", texto: { es: "Configuré una tarifa fija", en: "Set up a flat rate" } }
      ]
    },
    {
      id: "ajustes-retiro-tienda", sec: "avanzados",
      titulo: { es: "Retiro en tienda (local pickup)", en: "Local pickup" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ajustes-retiro-tienda",
      keywords: ["retiro","tienda","pickup","local","recoger","envio"],
      intro: { es: "Permite que tus clientes compren online y retiren su pedido en tu local, sin pagar envío.", en: "Let your customers buy online and pick up their order at your location, free of shipping." },
      pasos: [
        { texto: { es: "En tu zona de envío, <strong>Añadir método de envío</strong> → <strong>Retiro en tienda</strong>.", en: "In your shipping zone, <strong>Add shipping method</strong> → <strong>Local pickup</strong>." }, mockup: "ajustes-envio", resaltar: ["btn-add-metodo"] },
        { texto: { es: "Activa el método. Puedes escribir un título claro como 'Retiro en tienda (gratis)'.", en: "Enable the method. You can write a clear title like 'Store pickup (free)'." }, mockup: "ajustes-envio", resaltar: ["campo-titulo-metodo"] },
        { texto: { es: "<strong>Guarda los cambios</strong>. El cliente elige 'Retiro en tienda' al pagar.", en: "<strong>Save changes</strong>. The customer picks 'Store pickup' at checkout." }, mockup: "ajustes-envio", resaltar: ["btn-guardar-envio"] }
      ],
      checklist: [
        { id: "art1", texto: { es: "Activé el retiro en tienda", en: "Enabled local pickup" } }
      ]
    },
    {
      id: "ajustes-envio-gratis", sec: "avanzados",
      titulo: { es: "Envío gratis (regla)", en: "Free shipping (rule)" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ajustes-envio-gratis",
      keywords: ["envio","gratis","free shipping","regla","minimo"],
      intro: { es: "Da envío gratis a todos tus clientes, opcionalmente solo cuando superen un monto mínimo.", en: "Give free shipping to all customers, optionally only when they exceed a minimum amount." },
      pasos: [
        { texto: { es: "En tu zona, <strong>Añadir método de envío</strong> → <strong>Envío gratis</strong>.", en: "In your zone, <strong>Add shipping method</strong> → <strong>Free shipping</strong>." }, mockup: "ajustes-envio", resaltar: ["btn-add-metodo"] },
        { texto: { es: "Marca la casilla para <strong>habilitar la exención 'monto mínimo'</strong> y escribe el monto (ej. 50).", en: "Check the box to <strong>enable the 'minimum amount' exemption</strong> and write the amount (e.g. 50)." }, mockup: "ajustes-envio", resaltar: ["campo-minimo-envio"] },
        { texto: { es: "<strong>Guarda los cambios</strong>. Envío gratis desde ese monto.", en: "<strong>Save changes</strong>. Free shipping from that amount." }, mockup: "ajustes-envio", resaltar: ["btn-guardar-envio"] }
      ],
      checklist: [
        { id: "aeg1", texto: { es: "Configuré el envío gratis", en: "Set up free shipping" } }
      ]
    },
    {
      id: "ajustes-checkout", sec: "avanzados",
      titulo: { es: "Configuración del checkout", en: "Checkout settings" },
      duracion: { es: "3 min", en: "3 min" },
      video: "ajustes-checkout",
      keywords: ["checkout","pago","compra","campos","finalizar compra","ajustes"],
      intro: { es: "El checkout es donde el cliente paga. Puedes ajustar campos y orden de la pantalla de compra.", en: "Checkout is where the customer pays. You can adjust fields and the order of the purchase screen." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Finalizar compra</strong> (Checkout).", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Checkout</strong>." }, mockup: "ajustes-generales", resaltar: ["pestaña-checkout"] },
        { texto: { es: "Ahí ves las páginas de finalizar compra, carrito y 'gracias por tu compra'.", en: "There you see the checkout, cart and 'thanks for your purchase' pages." }, mockup: "ajustes-generales", resaltar: ["pestaña-checkout"] },
        { texto: { es: "Puedes cambiar el orden de los campos o marcar opciones de registro. <strong>Guarda los cambios</strong>.", en: "You can change field order or registration options. <strong>Save changes</strong>." }, mockup: "ajustes-generales", resaltar: ["btn-guardar-gen"] }
      ],
      checklist: [
        { id: "ac1", texto: { es: "Revisé los ajustes del checkout", en: "Reviewed checkout settings" } }
      ]
    },
    {
      id: "ajustes-cuentas", sec: "avanzados",
      titulo: { es: "Configuración de cuentas", en: "Accounts settings" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ajustes-cuentas",
      keywords: ["cuenta","cuentas","registro","cliente","crear cuenta","accounts"],
      intro: { es: "Controla si los clientes pueden crear cuentas y qué datos se les piden.", en: "Control whether customers can create accounts and what data is asked." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Cuentas y privacidad</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Accounts & privacy</strong>." }, mockup: "ajustes-generales", resaltar: ["pestaña-cuentas"] },
        { texto: { es: "Activa o desactiva la creación de cuentas y el registro durante la compra.", en: "Enable or disable account creation and registration during checkout." }, mockup: "ajustes-generales", resaltar: ["pestaña-cuentas"] },
        { texto: { es: "<strong>Guarda los cambios</strong>.", en: "<strong>Save changes</strong>." }, mockup: "ajustes-generales", resaltar: ["btn-guardar-gen"] }
      ],
      checklist: [
        { id: "acu1", texto: { es: "Revisé los ajustes de cuentas", en: "Reviewed account settings" } }
      ]
    },
    {
      id: "ajustes-correos", sec: "avanzados",
      titulo: { es: "Ajustes de correos (referencia)", en: "Email settings (reference)" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ajustes-correos",
      keywords: ["correo","email","ajustes","referencia","notificacion"],
      intro: { es: "Referencia rápida a la configuración de correos. La guía completa está en la sección 'Correos de tu tienda'.", en: "Quick reference to email configuration. Full guide is in the 'Your store emails' section." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Correos electrónicos</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Emails</strong>." }, mockup: "ajustes-correos", resaltar: ["lista-correos"] },
        { texto: { es: "Revisa el <strong>remitente</strong> y las opciones de envío (si los correos salen correctamente).", en: "Check the <strong>sender</strong> and sending options (whether emails go out correctly)." }, mockup: "ajustes-correos", resaltar: ["editar-correo"] },
        { texto: { es: "Para cambiar texto o recibir copias, usa la guía completa de la sección Correos.", en: "To change text or receive copies, use the full guide in the Emails section." }, mockup: "ajustes-correos", resaltar: ["btn-guardar-correos"] }
      ],
      checklist: [
        { id: "acor1", texto: { es: "Revisé los ajustes de correos", en: "Reviewed email settings" } }
      ]
    }
  ],
```

---

### Task 5: DATA — tutoriales de Pedidos, Cupones y Mi web

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-data">`, append to the `tutoriales` array (after the `quitar-producto` entry).

- [ ] **Step 1: Append tutorials part 2 (pedidos + cupones + web)**

Find the closing of the `quitar-producto` entry: `}` then `]` then `,` (end of tutoriales array). Insert these entries right before that closing `]`:

```html
    /* ---------- 🛒 Pedidos y envíos ---------- */
    {
      id: "ver-pedidos", sec: "pedidos",
      titulo: { es: "Ver mis pedidos", en: "View my orders" },
      duracion: { es: "2 min", en: "2 min" },
      video: "ver-pedidos",
      keywords: ["pedido","pedidos","orden","ordenes","ventas","revisar","estado"],
      intro: { es: "Aquí ves todas las compras de tus clientes, su estado y lo que pagaron. Es la pantalla que vas a revisar más seguido.", en: "Here you see all your customers' purchases, their status and what they paid. This is the screen you'll check most often." },
      pasos: [
        { texto: { es: "En el menú izquierdo ve a <strong>Pedidos</strong> (o WooCommerce → Pedidos).", en: "In the left menu go to <strong>Orders</strong> (or WooCommerce → Orders)." }, mockup: "lista-pedidos", resaltar: ["filtro-estado"] },
        { texto: { es: "Cada fila es un pedido: número, cliente, total y <strong>estado</strong> (pendiente, procesando, enviado…).", en: "Each row is an order: number, customer, total and <strong>status</strong> (pending, processing, shipped…)." }, mockup: "lista-pedidos", resaltar: ["fila-pedido"] },
        { texto: { es: "Usa los <strong>filtros de estado</strong> arriba para ver solo los pendientes o los enviados.", en: "Use the <strong>status filters</strong> on top to see only pending or shipped ones." }, mockup: "lista-pedidos", resaltar: ["filtro-estado"] },
        { texto: { es: "Haz clic en un pedido para ver el detalle completo (productos, dirección, notas).", en: "Click an order to see full details (products, address, notes)." }, mockup: "detalle-pedido", resaltar: ["info-cliente"] }
      ],
      checklist: [
        { id: "o1", texto: { es: "Encontré la pantalla de pedidos", en: "Found the orders screen" } },
        { id: "o2", texto: { es: "Sé filtrar por estado", en: "I know how to filter by status" } }
      ]
    },
    {
      id: "cambiar-estado", sec: "pedidos",
      titulo: { es: "Cambiar el estado de un pedido", en: "Change an order's status" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["estado","procesando","enviado","completado","cancelado","pedido","cambiar"],
      intro: { es: "Cuando un pedido pasa de pendiente a enviado, el cliente recibe su correo con el estado. Aquí está cómo cambiarlo.", en: "When an order goes from pending to shipped, the customer gets the status email. Here's how to change it." },
      pasos: [
        { texto: { es: "Abre el pedido desde <strong>Pedidos</strong>.", en: "Open the order from <strong>Orders</strong>." }, mockup: "lista-pedidos", resaltar: ["fila-pedido"] },
        { texto: { es: "Busca el menú <strong>Estado del pedido</strong> (arriba, junto al título del pedido).", en: "Find the <strong>Order status</strong> menu (top, next to the order title)." }, mockup: "detalle-pedido", resaltar: ["select-estado"] },
        { texto: { es: "Elige el nuevo estado: <strong>Procesando</strong>, <strong>Enviado</strong> o <strong>Completado</strong>.", en: "Pick the new status: <strong>Processing</strong>, <strong>Shipped</strong> or <strong>Completed</strong>." }, mockup: "detalle-pedido", resaltar: ["select-estado"] },
        { texto: { es: "Pulsa <strong>Actualizar</strong> (o Guardar) para confirmar.", en: "Press <strong>Update</strong> (or Save) to confirm." }, mockup: "detalle-pedido", resaltar: ["btn-actualizar-pedido"] }
      ],
      checklist: [
        { id: "ce1", texto: { es: "Cambié el estado del primer pedido", en: "Changed my first order's status" } },
        { id: "ce2", texto: { es: "Guardé los cambios", en: "Saved the changes" } }
      ]
    },
    {
      id: "ver-factura", sec: "pedidos",
      titulo: { es: "Ver y descargar una factura", en: "View and download an invoice" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["factura","recibo","imprimir","pdf","descargar","pedido"],
      intro: { es: "Cuando un cliente te pide factura, la descargas desde el pedido en un par de clics.", en: "When a customer asks for an invoice, you download it from the order in a couple of clicks." },
      pasos: [
        { texto: { es: "Abre el pedido desde <strong>Pedidos</strong>.", en: "Open the order from <strong>Orders</strong>." }, mockup: "lista-pedidos", resaltar: ["fila-pedido"] },
        { texto: { es: "Busca el botón <strong>Factura</strong> o <strong>Detalles de pago</strong> dentro del pedido.", en: "Find the <strong>Invoice</strong> or <strong>Payment details</strong> button inside the order." }, mockup: "detalle-pedido", resaltar: ["btn-factura"] },
        { texto: { es: "Descarga el PDF o usa <strong>Imprimir</strong> para guardarlo como archivo.", en: "Download the PDF or use <strong>Print</strong> to save it as a file." }, mockup: "detalle-pedido", resaltar: ["btn-factura"] }
      ],
      checklist: [
        { id: "vf1", texto: { es: "Encontré la factura del pedido", en: "Found the order's invoice" } },
        { id: "vf2", texto: { es: "La descargué o imprimí", en: "Downloaded or printed it" } }
      ]
    },
    {
      id: "devoluciones-reembolsos", sec: "pedidos",
      titulo: { es: "Devoluciones y reembolsos", en: "Returns and refunds" },
      duracion: { es: "2 min", en: "2 min" },
      video: "devoluciones-reembolsos",
      keywords: ["devolucion","reembolso","refund","dinero","devolver","cliente"],
      intro: { es: "Si debes devolverle el dinero a un cliente, haz el reembolso desde el pedido. Puede ser completo o parcial.", en: "If you must return money to a customer, do the refund from the order. It can be full or partial." },
      pasos: [
        { texto: { es: "Abre el pedido que quieres reembolsar.", en: "Open the order you want to refund." }, mockup: "lista-pedidos", resaltar: ["fila-pedido"] },
        { texto: { es: "Pulsa el botón <strong>Reembolsar</strong> (junto al total del pedido).", en: "Press the <strong>Refund</strong> button (next to the order total)." }, mockup: "detalle-pedido", resaltar: ["btn-reembolso"] },
        { texto: { es: "Elige el monto (completo o parcial), deja una nota y confirma.", en: "Choose the amount (full or partial), leave a note and confirm." }, mockup: "detalle-pedido", resaltar: ["btn-reembolso"] },
        { texto: { es: "El dinero vuelve a la tarjeta/cuenta del cliente (tarda 3-10 días según el banco).", en: "The money returns to the customer's card/account (takes 3-10 days depending on the bank)." }, mockup: "detalle-pedido", resaltar: ["btn-reembolso"] }
      ],
      checklist: [
        { id: "dr1", texto: { es: "Hice mi primer reembolso", en: "Did my first refund" } }
      ]
    },
    {
      id: "notas-cliente", sec: "pedidos",
      titulo: { es: "Notas del cliente en el pedido", en: "Customer notes on the order" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["nota","notas","comentario","mensaje","cliente","pedido","interna"],
      intro: { es: "Dentro de cada pedido hay dos tipos de nota: las que escribe el cliente y las internas que solo ves tú.", en: "Inside each order there are two note types: notes the customer writes and internal notes only you see." },
      pasos: [
        { texto: { es: "Abre el pedido y busca la caja <strong>Notas del pedido</strong>.", en: "Open the order and find the <strong>Order notes</strong> box." }, mockup: "detalle-pedido", resaltar: ["caja-notas"] },
        { texto: { es: "La <strong>nota del cliente</strong> es lo que el comprador escribió al pagar (ej. instrucciones de entrega).", en: "The <strong>customer note</strong> is what the buyer wrote when paying (e.g. delivery instructions)." }, mockup: "detalle-pedido", resaltar: ["caja-notas"] },
        { texto: { es: "En <strong>Añadir nota</strong> puedes escribir una nota interna para tu equipo (no se la envías al cliente).", en: "Under <strong>Add note</strong> you can write an internal note for your team (not sent to the customer)." }, mockup: "detalle-pedido", resaltar: ["caja-notas"] }
      ],
      checklist: [
        { id: "nc1", texto: { es: "Sé diferenciar nota de cliente vs nota interna", en: "I can tell customer notes from internal notes" } }
      ]
    },
    {
      id: "costos-envio", sec: "pedidos",
      titulo: { es: "Agregar costos de envío", en: "Add shipping charges" },
      duracion: { es: "2 min", en: "2 min" },
      video: "costos-envio",
      keywords: ["envio","envios","costo","costo de envio","shipping","tarifa"],
      intro: { es: "Tu tienda puede cobrar envío de varias formas: tarifa fija, gratis sobre cierto monto, o retiro en tienda.", en: "Your store can charge shipping in several ways: flat rate, free above a certain amount, or local pickup." },
      pasos: [
        { texto: { es: "Ve a <strong>WooCommerce</strong> → <strong>Ajustes</strong> → <strong>Envío</strong>.", en: "Go to <strong>WooCommerce</strong> → <strong>Settings</strong> → <strong>Shipping</strong>." }, mockup: "ajustes-envio", resaltar: ["zona-envio"] },
        { texto: { es: "Haz clic en tu <strong>zona de envío</strong> (la que corresponde a tu país/ciudad).", en: "Click your <strong>shipping zone</strong> (the one matching your country/city)." }, mockup: "ajustes-envio", resaltar: ["zona-envio"] },
        { texto: { es: "Pulsa <strong>Añadir método de envío</strong> y elige <strong>Tarifa fija</strong> o <strong>Envío gratis</strong>.", en: "Press <strong>Add shipping method</strong> and choose <strong>Flat rate</strong> or <strong>Free shipping</strong>." }, mockup: "ajustes-envio", resaltar: ["btn-add-metodo"] },
        { texto: { es: "Configura el monto o la condición (ej. gratis a partir de $50) y <strong>Guarda los cambios</strong>.", en: "Set the amount or condition (e.g. free over $50) and <strong>Save changes</strong>." }, mockup: "ajustes-envio", resaltar: ["campo-tarifa"] }
      ],
      checklist: [
        { id: "cev1", texto: { es: "Encontré los ajustes de envío", en: "Found shipping settings" } },
        { id: "cev2", texto: { es: "Configuré un método de envío", en: "Configured a shipping method" } }
      ]
    },

    /* ---------- 🎟️ Cupones y promociones ---------- */
    {
      id: "crear-cupon", sec: "cupones",
      titulo: { es: "Crear un cupón de descuento", en: "Create a discount coupon" },
      duracion: { es: "2 min", en: "2 min" },
      video: "crear-cupon",
      keywords: ["cupon","descuento","codigo","promo","porcentaje","promocion"],
      intro: { es: "Un cupón es un código que le da descuento a tus clientes. Puedes hacerlo por porcentaje o por monto fijo.", en: "A coupon is a code that gives your customers a discount. You can make it by percentage or fixed amount." },
      pasos: [
        { texto: { es: "Ve a <strong>Marketing</strong> → <strong>Cupones</strong> → <strong>Añadir cupón</strong>.", en: "Go to <strong>Marketing</strong> → <strong>Coupons</strong> → <strong>Add coupon</strong>." }, mockup: "lista-cupones", resaltar: ["btn-nuevo-cupon"] },
        { texto: { es: "Escribe un <strong>código</strong> fácil de recordar (ej. BIENVENIDO10).", en: "Write an easy-to-remember <strong>code</strong> (e.g. WELCOME10)." }, mockup: "editor-cupon", resaltar: ["campo-codigo"] },
        { texto: { es: "En <strong>Datos del cupón</strong> elige <strong>Descuento fijo</strong> o <strong>Porcentaje</strong> y pon el valor.", en: "In <strong>Coupon data</strong> choose <strong>Fixed discount</strong> or <strong>Percentage</strong> and set the value." }, mockup: "editor-cupon", resaltar: ["campo-descuento"] },
        { texto: { es: "Pulsa <strong>Publicar</strong>. ¡Ya puedes compartir el código con tus clientes!", en: "Press <strong>Publish</strong>. Now you can share the code with your customers!" }, mockup: "editor-cupon", resaltar: ["btn-publicar"] }
      ],
      checklist: [
        { id: "cu1", texto: { es: "Creé mi primer cupón", en: "Created my first coupon" } },
        { id: "cu2", texto: { es: "Lo compartí con un cliente", en: "Shared it with a customer" } }
      ]
    },
    {
      id: "envio-gratis", sec: "cupones",
      titulo: { es: "Envío gratis (con cupón)", en: "Free shipping (with coupon)" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["envio","gratis","cupon","descuento","sin costo"],
      intro: { es: "Puedes regalar el envío con un cupón. Tus clientes solo escriben el código y el envío queda en $0.", en: "You can give away shipping with a coupon. Your customers just type the code and shipping becomes $0." },
      pasos: [
        { texto: { es: "Crea un cupón nuevo (Marketing → Cupones → Añadir cupón).", en: "Create a new coupon (Marketing → Coupons → Add coupon)." }, mockup: "lista-cupones", resaltar: ["btn-nuevo-cupon"] },
        { texto: { es: "Marca la opción <strong>Permitir envío gratis</strong> en los datos del cupón.", en: "Check the <strong>Allow free shipping</strong> option in the coupon data." }, mockup: "editor-cupon", resaltar: ["tipo-envio-gratis"] },
        { texto: { es: "Publica el cupón. Para que funcione, la zona de envío también debe tener 'Envío gratis' como método disponible.", en: "Publish the coupon. For it to work, the shipping zone must also have 'Free shipping' as an available method." }, mockup: "editor-cupon", resaltar: ["btn-publicar"] }
      ],
      checklist: [
        { id: "eg1", texto: { es: "Creé un cupón de envío gratis", en: "Created a free shipping coupon" } }
      ]
    },
    {
      id: "promo-fechas", sec: "cupones",
      titulo: { es: "Promo por fechas (activar/desactivar)", en: "Date-limited promo (on/off)" },
      duracion: { es: "2 min", en: "2 min" },
      keywords: ["fecha","fechas","promo","vencer","periodo","cupon","validez"],
      intro: { es: "Para promos de fin de año o días especiales, puedes limitar el cupón a un rango de fechas y se apaga solo.", en: "For end-of-year or special-day promos, you can limit the coupon to a date range and it turns itself off." },
      pasos: [
        { texto: { es: "Abre el cupón que quieres limitar.", en: "Open the coupon you want to limit." }, mockup: "lista-cupones", resaltar: ["fila-cupon"] },
        { texto: { es: "En <strong>Fechas del cupón</strong>, marca la casilla y elige la fecha de inicio y fin.", en: "In <strong>Coupon expiry</strong>, check the box and pick the start and end dates." }, mockup: "editor-cupon", resaltar: ["campo-fechas"] },
        { texto: { es: "Guarda. Cuando llegue la fecha fin, el cupón deja de funcionar automáticamente.", en: "Save. When the end date arrives, the coupon stops working automatically." }, mockup: "editor-cupon", resaltar: ["campo-fechas"] }
      ],
      checklist: [
        { id: "pf1", texto: { es: "Puse fecha de inicio y fin a mi promo", en: "Set start and end dates for my promo" } }
      ]
    },
    {
      id: "restricciones", sec: "cupones",
      titulo: { es: "Restricciones de un cupón", en: "Coupon restrictions" },
      duracion: { es: "2 min", en: "2 min" },
      keywords: ["restriccion","minimo","compra","uso unico","categoria","cupon","limite"],
      intro: { es: "Puedes controlar dónde y cómo se usa un cupón: compra mínima, categorías específicas o uso por cliente.", en: "You can control where and how a coupon is used: minimum purchase, specific categories or per-customer use." },
      pasos: [
        { texto: { es: "Abre el cupón y ve a la pestaña <strong>Restricciones de uso</strong>.", en: "Open the coupon and go to the <strong>Usage restriction</strong> tab." }, mockup: "editor-cupon", resaltar: ["tab-restricciones"] },
        { texto: { es: "Puedes fijar un <strong>monto mínimo de compra</strong> o limitar a ciertas <strong>categorías</strong>.", en: "You can set a <strong>minimum purchase amount</strong> or limit to certain <strong>categories</strong>." }, mockup: "editor-cupon", resaltar: ["campo-minimo"] },
        { texto: { es: "En <strong>Límites de uso</strong> puedes limitarlo a una vez por cliente (1 uso por usuario).", en: "Under <strong>Usage limits</strong> you can limit it to once per customer (1 use per user)." }, mockup: "editor-cupon", resaltar: ["campo-limite"] },
        { texto: { es: "Guarda los cambios. Recuerda: más restricciones = cupón más seguro.", en: "Save changes. Remember: more restrictions = safer coupon." }, mockup: "editor-cupon", resaltar: ["btn-publicar"] }
      ],
      checklist: [
        { id: "re1", texto: { es: "Configuré restricciones a mi cupón", en: "Configured restrictions on my coupon" } }
      ]
    },

    /* ---------- ✏️ Mi web y contenido ---------- */
    {
      id: "editar-texto", sec: "web",
      titulo: { es: "Editar el texto de una página", en: "Edit page text" },
      duracion: { es: "3 min", en: "3 min" },
      video: "editar-texto",
      keywords: ["texto","editar","pagina","elementor","contenido","escribir","cambiar"],
      intro: { es: "Tu web está construida con Elementor. Editar un texto es tan simple como hacer clic en él y escribir.", en: "Your website is built with Elementor. Editing a text is as simple as clicking on it and typing." },
      pasos: [
        { texto: { es: "Ve a <strong>Páginas</strong> y abre la página que quieres editar (ej. Inicio).", en: "Go to <strong>Pages</strong> and open the page you want to edit (e.g. Home)." }, mockup: "lista-paginas", resaltar: ["fila-pagina"] },
        { texto: { es: "Pulsa <strong>Editar con Elementor</strong>.", en: "Press <strong>Edit with Elementor</strong>." }, mockup: "lista-paginas", resaltar: ["btn-elementor"] },
        { texto: { es: "Haz clic directamente sobre el texto que quieres cambiar y escríbelo nuevo.", en: "Click directly on the text you want to change and type new content." }, mockup: "editor-elementor", resaltar: ["texto-editable"] },
        { texto: { es: "Pulsa <strong>Actualizar</strong> (botón verde arriba). ¡Revisa tu web para ver el cambio!", en: "Press <strong>Update</strong> (green button on top). Check your site to see the change!" }, mockup: "editor-elementor", resaltar: ["btn-elementor-update"] }
      ],
      checklist: [
        { id: "et1", texto: { es: "Edité un texto con Elementor", en: "Edited a text with Elementor" } },
        { id: "et2", texto: { es: "Guardé con Actualizar", en: "Saved with Update" } }
      ]
    },
    {
      id: "banner-portada", sec: "web",
      titulo: { es: "Cambiar el banner de la portada", en: "Change the homepage banner" },
      duracion: { es: "3 min", en: "3 min" },
      keywords: ["banner","portada","imagen","home","inicio","hero","cambiar"],
      intro: { es: "El banner grande de la portada es lo primero que ve tu cliente. Cambiarlo toma un par de minutos.", en: "The big homepage banner is the first thing your customers see. Changing it takes a couple of minutes." },
      pasos: [
        { texto: { es: "Abre la página de <strong>Inicio</strong> con Elementor (Páginas → Inicio → Editar con Elementor).", en: "Open the <strong>Home</strong> page with Elementor (Pages → Home → Edit with Elementor)." }, mockup: "lista-paginas", resaltar: ["btn-elementor"] },
        { texto: { es: "Haz clic en la sección del banner (la imagen grande arriba) para seleccionarla.", en: "Click the banner section (the big image on top) to select it." }, mockup: "editor-elementor", resaltar: ["seccion-banner"] },
        { texto: { es: "En el panel izquierdo de Elementor, busca el <strong>fondo/imagen</strong> y sube la nueva foto.", en: "In Elementor's left panel, find the <strong>background/image</strong> and upload the new photo." }, mockup: "editor-elementor", resaltar: ["panel-elementor"] },
        { texto: { es: "Pulsa <strong>Actualizar</strong>. Usa una imagen grande (1500px+) para que no se vea borrosa.", en: "Press <strong>Update</strong>. Use a large image (1500px+) so it doesn't look blurry." }, mockup: "editor-elementor", resaltar: ["btn-elementor-update"] }
      ],
      checklist: [
        { id: "bp1", texto: { es: "Cambié el banner de mi portada", en: "Changed my homepage banner" } }
      ]
    },
    {
      id: "pagina-nueva-menu", sec: "web",
      titulo: { es: "Agregar una página y añadirla al menú", en: "Add a page and add it to the menu" },
      duracion: { es: "3 min", en: "3 min" },
      video: "pagina-nueva-menu",
      keywords: ["pagina","nueva","crear","menu","agregar","pestaña"],
      intro: { es: "Si quieres una página nueva (ej. 'Nuestra historia'), la creas y luego la agregas al menú para que se vea en tu web.", en: "If you want a new page (e.g. 'Our story'), create it and then add it to the menu so it shows on your site." },
      pasos: [
        { texto: { es: "Ve a <strong>Páginas</strong> → <strong>Añadir nueva</strong>.", en: "Go to <strong>Pages</strong> → <strong>Add New</strong>." }, mockup: "lista-paginas", resaltar: ["btn-nueva-pagina"] },
        { texto: { es: "Escribe el <strong>título</strong> y, si quieres, edítala con Elementor. Publica la página.", en: "Type the <strong>title</strong> and, if you want, edit it with Elementor. Publish the page." }, mockup: "editor-elementor", resaltar: ["btn-elementor-update"] },
        { texto: { es: "Ahora ve a <strong>Apariencia</strong> → <strong>Menús</strong>.", en: "Now go to <strong>Appearance</strong> → <strong>Menus</strong>." }, mockup: "menu", resaltar: ["lista-paginas-disponibles"] },
        { texto: { es: "Marca tu página nueva, pulsa <strong>Añadir al menú</strong> y <strong>Guardar menú</strong>.", en: "Check your new page, press <strong>Add to menu</strong> and <strong>Save menu</strong>." }, mockup: "menu", resaltar: ["btn-guardar-menu"] }
      ],
      checklist: [
        { id: "pm1", texto: { es: "Creé una página nueva", en: "Created a new page" } },
        { id: "pm2", texto: { es: "La agregué al menú", en: "Added it to the menu" } }
      ]
    },
    {
      id: "menu-navegacion", sec: "web",
      titulo: { es: "Organizar el menú de navegación", en: "Organize the navigation menu" },
      duracion: { es: "1 min", en: "1 min" },
      video: "menu-navegacion",
      keywords: ["menu","navegacion","orden","enlaces","pestañas","reordenar"],
      intro: { es: "Puedes cambiar el orden de las pestañas del menú, renombrarlas o quitar las que sobran.", en: "You can change the order of menu tabs, rename them or remove the ones you don't need." },
      pasos: [
        { texto: { es: "Ve a <strong>Apariencia</strong> → <strong>Menús</strong>.", en: "Go to <strong>Appearance</strong> → <strong>Menus</strong>." }, mockup: "menu", resaltar: ["item-menu"] },
        { texto: { es: "Arrastra los elementos para cambiar el orden, o edita el texto de cada uno.", en: "Drag the items to change the order, or edit each item's text." }, mockup: "menu", resaltar: ["item-menu"] },
        { texto: { es: "Pulsa <strong>Guardar menú</strong> al terminar.", en: "Press <strong>Save menu</strong> when done." }, mockup: "menu", resaltar: ["btn-guardar-menu"] }
      ],
      checklist: [
        { id: "mn1", texto: { es: "Reorganicé mi menú", en: "Reorganized my menu" } }
      ]
    },
    {
      id: "footer-astra", sec: "web",
      titulo: { es: "Editar el footer (tema Astra)", en: "Edit the footer (Astra theme)" },
      duracion: { es: "2 min", en: "2 min" },
      video: "footer-astra",
      keywords: ["footer","pie de pagina","astra","editar","abajo","copyright"],
      intro: { es: "El footer es la parte de abajo de tu web (copyright, enlaces, contacto). Se edita desde el personalizador del tema Astra.", en: "The footer is the bottom part of your site (copyright, links, contact). It's edited from the Astra theme customizer." },
      pasos: [
        { texto: { es: "Ve a <strong>Apariencia</strong> → <strong>Personalizar</strong>.", en: "Go to <strong>Appearance</strong> → <strong>Customize</strong>." }, mockup: "footer-astra", resaltar: ["seccion-footer"] },
        { texto: { es: "En el menú lateral busca <strong>Footer</strong> (o Footer Builder).", en: "In the side menu find <strong>Footer</strong> (or Footer Builder)." }, mockup: "footer-astra", resaltar: ["seccion-footer"] },
        { texto: { es: "Edita los textos (copyright, teléfono, redes) y pulsa <strong>Publicar</strong> arriba.", en: "Edit the texts (copyright, phone, socials) and press <strong>Publish</strong> on top." }, mockup: "footer-astra", resaltar: ["btn-publicar"] }
      ],
      checklist: [
        { id: "fa1", texto: { es: "Edité el footer de mi web", en: "Edited my website footer" } }
      ]
    }
  ],
```
If the folder is not a git repo yet, run `git init` first at `C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas`.

---

### Task 2: CONFIG block

**Files:**
- Modify: `hub-woo.html` — insert into `<script id="hub-config">`

- [ ] **Step 1: Insert the CONFIG script**

Replace the empty tag `<script id="hub-config"></script>` with:

```html
<script id="hub-config">
/* ============================================================
   ✏️ EDITAR AQUÍ — Configuración de este cliente
   Cambia los datos del negocio antes de entregar el archivo.
   ============================================================ */
const CONFIG = {
  clientName:     { es: "Tu Tienda", en: "Your Store" },
  storeUrl:       "https://tutienda.com",
  loginUrl:       "https://tutienda.com/wp-admin",
  whatsappNumber: "50200000000",
  email:          "agencia@coordenadas.co",
  defaultLang:    "es",
  /* Videos de YouTube (mismos para ES y EN). Clave = id del tutorial.
     Puede ser un string o un array de strings (varios videos). */
  videos: {
    "crear-producto":          "6OJSAn6A5mA",
    "tipos-producto":          "HhOf9260a2o",
    "subir-fotos":             "9wte-83NSnI",
    "categorias-etiquetas":    "kPJnJomWU4Y",
    "imagen-categoria":        "oTaBcQG9oNI",
    "variaciones":             "lWQkNR38_EM",
    "producto-agrupado":       "MahrLowOGng",
    "ver-pedidos":             ["rjS3mbiLN_c", "3nfmJcPR3I4"],
    "devoluciones-reembolsos": "mFNAY2dsXwY",
    "costos-envio":            "3d7yNpIi2_8",
    "crear-cupon":             "gi-MhzDSdb4",
    "editar-texto":            "Z4fUt4WpRhE",
    "pagina-nueva-menu":       "ZsbVIO-1u8g",
    "menu-navegacion":         "Zyl-lRH-5Os",
    "footer-astra":            "FOU5UzlRyhk",
    "conectar-paypal":         "5tCIpGAxUh4",
    "conectar-stripe":         "h0vvueoj16k",
    "configurar-impuestos":    "s-fgmY6nwJA",
    "cuanto-vendi":            "B6XS3Z1reVw",
    "correos-automaticos":     "g_wR3VWvATg",
    "configurar-correos":      "2vtzGc92tFU",
    "ajustes-productos":       "FEmwJsE8xDY",
    "ajustes-impuestos":       "0aPtye5ba4A",
    "ajustes-ejemplo-impuesto":"HC2IUnJSJro",
    "ajustes-zonas-envio":     "1HhBEbIMqAQ",
    "ajustes-envio-plano":     "a5N99INu6Fs",
    "ajustes-retiro-tienda":   "HHYOQbcD2KE",
    "ajustes-envio-gratis":    "7s-SHvVR2Os",
    "ajustes-checkout":        "zoejwJfXops",
    "ajustes-cuentas":         "AGZSeX5I-wo",
    "ajustes-correos":         "2vtzGc92tFU"
  }
};
</script>
```

- [ ] **Step 2: Verify**

Run:
```
Select-String -Path "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" -Pattern '"crear-producto":\s*"6OJSAn6A5mA"'
```
Expected: 1 match.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add CONFIG block with client data and video catalog"
```

---

### Task 3: DATA — secciones, logros, glosario, faq, I18N

**Files:**
- Modify: `hub-woo.html` — insert into `<script id="hub-data">`

- [ ] **Step 1: Insert the first DATA block (sections, achievements, glossary, FAQ, I18N)**

Replace the empty tag `<script id="hub-data"></script>` with:

```html
<script id="hub-data">
const DATA = {
  secciones: [
    { id: "acceso",    icono: "🔑", color: "green",  titulo: { es: "Tu acceso", en: "Your access" } },
    { id: "productos", icono: "📦", color: "green",  titulo: { es: "Productos y catálogo", en: "Products & catalog" }, etiqueta: "top" },
    { id: "pedidos",   icono: "🛒", color: "blue",   titulo: { es: "Pedidos y envíos", en: "Orders & shipping" }, etiqueta: "top" },
    { id: "cupones",   icono: "🎟️", color: "yellow", titulo: { es: "Cupones y promociones", en: "Coupons & promos" }, etiqueta: "top" },
    { id: "web",       icono: "✏️", color: "blue",   titulo: { es: "Mi web y contenido", en: "My website & content" }, etiqueta: "top" },
    { id: "pagos",     icono: "💰", color: "yellow", titulo: { es: "Pagos y facturación", en: "Payments & billing" } },
    { id: "clientes",  icono: "👥", color: "blue",   titulo: { es: "Clientes y cuentas", en: "Customers & accounts" } },
    { id: "reportes",  icono: "📊", color: "green",  titulo: { es: "Reportes y ventas", en: "Reports & sales" } },
    { id: "correos",   icono: "📧", color: "yellow", titulo: { es: "Correos de tu tienda", en: "Your store emails" } },
    { id: "avanzados", icono: "⚙️", color: "orange", titulo: { es: "Ajustes avanzados", en: "Advanced settings" }, etiqueta: "adv" }
  ],

  logros: [
    { id: "logro-primer-producto", icono: "🏆", titulo: { es: "Primer producto", en: "First product" }, condicion: "crear-producto" },
    { id: "logro-primer-pedido",   icono: "🚀", titulo: { es: "Primer pedido procesado", en: "First order processed" }, condicion: "cambiar-estado" },
    { id: "logro-primera-promo",   icono: "🎉", titulo: { es: "Primera promo", en: "First promo" }, condicion: "crear-cupon" },
    { id: "logro-vi-ventas",       icono: "💰", titulo: { es: "Vi mis ventas", en: "Saw my sales" }, condicion: "cuanto-vendi" }
  ],

  glosario: [
    { termino: { es: "Panel de control", en: "Dashboard" }, def: { es: "La pantalla principal de tu tienda. Desde aquí controlas productos, pedidos y todo lo demás.", en: "The main screen of your store. From here you control products, orders and everything else." } },
    { termino: { es: "Plugin", en: "Plugin" }, def: { es: "Un programa extra que agrega funciones a tu web (como la tienda o el carrito).", en: "An extra program that adds features to your website (like the store or cart)." } },
    { termino: { es: "Stock", en: "Stock" }, def: { es: "La cantidad de productos que tienes disponibles para vender.", en: "The amount of products you have available to sell." } },
    { termino: { es: "Pasarela de pago", en: "Payment gateway" }, def: { es: "El servicio que recibe el dinero del cliente (PayPal, Stripe, etc.).", en: "The service that receives the customer's money (PayPal, Stripe, etc.)." } },
    { termino: { es: "Producto variable", en: "Variable product" }, def: { es: "Un producto con versiones (tallas, colores) que tienen precio o stock diferente.", en: "A product with versions (sizes, colors) that have different price or stock." } },
    { termino: { es: "Producto agrupado", en: "Grouped product" }, def: { es: "Un grupo de productos simples que se venden juntos (ej. un set).", en: "A group of simple products sold together (e.g. a set)." } },
    { termino: { es: "Cupón", en: "Coupon" }, def: { es: "Un código que da descuento a tus clientes.", en: "A code that gives your customers a discount." } },
    { termino: { es: "Carrito abandonado", en: "Abandoned cart" }, def: { es: "Un cliente que agregó productos pero no terminó la compra.", en: "A customer who added products but didn't finish the purchase." } },
    { termino: { es: "Checkout", en: "Checkout" }, def: { es: "La pantalla donde el cliente llena sus datos y paga.", en: "The screen where the customer fills their details and pays." } },
    { termino: { es: "Elementor", en: "Elementor" }, def: { es: "La herramienta con la que está construida tu web; permite editar páginas visualmente.", en: "The tool your website is built with; it lets you edit pages visually." } },
    { termino: { es: "Plantilla / Tema", en: "Theme" }, def: { es: "El diseño general de tu web (colores, fuentes, estructura).", en: "The overall design of your website (colors, fonts, layout)." } },
    { termino: { es: "Estado del pedido", en: "Order status" }, def: { es: "En qué etapa está un pedido: pendiente, procesando, enviado, etc.", en: "What stage an order is at: pending, processing, shipped, etc." } },
    { termino: { es: "Reembolso", en: "Refund" }, def: { es: "Devolverle el dinero al cliente por un pedido.", en: "Returning the customer's money for an order." } },
    { termino: { es: "Categoría", en: "Category" }, def: { es: "Una agrupación de productos (ej. Ropa, Accesorios).", en: "A group of products (e.g. Clothing, Accessories)." } },
    { termino: { es: "Etiqueta", en: "Tag" }, def: { es: "Una palabra clave opcional para organizar productos dentro de una categoría.", en: "An optional keyword to organize products within a category." } }
  ],

  faq: [
    { q: { es: "¿Dónde entro a mi tienda?", en: "Where do I log into my store?" },
      a: { es: "Abre tu web y agrega /wp-admin al final de la dirección (ej. tutienda.com/wp-admin). Escribe tu usuario y contraseña. El enlace exacto está en la sección 'Tu acceso'.", en: "Open your website and add /wp-admin at the end (e.g. yourstore.com/wp-admin). Type your username and password. The exact link is in the 'Your access' section." } },
    { q: { es: "Olvidé mi contraseña, ¿qué hago?", en: "I forgot my password, what do I do?" },
      a: { es: "En la pantalla de acceso a WordPress, haz clic en '¿Perdiste tu contraseña?' y escribe tu correo. Te llegará un enlace para crear una nueva.", en: "On the WordPress login screen, click 'Lost your password?' and type your email. You'll receive a link to create a new one." } },
    { q: { es: "¿Cómo agrego un producto nuevo?", en: "How do I add a new product?" },
      a: { es: "Ve a Productos → Añadir nuevo. Llena título, precio y descripción, sube la foto y haz clic en 'Publicar'. Tienes la guía completa en la sección de Productos.", en: "Go to Products → Add new. Fill title, price and description, upload the photo and click 'Publish'. Full guide in the Products section." } },
    { q: { es: "¿Por qué no me llegan los pedidos?", en: "Why am I not receiving orders?" },
      a: { es: "Revisa primero que la tienda esté en línea (no en modo mantenimiento). Luego verifica en WooCommerce → Pedidos que los pedidos se estén registrando. Si un pago no aparece, revisa la pasarela (PayPal/Stripe).", en: "First check your store is online (not in maintenance mode). Then check WooCommerce → Orders to confirm orders are recorded. If a payment is missing, check your gateway (PayPal/Stripe)." } },
    { q: { es: "¿Cómo hago un descuento para mis clientes?", en: "How do I make a discount for my customers?" },
      a: { es: "Crea un cupón en Marketing → Cupones. Puedes poner un porcentaje, un monto fijo o envío gratis. Guía en la sección de Cupones.", en: "Create a coupon under Marketing → Coupons. You can set a percentage, a fixed amount, or free shipping. Guide in the Coupons section." } },
    { q: { es: "¿Dónde veo cuánto he vendido?", en: "Where do I see how much I've sold?" },
      a: { es: "En WooCommerce → Analytics o en Reportes. Ahí ves ventas, productos más vendidos y pedidos. Más detalle en la sección de Reportes.", en: "In WooCommerce → Analytics or Reports. There you see sales, top products and orders. More detail in the Reports section." } },
    { q: { es: "¿Cómo cambio el precio de un producto?", en: "How do I change a product's price?" },
      a: { es: "Ve a Productos, abre el producto, edita el campo 'Precio' y guarda los cambios con 'Actualizar'.", en: "Go to Products, open the product, edit the 'Price' field and save with 'Update'." } },
    { q: { es: "¿Puedo darle acceso a un empleado?", en: "Can I give access to an employee?" },
      a: { es: "Sí. En Usuarios → Añadir nuevo, crea el usuario y asígnale el rol 'Empleado de tienda' para que vea pedidos y productos, sin tocar la configuración.", en: "Yes. In Users → Add new, create the user and assign the role 'Shop manager' so they can see orders and products without touching settings." } },
    { q: { es: "¿Cómo le devuelvo el dinero a un cliente?", en: "How do I refund a customer?" },
      a: { es: "Abre el pedido y haz clic en 'Reembolsar'. Puedes devolver el monto completo o parcial. Guía en Pedidos.", en: "Open the order and click 'Refund'. You can return the full or partial amount. Guide in Orders." } },
    { q: { es: "¿El cliente recibe un correo cuando compra?", en: "Does the customer receive an email when they buy?" },
      a: { es: "Sí, tu tienda envía correos automáticos: pedido nuevo, confirmación al cliente, pago fallido, etc. Puedes revisar/ajustarlos en WooCommerce → Ajustes → Correos. Sección 'Correos de tu tienda'.", en: "Yes, your store sends automatic emails: new order, customer confirmation, failed payment, etc. You can review/tweak them in WooCommerce → Settings → Emails. See 'Your store emails' section." } },
    { q: { es: "¿Cómo se cambia el texto de la portada?", en: "How do I change the homepage text?" },
      a: { es: "Ve a Páginas → Inicio y edítala con Elementor. Haz clic en el texto y escríbelo nuevo, luego pulsa 'Actualizar'. Sección 'Mi web y contenido'.", en: "Go to Pages → Home and edit it with Elementor. Click the text and type new content, then press 'Update'. See 'My website & content' section." } },
    { q: { es: "¿El hub es seguro? ¿Pueden ver mis datos otros?", en: "Is the hub safe? Can others see my data?" },
      a: { es: "Este hub es solo una guía. No contiene tu contraseña ni datos de clientes. Tu información real está en tu WordPress, protegida con tu acceso.", en: "This hub is just a guide. It doesn't contain your password or customer data. Your real information is in WordPress, protected by your login." } }
  ],

  I18N: {
    es: {
      "topbar.brand": "Guía de tu Tienda",
      "topbar.quick": "Modo rápido",
      "sidebar.home": "Inicio",
      "sidebar.access": "Tu acceso",
      "sidebar.progress": "Tu tienda va al",
      "sidebar.achieve": "Tus logros",
      "hero.title": "¿Qué quieres hacer hoy?",
      "hero.subtitle": "Busca lo que necesitas o elige una sección. Todo está explicado paso a paso.",
      "search.ph": "Escribe aquí… ej. agregar producto, cupón, pedido",
      "search.empty": "No encontré eso. ¿Quieres preguntarnos? Te ayudamos por WhatsApp 👇",
      "home.start": "Empieza aquí",
      "home.start.d": "¿Primera vez en tu tienda? Mira cómo entrar.",
      "home.access": "Tu acceso",
      "home.access.d": "URL de acceso y cómo recuperar tu contraseña.",
      "home.sec": "Secciones",
      "tut.duration": "duración",
      "tut.video": "Ver video",
      "tut.watch": "Ver en YouTube",
      "tut.steps": "Pasos",
      "tut.checklist": "Mi lista de tareas",
      "tut.reset": "Reiniciar",
      "tut.copy": "Copiar enlace de esta guía",
      "tut.copied": "¡Enlace copiado!",
      "tut.back": "← Volver",
      "tut.clickHere": "Haz clic aquí",
      "help.still": "¿Todavía atascado?",
      "help.text": "Escríbenos por WhatsApp y cuéntanos en qué paso vas. ¡Te ayudamos!",
      "fab.help": "Necesito ayuda",
      "faq.title": "Preguntas frecuentes",
      "glossary.title": "Glosario",
      "glossary.d": "Términos de tu tienda explicados en simple.",
      "footer.made": "Hecho con",
      "footer.by": "por Coordenadas.co",
      "footer.shop": "Guía de autogestión de tu tienda online",
      "adv.title": "Ajustes avanzados",
      "adv.desc": "Cosas que quizá quieras tocar una vez cada tanto. Si tienes dudas, escríbenos.",
      "notif.title": "Aviso",
      "notif.storage": "Tu progreso no se guardará en este navegador (modo privado activo).",
      "notif.unlock": "¡Logro desbloqueado!",
      "toast.copy": "Enlace copiado al portapapeles",
      "msg.help": "¡Hola! Necesito ayuda con la guía"
    },
    en: {
      "topbar.brand": "Store Guide",
      "topbar.quick": "Quick mode",
      "sidebar.home": "Home",
      "sidebar.access": "Your access",
      "sidebar.progress": "Your store is at",
      "sidebar.achieve": "Your achievements",
      "hero.title": "What do you want to do today?",
      "hero.subtitle": "Search what you need or pick a section. Everything is explained step by step.",
      "search.ph": "Type here… e.g. add product, coupon, order",
      "search.empty": "I couldn't find that. Want to ask us? We help by WhatsApp 👇",
      "home.start": "Start here",
      "home.start.d": "First time in your store? See how to log in.",
      "home.access": "Your access",
      "home.access.d": "Login URL and how to recover your password.",
      "home.sec": "Sections",
      "tut.duration": "duration",
      "tut.video": "Watch video",
      "tut.watch": "Watch on YouTube",
      "tut.steps": "Steps",
      "tut.checklist": "My task list",
      "tut.reset": "Reset",
      "tut.copy": "Copy link to this guide",
      "tut.copied": "Link copied!",
      "tut.back": "← Back",
      "tut.clickHere": "Click here",
      "help.still": "Still stuck?",
      "help.text": "Message us on WhatsApp and tell us which step you're on. We'll help!",
      "fab.help": "I need help",
      "faq.title": "Frequently asked questions",
      "glossary.title": "Glossary",
      "glossary.d": "Store terms explained simply.",
      "footer.made": "Made with",
      "footer.by": "by Coordenadas.co",
      "footer.shop": "Self-management guide for your online store",
      "adv.title": "Advanced settings",
      "adv.desc": "Things you might want to touch once in a while. If in doubt, message us.",
      "notif.title": "Notice",
      "notif.storage": "Your progress won't be saved in this browser (private mode active).",
      "notif.unlock": "Achievement unlocked!",
      "toast.copy": "Link copied to clipboard",
      "msg.help": "Hi! I need help with the guide"
    }
  }
};
</script>
```

Note: `tutoriales`, `MOCKUPS`, and `ZONAS` are added to this same `DATA` object in Tasks 4–6 by inserting them before the closing `};`. The closing of the object stays after `I18N`; each later task inserts its keys just before the final `};`.

- [ ] **Step 2: Verify**

Run:
```
Select-String -Path "C:\Users\User\Documents\opencode_apps\marketing_brains\Coordenadas\hub-woo.html" -Pattern 'logro-primer-producto','"access"','correos-automaticos' | Measure-Object
```
Expected: count >= 3.

- [ ] **Step 3: Commit**

```bash
git add hub-woo.html
git commit -m "feat: add DATA sections, achievements, glossary, FAQ, I18N"
```

---

### Task 4: DATA — tutoriales de Acceso y Productos

**Files:**
- Modify: `hub-woo.html` — inside `<script id="hub-data">`, insert `tutoriales: [...]` right after the `secciones` array closes (before `logros:`).

- [ ] **Step 1: Insert `tutoriales` array part 1 (acceso + productos)**

The `DATA` object currently starts `const DATA = { secciones: [...], logros: [...] }`. Insert the tutoriales array between `secciones` and `logros`:

```html
  tutoriales: [
    /* ---------- 🔑 Tu acceso ---------- */
    {
      id: "entrar-tienda", sec: "acceso",
      titulo: { es: "Cómo entrar a tu tienda", en: "How to log into your store" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["entrar","login","acceso","panel","administrar","iniciar sesion","wp-admin"],
      intro: { es: "Tu tienda tiene un panel privado donde haces todo: subir productos, ver pedidos y más. Solo tú (y quien tú autorices) puede entrar.", en: "Your store has a private panel where you do everything: upload products, see orders and more. Only you (and who you authorize) can get in." },
      pasos: [
        { texto: { es: "Abre tu navegador (Chrome, Edge o Safari) y escribe la dirección de tu tienda.", en: "Open your browser (Chrome, Edge or Safari) and type your store's address." }, mockup: "dashboard", resaltar: ["barra-direccion"] },
        { texto: { es: "Agrega al final <strong>/wp-admin</strong>. Ejemplo: <strong>tutienda.com/wp-admin</strong>.", en: "Add <strong>/wp-admin</strong> at the end. Example: <strong>yourstore.com/wp-admin</strong>." }, mockup: "login", resaltar: ["campo-usuario"] },
        { texto: { es: "Escribe tu <strong>usuario</strong> y tu <strong>contraseña</strong>, y pulsa <strong>Entrar</strong>.", en: "Type your <strong>username</strong> and <strong>password</strong>, then press <strong>Log In</strong>." }, mockup: "login", resaltar: ["btn-login"] },
        { texto: { es: "¡Listo! Ya estás dentro. Verás el panel de control de tu tienda.", en: "Done! You're in. You'll see your store's dashboard." }, mockup: "dashboard", resaltar: ["panel-bienvenida"] }
      ],
      checklist: [
        { id: "a1", texto: { es: "Abrí la URL de acceso (wp-admin)", en: "Opened the login URL (wp-admin)" } },
        { id: "a2", texto: { es: "Ingresé con mi usuario y contraseña", en: "Logged in with my username and password" } }
      ]
    },
    {
      id: "recuperar-contrasena", sec: "acceso",
      titulo: { es: "Recuperé mi contraseña", en: "I recovered my password" },
      duracion: { es: "2 min", en: "2 min" },
      keywords: ["contrasena","password","olvidar","recuperar","resetear","clave"],
      intro: { es: "Si olvidaste tu contraseña, no te preocupes: WordPress te ayuda a crear una nueva en un par de minutos.", en: "If you forgot your password, don't worry: WordPress helps you create a new one in a couple of minutes." },
      pasos: [
        { texto: { es: "Ve a la pantalla de acceso (tu web + <strong>/wp-admin</strong>).", en: "Go to the login screen (your site + <strong>/wp-admin</strong>)." }, mockup: "login", resaltar: ["link-perdida"] },
        { texto: { es: "Pulsa el enlace <strong>¿Perdiste tu contraseña?</strong>", en: "Click the <strong>Lost your password?</strong> link." }, mockup: "login", resaltar: ["link-perdida"] },
        { texto: { es: "Escribe el <strong>correo de tu cuenta</strong> y pulsa <strong>Obtener nueva contraseña</strong>.", en: "Type your account <strong>email</strong> and press <strong>Get New Password</strong>." }, mockup: "login", resaltar: ["campo-usuario"] },
        { texto: { es: "Abre tu correo y pulsa el enlace que te llegó para crear una contraseña nueva.", en: "Open your email and click the link you received to create a new password." }, mockup: "login", resaltar: ["btn-login"] }
      ],
      checklist: [
        { id: "r1", texto: { es: "Pedí un correo de recuperación", en: "Requested a recovery email" } },
        { id: "r2", texto: { es: "Creé mi contraseña nueva", en: "Created my new password" } }
      ]
    },
    {
      id: "seguridad-basica", sec: "acceso",
      titulo: { es: "Seguridad básica de tu cuenta", en: "Basic account security" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["seguridad","cerrar sesion","logout","clave","proteger"],
      intro: { es: "Algunos hábitos simples mantienen tu tienda segura.", en: "A few simple habits keep your store safe." },
      pasos: [
        { texto: { es: "Usa una contraseña <strong>larga y única</strong> (no la repitas en otros sitios).", en: "Use a <strong>long, unique password</strong> (don't reuse it on other sites)." }, mockup: "dashboard", resaltar: ["panel-bienvenida"] },
        { texto: { es: "Cuando termines de trabajar, pulsa <strong>Cerrar sesión</strong> (abajo a la izquierda del panel).", en: "When you finish, click <strong>Log Out</strong> (bottom left of the panel)." }, mockup: "dashboard", resaltar: ["menu-cerrar"] },
        { texto: { es: "No compartas tu contraseña con nadie. Si un empleado necesita acceso, crea un usuario aparte.", en: "Don't share your password. If an employee needs access, create a separate user." }, mockup: "dashboard", resaltar: ["menu-cerrar"] }
      ],
      checklist: [
        { id: "s1", texto: { es: "Cambié mi contraseña por una segura", en: "Changed my password to a secure one" } },
        { id: "s2", texto: { es: "Sé dónde cerrar sesión", en: "I know where to log out" } }
      ]
    },

    /* ---------- 📦 Productos y catálogo ---------- */
    {
      id: "crear-producto", sec: "productos",
      titulo: { es: "Agregar un producto nuevo", en: "Add a new product" },
      duracion: { es: "3 min", en: "3 min" },
      video: "crear-producto",
      keywords: ["producto","agregar","nuevo","añadir","crear","precio","publicar"],
      intro: { es: "Vamos a crear tu primer producto: título, precio, descripción y foto. Después lo publicas y ya se ve en tu tienda.", en: "Let's create your first product: title, price, description and photo. Then you publish it and it shows up in your store." },
      pasos: [
        { texto: { es: "En el menú izquierdo ve a <strong>Productos</strong> → <strong>Añadir nuevo</strong>.", en: "In the left menu go to <strong>Products</strong> → <strong>Add New</strong>." }, mockup: "lista-productos", resaltar: ["btn-nuevo"] },
        { texto: { es: "Escribe el <strong>título</strong> del producto (ej. 'Camisa azul').", en: "Type the product <strong>title</strong> (e.g. 'Blue shirt')." }, mockup: "editor-producto", resaltar: ["campo-titulo"] },
        { texto: { es: "En el panel derecho escribe el <strong>precio</strong>. El precio de venta puede ser distinto del precio regular.", en: "In the right panel type the <strong>price</strong>. The sale price can differ from the regular price." }, mockup: "editor-producto", resaltar: ["campo-precio"] },
        { texto: { es: "Escribe una <strong>descripción</strong> corta y clara de lo que vendes.", en: "Write a short, clear <strong>description</strong> of what you sell." }, mockup: "editor-producto", resaltar: ["campo-desc"] },
        { texto: { es: "Pulsa el botón <strong>Publicar</strong> (derecha, arriba). ¡Tu producto ya está en venta!", en: "Press the <strong>Publish</strong> button (top right). Your product is now live!" }, mockup: "editor-producto", resaltar: ["btn-publicar"] }
      ],
      checklist: [
        { id: "p1", texto: { es: "Entré a Productos → Añadir nuevo", en: "Went to Products → Add New" } },
        { id: "p2", texto: { es: "Escribí título y precio", en: "Wrote title and price" } },
        { id: "p3", texto: { es: "Agregué una descripción", en: "Added a description" } },
        { id: "p4", texto: { es: "Publiqué el producto", en: "Published the product" } }
      ]
    },
    {
      id: "tipos-producto", sec: "productos",
      titulo: { es: "Tipos de producto en WooCommerce", en: "Product types in WooCommerce" },
      duracion: { es: "4 min", en: "4 min" },
      video: "tipos-producto",
      keywords: ["tipo","simple","variable","agrupado","afiliado","suscripcion","clases"],
      intro: { es: "WooCommerce tiene varios tipos de producto. Esta guía te explica cuál usar según lo que vendes.", en: "WooCommerce has several product types. This guide explains which to use based on what you sell." },
      pasos: [
        { texto: { es: "<strong>Producto simple</strong>: un producto normal con un precio (la mayoría de tus productos).", en: "<strong>Simple product</strong>: a normal product with one price (most of your products)." }, mockup: "editor-producto", resaltar: ["select-tipo"] },
        { texto: { es: "<strong>Producto variable</strong>: cuando hay versiones con precio distinto, como tallas o colores.", en: "<strong>Variable product</strong>: when there are versions with different prices, like sizes or colors." }, mockup: "editor-producto", resaltar: ["select-tipo"] },
        { texto: { es: "<strong>Producto agrupado</strong>: un grupo de productos que se venden juntos (ej. un set).", en: "<strong>Grouped product</strong>: a group of products sold together (e.g. a set)." }, mockup: "editor-producto", resaltar: ["select-tipo"] },
        { texto: { es: "Elige el tipo en el desplegable <strong>Datos del producto</strong> antes de llenar el precio.", en: "Pick the type in the <strong>Product data</strong> dropdown before filling the price." }, mockup: "editor-producto", resaltar: ["select-tipo"] }
      ],
      checklist: [
        { id: "t1", texto: { es: "Identifico qué tipo de producto necesito", en: "I know which product type I need" } }
      ]
    },
    {
      id: "subir-fotos", sec: "productos",
      titulo: { es: "Subir fotos a un producto", en: "Upload photos to a product" },
      duracion: { es: "2 min", en: "2 min" },
      video: "subir-fotos",
      keywords: ["foto","fotos","imagen","imagenes","subir","galeria","producto","borrosa"],
      intro: { es: "Una buena foto vende. Aquí te muestro cómo subir la foto principal y varias fotos extra de tu producto.", en: "A good photo sells. Here's how to upload the main photo and extra photos for your product." },
      pasos: [
        { texto: { es: "Abre el producto y busca la caja <strong>Imagen del producto</strong> (a la derecha).", en: "Open the product and find the <strong>Product image</strong> box (on the right)." }, mockup: "editor-producto", resaltar: ["img-drop"] },
        { texto: { es: "Haz clic en <strong>Definir imagen del producto</strong> y elige la foto desde tu computadora.", en: "Click <strong>Set product image</strong> and choose the photo from your computer." }, mockup: "editor-producto", resaltar: ["img-drop"] },
        { texto: { es: "Para varias fotos, usa la caja <strong>Galería del producto</strong> (justo debajo) y agrega todas las que quieras.", en: "For multiple photos, use the <strong>Product gallery</strong> box (right below) and add as many as you want." }, mockup: "editor-producto", resaltar: ["img-drop"] },
        { texto: { es: "Usa fotos grandes y nítidas (mínimo 1000px). Si una se ve borrosa, revisa la guía 'arreglar imágenes borrosas'.", en: "Use large, sharp photos (min 1000px). If one looks blurry, check the 'fix blurry images' guide." }, mockup: "editor-producto", resaltar: ["img-drop"] }
      ],
      checklist: [
        { id: "f1", texto: { es: "Subí la foto principal", en: "Uploaded the main photo" } },
        { id: "f2", texto: { es: "Agregué fotos de galería", en: "Added gallery photos" } }
      ]
    },
    {
      id: "cambiar-precio-stock", sec: "productos",
      titulo: { es: "Cambiar precio o stock", en: "Change price or stock" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["precio","cambiar","stock","existencia","cantidad","editar","producto"],
      intro: { es: "Cambiar el precio o la cantidad disponible es muy fácil y no necesitas volver a publicar el producto.", en: "Changing the price or available quantity is easy and you don't need to re-publish the product." },
      pasos: [
        { texto: { es: "Ve a <strong>Productos</strong> y haz clic en el producto que quieres cambiar.", en: "Go to <strong>Products</strong> and click the product you want to change." }, mockup: "lista-productos", resaltar: ["fila-producto"] },
        { texto: { es: "Edita el <strong>precio</strong> en el panel derecho.", en: "Edit the <strong>price</strong> in the right panel." }, mockup: "editor-producto", resaltar: ["campo-precio"] },
        { texto: { es: "En <strong>Datos del producto</strong> → <strong>Inventario</strong>, cambia el <strong>stock</strong>.", en: "In <strong>Product data</strong> → <strong>Inventory</strong>, change the <strong>stock</strong>." }, mockup: "editor-producto", resaltar: ["campo-stock"] },
        { texto: { es: "Pulsa <strong>Actualizar</strong> para guardar los cambios.", en: "Press <strong>Update</strong> to save changes." }, mockup: "editor-producto", resaltar: ["btn-actualizar"] }
      ],
      checklist: [
        { id: "c1", texto: { es: "Cambié el precio correcto", en: "Changed the correct price" } },
        { id: "c2", texto: { es: "Actualicé el stock", en: "Updated the stock" } },
        { id: "c3", texto: { es: "Guardé con Actualizar", en: "Saved with Update" } }
      ]
    },
    {
      id: "categorias-etiquetas", sec: "productos",
      titulo: { es: "Organizar con categorías y etiquetas", en: "Organize with categories and tags" },
      duracion: { es: "2 min", en: "2 min" },
      video: "categorias-etiquetas",
      keywords: ["categoria","categorias","etiqueta","organizar","clasificar","producto"],
      intro: { es: "Las categorías agrupan tus productos (Ropa, Accesorios). Las etiquetas son palabras clave más específicas. Así tus clientes encuentran lo que buscan.", en: "Categories group your products (Clothing, Accessories). Tags are more specific keywords. This way your customers find what they're looking for." },
      pasos: [
        { texto: { es: "Ve a <strong>Productos</strong> → <strong>Categorías</strong>.", en: "Go to <strong>Products</strong> → <strong>Categories</strong>." }, mockup: "categorias", resaltar: ["btn-nueva-cat"] },
        { texto: { es: "Escribe el <strong>nombre</strong> de la categoría y pulsa <strong>Añadir nueva categoría</strong>.", en: "Type the category <strong>name</strong> and press <strong>Add New Category</strong>." }, mockup: "categorias", resaltar: ["campo-nombre-cat"] },
        { texto: { es: "Para asignar la categoría, abre el producto y márcala en el cuadro <strong>Categorías del producto</strong>.", en: "To assign it, open the product and check it in the <strong>Product categories</strong> box." }, mockup: "editor-producto", resaltar: ["caja-categorias"] },
        { texto: { es: "Las etiquetas funcionan igual: escríbelas separadas por coma en el cuadro <strong>Etiquetas del producto</strong>.", en: "Tags work the same: write them comma-separated in the <strong>Product tags</strong> box." }, mockup: "editor-producto", resaltar: ["caja-categorias"] }
      ],
      checklist: [
        { id: "cc1", texto: { es: "Creé mi primera categoría", en: "Created my first category" } },
        { id: "cc2", texto: { es: "Asigné categorías/etiquetas a un producto", en: "Assigned categories/tags to a product" } }
      ]
    },
    {
      id: "imagen-categoria", sec: "productos",
      titulo: { es: "Imagen de una categoría", en: "Category image" },
      duracion: { es: "1 min", en: "1 min" },
      video: "imagen-categoria",
      keywords: ["categoria","imagen","foto","categorias","portada"],
      intro: { es: "Dale una imagen a cada categoría para que tu catálogo se vea profesional.", en: "Give each category an image so your catalog looks professional." },
      pasos: [
        { texto: { es: "Ve a <strong>Productos</strong> → <strong>Categorías</strong> y haz clic en la categoría.", en: "Go to <strong>Products</strong> → <strong>Categories</strong> and click the category." }, mockup: "categorias", resaltar: ["btn-nueva-cat"] },
        { texto: { es: "Busca el campo <strong>Imagen</strong> y pulsa <strong>Subir/Añadir imagen</strong>.", en: "Find the <strong>Image</strong> field and press <strong>Upload/Add image</strong>." }, mockup: "categorias", resaltar: ["img-cat"] },
        { texto: { es: "Elige la foto y pulsa <strong>Actualizar</strong>.", en: "Choose the photo and press <strong>Update</strong>." }, mockup: "categorias", resaltar: ["btn-actualizar-cat"] }
      ],
      checklist: [
        { id: "ic1", texto: { es: "Agregué imagen a mi categoría", en: "Added an image to my category" } }
      ]
    },
    {
      id: "variaciones", sec: "productos",
      titulo: { es: "Variaciones (tallas y colores)", en: "Variations (sizes and colors)" },
      duracion: { es: "4 min", en: "4 min" },
      video: "variaciones",
      keywords: ["variacion","variaciones","talla","color","tamano","atributo","producto variable"],
      intro: { es: "Si vendes una camisa en tallas S, M, L, usa un producto variable. Cada variación puede tener su propio precio y stock.", en: "If you sell a shirt in sizes S, M, L, use a variable product. Each variation can have its own price and stock." },
      pasos: [
        { texto: { es: "En el producto, cambia el tipo a <strong>Producto variable</strong> en <strong>Datos del producto</strong>.", en: "On the product, change the type to <strong>Variable product</strong> in <strong>Product data</strong>." }, mockup: "editor-producto", resaltar: ["select-tipo"] },
        { texto: { es: "Ve a la pestaña <strong>Atributos</strong> y agrega los atributos (Talla, Color) con sus valores.", en: "Go to the <strong>Attributes</strong> tab and add the attributes (Size, Color) with their values." }, mockup: "variaciones", resaltar: ["tab-atributos"] },
        { texto: { es: "Ve a la pestaña <strong>Variaciones</strong> y pulsa <strong>Generar variaciones</strong> (o Añadir manualmente).", en: "Go to the <strong>Variations</strong> tab and press <strong>Generate variations</strong> (or Add manually)." }, mockup: "variaciones", resaltar: ["btn-generar-var"] },
        { texto: { es: "Define precio y stock de cada variación y pulsa <strong>Actualizar</strong>.", en: "Set price and stock for each variation and press <strong>Update</strong>." }, mockup: "variaciones", resaltar: ["btn-var-save"] }
      ],
      checklist: [
        { id: "v1", texto: { es: "Cambié el tipo a variable", en: "Changed type to variable" } },
        { id: "v2", texto: { es: "Agregué atributos (talla/color)", en: "Added attributes (size/color)" } },
        { id: "v3", texto: { es: "Generé las variaciones con precio y stock", en: "Generated variations with price and stock" } }
      ]
    },
    {
      id: "producto-agrupado", sec: "productos",
      titulo: { es: "Producto agrupado (sets)", en: "Grouped product (sets)" },
      duracion: { es: "2 min", en: "2 min" },
      video: "producto-agrupado",
      keywords: ["agrupado","grupo","set","combo","paquete","producto"],
      intro: { es: "Un producto agrupado combina varios productos simples que se venden juntos, como un set de cuidado personal.", en: "A grouped product combines several simple products sold together, like a self-care set." },
      pasos: [
        { texto: { es: "Crea los productos individuales primero (ej. Shampoo, Acondicionador).", en: "Create the individual products first (e.g. Shampoo, Conditioner)." }, mockup: "lista-productos", resaltar: ["btn-nuevo"] },
        { texto: { es: "Crea un producto nuevo y elige tipo <strong>Producto agrupado</strong>.", en: "Create a new product and pick type <strong>Grouped product</strong>." }, mockup: "editor-producto", resaltar: ["select-tipo"] },
        { texto: { es: "En <strong>Productos agrupados</strong>, busca y agrega los productos que van en el set.", en: "In <strong>Grouped products</strong>, search and add the products that go in the set." }, mockup: "editor-producto", resaltar: ["campo-buscar-agrupado"] },
        { texto: { es: "Pulsa <strong>Publicar</strong>. El cliente compra el set completo en un solo carrito.", en: "Press <strong>Publish</strong>. The customer buys the full set in one cart." }, mockup: "editor-producto", resaltar: ["btn-publicar"] }
      ],
      checklist: [
        { id: "g1", texto: { es: "Creé el producto agrupado", en: "Created the grouped product" } },
        { id: "g2", texto: { es: "Agregué los productos del set", en: "Added the products in the set" } }
      ]
    },
    {
      id: "quitar-producto", sec: "productos",
      titulo: { es: "Quitar o desactivar un producto", en: "Remove or disable a product" },
      duracion: { es: "1 min", en: "1 min" },
      keywords: ["quitar","borrar","eliminar","desactivar","papelera","producto","agotado"],
      intro: { es: "Si un producto se agotó o ya no lo vendes, puedes desactivarlo o borrarlo. Desactivarlo es más seguro por si lo quieres reactivar después.", en: "If a product sold out or you no longer sell it, you can disable or delete it. Disabling is safer in case you want to reactivate it later." },
      pasos: [
        { texto: { es: "Ve a <strong>Productos</strong> y pasa el mouse sobre el producto.", en: "Go to <strong>Products</strong> and hover over the product." }, mockup: "lista-productos", resaltar: ["fila-producto"] },
        { texto: { es: "Para desactivarlo: en el menú de acciones elige <strong>Papelera</strong> (se guarda por 30 días).", en: "To disable it: in the actions menu choose <strong>Trash</strong> (kept for 30 days)." }, mockup: "lista-productos", resaltar: ["acciones-fila"] },
        { texto: { es: "Para ocultarlo sin borrarlo: cambia el estado de <strong>Publicado</strong> a <strong>Borrador</strong>.", en: "To hide it without deleting: change status from <strong>Published</strong> to <strong>Draft</strong>." }, mockup: "editor-producto", resaltar: ["select-estado"] }
      ],
      checklist: [
        { id: "q1", texto: { es: "Desactivé o borré el producto correcto", en: "Disabled or deleted the correct product" } }
      ]
    }
  ],
```