Skip to content
Open
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: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "2026.es.pycon.org",
"version": "1.2.0",
"version": "1.2.1",
"description": "",
"main": "index.js",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion src/components/SectionTitle.astro
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ interface Props {
const { title } = Astro.props
---

<h3 class="text-center text-2xl">{title}</h3>
<h2 class="text-center text-2xl">{title}</h2>
127 changes: 127 additions & 0 deletions src/components/home/SectionCTAs.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
---
import { texts } from '@/i18n/home'
import { menuTexts } from '@/i18n/menu'
import Button from '../Button.astro'

interface Props {
lang: string
}

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

const ctas = [
{
emoji: '🗣️',
title: t['cfp.title'],
description: t['cfp.description'],
buttonText: t['cfp.button'],
href: 'https://pretalx.com/pycones-2026/cfp',
variant: 'primary' as const,
accent: 'orange',
external: true,
},
{
emoji: '🔍',
title: t['cta.reviewers.title'],
description: t['cta.reviewers.description'],
buttonText: t['cta.reviewers.button'],
href: 'https://docs.google.com/forms/d/e/1FAIpQLScuG-J1A4xNmC249RkK2VCZDCjxw0uDE7hpL3A5Vj8yu3Ls5g/viewform',
variant: 'outline' as const,
accent: 'red',
external: true,
},
{
emoji: '🤝',
title: t['cta.sponsors.title'],
description: t['cta.sponsors.description'],
buttonText: t['cta.sponsors.button'],
href: `/${lang}/sponsors`,
variant: 'secondary' as const,
accent: 'amber',
external: false,
},
]
---

<section aria-labelledby="ctas-heading" class="flex flex-col gap-8">
<h2 id="ctas-heading" class="sr-only">Llamadas a la participación</h2>

<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
{
ctas.map((cta) => (
<article
class:list={[
'group relative flex flex-col gap-6 p-8 rounded-2xl border transition-all duration-300 shadow-xl',
'bg-white/5 backdrop-blur-md hover:bg-white/10',
cta.accent === 'orange' && 'border-white/10 hover:border-pycon-orange/60',
cta.accent === 'amber' && 'border-white/10 hover:border-amber-400/60',
cta.accent === 'red' && 'border-white/10 hover:border-pycon-red-50/60',
]}
>
{/* Subtle glow on hover */}
<div
class:list={[
'absolute inset-0 rounded-2xl opacity-0 group-hover:opacity-100 transition-opacity duration-300 pointer-events-none',
cta.accent === 'orange' && 'shadow-[inset_0_0_60px_rgba(234,88,12,0.06)]',
cta.accent === 'amber' && 'shadow-[inset_0_0_60px_rgba(251,191,36,0.06)]',
cta.accent === 'red' && 'shadow-[inset_0_0_60px_rgba(239,68,68,0.06)]',
]}
aria-hidden="true"
/>

<div class="flex flex-col gap-3 flex-1">
<div class="flex items-center gap-3">
<span class="text-3xl" aria-hidden="true">
{cta.emoji}
</span>
<h3
class:list={[
'text-xl font-bold leading-snug',
cta.accent === 'orange' && 'text-pycon-orange',
cta.accent === 'amber' && 'text-amber-400',
cta.accent === 'red' && 'text-pycon-red-50',
]}
>
{cta.title}
</h3>
</div>

<p class="text-pycon-gray-25 leading-relaxed text-sm flex-1">{cta.description}</p>
</div>

<div class="mt-auto">
<Button
variant={cta.variant}
size="md"
href={cta.href}
target={cta.external ? '_blank' : undefined}
rel={cta.external ? 'noopener noreferrer' : undefined}
aria-label={cta.external ? `${cta.buttonText} ${menuT.new_tab}` : undefined}
class="w-full"
>
{cta.buttonText}
{cta.external && (
<svg
class="ml-2 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="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
/>
</svg>
)}
</Button>
</div>
</article>
))
}
</div>
</section>
2 changes: 1 addition & 1 deletion src/components/home/sponsors/SponsorsGroup.astro
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const menuT = menuTexts[lang as keyof typeof menuTexts]
<div class="w-full">
<div class="flex items-center gap-4 mb-6">
<div class:list={['h-px flex-1 opacity-30', tierColor]} style="background: currentColor;" />
<h4 class:list={['text-sm font-semibold uppercase tracking-widest', tierColor]}>{title}</h4>
<h3 class:list={['text-sm font-semibold uppercase tracking-widest', tierColor]}>{title}</h3>
<div class:list={['h-px flex-1 opacity-30', tierColor]} style="background: currentColor;" />
</div>
<div class="flex flex-wrap items-center justify-center gap-6">
Expand Down
4 changes: 2 additions & 2 deletions src/components/index.astro
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
import Layout from '@/layouts/Layout.astro'
import SectionMain from './home/SectionMain.astro'
import SectionCallForProposals from './home/SectionCallForProposals.astro'
import SectionCTAs from './home/SectionCTAs.astro'
import SectionSponsors from './home/SectionSponsors.astro'

interface Props {
Expand All @@ -14,7 +14,7 @@ const { lang } = Astro.props
<Layout title="PyConES 2026">
<div class="flex flex-col gap-20">
<SectionMain lang={lang} />
<SectionCallForProposals lang={lang} />
<SectionCTAs lang={lang} />
<SectionSponsors lang={lang} />
</div>
</Layout>
24 changes: 24 additions & 0 deletions src/i18n/home.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ export const texts = {
'¡Ya está abierta la llamada a propuestas! Mándanos tu charla o taller antes del 17 de mayo a las 23:59h (hora peninsular). Si te estás preguntando si puedes hacer esto, la respuesta es que sí. Si tienes un tema que te interesa, ¡nos interesa!',
'cfp.help': 'Si necesitas ayuda con tu propuesta, no dudes en escribirnos a charlas@2026.es.pycon.org',
'cfp.button': 'Envía tu propuesta',
'cta.sponsors.title': '¡Buscamos Patrocinadores!',
'cta.sponsors.description':
'Ser patrocinador de la PyConES es una oportunidad para apoyar a la comunidad Python, conectar con talento técnico de alto nivel y ganar visibilidad en un entorno ligado al software libre y la innovación. Si formás parte o conocés a alguien de una empresa interesada en apoyar la comunidad Python, ¡ayudanos a llegar a ella!',
'cta.sponsors.button': 'Más información sobre patrocinios',
'cta.reviewers.title': 'Llamada a Revisores/as',
'cta.reviewers.description':
'Buscamos personas que nos ayuden a revisar las propuestas que recibamos. Tu experiencia y criterio son clave para garantizar la calidad del programa. Si querés colaborar con la organización y ayudar a seleccionar las mejores charlas y talleres, ¡necesitamos tu ayuda!',
'cta.reviewers.button': 'Quiero ser revisor/a',
},
en: {
'index.initializing': 'Initialising system...',
Expand All @@ -41,6 +49,14 @@ export const texts = {
'cfp.help':
"If you need help with your proposal, don't hesitate to contact us at charlas@2026.es.pycon.org.",
'cfp.button': 'Submit your proposal',
'cta.sponsors.title': 'We Are Looking for Sponsors!',
'cta.sponsors.description':
'Sponsoring PyConES is an opportunity to support the Python community, connect with high-level technical talent, and gain visibility in an environment linked to free software and innovation. If you are or know someone at a company interested in supporting the Python community, help us reach them!',
'cta.sponsors.button': 'More info about sponsorships',
'cta.reviewers.title': 'Call for Reviewers',
'cta.reviewers.description':
'We are looking for people to help us review the proposals we receive. Your experience and judgement are key to ensuring the quality of the programme. If you want to collaborate with the organisation and help select the best talks and workshops, we need your help!',
'cta.reviewers.button': 'I want to be a reviewer',
},
ca: {
'index.initializing': 'Inicialitzant sistema...',
Expand All @@ -63,5 +79,13 @@ export const texts = {
'cfp.help':
'Si necessites ajuda amb la teva proposta, no dubtis en escriure a charlas@2026.es.pycon.org.',
'cfp.button': 'Envia la teva proposta',
'cta.sponsors.title': 'Busquem Patrocinadors!',
'cta.sponsors.description':
"Ser patrocinador de la PyConES és una oportunitat per donar suport a la comunitat Python, connectar amb talent tècnic d'alt nivell i guanyar visibilitat en un entorn lligat al programari lliure i la innovació. Si formes part o coneixes algú d'una empresa interessada en donar suport a la comunitat Python, ajuda'ns a arribar-hi!",
'cta.sponsors.button': 'Més informació sobre patrocinis',
'cta.reviewers.title': 'Crida a Revisors/es',
'cta.reviewers.description':
"Busquem persones que ens ajudin a revisar les propostes que rebem. La teva experiència i criteri són clau per garantir la qualitat del programa. Si vols col·laborar amb l'organització i ajudar a seleccionar les millors xerrades i tallers, necessitem la teva ajuda!",
'cta.reviewers.button': 'Vull ser revisor/a',
},
} as const
Loading