diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 9d61328..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e43b0f9..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/api/models/project.model.js b/api/models/project.model.js index f81868a..3d5c4e2 100644 --- a/api/models/project.model.js +++ b/api/models/project.model.js @@ -26,6 +26,9 @@ const projectSchema = new Schema( }, skills: { type: [String] + }, + highlights: { + type: [String] } }, { diff --git a/web/index.html b/web/index.html index 837e159..a6cc2fc 100644 --- a/web/index.html +++ b/web/index.html @@ -6,7 +6,7 @@ - Lluis Adan + Lluís Adán
diff --git a/web/src/App.tsx b/web/src/App.tsx index d476357..843bc37 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -7,32 +7,46 @@ import { Link } from 'react-scroll' import { motion, useInView } from "framer-motion" import { useRef } from "react" + function App() { const ref = useRef(null) const isInView = useInView(ref, { once: true }) + const btnPrimary = "cursor-pointer select-none inline-flex items-center justify-center px-6 py-2.5 text-lg md:text-xl font-semibold rounded-2xl border border-sky-300/30 bg-slate-900/60 text-slate-100 hover:bg-sky-300/10 hover:border-sky-300/50 hover:text-white transition-all duration-200 shadow-lg shadow-sky-300/10 backdrop-blur-sm" + return ( -
+
- + + +
+
+
-
-
- Find out who I am and what I can bring to the world of web development + initial={{ opacity: 0, y: 30 }} + animate={{ opacity: 1, y: 0 }} + transition={{ delay: 0.3, duration: 1 }} + className="relative z-10 text-3xl md:text-4xl lg:text-5xl font-bold text-slate-100 max-w-4xl leading-tight tracking-tight" + > + Desarrollador Full Stack - + + + Construyo aplicaciones web completas con React y Node. APIs REST, autenticación, base de datos y despliegue. + + - PROJECTS + VER PROYECTOS
- -

I'm Lluis Adan

-
-

Want to know more about me?

-
- -
+
-

From infrastructure to code

-

- I'm a Full Stack Developer with experience in JavaScript (ES6) and ReactJS, combined with a solid background as a systems technician. -

-

- Thanks to this background, I not only develop efficient applications, but I also understand the infrastructure that supports them, from servers to network configurations. -

-

- I am passionate about technology and the challenges it brings. I consider myself a resolute, proactive and constantly learning person, always exploring new tools and trends to improve my skills and provide innovative solutions. -

+

+ Soy Lluís Adán +

+
+

¿Quieres saber más sobre mí?

-
-

My Skills

-
- {["HTML", "CSS", "JavaScript", "React", "Node", "Express", "MongoDB", "Git", "Github", "Docker", "Tailwind CSS", "Bootstrap", "Responsive"].map((skill, index) => ( - - {skill} - - ))} + +
+ +

De sistemas a desarrollo

+ +

+ Vengo de sistemas e infraestructura y he dado el salto a desarrollo web. Me gusta construir aplicaciones mantenibles, con buen UX y backend sólido: APIs, autenticación, datos y despliegue. +

+ +
    +
  • + + + Frontend: React + TypeScript, componentes, formularios y responsive. + +
  • + +
  • + + + Backend: Node/Express, APIs REST, CRUD, autenticación y manejo de errores. + +
  • + +
  • + + + Despliegue y herramientas: Git, Docker y despliegue de proyectos reales. + +
  • +
+
+
+

Tecnologías

+
+ {["HTML", "CSS", "JavaScript", "React", "Node", "Express", "MongoDB", "Git", "Github", "Docker", "Tailwind CSS", "Bootstrap", "Responsive"].map((skill, index) => ( + + {skill} + + ))}
+
- - - - - -
- -
-
-
-

LLUIS ADAN

-

Full Stack Developer

-
+
+ + +
-
-

SOCIAL

- -
+ -
+
+ +
+

© Copyright 2026. Creado por Lluís Adán

+
+ + ) } diff --git "a/web/src/assets/profile/Llu\303\255s_perfil.jpg" "b/web/src/assets/profile/Llu\303\255s_perfil.jpg" new file mode 100644 index 0000000..a713bcf Binary files /dev/null and "b/web/src/assets/profile/Llu\303\255s_perfil.jpg" differ diff --git a/web/src/components/Button.tsx b/web/src/components/Button.tsx new file mode 100644 index 0000000..711bd10 --- /dev/null +++ b/web/src/components/Button.tsx @@ -0,0 +1,21 @@ +import React from "react" + +type Variant = "primary" | "secondary" + +type ButtonProps = React.ButtonHTMLAttributes & { + variant?: Variant +} + +const base = + "select-none inline-flex items-center justify-center rounded-xl px-4 py-2 text-sm font-semibold transition-all duration-200" + +const variants: Record = { + primary: + "border border-sky-300/30 bg-slate-900 text-slate-100 hover:bg-sky-300/10 hover:border-sky-300/50 hover:text-white", + secondary: + "border border-slate-700 bg-slate-800 text-slate-200 hover:border-sky-300/40 hover:text-sky-300", +} + +export default function Button({ variant = "primary", className = "", ...props }: ButtonProps) { + return +
+ + +
+ +
+ +
- - - {status &&

{status}

} +
+ +
+ + {status && ( +

{status}

+ )} + + ) -} +} \ No newline at end of file diff --git a/web/src/components/Navbar.tsx b/web/src/components/Navbar.tsx index 4b56e4c..3f1aabb 100644 --- a/web/src/components/Navbar.tsx +++ b/web/src/components/Navbar.tsx @@ -1,50 +1,132 @@ import { useState } from 'react' import { Link } from 'react-scroll' import { Menu, X } from 'lucide-react' -import LluisPhoto from '/src/assets/profile/LluisFoto.jpg' +import LluisPhoto from '/src/assets/profile/Lluís_perfil.jpg' export default function Navbar() { const [isOpen, setIsOpen] = useState(false) + const navLinkClass = + "relative p-2 cursor-pointer font-semibold text-slate-300 hover:text-sky-300 transition-colors duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-sky-300/60 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950 rounded-lg after:absolute after:left-1/2 after:-bottom-1 after:h-px after:w-0 after:-translate-x-1/2 after:bg-gradient-to-r after:from-sky-300/30 after:via-sky-300/80 after:to-sky-300/30 after:transition-all after:duration-200 hover:after:w-full" + return ( -