diff --git a/frontend/app/assets/css/main.scss b/frontend/app/assets/css/main.scss
index 5b6669d..a260587 100644
--- a/frontend/app/assets/css/main.scss
+++ b/frontend/app/assets/css/main.scss
@@ -19,7 +19,7 @@ body {
* {
color: var(--color-text);
font-family: 'Hurmit';
- cursor: text;
+ cursor: default;
}
.pixelated {
diff --git a/frontend/app/components/parts/MinimalHeader.vue b/frontend/app/components/parts/MinimalHeader.vue
deleted file mode 100644
index 8c8ff3f..0000000
--- a/frontend/app/components/parts/MinimalHeader.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
- ◆ ARANROIG.COM
-
-
-
-
-
-
-
-
-
diff --git a/frontend/app/components/parts/PageHeader.vue b/frontend/app/components/parts/PageHeader.vue
deleted file mode 100644
index abe7045..0000000
--- a/frontend/app/components/parts/PageHeader.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/app/pages/art/[slug].vue b/frontend/app/pages/art/[slug].vue
index 4e283a4..fc0373f 100644
--- a/frontend/app/pages/art/[slug].vue
+++ b/frontend/app/pages/art/[slug].vue
@@ -1,6 +1,5 @@
-
+
ART GALLERY
@@ -235,3 +237,9 @@ const displayedArt = computed(() => {
}
}
+
+
diff --git a/frontend/app/pages/blog/[slug].vue b/frontend/app/pages/blog/[slug].vue
index 63b1082..978299b 100644
--- a/frontend/app/pages/blog/[slug].vue
+++ b/frontend/app/pages/blog/[slug].vue
@@ -1,6 +1,6 @@
-
+
@@ -165,3 +166,9 @@ const displayedPosts = computed(() => {
}
}
+
+
diff --git a/frontend/app/pages/contact/index.vue b/frontend/app/pages/contact/index.vue
index cb05ef6..bdc7572 100644
--- a/frontend/app/pages/contact/index.vue
+++ b/frontend/app/pages/contact/index.vue
@@ -13,7 +13,9 @@ const { data: markdown } = await useAsyncData(`fixed`, async () =>
-
+
@@ -36,4 +38,10 @@ p {
display: flex;
width: 100%;
}
+
+
+
\ No newline at end of file
diff --git a/frontend/app/pages/index.vue b/frontend/app/pages/index.vue
index 392190e..a6959c3 100644
--- a/frontend/app/pages/index.vue
+++ b/frontend/app/pages/index.vue
@@ -29,6 +29,19 @@ const { data: contactMarkdown } = await useAsyncData(`fixed-contact`, async () =
const localePath = useLocalePath();
+function resolveProjectLink(project) {
+ if (project.link) return project.link;
+ const slugToProjectMap = {
+ 'dragonroll': 'https://dragonroll.aranroig.com',
+ };
+ return slugToProjectMap[project.slug] || null;
+}
+
+function navigateToProject(project) {
+ const link = resolveProjectLink(project);
+ if (link) window.open(link, '_blank', 'noopener,noreferrer');
+}
+
const artPosts = useState('art-posts', () => null as any);
if (!artPosts.value?.length) {
const currentLocale = locale.value;
@@ -125,33 +138,37 @@ const sectionTargets = {
@@ -388,11 +405,6 @@ const sectionTargets = {
padding: 12px 16px;
transition: all 0.1s steps(2, end);
- &:hover {
- border-color: var(--color-link);
- box-shadow: 4px -4px 0px 0px var(--color-link);
- }
-
&::before {
content: "[ PROJECT ]";
position: absolute;
@@ -404,6 +416,28 @@ const sectionTargets = {
color: var(--color-link);
letter-spacing: 2px;
}
+
+ .project-layout {
+ display: flex;
+ gap: 16px;
+ }
+
+ .project-preview {
+ width: 140px;
+ min-width: 140px;
+ height: 85px;
+ object-fit: cover;
+ border: 1px solid var(--color-border-color);
+ image-rendering: auto;
+ transition: border-color 0.1s steps(2, end);
+ }
+
+ .project-info {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ min-width: 0;
+ }
}
.project-card-corner {
@@ -420,18 +454,29 @@ const sectionTargets = {
.project-title {
font-family: 'Hurmit', monospace;
- color: var(--color-link);
+ color: inherit;
text-decoration: none;
font-size: 1.05rem;
- text-shadow: 0 0 4px var(--color-link);
- display: block;
+ text-shadow: inherit;
&:hover {
color: var(--color-link);
- text-shadow: 0 0 12px var(--color-link), 0 0 4px var(--color-link);
}
}
+.project-card {
+ cursor: pointer;
+}
+
+.project-card-wrapper:hover .project-card {
+ border-color: var(--color-link);
+ box-shadow: 4px -4px 0px 0px var(--color-link);
+}
+
+.project-info {
+ cursor: pointer;
+}
+
.project-description {
font-family: 'Hurmit', monospace;
color: var(--color-text);
@@ -762,6 +807,16 @@ const sectionTargets = {
.project-card {
padding: 8px 12px;
}
+
+ .project-layout {
+ flex-direction: column !important;
+ }
+
+ .project-preview {
+ width: 100% !important;
+ min-width: auto !important;
+ height: 160px !important;
+ }
.project-title {
font-size: 0.95rem;
diff --git a/frontend/content.config.ts b/frontend/content.config.ts
index 05449d0..2ad4d83 100644
--- a/frontend/content.config.ts
+++ b/frontend/content.config.ts
@@ -38,6 +38,7 @@ export default defineContentConfig({
slug: z.string(),
description: z.string(),
link: z.string().optional(),
+ preview: z.string().optional(),
tech: z.array(z.string()).default([])
})
}),
diff --git a/frontend/content/projects/ca/codelearn-app.md b/frontend/content/projects/ca/codelearn-app.md
deleted file mode 100644
index fb95133..0000000
--- a/frontend/content/projects/ca/codelearn-app.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: App de Codelearn
-slug: codelearn-app
-date: 2026-01-01
-description: Una aplicació full-stack de gestió d'aprenentatge construïda al meu temps a Codelearn. Autenticació d'usuaris, gestió de cursos i seguiment del progrés en temps real.
-link: https://codelearn.cat
-tech: ["Nuxt", "Express", "MongoDB", "TypeScript"]
----
diff --git a/frontend/content/projects/ca/dragonroll.md b/frontend/content/projects/ca/dragonroll.md
new file mode 100644
index 0000000..1815334
--- /dev/null
+++ b/frontend/content/projects/ca/dragonroll.md
@@ -0,0 +1,7 @@
+---
+title: Dragonroll
+slug: dragonroll
+date: 2026-01-01
+description: Un assistent de codi obert per a jocs de rol. Fes un seguiment de personatges, comparteix notes, reprodueix música, planifica encontres i gestiona ítems i encants.
+tech: ["Nuxt", "Vue", "Express", "MongoDB"]
+---
diff --git a/frontend/content/projects/ca/ml-pipeline.md b/frontend/content/projects/ca/ml-pipeline.md
deleted file mode 100644
index cc8b240..0000000
--- a/frontend/content/projects/ca/ml-pipeline.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Eina Pipeline ML
-slug: ml-pipeline
-date: 2026-01-01
-description: Una eina modular de pipeline d'aprenentatge automàtic per al màster d'Aprenentatge Automàtic i Ciberseguretat de la UPC. Automatització del preprocesament, entrenament i avaluació de models.
-tech: ["Python", "PyTorch", "Docker"]
----
diff --git a/frontend/content/projects/ca/portfolio-website.md b/frontend/content/projects/ca/portfolio-website.md
deleted file mode 100644
index 3df50b6..0000000
--- a/frontend/content/projects/ca/portfolio-website.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Portfolio Website
-slug: portfolio-website
-date: 2026-01-01
-description: Aquesta mateixa pàgina web, construïda amb Nuxt 4, Vue 3 i SCSS. Estètica pixel-art, temes fosc/clar, personalització de colors d'accent i suport multilingüe en anglès, castellà i català.
-link: https://aranroig.com
-tech: ["Nuxt 4", "Vue 3", "SCSS", "Node.js", "MongoDB"]
----
diff --git a/frontend/content/projects/en/codelearn-app.md b/frontend/content/projects/en/codelearn-app.md
deleted file mode 100644
index 440b5dd..0000000
--- a/frontend/content/projects/en/codelearn-app.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Codelearn Full-Stack App
-slug: codelearn-app
-date: 2026-01-01
-description: A full-stack learning management application built during my time at Codelearn. Features user authentication, course management, and real-time progress tracking.
-link: https://codelearn.cat
-tech: ["Nuxt", "Express", "MongoDB", "TypeScript"]
----
diff --git a/frontend/content/projects/en/dragonroll.md b/frontend/content/projects/en/dragonroll.md
new file mode 100644
index 0000000..4361bc7
--- /dev/null
+++ b/frontend/content/projects/en/dragonroll.md
@@ -0,0 +1,7 @@
+---
+title: Dragonroll
+slug: dragonroll
+date: 2026-01-01
+description: An open-source helper for role-playing games. Track characters, share notes, play music, plan encounters, and manage items and spells.
+tech: ["Nuxt", "Vue", "Express", "MongoDB"]
+---
diff --git a/frontend/content/projects/en/ml-pipeline.md b/frontend/content/projects/en/ml-pipeline.md
deleted file mode 100644
index f47cb22..0000000
--- a/frontend/content/projects/en/ml-pipeline.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: ML Pipeline Tool
-slug: ml-pipeline
-date: 2026-01-01
-description: A modular machine learning pipeline tool for UPC's Machine Learning and Cybersecurity master's degree. Automates data preprocessing, model training, and evaluation workflows.
-tech: ["Python", "PyTorch", "Docker"]
----
diff --git a/frontend/content/projects/en/portfolio-website.md b/frontend/content/projects/en/portfolio-website.md
deleted file mode 100644
index fcf6677..0000000
--- a/frontend/content/projects/en/portfolio-website.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Portfolio Website
-slug: portfolio-website
-date: 2026-01-01
-description: This very website, built with Nuxt 4, Vue 3, and SCSS. Features pixel-art aesthetics, dark/light themes, accent color customization, and multilingual support across English, Spanish, and Catalan.
-link: https://aranroig.com
-tech: ["Nuxt 4", "Vue 3", "SCSS", "Node.js", "MongoDB"]
----
diff --git a/frontend/content/projects/es/codelearn-app.md b/frontend/content/projects/es/codelearn-app.md
deleted file mode 100644
index 7693cf1..0000000
--- a/frontend/content/projects/es/codelearn-app.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: App de Codelearn
-slug: codelearn-app
-date: 2026-01-01
-description: Una aplicación full-stack de gestión de aprendizaje construida en mi tiempo en Codelearn. Autenticación de usuarios, gestión de cursos y seguimiento de progreso en tiempo real.
-link: https://codelearn.cat
-tech: ["Nuxt", "Express", "MongoDB", "TypeScript"]
----
diff --git a/frontend/content/projects/es/dragonroll.md b/frontend/content/projects/es/dragonroll.md
new file mode 100644
index 0000000..50cf5ca
--- /dev/null
+++ b/frontend/content/projects/es/dragonroll.md
@@ -0,0 +1,7 @@
+---
+title: Dragonroll
+slug: dragonroll
+date: 2026-01-01
+description: Un asistente de código abierto para juegos de rol. Controla personajes, comparte notas, reproduce música, planea encuentros y gestiona objetos y hechizos.
+tech: ["Nuxt", "Vue", "Express", "MongoDB"]
+---
diff --git a/frontend/content/projects/es/ml-pipeline.md b/frontend/content/projects/es/ml-pipeline.md
deleted file mode 100644
index 0c86ca2..0000000
--- a/frontend/content/projects/es/ml-pipeline.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Herramienta Pipeline ML
-slug: ml-pipeline
-date: 2026-01-01
-description: Una herramienta modular de pipeline de aprendizaje automático para el máster de Aprendizaje Automático y Ciberseguridad de la UPC. Automatiza preprocesamiento, entrenamiento y evaluación de modelos.
-tech: ["Python", "PyTorch", "Docker"]
----
diff --git a/frontend/content/projects/es/portfolio-website.md b/frontend/content/projects/es/portfolio-website.md
deleted file mode 100644
index 23572e5..0000000
--- a/frontend/content/projects/es/portfolio-website.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Portfolio Website
-slug: portfolio-website
-date: 2026-01-01
-description: Esta página web, construida con Nuxt 4, Vue 3 y SCSS. Con estética pixel-art, temas oscuro/claro, personalización de colores de acento y soporte multilingue en inglés, español y catalán.
-link: https://aranroig.com
-tech: ["Nuxt 4", "Vue 3", "SCSS", "Node.js", "MongoDB"]
----