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 @@
-
-
+ {{template "title-badges" .}}
@@ -21,14 +12,14 @@
-
-
+ {{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}}
-
-
-
- {{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}}
-
-
-
- {{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}}
-
- {{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"}}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}}
+
+
+ {{if .CompanyLogo}}
+
+ {{else}}
+
+ {{end}}
+
+
+
{{.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 .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}}
+
+
+
+ {{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}}
+
+
+
+ {{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}}
+
+ {{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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{if eq .Lang "es"}}Descargar como PDF{{else}}Download as PDF{{end}}
-
-
-
- {{if eq .Lang "es"}}Imprimir amigable{{else}}Print Friendly{{end}}
-
-
-
-
-
-
-
-
-
-
-
+ {{template "action-bar" .}}
+ {{template "hamburger-menu" .}}
-
- {{template "cv-content.html" .}}
-
-
-
-
-
-
-
-
- ⚠️
-
- ×
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{.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"}}
- 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}}
-
-
-
-
-
-
-
-
-
-
-
- 25
-
-
-
- 175
-
-
- 100
-
-
+ {{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}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{if eq .Lang "es"}}Descargar como PDF{{else}}Download as PDF{{end}}
+
+
+
+ {{if eq .Lang "es"}}Imprimir amigable{{else}}Print Friendly{{end}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{template "cv-content.html" .}}
+
+
+
+
+
+
+
+
+ ⚠️
+
+ ×
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{.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"}}
+ 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}}
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+ 175
+
+
+ 100
+
+
+
+
+
+
+
+
+
+
+
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"}}
+
+
+{{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.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"}}
+ 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"}}
+
+
+
+
+
+
+ {{template "view-controls" .}}
+ {{template "action-buttons" .}}
+
+
+
+
+
+
+{{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"}}
+
+
+
+
+ {{if eq .Lang "es"}}Descargar como PDF{{else}}Download as PDF{{end}}
+
+
+
+ {{if eq .Lang "es"}}Imprimir amigable{{else}}Print Friendly{{end}}
+
+
+{{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"}}
+
+
+
+ English
+
+
+ Español
+
+
+{{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}}
+
+
+
+ {{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}}
+
+
+ {{if .CompanyLogo}}
+
+ {{else}}
+
+ {{end}}
+
+
+
{{.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"}}
+
+
+{{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}}
+
+
+
+ {{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}}
+
+ {{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"}}
+
+
+
+
+
+
+ 25
+
+
+
+ 175
+
+
+ 100
+
+
+{{end}}