diff --git a/internal/templates/template.go b/internal/templates/template.go index 3fab6ac..8fc58c5 100644 --- a/internal/templates/template.go +++ b/internal/templates/template.go @@ -53,6 +53,21 @@ func (m *Manager) loadTemplates() error { "safeHTML": func(s string) template.HTML { return template.HTML(s) }, + // dict creates a map from key-value pairs for passing to sub-templates + "dict": func(values ...interface{}) (map[string]interface{}, error) { + if len(values)%2 != 0 { + return nil, fmt.Errorf("dict requires even number of arguments") + } + dict := make(map[string]interface{}, len(values)/2) + for i := 0; i < len(values); i += 2 { + key, ok := values[i].(string) + if !ok { + return nil, fmt.Errorf("dict keys must be strings") + } + dict[key] = values[i+1] + } + return dict, nil + }, } // Parse main templates @@ -62,13 +77,23 @@ func (m *Manager) loadTemplates() error { return fmt.Errorf("error parsing templates from %s: %w", pattern, err) } - // Try to parse partials if they exist - partialsPattern := filepath.Join(m.config.PartialsDir, "*.html") - partials, _ := filepath.Glob(partialsPattern) - if len(partials) > 0 { - tmpl, err = tmpl.ParseGlob(partialsPattern) + // Parse partials recursively from all subdirectories + partialsPattern := filepath.Join(m.config.PartialsDir, "**", "*.html") + partialsMatches, _ := filepath.Glob(partialsPattern) + + // Also match direct children + partialsDirectPattern := filepath.Join(m.config.PartialsDir, "*.html") + directMatches, _ := filepath.Glob(partialsDirectPattern) + + // Combine all matches + allPartials := append(partialsMatches, directMatches...) + + if len(allPartials) > 0 { + tmpl, err = tmpl.ParseFiles(allPartials...) if err != nil { log.Printf("Warning: error parsing partials: %v", err) + } else { + log.Printf("✓ Loaded %d partial templates", len(allPartials)) } } diff --git a/templates/cv-content.html b/templates/cv-content.html index 31b53f1..32b12aa 100644 --- a/templates/cv-content.html +++ b/templates/cv-content.html @@ -1,15 +1,6 @@
- -
- {{if eq .Lang "es"}}CONSULTOR TÉCNICO{{else}}TECHNICAL CONSULTANT{{end}} - | - {{if eq .Lang "es"}}INGENIERO FULL-STACK{{else}}FULL-STACK ENGINEER{{end}} - | - {{if eq .Lang "es"}}ESPECIALISTA EN AUTENTICACIÓN{{else}}AUTHENTICATION SPECIALIST{{end}} - | - {{if eq .Lang "es"}}ARQUITECTO DE SOLUCIONES{{else}}SOLUTION ARCHITECT{{end}} -
+ {{template "title-badges" .}}
@@ -21,14 +12,14 @@
- -
- {{if eq .Lang "es"}}CONSULTOR TÉCNICO{{else}}TECHNICAL CONSULTANT{{end}} - | - {{if eq .Lang "es"}}INGENIERO FULL-STACK{{else}}FULL-STACK ENGINEER{{end}} - | - {{if eq .Lang "es"}}ESPECIALISTA EN AUTENTICACIÓN{{else}}AUTHENTICATION SPECIALIST{{end}} - | - {{if eq .Lang "es"}}ARQUITECTO DE SOLUCIONES{{else}}SOLUTION ARCHITECT{{end}} -
+ {{template "title-badges" .}}
- - {{if .CV.Awards}} -
-
- -

- - {{if eq .Lang "es"}}Premios y Reconocimientos{{else}}Awards{{end}} -

-
- {{range .CV.Awards}} -
- {{if .AwardLogo}} - - {{end}} -
- {{.Title}}
- {{.Issuer}} - {{.Date}} - - {{if .ShortDescription}} -

{{.ShortDescription | safeHTML}}

- {{end}} - - {{if .Responsibilities}} -
    - {{range .Responsibilities}} -
  • {{. | safeHTML}}
  • - {{end}} -
- {{end}} -
-
- {{end}} -
-
- {{end}} - - - {{if .CV.Projects}} -
-
- -

- - {{if eq .Lang "es"}}Proyectos Personales / Freelance{{else}}Personal / Freelance Projects{{end}} -

-
- {{range .CV.Projects}} -
- {{if .ProjectLogo}} -
- {{.Title}} logo -
- {{else}} -
- -
- {{end}} -
- - {{if .ProjectName}} - {{if .URL}}{{.ProjectName}}{{else}}{{.ProjectName}}{{end}}{{if .ProjectDesc}} - {{.ProjectDesc}}{{end}} - {{else}} - {{if .URL}}{{.Title}}{{else}}{{.Title}}{{end}} - {{end}} - - {{if .Current}}LIVE{{end}} - {{if .MaintainedBy}}{{if eq $.Lang "es"}}MANTENIDO POR{{else}}MAINTAINED BY{{end}} {{.MaintainedBy}}{{end}} -
- {{if .StartDate}}{{.StartDate}}{{if .Current}}{{if .DynamicDate}} / {{.DynamicDate}}{{else}} / {{if eq $.Lang "es"}}presente{{else}}ahora{{end}}{{end}}{{end}}{{end}} - ({{.Location}}) - - {{if .ShortDescription}} -

{{.ShortDescription | safeHTML}}

- {{end}} - - {{if .Responsibilities}} -
    - {{range .Responsibilities}} -
  • {{. | safeHTML}}
  • - {{end}} -
- {{end}} - - {{if .Technologies}} -
- {{if eq $.Lang "es"}}Tecnologías:{{else}}Technologies:{{end}} - {{range $index, $tech := .Technologies}}{{if $index}}, {{end}}{{$tech}}{{end}} -
- {{end}} -
-
- {{end}} - - - -
-
- {{end}} - - - {{if .CV.Courses}} -
-
- -

- - {{if eq .Lang "es"}}Cursos Realizados{{else}}Courses{{end}} -

-
- {{range .CV.Courses}} -
- {{if .CourseLogo}} -
- {{.Title}} logo -
- {{else}} -
- -
- {{end}} -
- {{.Title}}
- {{.Institution}} - {{.Date}} - ({{.Location}}) - - {{if .ShortDescription}} -

{{.ShortDescription}}

- {{end}} - - {{if .Responsibilities}} -
    - {{range .Responsibilities}} -
  • {{. | safeHTML}}
  • - {{end}} -
- {{end}} -
-
- {{end}} -
-
- {{end}} - - -
-
- -

- - {{if eq .Lang "es"}}Idiomas{{else}}Languages{{end}} -

-
- {{range .CV.Languages}} -
- {{.Language}}: {{.Proficiency}}{{if .Detail}} {{.Detail}}{{end}} -
- {{end}} -
-
- - - {{if .CV.References}} -
-
- -

- - {{if eq .Lang "es"}}Referencias{{else}}References{{end}} -

-
- {{range .CV.References}} -
- {{if .TextBefore}}{{.TextBefore}} {{end}}{{if eq .Action "downloadPDF"}}{{if .LinkText}}{{.LinkText}}{{else}}{{.Title}}{{end}}{{else}}{{if .LinkText}}{{.LinkText}}{{else}}{{.Title}}{{end}}{{end}}{{if .TextAfter}} {{.TextAfter}}{{end}} -
- {{end}} -
-
- {{end}} - - - {{if .CV.Other.DriverLicense}} -
-
- -

- - {{if eq .Lang "es"}}Otros{{else}}Other{{end}} -

-
-
- {{if eq .Lang "es"}}Carnet de conducir tipo {{.CV.Other.DriverLicense}}{{else}}Driving License type {{.CV.Other.DriverLicense}}{{end}} -
-
-
- {{end}} + {{template "section-awards" .}} + {{template "section-projects" .}} + {{template "section-courses" .}} + {{template "section-languages" .}} + {{template "section-references" .}} + {{template "section-other" .}}
@@ -364,14 +61,14 @@
- - + {{template "cv-footer" .}}
diff --git a/templates/cv-content.html.backup b/templates/cv-content.html.backup new file mode 100644 index 0000000..31b53f1 --- /dev/null +++ b/templates/cv-content.html.backup @@ -0,0 +1,423 @@ + +
+ +
+ {{if eq .Lang "es"}}CONSULTOR TÉCNICO{{else}}TECHNICAL CONSULTANT{{end}} + | + {{if eq .Lang "es"}}INGENIERO FULL-STACK{{else}}FULL-STACK ENGINEER{{end}} + | + {{if eq .Lang "es"}}ESPECIALISTA EN AUTENTICACIÓN{{else}}AUTHENTICATION SPECIALIST{{end}} + | + {{if eq .Lang "es"}}ARQUITECTO DE SOLUCIONES{{else}}SOLUTION ARCHITECT{{end}} +
+ + +
+ + + + +
+ +
+
+
+

Moreno Rubio, Juan Andrés

+

{{.YearsOfExperience}} {{if eq .Lang "es"}}años de experiencia{{else}}years of experience{{end}}

+ + +
+ {{.CV.Personal.Name}} +
+ + +
{{.CV.Summary}}
+
+
+
+ + +
+
+ +

+ + {{if eq .Lang "es"}}Formación{{else}}Training{{end}} +

+
+ {{range .CV.Education}} +
+ {{.Degree}} ({{.StartDate}}-{{.EndDate}}) {{if eq $.Lang "es"}}obtenido de{{else}}obtained from the{{end}} {{.Institution}} ({{.Location}}) +
+ {{end}} +
+
+ + +
+
+ +

+ + {{if eq .Lang "es"}}Competencias{{else}}Skills{{end}} +

+
+

+ {{if eq .Lang "es"}} + 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. + {{else}} + 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. + {{end}} +

+
+
+ + +
+
+ +

+ + {{if eq .Lang "es"}}Experiencia{{else}}Experience{{end}} +

+
+ + {{range .CV.Experience}} +
+ +
+ {{.Position}}{{if .Company}} - {{if .CompanyURL}}{{.Company}}{{else}}{{.Company}}{{end}}{{if .Duration}} - {{.Duration}}{{end}}{{end}} + {{if .Current}}{{if eq $.Lang "es"}}ACTUAL{{else}}CURRENT{{end}}{{end}} + {{if .Expired}}{{if eq $.Lang "es"}}EXPIRADO{{else}}EXPIRED{{end}}{{end}} +
+ {{.StartDate}} / {{if .Current}}{{if eq $.Lang "es"}}presente{{else}}now{{end}}{{else}}{{.EndDate}}{{end}} - ({{.Location}}) + + {{if .ShortDescription}} +

{{.ShortDescription | safeHTML}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} +
+
+ {{end}} +
+
+
+
+
+ + +
+ +
+ {{if eq .Lang "es"}}CONSULTOR TÉCNICO{{else}}TECHNICAL CONSULTANT{{end}} + | + {{if eq .Lang "es"}}INGENIERO FULL-STACK{{else}}FULL-STACK ENGINEER{{end}} + | + {{if eq .Lang "es"}}ESPECIALISTA EN AUTENTICACIÓN{{else}}AUTHENTICATION SPECIALIST{{end}} + | + {{if eq .Lang "es"}}ARQUITECTO DE SOLUCIONES{{else}}SOLUTION ARCHITECT{{end}} +
+ + +
+ +
+ + {{if .CV.Awards}} +
+
+ +

+ + {{if eq .Lang "es"}}Premios y Reconocimientos{{else}}Awards{{end}} +

+
+ {{range .CV.Awards}} +
+ {{if .AwardLogo}} + + {{end}} +
+ {{.Title}}
+ {{.Issuer}} - {{.Date}} + + {{if .ShortDescription}} +

{{.ShortDescription | safeHTML}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} +
+
+ {{end}} +
+
+ {{end}} + + + {{if .CV.Projects}} +
+
+ +

+ + {{if eq .Lang "es"}}Proyectos Personales / Freelance{{else}}Personal / Freelance Projects{{end}} +

+
+ {{range .CV.Projects}} +
+ {{if .ProjectLogo}} +
+ {{.Title}} logo +
+ {{else}} +
+ +
+ {{end}} +
+ + {{if .ProjectName}} + {{if .URL}}{{.ProjectName}}{{else}}{{.ProjectName}}{{end}}{{if .ProjectDesc}} - {{.ProjectDesc}}{{end}} + {{else}} + {{if .URL}}{{.Title}}{{else}}{{.Title}}{{end}} + {{end}} + + {{if .Current}}LIVE{{end}} + {{if .MaintainedBy}}{{if eq $.Lang "es"}}MANTENIDO POR{{else}}MAINTAINED BY{{end}} {{.MaintainedBy}}{{end}} +
+ {{if .StartDate}}{{.StartDate}}{{if .Current}}{{if .DynamicDate}} / {{.DynamicDate}}{{else}} / {{if eq $.Lang "es"}}presente{{else}}ahora{{end}}{{end}}{{end}}{{end}} - ({{.Location}}) + + {{if .ShortDescription}} +

{{.ShortDescription | safeHTML}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} + + {{if .Technologies}} +
+ {{if eq $.Lang "es"}}Tecnologías:{{else}}Technologies:{{end}} + {{range $index, $tech := .Technologies}}{{if $index}}, {{end}}{{$tech}}{{end}} +
+ {{end}} +
+
+ {{end}} + + + +
+
+ {{end}} + + + {{if .CV.Courses}} +
+
+ +

+ + {{if eq .Lang "es"}}Cursos Realizados{{else}}Courses{{end}} +

+
+ {{range .CV.Courses}} +
+ {{if .CourseLogo}} +
+ {{.Title}} logo +
+ {{else}} +
+ +
+ {{end}} +
+ {{.Title}}
+ {{.Institution}} - {{.Date}} - ({{.Location}}) + + {{if .ShortDescription}} +

{{.ShortDescription}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} +
+
+ {{end}} +
+
+ {{end}} + + +
+
+ +

+ + {{if eq .Lang "es"}}Idiomas{{else}}Languages{{end}} +

+
+ {{range .CV.Languages}} +
+ {{.Language}}: {{.Proficiency}}{{if .Detail}} {{.Detail}}{{end}} +
+ {{end}} +
+
+ + + {{if .CV.References}} +
+
+ +

+ + {{if eq .Lang "es"}}Referencias{{else}}References{{end}} +

+
+ {{range .CV.References}} +
+ {{if .TextBefore}}{{.TextBefore}} {{end}}{{if eq .Action "downloadPDF"}}{{if .LinkText}}{{.LinkText}}{{else}}{{.Title}}{{end}}{{else}}{{if .LinkText}}{{.LinkText}}{{else}}{{.Title}}{{end}}{{end}}{{if .TextAfter}} {{.TextAfter}}{{end}} +
+ {{end}} +
+
+ {{end}} + + + {{if .CV.Other.DriverLicense}} +
+
+ +

+ + {{if eq .Lang "es"}}Otros{{else}}Other{{end}} +

+
+
+ {{if eq .Lang "es"}}Carnet de conducir tipo {{.CV.Other.DriverLicense}}{{else}}Driving License type {{.CV.Other.DriverLicense}}{{end}} +
+
+
+ {{end}} +
+ + + +
+ + + +
diff --git a/templates/index.html b/templates/index.html index dcc54f1..a918a7b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -99,405 +99,30 @@ - - - - - + {{template "action-bar" .}} + {{template "hamburger-menu" .}}
-
- {{template "cv-content.html" .}} -
-
- - - - - - - - - - - - - - -
-
- - -
-

{{.UI.InfoModal.Title}}

-
- CV {{.CurrentYear}} JAMR - - - JAMR - -
-
- -
-

- {{.UI.InfoModal.Description}} -

- -
-
- - {{.UI.InfoModal.TechStack.GoHono}} -
-
- - {{.UI.InfoModal.TechStack.HTMX}} -
-
- - {{.UI.InfoModal.TechStack.HTML5}} -
-
- - {{.UI.InfoModal.TechStack.CSS3}} -
-
- -

{{.UI.InfoModal.ViewSourceSubtext}}

- - - {{.UI.InfoModal.ViewSource}} - - -
+
+ {{template "cv-content.html" .}} +
-
+ + {{template "page-footer" .}}
- -
-
- - -
-
🚧
-

{{if eq .Lang "es"}}Exportación PDF - En Desarrollo{{else}}PDF Export - Work in Progress{{end}}

-
- -
-

- {{if eq .Lang "es"}} - La función de exportación a PDF está siendo mejorada. Por favor, usa el botón Imprimir Amigable en su lugar (Ctrl+P o Cmd+P para guardar como PDF). - {{else}} - The PDF export feature is currently being improved. Please use the Print Friendly button instead (Ctrl+P or Cmd+P to save as PDF). - {{end}} -

-
-
-
- - -
- - - - - - - - - -
+ {{template "error-toast" .}} + {{template "back-to-top" .}} + {{template "info-button" .}} + {{template "info-modal" .}} + {{template "pdf-modal" .}} + {{template "zoom-control" .}} diff --git a/templates/index.html.backup b/templates/index.html.backup new file mode 100644 index 0000000..dcc54f1 --- /dev/null +++ b/templates/index.html.backup @@ -0,0 +1,521 @@ + + + + + + + + {{.CV.Personal.Name}} - {{if eq .Lang "es"}}Curriculum Vitae{{else}}Curriculum Vitae{{end}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ {{template "cv-content.html" .}} +
+
+ + + + + + + + + + + + + + +
+
+ + +
+

{{.UI.InfoModal.Title}}

+
+ CV {{.CurrentYear}} JAMR - + + JAMR + +
+
+ +
+

+ {{.UI.InfoModal.Description}} +

+ +
+
+ + {{.UI.InfoModal.TechStack.GoHono}} +
+
+ + {{.UI.InfoModal.TechStack.HTMX}} +
+
+ + {{.UI.InfoModal.TechStack.HTML5}} +
+
+ + {{.UI.InfoModal.TechStack.CSS3}} +
+
+ +

{{.UI.InfoModal.ViewSourceSubtext}}

+ + + {{.UI.InfoModal.ViewSource}} + + +
+
+
+
+ + +
+
+ + +
+
🚧
+

{{if eq .Lang "es"}}Exportación PDF - En Desarrollo{{else}}PDF Export - Work in Progress{{end}}

+
+ +
+

+ {{if eq .Lang "es"}} + La función de exportación a PDF está siendo mejorada. Por favor, usa el botón Imprimir Amigable en su lugar (Ctrl+P o Cmd+P para guardar como PDF). + {{else}} + The PDF export feature is currently being improved. Please use the Print Friendly button instead (Ctrl+P or Cmd+P to save as PDF). + {{end}} +

+
+
+
+ + +
+ + + + + + + + + +
+ + + + + + + + + diff --git a/templates/partials/cv/cv-footer.html b/templates/partials/cv/cv-footer.html new file mode 100644 index 0000000..e63074c --- /dev/null +++ b/templates/partials/cv/cv-footer.html @@ -0,0 +1,42 @@ +{{define "cv-footer"}} + + +{{end}} diff --git a/templates/partials/cv/page-footer.html b/templates/partials/cv/page-footer.html new file mode 100644 index 0000000..f087870 --- /dev/null +++ b/templates/partials/cv/page-footer.html @@ -0,0 +1,13 @@ +{{define "page-footer"}} + + +{{end}} diff --git a/templates/partials/cv/sidebar.html b/templates/partials/cv/sidebar.html new file mode 100644 index 0000000..760366d --- /dev/null +++ b/templates/partials/cv/sidebar.html @@ -0,0 +1,24 @@ +{{define "sidebar"}} + + +{{end}} diff --git a/templates/partials/cv/title-badges.html b/templates/partials/cv/title-badges.html new file mode 100644 index 0000000..a7159f4 --- /dev/null +++ b/templates/partials/cv/title-badges.html @@ -0,0 +1,12 @@ +{{define "title-badges"}} + +
+ {{if eq .Lang "es"}}CONSULTOR TÉCNICO{{else}}TECHNICAL CONSULTANT{{end}} + | + {{if eq .Lang "es"}}INGENIERO FULL-STACK{{else}}FULL-STACK ENGINEER{{end}} + | + {{if eq .Lang "es"}}ESPECIALISTA EN AUTENTICACIÓN{{else}}AUTHENTICATION SPECIALIST{{end}} + | + {{if eq .Lang "es"}}ARQUITECTO DE SOLUCIONES{{else}}SOLUTION ARCHITECT{{end}} +
+{{end}} diff --git a/templates/partials/modals/info-modal.html b/templates/partials/modals/info-modal.html new file mode 100644 index 0000000..c74269d --- /dev/null +++ b/templates/partials/modals/info-modal.html @@ -0,0 +1,52 @@ +{{define "info-modal"}} + +
+
+ + +
+

{{.UI.InfoModal.Title}}

+
+ CV {{.CurrentYear}} JAMR - + + JAMR + +
+
+ +
+

+ {{.UI.InfoModal.Description}} +

+ +
+
+ + {{.UI.InfoModal.TechStack.GoHono}} +
+
+ + {{.UI.InfoModal.TechStack.HTMX}} +
+
+ + {{.UI.InfoModal.TechStack.HTML5}} +
+
+ + {{.UI.InfoModal.TechStack.CSS3}} +
+
+ +

{{.UI.InfoModal.ViewSourceSubtext}}

+ + + {{.UI.InfoModal.ViewSource}} + + +
+
+
+{{end}} diff --git a/templates/partials/modals/pdf-modal.html b/templates/partials/modals/pdf-modal.html new file mode 100644 index 0000000..b4f7820 --- /dev/null +++ b/templates/partials/modals/pdf-modal.html @@ -0,0 +1,25 @@ +{{define "pdf-modal"}} + +
+
+ + +
+
🚧
+

{{if eq .Lang "es"}}Exportación PDF - En Desarrollo{{else}}PDF Export - Work in Progress{{end}}

+
+ +
+

+ {{if eq .Lang "es"}} + La función de exportación a PDF está siendo mejorada. Por favor, usa el botón Imprimir Amigable en su lugar (Ctrl+P o Cmd+P para guardar como PDF). + {{else}} + The PDF export feature is currently being improved. Please use the Print Friendly button instead (Ctrl+P or Cmd+P to save as PDF). + {{end}} +

+
+
+
+{{end}} diff --git a/templates/partials/navigation/action-bar.html b/templates/partials/navigation/action-bar.html new file mode 100644 index 0000000..9f09648 --- /dev/null +++ b/templates/partials/navigation/action-bar.html @@ -0,0 +1,41 @@ +{{define "action-bar"}} + + +{{end}} diff --git a/templates/partials/navigation/action-buttons.html b/templates/partials/navigation/action-buttons.html new file mode 100644 index 0000000..87404d6 --- /dev/null +++ b/templates/partials/navigation/action-buttons.html @@ -0,0 +1,19 @@ +{{define "action-buttons"}} + +
+ + +
+{{end}} diff --git a/templates/partials/navigation/hamburger-menu.html b/templates/partials/navigation/hamburger-menu.html new file mode 100644 index 0000000..9c0c888 --- /dev/null +++ b/templates/partials/navigation/hamburger-menu.html @@ -0,0 +1,145 @@ +{{define "hamburger-menu"}} + + +{{end}} diff --git a/templates/partials/navigation/language-selector.html b/templates/partials/navigation/language-selector.html new file mode 100644 index 0000000..32d3078 --- /dev/null +++ b/templates/partials/navigation/language-selector.html @@ -0,0 +1,11 @@ +{{define "language-selector"}} + +
+ + +
+{{end}} diff --git a/templates/partials/navigation/view-controls.html b/templates/partials/navigation/view-controls.html new file mode 100644 index 0000000..15874f4 --- /dev/null +++ b/templates/partials/navigation/view-controls.html @@ -0,0 +1,40 @@ +{{define "view-controls"}} + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+{{end}} diff --git a/templates/partials/sections/awards.html b/templates/partials/sections/awards.html new file mode 100644 index 0000000..68c1cea --- /dev/null +++ b/templates/partials/sections/awards.html @@ -0,0 +1,40 @@ +{{define "section-awards"}} + +{{if .CV.Awards}} +
+
+ +

+ + {{if eq .Lang "es"}}Premios y Reconocimientos{{else}}Awards{{end}} +

+
+ {{range .CV.Awards}} +
+ {{if .AwardLogo}} + + {{end}} +
+ {{.Title}}
+ {{.Issuer}} - {{.Date}} + + {{if .ShortDescription}} +

{{.ShortDescription | safeHTML}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} +
+
+ {{end}} +
+
+{{end}} +{{end}} diff --git a/templates/partials/sections/courses.html b/templates/partials/sections/courses.html new file mode 100644 index 0000000..73400bc --- /dev/null +++ b/templates/partials/sections/courses.html @@ -0,0 +1,44 @@ +{{define "section-courses"}} + +{{if .CV.Courses}} +
+
+ +

+ + {{if eq .Lang "es"}}Cursos Realizados{{else}}Courses{{end}} +

+
+ {{range .CV.Courses}} +
+ {{if .CourseLogo}} +
+ {{.Title}} logo +
+ {{else}} +
+ +
+ {{end}} +
+ {{.Title}}
+ {{.Institution}} - {{.Date}} - ({{.Location}}) + + {{if .ShortDescription}} +

{{.ShortDescription}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} +
+
+ {{end}} +
+
+{{end}} +{{end}} diff --git a/templates/partials/sections/education.html b/templates/partials/sections/education.html new file mode 100644 index 0000000..7e0ec01 --- /dev/null +++ b/templates/partials/sections/education.html @@ -0,0 +1,18 @@ +{{define "section-education"}} + +
+
+ +

+ + {{if eq .Lang "es"}}Formación{{else}}Training{{end}} +

+
+ {{range .CV.Education}} +
+ {{.Degree}} ({{.StartDate}}-{{.EndDate}}) {{if eq $.Lang "es"}}obtenido de{{else}}obtained from the{{end}} {{.Institution}} ({{.Location}}) +
+ {{end}} +
+
+{{end}} diff --git a/templates/partials/sections/experience.html b/templates/partials/sections/experience.html new file mode 100644 index 0000000..3806024 --- /dev/null +++ b/templates/partials/sections/experience.html @@ -0,0 +1,44 @@ +{{define "section-experience"}} + +
+
+ +

+ + {{if eq .Lang "es"}}Experiencia{{else}}Experience{{end}} +

+
+ + {{range .CV.Experience}} +
+ +
+ {{.Position}}{{if .Company}} - {{if .CompanyURL}}{{.Company}}{{else}}{{.Company}}{{end}}{{if .Duration}} - {{.Duration}}{{end}}{{end}} + {{if .Current}}{{if eq $.Lang "es"}}ACTUAL{{else}}CURRENT{{end}}{{end}} + {{if .Expired}}{{if eq $.Lang "es"}}EXPIRADO{{else}}EXPIRED{{end}}{{end}} +
+ {{.StartDate}} / {{if .Current}}{{if eq $.Lang "es"}}presente{{else}}now{{end}}{{else}}{{.EndDate}}{{end}} - ({{.Location}}) + + {{if .ShortDescription}} +

{{.ShortDescription | safeHTML}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} +
+
+ {{end}} +
+
+{{end}} diff --git a/templates/partials/sections/header.html b/templates/partials/sections/header.html new file mode 100644 index 0000000..474d1f2 --- /dev/null +++ b/templates/partials/sections/header.html @@ -0,0 +1,19 @@ +{{define "section-header"}} + +
+
+
+

Moreno Rubio, Juan Andrés

+

{{.YearsOfExperience}} {{if eq .Lang "es"}}años de experiencia{{else}}years of experience{{end}}

+ + +
+ {{.CV.Personal.Name}} +
+ + +
{{.CV.Summary}}
+
+
+
+{{end}} diff --git a/templates/partials/sections/languages.html b/templates/partials/sections/languages.html new file mode 100644 index 0000000..b774225 --- /dev/null +++ b/templates/partials/sections/languages.html @@ -0,0 +1,18 @@ +{{define "section-languages"}} + +
+
+ +

+ + {{if eq .Lang "es"}}Idiomas{{else}}Languages{{end}} +

+
+ {{range .CV.Languages}} +
+ {{.Language}}: {{.Proficiency}}{{if .Detail}} {{.Detail}}{{end}} +
+ {{end}} +
+
+{{end}} diff --git a/templates/partials/sections/other.html b/templates/partials/sections/other.html new file mode 100644 index 0000000..44da851 --- /dev/null +++ b/templates/partials/sections/other.html @@ -0,0 +1,18 @@ +{{define "section-other"}} + +{{if .CV.Other.DriverLicense}} +
+
+ +

+ + {{if eq .Lang "es"}}Otros{{else}}Other{{end}} +

+
+
+ {{if eq .Lang "es"}}Carnet de conducir tipo {{.CV.Other.DriverLicense}}{{else}}Driving License type {{.CV.Other.DriverLicense}}{{end}} +
+
+
+{{end}} +{{end}} diff --git a/templates/partials/sections/projects.html b/templates/partials/sections/projects.html new file mode 100644 index 0000000..03832f6 --- /dev/null +++ b/templates/partials/sections/projects.html @@ -0,0 +1,66 @@ +{{define "section-projects"}} + +{{if .CV.Projects}} +
+
+ +

+ + {{if eq .Lang "es"}}Proyectos Personales / Freelance{{else}}Personal / Freelance Projects{{end}} +

+
+ {{range .CV.Projects}} +
+ {{if .ProjectLogo}} +
+ {{.Title}} logo +
+ {{else}} +
+ +
+ {{end}} +
+ + {{if .ProjectName}} + {{if .URL}}{{.ProjectName}}{{else}}{{.ProjectName}}{{end}}{{if .ProjectDesc}} - {{.ProjectDesc}}{{end}} + {{else}} + {{if .URL}}{{.Title}}{{else}}{{.Title}}{{end}} + {{end}} + + {{if .Current}}LIVE{{end}} + {{if .MaintainedBy}}{{if eq $.Lang "es"}}MANTENIDO POR{{else}}MAINTAINED BY{{end}} {{.MaintainedBy}}{{end}} +
+ {{if .StartDate}}{{.StartDate}}{{if .Current}}{{if .DynamicDate}} / {{.DynamicDate}}{{else}} / {{if eq $.Lang "es"}}presente{{else}}ahora{{end}}{{end}}{{end}}{{end}} - ({{.Location}}) + + {{if .ShortDescription}} +

{{.ShortDescription | safeHTML}}

+ {{end}} + + {{if .Responsibilities}} +
    + {{range .Responsibilities}} +
  • {{. | safeHTML}}
  • + {{end}} +
+ {{end}} + + {{if .Technologies}} +
+ {{if eq $.Lang "es"}}Tecnologías:{{else}}Technologies:{{end}} + {{range $index, $tech := .Technologies}}{{if $index}}, {{end}}{{$tech}}{{end}} +
+ {{end}} +
+
+ {{end}} + + + +
+
+{{end}} +{{end}} diff --git a/templates/partials/sections/references.html b/templates/partials/sections/references.html new file mode 100644 index 0000000..fdc70c2 --- /dev/null +++ b/templates/partials/sections/references.html @@ -0,0 +1,20 @@ +{{define "section-references"}} + +{{if .CV.References}} +
+
+ +

+ + {{if eq .Lang "es"}}Referencias{{else}}References{{end}} +

+
+ {{range .CV.References}} +
+ {{if .TextBefore}}{{.TextBefore}} {{end}}{{if eq .Action "downloadPDF"}}{{if .LinkText}}{{.LinkText}}{{else}}{{.Title}}{{end}}{{else}}{{if .LinkText}}{{.LinkText}}{{else}}{{.Title}}{{end}}{{end}}{{if .TextAfter}} {{.TextAfter}}{{end}} +
+ {{end}} +
+
+{{end}} +{{end}} diff --git a/templates/partials/sections/skills-summary.html b/templates/partials/sections/skills-summary.html new file mode 100644 index 0000000..e9828c4 --- /dev/null +++ b/templates/partials/sections/skills-summary.html @@ -0,0 +1,20 @@ +{{define "section-skills-summary"}} + +
+
+ +

+ + {{if eq .Lang "es"}}Competencias{{else}}Skills{{end}} +

+
+

+ {{if eq .Lang "es"}} + 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. + {{else}} + 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. + {{end}} +

+
+
+{{end}} diff --git a/templates/partials/widgets/back-to-top.html b/templates/partials/widgets/back-to-top.html new file mode 100644 index 0000000..58a87f2 --- /dev/null +++ b/templates/partials/widgets/back-to-top.html @@ -0,0 +1,6 @@ +{{define "back-to-top"}} + + +{{end}} diff --git a/templates/partials/widgets/error-toast.html b/templates/partials/widgets/error-toast.html new file mode 100644 index 0000000..877808a --- /dev/null +++ b/templates/partials/widgets/error-toast.html @@ -0,0 +1,8 @@ +{{define "error-toast"}} + + +{{end}} diff --git a/templates/partials/widgets/info-button.html b/templates/partials/widgets/info-button.html new file mode 100644 index 0000000..2606427 --- /dev/null +++ b/templates/partials/widgets/info-button.html @@ -0,0 +1,6 @@ +{{define "info-button"}} + + +{{end}} diff --git a/templates/partials/widgets/zoom-control.html b/templates/partials/widgets/zoom-control.html new file mode 100644 index 0000000..fbf1198 --- /dev/null +++ b/templates/partials/widgets/zoom-control.html @@ -0,0 +1,39 @@ +{{define "zoom-control"}} + +
+ + + + + + + + + +
+{{end}}