Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ dist/
.vscode/

*.local

.claude
83 changes: 83 additions & 0 deletions src/components/TeamsPage.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
---
import { teamsTexts } from '../i18n/teams'

interface Props {
lang: string
}

const { lang } = Astro.props
const t = teamsTexts[(lang || 'es') as keyof typeof teamsTexts]

const teams = (
Object.values(import.meta.glob('../data/teams/*.md', { eager: true })) as {
frontmatter: { name: string; description: string; contact: string }
}[]
).sort((a, b) => a.frontmatter.name.localeCompare(b.frontmatter.name))
---

<div class="teams-container pb-20">
<section class="mb-12" aria-labelledby="teams-heading">
<h1 id="teams-heading" class="text-4xl md:text-6xl font-black text-white mb-6 uppercase tracking-tighter">
{t.hero}
</h1>
</section>

<section aria-labelledby="teams-list-heading">
<ul role="list" class="grid md:grid-cols-2 gap-8 list-none m-0 p-0">
{
teams.map(({ frontmatter: team }) => (
<li class="bg-pycon-black/40 p-8 rounded-2xl border border-white/5 hover:border-pycon-orange/50 transition-all motion-safe:hover:-translate-y-2">
<h2 class="text-xl font-bold text-pycon-orange mb-3">{team.name}</h2>
<p class="text-pycon-gray-25 text-sm leading-relaxed mb-6">{team.description}</p>
<a
href={`mailto:${team.contact}`}
aria-label={`${t.contact} ${team.name}: ${team.contact}`}
class="inline-flex items-center gap-2 text-sm text-pycon-yellow hover:text-white transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-pycon-yellow rounded"
>
<svg
class="w-4 h-4 shrink-0"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
/>
</svg>
<span aria-hidden="true">
{t.contact}: {team.contact}
</span>
</a>
</li>
))
}
</ul>
</section>
</div>

<style>
.teams-container {
animation: fadeIn 0.8s ease-out;
}

@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}

@media (prefers-reduced-motion: reduce) {
.teams-container {
animation: none;
}
}
</style>
5 changes: 5 additions & 0 deletions src/data/teams/catering.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Catering'
description: 'Aseguramos que nadie pase hambre en la PyConES2026, para que los asistentes puedan recargar energía entre charla y charla.'
contact: 'contacto@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/diversity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Diversidad y becas'
description: 'Hacemos que el evento sea accesible para toda la comunidad, para que nadie se quede fuera por razones económicas o de representación.'
contact: 'diversidadybecas@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/merch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Merch'
description: 'Diseñamos el merchandising oficial de la PyConES 2026 para que el evento se quede contigo mucho después de que termine'
contact: 'contacto@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/program.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Programa'
description: 'Nos encargamos de seleccionar charlas, keynotes y otras sesiones, además de la confección del horario'
contact: 'charlas@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/rrss.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'RRSS & Comms'
description: 'Gestionamos la presencia digital y la comunicación oficial de la PyConES 2026 para que nadie se pierda nada y que la comunidad Python esté siempre informada'
contact: 'comm@es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/social.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Fiestas y Social'
description: 'Organizamos los momentos de conexión fuera del escenario: las fiestas y eventos sociales de la PyConES 2026 donde la comunidad Python se reúne, celebra y crea vínculos.'
contact: 'contacto@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/sponsors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Sponsors'
description: 'Buscamos financiación para la conferencia y aseguramos la mejor experiencia para todas las entidades patrocinadoras.'
contact: 'sponsors@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/ticketing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Ticketing y Acreditaciones'
description: 'Gestionamos el acceso a la PyConES 2026, desde la venta de entradas hasta la acreditación en puerta, para garantizar una experiencia ágil y sin fricciones.'
contact: 'tickets@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/venue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Venue'
description: 'Buscamos y gestionamos el espacio perfecto para la PyConES 2026, es decir, coordinamos el lugar del evento para que todo encaje'
contact: 'contacto@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/volunteers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Voluntarios'
description: 'Reclutamos, formamos y coordinamos al equipo de voluntarios que hace posible la PyConES 2026: las personas que están en primera línea para que todo fluya el día del evento.'
contact: 'contacto@2026.es.pycon.org'
---
5 changes: 5 additions & 0 deletions src/data/teams/web.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: 'Web'
description: 'Diseñamos y mantenemos la web oficial de la PyConES 2026 para que la comunidad encuentre toda la información que necesita.'
contact: 'contacto@2026.es.pycon.org'
---
21 changes: 15 additions & 6 deletions src/i18n/menu/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,21 @@ export const ca = {
href: '/',
},
{
label: 'Seu',
href: '/location',
},
{
label: 'On allotjar-se',
href: '/accommodation',
label: 'Informació',
children: [
{
label: 'Seu',
href: '/location',
},
{
label: 'On allotjar-se',
href: '/accommodation',
},
{
label: 'Equips',
href: '/teams',
},
],
},
{
label: 'Diversitat i Inclusió',
Expand Down
21 changes: 15 additions & 6 deletions src/i18n/menu/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,21 @@ export const en = {
href: '/',
},
{
label: 'Venue',
href: '/location',
},
{
label: 'Where to stay',
href: '/accommodation',
label: 'Information',
children: [
{
label: 'Venue',
href: '/location',
},
{
label: 'Where to stay',
href: '/accommodation',
},
{
label: 'Teams',
href: '/teams',
},
],
},
{
label: 'Diversity and Inclusion',
Expand Down
21 changes: 15 additions & 6 deletions src/i18n/menu/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,21 @@ export const es = {
href: '/',
},
{
label: 'Sede',
href: '/location',
},
{
label: 'Dónde alojarse',
href: '/accommodation',
label: 'Información',
children: [
{
label: 'Sede',
href: '/location',
},
{
label: 'Dónde alojarse',
href: '/accommodation',
},
{
label: 'Equipos',
href: '/teams',
},
],
},
{
label: 'Diversidad e Inclusión',
Expand Down
5 changes: 5 additions & 0 deletions src/i18n/teams/ca.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const ca = {
title: 'Equips | PyConES 2026',
hero: 'Equips',
contact: 'Contacte',
} as const
5 changes: 5 additions & 0 deletions src/i18n/teams/en.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const en = {
title: 'Teams | PyConES 2026',
hero: 'Teams',
contact: 'Contact',
} as const
5 changes: 5 additions & 0 deletions src/i18n/teams/es.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const es = {
title: 'Equipos | PyConES 2026',
hero: 'Equipos',
contact: 'Contacto',
} as const
9 changes: 9 additions & 0 deletions src/i18n/teams/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { es } from './es'
import { en } from './en'
import { ca } from './ca'

export const teamsTexts = {
es,
en,
ca,
} as const
26 changes: 26 additions & 0 deletions src/pages/[lang]/teams.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
import Layout from '../../layouts/Layout.astro'
import TeamsPage from '../../components/TeamsPage.astro'

export function getStaticPaths() {
return [{ params: { lang: 'es' } }, { params: { lang: 'en' } }, { params: { lang: 'ca' } }]
}

const { lang } = Astro.params

const titles = {
es: 'Equipos | PyConES 2026',
en: 'Teams | PyConES 2026',
ca: 'Equips | PyConES 2026',
}

const title = titles[(lang || 'es') as keyof typeof titles]
---

<Layout title={title}>
<div class="grow w-full pt-24">
<div class="container mx-auto px-4 md:px-8">
<TeamsPage lang={lang || 'es'} />
</div>
</div>
</Layout>
Loading