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
13 changes: 13 additions & 0 deletions src/components/CenteredPanel.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
interface Props {
text: string
}

const { text } = Astro.props
---

<div class="flex-1 flex items-center justify-center bg-black/15 p-4 md:p-8">
<p class="text-center md:text-xl">
{text}
</p>
</div>
9 changes: 9 additions & 0 deletions src/components/SectionTitle.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
interface Props {
title: string
}

const { title } = Astro.props
---

<h3 class="text-center text-2xl">{title}</h3>
15 changes: 5 additions & 10 deletions src/components/home/SectionMain.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
import { texts } from '../../i18n/home'
import CenteredPanel from '../CenteredPanel.astro'

interface Props {
lang: string
Expand All @@ -9,8 +10,8 @@ const { lang } = Astro.props
const t = texts[lang as keyof typeof texts]
---

<div class="mt-20 p-20 flex gap-4 flex-col lg:flex-row">
<div class="flex-1">
<div class="mt-20 pt-20 flex gap-4 flex-col lg:flex-row">
<div class="flex-1 mb-4">
<h1>
<img
src="/images/logo-vertical-alt-color-dark.svg"
Expand All @@ -21,7 +22,7 @@ const t = texts[lang as keyof typeof texts]

<h2
id="subtitle-container"
class="mt-4 text-xl md:text-2xl text-pycon-red-75 font-mono h-8 flex justify-center items-start gap-2 [text-shadow:0_0_3px_var(--color-pycon-black),0_0_6px_var(--color-pycon-black),0_0_6px_var(--color-pycon-black),0_0_12px_var(--color-pycon-black)]"
class="mt-4 md:text-2xl text-pycon-red-75 font-mono h-8 flex justify-center items-start gap-2 [text-shadow:0_0_3px_var(--color-pycon-black),0_0_6px_var(--color-pycon-black),0_0_6px_var(--color-pycon-black),0_0_12px_var(--color-pycon-black)]"
aria-live="polite"
aria-busy="true"
>
Expand All @@ -32,13 +33,7 @@ const t = texts[lang as keyof typeof texts]
</span>
</h2>
</div>
<div class="flex-1 flex items-center justify-center mt-10 lg:mt-0">
<h3>
<p class="text-center text-xl max-w-3xl">
{t['index.message']}
</p>
</h3>
</div>
<CenteredPanel text={t['index.message']} />
</div>

<script>
Expand Down
41 changes: 41 additions & 0 deletions src/components/home/SectionSponsors.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
import { texts } from '../../i18n/home'
import SectionTitle from '../SectionTitle.astro'
import CenteredPanel from '../CenteredPanel.astro'
import type { ISponsor } from '../../types/sponsors'
import SponsorsGroup from './sponsors/SponsorsGroup.astro'

const sponsors = Object.values(import.meta.glob('../../data/sponsors/*.md', { eager: true })) as {
frontmatter: ISponsor
}[]

interface Props {
lang: string
}

const { lang } = Astro.props
const t = texts[lang as keyof typeof texts]

function filterSponsorsByTier(tier: string): ISponsor[] {
return sponsors.filter((s) => s.frontmatter.tier === tier).map((s) => s.frontmatter)
}

const bronze = filterSponsorsByTier('bronze')
const silver = filterSponsorsByTier('silver')
const gold = filterSponsorsByTier('gold')
const platinum = filterSponsorsByTier('platinum')
const main = filterSponsorsByTier('main')
---

<div class="flex flex-col items-center gap-4">
<SectionTitle title={t['sponsors.title']} />
<CenteredPanel text={t['sponsors.description']} />

<div class="w-full flex flex-col gap-8">
<SponsorsGroup lang={lang} title={t['sponsors.main']} sponsors={main} tierId="main" />
<SponsorsGroup lang={lang} title={t['sponsors.platinum']} sponsors={platinum} tierId="platinum" />
<SponsorsGroup lang={lang} title={t['sponsors.gold']} sponsors={gold} tierId="gold" />
<SponsorsGroup lang={lang} title={t['sponsors.silver']} sponsors={silver} tierId="silver" />
<SponsorsGroup lang={lang} title={t['sponsors.bronze']} sponsors={bronze} tierId="bronze" />
</div>
</div>
52 changes: 52 additions & 0 deletions src/components/home/sponsors/SponsorsGroup.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
import type { ISponsor, TSponsorTier } from '../../../types/sponsors'
import { texts } from '../../../i18n/home'
import { TIER_COLORS } from '../../../constants'

interface Props {
tierId: TSponsorTier
lang: string
title: string
sponsors: ISponsor[]
}

const { title, sponsors, lang, tierId } = Astro.props
const t = texts[lang as keyof typeof texts]

const IMG_WITH_BY_TIER: Record<TSponsorTier, number> = {
main: 200,
platinum: 150,
gold: 120,
silver: 100,
bronze: 80,
}
---

<div class="w-full">
<h4 style={`background-color: ${TIER_COLORS[tierId]};`} class="p-2 text-black rounded">{title}</h4>
{
sponsors.length > 0 ? (
<div class="flex flex-wrap gap-4 mt-4">
{sponsors.map((sponsor) => (
<a
href={sponsor.website}
target="_blank"
rel="noopener noreferrer"
class="flex flex-col items-center justify-center p-4 border rounded-lg hover:shadow-lg transition-shadow duration-300"
>
<img
src={sponsor.logo}
alt={t['sponsors.altlogo'].replace('{name}', sponsor.name)}
width={IMG_WITH_BY_TIER[tierId]}
/>
<small>{sponsor.name}</small>
</a>
))}
</div>
) : (
<p class="text-gray-100 mt-2 bg-white/10 px-2 py-1 rounded w-[184px] border border-gray-300 text-center">
{t['sponsors.none']}
</p>
)
}
</div>
6 changes: 5 additions & 1 deletion src/components/index.astro
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
import Layout from '../layouts/Layout.astro'
import SectionMain from './home/SectionMain.astro'
import SectionSponsors from './home/SectionSponsors.astro'

interface Props {
lang: string
Expand All @@ -10,5 +11,8 @@ const { lang } = Astro.props
---

<Layout title="PyConES 2026">
<SectionMain lang={lang} />
<div class="flex flex-col gap-20">
<SectionMain lang={lang} />
<SectionSponsors lang={lang} />
</div>
</Layout>
9 changes: 9 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { TSponsorTier } from './types/sponsors'

export const TIER_COLORS: Record<TSponsorTier, string> = {
bronze: '#d97706',
silver: '#9ca3af',
gold: '#facc15',
platinum: '#4ade80',
main: '#c084fc',
}
6 changes: 6 additions & 0 deletions src/data/sponsors/sponsor1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
name: 'Sponsor 1'
website: 'https://sponsor1.com'
tier: 'bronze'
logo: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNSAyMXEtLjgyNSAwLTEuNDEyLS41ODdUMyAxOVY1cTAtLjgyNS41ODgtMS40MTJUNSAzaDE0cS44MjUgMCAxLjQxMy41ODhUMjEgNXYxNHEwIC44MjUtLjU4NyAxLjQxM1QxOSAyMXptMC0yaDE0VjVINXptMCAwVjV6bTItMmgxMHEuMyAwIC40NS0uMjc1dC0uMDUtLjUyNWwtMi43NS0zLjY3NXEtLjE1LS4yLS40LS4ydC0uNC4yTDExLjI1IDE2TDkuNCAxMy41MjVxLS4xNS0uMi0uNC0uMnQtLjQuMmwtMiAyLjY3NXEtLjIuMjUtLjA1LjUyNVQ3IDE3bTIuNTYzLTcuNDM4UTEwIDkuMTI1IDEwIDguNXQtLjQzNy0xLjA2MlQ4LjUgN3QtMS4wNjIuNDM4VDcgOC41dC40MzggMS4wNjNUOC41IDEwdDEuMDYzLS40MzciLz48L3N2Zz4='
---
6 changes: 6 additions & 0 deletions src/data/sponsors/sponsor2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
name: 'Sponsor 1'
website: 'https://sponsor1.com'
tier: 'platinum'
logo: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNSAyMXEtLjgyNSAwLTEuNDEyLS41ODdUMyAxOVY1cTAtLjgyNS41ODgtMS40MTJUNSAzaDE0cS44MjUgMCAxLjQxMy41ODhUMjEgNXYxNHEwIC44MjUtLjU4NyAxLjQxM1QxOSAyMXptMC0yaDE0VjVINXptMCAwVjV6bTItMmgxMHEuMyAwIC40NS0uMjc1dC0uMDUtLjUyNWwtMi43NS0zLjY3NXEtLjE1LS4yLS40LS4ydC0uNC4yTDExLjI1IDE2TDkuNCAxMy41MjVxLS4xNS0uMi0uNC0uMnQtLjQuMmwtMiAyLjY3NXEtLjIuMjUtLjA1LjUyNVQ3IDE3bTIuNTYzLTcuNDM4UTEwIDkuMTI1IDEwIDguNXQtLjQzNy0xLjA2MlQ4LjUgN3QtMS4wNjIuNDM4VDcgOC41dC40MzggMS4wNjNUOC41IDEwdDEuMDYzLS40MzciLz48L3N2Zz4='
---
6 changes: 6 additions & 0 deletions src/data/sponsors/sponsor3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
name: 'Sponsor 3'
website: 'https://sponsor3.com'
tier: 'platinum'
logo: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNSAyMXEtLjgyNSAwLTEuNDEyLS41ODdUMyAxOVY1cTAtLjgyNS41ODgtMS40MTJUNSAzaDE0cS44MjUgMCAxLjQxMy41ODhUMjEgNXYxNHEwIC44MjUtLjU4NyAxLjQxM1QxOSAyMXptMC0yaDE0VjVINXptMCAwVjV6bTItMmgxMHEuMyAwIC40NS0uMjc1dC0uMDUtLjUyNWwtMi43NS0zLjY3NXEtLjE1LS4yLS40LS4ydC0uNC4yTDExLjI1IDE2TDkuNCAxMy41MjVxLS4xNS0uMi0uNC0uMnQtLjQuMmwtMiAyLjY3NXEtLjIuMjUtLjA1LjUyNVQ3IDE3bTIuNTYzLTcuNDM4UTEwIDkuMTI1IDEwIDguNXQtLjQzNy0xLjA2MlQ4LjUgN3QtMS4wNjIuNDM4VDcgOC41dC40MzggMS4wNjNUOC41IDEwdDEuMDYzLS40MzciLz48L3N2Zz4='
---
30 changes: 30 additions & 0 deletions src/i18n/home.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,47 @@ export const texts = {
'index.subtitle': 'Sede UB Barcelona | 6-8 Nov 2026',
'index.message':
'Forma parte de la mayor conferencia nacional de Python, donde cientos de entusiastas, profesionales y empresas se reúnen para compartir conocimientos, experiencias y oportunidades en el mundo de Python. ¡No te pierdas esta oportunidad única de aprender, conectar y crecer en la comunidad Python!',
'sponsors.title': 'Patrocinios',
'sponsors.description':
'Gracias a las empresas que colaboran con la PyConES podemos ofrecer el mejor evento y experiencia posible. Somos una conferencia con un bajo coste de entrada capaz de ofrecer una experiencia de 3 días incluyendo regalos, almuerzos, comidas y meriendas. Además contamos con servicio de guardería, becas y traducción en directo a lenguaje de signos para que nadie se quede fuera. Con la ayuda de estas empresas conseguimos hacer un evento diverso e inclusivo enfocado en cuidar la comunidad de Python.',
'sponsors.main': 'Patrocinador Principal',
'sponsors.platinum': 'Patrocinador Platino',
'sponsors.gold': 'Patrocinador Oro',
'sponsors.silver': 'Patrocinador Plata',
'sponsors.bronze': 'Patrocinador Bronce',
'sponsors.none': 'No hay patrocinadores en este nivel',
'sponsors.altlogo': 'Logo de {name}',
},
en: {
'index.initializing': 'Initialising system...',
'index.subtitle': 'UB Barcelona Venue | Nov 6-8, 2026',
'index.message':
"Join the largest national Python conference, where hundreds of enthusiasts, professionals, and companies come together to share knowledge, experiences, and opportunities in the world of Python. Don't miss this unique opportunity to learn, connect, and grow in the Python community!",
'sponsors.title': 'Sponsorships',
'sponsors.description':
'Thanks to the companies that collaborate with PyConES, we can offer the best possible event and experience. We are a conference with a low entry cost capable of offering a 3-day experience including gifts, lunches, meals, and snacks. Additionally, we have childcare services, scholarships, and live sign language translation to ensure that no one is left out. With the help of these companies, we manage to create a diverse and inclusive event focused on caring for the Python community.',
'sponsors.main': 'Main Sponsor',
'sponsors.platinum': 'Platinum Sponsor',
'sponsors.gold': 'Gold Sponsor',
'sponsors.silver': 'Silver Sponsor',
'sponsors.bronze': 'Bronze Sponsor',
'sponsors.none': 'No sponsors in this tier',
'sponsors.altlogo': '{name} logo',
},
ca: {
'index.initializing': 'Inicialitzant sistema...',
'index.subtitle': 'Seu UB Barcelona | 6-8 Nov 2026',
'index.message':
'Forma part de la major conferència nacional de Python, on centenars d’entusiastes, professionals i empreses es reuneixen per compartir coneixements, experiències i oportunitats en el món de Python. No et perdis aquesta oportunitat única d’aprendre, connectar i créixer en la comunitat Python!',
'sponsors.title': 'Patrocinis',
'sponsors.description':
'Gràcies a les empreses que col·laboren amb la PyConES podem oferir el millor esdeveniment i experiència possible. Som una conferència amb un baix cost d’entrada capaç d’oferir una experiència de 3 dies incloent regals, àpats, menjars i berenars. A més comptem amb servei de guarderia, beques i traducció en directe a llenguatge de signes perquè ningú es quedi fora. Amb l’ajuda d’aquestes empreses aconseguim fer un esdeveniment divers i inclusiu enfocat en cuidar la comunitat de Python.',
'sponsors.main': 'Patrocinador Principal',
'sponsors.platinum': 'Patrocinador Platí',
'sponsors.gold': 'Patrocinador Or',
'sponsors.silver': 'Patrocinador Plata',
'sponsors.bronze': 'Patrocinador Bronze',
'sponsors.none': 'No hi ha patrocinadors en aquest nivell',
'sponsors.altlogo': 'Logo de {name}',
},
} as const
10 changes: 5 additions & 5 deletions src/i18n/sponsors/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,43 +206,43 @@ export const ca = {
no_taxes: 'sense IVA',
items: [
{
id: 'bronze',
name: 'Bronze',
emoji: '🟤',
price: 'Preu 1.000€',
limit: 'Il·limitat',
color: '#d97706',
bg: 'rgba(180, 83, 9, 0.1)',
},
{
id: 'silver',
name: 'Plata',
emoji: '⚪',
price: 'Preu 3.000€',
limit: '10 disp.',
color: '#9ca3af',
bg: 'rgba(107, 114, 128, 0.1)',
},
{
id: 'gold',
name: 'Or',
emoji: '🌟',
price: 'Preu 6.000€',
limit: '6 disp.',
color: '#facc15',
bg: 'rgba(234, 179, 8, 0.1)',
},
{
id: 'platinium',
name: 'Platí',
emoji: '🏆',
price: 'Preu 8.000€',
limit: '3 disp.',
color: '#4ade80',
bg: 'rgba(34, 197, 94, 0.1)',
},
{
id: 'main',
name: 'Principal',
emoji: '🏰',
price: 'Preu Personalitzat',
limit: '1 disp.',
color: '#c084fc',
bg: 'rgba(168, 85, 247, 0.1)',
},
],
Expand Down
10 changes: 5 additions & 5 deletions src/i18n/sponsors/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,43 +206,43 @@ export const en = {
no_taxes: 'VAT not included',
items: [
{
id: 'bronze',
name: 'Bronze',
emoji: '🟤',
price: 'Price €1,000',
limit: 'Unlimited',
color: '#d97706',
bg: 'rgba(180, 83, 9, 0.1)',
},
{
id: 'silver',
name: 'Silver',
emoji: '⚪',
price: 'Price €3,000',
limit: '10 avail.',
color: '#9ca3af',
bg: 'rgba(107, 114, 128, 0.1)',
},
{
id: 'gold',
name: 'Gold',
emoji: '🌟',
price: 'Price €6,000',
limit: '6 avail.',
color: '#facc15',
bg: 'rgba(234, 179, 8, 0.1)',
},
{
id: 'platinum',
name: 'Platinum',
emoji: '🏆',
price: 'Price €8,000',
limit: '3 avail.',
color: '#4ade80',
bg: 'rgba(34, 197, 94, 0.1)',
},
{
id: 'main',
name: 'Main',
emoji: '🏰',
price: 'Price Custom',
limit: '1 avail.',
color: '#c084fc',
bg: 'rgba(168, 85, 247, 0.1)',
},
],
Expand Down
Loading