Skip to content

Commit b88b655

Browse files
committed
fix: Added information about a talk at CompuFest and preliminary details for FLISOL 2026. The background color of the events‑section notification was changed for emphasis. A redundant field (location) was removed from Events.ts; now only locations is used, and the necessary components were adjusted. The dark theme now follows the system theme.
1 parent aab3f3e commit b88b655

10 files changed

Lines changed: 217 additions & 177 deletions

File tree

project.org

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -361,8 +361,8 @@ El archivo src/data/blogPosts.ts se sigue usando, este genera los componentes [[
361361
- Para implementar el soporte multi-idioma:
362362
- Se modificará el directorio de cada post para contener versiones por idioma, un archivo por cada idioma (en este caso solo inglés-español, por ejemplo: index.es.md, index.en.md).
363363
- Se modificará el[[file:scripts/build-blog.js][ script]] que genera el[[file:src/data/blogPosts.ts][ archito ts]] con que usan los compontes que genran el blog. Deben detectar los archivos con sufijos .es.md o en.md y generar la estructura tipo json adecuada.
364-
**** IN-PROGRESS Events y EventDetail [78%]
365-
DEADLINE: <2026-03-10 Tue>
364+
**** IN-PROGRESS Events y EventDetail [86%]
365+
DEADLINE: <2026-04-12 Sun>
366366
- [X] Mudar el contenido "legacy" [100%]
367367
- [X] Las tecnologías de internet en los movimientos sociales
368368
- [X] CCOSS
@@ -387,21 +387,24 @@ DEADLINE: <2026-03-10 Tue>
387387
- [X] Mejorar el sombreado de eventsDetail
388388
- [X] La tarjeta que muestra los ponentes tiene un bug 🐛
389389
- [X] ¿Podríamos añadir un registro?
390-
- [ ] Añadir el nuevo evento flisol
391-
- [-] Calendario no, tres cosas: 1:
390+
- [X] Añadir el nuevo evento flisol
391+
- [X] Ubicación vs Ubicaciones. Hacerlo a modo de lista.
392+
- [-] Calendario:
392393
Este calendario está basado en la vista de GNOME Notifications/Calendar.
393-
- [ ] En el calendario de Events.tsx, se debe mostrar un punto debajo del día del evento
394-
- [ ] Hacer que el color de la notificación sea más clara que el BG general
394+
- [ ] Hacer que el calendario soporte el multi-idioma
395395
- [ ] Hacer que la notificación tenga el mismo ancho que el calendario.
396+
- [ ] En el calendario de Events.tsx, se debe mostrar un punto debajo del día del evento
397+
- [X] Hacer que el color de la notificación sea más clara que el BG general
396398
- [X] En Events.tsx, debajo del calendario, se debe mostrar un apartado de notificaciones que muestre todos los próximos eventos.
397399
- [X] En el calendario de EventDetail.tsx muestra encerrado en un círculo el día del evento
398400
- [ ] Mejorar la sección de cronograma
399401
- [ ] Tener sub-items por día/hora
402+
- [ ] Añadir la información faltante de FLISOL 2026
400403
**** IN-PROGRESS CourseDetail y CourseDetail [22%]
401-
DEADLINE: <2026-03-07 Sat>
402-
- [-] Mudar el contenido al sitio actual [40%]
403-
- [X] Seminario de lisp
404-
- [X] Fundamentos de Python
404+
DEADLINE: <2026-04-12 Sun>
405+
- [ ] Mudar el contenido al sitio actual [0%]
406+
- [ ] Seminario de lisp
407+
- [ ] Fundamentos de Python
405408
- [ ] PumaHat
406409
- [ ] Curso básico de sysadmin GNU/Linux
407410
- [ ] Curso de LaTeX
@@ -457,8 +460,8 @@ DEADLINE: <2026-03-03 Tue>
457460
- [X] Mejorar el color del botón cuando el cursor está sobré él en tema claro
458461
- Tal vez en el futuro sea bueno añadir paginación, si crece mucho el número de miembros. Igual intentar con una base de datos... (si hay más de 50 miembros, tal vea hora de dejar el "json").
459462
*** TODO Optimización/Bugs/Testing/Corrección de vulnerabilidades
460-
DEADLINE: <2026-03-21 Sat>
461-
**** Modo oscuro automático según el sistema
463+
DEADLINE: <2026-04-18 Sat>
464+
**** DONE Modo oscuro automático según el sistema
462465
**** Tal vez sería bueno cambiar el texto de "Proyectos en desarrollo" del Home, pues hay algunas investigaciones que ya no están en curso.
463466
**** Añadir una "pantalla de carga" al inicio.
464467
**** Tema oscuro automático
@@ -473,7 +476,7 @@ Al estar en dispositivos móviles, el efecto de brillo que sigue al cursos se qu
473476
Hay un problema con las tarjetas de "Último curso, Último post de blog" en dispositivos móviels el contenido no se ve completo.
474477
**** Auditoría de ciberseguridad
475478
*** TODO Documentar
476-
DEADLINE: <2026-03-17 Tue>
479+
DEADLINE: <2026-04-18 Sat>
477480
** DONE Deploy
478481
DEADLINE: <2026-03-28 Sat>
479482
* Arquitectura
59.3 KB
Loading
180 KB
Loading
142 KB
Loading

src/components/EventDetail.tsx

Lines changed: 7 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export function EventDetail({ event, onBack, onMemberClick }: EventDetailProps)
5353
const t = {
5454
back: { en: "Back to Events", es: "Volver a Eventos" },
5555
description: { en: "Description", es: "Descripción" },
56-
agenda: { en: "Agenda", es: "Agenda" },
56+
contents: { en: "Contents", es: "Contenidos" },
5757
requirements: { en: "Requirements", es: "Requisitos" },
5858
eventDetails: { en: "Event Details", es: "Detalles del Evento" },
5959
location: { en: "Location", es: "Ubicación" },
@@ -65,6 +65,7 @@ export function EventDetail({ event, onBack, onMemberClick }: EventDetailProps)
6565
time: { en: "Time", es: "Hora" },
6666
capacity: { en: "Capacity", es: "Capacidad" },
6767
relatedLinks: { en: "Related Links", es: "Enlaces relacionados" },
68+
upcoming: { en: "Upcoming", es: "Próximamente" },
6869
};
6970

7071
const matchedSpeakers = (event.speakers || []).map(speaker => {
@@ -134,7 +135,7 @@ export function EventDetail({ event, onBack, onMemberClick }: EventDetailProps)
134135
))}
135136
{event.status === "upcoming" && (
136137
<Badge className="bg-green-500/10 text-green-700 dark:text-green-400 border-green-500/20">
137-
Upcoming
138+
{t.upcoming[language]}
138139
</Badge>
139140
)}
140141
</div>
@@ -159,23 +160,6 @@ export function EventDetail({ event, onBack, onMemberClick }: EventDetailProps)
159160
<span>{event.time}</span>
160161
</div>
161162
)}
162-
{event.location && (
163-
<div className="flex items-center gap-2">
164-
<MapPin className="h-5 w-5 text-primary" />
165-
{event.location.url ? (
166-
<a
167-
href={event.location.url}
168-
target="_blank"
169-
rel="noopener noreferrer"
170-
className="hover:text-primary hover:underline"
171-
>
172-
{event.location.name[language]}
173-
</a>
174-
) : (
175-
<span>{event.location.name[language]}</span>
176-
)}
177-
</div>
178-
)}
179163
{event.locations && event.locations.length > 0 && event.locations.map((loc, idx) => (
180164
<div key={idx} className="flex items-center gap-2">
181165
<MapPin className="h-5 w-5 text-primary" />
@@ -270,12 +254,12 @@ export function EventDetail({ event, onBack, onMemberClick }: EventDetailProps)
270254
</div>
271255
)}
272256

273-
{/* Agenda */}
274-
{event.agenda && (
257+
{/* Contents */}
258+
{event.contents && (
275259
<div className="bg-primary/5 border border-primary/10 rounded-3xl p-8">
276-
<h2 className="text-3xl mb-6">{t.agenda[language]}</h2>
260+
<h2 className="text-3xl mb-6">{t.contents[language]}</h2>
277261
<ul className="space-y-3">
278-
{event.agenda[language].map((item, index) => (
262+
{event.contents[language].map((item, index) => (
279263
<li key={index} className="flex items-start gap-3">
280264
<div className="bg-primary text-primary-foreground rounded-full w-6 h-6 flex items-center justify-center text-sm flex-shrink-0 mt-0.5">
281265
{index + 1}
@@ -348,29 +332,6 @@ export function EventDetail({ event, onBack, onMemberClick }: EventDetailProps)
348332
</div>
349333
)}
350334

351-
{event.location && (
352-
<div className="flex items-start gap-3">
353-
<MapPin className="h-5 w-5 text-primary mt-0.5 flex-shrink-0" />
354-
<div>
355-
<div className="text-sm text-muted-foreground mb-1">
356-
{t.location[language]}
357-
</div>
358-
{event.location.url ? (
359-
<a
360-
href={event.location.url}
361-
target="_blank"
362-
rel="noopener noreferrer"
363-
className="font-medium hover:text-primary hover:underline"
364-
>
365-
{event.location.name[language]}
366-
</a>
367-
) : (
368-
<div className="font-medium">{event.location.name[language]}</div>
369-
)}
370-
</div>
371-
</div>
372-
)}
373-
374335
{event.locations && event.locations.length > 0 && event.locations.map((loc, idx) => (
375336
<div key={idx} className="flex items-start gap-3">
376337
<MapPin className="h-5 w-5 text-primary mt-0.5 flex-shrink-0" />

src/components/Events.tsx

Lines changed: 32 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "./ui/card";
1+
import { Card } from "./ui/card";
22
import { Badge } from "./ui/badge";
3-
import { Calendar as CalendarIcon, MapPin, Clock, Users, ArrowRight, Bell } from "lucide-react";
3+
import { Calendar as CalendarIcon, MapPin, Clock, ArrowRight } from "lucide-react";
44
import { Button } from "./ui/button";
55
import { Calendar } from "./ui/calendar";
66
import { ImageWithFallback } from "./figma/ImageWithFallback";
@@ -16,7 +16,6 @@ export function Events({ onEventClick }: EventsProps) {
1616
const { language } = useLanguage();
1717
const [date, setDate] = useState<Date | undefined>(new Date());
1818

19-
// Lógica para ordenar los eventos del más reciente al más antiguo
2019
const sortedEvents = useMemo(() => {
2120
return [...events].sort((a, b) => {
2221
const dateA = a.startDate ? new Date(a.startDate).getTime() : 0;
@@ -48,63 +47,62 @@ export function Events({ onEventClick }: EventsProps) {
4847

4948
return (
5049
<section id="events" className="py-20 bg-background min-h-screen">
50+
<style>{`
51+
.notification-bg { background-color: #F5F5F5; }
52+
.dark .notification-bg { background-color: #47474C; }
53+
`}</style>
5154
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
52-
{/* Header */}
5355
<div className="text-center space-y-4 mb-16">
54-
<h1 className="text-5xl sm:text-6xl">{t.title[language]}</h1>
56+
<h1 className="text-5xl sm:text-6xl tracking-tight">{t.title[language]}</h1>
5557
<p className="text-xl text-muted-foreground max-w-2xl mx-auto">
5658
{t.subtitle[language]}
5759
</p>
5860
</div>
5961

60-
{/* Calendar at top */}
6162
<div className="max-w-md mx-auto mb-16">
62-
<div className="bg-card rounded-3xl p-6 border border-border/50">
63-
<div className="space-y-4">
64-
<h2 className="text-2xl mb-2 text-center">{t.calendar[language]}</h2>
63+
<div className="bg-card rounded-3xl p-6 border border-border/40 shadow-sm">
64+
<div className="space-y-6">
65+
<h2 className="text-xl font-medium text-center">{t.calendar[language]}</h2>
66+
6567
<div className="flex justify-center">
66-
<div className="w-full flex justify-center">
67-
<Calendar
68-
mode="single"
69-
selected={date}
70-
onSelect={setDate}
71-
className="rounded-2xl border-none"
72-
/>
73-
</div>
68+
<Calendar
69+
mode="single"
70+
selected={date}
71+
onSelect={setDate}
72+
className="rounded-2xl border-none"
73+
/>
7474
</div>
7575

76-
{/* Notification Card - GNOME style */}
77-
<div className="bg-secondary rounded-xl p-3">
78-
<div className="flex items-start gap-3">
79-
<div className="mt-0.5">
80-
<Bell className="h-5 w-5 text-primary" />
81-
</div>
76+
<div className="w-full notification-bg rounded-2xl p-3">
77+
<div className="flex items-start gap-4">
8278
<div className="flex-1 min-w-0">
83-
<div className="text-xs uppercase tracking-wide mb-1 text-muted-foreground">
79+
<div className="text-[10px] font-bold uppercase tracking-widest mb-1 text-muted-foreground/90">
8480
{t.nextEvent[language]}
8581
</div>
82+
8683
{upcomingEvent ? (
8784
<button
8885
onClick={() => onEventClick(upcomingEvent.id)}
89-
className="text-left w-full hover:opacity-80 transition-opacity"
86+
className="text-left w-full group"
9087
>
91-
<div className="font-medium truncate">
88+
<div className="font-semibold truncate group-hover:text-primary transition-colors">
9289
{upcomingEvent.title[language]}
9390
</div>
94-
<div className="flex items-center gap-2 mt-1 text-sm text-muted-foreground">
95-
<CalendarIcon className="h-3.5 w-3.5" />
96-
<span>{upcomingEvent.startDate}</span>
91+
<div className="flex items-center gap-3 mt-1.5 text-sm text-muted-foreground/80">
92+
<div className="flex items-center gap-1">
93+
<CalendarIcon className="h-3.5 w-3.5" />
94+
<span>{upcomingEvent.startDate}</span>
95+
</div>
9796
{upcomingEvent.time && (
98-
<>
99-
<span>·</span>
97+
<div className="flex items-center gap-1">
10098
<Clock className="h-3.5 w-3.5" />
10199
<span>{upcomingEvent.time}</span>
102-
</>
100+
</div>
103101
)}
104102
</div>
105103
</button>
106104
) : (
107-
<div className="text-sm text-muted-foreground">
105+
<div className="text-sm text-muted-foreground italic">
108106
{t.noUpcoming[language]}
109107
</div>
110108
)}
@@ -115,32 +113,25 @@ export function Events({ onEventClick }: EventsProps) {
115113
</div>
116114
</div>
117115

118-
{/* Timeline - Vertical Event Cards */}
119116
<div className="max-w-4xl mx-auto space-y-6">
120117
{sortedEvents.map((event, index) => (
121118
<div key={event.id} className="relative">
122-
{/* Timeline connector (Se mantiene idéntico, solo cambia la referencia al arreglo ordenado) */}
123119
{index < sortedEvents.length - 1 && (
124120
<div className="absolute left-8 top-24 bottom-0 w-0.5 bg-border -mb-6" />
125121
)}
126122

127-
{/* Event Card */}
128123
<div className="flex gap-6">
129-
{/* Date indicator */}
130124
<div className="flex-shrink-0 w-16 pt-2">
131125
<div className="bg-primary text-primary-foreground rounded-2xl p-3 text-center">
132126
<div className="text-2xl leading-none mb-1">
133-
{/* CORRECCIÓN: Usar getUTCDate() para evitar el desfase de la zona horaria local */}
134127
{event.startDate ? new Date(event.startDate).getUTCDate() : '?'}
135128
</div>
136129
<div className="text-xs uppercase">
137-
{/* CORRECCIÓN: Añadir timeZone: 'UTC' al formatear el mes */}
138130
{event.startDate ? new Date(event.startDate).toLocaleString('default', { month: 'short', timeZone: 'UTC' }) : '-'}
139131
</div>
140132
</div>
141133
</div>
142134

143-
{/* Event content */}
144135
<Card className="flex-1 overflow-hidden hover:shadow-lg transition-all duration-300 border-border/60 group">
145136
<div className="grid md:grid-cols-5 gap-0">
146137
<div
@@ -183,12 +174,6 @@ export function Events({ onEventClick }: EventsProps) {
183174
<span className="text-muted-foreground">{event.time}</span>
184175
</div>
185176
)}
186-
{event.location && (
187-
<div className="flex items-center gap-2">
188-
<MapPin className="h-3.5 w-3.5 text-muted-foreground" />
189-
<span className="text-muted-foreground">{event.location.name[language]}</span>
190-
</div>
191-
)}
192177
{event.locations && event.locations.map((loc, idx) => (
193178
<div key={idx} className="flex items-center gap-2">
194179
<MapPin className="h-3.5 w-3.5 text-muted-foreground" />
@@ -213,4 +198,4 @@ export function Events({ onEventClick }: EventsProps) {
213198
</div>
214199
</section>
215200
);
216-
}
201+
}

src/components/LatestHighlights.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,8 @@ export function LatestHighlights({
289289
<span className="text-muted-foreground/40">·</span>
290290
<div className="flex items-center gap-1.5">
291291
<MapPin className="h-3.5 w-3.5 text-primary" />
292-
<span>{latestEvent.location?.name[language] || latestEvent.locations?.[0]?.name[language]}</span>
293-
</div>
292+
<span>{latestEvent.locations?.[0]?.name[language]}</span>
293+
</div>
294294
</div>
295295
</div>
296296
</div>

src/components/ThemeProvider.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,20 @@ export function ThemeProvider({ children }: { children: ReactNode }) {
1313
const [theme, setTheme] = useState<Theme>("light");
1414

1515
useEffect(() => {
16-
// Check for saved theme preference or default to light
17-
const savedTheme = localStorage.getItem("theme") as Theme | null;
18-
if (savedTheme) {
19-
setTheme(savedTheme);
20-
document.documentElement.classList.toggle("dark", savedTheme === "dark");
21-
}
16+
const applyTheme = (isDark: boolean) => {
17+
setTheme(isDark ? "dark" : "light");
18+
document.documentElement.classList.toggle("dark", isDark);
19+
};
20+
21+
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
22+
applyTheme(mediaQuery.matches);
23+
24+
const handleChange = (e: MediaQueryListEvent) => {
25+
applyTheme(e.matches);
26+
};
27+
28+
mediaQuery.addEventListener("change", handleChange);
29+
return () => mediaQuery.removeEventListener("change", handleChange);
2230
}, []);
2331

2432
const toggleTheme = () => {

0 commit comments

Comments
 (0)