Skip to content

Commit b647e31

Browse files
committed
Diseño responsive
Mejoro el diseño responsive además de agregarle más animaciones y vrsión ATS para posibles robots o IAs.
1 parent 24d2fdd commit b647e31

5 files changed

Lines changed: 307 additions & 21 deletions

File tree

assets/css/styles.css

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
*{ box-sizing:border-box; }
2121
html,body{ margin:0; }
2222
html{ scroll-behavior:smooth; }
23+
img{ max-width:100%; height:auto; }
24+
2325

2426
body{
2527
background:#070814;
@@ -190,6 +192,56 @@ p{
190192
color:#fff;
191193
}
192194

195+
.nav-wrap{ display:flex; align-items:center; gap:12px; }
196+
.nav-toggle{
197+
display:none;
198+
width: 44px;
199+
height: 44px;
200+
border-radius: 12px;
201+
border: 1px solid rgba(255,255,255,.14);
202+
background: rgba(0,0,0,.18);
203+
cursor:pointer;
204+
}
205+
.nav-toggle span{
206+
display:block;
207+
height:2px;
208+
margin: 7px 10px;
209+
background: rgba(255,255,255,.85);
210+
border-radius:999px;
211+
}
212+
213+
.nav-overlay{
214+
position: fixed;
215+
inset: 0;
216+
background: rgba(0,0,0,.55);
217+
z-index: 9;
218+
}
219+
220+
@media (max-width: 900px){
221+
/* Si NO hay JS, no escondas el menú (porque no hay toggle) */
222+
.js .nav-toggle{ display:inline-block; }
223+
224+
.js .nav-links{
225+
display:none;
226+
position: fixed;
227+
top: 70px;
228+
right: 12px;
229+
left: 12px;
230+
z-index: 10;
231+
232+
padding: 12px;
233+
border-radius: 18px;
234+
background: rgba(6,10,22,.92);
235+
border: 1px solid rgba(255,255,255,.14);
236+
backdrop-filter: blur(10px);
237+
238+
flex-direction: column;
239+
gap: 10px;
240+
}
241+
.js .nav-links.open{ display:flex; }
242+
}
243+
244+
193245
/* Toggle idioma tipo “pill” */
194246
.lang-toggle{
195247
display:inline-flex;
@@ -252,6 +304,25 @@ p{
252304
transform: translateY(1px);
253305
}
254306

307+
/* Botón hover más “premium” */
308+
.btn--hero{
309+
position: relative;
310+
overflow:hidden;
311+
}
312+
.btn--hero i{
313+
transition: transform .18s ease;
314+
}
315+
.btn--hero::before{
316+
content:"";
317+
position:absolute;
318+
inset:0;
319+
background: rgba(255,255,255,.10);
320+
transform: translateX(-110%);
321+
transition: transform .25s ease;
322+
}
323+
.btn--hero:hover::before{ transform: translateX(0); }
324+
.btn--hero:hover i{ transform: translateX(4px); }
325+
255326
/* =========================================================
256327
HERO
257328
========================================================= */
@@ -260,6 +331,21 @@ p{
260331
display:grid;
261332
place-items:center;
262333
text-align:center;
334+
position: relative;
335+
overflow: hidden;
336+
}
337+
338+
/* Spotlight solo en hero (usa --hx/--hy) */
339+
.hero::after{
340+
content:"";
341+
position:absolute;
342+
inset:-1px;
343+
pointer-events:none;
344+
background: radial-gradient(
345+
220px circle at var(--hx, 50%) var(--hy, 40%),
346+
rgba(34,211,238,0.18),
347+
transparent 60%
348+
);
263349
}
264350

265351
.hero-logo{
@@ -291,6 +377,26 @@ p{
291377
text-shadow: 0 0 28px rgba(180,120,255,.22);
292378
}
293379

380+
/* Reveal suave */
381+
.js .hero-logo,
382+
.js .hero-title,
383+
.js .hero-sub,
384+
.js .btn--hero{
385+
opacity:0;
386+
transform: translateY(14px);
387+
animation: heroIn .9s ease forwards;
388+
}
389+
.js .hero-title{ animation-delay: .08s; }
390+
.js .hero-sub{ animation-delay: .18s; }
391+
.js .btn--hero{ animation-delay: .28s; }
392+
393+
@keyframes heroIn{
394+
to{ opacity:1; transform: translateY(0); }
395+
}
396+
397+
/* ATS/SEO ven el texto en el HTML igualmente */
398+
.js .fallback{ display:none; }
399+
294400

295401
/* =========================================================
296402
CARDS (skills/xp/projects)
@@ -738,12 +844,12 @@ p{
738844
/* =========================================================
739845
ANIMACIÓN DE SECCIONES (fade-in)
740846
========================================================= */
741-
.section{
847+
.js .section{
742848
opacity: 0;
743849
transform: translateY(24px);
744850
transition: opacity .6s ease, transform .6s ease;
745851
}
746-
.section.visible{
852+
.js .section.visible{
747853
opacity: 1;
748854
transform: translateY(0);
749855
}
@@ -862,6 +968,16 @@ p{
862968
background: rgba(0,0,0,.25);
863969
}
864970

971+
.project-psr{
972+
margin-top: 12px;
973+
display:grid;
974+
gap: 8px;
975+
color: rgba(255,255,255,.82);
976+
font-size: 0.95rem;
977+
}
978+
.project-psr strong{ color: #fff; }
979+
980+
865981
/* ===== Paletas thumbs nuevas ===== */
866982
.project-thumb.thumb-realtime{ --a: rgba(34,211,238,.20); --b: rgba(196,181,253,.16); }
867983
.project-thumb.thumb-testing{ --a: rgba(250,204,21,.14); --b: rgba(148,163,184,.18); }

assets/i18n/en.json

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"about": {
1919
"title": "About me",
2020
"lead": "I build end-to-end solutions: connect data, automate workflows, and care about user experience.",
21+
"lead2": "I automate processes (Power Apps / scripts / testing). I like building end-to-end and documenting it.",
2122
"cards": [
2223
{
2324
"icon": "fa-solid fa-bolt",
@@ -108,31 +109,56 @@
108109
},
109110
"projects": {
110111
"title": "Projects",
111-
"p1_title": "WEB-DE-PROTOCOCOLOS-HSJD",
112+
113+
"labels": {
114+
"problem": "Problem",
115+
"solution": "Solution",
116+
"result": "Result"
117+
},
118+
119+
"p1_title": "WEB-DE-PROTOCOLOS-HSJD",
112120
"p1_desc": "PowerApps + SharePoint app that allows each employee to access only the protocols assigned to their role and department.",
113121
"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.",
114125

115126
"p2_title": "AvaloniaCatalogoWinForms",
116127
"p2_desc": "Fictional product catalog with full CRUD: add, update, delete, filter and sort products across multiple screens.",
117128
"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).",
118132

119133
"p3_title": "Agenda App",
120134
"p3_desc": "Agenda app to manage contacts and/or events with a clean, productivity-focused UI.",
121135
"p3_why": "It helped me practice app structure, data persistence and a clean UI designed for real usage.",
122-
123-
"case_labels": { "problem": "Problem", "solution": "Solution", "signal": "Signal" },
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.",
124139

125140
"p4_title": "Realtime Collaborative Bingo Web App",
126141
"p4_desc": "Real-time collaborative bingo: multiple users join a room and the board state syncs instantly.",
127142
"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).",
128146

129147
"p5_title": "Selenium end-to-end",
130148
"p5_desc": "Automated E2E tests to validate real user flows on web, making sure key features don’t break.",
131149
"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" },
132155

133156
"p6_title": "Kotlin Labs",
134157
"p6_desc": "A set of Kotlin mini-projects to master key areas: multimedia, concurrency and persistence.",
135158
"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.",
136162

137163
"p6_cases": [
138164
{

assets/i18n/es.json

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"about": {
1919
"title": "Sobre mí",
2020
"lead": "Construyo soluciones end-to-end: conecto datos, automatizo procesos y cuido la experiencia de usuario.",
21+
"lead2": "Automatizo procesos (Power Apps / scripts / testing). Me gusta construir end-to-end y documentarlo.",
2122
"cards": [
2223
{
2324
"icon": "fa-solid fa-bolt",
@@ -108,31 +109,56 @@
108109
},
109110
"projects": {
110111
"title": "Proyectos",
112+
113+
"labels": {
114+
"problem": "Problema",
115+
"solution": "Solución",
116+
"result": "Resultado"
117+
},
118+
111119
"p1_title": "WEB-DE-PROTOCOLOS-HSJD",
112120
"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.",
113121
"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.",
114125

115126
"p2_title": "AvaloniaCatalogoWinForms",
116127
"p2_desc": "Catálogo ficticio con CRUD completo: agregar, actualizar, eliminar, filtrar y ordenar productos en varias pantallas.",
117128
"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).",
118132

119133
"p3_title": "Agenda App",
120134
"p3_desc": "App de agenda para gestionar contactos y/o eventos, con interfaz clara y enfoque en productividad.",
121135
"p3_why": "Me permitió practicar estructura de app, persistencia de datos y una UI limpia orientada a uso real.",
122-
123-
"case_labels": { "problem": "Problema", "solution": "Solución", "signal": "Señal" },
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.",
124139

125140
"p4_title": "Realtime Collaborative Bingo Web App",
126141
"p4_desc": "Bingo colaborativo en tiempo real: varios usuarios comparten sala y el estado del tablero se sincroniza al instante.",
127142
"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).",
128146

129147
"p5_title": "Selenium end-to-end",
130148
"p5_desc": "Tests E2E automatizados para validar flujos reales de usuario en web, asegurando que lo importante no se rompe.",
131149
"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" },
132155

133156
"p6_title": "Kotlin Labs",
134157
"p6_desc": "Colección de mini-proyectos en Kotlin para dominar piezas clave: multimedia, concurrencia y persistencia.",
135158
"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.",
136162

137163
"p6_cases": [
138164
{

0 commit comments

Comments
 (0)