Plataforma de ejercicios interactivos de inglés — vocabulario, pronunciación, gramática y producción. Parte del Learn Platform (junto a DeskFlow, FluentFlow y LyricFlow).
Autor: Genil Suárez
- HTML5 + CSS3 + Vanilla JS (ES modules) — sin build step, se sirve directo.
- Tokens de diseño compartidos
--lp-*(mismo sistema que DeskFlow y LyricFlow). - Tipografía: Newsreader (display) + Manrope (UI).
HubFlow/
├── index.html # Dashboard SPA: categorías + "Mi Progreso" (rutas de aprendizaje)
├── exercises/ # 150 páginas de ejercicio, una por módulo
├── guides/ # 30 páginas de referencia (reglas, tablas, consulta rápida)
├── data/ # Un archivo por módulo con el contenido del ejercicio (153 archivos)
│ └── catalog.js # Metadata de los 150 módulos (título, categoría, CEFR, scoreKey...) + MODULE_DEPTH (items/categorías/modos derivados del contenido real)
├── css/
│ ├── base.css # Tokens --lp-*, reset, tipografía
│ ├── buttons.css # Sistema de botones compartido (.lp-btn/.lp-icon-btn/.lp-pill)
│ ├── components.css # Top-bar, categorías, progreso, flashcards
│ └── *-shell.css # Estilos propios de cada familia de ejercicio
├── js/
│ ├── *-engine.js # Un motor por familia de ejercicio (flashcard, spelling, sentence-quiz, typed-answer, dictation)
│ ├── array-utils.js # shuffle
│ ├── progress-store.js # recordScore, progress tracking, cloud sync
│ ├── exercise-ui.js # renderCatBar, mode tabs, Timer, progress bar
│ ├── exercise-flow.js # finishExercise, advanceStudyCard, createMatchMode
│ ├── speech.js # Web Speech API (speak, isSpeechAvailable)
│ ├── exercise-shell.js # Sidebar, header homologation, back-nav (replaces portal-link.js)
│ ├── lp-theme.js # Lee ?theme=/localStorage antes del primer paint
│ ├── lp-nav-helpers.js # themedAppHref, toggleTheme, navIcon
│ └── lp-about.js # Modal "About LearnFlow"
├── scripts/
│ ├── validate-content.js # Valida data/*.js antes de deployar (bloqueante)
│ ├── sync-catalog.mjs # Deriva MODULE_DEPTH real (items/categorías/modos) desde data/*.js y exercises/*.html
│ ├── analyze-content.mjs
│ └── lib/derive-catalog.mjs
└── build.sh # Commit + push + espera CI Validate/CD Deploy
| Categoría | Módulos | Items | CEFR |
|---|---|---|---|
| Vocabulary & Words | 50 | 2.500 | A1–C1 |
| Grammar & Spelling | 50 | 2.000 | A1–C1 |
| Pronunciation | 25 | 1.000 | A1–C1 |
| Analysis & Production | 25 | 1.000 | A1–C1 |
| Total | 150 | 6.500 | A1–C1 |
Los números de esta tabla se derivan del contenido real en data/*.js — no son un conteo manual. node scripts/sync-catalog.mjs --check falla si catalog.js se desincroniza del contenido real. El inventario dinámico que antes vivía en docs/inventory.html se movió a Learn/index.html — ahora es un panel único para las 3 apps de contenido (FluentFlow, HubFlow, LyricFlow), servido vía learnctl en http://localhost:3000/panel/.
Feature del dashboard que ofrece 6 rutas transversales (cruzan 3+ categorías) con propósito pedagógico. No bloquean acceso — son sugerencias de progresión.
| Ruta | CEFR | Secciones cruzadas |
|---|---|---|
| ✏️ Spell It Right | A1 → B1 | G + P + V + A |
| 🧱 Build Sentences | A1 → B1 | G + V + A |
| 👂 Decode Speech | A2 → B1 | P + V + A |
| 🗣️ Sound Natural | A2 → B1 | V + G + P + A |
| 🔄 Transform & Produce | A2 → B1 | G + A + V |
| 🏆 Advanced Mastery | B2 → C1 | G + A + V |
El progreso se calcula leyendo los scoreKey existentes de localStorage (≥60% = completado).
Cada ejercicio importa uno de estos motores compartidos según su tipo:
| Motor | CSS asociado | Patrón de modos | Ejemplos |
|---|---|---|---|
flashcard-engine.js |
flashcard-shell.css |
Study / Quiz / Match / Battle / Timed | vocabulary, opposites, pronunciation-study |
spelling-engine.js |
spelling-shell.css |
Niveles: Beginner / Intermediate / Exceptions / God Mode | ed-spelling, ing-spelling, noun-adjuncts |
sentence-quiz-engine.js |
sentence-quiz.css |
Study / Practice / Timed + categorías (.cat-btn) |
articles, conditionals, inversions, cleft-emphasis... |
typed-answer-engine.js |
typed-answer-shell.css |
Study / Practice / Timed, respuesta escrita | paraphrasing, word-order, register-switch... |
| — (standalone) | exercise-enhanced.css |
Cada página maneja su propio estado | confusing-words, listening, error-hunt... |
Cada familia usa [data-color="..."] en su wrapper para tomar el color de categoría (--lp-cat-*).
css/buttons.css define las 3 primitivas compartidas con DeskFlow/LyricFlow: .lp-btn (acción), .lp-icon-btn (icono circular), .lp-pill (tab). Hit-area mínimo 44×44px, radios solo desde --lp-radius-md/--lp-radius-full/círculo.
Desde el repo Learn (raíz de la plataforma):
learnctl start # → http://localhost:3000/hubflow/No uses npx serve ni python -m http.server en puertos sueltos — el gateway en 3000 comparte localStorage con DeskFlow, FluentFlow y LyricFlow.
build.sh hace commit + push y espera (no bloqueante) a que terminen los workflows CI Validate y CD Deploy en GitHub Actions. CD Deploy solo publica en GitHub Pages si CI Validate pasó primero.