diff --git a/.gitignore b/.gitignore index b2e279a..8c63cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules/ .next/ .env +2026_hackathon/ +tsconfig.tsbuildinfo \ No newline at end of file diff --git a/app/api/contact/route.ts b/app/api/contact/route.ts index 476e148..f9e0a78 100644 --- a/app/api/contact/route.ts +++ b/app/api/contact/route.ts @@ -2,11 +2,57 @@ import { Resend } from "resend"; import { NextResponse } from "next/server"; -const resend = new Resend(process.env.RESEND_API_KEY); +const recipientEmail = process.env.CONTACT_FORM_RECIPIENT ?? "info@pushquantum.tech"; + +type ContactRequestBody = { + name?: string; + firstName?: string; + lastName?: string; + email?: string; + phone?: string; + university?: string; + customUniversity?: string; + inquiry?: string; + message?: string; +}; + +function escapeHtml(value: string) { + return value + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +function normalizeContactRequest(body: ContactRequestBody) { + const firstName = body.firstName?.trim() ?? ""; + const lastName = body.lastName?.trim() ?? ""; + const name = body.name?.trim() || [firstName, lastName].filter(Boolean).join(" "); + const email = body.email?.trim() ?? ""; + const inquiry = body.inquiry?.trim() || body.message?.trim() || ""; + const phone = body.phone?.trim() ?? ""; + const university = + body.university === "Other" + ? body.customUniversity?.trim() ?? "" + : body.university?.trim() ?? ""; + + return { name, email, inquiry, phone, university }; +} export async function POST(request: Request) { try { - const { name, email, inquiry } = await request.json(); + const apiKey = process.env.RESEND_API_KEY; + + if (!apiKey) { + return NextResponse.json( + { error: "Missing RESEND_API_KEY environment variable" }, + { status: 500 } + ); + } + + const body = (await request.json()) as ContactRequestBody; + const { name, email, inquiry, phone, university } = normalizeContactRequest(body); // Validate required fields if (!name || !email || !inquiry) { @@ -25,24 +71,35 @@ export async function POST(request: Request) { ); } + const resend = new Resend(apiKey); + const safeName = escapeHtml(name); + const safeEmail = escapeHtml(email); + const safePhone = escapeHtml(phone); + const safeUniversity = escapeHtml(university); + const safeInquiry = escapeHtml(inquiry).replace(/\n/g, "
"); + // Send email using Resend const { data, error } = await resend.emails.send({ from: "PushQuantum Contact Form ", - to: ["info@pushquantum.tech"], + to: [recipientEmail], replyTo: email, subject: `New Contact Form Submission from ${name}`, html: `

New Contact Form Submission

-

Name: ${name}

-

Email: ${email}

+

Name: ${safeName}

+

Email: ${safeEmail}

+ ${phone ? `

Phone: ${safePhone}

` : ""} + ${university ? `

Institution: ${safeUniversity}

` : ""}

Inquiry:

-

${inquiry.replace(/\n/g, "
")}

+

${safeInquiry}

`, text: ` New Contact Form Submission Name: ${name} Email: ${email} + ${phone ? `Phone: ${phone}` : ""} + ${university ? `Institution: ${university}` : ""} Inquiry: ${inquiry} diff --git a/app/hackathon/challenge-partners/page.tsx b/app/hackathon/challenge-partners/page.tsx new file mode 100644 index 0000000..09988e6 --- /dev/null +++ b/app/hackathon/challenge-partners/page.tsx @@ -0,0 +1,18 @@ +import type { Metadata } from "next"; +import { HackathonChallengeHero } from "@/components/hackathon/hackathon-challenge-hero"; +import { HackathonChallengePartners } from "@/components/hackathon/hackathon-challenge-partners"; + +export const metadata: Metadata = { + title: "Challenge Partners - PushQuantum Hackathon 2026", + description: + "Meet the industry and research challenge partners bringing real-world quantum problems to the PushQuantum Hackathon, November 20-22, 2026.", +}; + +export default function ChallengePartnersPage() { + return ( + <> + + + + ); +} diff --git a/app/hackathon/conference/page.tsx b/app/hackathon/conference/page.tsx new file mode 100644 index 0000000..4a03569 --- /dev/null +++ b/app/hackathon/conference/page.tsx @@ -0,0 +1,30 @@ +import type { Metadata } from "next"; +import { ConferenceHero } from "@/components/conference/conference-hero"; +import { EventAgenda } from "@/components/events/event-agenda"; +import { ConferenceTalks } from "@/components/conference/conference-talks"; +import { ConferenceScienceSlam } from "@/components/conference/conference-science-slam"; +import { hackathon2026 } from "@/lib/hackathon-2026-data"; + +export const metadata: Metadata = { + title: "Conference - PushQuantum Hackathon 2026", + description: + "Frontiers in Quantum Science and Technology — talks, itinerary and Science Slam details for the PushQuantum Conference on November 20, 2026.", +}; + +// Reuse the Nov 20 agenda already defined for the combined event, +// scoped down to just the Conference day. +const conferenceOnlyEvent = { + ...hackathon2026, + agenda: hackathon2026.agenda ? [hackathon2026.agenda[0]] : [], +}; + +export default function ConferencePage() { + return ( + <> + + + + + + ); +} diff --git a/app/hackathon/page.tsx b/app/hackathon/page.tsx new file mode 100644 index 0000000..dfd8be2 --- /dev/null +++ b/app/hackathon/page.tsx @@ -0,0 +1,32 @@ +import type { Metadata } from "next"; +import { EventHero } from "@/components/events/event-hero"; +import { HackathonTracks } from "@/components/hackathon/hackathon-tracks"; +import { EventKeyFacts } from "@/components/events/event-key-facts"; +import { EventAgenda } from "@/components/events/event-agenda"; +import { HackathonPartners } from "@/components/hackathon/hackathon-partners"; +import { EventFaq } from "@/components/events/event-faq"; +import { HackathonContact } from "@/components/hackathon/hackathon-contact"; +import { hackathon2026 } from "@/lib/hackathon-2026-data"; + +export const metadata: Metadata = { + title: "Conference + Hackathon 2026 - PushQuantum", + description: hackathon2026.shortDescription, +}; + +// Only the hero shows the sign-up button; the other sections +// get a variant without signUpUrl so they don't render their own. +const eventWithoutSignUp = { ...hackathon2026, signUpUrl: undefined }; + +export default function HackathonPage() { + return ( + <> + + + + + + + + + ); +} diff --git a/app/layout.tsx b/app/layout.tsx index 6883808..96b3573 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -38,7 +38,7 @@ export default function RootLayout({ }>) { return ( - +
{children} diff --git a/app/partners/page.tsx b/app/partners/page.tsx new file mode 100644 index 0000000..fb885a9 --- /dev/null +++ b/app/partners/page.tsx @@ -0,0 +1,18 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Partners - PushQuantum", + description: "PushQuantum partners page.", +}; + +export default function PartnersPage() { + return ( +
+
+

+ Under construction 🚧 +

+
+
+ ); +} diff --git a/components/about/events-section.tsx b/components/about/events-section.tsx index ddcc494..980105d 100644 --- a/components/about/events-section.tsx +++ b/components/about/events-section.tsx @@ -3,10 +3,10 @@ import { ArrowRight } from "lucide-react"; const events = [ { - date: { month: "OCT", day: "31" }, - title: "PushQuantum Hackathon", + date: { month: "NOV", day: "20" }, + title: "Conference + Hackathon 2026", description: "A 3-day challenge of full immersion in the world of quantum technologies", - href: "#", + href: "/hackathon", }, { date: { month: "NOV", day: "02" }, diff --git a/components/conference/conference-hero.tsx b/components/conference/conference-hero.tsx new file mode 100644 index 0000000..cf915a3 --- /dev/null +++ b/components/conference/conference-hero.tsx @@ -0,0 +1,37 @@ +import Link from "next/link"; +import { ArrowLeft } from "lucide-react"; + +export function ConferenceHero() { + return ( +
+
+
+ +
+ + + Back to Conference + Hackathon 2026 + + +

+ Conference · Friday, November 20 +

+

+ Frontiers in Quantum Science and Technology +

+

+ The Frontiers in Quantum Science and Technology conference unites researchers and industry leaders to discuss the latest breakthroughs and emerging trends in quantum computing, sensing, communication, and simulation. It aims to bridge fundamental research with real-world applications, driving innovation at the forefront of quantum technology. +

+

+Whether you're a student mapping out your next steps in quantum tech or a researcher looking to connect with leading companies, FQST is where the community comes together. +

+
+
+ ); +} diff --git a/components/conference/conference-science-slam.tsx b/components/conference/conference-science-slam.tsx new file mode 100644 index 0000000..e9216a0 --- /dev/null +++ b/components/conference/conference-science-slam.tsx @@ -0,0 +1,39 @@ +import { scienceSlam } from "@/lib/conference-2026-data"; + +export function ConferenceScienceSlam() { + return ( +
+
+

+ Science Slam +

+ +
+

{scienceSlam.intro}

+

{scienceSlam.format}

+ +
+
+

+ Application window +

+

+ {scienceSlam.applicationWindow} +

+
+
+

+ Live slot +

+

{scienceSlam.slot}

+
+
+ +

+ {scienceSlam.applicationNote} +

+
+
+
+ ); +} diff --git a/components/conference/conference-talks.tsx b/components/conference/conference-talks.tsx new file mode 100644 index 0000000..b6dc88c --- /dev/null +++ b/components/conference/conference-talks.tsx @@ -0,0 +1,48 @@ +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { conferenceTalks } from "@/lib/conference-2026-data"; + +export function ConferenceTalks() { + return ( +
+
+

+ Talks & abstracts +

+

+ Abstracts below are placeholders and will be updated as speakers + confirm their talks. +

+ + + {conferenceTalks.map((talk, idx) => ( + + +
+ + {talk.time} · {talk.kind} + + + {talk.title} + + {" "} + — {talk.speaker} + {talk.affiliation ? `, ${talk.affiliation}` : ""} + + +
+
+ + {talk.abstract} + +
+ ))} +
+
+
+ ); +} diff --git a/components/contact/contact-form.tsx b/components/contact/contact-form.tsx index ee11b6a..838aa4b 100644 --- a/components/contact/contact-form.tsx +++ b/components/contact/contact-form.tsx @@ -30,6 +30,7 @@ export function ContactForm() { email: "", phone: "", university: "", + customUniversity: "", message: "", }); const [agreedToTerms, setAgreedToTerms] = useState(false); @@ -60,13 +61,25 @@ export function ContactForm() { setErrorMessage(""); try { + const university = + formData.university === "Other" + ? formData.customUniversity + : formData.university; + const response = await fetch("/api/contact", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify(formData), + body: JSON.stringify({ + ...formData, + name: `${formData.firstName} ${formData.lastName}`.trim(), + university, + inquiry: formData.message, + }), }); - const data = await response.json(); + const data = await response + .json() + .catch(() => ({ error: "Failed to send message" })); if (!response.ok) { throw new Error(data.error || "Failed to send message"); @@ -79,6 +92,7 @@ export function ContactForm() { email: "", phone: "", university: "", + customUniversity: "", message: "", }); setAgreedToTerms(false); @@ -167,7 +181,7 @@ export function ContactForm() {
setFormData((prev) => ({ ...prev, customUniversity: e.target.value })) } diff --git a/components/contact/contact-info-section.tsx b/components/contact/contact-info-section.tsx index e7c86a1..8719043 100644 --- a/components/contact/contact-info-section.tsx +++ b/components/contact/contact-info-section.tsx @@ -15,7 +15,7 @@ const contactCards = [ { icon: Mail, title: "E-Mail", - lines: ["hello@pushquantum.de"], + lines: ["info@pushquantum.de"], }, ]; diff --git a/components/events-section.tsx b/components/events-section.tsx index 2f710cb..0cef3b8 100644 --- a/components/events-section.tsx +++ b/components/events-section.tsx @@ -3,10 +3,10 @@ import { ArrowRight } from "lucide-react"; const events = [ { - date: { month: "OCT", day: "31" }, - title: "PushQuantum Hackathon", + date: { month: "NOV", day: "20" }, + title: "Conference + Hackathon 2026", description: "A 3-day challenge of full immersion in the world of quantum technologies", - href: "#", + href: "/hackathon", }, { date: { month: "NOV", day: "02" }, diff --git a/components/events/event-agenda.tsx b/components/events/event-agenda.tsx index fe69984..2edf71a 100644 --- a/components/events/event-agenda.tsx +++ b/components/events/event-agenda.tsx @@ -59,15 +59,11 @@ function AgendaDayCard({ day }: { day: AgendaDay }) {
)} - {/* If no entries, just show description in collapsed view */} - {!hasEntries && day.description && ( + {day.entries === undefined && day.description && (
-

{day.description}

- {day.entries === undefined && ( - - Learn more - - )} + + Learn more +
)} diff --git a/components/events/event-faq.tsx b/components/events/event-faq.tsx index 2856d8c..8302519 100644 --- a/components/events/event-faq.tsx +++ b/components/events/event-faq.tsx @@ -7,9 +7,26 @@ import { AccordionTrigger, } from "@/components/ui/accordion"; -export function EventFaq({ event }: { event: EventData }) { +export function EventFaq({ + event, + allowMultipleOpen = false, +}: { + event: EventData; + allowMultipleOpen?: boolean; +}) { if (!event.faq || event.faq.length === 0) return null; + const faqItems = event.faq.map((item, idx) => ( + + + {item.question} + + + {item.answer} + + + )); + return (
@@ -17,18 +34,15 @@ export function EventFaq({ event }: { event: EventData }) { FAQs - - {event.faq.map((item, idx) => ( - - - {item.question} - - - {item.answer} - - - ))} - + {allowMultipleOpen ? ( + + {faqItems} + + ) : ( + + {faqItems} + + )} {event.signUpUrl && (
diff --git a/components/events/event-hero.tsx b/components/events/event-hero.tsx index d4d7dfc..3930296 100644 --- a/components/events/event-hero.tsx +++ b/components/events/event-hero.tsx @@ -15,7 +15,15 @@ function renderHeroDescription(text: string) { ); } -export function EventHero({ event }: { event: EventData }) { +export function EventHero({ + event, + ctaVariant = "default", +}: { + event: EventData; + ctaVariant?: "default" | "wide-centered"; +}) { + const isWideCentered = ctaVariant === "wide-centered"; + return (
{/* Background image */} @@ -27,29 +35,66 @@ export function EventHero({ event }: { event: EventData }) { {/* Content */}
-

+

{event.title}

{event.heroDescription && ( -

+

{renderHeroDescription(event.heroDescription)}

)} {!event.heroDescription && ( -

+

{event.shortDescription}

)} - {event.signUpUrl && ( - - Sign up - + {event.signUpUrl && isWideCentered && ( +
+ {event.signUpDisabled ? ( + + Sign up + + ) : ( + + Sign up + + )} +
+ )} + + {event.signUpUrl && ctaVariant === "default" && ( + event.signUpDisabled ? ( + + Sign up + + ) : ( + + Sign up + + ) )}
diff --git a/components/hackathon/hackathon-challenge-hero.tsx b/components/hackathon/hackathon-challenge-hero.tsx new file mode 100644 index 0000000..3568573 --- /dev/null +++ b/components/hackathon/hackathon-challenge-hero.tsx @@ -0,0 +1,42 @@ +import Link from "next/link"; +import { ArrowLeft } from "lucide-react"; + +export function HackathonChallengeHero() { + return ( +
+
+
+ +
+ + + Back to Conference + Hackathon 2026 + + +

+ Hackathon · November 20-22 +

+

+ Challenge Partners +

+

+ Our challenge partners bring real-world quantum problems from + industry and research straight to your team. Over 24 hours, + you'll get mentoring, access to quantum hardware and software, + and the chance to turn their challenges into working prototypes. +
+
+ Challenges are presented live at the mandatory kick-off on the + afternoon of November 20 — full briefs are announced closer to the + event. +

+
+
+ ); +} diff --git a/components/hackathon/hackathon-challenge-partners.tsx b/components/hackathon/hackathon-challenge-partners.tsx new file mode 100644 index 0000000..42b7deb --- /dev/null +++ b/components/hackathon/hackathon-challenge-partners.tsx @@ -0,0 +1,47 @@ +import Image from "next/image"; +import { challengePartners } from "@/lib/hackathon-2026-data"; + +export function HackathonChallengePartners() { + return ( +
+
+

+ Meet the challenge partners +

+

+ Challenge briefs below are placeholders and will be updated as + partners confirm them. +

+ +
+ {challengePartners.map((partner) => ( +
+
+ {partner.name} +
+

+ {partner.name} +

+

+ {partner.description} +

+

+ Challenge +

+

{partner.challenge}

+
+ ))} +
+
+
+ ); +} diff --git a/components/hackathon/hackathon-contact.tsx b/components/hackathon/hackathon-contact.tsx new file mode 100644 index 0000000..8b97ff6 --- /dev/null +++ b/components/hackathon/hackathon-contact.tsx @@ -0,0 +1,77 @@ +import Image from "next/image"; +import Link from "next/link"; +import { Mail, Linkedin } from "lucide-react"; +import type { EventData } from "@/lib/events-data"; + +export function HackathonContact({ event }: { event: EventData }) { + if (!event.organizers || event.organizers.length === 0) return null; + + return ( +
+
+

+ Contact +

+

+ Do you still have any questions? Feel free to contact us at hackathon@pushquantum.tech! +

+ +
+ {event.organizers.map((organizer) => ( +
+
+ {organizer.name} +
+ +

+ {organizer.name} +

+ +

+ {organizer.position} +

+ + + + {organizer.email} + + + {organizer.linkedin && ( + + + LinkedIn Link + + )} +
+ ))} +
+ + {event.signUpUrl && ( +
+ + Sign up + +
+ )} +
+
+ ); +} diff --git a/components/hackathon/hackathon-partners.tsx b/components/hackathon/hackathon-partners.tsx new file mode 100644 index 0000000..eca1dff --- /dev/null +++ b/components/hackathon/hackathon-partners.tsx @@ -0,0 +1,65 @@ +import Image from "next/image"; +import Link from "next/link"; +import type { EventData } from "@/lib/events-data"; + +function PartnerLogoCard({ + partner, +}: { + partner: NonNullable[number]; +}) { + return ( +
+
+ {partner.name} +
+
+ ); +} + +export function HackathonPartners({ event }: { event: EventData }) { + if (!event.partners || event.partners.length === 0) return null; + + const firstRow = event.partners.slice(0, 5); + const secondRow = event.partners.slice(5); + + return ( +
+
+

+ Our partners +

+ +
+
+ {firstRow.map((partner) => ( + + ))} +
+ + {secondRow.length > 0 && ( +
+ {secondRow.map((partner) => ( + + ))} +
+ )} +
+ +
+ + Learn More + +
+
+
+ ); +} diff --git a/components/hackathon/hackathon-tracks.tsx b/components/hackathon/hackathon-tracks.tsx new file mode 100644 index 0000000..1da3951 --- /dev/null +++ b/components/hackathon/hackathon-tracks.tsx @@ -0,0 +1,84 @@ +import Link from "next/link"; +import { Check } from "lucide-react"; + +const conferenceHighlights = [ + "Talks — Industry x Research x Students", + "Networking, Science Slam & Posters", + "Meet & greet with speakers and partners", +]; + +const hackathonHighlights = [ + "Real-world quantum challenges", + "24 hours of hacking — build & prototype in teams", + "Mentoring, demos & awards", + "Network with students, researchers & industry across Europe", +]; + +export function HackathonTracks() { + return ( +
+
+

+ Choose your experience +

+

+ One community. Two events. +

+ +
+ {/* Conference card */} +
+

+ Conference +

+

Nov 20

+

Conference · €5

+ +
    + {conferenceHighlights.map((item) => ( +
  • + + {item} +
  • + ))} +
+ + + Explore the Conference + +
+ + {/* Hackathon card */} +
+

+ Hackathon +

+

Nov 20-22

+

+ Hackathon · €10   +

+ +
    + {hackathonHighlights.map((item) => ( +
  • + + {item} +
  • + ))} +
+ + + Explore the Hackathon + +
+
+
+
+ ); +} diff --git a/components/header.tsx b/components/header.tsx index a9ce03b..05d3c7e 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -9,6 +9,7 @@ import { useState } from "react"; const navLinks = [ { href: "/about", label: "About" }, + { href: "/hackathon", label: "Hackathon 2026" }, { href: "/events", label: "Events" }, { href: "/members", label: "Members" }, { href: "/contact", label: "Contact" }, diff --git a/components/offerings-section.tsx b/components/offerings-section.tsx index b2d0a71..7620d85 100644 --- a/components/offerings-section.tsx +++ b/components/offerings-section.tsx @@ -4,7 +4,7 @@ import Link from "next/link"; const offerings = [ { title: "Quantum Entrepreneurship Laboratory", href: "#" }, - { title: "Quantum Hackathon", href: "#" }, + { title: "Quantum Hackathon", href: "/hackathon" }, { title: "Quantentraeume", href: "#" }, { title: "International Exchanges", href: "#" }, { title: "Company Visits", href: "#" }, diff --git a/lib/conference-2026-data.ts b/lib/conference-2026-data.ts new file mode 100644 index 0000000..f0c8baf --- /dev/null +++ b/lib/conference-2026-data.ts @@ -0,0 +1,73 @@ +// ============================================================ +// Data for the Conference deep-dive page +// (app/hackathon/conference/page.tsx). +// +// Talk abstracts are placeholder Lorem Ipsum text — swap them +// for the real abstracts once speakers confirm them. Everything +// else (names, affiliations, itinerary slot) comes from +// 2026_hackathon/2026 Conference & Hackathon Kick-Off.pdf. +// ============================================================ + +export interface ConferenceTalk { + time: string; + speaker: string; + affiliation?: string; + kind: "Scientific Talk" | "Keynote"; + title: string; + abstract: string; +} + +const LOREM = "TBA"; + +export const conferenceTalks: ConferenceTalk[] = [ + { + time: "9:15 - 10:00", + speaker: "Speaker to be confirmed", + kind: "Scientific Talk", + title: "Topic to be confirmed", + abstract: LOREM, + }, + { + time: "10:00 - 10:45", + speaker: "Prof. Dr. Annabelle Bohrdt", + affiliation: "LMU Munich", + kind: "Scientific Talk", + title: "TBA", + abstract: LOREM, + }, + { + time: "11:15 - 12:00", + speaker: "Prof. Dr. Dominik Bucher", + affiliation: "TUM", + kind: "Scientific Talk", + title: "TBA", + abstract: LOREM, + }, + { + time: "12:00 - 12:45", + speaker: "Prof. Dr. Barbara Kraus", + affiliation: "TUM", + kind: "Scientific Talk", + title: "TBA", + abstract: LOREM, + }, + { + time: "16:30 - 17:00", + speaker: "Prof. Dr. Ignacio Cirac", + affiliation: "Max Planck Institute of Quantum Optics", + kind: "Keynote", + title: "TBA", + abstract: LOREM, + }, +]; + +export const scienceSlam = { + intro: + "A science slam is a fast-paced, accessible research pitch competition — no jargon, no slides packed with equations, just researchers making their work exciting for a general audience in a few minutes on stage.", + format: + "Selected speakers each get a short slot on the Main Stage to present their research in an engaging, accessible way. The audience votes for their favorite talk at the end.", + applicationWindow: "September 15 - October 31, 2026", + applicationNote: + "Apply with a short video submission introducing yourself and your research topic. Selected speakers are notified ahead of the Conference and present live on November 20.", + slot: "14:15 - 15:45, Main Stage", +}; diff --git a/lib/events-data.ts b/lib/events-data.ts index 33f6343..0369224 100644 --- a/lib/events-data.ts +++ b/lib/events-data.ts @@ -73,6 +73,7 @@ export interface EventData { // Individual event page heroDescription?: string; // supports **bold** markers signUpUrl?: string; + signUpDisabled?: boolean; // shows the sign-up button greyed out and unclickable // Key Facts keyFacts?: { diff --git a/lib/hackathon-2026-data.ts b/lib/hackathon-2026-data.ts new file mode 100644 index 0000000..3e087d7 --- /dev/null +++ b/lib/hackathon-2026-data.ts @@ -0,0 +1,200 @@ +// ============================================================ +// Data for the standalone 2026 Conference + Hackathon page +// (app/hackathon/page.tsx). Kept separate from the main +// `events` array in events-data.ts so this event has its own +// dedicated /hackathon URL without also appearing as a +// duplicate entry on the general /events listing. +// +// Source material: 2026_hackathon/ (announcement carousel, +// preliminary Nov 20 kick-off agenda, and information.txt +// LinkedIn announcement copy). The Nov 20 hourly agenda is +// marked "PRELIMINARY — DO NOT DISTRIBUTE" in the source PDF, +// so double check it's final before this page goes live. +// ============================================================ + +import type { EventData } from "@/lib/events-data"; + +// ------------------------------------------------------------ +// Challenge partners for the Hackathon deep-dive page +// (app/hackathon/challenge-partners/page.tsx). +// +// Placeholder copy — swap in the real challenge briefs once +// partners confirm them. +// ------------------------------------------------------------ +export interface ChallengePartner { + name: string; + logo: string; + description: string; + challenge: string; +} + +const CHALLENGE_TBA = "Challenge details to be announced closer to the event."; + +export const challengePartners: ChallengePartner[] = [ + { + name: "Aqarios", + logo: "/logos/partners/aqarios/aqarios_logo_blue_vertical.png", + description: "Quantum software company building optimization solutions for industry.", + challenge: CHALLENGE_TBA, + }, + { + name: "Alice & Bob", + logo: "/logos/partners/alice_bob/ALICE-ET-BOB.png", + description: "Hardware company building fault-tolerant quantum computers from cat qubits.", + challenge: CHALLENGE_TBA, + }, + { + name: "IQM Quantum Computers", + logo: "/logos/partners/iqm/IQM_Quantum_Computers_Logo.jpg", + description: "Superconducting quantum computer manufacturer for research and industry.", + challenge: CHALLENGE_TBA, + }, + { + name: "Qoro", + logo: "/logos/partners/qoro/Qoro-Quantum-Banner-600x400.png", + description: "Distributed quantum computing software for scaling quantum applications.", + challenge: CHALLENGE_TBA, + }, +]; + +export const hackathon2026: EventData = { + slug: "conference-hackathon-2026", + title: "Conference + Hackathon 2026", + shortDescription: + "Frontiers in Quantum Science and Technology — three days, two experiences: a one-day quantum conference and a 24-hour hackathon in Munich/Garching.", + image: "/images/events/placeholder-quantum-1.png", + tags: ["Hackathon", "Conference"], + date: "Friday 20 - Sunday 22 November, 2026", + dateISO: "2026-11-20", + isHighlight: true, + signUpUrl: "https://docs.google.com/forms/d/e/1FAIpQLScQZfBAFH1mqYaGkGaKFY_72TNoa969YvVwJaF8S1DwU2eLww/viewform", + heroDescription: + "**Three days, two experiences, your choice.** Join us at the Research Campus Garching for a day of talks, science slam and networking, followed by 24 hours of turning real quantum challenges into working prototypes.", + keyFacts: { + when: "Friday 20 - Sunday 22 November 2026. Early bird registration benefits: Sep 15-30. Science Slam video applications: Sep 15-Oct 31.", + where: "Munich / Research Campus Garching", + forWhom: + "Master's and PhD students planning their next step in quantum tech, plus researchers and tech enthusiasts of all backgrounds. Choose the Conference, the Hackathon, or both.", + whatToExpect: + "Conference (Nov 20): talks from leading researchers and pioneers, a Science Slam, poster session and industry meet & greet. Hackathon (Nov 20-22): team up in interdisciplinary groups and turn real-world challenges into working prototypes in 24 hours of hacking, with mentoring and networking with students, researchers and industry experts from across Europe. Conference only €5 · Hackathon only €10 · Both events €15.", + }, + agenda: [ + { + label: "Friday, Nov 20 - Conference & Hackathon Kick-off", + description: + "A full day of talks at the Garching Research Campus, closing with the mandatory hackathon kick-off and challenge presentations.", + entries: [ + { time: "8:30 - 9:00", title: "Arrival" }, + { time: "9:00 - 9:15", title: "Welcome" }, + { time: "9:15 - 10:00", title: "Scientific Talk (TBA)" }, + { + time: "10:00 - 10:45", + title: "TBA - Prof. Dr. Annabelle Bohrdt (LMU)", + }, + { time: "10:45 - 11:15", title: "Coffee Break & Speaker Meet & Greet" }, + { + time: "11:15 - 12:00", + title: + "TBA - Prof. Dr. Dominik Bucher (TUM) / Company Speed Dating (prior registration)", + }, + { + time: "12:00 - 12:45", + title: "TBA - Prof. Dr. Barbara Kraus (TUM)", + }, + { + time: "12:45 - 14:15", + title: "Lunch Break & Speaker Meet & Greet / MCQST Poster Session", + }, + { time: "14:15 - 15:45", title: "Science Slam" }, + { time: "15:45 - 16:15", title: "Coffee Break" }, + { time: "16:15 - 16:30", title: "PushQuantum Presentation" }, + { + time: "16:30 - 17:00", + title: "Keynote - Prof. Dr. Ignacio Cirac (MPQ)", + }, + { time: "17:00 - 17:45", title: "Munich Ecosystem Presentations" }, + { time: "17:45 - 18:00", title: "Coffee Break" }, + { + time: "18:00 - 19:45", + title: "Partner & Challenge Presentations (Hackathon Kick-off)", + }, + { time: "19:45 - 22:00", title: "Dinner" }, + ], + }, + { + label: "Saturday, Nov 21 - Hackathon", + description: + "24 hours of hacking begins: interdisciplinary teams build and prototype real quantum challenges with mentoring, access to quantum hardware, and technology from our partners. Detailed hourly schedule to be announced.", + entries: [], + }, + { + label: "Sunday, Nov 22 - Hackathon", + description: + "The 24-hour hacking session wraps up with final prototypes, demos, feedback from mentors and judges, and the closing awards ceremony. Detailed hourly schedule to be announced.", + entries: [], + }, + ], + partners: [ + { name: "TUM Venture Labs", logo: "/logos/partners/tum_vl/png/tumvl_logo_schwarz_rgb.png" }, + { name: "Munich Quantum Valley", logo: "/logos/partners/mqv/mqv_new.png" }, + { + name: "Munich Center for Quantum Science and Technology (MCQST)", + logo: "/logos/partners/mcqst/MCQST_Logo_BlueBlack.png", + }, + { + name: "Max Planck Institute of Quantum Optics", + logo: "/logos/partners/mpq/mpq.png", + }, + { name: "Aqora", logo: "/logos/partners/aquora/Aqora.png" }, + { name: "Alice & Bob", logo: "/logos/partners/alice_bob/ALICE-ET-BOB.png" }, + { name: "Aqarios", logo: "/logos/partners/aqarios/aqarios_logo_blue_vertical.png" }, + { name: "IQM Quantum Computers", logo: "/logos/partners/iqm/IQM_Quantum_Computers_Logo.jpg" }, + { name: "Qoro", logo: "/logos/partners/qoro/Qoro-Quantum-Banner-600x400.png" } + ], + faq: [ + { + question: "What's the difference between the Conference and the Hackathon?", + answer: + "The Conference (Nov 20) is a day of talks by leading researchers and pioneers, industry x research x student networking, a Science Slam and a poster session. The Hackathon (Nov 20-22) kicks off on the afternoon of Nov 20, then teams get 24 hours to turn real-world quantum challenges from industry and research into working prototypes, with mentoring, access to quantum tech, and final demos & awards.\n Hackathon and conference participants will come together in the afternoon and are welcome to stay for relaxed networking into the evening.", + }, + { + question: "Do I have to join both the Conference and the Hackathon?", + answer: + "No — you choose your experience, or combine both for the full weekend. Join the Conference only, the Hackathon only, or both. Hackathon participants must also attend the mandatory kick-off on the afternoon of November 20.", + }, + { + question: "Is the hackathon kick-off mandatory?", + answer: + "Yes. All hackathon participants are required to attend the kick-off on the afternoon of November 20, where challenges are presented by our partners and teams get started.", + }, + { + question: "How much does it cost?", + answer: + "Conference only: €5. Hackathon only: €10. Both events: €15.", + }, + { + question: "How do I apply for the Science Slam?", + answer: + "Science Slam video applications are open September 15 - October 31. Selected speakers present live during the Conference on November 20.", + }, + { + question: "When does registration open?", + answer: + "Early bird registration benefits run September 15-30. Join the waitlist to be notified as soon as full registration opens.", + }, + ], + organizers: [ + { + name: "Felizia Braun", + position: "President, PushQuantum", + image: "/department_leads/Felizia.jpg", + email: "felizia@pushquantum.tech", + }, + { + name: "Tjorven Oevermann", + position: "Vice President, PushQuantum", + image: "/department_leads/Tjorven.jpg", + email: "tjorven@pushquantum.tech", + }, + ], +}; diff --git a/public/logos/partners/alice_bob/ALICE-ET-BOB.png b/public/logos/partners/alice_bob/ALICE-ET-BOB.png new file mode 100644 index 0000000..2065f04 Binary files /dev/null and b/public/logos/partners/alice_bob/ALICE-ET-BOB.png differ diff --git a/public/logos/partners/aqarios/aqarios.png b/public/logos/partners/aqarios/aqarios.png new file mode 100644 index 0000000..a58624e Binary files /dev/null and b/public/logos/partners/aqarios/aqarios.png differ diff --git a/public/logos/partners/aqarios/aqarios_logo_blue_small.png b/public/logos/partners/aqarios/aqarios_logo_blue_small.png new file mode 100644 index 0000000..f88c828 Binary files /dev/null and b/public/logos/partners/aqarios/aqarios_logo_blue_small.png differ diff --git a/public/logos/partners/aqarios/aqarios_logo_blue_vertical.png b/public/logos/partners/aqarios/aqarios_logo_blue_vertical.png new file mode 100644 index 0000000..fb41210 Binary files /dev/null and b/public/logos/partners/aqarios/aqarios_logo_blue_vertical.png differ diff --git a/public/logos/partners/iqm/IQM_Quantum_Computers_Logo.jpg b/public/logos/partners/iqm/IQM_Quantum_Computers_Logo.jpg new file mode 100644 index 0000000..3c3addb Binary files /dev/null and b/public/logos/partners/iqm/IQM_Quantum_Computers_Logo.jpg differ diff --git a/public/logos/partners/mpq/mpq.png b/public/logos/partners/mpq/mpq.png new file mode 100644 index 0000000..d94b7db Binary files /dev/null and b/public/logos/partners/mpq/mpq.png differ diff --git a/public/logos/partners/mqv/mqv_new.png b/public/logos/partners/mqv/mqv_new.png new file mode 100644 index 0000000..eeb8f7c Binary files /dev/null and b/public/logos/partners/mqv/mqv_new.png differ diff --git a/public/logos/partners/qoro/Qoro-Quantum-Banner-600x400.png b/public/logos/partners/qoro/Qoro-Quantum-Banner-600x400.png new file mode 100644 index 0000000..5240b88 Binary files /dev/null and b/public/logos/partners/qoro/Qoro-Quantum-Banner-600x400.png differ