From 85dc22ef85689fb671e7a42040064246e254070e Mon Sep 17 00:00:00 2001 From: Julnarot Date: Sun, 21 Dec 2025 23:27:50 -0500 Subject: [PATCH 1/2] feat: adding achievements to the firsts experiences --- src/constants/profile.es.js | 61 +++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 19 deletions(-) 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", From 99d510e3f01024b59f437c4fff0bfe8f030699b6 Mon Sep 17 00:00:00 2001 From: Julnarot Date: Thu, 13 Aug 2026 22:09:15 -0500 Subject: [PATCH 2/2] feat: integrate Google Analytics tracking and update project metadata --- .github/workflows/ci-cd.yml | 2 + docs/analytics-custom-events.md | 61 +++++++++++++++++++ index.html | 90 +++++++++++++++++++++++++++++ public/404.html | 54 +++++++++++++++++ public/manifest.json | 17 ++++++ public/robots.txt | 4 ++ public/sitemap.xml | 9 +++ src/App.jsx | 8 ++- src/components/features/contact.jsx | 8 +-- src/constants/version.js | 2 +- 10 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 docs/analytics-custom-events.md create mode 100644 public/404.html create mode 100644 public/manifest.json create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml 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 @@ + + + + + + + + + + Raul Jonatan | Full stack engineering + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..f19ac1e --- /dev/null +++ b/public/404.html @@ -0,0 +1,54 @@ + + + + + + + 404 - Not Found | Raul Jonatan + + + +
+

404: FILE NOT FOUND

+

The resource you are looking for does not exist on this profile.

+

Press [ENTER] to return to the main profile.

+

> Raul Jonatan | Full Stack Engineer_

+
+ + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..bb9d366 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Raul Jonatan | Full Stack Engineer", + "short_name": "Raul Jonatan", + "description": "Personal portfolio of Raul Jonatan, Full Stack Engineer.", + "start_url": "/", + "display": "standalone", + "background_color": "#2563eb", + "theme_color": "#2563eb", + "icons": [ + { + "src": "/rj.png", + "sizes": "any", + "type": "image/png", + "purpose": "any" + } + ] +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..8ac44a5 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://julnarot.github.io/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..591a087 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,9 @@ + + + + https://julnarot.github.io/ + 2026-08-13 + monthly + 1.0 + + diff --git a/src/App.jsx b/src/App.jsx index 49bb9c5..512b0e9 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -78,6 +78,9 @@ function App() { src="https://avatars.githubusercontent.com/u/2840577?v=4" alt="@Julnarot" className="max-h-40 my-2" + loading="lazy" + width="160" + height="160" /> {/*

{t("main.greeting")}

*/}

{t("main.professionalCareer")}

@@ -97,12 +100,13 @@ function App() { {item.values.map((exp, iexp) => (
[ - toggle(exp)} > {exp.proyect.toUpperCase()} - + ]{iexp < item.values.length - 1 ? " " : ""}
))}{" "} diff --git a/src/components/features/contact.jsx b/src/components/features/contact.jsx index 3da89e9..1ef0ce4 100644 --- a/src/components/features/contact.jsx +++ b/src/components/features/contact.jsx @@ -11,10 +11,10 @@ export default function Contact({ onClose }) {
[]
- (🌏︎) Linkedin - (🌏︎) Github - (🌏︎) Twitter - (@) Write me + (🌏︎) Linkedin + (🌏︎) Github + (🌏︎) Twitter + (@) Write me
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";