diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index b9707b7..6e6fbf7 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -17,6 +17,8 @@ jobs:
run: npm run build:version
- name: Build Project
run: npm run build
+ env:
+ VITE_GA4_ID: ${{ secrets.VITE_GA4_ID }}
- name: Upload artifact to enable deployment
uses: actions/upload-artifact@v4
with:
diff --git a/docs/analytics-custom-events.md b/docs/analytics-custom-events.md
new file mode 100644
index 0000000..54e5947
--- /dev/null
+++ b/docs/analytics-custom-events.md
@@ -0,0 +1,61 @@
+# [Analytics] Rastrear eventos personalizados en GA4
+
+## Contexto
+
+El tracking base de Google Analytics (GA4) ya está configurado en `index.html`
+con el Measurement ID `G-QPYBS8SFGX` (inyectado vía `VITE_GA4_ID`). Este issue
+cubre el rastreo de interacciones específicas del portfolio para entender cómo
+los usuarios usan el contenido.
+
+## Eventos a implementar
+
+### 1. Cambio de idioma
+- **Evento**: `language_changed`
+- **Lugar**: `src/components/features/popupLanguageSelector.jsx`
+- **Parámetros**: `{ language: 'en' | 'es' }`
+- **Cuándo**: al seleccionar un idioma en el popup Language
+
+### 2. Apertura de detalle de proyecto
+- **Evento**: `project_open`
+- **Lugar**: `src/App.jsx` (función `toggle`)
+- **Parámetros**: `{ company, project }`
+- **Cuándo**: al hacer clic en un proyecto de Work Experience
+
+### 3. Click en redes/contacto
+- **Evento**: `contact_click`
+- **Lugar**: `src/components/features/contact.jsx`
+- **Parámetros**: `{ network: 'linkedin' | 'github' | 'twitter' | 'email' }`
+- **Cuándo**: al hacer clic en cada enlace del panel Contact
+- **Nota**: si **Enhanced Measurement** está habilitado en el Data Stream, los clics
+ salientes (LinkedIn/GitHub/X) ya se rastrean automáticamente como *outbound
+ clicks*. Este evento solo aportaría el parámetro `network` y el caso del email
+ (mailto). Evaluar si vale la pena duplicar el tracking.
+
+### 4. Descarga de CV (PDF)
+- **Evento**: `download_cv`
+- **Lugar**: `src/constants/popup.js` (acción File > Print)
+- **Parámetros**: `{ language: 'en' | 'es' }`
+- **Cuándo**: al descargar el PDF del perfil
+
+### 5. Apertura de About
+- **Evento**: `about_open`
+- **Lugar**: `src/App.jsx` (submenú About)
+- **Parámetros**: ninguno
+- **Cuándo**: al abrir Help > About
+
+## Implementación
+
+- Crear utilidad `src/services/analytics.js` con helper `trackEvent(name, params)`
+ que llame a `window.gtag`.
+- Integrar la llamada en cada punto indicado.
+- Verificar en GA4 > Realtime que los eventos aparezcan.
+
+## Criterios de aceptación
+
+- [ ] Helper `trackEvent` en `src/services/analytics.js`
+- [ ] `language_changed` con parámetro `language`
+- [ ] `project_open` con `company` y `project`
+- [ ] `contact_click` con `network`
+- [ ] `download_cv` con `language`
+- [ ] `about_open`
+- [ ] Eventos visibles en GA4 Realtime tras deploy
diff --git a/index.html b/index.html
index e5a4e45..e50e789 100644
--- a/index.html
+++ b/index.html
@@ -2,9 +2,99 @@
diff --git a/src/constants/profile.es.js b/src/constants/profile.es.js
index 664035f..07b7c4e 100644
--- a/src/constants/profile.es.js
+++ b/src/constants/profile.es.js
@@ -108,10 +108,6 @@ export const WORK_EXPERIENCE_ES = [
name: "Apliqué buenas prácticas de código limpio, asegurando que fuera legible, mantenible, escalable y testeable.",
skills: ["Desarrollo de Software"],
},
- {
- name: "Configuré entorno local de desarrollo con base de datos local para reemplazar la conexión remota, asegurando el cumplimiento de normativas de privacidad.",
- skills: ["Desarrollo de Software", "Integración y Despliegue"],
- },
{
name: "Documenté manuales de uso para cada requerimiento entregado.",
skills: ["Gestión de Proyectos y Planificación"],
@@ -158,6 +154,17 @@ export const WORK_EXPERIENCE_ES = [
],
},
],
+ achievements: [
+ {
+ challenge: "Acceso limitado a la información",
+ solution:
+ "Implementé un entorno local de persistencia de datos alternativo fácil de usar e importar información",
+ benefit:
+ "Permitió que el equipo de desarrollo continuara trabajando sin interrupciones y cumpliera con sus objetivos de manera efectiva",
+ type: "Aporte",
+ primary: true,
+ },
+ ],
startDate: "2024-10-01T12:00:00.000Z",
endDate: "2025-02-01T12:00:00.000Z",
typeEmployment: "Contrato",
@@ -176,18 +183,6 @@ export const WORK_EXPERIENCE_ES = [
name: "Apliqué principios de desarrollo de software enfocados en la mantenibilidad y testabilidad del código.",
skills: ["Desarrollo de Software"],
},
- {
- name: "Analicé y diseñé un módulo de formularios dinámicos para automatizar la creación, visualización y recopilación de información en cada fase del proceso de solicitud.",
- skills: ["Análisis y Diseño de Software"],
- },
- {
- name: "Implementé una prueba de concepto para la configuración y visualización dinámica de formularios de solicitud.",
- skills: ["Desarrollo de Software"],
- },
- {
- name: "Participé en múltiples procesos de evaluación técnica para Frontend Angular Developer como entrevistador, evaluando la aptitud de los postulantes para el proyecto.",
- skills: ["Evaluación Técnica y Entrevistas"],
- },
],
tecnologies: [
{
@@ -234,9 +229,36 @@ export const WORK_EXPERIENCE_ES = [
name: "Sonar Qube",
skills: ["Desarrollo de Software"],
},
- {
- name: "Microsoft Word | Excel",
- skills: ["Evaluación Técnica y Entrevistas"],
+ ],
+ achievements: [
+ {
+ challenge:
+ "Configurar un módulo para crear formularios dinámicos con entradas configurables",
+ problem:
+ "Visualizar el contenido del formulario con entradas de diferentes tipos según la solicitud seleccionada",
+ solution:
+ "Analicé, Diseñé e Implementé una prueba de concepto (demo funcional) que simulaba el funcionamiento de visualización de entradas previamente configuradas",
+ benefit:
+ "Permitió al equipo funcional evaluar la solución y tener una solición alternativa para validar su implementación con el cliente",
+ type: "Reto",
+ primary: true,
+ },
+ {
+ challenge: "Asignar formulario dinámico a un estado de proceso",
+ solution:
+ "Presenté un diseño de negocio como propuesta para relacionar formulario dinámico con flujo según estado de solicitud",
+ benefit: "Aporte coMejoró la integración del módulo con el marco de procesos",
+ type: "Aporte",
+ primary: true,
+ },
+ {
+ challenge: "Evaluar candidatos técnicos para un equipo",
+ solution:
+ "Evalué a candidatos técnicos y generé informes de cumplimiento con el perfil",
+ benefit:
+ "Contribuí a la selección de candidatos técnicos de alta calidad",
+ type: "Aporte",
+ primary: true,
},
],
startDate: "2024-03-01T12:00:00.000Z",
@@ -312,6 +334,7 @@ export const WORK_EXPERIENCE_ES = [
skills: ["Desarrollo de Software", "Integración y Despliegue"],
},
],
+
startDate: "2022-10-01T12:00:00.000Z",
endDate: "2024-02-01T12:00:00.000Z",
typeEmployment: "Contrato",
diff --git a/src/constants/version.js b/src/constants/version.js
index 190e66b..845a58d 100644
--- a/src/constants/version.js
+++ b/src/constants/version.js
@@ -1 +1 @@
-export const VERSION = "1.5.1";
+export const VERSION = "1.5.2";