Skip to content

Commit 7f3f6c0

Browse files
clytaemnestraartczpre-commit-ci[bot]thepetkcmaureir
authored
Tickets page second version (#1045)
I created a new branch from the initial one because I wanted to avoid removing things there. Changes: * Rewrote it in Markdown for better readability * Removed a note about remote tickets * Added more features to the list * Rephrased some text * Used the same style as the rest of the page We agreed that it would be nice to have bigger headers and a wider page, just like in the first MR. However, since that requires additional CSS tweaks, I left it as a nice-to-have for later. --------- Co-authored-by: Artur Czepiel <czepiel.artur@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Theofanis Petkos <thepetk@gmail.com> Co-authored-by: Cristián Maureira-Fredes <cmaureir@users.noreply.github.com>
1 parent a15cb03 commit 7f3f6c0

File tree

5 files changed

+331
-4
lines changed

5 files changed

+331
-4
lines changed

src/components/header/header-actions.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ const IS_LIVE = false;
2121
</abbr>
2222
<span class="hidden md:inline">Code of Conduct</span>
2323
</ButtonLink>
24-
<ButtonLink url="https://voting.europython.eu" className="hidden md:block">
25-
<span>Community vote</span>
24+
<ButtonLink url="https://ep2025.europython.eu/tickets" className="hidden md:block">
25+
<span>Tickets</span>
2626
</ButtonLink>
2727
{IS_LIVE && (
2828
<ButtonLink url="/live">
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
---
2+
import ButtonLink from "../button-link/button-link.astro";
3+
import { Title } from "../typography/title";
4+
5+
interface Props {
6+
title: string;
7+
subtitle: string;
8+
buttonText?: string;
9+
buttonUrl?: string;
10+
}
11+
12+
const { title, subtitle, buttonText, buttonUrl } = Astro.props;
13+
---
14+
15+
<div class="py-12 text-center">
16+
<Title level={1} className="mb-4">{title}</Title>
17+
<p class="text-2xl max-w-3xl mx-auto mb-8">{subtitle}</p>
18+
19+
{buttonText && buttonUrl && (
20+
<div class="mt-8">
21+
<ButtonLink url={buttonUrl}>{buttonText}</ButtonLink>
22+
</div>
23+
)}
24+
25+
<slot />
26+
</div>

src/components/note/note.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
export const Note = ({ children }: { children: string }) => {
1+
export const Note = ({ children }: { children: React.ReactNode }) => {
22
return (
3-
<p className="note text-xl p-4 border-l-4 border-primary">{children}</p>
3+
<p className="note text-xl p-4 border-l-4 border-primary bg-primary-light my-6">
4+
{children}
5+
</p>
46
);
57
};
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
---
2+
import { Title } from "../typography/title";
3+
4+
interface Props {
5+
ticketShopLink: string;
6+
}
7+
8+
interface TicketTierProps {
9+
title: string;
10+
educationPrice: number | string;
11+
personalPrice: number | string;
12+
businessPrice: number | string;
13+
lateBusinessPrice?: number | string;
14+
latePersonalPrice?: number | string;
15+
features: string[];
16+
}
17+
18+
const tiers: TicketTierProps[] = [
19+
{
20+
title: "Tutorial Only",
21+
educationPrice: 100,
22+
personalPrice: 200,
23+
businessPrice: 400,
24+
features: [
25+
{ text: "Access to two full days of workshops, summits, and tutorials across six parallel tracks (14-15 July)" },
26+
{ text: "<strong>Does NOT include</strong> access to three days of talks across six parallel tracks with 130+ talks (16-18 July)", icon: "" },
27+
{ text: "<strong>Does NOT include</strong> access to open spaces throughout the three conference days", icon: "" },
28+
{ text: "<strong>Does NOT include</strong> access to sponsor booths with opportunities to connect with sponsoring companies", icon: "" },
29+
{ text: "Access to Sprint Weekend (19-20 July)" },
30+
{ text: "Light lunch provided each day" },
31+
{ text: "Break refreshments (coffee, tea, water, and more)" },
32+
{ text: "Access to in-person networking opportunities during the tutorial days" },
33+
{ text: "Access to free childcare if needed" },
34+
{ text: "Conference T-shirt included" },
35+
{ text: "<strong>Limited to only 300, due to tutorial capacity</strong>", icon: "⚠️" },
36+
],
37+
},
38+
{
39+
title: "Conference Only",
40+
educationPrice: 135,
41+
personalPrice: 300,
42+
businessPrice: 500,
43+
latePersonalPrice: 450,
44+
lateBusinessPrice: 750,
45+
features: [
46+
{ text: "Access to two full days of workshops, summits, and tutorials across six parallel tracks (14-15 July)", icon: "" },
47+
{ text: "<strong>Access to three days of talks across six parallel tracks with 130+ talks (16-18 July)</strong>" },
48+
{ text: "Access to open spaces throughout the three conference days" },
49+
{ text: "Access to Sprint Weekend (19-20 July)" },
50+
{ text: "Access to sponsor booths with opportunities to connect with sponsoring companies" },
51+
{ text: "Access to Sprint Weekend (19-20 July)" },
52+
{ text: "Limited access to specific sponsored workshops" },
53+
{ text: "Light lunch provided each day" },
54+
{ text: "Break refreshments (coffee, tea, water, and more)" },
55+
{ text: "Access to in-person networking opportunities during the main conference days" },
56+
{ text: "Access to free childcare if needed" },
57+
{ text: "Conference T-shirt included" },
58+
],
59+
},
60+
{
61+
title: "Combined",
62+
educationPrice: 210,
63+
personalPrice: 450,
64+
businessPrice: 800,
65+
latePersonalPrice: 675,
66+
lateBusinessPrice: 1200,
67+
features: [
68+
{ text: "Access to two full days of workshops, summits, and tutorials across six parallel tracks (14-15 July)" },
69+
{ text: "<strong>Access to three days of talks across six parallel tracks with 130+ talks (16-18 July)</strong>" },
70+
{ text: "Access to open spaces throughout the three conference days" },
71+
{ text: "Access to sponsor booths with opportunities to connect with sponsoring companies" },
72+
{ text: "Access to Sprint Weekend (19-20 July)" },
73+
{ text: "Limited access to specific sponsored workshops" },
74+
{ text: "Light lunch provided each day" },
75+
{ text: "Break refreshments (coffee, tea, water, and more)" },
76+
{ text: "Access to in-person networking opportunities throughout the entire conference" },
77+
{ text: "Access to free childcare if needed" },
78+
{ text: "Conference T-shirt included" },
79+
{ text: "<strong>Limited to only 300, due to tutorial capacity</strong>", icon: "⚠️" },
80+
],
81+
},
82+
];
83+
84+
85+
const formatPrice = (price: number | string) => {
86+
if (typeof price === "string") return price;
87+
return new Intl.NumberFormat("en", {
88+
style: "currency",
89+
currency: "EUR",
90+
maximumFractionDigits: 0,
91+
minimumFractionDigits: 0,
92+
}).format(price);
93+
};
94+
---
95+
96+
<div class="ticket-tiers-container">
97+
<div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-3 gap-10 md:gap-6 lg:gap-10">
98+
{tiers.map((tier) => (
99+
<div class="bg-white text-black rounded-2xl p-6 pb-20 relative not-prose z-0">
100+
<div class="h-[160px]">
101+
<Title level={3} className="mt-0 !mb-2">
102+
{tier.title}
103+
</Title>
104+
105+
<div class="mt-4">
106+
<div class="font-bold text-lg">Education: <span class="text-xl">{formatPrice(tier.educationPrice)}</span></div>
107+
<div class="font-bold text-lg">Personal: <span class="text-xl">{formatPrice(tier.personalPrice)}</span>
108+
{tier.latePersonalPrice && (
109+
<span class="text-sm font-normal ml-2">(Late: {formatPrice(tier.latePersonalPrice)})</span>
110+
)}
111+
</div>
112+
<div class="font-bold text-lg">Business: <span class="text-xl">{formatPrice(tier.businessPrice)} (+ VAT)</span>
113+
{tier.lateBusinessPrice && (
114+
<span class="text-sm font-normal ml-2">(Late: {formatPrice(tier.lateBusinessPrice)} + VAT)</span>
115+
)}
116+
</div>
117+
</div>
118+
</div>
119+
120+
<p class="font-bold text-base">This ticket includes:</p>
121+
<ul class="text-base list-none pl-0">
122+
{tier.features.map((feature) => (
123+
<li class="flex items-start">
124+
<span class="flex-shrink-0 w-6">
125+
{feature.icon ? feature.icon : "✔️"}
126+
</span>
127+
<span set:html={feature.text}></span>
128+
</li>
129+
))}
130+
</ul>
131+
</div>
132+
))}
133+
</div>
134+
135+
<style is:global>
136+
.ticket-tiers-container {
137+
width: 100vw;
138+
max-width: 1400px;
139+
margin-left: 50%;
140+
transform: translateX(-50%);
141+
position: relative;
142+
padding: 0 40px;
143+
}
144+
145+
@media (max-width: 768px) {
146+
.ticket-tiers-container {
147+
width: 100%;
148+
padding: 0 10px;
149+
position: relative;
150+
}
151+
}
152+
</style>

src/content/pages/tickets.mdx

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
---
2+
title: Sponsor
3+
subtitle:
4+
Sponsoring EuroPython guarantees you highly targeted visibility
5+
and the opportunity to present yourself and your company to one
6+
of the largest and most diverse Python communities in Europe and beyond.
7+
---
8+
9+
import TicketTiers from "../../components/ticket-tiers/ticket-tiers.astro";
10+
11+
12+
# EuroPython 2025 Tickets
13+
<div class="text-justify">
14+
Discover the latest Python trends, learn from 180+ expert speakers, network with fellow developers, enjoy social events, and explore open spaces to spark new ideas! Organized by the community for the community.
15+
</div>
16+
17+
<div class="text-center">
18+
<ButtonLink url="">Registration Starting Soon!</ButtonLink>
19+
</div>
20+
21+
22+
## Where and When?
23+
🏛️ <a href="/where" class="text-primary hover:text-primary-hover underline">Prague Congress Centre (PCC)</a>, Czech Republic
24+
25+
<div class="bg-white text-black p-6 rounded-lg shadow-md w-full">
26+
<p class="font-bold text-xl mb-4">A week of all things Python:</p>
27+
<ul class="list-none space-y-2">
28+
<li class="flex items-start">
29+
<span><strong>🗓️ Monday–Tuesday, 14–15 July:</strong> Workshops & Tutorials</span>
30+
</li>
31+
<li class="flex items-start">
32+
<span><strong>🗓️ Wednesday–Friday, 16–18 July:</strong> Talks & Open-Spaces</span>
33+
</li>
34+
<li class="flex items-start">
35+
<span><strong>🗓️ Saturday–Sunday, 19–20 July:</strong> Sprints Weekend</span>
36+
</li>
37+
</ul>
38+
</div>
39+
40+
41+
## Which Ticket Tier Should I Buy?
42+
Each ticket type is available in three pricing tiers. We trust you to choose the option that best fits your situation.
43+
44+
As a non-profit, every ticket you buy goes back into the Python community. Whether by our <a href="/finaid" class="text-primary hover:text-primary-hover underline">financial aid programme</a>, helping those in need of support, like students, attend the conference, or supporting Python communities across Europe through our <a href="https://www.europython-society.org/grants/" class="text-primary hover:text-primary-hover underline">EPS Grants programme</a>.
45+
46+
47+
<BenefitsList>
48+
<BenefitItem icon="target" title="Business Tickets">
49+
If your company is covering your ticket or you use Python professionally, this is the right tier for you. By choosing this option, you help us keep the conference accessible. Thank you!
50+
</BenefitItem>
51+
<BenefitItem icon="network" title="Personal Tickets">
52+
Are you a Python enthusiast, hobbyist, or freelancer? This ticket is for you! It's priced for individuals paying their own way, so you can enjoy the conference at a fair and affordable rate.
53+
</BenefitItem>
54+
<BenefitItem icon="rocket" title="Education Tickets">
55+
If you're a student or an educator working in schools or universities, this ticket is for you. We offer subsidized pricing so students and educators can join in and be part of the conference!
56+
</BenefitItem>
57+
</BenefitsList>
58+
59+
<Note>If you need a VAT invoice with your company's name, please purchase a Business Ticket. Personal Tickets do not include a company name. To assist the registration staff, your conference badge will display the ticket tier and type.</Note>
60+
61+
62+
## Ticket Prices
63+
Regular tickets are available until June 27, 2025—late-bird rates apply after.
64+
65+
Combined tickets are **limited to 300** due to tutorial capacity!
66+
67+
<TicketTiers ticketShopLink="https://tickets.europython.eu/" />
68+
69+
70+
### Volume Discounts
71+
Is your company attending the conference as a team? We offer the following volume discounts:
72+
73+
<div class="bg-white text-black p-6 rounded-lg shadow-md">
74+
<ul class="list-none space-y-4">
75+
<li class="flex items-start">
76+
<span>💰 Buy 5 business tickets of any type, pay for only 4</span>
77+
</li>
78+
<li class="flex items-start">
79+
<span>💰 Buy 10 business tickets of any type, pay for only 8</span>
80+
</li>
81+
<li class="flex items-start">
82+
<span>💰 Buy 15 business tickets of any type, pay for only 11</span>
83+
</li>
84+
</ul>
85+
</div>
86+
87+
<Note>Volume discounts apply only to Business Tickets. The discount is automatically applied when you add enough tickets to your basket.
88+
If purchasing different types of Business Tickets (e.g., Conference Only & Combined), the discount will apply to the lower-priced ticket.</Note>
89+
90+
#### Sponsorship
91+
If you're purchasing multiple tickets, please consider sponsoring the event!
92+
93+
<div class="text-center">
94+
<ButtonLink url="/sponsorship/sponsor">Learn About Sponsorship</ButtonLink>
95+
</div>
96+
97+
98+
### Additional Information
99+
<div class="grid grid-cols-1 md:grid-cols-2 gap-10 max-w-4xl mx-auto">
100+
<div class="bg-white text-black p-6 rounded-lg shadow-md">
101+
<h5 class="text-xl font-bold mb-4">Special Grants</h5>
102+
<p>
103+
Are you a CPython Core Developer or an EPS Fellow? You're eligible for a free combined ticket!
104+
</p>
105+
<p>
106+
Please check out our grant page for details on how to apply for the
107+
<a href="https://www.europython-society.org/core-grant/" class="text-primary hover:text-primary-hover underline">GvR grant</a> or
108+
<a href="https://www.europython-society.org/europython-society-fellow-grant/" class="text-primary hover:text-primary-hover underline">EuroPython Fellow grant</a>.
109+
</p>
110+
</div>
111+
112+
<div class="bg-white text-black p-6 rounded-lg shadow-md">
113+
<h5 class="text-xl font-bold mb-4">Refund Policy</h5>
114+
<p class="mb-4">
115+
We know plans can change! If you can't attend, you can request a full refund via your order confirmation email until June 8, 2025.
116+
</p>
117+
<p>
118+
After that, email us at <a href="mailto:refunds@europython.eu" class="text-primary hover:text-primary-hover underline">refunds@europython.eu</a> if you need a refund due to special circumstances.
119+
</p>
120+
</div>
121+
</div>
122+
123+
<br></br>
124+
125+
<div class="bg-white text-black p-6 rounded-lg shadow-md">
126+
<h5 class="text-xl font-bold mb-4">Important Notes</h5>
127+
<ul class="list-none space-y-4">
128+
<li class="flex items-start">
129+
<span>☕ Every ticket includes break refreshments and a light lunch for each day.</span>
130+
</li>
131+
<li class="flex items-start">
132+
<span>👶 Free Childcare is available at the conference for those who need it. Please make sure to register a ticket for yourself and select how many children will require childcare at checkout.</span>
133+
</li>
134+
<li class="flex items-start">
135+
<span>⏰ We encourage you to book your ticket early. This makes it easier for us to plan for the event and arrange important things like catering, badge printing, and other logistics.</span>
136+
</li>
137+
</ul>
138+
</div>
139+
140+
141+
### Questions
142+
If you have any questions, check our <a href="/faq" class="text-primary hover:text-primary-hover underline">FAQ</a> first. Still need help? Our wonderful volunteer team at the <a href="mailto:helpdesk@europython.eu" class="text-primary hover:text-primary-hover underline">EuroPython Helpdesk</a> is happy to assist—don't hesitate to reach out!
143+
144+
145+
<div class="text-center">
146+
<ButtonLink url="">Registration Starting Soon!</ButtonLink>
147+
</div>

0 commit comments

Comments
 (0)