diff --git a/data/cv-en.json b/data/cv-en.json
index 5717027..f526ff1 100644
--- a/data/cv-en.json
+++ b/data/cv-en.json
@@ -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": "Full-stack developer with experience in Go, Node.js, React, and HTMX for modern applications, plus Java and PHP knowledge for legacy projects. I've worked on around 20 websites and provided consulting for 35-40 international clients, from e-commerce and enterprise platforms to authentication systems managing millions of users. Familiar with AI-assisted development workflows and infrastructure management (Linux, Docker, CI/CD). I adapt well to both independent work and collaborative teams across different countries.",
"experience": [
{
"position": "Senior SAP Technical Consultant",
diff --git a/data/cv-es.json b/data/cv-es.json
index 75cfa1e..e395233 100644
--- a/data/cv-es.json
+++ b/data/cv-es.json
@@ -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 full-stack con experiencia en Go, Node.js, React y HTMX para aplicaciones modernas, además de conocimientos en Java y PHP para proyectos legacy. He trabajado en unos 20 sitios web y realizado consultoría para 35-40 clientes internacionales, desde e-commerce y plataformas empresariales hasta sistemas de autenticación que gestionan millones de usuarios. Familiarizado con flujos de trabajo asistidos por IA y gestión de infraestructura (Linux, Docker, CI/CD). Me adapto bien tanto al trabajo independiente como colaborativo en equipos internacionales.",
"experience": [
{
"position": "Consultor Técnico Senior SAP",
diff --git a/data/ui-en.json b/data/ui-en.json
index d9dfc74..2ebac50 100644
--- a/data/ui-en.json
+++ b/data/ui-en.json
@@ -1,19 +1,78 @@
{
- "infoModal": {
- "title": "About this CV",
- "description": "This interactive CV was built by myself with Go + HTMX, 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 Go + HTMX, 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"
+ }
}
}
diff --git a/data/ui-es.json b/data/ui-es.json
index 9786c7d..2e1277d 100644
--- a/data/ui-es.json
+++ b/data/ui-es.json
@@ -1,19 +1,78 @@
{
- "infoModal": {
- "title": "Acerca de este CV",
- "description": "Este CV interactivo fue construido por mí mismo con Go + HTMX, 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 Go + HTMX, 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"
+ }
}
}
diff --git a/internal/models/cv/cv.go b/internal/models/cv/cv.go
index 8bc06f9..c556b8d 100644
--- a/internal/models/cv/cv.go
+++ b/internal/models/cv/cv.go
@@ -1,9 +1,13 @@
package cv
+import "html/template"
+
// CV represents the complete curriculum vitae structure
type CV struct {
Personal Personal `json:"personal"`
+ SEO SEO `json:"seo"`
Summary string `json:"summary"`
+ SkillsSummary template.HTML `json:"skillsSummary"`
Experience []Experience `json:"experience"`
Education []Education `json:"education"`
Skills Skills `json:"skills"`
@@ -18,19 +22,31 @@ type CV struct {
}
type Personal struct {
- Name string `json:"name"`
- Title string `json:"title"`
- Location string `json:"location"`
- Email string `json:"email"`
- Phone string `json:"phone"`
- DateOfBirth string `json:"dateOfBirth"`
- PlaceOfBirth string `json:"placeOfBirth"`
- Citizenship string `json:"citizenship"`
- LinkedIn string `json:"linkedin"`
- GitHub string `json:"github"`
- Domestika string `json:"domestika"`
- Website string `json:"website"`
- Photo string `json:"photo"`
+ Name string `json:"name"`
+ Title string `json:"title"`
+ TitleBadges []string `json:"titleBadges"`
+ Location string `json:"location"`
+ Email string `json:"email"`
+ Phone string `json:"phone"`
+ DateOfBirth string `json:"dateOfBirth"`
+ PlaceOfBirth string `json:"placeOfBirth"`
+ Citizenship string `json:"citizenship"`
+ LinkedIn string `json:"linkedin"`
+ GitHub string `json:"github"`
+ Domestika string `json:"domestika"`
+ Website string `json:"website"`
+ Photo string `json:"photo"`
+ FirstName string `json:"firstName"`
+ LastName string `json:"lastName"`
+ Username string `json:"username"`
+}
+
+type SEO struct {
+ PageTitle string `json:"pageTitle"`
+ MetaTitle string `json:"metaTitle"`
+ MetaDescription string `json:"metaDescription"`
+ OgDescription string `json:"ogDescription"`
+ Keywords string `json:"keywords"`
}
type Experience struct {
diff --git a/internal/models/ui/ui.go b/internal/models/ui/ui.go
index a8ed106..7226bf0 100644
--- a/internal/models/ui/ui.go
+++ b/internal/models/ui/ui.go
@@ -4,28 +4,95 @@ import "html/template"
// UI represents user interface translations and configuration
type UI struct {
- InfoModal InfoModal `json:"infoModal"`
+ Navigation Navigation `json:"navigation"`
+ ViewControls ViewControls `json:"viewControls"`
+ Sections Sections `json:"sections"`
+ Footer Footer `json:"footer"`
+ Portfolio Portfolio `json:"portfolio"`
+ PdfModal PdfModal `json:"pdfModal"`
ShortcutsModal ShortcutsModal `json:"shortcutsModal"`
+ InfoModal InfoModal `json:"infoModal"`
+ Widgets Widgets `json:"widgets"`
}
-type InfoModal struct {
- Title string `json:"title"`
- Description template.HTML `json:"description"`
- TechStack TechStack `json:"techStack"`
- ViewSource string `json:"viewSource"`
- ViewSourceSubtext string `json:"viewSourceSubtext"`
+// Navigation labels for hamburger menu
+type Navigation struct {
+ CvSections string `json:"cvSections"`
+ Training string `json:"training"`
+ Skills string `json:"skills"`
+ Experience string `json:"experience"`
+ Awards string `json:"awards"`
+ Projects string `json:"projects"`
+ Courses string `json:"courses"`
+ Languages string `json:"languages"`
+ References string `json:"references"`
+ Other string `json:"other"`
+ QuickActions string `json:"quickActions"`
+ CollapseAll string `json:"collapseAll"`
+ ExpandAll string `json:"expandAll"`
+ Zoom string `json:"zoom"`
+ ViewControls string `json:"viewControls"`
+ Actions string `json:"actions"`
}
-type TechStack struct {
- GoHono string `json:"goHono"`
- HTMX string `json:"htmx"`
- HTML5 string `json:"html5"`
- CSS3 string `json:"css3"`
+// ViewControls labels for toggle buttons
+type ViewControls struct {
+ Length string `json:"length"`
+ Icons string `json:"icons"`
+ View string `json:"view"`
+}
+
+// Sections labels for CV section headers
+type Sections struct {
+ TechnicalSkills string `json:"technicalSkills"`
+ MoreSkills string `json:"moreSkills"`
+ YearsOfExperience string `json:"yearsOfExperience"`
+ DrivingLicense string `json:"drivingLicense"`
+ ObtainedFrom string `json:"obtainedFrom"`
+ CurrentBadge string `json:"currentBadge"`
+ ExpiredBadge string `json:"expiredBadge"`
+ Present string `json:"present"`
+ Technologies string `json:"technologies"`
+ MaintainedBy string `json:"maintainedBy"`
+}
+
+// Footer labels
+type Footer struct {
+ ViewOnGithub string `json:"viewOnGithub"`
+ LastUpdated string `json:"lastUpdated"`
+}
+
+// Portfolio labels
+type Portfolio struct {
+ SeeAllProjects string `json:"seeAllProjects"`
+ DomestikaPortfolio string `json:"domestikaPortfolio"`
+}
+
+// PdfModal labels
+type PdfModal struct {
+ Title string `json:"title"`
+ Subtitle string `json:"subtitle"`
+ PreparingPdf string `json:"preparingPdf"`
+ PleaseWait string `json:"pleaseWait"`
+ Close string `json:"close"`
+ DownloadButton string `json:"downloadButton"`
+ ShortCv PdfCvOption `json:"shortCv"`
+ DefaultCv PdfCvOption `json:"defaultCv"`
+ ExtendedCv PdfCvOption `json:"extendedCv"`
+}
+
+type PdfCvOption struct {
+ Title string `json:"title"`
+ Pages string `json:"pages"`
+ Description string `json:"description"`
+ AriaLabel string `json:"ariaLabel"`
}
type ShortcutsModal struct {
Title string `json:"title"`
+ Subtitle string `json:"subtitle"`
Description string `json:"description"`
+ Close string `json:"close"`
Sections ShortcutsSections `json:"sections"`
}
@@ -59,3 +126,55 @@ type ShortcutItem struct {
Key string `json:"key"`
Description string `json:"description"`
}
+
+type InfoModal struct {
+ Title string `json:"title"`
+ Description template.HTML `json:"description"`
+ TechStack TechStack `json:"techStack"`
+ ViewSource string `json:"viewSource"`
+ ViewSourceSubtext string `json:"viewSourceSubtext"`
+}
+
+type TechStack struct {
+ GoHono string `json:"goHono"`
+ HTMX string `json:"htmx"`
+ HTML5 string `json:"html5"`
+ CSS3 string `json:"css3"`
+}
+
+// Widget label types
+type Widgets struct {
+ BackToTop WidgetLabel `json:"backToTop"`
+ Info WidgetLabel `json:"info"`
+ Download WidgetLabel `json:"download"`
+ Print WidgetLabel `json:"print"`
+ Shortcuts WidgetLabel `json:"shortcuts"`
+ ZoomToggle WidgetLabel `json:"zoomToggle"`
+ ZoomControl ZoomControlLabel `json:"zoomControl"`
+ PdfToast PdfToastLabel `json:"pdfToast"`
+ ActionButtons ActionButtonsLabel `json:"actionButtons"`
+}
+
+type WidgetLabel struct {
+ AriaLabel string `json:"ariaLabel"`
+ Tooltip string `json:"tooltip"`
+}
+
+type ZoomControlLabel struct {
+ GroupLabel string `json:"groupLabel"`
+ CloseLabel string `json:"closeLabel"`
+ CloseTitle string `json:"closeTitle"`
+ SliderLabel string `json:"sliderLabel"`
+ ResetLabel string `json:"resetLabel"`
+ ResetTitle string `json:"resetTitle"`
+}
+
+type PdfToastLabel struct {
+ Title string `json:"title"`
+ CloseLabel string `json:"closeLabel"`
+}
+
+type ActionButtonsLabel struct {
+ DownloadPdf string `json:"downloadPdf"`
+ PrintFriendly string `json:"printFriendly"`
+}
diff --git a/templates/cv-content.html b/templates/cv-content.html
index 62f508d..b5d1ee4 100644
--- a/templates/cv-content.html
+++ b/templates/cv-content.html
@@ -17,7 +17,7 @@