Skip to content

Commit a31b765

Browse files
committed
Cambios en la seccion de proyectos
1 parent b647e31 commit a31b765

5 files changed

Lines changed: 74 additions & 55 deletions

File tree

assets/css/styles.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,16 @@ p{
864864
}
865865
}
866866

867+
/* FIX: cards-grid en móvil (evita las “columnas palillo”) */
868+
@media (max-width: 819px){
869+
.cards-grid{
870+
grid-template-columns: 1fr; /* una columna */
871+
}
872+
.cards-grid > .card{
873+
grid-column: 1 / -1; /* ocupa todo el ancho */
874+
}
875+
}
876+
867877
@media (max-width: 768px){
868878
.nav{ padding: 10px 12px; }
869879
.nav nav{ gap: 10px; font-size: 14px; }

assets/i18n/en.json

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -110,55 +110,50 @@
110110
"projects": {
111111
"title": "Projects",
112112

113-
"labels": {
114-
"problem": "Problem",
115-
"solution": "Solution",
116-
"result": "Result"
117-
},
113+
"psr_labels": { "problem": "Problem", "solution": "Solution", "result": "Result" },
114+
"case_labels": { "problem": "Problem", "solution": "Solution", "signal": "Signal" },
118115

119116
"p1_title": "WEB-DE-PROTOCOLOS-HSJD",
120117
"p1_desc": "PowerApps + SharePoint app that allows each employee to access only the protocols assigned to their role and department.",
121118
"p1_why": "I learned to integrate different tools into a coherent flow that automates tasks and reduces manual errors—my first step towards a “complete solution”.",
122-
"p1_problem": "Employees couldn’t quickly find the right protocols for their role and department.",
123-
"p1_solution": "PowerApps + SharePoint with role-based filtering and version-aware flow.",
124-
"p1_result": "Evidence: repo and screenshots; built in a real internship context.",
119+
"p1_problem": "Employees needed to quickly reach the right protocol (and the current version) without manual searching through documents.",
120+
"p1_solution": "PowerApps connected to SharePoint with role/department filtering, search, version control and read tracking.",
121+
"p1_result": "Evidence: real project (final project) with role-based filtering and read/version traceability.",
125122

126123
"p2_title": "AvaloniaCatalogoWinForms",
127-
"p2_desc": "Fictional product catalog with full CRUD: add, update, delete, filter and sort products across multiple screens.",
124+
"p2_desc": "Desktop catalog with full CRUD: add, update, delete, filter and sort products across multiple screens.",
128125
"p2_why": "It helped me structure data in a desktop app and keep consistency across screens—solid foundations for bigger projects.",
129-
"p2_problem": "Need to manage a catalog with full operations and clear navigation.",
130-
"p2_solution": "Desktop app with CRUD + filtering/sorting across consistent screens.",
131-
"p2_result": "Evidence: repo with complete features (CRUD + filters + sorting).",
126+
"p2_problem": "I wanted to practice a complete desktop catalog app with navigation, persistence and typical CRUD + filtering flows.",
127+
"p2_solution": "C#/.NET app with Avalonia UI (MVVM) and JSON persistence, including search/filter and basic CRUD.",
128+
"p2_result": "Evidence: CRUD + filtering + screenshots and run steps in the README.",
132129

133130
"p3_title": "Agenda App",
134131
"p3_desc": "Agenda app to manage contacts and/or events with a clean, productivity-focused UI.",
135132
"p3_why": "It helped me practice app structure, data persistence and a clean UI designed for real usage.",
136-
"p3_problem": "Manage contacts/events in a simple way without relying on external tools.",
137-
"p3_solution": "App with modular structure and persistence for day-to-day usage.",
138-
"p3_result": "Evidence: repo with functional screens and complete management flow.",
133+
"p3_problem": "Managing contacts/tasks per user and keeping data safe and accessible across devices.",
134+
"p3_solution": "Android app in Kotlin with Firebase Auth + Realtime Database, CRUD and UI validations/feedback.",
135+
"p3_result": "Evidence: login/register + per-user cloud CRUD + screenshots in the repo.",
139136

140137
"p4_title": "Realtime Collaborative Bingo Web App",
141138
"p4_desc": "Real-time collaborative bingo: multiple users join a room and the board state syncs instantly.",
142139
"p4_why": "Previously called “BingoEnvidiosos”. Great practice for real-time sync, shared state and multi-user UX.",
143-
"p4_problem": "In group bingo, boards get out of sync if each user tracks state independently.",
144-
"p4_solution": "Shared rooms with real-time board state synchronization.",
145-
"p4_result": "Evidence: repo with multi-user logic and synced state (no public demo).",
140+
"p4_problem": "Coordinating a shared board across multiple users in real time without desync or page reloads.",
141+
"p4_solution": "Room-based web app with real-time shared state, handling events and consistency across clients.",
142+
"p4_result": "Evidence: real-time multi-user project (repo includes features and structure).",
146143

147144
"p5_title": "Selenium end-to-end",
148145
"p5_desc": "Automated E2E tests to validate real user flows on web, making sure key features don’t break.",
149146
"p5_why": "It builds discipline: reproducible tests, early bug detection and a quality-first mindset.",
150-
"p5_problem": "Website changes can silently break key flows until it’s too late.",
151-
"p5_solution": "Selenium E2E suite that validates real user scenarios.",
152-
"p5_result": "Evidence: repo with repeatable automated tests (CI-ready).",
153-
154-
"case_labels": { "problem": "Problem", "solution": "Solution", "signal": "Signal" },
147+
"p5_problem": "Catching breaking changes in critical user flows before they hit production.",
148+
"p5_solution": "Selenium + JUnit5 suite using Page Objects, wait helpers and automated execution in CI.",
149+
"p5_result": "Evidence: CI + reporting (Allure) + execution video in the repo.",
155150

156151
"p6_title": "Kotlin Labs",
157152
"p6_desc": "A set of Kotlin mini-projects to master key areas: multimedia, concurrency and persistence.",
158153
"p6_why": "Mini-case format: a real problem, a concrete solution and a clear competency signal.",
159-
"p6_problem": "I wanted to master Kotlin through real, focused problems instead of only theory.",
160-
"p6_solution": "A collection of mini-projects (coroutines, multimedia, persistence), one goal per case.",
161-
"p6_result": "Evidence: 3 separate repos + mini-cases documented with problem/solution.",
154+
"p6_problem": "Learning key Kotlin/Android concepts fast without getting stuck in huge slow-to-iterate projects.",
155+
"p6_solution": "Focused mini-projects: coroutines (dispatchers/cancellation), multimedia (resources/lifecycle), persistence (CRUD).",
156+
"p6_result": "Evidence: 3 repos with features + screenshots/docs per mini-case.",
162157

163158
"p6_cases": [
164159
{

assets/i18n/es.json

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -110,55 +110,50 @@
110110
"projects": {
111111
"title": "Proyectos",
112112

113-
"labels": {
114-
"problem": "Problema",
115-
"solution": "Solución",
116-
"result": "Resultado"
117-
},
113+
"psr_labels": { "problem": "Problema", "solution": "Solución", "result": "Resultado" },
114+
"case_labels": { "problem": "Problema", "solution": "Solución", "signal": "Señal" },
118115

119116
"p1_title": "WEB-DE-PROTOCOLOS-HSJD",
120117
"p1_desc": "Aplicación desarrollada con PowerApps y SharePoint para que cada empleado acceda solo a los protocolos que le corresponden según su categoría y servicio.",
121118
"p1_why": "Aprendí a integrar herramientas heterogéneas en un flujo coherente que automatiza tareas y reduce errores manuales. Fue un paso real hacia una “solución completa”.",
122-
"p1_problem": "Los empleados no podían encontrar rápido los protocolos correctos según su rol/servicio.",
123-
"p1_solution": "PowerApps + SharePoint con filtrado por categoría/servicio y flujo de versiones.",
124-
"p1_result": "Evidencia: repositorio y capturas del flujo; app usada en contexto real de prácticas.",
119+
"p1_problem": "Los empleados necesitaban encontrar el protocolo correcto (y su versión vigente) sin perderse entre documentos y búsquedas manuales.",
120+
"p1_solution": "App PowerApps conectada a SharePoint con filtrado por rol/servicio, búsqueda, control de versiones y registro de lectura.",
121+
"p1_result": "Evidencia: proyecto real (TFG) con filtrado por rol y trazabilidad de lectura/versiones.",
125122

126123
"p2_title": "AvaloniaCatalogoWinForms",
127-
"p2_desc": "Catálogo ficticio con CRUD completo: agregar, actualizar, eliminar, filtrar y ordenar productos en varias pantallas.",
124+
"p2_desc": "Catálogo de escritorio con CRUD completo: agregar, actualizar, eliminar, filtrar y ordenar productos en varias pantallas.",
128125
"p2_why": "Me ayudó a estructurar datos en una app de escritorio y a mantener consistencia entre pantallas, base para proyectos más grandes.",
129-
"p2_problem": "Necesidad de gestionar un catálogo con operaciones completas y navegación clara.",
130-
"p2_solution": "App de escritorio con CRUD + filtros/ordenación y pantallas consistentes.",
131-
"p2_result": "Evidencia: repo con funcionalidades completas (CRUD + filtros + ordenación).",
126+
"p2_problem": "Necesitaba practicar una app desktop completa de catálogo con navegación, persistencia y operaciones típicas (CRUD + filtro).",
127+
"p2_solution": "App en C#/.NET con Avalonia UI (MVVM) y persistencia en JSON, incluyendo búsqueda/filtrado y CRUD básico.",
128+
"p2_result": "Evidencia: CRUD + filtrado + capturas y pasos de ejecución en el README.",
132129

133130
"p3_title": "Agenda App",
134131
"p3_desc": "App de agenda para gestionar contactos y/o eventos, con interfaz clara y enfoque en productividad.",
135132
"p3_why": "Me permitió practicar estructura de app, persistencia de datos y una UI limpia orientada a uso real.",
136-
"p3_problem": "Organizar contactos/eventos sin depender de herramientas externas y con una UI simple.",
137-
"p3_solution": "App con estructura modular y persistencia para gestionar datos de forma cómoda.",
138-
"p3_result": "Evidencia: repo con pantallas funcionales y flujo completo de gestión.",
133+
"p3_problem": "Gestionar contactos/tareas con datos por usuario y evitar perder información entre dispositivos.",
134+
"p3_solution": "App Android en Kotlin con Firebase Auth + Realtime Database, CRUD y validaciones con feedback en UI.",
135+
"p3_result": "Evidencia: login/registro + CRUD en la nube por usuario + capturas en el repo.",
139136

140137
"p4_title": "Realtime Collaborative Bingo Web App",
141138
"p4_desc": "Bingo colaborativo en tiempo real: varios usuarios comparten sala y el estado del tablero se sincroniza al instante.",
142139
"p4_why": "Antes era “BingoEnvidiosos”. Aquí practiqué sincronización en tiempo real, estados compartidos y UX multiusuario.",
143-
"p4_problem": "En un bingo en grupo, el tablero se desincroniza si cada usuario va por su cuenta.",
144-
"p4_solution": "Salas compartidas con sincronización del estado del tablero en tiempo real.",
145-
"p4_result": "Evidencia: repo con lógica multiusuario y estado sincronizado (sin demo pública).",
140+
"p4_problem": "Coordinar un tablero compartido entre varios usuarios en tiempo real (sin recargas y sin desincronización).",
141+
"p4_solution": "Web app con salas y sincronización en tiempo real (estado compartido), controlando eventos y consistencia del tablero.",
142+
"p4_result": "Evidencia: proyecto multiusuario en tiempo real (repo con features y estructura).",
146143

147144
"p5_title": "Selenium end-to-end",
148145
"p5_desc": "Tests E2E automatizados para validar flujos reales de usuario en web, asegurando que lo importante no se rompe.",
149146
"p5_why": "Me aporta disciplina: pruebas reproducibles, detección temprana de fallos y enfoque en calidad.",
150-
"p5_problem": "Cambios en una web pueden romper flujos críticos sin que se note hasta tarde.",
151-
"p5_solution": "Suite de tests E2E con Selenium para validar escenarios reales de usuario.",
152-
"p5_result": "Evidencia: repo con tests automatizados y ejecución repetible (base para CI).",
153-
154-
"case_labels": { "problem": "Problema", "solution": "Solución", "signal": "Señal" },
147+
"p5_problem": "Detectar roturas en flujos críticos de una web antes de que lleguen a producción.",
148+
"p5_solution": "Suite E2E con Selenium + JUnit5 usando Page Objects, helpers de waits y ejecución automática en CI.",
149+
"p5_result": "Evidencia: CI + reporting (Allure) + vídeo de ejecución en el repo.",
155150

156151
"p6_title": "Kotlin Labs",
157152
"p6_desc": "Colección de mini-proyectos en Kotlin para dominar piezas clave: multimedia, concurrencia y persistencia.",
158153
"p6_why": "Formato mini-casos: un problema real, una solución concreta y una señal clara de competencia técnica.",
159-
"p6_problem": "Quería aprender Kotlin en profundidad con problemas reales y casos pequeños pero completos.",
160-
"p6_solution": "Agrupación de mini-proyectos (coroutines, multimedia, persistencia) con foco en un objetivo por caso.",
161-
"p6_result": "Evidencia: 3 repos separados + mini-casos documentados con problema/solución.",
154+
"p6_problem": "Aprender conceptos clave de Kotlin/Android sin hacer “mega proyectos” lentos de iterar.",
155+
"p6_solution": "Mini-proyectos enfocados: corrutinas (dispatchers/cancelación), multimedia (recursos/ciclo de vida) y persistencia (CRUD).",
156+
"p6_result": "Evidencia: 3 repos con features + capturas/documentación por mini-caso.",
162157

163158
"p6_cases": [
164159
{

assets/js/app.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,29 @@ function chipTone(label = "") {
8787
return "";
8888
}
8989

90-
9190
document.getElementById("lang-toggle")?.addEventListener("click", () => {
9291
loadDict(STATE.lang === "es" ? "en" : "es");
9392
});
9493

94+
95+
function typewriter(el, text, speed = 18){
96+
if(!el) return;
97+
el.textContent = "";
98+
let i = 0;
99+
const t = setInterval(() => {
100+
el.textContent = text.slice(0, ++i);
101+
if(i >= text.length) clearInterval(t);
102+
}, speed);
103+
}
104+
105+
// Ejemplo de uso tras traducir:
106+
const heroTitleEl = document.querySelector('[data-i18n="hero.title"]');
107+
if(heroTitleEl){
108+
const full = heroTitleEl.textContent.trim();
109+
typewriter(heroTitleEl, full, 14);
110+
}
111+
112+
95113
/* =========================================================
96114
ABOUT
97115
========================================================= */

index.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,9 @@
9393
<img src="assets/img/logo-s-trasparente.png" alt="" class="hero-logo" />
9494
<h1 class="hero-title"><span class="glow" data-i18n="hero.title"></span></h1>
9595
<p class="hero-sub" data-i18n="hero.subtitle"></p>
96-
<a href="#projects" class="btn btn--hero" data-i18n="hero.cta">
97-
Ver proyectos <i class="fa-solid fa-arrow-right" aria-hidden="true"></i>
96+
<a class="btn btn--hero" href="#projects">
97+
<span data-i18n="hero.cta">Ver proyectos</span>
98+
<i class="fa-solid fa-arrow-right"></i>
9899
</a>
99100
</section>
100101

0 commit comments

Comments
 (0)