Skip to content

Commit 83d7967

Browse files
authored
MEP CFP API Con 2026 (#647)
1 parent d843adb commit 83d7967

32 files changed

+9106
-2666
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"use client";
2+
import { useContext } from "react";
3+
import { LanguageContext } from "contexts/con/LanguageContext";
4+
import SectionTitle from "components/con/common/typography/SectionTitle";
5+
import Button from "components/con/common/Button";
6+
import SectionSubTitle from "components/con/common/typography/SectionSubtitle";
7+
8+
const Arrow = () => (
9+
<svg
10+
xmlns="http://www.w3.org/2000/svg"
11+
fill="none"
12+
viewBox="0 0 24 24"
13+
strokeWidth={1.5}
14+
className="stroke-blue size-8"
15+
>
16+
<path
17+
strokeLinecap="round"
18+
strokeLinejoin="round"
19+
d="m12.75 15 3-3m0 0-3-3m3 3h-7.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
20+
/>
21+
</svg>
22+
);
23+
24+
export default function Informations() {
25+
const { t } = useContext(LanguageContext);
26+
return (
27+
<div className="after:h-1/3 after:absolute after:w-full after:bg-grey after:bottom-0 after:left-0 relative">
28+
<div className="container flex flex-col items-center py-12 relative z-10">
29+
<SectionTitle h1 dark lined>
30+
<strong>{t("2026.cfp.title")}</strong>
31+
</SectionTitle>
32+
<SectionSubTitle dark>{t("2026.cfp.subtitle")}</SectionSubTitle>
33+
<div className="bg-white border-t-8 border-t-blue shadow-xl text-center p-8 dotted-corner corner-bottom mx-auto w-full max-w-4xl flex flex-col gap-8 items-center">
34+
<span className="font-bold text-blue leading-tight font-title text-xl uppercase lined-center lined-blue relative">
35+
{t("2026.cfp.informations")}
36+
</span>
37+
<ul className="flex flex-col gap-8 text-left text-lg">
38+
{[1, 2, 3, 4, 5, 6].map((index) => (
39+
<li key={index} className="flex flex-row gap-2">
40+
<Arrow />
41+
<p className="flex-1">{t(`2026.cfp.point_${index}`)}</p>
42+
</li>
43+
))}
44+
</ul>
45+
<Button
46+
size="large"
47+
external
48+
to="https://conference-hall.io/api-platform-conference-2026-lille-and-online"
49+
>
50+
{t("2026.cfp.button_subscribe")}
51+
</Button>
52+
</div>
53+
</div>
54+
</div>
55+
);
56+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"use client";
2+
import { useContext } from "react";
3+
import { LanguageContext } from "contexts/con/LanguageContext";
4+
import SectionTitle from "components/con/common/typography/SectionTitle";
5+
6+
export default function Package() {
7+
const { t } = useContext(LanguageContext);
8+
return (
9+
<div className="container max-w-6xl text-center">
10+
<SectionTitle small dark lined>
11+
<strong>{t("2026.cfp.package.title")}</strong>
12+
</SectionTitle>
13+
<div className="flex flex-col lg:flex-row items-center lg:items-start gap-12 lg:gap-0 text-left">
14+
<div className="translate-y-12 relative z-10 w-4/5 lg:w-1/2 max-w-md before:absolute before:w-full before:h-full before:bg-blue before:-translate-x-3 before:-translate-y-3 before:left-0 before:top-0">
15+
<img
16+
src="/images/con/2026/cfp/speaker-gift.jpg"
17+
className="relative w-full"
18+
alt=""
19+
/>
20+
</div>
21+
<div className="bg-white max-w-xl p-8 flex-1 pt-20 lg:pt-8 lg:pl-20 -translate-y-12 lg:-translate-y-0 lg:-translate-x-12">
22+
<div className="font-bold text-blue leading-tight font-title text-xl uppercase lined-left lined-blue relative">
23+
{t("2026.cfp.package.subtitle")}
24+
</div>
25+
<ul className="mb-30 text-left flex flex-col gap-3 mt-8">
26+
{[1, 2, 3, 4, 5, 6].map((index) => (
27+
<li key={index} className="flex items-baseline">
28+
<span className="text-blue icon-circle-chevron-right mr-2" />
29+
{t(`2026.cfp.package.point_${index}`)}
30+
</li>
31+
))}
32+
</ul>
33+
</div>
34+
</div>
35+
</div>
36+
);
37+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"use client";
2+
import { useContext } from "react";
3+
import { LanguageContext } from "contexts/con/LanguageContext";
4+
import SectionTitle from "components/con/common/typography/SectionTitle";
5+
import Button from "components/con/common/Button";
6+
import SectionSubTitle from "components/con/common/typography/SectionSubtitle";
7+
8+
export default function Informations() {
9+
const { t, getLocaleDictionary } = useContext(LanguageContext);
10+
const categories = getLocaleDictionary?.()[2026].cfp.subject.categories || [];
11+
return (
12+
<div className="bg-grey pb-12 relative z-20">
13+
<div className="container flex flex-col items-center">
14+
<SectionTitle small lined>
15+
<strong>{t("2026.cfp.subject.title")}</strong>
16+
</SectionTitle>
17+
<SectionSubTitle>{t("2026.cfp.subject.subtitle")}</SectionSubTitle>
18+
<div className="flex flex-wrap justify-center gap-8 md:gap-3">
19+
{categories.map((c) => {
20+
return (
21+
<div
22+
key={c.icon}
23+
className="flex flex-col md:flex-row text-center md:text-left md:odd:translate-x-4 md:even:-translate-x-4 md:odd:rotate-2 md:even:-rotate-1 md:even:flex-row-reverse gap-4 md:gap-12 items-center bg-white w-full max-w-3xl p-8 shadow-floating"
24+
>
25+
<div className="rounded-full bg-white size-28 md:size-40 relative flex items-center justify-center">
26+
<img
27+
src={`/images/con/2026/cfp/${c.icon}.png`}
28+
className="rounded-full"
29+
alt=""
30+
/>
31+
<div className="size-[110%] absolute max-w-none bg-circle bg-no-repeat left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" />
32+
</div>
33+
<div className="flex-1">
34+
<p className="font-title text-lg text-blue font-extrabold mb-4 uppercase">
35+
{c.title}
36+
</p>
37+
<div className="text-left flex flex-col gap-2">
38+
{c.points.map((p, i) => (
39+
<div key={i} className="flex flex-row items-baseline">
40+
<span className="text-blue icon-circle-chevron-right mr-2" />
41+
<p
42+
dangerouslySetInnerHTML={{
43+
__html: p,
44+
}}
45+
/>
46+
</div>
47+
))}
48+
</div>
49+
</div>
50+
</div>
51+
);
52+
})}
53+
</div>
54+
<Button
55+
className="mt-12"
56+
size="large"
57+
external
58+
to="https://conference-hall.io/api-platform-conference-2026-lille-and-online"
59+
>
60+
{t("2026.cfp.subject.button_subscribe")}
61+
</Button>
62+
</div>
63+
</div>
64+
);
65+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use client";
2+
import { useContext } from "react";
3+
import { LanguageContext } from "contexts/con/LanguageContext";
4+
import SectionTitle from "components/con/common/typography/SectionTitle";
5+
import { Logos } from "./logos";
6+
7+
export default function Technos() {
8+
const { t } = useContext(LanguageContext);
9+
return (
10+
<div className="container pt-12 flex flex-col items-center pb-44">
11+
<SectionTitle small dark lined>
12+
<strong>{t("2026.cfp.techno.title")}</strong>
13+
</SectionTitle>
14+
<div className="relative w-full h-16 my-4">
15+
<div className="absolute max-w-none w-max left-0 top-0 flex gap-4 flex-row h-20 animate-defile">
16+
<Logos />
17+
<Logos />
18+
<Logos />
19+
</div>
20+
</div>
21+
</div>
22+
);
23+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export function Logos() {
2+
return (
3+
<>
4+
<img src="/images/con/2025/cfp/api-platform.png" alt="" />
5+
<img src="/images/con/2025/cfp/caddy.png" alt="" />
6+
<img src="/images/con/2025/cfp/elastic.png" alt="" />
7+
<img src="/images/con/2025/cfp/frankenphp.png" alt="" />
8+
<img src="/images/con/2025/cfp/JS.png" alt="" />
9+
<img src="/images/con/2025/cfp/laravel.png" alt="" />
10+
<img src="/images/con/2025/cfp/php.png" alt="" />
11+
<img src="/images/con/2025/cfp/rabbitmq.png" alt="" />
12+
<img src="/images/con/2025/cfp/react-admin.png" alt="" />
13+
<img src="/images/con/2025/cfp/xdebug.png" alt="" />
14+
</>
15+
);
16+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { Locale, i18n } from "i18n/i18n-config";
2+
import { Metadata } from "next";
3+
import Package from "./components/Package";
4+
import Informations from "./components/Informations";
5+
import Subject from "./components/Subject";
6+
import Technos from "./components/Techno";
7+
8+
type Props = {
9+
params: { locale: Locale };
10+
};
11+
export async function generateMetadata({ params }: Props): Promise<Metadata> {
12+
const locale = params.locale || i18n.defaultLocale;
13+
const dictionary = await import(`i18n/meta/${locale}.json`);
14+
15+
return {
16+
title: {
17+
absolute: dictionary["call-for-papers"].title,
18+
template: `%s - API Platform Conference 2026`,
19+
},
20+
description: dictionary["call-for-papers"].description,
21+
openGraph: {
22+
title: `${dictionary["call-for-papers"].title} - API Platform Conference`,
23+
description: dictionary["call-for-papers"].description,
24+
},
25+
twitter: {
26+
title: `${dictionary["call-for-papers"].title} - API Platform Conference`,
27+
description: dictionary["call-for-papers"].description,
28+
},
29+
alternates: {
30+
languages: {
31+
en: locale === "en" ? undefined : "/con/2026/call-for-papers",
32+
fr: locale === "fr" ? undefined : "/fr/con/2026/call-for-papers",
33+
},
34+
},
35+
};
36+
}
37+
38+
export default async function Page({ params }: { params: { locale: Locale } }) {
39+
return (
40+
<div>
41+
<Informations />
42+
<Subject />
43+
<Package />
44+
<Technos />
45+
</div>
46+
);
47+
}

pwa/app/(con)/[locale]/con/2026/components/HomePage.tsx

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import SectionTitle from "components/con/common/typography/SectionTitle";
55
import SectionSubTitle from "components/con/common/typography/SectionSubtitle";
66
import Venue from "components/con/home/Venue";
77
import Image from "next/image";
8+
import Wave from "components/con/common/Wave";
89
import Partners from "components/con/home/Partners";
910
import LookingSponsorCard from "components/con/home/LookingSponsorCard";
1011
import { Partner, Speaker } from "types/con";
1112
import { useContext } from "react";
1213
import { LanguageContext } from "contexts/con/LanguageContext";
1314
import Section from "components/con/home/Section";
14-
import Cover from "components/con/home/Cover";
1515
import PictureGallery from "components/con/common/PictureGallery";
1616
import AfterMovie from "../../2025/components/AfterMovie";
1717

@@ -25,15 +25,34 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
2525
const { t, Translate, locale } = useContext(LanguageContext);
2626
return (
2727
<>
28-
<Cover
29-
date={t("2026.date")}
30-
baseline={t("2026.baseline")}
31-
button={
32-
<Button className="pink" to={`/${locale}/con/2025/review`}>
33-
{t("review.button")}
34-
</Button>
35-
}
36-
/>
28+
<Section
29+
className="flex flex-col text-white text-center justify-center items-center min-h-screen w-full relative overflow-hidden pt-12 pb-12"
30+
section="home"
31+
>
32+
<div className="container relative z-10 flex flex-col items-center w-full md:flex-row md:gap-8">
33+
<div className="w-4/5 my-6 md:mt-0 md:w-1/2 xl:w-[60%] relative">
34+
<img
35+
src="/images/con/2026/logo.svg"
36+
alt="Logo API Platform Conference 2026"
37+
className="scale-110 translate-y-[10%]"
38+
/>
39+
</div>
40+
<div className="flex-1 flex flex-col items-center md:items-start">
41+
<p className="flex-1 text-lg md:text-xl font-extrabold pb-6 lg:text-3xl md:text-left">
42+
{t("2026.baseline")}
43+
</p>
44+
<div className="flex gap-2">
45+
<Button
46+
className="pink"
47+
to={`/${locale}/con/2025/call-for-papers`}
48+
>
49+
{t("2026.cfp.button")}
50+
</Button>
51+
</div>
52+
</div>
53+
</div>
54+
<Wave className="absolute opacity-30 z-0 bottom-0 h-[60vh] left-1/2 top-[68%] -translate-y-1/2" />
55+
</Section>
3756
<Section
3857
section="lastYear"
3958
className="bg-white z-10 relative pb-10 overflow-y-clip"
@@ -116,10 +135,8 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
116135
edition: "2026",
117136
link: (
118137
<a
119-
href="mailto:[email protected]"
138+
href={`/${locale}/con/2026/call-for-papers`}
120139
className="link"
121-
target="_blank"
122-
rel="noreferrer nooepener"
123140
>
124141
{t("2026.our_speakers.subtitle_link")}
125142
</a>

pwa/data/con/2026/footer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ const footer = [
1515
{
1616
title: "footer.the_event.title",
1717
links: [
18+
{
19+
title: "footer.the_event.links.cfp",
20+
link: "/{{locale}}/con/2026/call-for-papers",
21+
},
1822
{
1923
title: "footer.the_event.links.venue",
2024
link: "/{{locale}}/con/2026/#venue",

pwa/data/con/2026/nav.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ const nav = {
77
mobileOnly: true,
88
},
99
{
10-
to: "/{{locale}}/con/editions",
11-
text: "nav.links.previous_editions",
10+
to: "/{{locale}}/con/2025/call-for-papers",
11+
text: "nav.links.call_for_papers",
1212
},
1313
{
1414
to: "/{{locale}}/con/2025/review",

0 commit comments

Comments
 (0)