refactor: Extract all hardcoded content to JSON files

- Move all bilingual text from templates to UI JSON (labels, buttons, modals)
- Move skills summary paragraph to CV JSON with HTML support
- Add new UI sections: navigation, viewControls, sections, footer, portfolio,
  pdfModal, shortcutsModal, infoModal, widgets
- Update Go structs to match expanded JSON structure
- Add template.HTML type for CV.SkillsSummary field
- Add JSON content validation test (70-json-content-validation.test.mjs)

Templates now contain only structural logic (CSS classes, HTML attributes)
while all user-visible text loads from JSON files for proper i18n support.
This commit is contained in:
juanatsap
2025-11-30 10:13:37 +00:00
parent c834919a3c
commit 9636b3659f
36 changed files with 806 additions and 168 deletions
+18 -1
View File
@@ -2,6 +2,12 @@
"personal": {
"name": "Juan Andrés Moreno Rubio",
"title": "Lead Technical Consultant, FullStack Developer",
"titleBadges": [
"Technical Consultant",
"Full-Stack Engineer",
"Authentication Specialist",
"Solution Architect"
],
"location": "Arrecife, Las Palmas de Gran Canaria, Spain",
"email": "txeo.msx@gmail.com",
"phone": "+34 676875420",
@@ -12,9 +18,20 @@
"github": "https://github.com/juanatsap",
"domestika": "https://www.domestika.org/es/txeo/portfolio",
"website": "https://juan.andres.morenorub.io",
"photo": "/static/images/profile.jpg"
"photo": "/static/images/profile.jpg",
"firstName": "Juan Andrés",
"lastName": "Moreno Rubio",
"username": "txeo"
},
"seo": {
"pageTitle": "Curriculum Vitae",
"metaTitle": "Professional CV",
"metaDescription": "18 years of experience in web development, SAP CDC, React, Node.js, Go, HTMX and AI-assisted development",
"ogDescription": "Senior Technical Consultant with 18 years of experience",
"keywords": "CV, Resume, FullStack Developer, SAP CDC, React, Node.js, Go, HTMX, AI, Web Development, Technical Consultant"
},
"summary": "Full-stack developer specialized in high-availability systems. I've worked on Olympic Games platforms, airport authentication systems with millions of users, and built around 20 websites for diverse sectors (e-commerce, enterprise, institutional). Certified SAP Customer Data Cloud consultant, advising 35-40 international clients on digital identity solutions.",
"skillsSummary": "<strong>Full-stack</strong> developer with experience in <strong>Go</strong>, <strong>Node.js</strong>, <strong>React</strong>, and <strong>HTMX</strong> for <strong>modern applications</strong>, plus Java and PHP knowledge for legacy projects. I've worked on <strong>around 20 websites</strong> and provided <strong>consulting for 35-40 international clients</strong>, from e-commerce and enterprise platforms to <strong>authentication systems</strong> managing <strong>millions of users</strong>. Familiar with <strong>AI-assisted development</strong> workflows and infrastructure management (<strong>Linux</strong>, <strong>Docker</strong>, <strong>CI/CD</strong>). I adapt well to both independent work and collaborative teams across different countries.",
"experience": [
{
"position": "Senior SAP Technical Consultant",
+18 -1
View File
@@ -2,6 +2,12 @@
"personal": {
"name": "Juan Andrés Moreno Rubio",
"title": "Consultor Técnico Senior, Desarrollador FullStack",
"titleBadges": [
"Consultor Técnico",
"Ingeniero Full-Stack",
"Especialista en Autenticación",
"Arquitecto de Soluciones"
],
"location": "Arrecife, Las Palmas de Gran Canaria, España",
"email": "txeo.msx@gmail.com",
"phone": "+34 676875420",
@@ -12,9 +18,20 @@
"github": "https://github.com/juanatsap",
"domestika": "https://www.domestika.org/es/txeo/portfolio",
"website": "https://juan.andres.morenorub.io",
"photo": "/static/images/profile.jpg"
"photo": "/static/images/profile.jpg",
"firstName": "Juan Andrés",
"lastName": "Moreno Rubio",
"username": "txeo"
},
"seo": {
"pageTitle": "Curriculum Vitae",
"metaTitle": "CV Profesional",
"metaDescription": "18 años de experiencia en desarrollo web, SAP CDC, React, Node.js, Go, HTMX y desarrollo asistido por IA",
"ogDescription": "Consultor Técnico Senior con 18 años de experiencia",
"keywords": "CV, Curriculum Vitae, Desarrollador FullStack, SAP CDC, React, Node.js, Go, HTMX, IA, Desarrollo Web, Consultor Técnico"
},
"summary": "Desarrollador full-stack especializado en sistemas de alta disponibilidad. He participado en plataformas de Juegos Olímpicos, sistemas de autenticación aeroportuaria con millones de usuarios, y desarrollado unos 20 sitios web para diversos sectores (e-commerce, empresariales, institucionales). Consultor certificado de SAP Customer Data Cloud, asesorando a 35-40 clientes internacionales en soluciones de identidad digital.",
"skillsSummary": "Desarrollador <strong>full-stack</strong> con experiencia en <strong>Go</strong>, <strong>Node.js</strong>, <strong>React</strong> y <strong>HTMX</strong> para <strong>aplicaciones modernas</strong>, además de conocimientos en Java y PHP para proyectos legacy. He trabajado en <strong>unos 20 sitios web</strong> y realizado <strong>consultoría para 35-40 clientes internacionales</strong>, desde e-commerce y plataformas empresariales hasta <strong>sistemas de autenticación</strong> que gestionan <strong>millones de usuarios</strong>. Familiarizado con flujos de trabajo asistidos por <strong>IA</strong> y gestión de infraestructura (<strong>Linux</strong>, <strong>Docker</strong>, <strong>CI/CD</strong>). Me adapto bien tanto al trabajo independiente como colaborativo en equipos internacionales.",
"experience": [
{
"position": "Consultor Técnico Senior SAP",
+123 -10
View File
@@ -1,19 +1,78 @@
{
"infoModal": {
"title": "About this CV",
"description": "This interactive CV was built by myself with <strong>Go + HTMX</strong>, showcasing modern hypermedia architecture without heavy JavaScript frameworks.",
"techStack": {
"goHono": "Go + Hono",
"htmx": "HTMX",
"html5": "Semantic HTML5",
"css3": "Pure CSS3"
"navigation": {
"cvSections": "CV Sections",
"training": "Training",
"skills": "Skills",
"experience": "Experience",
"awards": "Awards",
"projects": "Personal / Freelance Projects",
"courses": "Courses",
"languages": "Languages",
"references": "References",
"other": "Other",
"quickActions": "Quick Actions",
"collapseAll": "Collapse All",
"expandAll": "Expand All",
"zoom": "Zoom",
"viewControls": "View Controls",
"actions": "Actions"
},
"viewControls": {
"length": "Length",
"icons": "Icons",
"view": "View"
},
"sections": {
"technicalSkills": "Technical Skills",
"moreSkills": "More Skills",
"yearsOfExperience": "years of experience",
"drivingLicense": "Driving License type",
"obtainedFrom": "obtained from the",
"currentBadge": "CURRENT",
"expiredBadge": "EXPIRED",
"present": "now",
"technologies": "Technologies:",
"maintainedBy": "MAINTAINED BY"
},
"footer": {
"viewOnGithub": "View this project on GitHub",
"lastUpdated": "Last updated"
},
"portfolio": {
"seeAllProjects": "See all projects on my",
"domestikaPortfolio": "Domestika portfolio"
},
"pdfModal": {
"title": "Download PDF",
"subtitle": "Choose your preferred format",
"preparingPdf": "Preparing PDF...",
"pleaseWait": "Please wait while we generate your CV",
"close": "Close",
"downloadButton": "Download PDF",
"shortCv": {
"title": "Short CV (4 pages)",
"pages": "4 Pages",
"description": "Essential info",
"ariaLabel": "Short CV - 4 pages, essential information"
},
"viewSource": "View Project in Github",
"viewSourceSubtext": "Want to know how it's built?"
"defaultCv": {
"title": "Default CV (5 pages)",
"pages": "5 Pages",
"description": "Short with skills - Recommended",
"ariaLabel": "Default CV - 5 pages with skills (Recommended)"
},
"extendedCv": {
"title": "Extended CV (9 pages)",
"pages": "9 Pages",
"description": "All details",
"ariaLabel": "Extended CV - 9 pages, full version"
}
},
"shortcutsModal": {
"title": "Keyboard Shortcuts",
"subtitle": "Learn the Shortcuts",
"description": "Use these keyboard shortcuts to navigate and control the CV more efficiently.",
"close": "Close",
"sections": {
"zoom": {
"title": "Zoom Control",
@@ -87,5 +146,59 @@
}
}
}
},
"infoModal": {
"title": "About this CV",
"description": "This interactive CV was built by myself with <strong>Go + HTMX</strong>, showcasing modern hypermedia architecture without heavy JavaScript frameworks.",
"techStack": {
"goHono": "Go + Hono",
"htmx": "HTMX",
"html5": "Semantic HTML5",
"css3": "Pure CSS3"
},
"viewSource": "View Project in Github",
"viewSourceSubtext": "Want to know how it's built?"
},
"widgets": {
"backToTop": {
"ariaLabel": "Back to top",
"tooltip": "Back to top"
},
"info": {
"ariaLabel": "Information",
"tooltip": "Information"
},
"download": {
"ariaLabel": "Download as PDF",
"tooltip": "Download as PDF"
},
"print": {
"ariaLabel": "Print Friendly",
"tooltip": "Print Friendly"
},
"shortcuts": {
"ariaLabel": "Keyboard shortcuts",
"tooltip": "Keyboard shortcuts (?)"
},
"zoomToggle": {
"ariaLabel": "Toggle zoom control",
"tooltip": "Zoom control"
},
"zoomControl": {
"groupLabel": "Zoom control",
"closeLabel": "Close zoom control",
"closeTitle": "Close",
"sliderLabel": "Adjust CV zoom level",
"resetLabel": "Reset zoom to 100%",
"resetTitle": "Reset"
},
"pdfToast": {
"title": "Preparing PDF",
"closeLabel": "Close notification"
},
"actionButtons": {
"downloadPdf": "Download as PDF",
"printFriendly": "Print Friendly"
}
}
}
+123 -10
View File
@@ -1,19 +1,78 @@
{
"infoModal": {
"title": "Acerca de este CV",
"description": "Este CV interactivo fue construido por mí mismo con <strong>Go + HTMX</strong>, demostrando arquitectura moderna de hipermedia sin frameworks pesados de JavaScript.",
"techStack": {
"goHono": "Go + Hono",
"htmx": "HTMX",
"html5": "HTML5 Semántico",
"css3": "CSS3 Puro"
"navigation": {
"cvSections": "Secciones CV",
"training": "Formación",
"skills": "Competencias",
"experience": "Experiencia",
"awards": "Premios y Reconocimientos",
"projects": "Proyectos Personales / Freelance",
"courses": "Cursos Realizados",
"languages": "Idiomas",
"references": "Referencias",
"other": "Otros",
"quickActions": "Acciones Rápidas",
"collapseAll": "Colapsar Todo",
"expandAll": "Expandir Todo",
"zoom": "Zoom",
"viewControls": "Controles de Vista",
"actions": "Acciones"
},
"viewControls": {
"length": "Longitud",
"icons": "Iconos",
"view": "Vista"
},
"sections": {
"technicalSkills": "Competencias Técnicas",
"moreSkills": "Más Competencias",
"yearsOfExperience": "años de experiencia",
"drivingLicense": "Carnet de conducir tipo",
"obtainedFrom": "obtenido de",
"currentBadge": "ACTUAL",
"expiredBadge": "EXPIRADO",
"present": "presente",
"technologies": "Tecnologías:",
"maintainedBy": "MANTENIDO POR"
},
"footer": {
"viewOnGithub": "Ver este proyecto en GitHub",
"lastUpdated": "Última actualización"
},
"portfolio": {
"seeAllProjects": "Ver todos los proyectos en mi",
"domestikaPortfolio": "portfolio de Domestika"
},
"pdfModal": {
"title": "Descargar PDF",
"subtitle": "Elige tu formato preferido",
"preparingPdf": "Preparando PDF...",
"pleaseWait": "Por favor espera mientras generamos tu CV",
"close": "Cerrar",
"downloadButton": "Descargar PDF",
"shortCv": {
"title": "CV Corto (4 páginas)",
"pages": "4 Páginas",
"description": "Información esencial",
"ariaLabel": "CV Corto - 4 páginas, información esencial"
},
"viewSource": "Ver proyecto en Github",
"viewSourceSubtext": "¿Quieres saber cómo está hecho?"
"defaultCv": {
"title": "CV Por Defecto (5 páginas)",
"pages": "5 Páginas",
"description": "Corto con habilidades - Recomendado",
"ariaLabel": "CV Por Defecto - 5 páginas con habilidades (Recomendado)"
},
"extendedCv": {
"title": "CV Extendido (9 páginas)",
"pages": "9 Páginas",
"description": "Todos los detalles",
"ariaLabel": "CV Extendido - 9 páginas, versión completa"
}
},
"shortcutsModal": {
"title": "Atajos de Teclado",
"subtitle": "Aprende los Atajos",
"description": "Usa estos atajos de teclado para navegar y controlar el CV de forma más eficiente.",
"close": "Cerrar",
"sections": {
"zoom": {
"title": "Control de Zoom",
@@ -87,5 +146,59 @@
}
}
}
},
"infoModal": {
"title": "Acerca de este CV",
"description": "Este CV interactivo fue construido por mí mismo con <strong>Go + HTMX</strong>, demostrando arquitectura moderna de hipermedia sin frameworks pesados de JavaScript.",
"techStack": {
"goHono": "Go + Hono",
"htmx": "HTMX",
"html5": "HTML5 Semántico",
"css3": "CSS3 Puro"
},
"viewSource": "Ver proyecto en Github",
"viewSourceSubtext": "¿Quieres saber cómo está hecho?"
},
"widgets": {
"backToTop": {
"ariaLabel": "Volver arriba",
"tooltip": "Volver arriba"
},
"info": {
"ariaLabel": "Información",
"tooltip": "Información"
},
"download": {
"ariaLabel": "Descargar PDF",
"tooltip": "Descargar PDF"
},
"print": {
"ariaLabel": "Imprimir CV",
"tooltip": "Imprimir CV"
},
"shortcuts": {
"ariaLabel": "Atajos de teclado",
"tooltip": "Atajos de teclado (?)"
},
"zoomToggle": {
"ariaLabel": "Alternar control de zoom",
"tooltip": "Control de zoom"
},
"zoomControl": {
"groupLabel": "Control de zoom",
"closeLabel": "Cerrar control de zoom",
"closeTitle": "Cerrar",
"sliderLabel": "Ajustar nivel de zoom del CV",
"resetLabel": "Restablecer zoom al 100%",
"resetTitle": "Restablecer"
},
"pdfToast": {
"title": "Preparando PDF",
"closeLabel": "Cerrar notificación"
},
"actionButtons": {
"downloadPdf": "Descargar como PDF",
"printFriendly": "Imprimir amigable"
}
}
}