Skip to content

Commit e79b4e4

Browse files
committed
feat(ui): implement responsive design for existing views
1 parent 41a7fd4 commit e79b4e4

12 files changed

Lines changed: 479 additions & 105 deletions

File tree

pnpm-lock.yaml

Lines changed: 296 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/landing/BenefitsSection.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ export function BenefitsSection() {
1919
Una plataforma diseñada para maximizar tu aprendizaje con las mejores herramientas y metodologías.
2020
</p>
2121
</div>
22-
23-
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
22+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
2423
{benefits.map((benefit, index) => {
2524
const IconComponent = benefit.icon;
2625
return (

src/components/landing/Footer.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ export function Footer() {
66
<footer className="bg-slate-800 text-white">
77
<div className="container mx-auto px-4 py-12">
88
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
9-
<div className="space-y-4">
10-
<Link to="/" className="flex items-center space-x-2">
9+
{/* Columna 1: Logo e info. Centrado en móvil, a la izquierda en tablet y más grandes */}
10+
<div className="space-y-4 text-center md:text-left">
11+
<Link to="/" className="flex items-center space-x-2 justify-center md:justify-start">
1112
<div className="w-8 h-8 bg-gradient-to-br from-blue-400 to-green-400 rounded-lg flex items-center justify-center">
1213
<BookOpen className="w-5 h-5 text-white" />
1314
</div>
@@ -18,7 +19,8 @@ export function Footer() {
1819
</p>
1920
</div>
2021

21-
<div className="space-y-4">
22+
{/* Columna 2: Enlaces. Centrado en móvil, a la izquierda en tablet y más grandes */}
23+
<div className="space-y-4 text-center md:text-left">
2224
<h3 className="font-semibold text-lg">Enlaces</h3>
2325
<ul className="space-y-2 text-sm">
2426
<li><Link to="/courses" className="text-slate-300 hover:text-white transition-colors">Explorar Cursos</Link></li>
@@ -28,9 +30,10 @@ export function Footer() {
2830
</ul>
2931
</div>
3032

31-
<div className="space-y-4">
33+
{/* Columna 3: Contacto. Centrado en móvil, a la izquierda en tablet y más grandes */}
34+
<div className="space-y-4 text-center md:text-left">
3235
<h3 className="font-semibold text-lg">Contacto</h3>
33-
<div className="space-y-3 text-sm">
36+
<div className="space-y-3 text-sm flex flex-col items-center md:items-start">
3437
<a href="mailto:info@educursos.com" className="flex items-center space-x-2 text-slate-300 hover:text-white">
3538
<Mail className="w-4 h-4" /><span>info@upskill.com</span>
3639
</a>
@@ -43,9 +46,10 @@ export function Footer() {
4346
</div>
4447
</div>
4548

46-
<div className="space-y-4">
49+
{/* Columna 4: Redes sociales. Centrado en móvil, a la izquierda en tablet y más grandes */}
50+
<div className="space-y-4 text-center md:text-left">
4751
<h3 className="font-semibold text-lg">Síguenos</h3>
48-
<div className="flex space-x-3">
52+
<div className="flex space-x-3 justify-center md:justify-start">
4953
<a href="#" aria-label="Facebook" className="w-9 h-9 bg-slate-700 rounded-lg flex items-center justify-center hover:bg-blue-600 transition-colors"><Facebook className="w-5 h-5" /></a>
5054
<a href="#" aria-label="Twitter" className="w-9 h-9 bg-slate-700 rounded-lg flex items-center justify-center hover:bg-sky-500 transition-colors"><Twitter className="w-5 h-5" /></a>
5155
<a href="#" aria-label="Instagram" className="w-9 h-9 bg-slate-700 rounded-lg flex items-center justify-center hover:bg-pink-600 transition-colors"><Instagram className="w-5 h-5" /></a>

src/components/landing/HeroSection.tsx

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,37 @@ import RobotModel from './RobotModel';
55

66
export default function HeroSection() {
77
return (
8-
<section className="py-20 px-4 pt-32">
8+
<section className="py-16 px-4 pt-28 md:pt-32">
99
<div className="container mx-auto max-w-6xl">
10-
<div className="grid lg:grid-cols-2 gap-12 items-center">
11-
<div className="space-y-8">
10+
<div className="grid lg:grid-cols-2 gap-16 items-center">
11+
<div className="space-y-6 text-center lg:text-left">
1212
<div className="space-y-4">
13-
<h1 className="text-4xl lg:text-6xl font-poppins font-bold text-slate-800 leading-tight">
13+
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-poppins font-bold text-slate-800 leading-tight">
1414
Aprende sin{' '}
1515
<span className="text-transparent bg-clip-text bg-gradient-to-r from-blue-500 to-green-500">
1616
límites
1717
</span>
1818
</h1>
19-
<p className="text-xl text-slate-600 leading-relaxed">
19+
<p className="text-base sm:text-lg md:text-xl text-slate-600 leading-relaxed max-w-xl mx-auto lg:mx-0">
2020
Descubre miles de cursos online con certificaciones oficiales.
21-
Aprende a tu ritmo desde cualquier dispositivo y transforma tu
22-
futuro profesional.
21+
Aprende a tu ritmo y transforma tu futuro.
2322
</p>
2423
</div>
25-
<div className="flex flex-col sm:flex-row gap-4">
24+
25+
<div className="flex flex-col sm:flex-row gap-4 justify-center lg:justify-start">
2626
<Link
2727
to="/courses"
28-
className="inline-flex items-center justify-center text-lg bg-blue-500 hover:bg-blue-600 text-white px-8 py-3 rounded-lg font-medium"
28+
className="inline-flex items-center justify-center text-base bg-blue-500 hover:bg-blue-600 text-white px-6 py-3 rounded-lg font-medium"
2929
>
3030
<Search className="w-5 h-5 mr-2" />
3131
Explorar Cursos
3232
</Link>
33-
<button className="inline-flex items-center justify-center text-lg border-green-200 text-green-700 hover:bg-green-50 px-8 py-3 rounded-lg border bg-transparent font-medium">
33+
<button className="inline-flex items-center justify-center text-base border-green-200 text-green-700 hover:bg-green-50 px-6 py-3 rounded-lg border bg-transparent font-medium">
3434
Ver Demo Gratuita
3535
</button>
3636
</div>
37-
<div className="flex items-center space-x-8 text-sm text-slate-600">
37+
38+
<div className="flex flex-col sm:flex-row items-center justify-center lg:justify-start gap-y-3 sm:gap-x-6 text-sm text-slate-600 pt-4">
3839
<div className="flex items-center space-x-2">
3940
<Users className="w-4 h-4 text-blue-500" />
4041
<span>+50,000 estudiantes</span>
@@ -45,11 +46,12 @@ export default function HeroSection() {
4546
</div>
4647
</div>
4748
</div>
48-
<div className="relative w-full h-[450px] lg:h-[500px]">
49+
50+
<div className="relative w-full h-[280px] sm:h-[350px] lg:h-[500px]">
4951
<RobotModel />
5052
</div>
5153
</div>
5254
</div>
5355
</section>
5456
);
55-
}
57+
}

src/components/landing/PopularRanking.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ export function PopularRanking() {
2020
<p className="text-lg text-slate-600">Los cursos con mayor crecimiento esta semana</p>
2121
</div>
2222

23-
<div className="space-y-4 rounded-lg bg-white/80 backdrop-blur-sm shadow-lg border border-slate-200 p-6">
23+
<div className="space-y-4 rounded-lg bg-white/80 backdrop-blur-sm shadow-lg border border-slate-200 p-4 sm:p-6">
2424
{topCourses.map((course) => (
25-
<div key={course.rank} className="flex items-center space-x-4 p-4 hover:bg-blue-50/50 rounded-lg transition-colors duration-200">
25+
<div key={course.rank} className="flex items-center space-x-3 sm:space-x-4 p-3 sm:p-4 hover:bg-blue-50/50 rounded-lg transition-colors duration-200">
2626
<div
27-
className={`w-12 h-12 flex-shrink-0 rounded-full flex items-center justify-center font-bold text-white text-lg shadow-md ${
27+
className={`w-10 h-10 sm:w-12 sm:h-12 flex-shrink-0 rounded-full flex items-center justify-center font-bold text-white text-md sm:text-lg shadow-md ${
2828
course.rank === 1 ? "bg-gradient-to-br from-yellow-400 to-yellow-600"
2929
: course.rank === 2 ? "bg-gradient-to-br from-gray-400 to-gray-600"
3030
: course.rank === 3 ? "bg-gradient-to-br from-orange-500 to-orange-700"
@@ -35,12 +35,12 @@ export function PopularRanking() {
3535
</div>
3636

3737
<div className="flex-1 min-w-0">
38-
<h3 className="font-semibold text-slate-800 text-base md:text-lg line-clamp-1">{course.title}</h3>
38+
<h3 className="font-semibold text-slate-800 text-sm sm:text-base md:text-lg line-clamp-1">{course.title}</h3>
3939
</div>
4040

4141
<div className="flex items-center space-x-1 text-slate-600">
4242
<Star className="w-5 h-5 fill-yellow-400 text-yellow-400" />
43-
<span className="font-medium">{course.rating}</span>
43+
<span className="font-medium text-sm sm:text-base">{course.rating}</span>
4444
</div>
4545
</div>
4646
))}

src/components/landing/TrendingCourses.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ export function TrendingCourses() {
1111
return (
1212
<section className="py-20 px-4 bg-white/50">
1313
<div className="container mx-auto max-w-6xl">
14-
<div className="text-center mb-12">
14+
<div className="text-center lg:text-left mb-12">
1515
<h2 className="text-3xl lg:text-4xl font-poppins font-bold text-slate-800 mb-4">Cursos en Tendencia</h2>
16-
<p className="text-lg text-slate-600 max-w-2xl mx-auto">Los cursos más populares y mejor valorados por nuestra comunidad</p>
16+
<p className="text-lg text-slate-600 max-w-2xl mx-auto lg:mx-0">Los cursos más populares y mejor valorados por nuestra comunidad</p>
1717
</div>
18-
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
18+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
1919
{trendingCourses.map((course) => (
2020
<div key={course.id} className="group rounded-lg overflow-hidden bg-white/80 backdrop-blur-sm shadow-md hover:shadow-xl transition-all duration-300 border border-transparent hover:border-blue-200">
2121
<div className="relative overflow-hidden">

src/components/layouts/AuthLayout.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { BookOpen, ArrowLeft } from 'lucide-react';
33

44
const AuthLayout = () => {
55
return (
6-
<div className="relative min-h-screen w-full flex items-center justify-center p-4 bg-gradient-to-br from-blue-50 via-white to-green-50">
7-
<div className="absolute top-6 left-6">
6+
<div className="relative min-h-screen w-full flex flex-col p-4 sm:p-6 bg-gradient-to-br from-blue-50 via-white to-green-50 gap-y-8">
7+
<header className="w-full">
88
<Link
99
to="/"
10-
className="flex items-center gap-4 text-slate-800 hover:text-blue-600 transition-colors group"
10+
className="inline-flex items-center gap-4 text-slate-800 hover:text-blue-600 transition-colors group"
1111
>
1212
<ArrowLeft className="w-6 h-6" />
1313
<div className="flex items-center gap-2">
@@ -17,9 +17,9 @@ const AuthLayout = () => {
1717
<span className="text-xl font-bold">UpSkill</span>
1818
</div>
1919
</Link>
20-
</div>
20+
</header>
2121

22-
<main className="w-full flex justify-center">
22+
<main className="w-full flex-grow flex items-center justify-center">
2323
<Outlet />
2424
</main>
2525
</div>

src/components/layouts/NavBar.tsx

Lines changed: 87 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useState } from 'react';
12
import { Link, useNavigate } from 'react-router-dom';
23
import {
34
BookOpen,
@@ -6,41 +7,40 @@ import {
67
GraduationCap,
78
ShoppingCart,
89
Bell,
10+
Menu,
11+
X,
912
} from 'lucide-react';
1013
import { useAuth } from '../../hooks/useAuth';
1114

1215
export function NavBar() {
1316
const { isAuthenticated, user, logout, isLoading } = useAuth();
1417
const navigate = useNavigate();
15-
16-
console.log(
17-
'[NavBar Render] IsLoading:',
18-
isLoading,
19-
'| IsAuthenticated:',
20-
isAuthenticated,
21-
'| User:',
22-
user
23-
);
18+
// Estado para controlar la apertura y cierre del menú móvil
19+
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
2420

2521
const handleLogout = () => {
2622
logout();
23+
setIsMobileMenuOpen(false); // Cierra el menú al desloguearse
2724
navigate('/login');
2825
};
2926

3027
const handleApplyClick = () => {
3128
if (!isAuthenticated) {
32-
alert("Debes iniciar sesión para poder aplicar.");
29+
alert('Debes iniciar sesión para poder aplicar.');
3330
navigate('/login');
34-
return;
35-
}
31+
} else {
3632
navigate('/professor/apply');
33+
}
34+
setIsMobileMenuOpen(false); // Cierra el menú después de la acción
3735
};
3836

3937
return (
4038
<header className="fixed top-0 left-0 right-0 z-50 bg-white/90 backdrop-blur-md border-b border-blue-100 shadow-sm">
4139
<div className="container mx-auto px-4 h-16 flex items-center justify-between">
40+
{/* Logo */}
4241
<Link
4342
to="/"
43+
onClick={() => setIsMobileMenuOpen(false)}
4444
className="flex items-center space-x-2 cursor-pointer hover:opacity-80 transition-opacity"
4545
>
4646
<div className="w-8 h-8 bg-gradient-to-br from-blue-400 to-green-400 rounded-lg flex items-center justify-center">
@@ -51,14 +51,26 @@ export function NavBar() {
5151
</span>
5252
</Link>
5353

54-
<div className="flex items-center space-x-2 md:space-x-4">
54+
{/* Botón de Menú Móvil (Hamburguesa) */}
55+
<div className="md:hidden">
56+
<button
57+
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
58+
className="p-2 rounded-md text-slate-700 hover:bg-slate-100"
59+
aria-label="Abrir menú"
60+
>
61+
{isMobileMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
62+
</button>
63+
</div>
64+
65+
{/* Navegación de Escritorio */}
66+
<div className="hidden md:flex items-center space-x-2 md:space-x-4">
5567
{(!user || user.role === 'student') && (
5668
<button
5769
className="hidden sm:flex items-center space-x-2 border-green-200 text-green-700 hover:bg-green-50 hover:border-green-300 bg-transparent px-4 py-2 rounded-lg border text-sm font-medium"
5870
onClick={handleApplyClick}
5971
>
6072
<GraduationCap className="w-4 h-4" />
61-
<span className="ml-2">Quiero ser profesor</span>
73+
<span>Quiero ser profesor</span>
6274
</button>
6375
)}
6476

@@ -107,6 +119,66 @@ export function NavBar() {
107119
)}
108120
</div>
109121
</div>
122+
123+
{/* Menú Desplegable Móvil */}
124+
{isMobileMenuOpen && (
125+
<div className="md:hidden bg-white border-t border-blue-100 px-4 pt-2 pb-4 space-y-2">
126+
{isLoading ? (
127+
<div className="h-8 w-full bg-slate-200 rounded-lg animate-pulse"></div>
128+
) : isAuthenticated ? (
129+
<>
130+
<div className="flex items-center gap-4 mb-4">
131+
<span className="text-sm font-medium text-slate-700">
132+
Hola, {user?.name}
133+
</span>
134+
</div>
135+
{(!user || user.role === 'student') && (
136+
<button
137+
onClick={handleApplyClick}
138+
className="w-full flex items-center justify-center space-x-2 border-green-200 text-green-700 hover:bg-green-50 bg-transparent px-4 py-2 rounded-lg border text-sm font-medium"
139+
>
140+
<GraduationCap className="w-4 h-4" />
141+
<span>Quiero ser profesor</span>
142+
</button>
143+
)}
144+
<button
145+
onClick={handleLogout}
146+
className="w-full text-sm font-medium text-slate-700 hover:text-blue-600 hover:bg-slate-50 py-2 rounded-lg"
147+
>
148+
Salir
149+
</button>
150+
</>
151+
) : (
152+
<>
153+
<Link
154+
to="/login"
155+
onClick={() => setIsMobileMenuOpen(false)}
156+
className="flex items-center justify-center text-slate-700 hover:text-blue-600 hover:bg-blue-50 px-4 py-2 rounded-lg transition-colors font-medium text-sm"
157+
>
158+
<LogIn className="w-4 h-4 mr-2" />
159+
Login
160+
</Link>
161+
<Link
162+
to="/register"
163+
onClick={() => setIsMobileMenuOpen(false)}
164+
className="flex items-center justify-center bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg transition-colors font-medium text-sm"
165+
>
166+
<UserPlus className="w-4 h-4 mr-2" />
167+
Register
168+
</Link>
169+
{(!user || user.role === 'student') && (
170+
<button
171+
onClick={handleApplyClick}
172+
className="w-full flex items-center justify-center space-x-2 border-green-200 text-green-700 hover:bg-green-50 bg-transparent px-4 py-2 rounded-lg border text-sm font-medium mt-2"
173+
>
174+
<GraduationCap className="w-4 h-4" />
175+
<span>Quiero ser profesor</span>
176+
</button>
177+
)}
178+
</>
179+
)}
180+
</div>
181+
)}
110182
</header>
111183
);
112-
}
184+
}

0 commit comments

Comments
 (0)