Skip to content

Commit 80b2e97

Browse files
committed
actividades / torneos
god save us all
1 parent a741d20 commit 80b2e97

File tree

12 files changed

+182
-45
lines changed

12 files changed

+182
-45
lines changed

src/lib/components/Schedule.svelte

Lines changed: 169 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
title: string;
99
presenter: string;
1010
organization?: string;
11+
type: "ponencia" | "taller" | "actividad" | "torneo";
1112
draft?: boolean;
1213
date: string;
1314
start: string;
@@ -37,6 +38,8 @@
3738
);
3839
3940
const articles: Record<string, Article[]> = {};
41+
const activities: Article[] = [];
42+
const tournaments: Article[] = [];
4043
for (const time of times) {
4144
articles[time.toString({ smallestUnit: "minute" })] = [];
4245
}
@@ -53,6 +56,27 @@
5356
const start = Temporal.PlainTime.from(metadata.start);
5457
const end = Temporal.PlainTime.from(metadata.end);
5558
59+
if (metadata.type === "actividad" || metadata.type === "torneo") {
60+
let i = 0;
61+
if (metadata.type === "actividad") {
62+
while (
63+
i < activities.length &&
64+
Temporal.PlainTime.compare(metadata.start, activities[i].start) > 0
65+
) {
66+
i++;
67+
}
68+
activities.splice(i, 0, { ...metadata, slug, date, start, end });
69+
} else {
70+
while (
71+
i < tournaments.length &&
72+
Temporal.PlainTime.compare(metadata.start, tournaments[i].start) > 0
73+
) {
74+
i++;
75+
}
76+
tournaments.splice(i, 0, { ...metadata, slug, date, start, end });
77+
}
78+
}
79+
5680
let i = 0;
5781
const dates = Object.keys(articles);
5882
while (
@@ -80,45 +104,114 @@
80104
}
81105
</script>
82106

83-
<table>
84-
<thead>
85-
<tr>
86-
<th scope="col"></th>
87-
<th scope="col">Lunes</th>
88-
<th scope="col">Martes</th>
89-
<th scope="col">Miércoles</th>
90-
<th scope="col">Jueves</th>
91-
<th scope="col">Viernes</th>
92-
</tr>
93-
</thead>
94-
<tbody>
95-
{#each Object.entries(articles) as [time, articleList]}
107+
<h3>Ponencias y Talleres</h3>
108+
<table-container>
109+
<table>
110+
<thead>
96111
<tr>
97-
<th>
98-
{time}
99-
-
100-
{Temporal.PlainTime.from(time)
101-
.add(Temporal.Duration.from({ minutes: 45 }))
102-
.toString({ smallestUnit: "minutes" })}
103-
</th>
104-
{#each articleList as article}
105-
<td rowspan={getSpan(article.end.since(article.start))}>
106-
<p>
107-
<a href="/events/{article.slug}">
108-
{article.title}
109-
</a>
110-
</p>
111-
{#if article.organization}
112-
<small>{article.organization}</small>
113-
{/if}
114-
</td>
115-
{/each}
112+
<th scope="col"></th>
113+
<th scope="col">Lunes</th>
114+
<th scope="col">Martes</th>
115+
<th scope="col">Miércoles</th>
116+
<th scope="col">Jueves</th>
117+
<th scope="col">Viernes</th>
116118
</tr>
119+
</thead>
120+
<tbody>
121+
{#each Object.entries(articles) as [time, articleList]}
122+
<tr>
123+
<th>
124+
{time}
125+
-
126+
{Temporal.PlainTime.from(time)
127+
.add(Temporal.Duration.from({ minutes: 45 }))
128+
.toString({ smallestUnit: "minutes" })}
129+
</th>
130+
{#each articleList as article}
131+
<td rowspan={getSpan(article.end.since(article.start))}>
132+
<p>
133+
<a href="/events/{article.slug}">
134+
{article.title}
135+
</a>
136+
</p>
137+
{#if article.organization}
138+
<small>{article.organization}</small>
139+
{/if}
140+
</td>
141+
{/each}
142+
</tr>
143+
{/each}
144+
</tbody>
145+
</table>
146+
</table-container>
147+
<secondary-events>
148+
<div>
149+
<h3>Actividades</h3>
150+
{#each activities as activity}
151+
<article>
152+
<a href="/events/{activity.slug}">
153+
<h4>{activity.title}</h4>
154+
</a>
155+
<strong>
156+
<p>
157+
{activity.date.toLocaleString("es", {
158+
weekday: "long",
159+
day: "numeric",
160+
})}
161+
</p>
162+
<p>
163+
<time datetime="{activity.date}T{activity.start}">
164+
{activity.start.toString({ smallestUnit: "minutes" })}
165+
</time>
166+
-
167+
<time datetime="{activity.date}T{activity.end}">
168+
{activity.end.toString({ smallestUnit: "minutes" })}
169+
</time>
170+
</p>
171+
</strong>
172+
</article>
117173
{/each}
118-
</tbody>
119-
</table>
174+
</div>
175+
<div>
176+
<h3>Torneos</h3>
177+
{#each tournaments as tournament}
178+
<article>
179+
<a href="/events/{tournament.slug}">
180+
<h4>{tournament.title}</h4>
181+
</a>
182+
<strong>
183+
<p>
184+
{tournament.date.toLocaleString("es", {
185+
weekday: "long",
186+
day: "numeric",
187+
})}
188+
</p>
189+
<p>
190+
<time datetime="{tournament.date}T{tournament.start}">
191+
{tournament.start.toString({ smallestUnit: "minutes" })}
192+
</time>
193+
-
194+
<time datetime="{tournament.date}T{tournament.end}">
195+
{tournament.end.toString({ smallestUnit: "minutes" })}
196+
</time>
197+
</p>
198+
</strong>
199+
</article>
200+
{/each}
201+
</div>
202+
</secondary-events>
120203

121204
<style>
205+
table-container {
206+
display: block;
207+
height: auto;
208+
max-width: 75%;
209+
overflow-x: auto;
210+
@media (width < 768px) {
211+
max-width: calc(100% - 16px);
212+
}
213+
}
214+
122215
table {
123216
table-layout: fixed;
124217
min-width: 1000px;
@@ -150,4 +243,46 @@
150243
color: light-dark(#111111, lightgray);
151244
}
152245
}
246+
247+
secondary-events {
248+
display: flex;
249+
flex-direction: row;
250+
flex-wrap: wrap;
251+
gap: 20px;
252+
h3 {
253+
text-align: center;
254+
}
255+
h4 {
256+
font-size: 1.2em;
257+
margin: 1em 0;
258+
max-width: 400px;
259+
}
260+
strong {
261+
text-transform: capitalize;
262+
text-align: end;
263+
}
264+
p {
265+
margin: 14px 0;
266+
&:last-child {
267+
text-wrap: nowrap;
268+
}
269+
}
270+
article {
271+
display: flex;
272+
flex-direction: row;
273+
align-items: center;
274+
gap: 1em;
275+
padding: 0 16px;
276+
justify-content: space-between;
277+
border: var(--border);
278+
border-bottom: none;
279+
background-color: light-dark(#eeeeee, #222222);
280+
&:nth-child(odd) {
281+
background-color: light-dark(#fafafa, #2e2e2e);
282+
}
283+
&:last-child {
284+
border-bottom: var(--border);
285+
}
286+
}
287+
}
153288
</style>

src/routes/+page.svelte

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,7 @@
128128
</section>
129129
<section id="schedule">
130130
<h2>Horario</h2>
131-
<table-container>
132-
<Schedule />
133-
</table-container>
131+
<Schedule />
134132
</section>
135133
<section id="location">
136134
<h2>Zona</h2>
@@ -316,14 +314,8 @@
316314
padding-bottom: 75px;
317315
align-items: center;
318316
justify-content: center;
319-
table-container {
320-
display: block;
321-
height: auto;
322-
max-width: 75%;
323-
overflow-x: auto;
324-
@media (width < 768px) {
325-
max-width: calc(100% - 16px);
326-
}
317+
& > h2 {
318+
margin: 0;
327319
}
328320
}
329321

src/routes/events/analisis-ia/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: 'Análisis de datos con IA: menos código, más insights'
33
description: 'Un taller en el que poner en práctica la optimización del análisis de datos utilizando distintos LLM con Python'
44
presenter: 'Ismael Pineda Palencia'
55
organization: 'Fortris'
6+
type: 'ponencia'
67
date: '2026-03-10'
78
start: '17:30'
89
end: '19:15'

src/routes/events/hacking-hardware/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title: 'Introducción al hacking hardware'
33
description: 'Una ponencia sobre el flujo de trabajo y herramientas en el hacking hardware'
44
presenter: 'David Santo Orcero & David Reguera'
5+
type: 'ponencia'
56
date: '2026-03-09'
67
start: '10:45'
78
end: '11:30'

src/routes/events/incibe/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: '??'
33
description: '??'
44
presenter: '??'
55
organization: 'Incibe'
6+
type: '??'
67
date: '2026-03-13'
78
start: '10:45'
89
end: '12:30'

src/routes/events/manual-a-automatizado/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: 'De lo manual a lo automatizado: cómo diseñar una API de extracción in
33
description: 'Extracción de datos automatizado para el sector financiero.'
44
presenter: 'Fernando López Prieto'
55
organization: 'Ebury'
6+
type: 'ponencia'
67
date: '2026-03-09'
78
start: '11:45'
89
end: '12:30'

src/routes/events/omnia-intelligence/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title: 'Omnia: Collective Cyber Intelligence. Powered by AI. United by Community.'
33
description: 'Una ponencia centrada en la plataforma Omnia y todas sus posibilidades'
44
presenter: 'Alejandro García Peláez'
5+
type: 'ponencia'
56
date: '2026-03-12'
67
start: '10:45'
78
end: '12:30'

src/routes/events/openbokeron-desarrollo/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: 'De cero a producción: automatiza tu flujo de desarrollo'
33
description: 'Un taller donde aprender a automatizar el desarrollo back-end y front-end en un entorno real'
44
presenter: 'Amin Chaloukh El Mohammadi'
55
organization: 'OpenBokeron'
6+
type: 'taller'
67
date: '2026-03-09'
78
start: '17:30'
89
end: '19:15'

src/routes/events/production-api/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title: 'Construye y Despliega tu API Ready-for-Production: Minimal API en C#, Github Actions y Azure'
33
description: 'Un taller donde llevar a la práctica tu propia API'
44
presenter: 'Javier Torralbo Cortés, Alejandro Cerezo Contreras'
5+
type: 'taller'
56
date: '2026-03-11'
67
start: '17:30'
78
end: '19:15'

src/routes/events/red-team/+page.svx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: 'Vivir sin COM-promisos: Del acceso inicial a la persistencia en operacio
33
description: 'Red Team y persistencia COM en Windows'
44
presenter: 'Por confirmar'
55
organization: 'Accenture'
6+
type: 'ponencia'
67
date: '2026-03-11'
78
start: '10:45'
89
end: '12:30'

0 commit comments

Comments
 (0)