diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f799f9e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,129 @@ +# AGENTS.md - Directrices para el Agente + +## Preferencias de Comportamiento + +- **Idioma**: Responder siempre en español. +- **Commits**: Redactar en inglés, usando `feat:`, `fix:`, `docs:`, `style:`, `refactor:`, `test:`, `chore:` +- **Seguridad**: Nunca modificar archivos sin confirmación previa +- **Proactividad**: Sugerir mejoras durante análisis del código + +## Stack Tecnológico Habitual (Backend) + +- **Lenguaje**: Python 3.10+ +- **Framework (POR DEFECTO)**: Django +- **Alternativa**: FastAPI (solo si solicitado) +- **Base de datos**: MySQL/InnoDB (PostgreSQL solo si solicitado) +- **ORM**: Django ORM (SQLAlchemy para FastAPI) +- **Migraciones**: Django nativo (`makemigrations`/`migrate`, Alembic si es FastAPI) + +## Stack Tecnológico Habitual (Frontend y Estilos) + +- **Lenguaje**: TypeScript (siempre que haya cliente separada con React/Vue/Angular) +- **Estilos**: Tailwind CSS (utility-first) sobre CSS puro + +## Convenciones de Desarrollo + +- **Variables de entorno**: Usar `.env` + `python-dotenv`/`django-environ`, nunca hardcodear credenciales +- **Dependencias**: Mantener actualizado `requirements.txt` o `pyproject.toml` +- **Estructura**: Separación clara (configuración, modelos, servicios, utilidades) +- **Pruebas**: Usar `pytest`/`unittest`, verificar que pasen antes de completar +- **Manejo de errores**: Middleware personalizado o vistas de error en Django + +## Flujo de Trabajo Típico + +1. Análisis (leer y entender contexto) +2. Planificación (proposición paso a paso si es complejo) +3. Implementación (siguiendo PEP 8/ESLint) +4. Documentación (actualizar README.md si hay nuevos commandos) +5. Control de versiones (commits atómicos, ramas `feature/` o `fix/`) + +## Instrucciones Específicas para este Repositorio + +### Arquitectura General + +- **Estructura**: Sitio web estático con HTML/CSS/JS puro (sin frameworks ni build tools) +- **Componentes Modulares**: Header y footer cargados dinámicamente via `fetch()` (js/main.js:25-60) + - **Header**: Incluye botón 'HABLEMOS' y toggle de tema (includes/header.html) + - **Footer**: Información de contacto e identificación fiscal (includes/footer.html) +- **Temas**: Dark/light mode con persistencia usando localStorage (js/main.js:143-183) + - Variables CSS en `css/styles.css`: + ```css + --bg-primary + --text-body + --ide-primary + --ide-dark + ``` + - Toggle actualiza atributo `data-theme` y cambia íconos de logo (js/main.js:150-183) + +### Implementación Clave + +**Theme Switcher (js/main.js)**: +```javascript +// Inicialización (ejecutado al cargar DOM) +function initTheme() { + const savedTheme = localStorage.getItem('ide_theme') || 'light'; + document.documentElement.setAttribute('data-theme', savedTheme); + updateThemeIcon(savedTheme); + toggleLogoTheme(savedTheme); +} + +// Toggle (event handler) +function toggleTheme() { + const currentTheme = document.documentElement.getAttribute('data-theme') || 'light'; + const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; + document.documentElement.setAttribute('data-theme', newTheme); + localStorage.setItem('ide_theme', newTheme); + updateThemeIcon(newTheme); + toggleLogoTheme(newTheme); +} +``` + +**Navegación Móvil**: sistema de drawer con: +- Botón hamburguesa (abre) +- Overlay (cierra al hacer clic) +- Cierre con ESC +- Enlaces que cierran automáticamente +- Atributos ARIA para accesibilidad (js/main.js:94-133) + +**Cursos Dinámicos**: +- cargados desde `/data/cursos.json` +- Fallback con datos mock en `getFallbackCourses()` (js/main.js:608-625) +- Modales dinámicos para detalles de cursos + +### Estructura de directorios clave + +``` +project/ +├── includes/ +│ ├── header.html # Header modular +│ └── footer.html # Footer modular +├── css/ +│ └── styles.css # Estilos principales (variables `--ide-primary`, `--ide-dark`) +├── js/ +│ └── main.js # JavaScript principal (890 líneas) +├── images/ # Imágenes y logos +└── data/ + └── cursos.json # Datos de cursos +``` + +### Páginas principales + +- `index.html` - Página inicial con hero y Brújula IDE +- `soluciones.html` - Soluciones con filtrado dinámico (js/main.js:630-654) +- `academy.html` - Cursos y formación +- `desafios.html` - Quiz interactivo (JS embedded) +- `contacto.html` - Formulario de contacto con AJAX (js/main.js:798-841) + +### Funcionalidades destacadas + +1. **Sistema de modales**: Pop-ups con cierre por clic externo y tecla ESC (js/main.js:188-243) +2. **Formularios AJAX**: envío a `/php/send-mail.php` con mensajería de suceso/falla (js/main.js:798-890) +3. **Feed Insights**: WordPress REST API + fallback de artículos (js/main.js:659-754) + +### Notes importantes para el desarrollo + +1. **Path corregido**: Usar & y Desarrollo (no Development) en todos los paths +2. **Sin frameworks**: No hay React, Vue, ni herramientas de build - todo es Vanilla JS +3. **Fallbacks implementados**: Siempre verificar fallbacks para API y datos remotos +4. **Persistencia**: El tema se guarda en localStorage (`ide_theme`) +5. **Testing visual**: Revisar temas dark/light en navegadores moderno diff --git a/assets/iconos/iconos.svg b/assets/iconos/iconos.svg new file mode 100644 index 0000000..2930182 --- /dev/null +++ b/assets/iconos/iconos.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/styles.css b/css/styles.css index 4e3dc07..b862492 100644 --- a/css/styles.css +++ b/css/styles.css @@ -55,6 +55,7 @@ --bg-subtle: #24333E; --border-color: #2D3D4A; --border-subtle: #1F2C36; + --ide-primary-light: #40ab8e; --ide-excellence: #4fb389; --ide-projects: #ed8d01; --ide-academy: #a83c41; @@ -168,6 +169,18 @@ p, li, .lead-text, .text-body, .text-muted { font-family: 'Plus Jakarta Sans', sans-serif; } +.icono { + width: 24px; + height: 24px; + color: var(--ide-primary); /* ← Funciona con currentColor */ + transition: color 0.3s; + vertical-align: middle; +} + +.icono:hover { + fill: #ff6b6b; +} + .lead-text { font-size: 1.15rem; color: var(--text-muted); @@ -647,7 +660,189 @@ p, li, .lead-text, .text-body, .text-muted { color: var(--text-main); margin-bottom: 0.25rem; } +/* ================================================================ + ESTILOS QUIZ REFACTORIZADO + ================================================================ */ +/* ---- Contenedor principal (estilo Opción A) ---- */ +.quiz-container { + background: var(--bg-card, #ffffff); + border-radius: 1.25rem; + padding: 2.5rem 2.75rem; + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.06); + max-width: 860px; + margin: 0 auto; + transition: all 0.25s ease; +} + +.quiz-header { + display: flex; + justify-content: space-between; + align-items: flex-end; + margin-bottom: 1.5rem; +} + +/* ---- Barra de progreso (estilo Opción A) ---- */ +.quiz-progress-bar { + width: 100%; + height: 6px; + background: var(--bg-muted, #e9ecef); + border-radius: 8px; + overflow: hidden; + margin-bottom: 2rem; +} + +.quiz-progress-fill { + height: 100%; + width: 0%; + background: var(--ide-accent, #0066cc); + border-radius: 8px; + transition: width 0.45s ease; +} + +/* ---- Steps ---- */ +.quiz-step { + display: none; + animation: fadeUp 0.35s ease; +} + +.quiz-step.active { + display: block; +} + +@keyframes fadeUp { + from { opacity: 0; transform: translateY(12px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ---- Grid de opciones (estilo Opción A) ---- */ +.quiz-options-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.85rem; + margin-top: 1rem; +} + +.quiz-options-grid--2col { + grid-template-columns: 1fr 1fr; +} + +/* ---- Cards de opción (estilo Opción A) ---- */ +.quiz-option-card { + display: flex; + align-items: flex-start; + gap: 0.75rem; + padding: 1rem 1.25rem; + background: var(--bg-body); + border: 2px solid transparent; + border-radius: 0.85rem; + cursor: pointer; + transition: all 0.2s ease; +} + +.quiz-option-card:hover { + background: var(--bg-hover, #f1f3f5); + border-color: var(--border-hover, #dee2e6); +} + +.quiz-option-card.selected { + background: var(--ide-primary-light, #e6f0ff); + border-color: var(--ide-primary, #0066cc); + box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.12); +} + +.quiz-radio-bullet { + width: 18px; + height: 18px; + min-width: 18px; + border-radius: 50%; + border: 2px solid var(--border-color, #ced4da); + background: #fff; + margin-top: 2px; + transition: all 0.2s ease; +} + +.quiz-option-card.selected .quiz-radio-bullet { + border-color: var(--ide-primary, #0066cc); + background: var(--ide-primary, #0066cc); + box-shadow: inset 0 0 0 4px #fff, 0 0 0 2px var(--ide-primary, #0066cc); +} + +/* ---- Botón volver ---- */ +.quiz-back-btn { + background: none; + border: none; + color: var(--text-muted, #6c757d); + font-size: 0.9rem; + cursor: pointer; + padding: 0.4rem 0.8rem; + border-radius: 0.4rem; + transition: all 0.2s ease; +} + +.quiz-back-btn:hover { + color: var(--text-body, #212529); + background: var(--bg-hover, #f1f3f5); +} + +/* ---- Resultado---- */ +.quiz-result-box { + background: var(--bg-card-alt, #f8faff); + border-radius: 1.25rem; + padding: 2rem 2.25rem; + border: 1px solid var(--border-light, #e9ecef); +} + +.quiz-result-box .result-chip { + display: inline-block; + border: 1px solid var(--ide-primary-light); + color: var(--ide-primary-light); + padding: 0.25rem 0.85rem; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; +} + +/* ---- Badge ---- */ +.ecosystem-badge { + display: inline-block; + padding: 0.2rem 0.85rem; + border-radius: 20px; + font-weight: 600; + letter-spacing: 0.3px; + text-transform: uppercase; +} + +.badge-project { + background: var(--ide-accent-light, #e6f0ff); + color: var(--ide-accent, #0066cc); +} + +/* ---- Responsive ---- */ +@media (max-width: 640px) { + .quiz-container { + padding: 1.5rem; + } + + .quiz-options-grid { + grid-template-columns: 1fr; + } + + .quiz-options-grid--2col { + grid-template-columns: 1fr; + } + + .quiz-header { + flex-direction: column; + align-items: flex-start; + gap: 0.5rem; + } + + .quiz-header > div:last-child { + text-align: left !important; + align-self: flex-start; + } +} /* --- 9. Bloque 2: La Tensión y El Quiebre .tension-box { background-color: var(--bg-surface); diff --git a/index.html b/index.html index 300a919..363cd67 100644 --- a/index.html +++ b/index.html @@ -11,9 +11,11 @@ + + @@ -111,186 +113,376 @@ - -
+ +
-
- -
-
- HERRAMIENTA DE CONSULTORÍA INTERACTIVA -

La Brújula IDE: Diagnóstico Rápido de Conectividad

-

- ¿No estás seguro de por dónde empezar? Respondé 2 preguntas breves y te orientamos sobre qué capacidades pueden aportar mayor valor a tu contexto. -

+
+ + +
+
+
+ ENCONTRÁ TU CAMINO +

¿Por dónde empezamos?

+

+ Respondé 4 preguntas breves y te orientamos sobre qué capacidades pueden aportar mayor valor a tu contexto. +

+
-
- Paso 1 de 3 +
+ Paso 1 de 4
- -
-
+ +
+
- -
-

1. ¿Cuál es tu prioridad u objetivo principal hoy?

-

Seleccioná la opción que mejor represente lo que buscan impulsar:

- -
-
-
+ +
+

¿Qué describe mejor tu situación hoy?

+

Seleccioná la opción que mejor represente tu contexto:

+ +
+
- Mejorar la gestión y cumplir normas (ISO) - Ordenar procesos, certificar ISO 9001/14001/45001 y elevar la calidad. + + + + + + Algo no está funcionando + + + Tengo un problema, pero no sé bien qué solución necesito. +
-
-
+
- Ejecutar proyectos con resultados garantizados - Profesionalizar la gestión, crear una PMO y evitar desvíos en plazos. + 🎯 Sé qué quiero lograr + Tengo un objetivo claro, pero no sé cómo alcanzarlo.
-
-
+
- Desarrollar las capacidades de mi equipo - Capacitación In-Company, liderazgo, pensamiento de procesos y cultura. + ⚙️ Sé exactamente qué necesito + Busco ISO, PMO, transformación digital u otra solución concreta.
-
-
+
- Integrar tecnología, automatización o IA - Transformar digitalmente las tareas rutinarias y aprovechar datos. + 📚 Quiero aprender o formarme + Busco formación, capacitación o conocimiento especializado.
- -
- -
-

2. ¿Qué es lo que más dificulta avanzar en este momento?

-

Identifiquemos la raíz que suele frenar los resultados:

- -
-
-
+ +
+

¿En qué área sentís que algo no funciona como debería?

+

Identifiquemos el área crítica:

+ +
+
- Falta de claridad en los procesos - Las áreas trabajan en silos y la información no fluye adecuadamente. + 📊 Gestión y procesos + Los procesos no son eficientes o no están claros.
-
-
+
- Los proyectos se retrasan o se desvían - Cuesta concretar las iniciativas estratégicas en tiempo y forma. + 📌 Proyectos y resultados + Los proyectos no llegan a destino o se desvían.
-
-
+
- El equipo no adopta los cambios - Hay resistencia cultural o falta de capacitación para sostener las mejoras. + 👥 Personas y capacidades + El equipo necesita desarrollar nuevas habilidades.
-
-
+
- Tenemos herramientas, pero no las aprovechamos - Se incorporó software o tecnología pero no se integró con la operación diaria. + 🤖 Tecnología e innovación + La organización necesita digitalizarse o incorporar IA. +
+
+ +
+
+ 🌐 No sé bien dónde está el problema + Algo no funciona, pero es difícil de identificar.
-
- +
+
- -
-
+ +
+

¿Qué querés lograr?

+

Definí tu objetivo principal:

+ +
+
+
+ 📈 Mejorar la gestión y los procesos + Ordenar, optimizar y hacer más eficiente la operación. +
+
+ +
+
+ 🏗️ Profesionalizar la gestión de proyectos + Que los proyectos se entreguen en tiempo y con los resultados esperados. +
+
+ +
+
+ 🌱 Desarrollar las capacidades del equipo + Que las personas estén preparadas para los desafíos que vienen. +
+
+ +
+
+ ⚡ Transformar digitalmente la organización + Integrar tecnología e IA de manera estratégica y sostenible. +
+
+
+ +
+ +
+
+ + +
+

¿Qué solución estás buscando?

+

Seleccioná la opción que mejor se ajuste:

+ +
+
+
+ ✅ ISO o sistema de gestión + ISO 9001, 14001, 45001 u otra norma de gestión. +
+
+ +
+
+ 📐 PMO o gestión de proyectos + Implementar una oficina de proyectos o mejorar su gestión. +
+
+ +
+
+ 🎓 Formación para mi organización + Capacitación in company o programas de desarrollo. +
+
+ +
+
+ 🤖 Transformación digital e IA + Digitalización de procesos, automatización o IA aplicada. +
+
+
+ +
+ +
+
+ + +
+

¿Qué tipo de formación o conocimiento buscás?

+

Seleccioná el área de interés:

+ +
+
+
+ 📋 Normas ISO y sistemas de gestión + Auditoría interna, implementación de normas, mejora continua. +
+
+ +
+
+ 📌 Gestión de proyectos + Herramientas, metodologías, PMP, ágil, híbrido. +
+
+ +
+
+ 🧭 Liderazgo y cambio organizacional + Desarrollo de líderes y gestión del cambio. +
+
+ +
+
+ 🤖 Inteligencia artificial y tecnología + IA aplicada, transformación digital para equipos no técnicos. +
+
+
+ +
+ +
+
+ + +
+

¿Cómo describirías el momento en que está tu organización?

+

Seleccioná la opción que mejor refleje tu situación:

+ +
+
+
+ 🔭 Estoy explorando + Todavía en etapa de análisis, sin decisiones tomadas. +
+
+ +
+
+ ⚖️ Estamos evaluando opciones + Comparando enfoques o proveedores antes de avanzar. +
+
+ +
+
+ 🚀 Queremos avanzar pronto + La decisión está tomada, necesitamos un socio para ejecutar. +
+
+ +
+
+ 📅 Tenemos un requisito o plazo + Una certificación, licitación o cliente lo exige. +
+
+
+ +
+ +
+
+ + +
+

¿Cuál es tu rol en la organización?

+

Seleccioná tu rol para una orientación más precisa:

+ +
+
+
+ 🏢 Dirección o Gerencia + CEO, director, gerente general. +
+
+ +
+
+ 📂 Responsable de área + Jefe, coordinador, líder de proceso o proyecto. +
+
+ +
+
+ 👥 Recursos Humanos + Gestión de personas, formación y desarrollo. +
+
+ +
+
+ 💼 Otro rol + Consultor, proveedor, investigador, estudiante. +
+
+
+ +
+ +
+
+ + +
+
- Combinación Sugerida de Capacidades + Perfil Recomendado
-

- IDE Excellence + IDE Academy +
+ 🔍 + Perfil · Diagnóstico +
+

+ No necesitás tener la respuesta para empezar.

-

- La implementación de procesos y normas es el primer paso. Para que sea sostenible, suele ser clave trabajar también en el desarrollo de capacidades de las personas. +

+ Empezamos por comprender tu situación, no por ofrecerte una solución predeterminada.

-
+
- -
-
-
- LA NUEVA FORMA DE MIRAR -

Comprender el todo para saber dónde intervenir

-

- No se trata de intervenir en todo ni de aplicar fórmulas estandarizadas. Guiamos cada intervención bajo un criterio metodológico riguroso: -

-
- -
-
-
01
-

Comprender el Todo

-

Para identificar las verdaderas relaciones y causas raíz detrás de cada desafío.

-
- -
-
02
-

Focalizar la Intervención

-

Para actuar estratégicamente donde se genera el mayor impacto y valor agregado.

-
- -
-
03
-

Integrar Capacidades

-

Para que la transformación no quede limitada a una única solución aislada.

-
- -
-
04
-

Resultados Sostenibles

-

Porque una verdadera mejora no debería solucionar un problema creando otro.

-
-
-
-
- - +
@@ -358,7 +550,7 @@
- +
@@ -397,7 +589,7 @@
- +
diff --git a/js/main.js b/js/main.js index 10eb684..37561af 100644 --- a/js/main.js +++ b/js/main.js @@ -241,139 +241,267 @@ function closeModal(modalId) { } } -/* ========================================================================== - 5. Bloque 3: La Brújula IDE (Diagnóstico en 3 Pasos) - ========================================================================== */ -const brujulaState = { - foco: null, - focoTexto: '', - dolor: null, - dolorTexto: '', - recomendacion: '' -}; +/* ================================================================ + JS QUIZ + ================================================================ */ -function initBrujulaIDE() { - const container = document.getElementById('brujula-interactive-app'); +(function () { + // ----- FLUJO DE NAVEGACIÓN (Opción B) ----- + const FLOW = { + 1: { desafio: '2a', objetivo: '2b', solucion: '2c', conocimiento: '2d' }, + '2a': 3, '2b': 3, '2c': 3, '2d': 3, + 3: 4, + 4: 'result' + }; + + // ----- MAPEO DE RESULTADOS (Opción B) ----- + function buildResult(answers) { + const p1 = answers[1]; + const p2 = answers['2a'] || answers['2b'] || answers['2c'] || answers['2d']; + const p3 = answers[3]; + + // Perfil 4 · Requisito exigido + if (p3 === 'requisito' || p2 === 'iso' || p2 === 'iso-form') { + return { + icon: '📋', + profile: 'Perfil · Requisito o certificación', + title: 'La certificación puede ser el punto de partida.', + body: 'Comprendemos que tenés un requisito externo. En IDE no trabajamos para cumplir auditorías: trabajamos para que el sistema refleje cómo funciona tu organización y contribuya a gestionarla mejor.', + chips: ['IDE Excellence', 'ISO 9001 / 14001 / 45001', 'Sistemas de gestión'], + cta: 'Ver soluciones Excellence', + url: 'soluciones.html' + }; + } + + // Perfil 5 · Conocimiento o formación + if (p1 === 'conocimiento') { + const map = { + 'iso-form': { chips: ['Auditoría interna', 'ISO 9001', 'Mejora continua'], extra: 'IDE Excellence' }, + 'pm-form': { chips: ['Gestión de proyectos', 'Metodologías ágiles', 'PMP'], extra: 'IDE Project' }, + 'liderazgo-form': { chips: ['Liderazgo', 'Cambio organizacional', 'Cultura'], extra: 'IDE Academy' }, + 'ia-form': { chips: ['IA aplicada', 'Transformación digital', 'Automatización'], extra: 'IDE Digital' } + }; + const m = map[p2] || { chips: ['Formación', 'Desarrollo', 'Academy'], extra: 'IDE Academy' }; + return { + icon: '🎓', + profile: 'Perfil · Formación y conocimiento', + title: 'Desarrollamos las capacidades que hacen posible la transformación.', + body: 'IDE Academy diseña programas de formación alineados con los desafíos reales de las organizaciones. No dictamos cursos estándar: trabajamos desde el contexto de cada equipo.', + chips: [...m.chips, m.extra], + cta: 'Conocer IDE Academy', + url: 'academy.html' + }; + } + + // Perfil 3 · Sabe exactamente qué necesita + if (p1 === 'solucion') { + const map = { + iso: { + title: 'Respuesta concreta. Y algo más.', + chips: ['ISO 9001', 'ISO 14001', 'IDE Excellence'], + cta: 'Ver soluciones ISO', + url: 'soluciones.html', + body: 'Sí, implementamos y acompañamos certificaciones ISO. Y creemos que un sistema de gestión debe reflejar cómo funciona tu organización, no solo superar una auditoría.' + }, + pmo: { + title: 'Proyectos que llegan a destino.', + chips: ['PMO', 'Gestión de proyectos', 'IDE Project'], + cta: 'Ver soluciones Project', + url: 'soluciones.html', + body: 'Diseñamos PMOs y acompañamos la dirección de proyectos para que se entreguen en tiempo, costo y con los resultados esperados.' + }, + formacion: { + title: 'Formación desde el contexto real.', + chips: ['In Company', 'Capacitación', 'IDE Academy'], + cta: 'Ver IDE Academy', + url: 'academy.html', + body: 'Programas de formación diseñados para tu organización, sus desafíos y las capacidades que necesita desarrollar.' + }, + 'ia-digital': { + title: 'Tecnología con propósito.', + chips: ['Transformación digital', 'IA aplicada', 'IDE Digital'], + cta: 'Ver soluciones Digital', + url: 'soluciones.html', + body: 'Te ayudamos a identificar dónde la IA y la digitalización generan valor real, y acompañamos su implementación de principio a fin.' + } + }; + const m = map[p2] || { + title: 'Encontramos lo que buscás.', + chips: ['Soluciones concretas', 'Ecosistema IDE'], + cta: 'Ver soluciones', + url: 'soluciones.html', + body: 'Tenemos la respuesta concreta que buscás. Y una mirada que asegura que esa solución genere valor en el conjunto de tu organización.' + }; + return { icon: '⚙️', profile: 'Perfil · Solución concreta', ...m }; + } + + // Perfil 2 · Sabe qué quiere lograr + if (p1 === 'objetivo') { + const map = { + 'mejorar-gestion': { chips: ['IDE Excellence', 'Mejora de procesos'], body: 'Entendemos dónde querés llegar. Antes de proponer una solución, comprendemos tu operación para intervenir donde hay mayor impacto.' }, + 'profesionalizar-proyectos':{ chips: ['IDE Project', 'PMO'], body: 'Traducimos tu objetivo en una estructura de gestión de proyectos adecuada a tu contexto, sin sobreingeniería.' }, + 'desarrollar-equipo': { chips: ['IDE Academy', 'Formación In Company'], body: 'Desarrollamos capacidades alineadas con los desafíos reales de tu organización. La formación parte del contexto, no de un catálogo estándar.' }, + 'transformar-digital': { chips: ['IDE Digital', 'IA aplicada'], body: 'Empezamos por entender tu organización para identificar dónde la tecnología realmente agrega valor, y avanzamos desde ahí.' } + }; + const m = map[p2] || { chips: ['Ecosistema IDE'], body: 'Entendemos dónde querés llegar. Comprendemos el sistema para ayudarte a lograrlo.' }; + return { + icon: '🎯', + profile: 'Perfil · Objetivo claro', + title: 'Entendemos dónde querés llegar. Te ayudamos a definir cómo.', + body: m.body, + chips: m.chips, + cta: 'Explorar por desafío', + url: 'desafios.html' + }; + } + + // Perfil 1 · Desafío sin solución definida + const mapD = { + gestion: { chips: ['Procesos', 'Gestión', 'IDE Excellence'] }, + proyectos: { chips: ['Proyectos', 'PMO', 'IDE Project'] }, + personas: { chips: ['Capacidades', 'Equipo', 'IDE Academy'] }, + tecnologia: { chips: ['IA', 'Digital', 'IDE Digital'] }, + nosabe: { chips: ['Diagnóstico sistémico', 'Ecosistema IDE'] } + }; + const md = mapD[p2] || mapD.nosabe; + return { + icon: '🔍', + profile: 'Perfil · Desafío sin solución definida', + title: 'No necesitás tener la respuesta para empezar.', + body: 'Empezamos por comprender tu situación, no por ofrecerte una solución predeterminada. Eso diferencia una intervención puntual de una transformación real.', + chips: md.chips, + cta: 'Explorar desafíos', + url: 'desafios.html' + }; + } + + // ----- ESTADO ----- + let currentStep = 1; + let stepHistory = []; + let answers = {}; + const TOTAL = 4; + + const container = document.getElementById('quiz-interactive-app'); if (!container) return; - const step1Options = container.querySelectorAll('.brujula-opt-step1'); - const step2Options = container.querySelectorAll('.brujula-opt-step2'); - const btnNext1 = document.getElementById('brujula-btn-next1'); - const btnNext2 = document.getElementById('brujula-btn-next2'); - const btnRestart = document.getElementById('brujula-btn-restart'); + // ----- FUNCIONES ----- + function showStep(id) { + const steps = container.querySelectorAll('.quiz-step'); + steps.forEach(s => s.classList.remove('active')); - // Selección paso 1 - step1Options.forEach(opt => { - opt.addEventListener('click', () => { - step1Options.forEach(o => o.classList.remove('selected')); - opt.classList.add('selected'); - brujulaState.foco = opt.getAttribute('data-val'); - brujulaState.focoTexto = opt.querySelector('.opt-title').innerText; - if (btnNext1) btnNext1.removeAttribute('disabled'); + const el = document.getElementById('step-' + id); + if (el) el.classList.add('active'); + + updateProgress(id); + updateIndicator(id); + } + + function updateProgress(id) { + const fill = document.getElementById('quiz-progress-fill'); + if (!fill) return; + + let n = 1; + if (id === 'result') n = 4; + else if (['2a', '2b', '2c', '2d'].includes(String(id))) n = 2; + else n = parseInt(id) || 1; + + fill.style.width = (n / TOTAL * 100) + '%'; + } + + function updateIndicator(id) { + const label = document.getElementById('quiz-step-indicator'); + if (!label) return; + + let text = ''; + if (id === 'result') text = '¡Orientación lista!'; + else if (['2a', '2b', '2c', '2d'].includes(String(id))) text = 'Paso 2 de 4'; + else text = 'Paso ' + id + ' de 4'; + + label.textContent = text; + } + + function renderResult(ans) { + const r = buildResult(ans); + + document.getElementById('resultIcon').textContent = r.icon; + document.getElementById('resultProfile').textContent = r.profile; + document.getElementById('resultTitle').textContent = r.title; + document.getElementById('resultBody').textContent = r.body; + + const chipsContainer = document.getElementById('resultChips'); + chipsContainer.innerHTML = r.chips.map(c => + `${c}` + ).join(''); + + const cta = document.getElementById('resultCTA'); + cta.textContent = r.cta; + cta.href = r.url; + + showStep('result'); + } + + function handleOption(btn) { + const step = btn.dataset.step; + const val = btn.dataset.val; + + // Deseleccionar otras opciones del mismo paso + const parent = btn.closest('.quiz-options-grid'); + if (parent) { + parent.querySelectorAll('.quiz-option-card').forEach(b => b.classList.remove('selected')); + } + btn.classList.add('selected'); + + answers[step] = val; + stepHistory.push(step); + + const next = FLOW[step]; + if (!next) return; + + if (next === 'result') { + renderResult(answers); + return; + } + + const nextId = typeof next === 'object' ? (next[val] || '2a') : next; + showStep(nextId); + } + + // ----- FUNCIONES GLOBALES (para onclick en HTML) ----- + window.goBack = function () { + if (!stepHistory.length) return; + const prev = stepHistory.pop(); + delete answers[prev]; + + const last = stepHistory[stepHistory.length - 1] || 1; + showStep(last); + }; + + window.restartQuiz = function () { + answers = {}; + stepHistory = []; + container.querySelectorAll('.quiz-option-card').forEach(b => b.classList.remove('selected')); + showStep(1); + }; + + // ----- INIT ----- + function initQuiz() { + // Eventos en las cards de opción + container.querySelectorAll('.quiz-option-card').forEach(btn => { + btn.addEventListener('click', function () { + handleOption(this); + }); }); - }); - if (btnNext1) { - btnNext1.addEventListener('click', () => { - if (!brujulaState.foco) return; - showBrujulaStep(2); - }); + showStep(1); } - // Selección paso 2 - step2Options.forEach(opt => { - opt.addEventListener('click', () => { - step2Options.forEach(o => o.classList.remove('selected')); - opt.classList.add('selected'); - brujulaState.dolor = opt.getAttribute('data-val'); - brujulaState.dolorTexto = opt.querySelector('.opt-title').innerText; - if (btnNext2) btnNext2.removeAttribute('disabled'); - }); - }); - - if (btnNext2) { - btnNext2.addEventListener('click', () => { - if (!brujulaState.dolor) return; - calculateBrujulaResult(); - showBrujulaStep(3); - }); + // Ejecutar al cargar el DOM + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initQuiz); + } else { + initQuiz(); } - - if (btnRestart) { - btnRestart.addEventListener('click', () => { - brujulaState.foco = null; - brujulaState.dolor = null; - step1Options.forEach(o => o.classList.remove('selected')); - step2Options.forEach(o => o.classList.remove('selected')); - if (btnNext1) btnNext1.setAttribute('disabled', 'true'); - if (btnNext2) btnNext2.setAttribute('disabled', 'true'); - showBrujulaStep(1); - }); - } -} - -function showBrujulaStep(stepNumber) { - const steps = document.querySelectorAll('.brujula-step'); - const fill = document.getElementById('brujula-progress-fill'); - const stepLabel = document.getElementById('brujula-step-indicator'); - - steps.forEach(step => step.classList.remove('active')); - const activeStep = document.getElementById(`brujula-step-${stepNumber}`); - if (activeStep) activeStep.classList.add('active'); - - if (fill) { - fill.style.width = stepNumber === 1 ? '33.33%' : stepNumber === 2 ? '66.66%' : '100%'; - } - if (stepLabel) { - stepLabel.innerText = stepNumber <= 2 ? `Paso ${stepNumber} de 3` : 'Orientación recomendada'; - } -} - -function calculateBrujulaResult() { - const resultTitle = document.getElementById('brujula-result-capacidades'); - const resultText = document.getElementById('brujula-result-desc'); - const resultCta = document.getElementById('brujula-result-cta'); - - let caps = 'IDE Excellence + IDE Academy'; - let desc = 'La implementación de procesos y normas es el primer paso. Para que sea sostenible, es clave trabajar en el desarrollo de capacidades de tu equipo.'; - let dropdownValue = 'Implementar o certificar una norma'; - - // Lógica de cruce sistémico - if (brujulaState.foco === 'iso' && brujulaState.dolor === 'adopcion') { - caps = 'IDE Excellence + IDE Academy'; - desc = 'Implementar normas como ISO 9001 sólo genera valor si las personas comprenden y adoptan el sistema. Recomendamos unir la consultoría de procesos con formación In-Company.'; - dropdownValue = 'Implementar o certificar una norma'; - } else if (brujulaState.foco === 'proyectos' || brujulaState.dolor === 'desvios') { - caps = 'IDE Project + IDE Excellence'; - desc = 'Tus desafíos requieren profesionalizar la dirección de proyectos y alinear los flujos operativos con la estrategia de la organización.'; - dropdownValue = 'Gestionar o impulsar un proyecto'; - } else if (brujulaState.foco === 'tecnologia' || brujulaState.dolor === 'herramientas') { - caps = 'IDE Digital + IDE Excellence'; - desc = 'La tecnología y la IA deben estar al servicio de procesos claros. Recomendamos mapear primero las oportunidades antes de sumar herramientas aisladas.'; - dropdownValue = 'Transformación digital / IA'; - } else if (brujulaState.foco === 'equipo' || brujulaState.dolor === 'procesos') { - caps = 'IDE Academy + IDE Excellence'; - desc = 'Fortalecer el criterio y las competencias del equipo permite que los procesos organizacionales fluyan con menor fricción y mayor autonomía.'; - dropdownValue = 'Formación para mi organización'; - } - - brujulaState.recomendacion = `${caps}: ${desc}`; - - if (resultTitle) resultTitle.innerText = caps; - if (resultText) resultText.innerText = desc; - - if (resultCta) { - // Generar enlace pre-cargado para Contacto - const params = new URLSearchParams({ - origen: 'Brujula_IDE', - busqueda: dropdownValue, - foco: brujulaState.focoTexto, - dolor: brujulaState.dolorTexto, - recomendacion: caps - }); - resultCta.setAttribute('href', `contacto.html?${params.toString()}`); - } -} +})(); /* ========================================================================== 6. Carga Dinámica de Cursos en IDE Academy (cursos.json)