diff --git a/data/cv-en.json b/data/cv-en.json
index 10e0c29..15cff90 100644
--- a/data/cv-en.json
+++ b/data/cv-en.json
@@ -702,6 +702,36 @@
]
}
],
+ "projects": [
+ {
+ "title": "Somos Una Ola - Beach Cleaning Initiative",
+ "url": "https://somosunaola.org",
+ "location": "La Palma, Canary Islands",
+ "startDate": "2023-07",
+ "current": true,
+ "technologies": ["Node.js", "Express.js", "HTMX"],
+ "shortDescription": "Volunteer project promoting beach cleaning on La Palma island. Created their website to publish completed cleanings and schedule future events.",
+ "responsibilities": [
+ "Designed and developed full-stack website using Node.js Express and HTMX",
+ "Implemented event publishing system for completed and upcoming beach cleanings",
+ "Supported environmental initiative that has completed 18 cleanings across 12 beaches"
+ ]
+ },
+ {
+ "title": "Herrumbre Vivo Arte - Artist Portfolio Website",
+ "url": "https://herrumbrevivoarte.com",
+ "location": "Fuencaliente, La Palma",
+ "startDate": "2024",
+ "current": true,
+ "technologies": ["Web Development", "Portfolio Design"],
+ "shortDescription": "Portfolio website for Gustavo Díaz, artisan who transforms recycled materials into sculptures. Promotes environmental art and sustainable creativity.",
+ "responsibilities": [
+ "Created online presence for recycled art project focused on sustainability",
+ "Showcased sculptures made from metal, plastic, glass, and wood waste",
+ "Highlighted environmental workshops and educational mission aligned with Sustainable Development Goals"
+ ]
+ }
+ ],
"references": [
{
"title": "Recommendations Letter from TwenTIC",
diff --git a/data/cv-es.json b/data/cv-es.json
index 8e07aeb..97db8f3 100644
--- a/data/cv-es.json
+++ b/data/cv-es.json
@@ -734,6 +734,36 @@
]
}
],
+ "projects": [
+ {
+ "title": "Somos Una Ola - Iniciativa de Limpieza de Playas",
+ "url": "https://somosunaola.org",
+ "location": "La Palma, Islas Canarias",
+ "startDate": "2023-07",
+ "current": true,
+ "technologies": ["Node.js", "Express.js", "HTMX"],
+ "shortDescription": "Proyecto de voluntariado que promueve la limpieza de playas en la isla de La Palma. Creación de su sitio web para publicar limpiezas realizadas y programar eventos futuros.",
+ "responsibilities": [
+ "Diseñé y desarrollé sitio web full-stack usando Node.js Express y HTMX",
+ "Implementé sistema de publicación de eventos para limpiezas realizadas y futuras",
+ "Apoyé iniciativa ambiental que ha completado 18 limpiezas en 12 playas diferentes"
+ ]
+ },
+ {
+ "title": "Herrumbre Vivo Arte - Sitio Web Portfolio de Artista",
+ "url": "https://herrumbrevivoarte.com",
+ "location": "Fuencaliente, La Palma",
+ "startDate": "2024",
+ "current": true,
+ "technologies": ["Desarrollo Web", "Diseño de Portfolio"],
+ "shortDescription": "Sitio web portfolio para Gustavo Díaz, artesano que transforma materiales reciclados en esculturas. Promueve arte ambiental y creatividad sostenible.",
+ "responsibilities": [
+ "Creé presencia online para proyecto de arte reciclado enfocado en sostenibilidad",
+ "Mostré esculturas hechas de desechos metálicos, plásticos, vidrio y madera",
+ "Destaqué talleres ambientales y misión educativa alineada con Objetivos de Desarrollo Sostenible"
+ ]
+ }
+ ],
"references": [
{
"title": "Cartas de recomendación de TwenTiC",
diff --git a/internal/models/cv.go b/internal/models/cv.go
index ceacbe9..c4d52dc 100644
--- a/internal/models/cv.go
+++ b/internal/models/cv.go
@@ -99,13 +99,14 @@ type Language struct {
}
type Project struct {
- Name string `json:"name"`
- Role string `json:"role"`
- URL string `json:"url"`
- Period string `json:"period"`
- Description string `json:"description"`
- Technologies []string `json:"technologies"`
- Highlights []string `json:"highlights"`
+ Title string `json:"title"`
+ URL string `json:"url"`
+ Location string `json:"location"`
+ StartDate string `json:"startDate"`
+ Current bool `json:"current"`
+ Technologies []string `json:"technologies"`
+ ShortDescription string `json:"shortDescription"`
+ Responsibilities []string `json:"responsibilities"`
}
type Award struct {
diff --git a/static/css/main.css b/static/css/main.css
index 569f5c0..b9cc0e4 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -935,6 +935,116 @@ iconify-icon {
text-align: justify;
}
+/* Projects */
+.project-item {
+ display: flex;
+ gap: 1.2rem;
+ align-items: flex-start;
+ margin-bottom: 2.5rem;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.project-icon {
+ flex-shrink: 0;
+ width: 80px;
+ height: 80px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.default-project-icon {
+ width: 80px;
+ height: 80px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 4px;
+ border: 1px solid #ddd;
+ background: #f5f5f5;
+ color: #999;
+ padding: 10px;
+}
+
+.project-content {
+ flex: 1;
+}
+
+.project-header {
+ margin-bottom: 0.5rem;
+}
+
+.project-title {
+ font-size: 1em;
+ font-weight: 600;
+ margin: 0 0 0.3rem 0;
+ line-height: 1.4;
+ color: var(--text-dark);
+}
+
+.project-title-text {
+ display: inline;
+}
+
+.project-title-text a {
+ color: var(--accent-blue);
+ text-decoration: none;
+}
+
+.project-title-text a:hover {
+ text-decoration: underline;
+}
+
+.project-period,
+.project-separator,
+.project-location {
+ color: #555;
+ font-size: 0.9em;
+ font-weight: 600;
+}
+
+.project-separator {
+ color: #999;
+}
+
+.project-desc {
+ font-size: 0.9rem;
+ color: var(--text-dark);
+ margin-top: 0.5rem;
+ line-height: 1.6;
+ text-align: justify;
+}
+
+.project-technologies {
+ font-size: 0.85em;
+ color: var(--text-gray);
+ margin-top: 0.5rem;
+ line-height: 1.4;
+}
+
+.projects-footer {
+ margin-top: 1.5rem;
+ padding-top: 1rem;
+ border-top: 2px solid #ddd;
+ text-align: center;
+ font-size: 0.95em;
+ color: var(--text-gray);
+}
+
+.projects-footer p {
+ margin: 0;
+}
+
+.projects-footer a {
+ color: var(--accent-blue);
+ text-decoration: none;
+}
+
+.projects-footer a:hover {
+ text-decoration: underline;
+}
+
/* References */
.reference-item {
margin-bottom: 0.6rem;
diff --git a/templates/cv-content.html b/templates/cv-content.html
index d1f6bb5..a4c2a02 100644
--- a/templates/cv-content.html
+++ b/templates/cv-content.html
@@ -157,41 +157,6 @@
-
- {{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.Courses}}
{{end}}
+
+ {{if .CV.Projects}}
+
+
+
+ {{if eq .Lang "es"}}Proyectos{{else}}Projects{{end}}
+
+ {{range .CV.Projects}}
+
+
+
+
+
+
+
+ {{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.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}}
+