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
9 changes: 4 additions & 5 deletions pwa/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ RUN apk add --no-cache libc6-compat bash git

WORKDIR /srv/app

RUN npm install --global corepack@latest && \
corepack enable && \
corepack prepare --activate pnpm@latest && \
RUN corepack enable && \
corepack prepare pnpm@9.15.4 --activate && \
pnpm config -g set store-dir /.pnpm-store

# Next.js collects completely anonymous telemetry data about general usage.
Expand Down Expand Up @@ -82,7 +81,7 @@ RUN --mount=type=secret,id=GITHUB_KEY \
if [ -z "$GITHUB_KEY" ]; then \
echo "Please set the GITHUB_KEY secret" && exit 1 ; \
fi \
&& npm i ts-node && npm run prebuild
&& pnpm add ts-node && pnpm run prebuild

# ADD https://soyuka.me/contributors.json ./data/contributors.json

Expand All @@ -98,7 +97,7 @@ RUN --mount=type=secret,id=GITHUB_KEY \
if [ -z "$GITHUB_KEY" ]; then \
echo "Please set the GITHUB_KEY secret" && exit 1 ; \
fi \
&& npm i ts-node && npm run postbuild
&& pnpm add ts-node && pnpm run postbuild

# Production image, copy all the files and run next
FROM node:18-alpine AS prod
Expand Down
32 changes: 25 additions & 7 deletions pwa/app/(con)/[locale]/con/2025/tickets/RegisterPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { useContext, useEffect } from "react";
import { LanguageContext } from "contexts/con/LanguageContext";
import SectionTitle from "components/con/common/typography/SectionTitle";
import SectionSubTitle from "components/con/common/typography/SectionSubtitle";
import Script from "next/script";
import prices from "data/con/2025/prices";
import { Offer } from "types/con";
import dayjs from "dayjs";
Expand Down Expand Up @@ -40,12 +39,35 @@ export default function RegisterPage() {
const iframe = document.getElementById(
"yurplan-widget-141690"
) as HTMLIFrameElement | null;
if (!iframe) return;
const handleLoad = () => {
const loader = document.getElementById("loader");
loader?.classList.add("hidden");
};
iframe.addEventListener("load", handleLoad, true);
iframe?.addEventListener("load", handleLoad, true);

const SRC = "https://assets.yurplan.com/yurplan-v1/dist/widget.js";
const getYp = () =>
(window as unknown as { YurPlanWidgets?: { init: () => void } })
.YurPlanWidgets;

if (getYp()) {
getYp()?.init();
} else if (!document.querySelector(`script[src="${SRC}"]`)) {
const script = document.createElement("script");
script.src = SRC;
script.async = true;
document.body.appendChild(script);
}

const handlePageShow = (e: PageTransitionEvent) => {
if (e.persisted) getYp()?.init();
};
window.addEventListener("pageshow", handlePageShow);

return () => {
iframe?.removeEventListener("load", handleLoad, true);
window.removeEventListener("pageshow", handlePageShow);
};
}, []);

return (
Expand Down Expand Up @@ -184,10 +206,6 @@ export default function RegisterPage() {
data-id="141690"
></iframe>
</div>
<Script
type="text/javascript"
src="https://assets.yurplan.com/yurplan-v1/dist/widget.js"
/>
</div>
</div>
</>
Expand Down
112 changes: 34 additions & 78 deletions pwa/app/(con)/[locale]/con/2026/components/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,25 @@ import SpeakerList from "components/con/speakers/SpeakerList";
import SectionTitle from "components/con/common/typography/SectionTitle";
import SectionSubTitle from "components/con/common/typography/SectionSubtitle";
import Venue from "components/con/home/Venue";
import Image from "next/image";
import Wave from "components/con/common/Wave";
import Partners from "components/con/home/Partners";
import LookingSponsorCard from "components/con/home/LookingSponsorCard";
import { Partner, Speaker } from "types/con";
import { useContext } from "react";
import { LanguageContext } from "contexts/con/LanguageContext";
import Section from "components/con/home/Section";
import PictureGallery from "components/con/common/PictureGallery";
import AfterMovie from "../../2025/components/AfterMovie";
import BuyButton from "components/con/common/BuyButton";
import { currentEdition } from "data/con/editions";
import prices from "data/con/2026/prices";
import PricingCard from "components/con/home/Pricing/PricingCard";
import LogoTilleuls from "components/con/common/LogoTilleuls";

type HomePageProps = {
speakers: Speaker[];
partners: Partner[];
images: string[];
};

const HomePage = ({ speakers, partners, images }: HomePageProps) => {
const HomePage = ({ speakers, partners }: HomePageProps) => {
const { t, Translate, locale } = useContext(LanguageContext);
return (
<>
Expand All @@ -45,61 +42,28 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
<p className="flex-1 text-lg md:text-xl font-extrabold pb-6 lg:text-3xl md:text-left">
{t("2026.baseline")}
</p>
<div className="flex gap-2">
<div className="flex gap-2 flex-col">
<div className="flex items-center justify-center flex-row gap-2 mb-2">
<span className="text-sm whitespace-nowrap">{t("an_event_by_short")}</span>
<a
className="text-center w-52 -mr-16"
href={`https://les-tilleuls.coop/${locale}`}
target="_blank"
rel="noreferrer noopener"
>
<LogoTilleuls secondColor="#fff" width="60%" />
</a>
</div>
{currentEdition === "2026" && (
<BuyButton className="mr-2" id="cover">
{t("buy_tickets")}
</BuyButton>
)}
<Button
className="empty"
to={`/${locale}/con/2026/call-for-papers`}
>
{t("2026.cfp.button")}
</Button>
</div>
</div>
</div>
<Wave className="absolute opacity-30 z-0 bottom-0 h-[60vh] left-1/2 top-[68%] -translate-y-1/2" />
</Section>
<Section
section="lastYear"
className="bg-white z-10 relative pb-10 overflow-y-clip"
>
<div className="container text-center">
<SectionTitle>
<Translate translationKey="last_edition.title" />
</SectionTitle>
<SectionSubTitle>
<Translate
translationKey="last_edition.subtitle"
translationParams={{
edition: "2025",
link: (
<a href={`/${locale}/con/2025/review`} className="link">
{t("last_edition.subtitle_link")}
</a>
),
}}
/>
</SectionSubTitle>
<PictureGallery
className="py-4"
link="https://www.flickr.com/photos/194052559@N02/albums/72177720329148577/"
>
{images.map((image: string) => (
<Image
className="object-cover"
key={image}
fill
src={image}
alt=""
sizes="(max-width: 640px) 200px, (max-width: 768px) 240px, (max-width: 1536px) 300px, 400px"
/>
))}
</PictureGallery>
</div>
</Section>
<Section
section="speakers"
className="bg-grey z-10 relative py-4 overflow-x-hidden"
Expand All @@ -110,18 +74,7 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
</SectionTitle>
<SectionSubTitle>
<Translate
translationKey="2026.our_speakers.subtitle"
translationParams={{
edition: "2026",
link: (
<a
href={`/${locale}/con/2026/call-for-papers`}
className="link"
>
{t("2026.our_speakers.subtitle_link")}
</a>
),
}}
translationKey="2026.our_speakers.subtitle2"
/>
</SectionSubTitle>
<SpeakerList speakers={speakers} max={9} />
Expand Down Expand Up @@ -184,22 +137,25 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
),
})}
/>
<Section section="sponsorship" className="py-8">
<div className="container text-center">
<SectionTitle dark>
<Translate translationKey="sponsorship.title" />
</SectionTitle>
<LookingSponsorCard />
</div>
<div className="bg-white text-center relative z-10 pt-40 pb-40">
<div className="container text-center">
<div className="lined-center lined-blue font-bold uppercase text-2xl text-blue font-title">
{t("sponsorship.they_trust_us", { year: "2025" })}
</div>
<Partners data={partners} edition="2025" />
</div>
</div>
</Section>
<Section section="sponsorship" className="py-8">
<div className="container text-center">
<SectionTitle dark>
<Translate translationKey="sponsorship.title" />
</SectionTitle>
<LookingSponsorCard />
</div>
<div
id="partners"
className="bg-white text-center relative z-10 pt-40 pb-40"
>
<div className="container text-center">
<div className="lined-center lined-blue font-bold uppercase text-2xl text-blue font-title">
<Translate translationKey="partners.title" />
</div>
<Partners data={partners} edition="2026" />
</div>
</div>
</Section>
</>
);
};
Expand Down
6 changes: 2 additions & 4 deletions pwa/app/(con)/[locale]/con/2026/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { getAllSpeakers } from "api/con/speakers";
import { getAllEditionPictures } from "api/con/editions";
import partners from "data/con/2025/partners";
import partners from "data/con/2026/partners";
import HomePage from "./components/HomePage";
import { Locale, i18n } from "i18n/i18n-config";
import { Metadata } from "next";
Expand Down Expand Up @@ -28,7 +27,6 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {

export default async function Page({ params }: { params: { locale: Locale } }) {
const speakers = await getAllSpeakers("2026", params.locale);
const images = (await getAllEditionPictures("2025")).slice(0, 6);

return <HomePage speakers={speakers} partners={partners} images={images} />;
return <HomePage speakers={speakers} partners={partners} />;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import SpeakerImage from "components/con/speakers/SpeakerImage";
import classNames from "classnames";
import { getConferenceDate } from "utils/con";
import Link from "next/link";
import TagLabel from "components/con/conferences/TagLabel";

interface ConferencesProps {
conferences: Conference[];
Expand All @@ -21,7 +22,7 @@ export default function SpeakerPageListTemplate({
edition,
days,
}: ConferencesProps) {
const is2025 = edition === "2025";
const is2025 = edition === "2025" || edition === "2026";
const { t, locale, Translate } = useContext(LanguageContext);
return (
<div className="container flex flex-col items-center pt-10 | sm:pt-20">
Expand Down Expand Up @@ -122,7 +123,12 @@ export default function SpeakerPageListTemplate({
/>
</div>
</div>
<div className="flex flex-col gap-2 flex-1">
<div className="flex flex-col gap-2 flex-1 items-center md:items-start">
<div className="flex flex-row gap-1">
{conference.tag
? conference.tag.split(",").map((t) => <TagLabel key={t} small tag={t} />)
: null}
</div>
<h2 className="font-title font-bold text-2xl lined-blue lined-center md:after:left-0 md:after:translate-x-0">
{conference.title}
</h2>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ const ConferenceSpeaker = ({ conference }: SpeakerProps) => {
speakers.length === 1 && "md:mx-auto md:w-60 md:h-60"
)}
>
{conference.edition === "2025" ? (
{conference.edition === "2025" ||
conference.edition === "2026" ? (
<SpeakerImage2025
speaker={speaker}
image={image}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
}

.description ul {
@apply list-disc text-left pl-7;
@apply list-disc text-left pl-7 mb-6;
}

.description ul li:not(last-child) {
.description ul li {
@apply mb-4;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
}

.description p:not(:last-child) {
@apply mb-6;
@apply mb-4;
}

.description a {
Expand All @@ -21,9 +21,9 @@
}

.description ul {
@apply list-disc text-left pl-7;
@apply list-disc text-left pl-7 mb-8;
}

.description ul li:not(last-child) {
@apply mb-2;
@apply mb-1;
}
7 changes: 5 additions & 2 deletions pwa/app/(con)/[locale]/con/[edition]/conferences/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Locale } from "i18n/i18n-config";
import ConferencesPage from "./ConferencesPage";
import { getAllConferenceSlugs, getConferenceData } from "api/con/conferences";
import { getConferenceDate, sortByStartDate } from "utils/con";
import { sortBySpeakerRank, sortByStartDate } from "utils/con";

const getConferences = async (edition: string, locale: Locale) => {
const conferencesSlugs = await getAllConferenceSlugs(edition);
Expand All @@ -20,7 +20,9 @@ type Props = {

export default async function Page({ params }: Props) {
const conferences = await getConferences(params.edition, params.locale);
const sortedConferences = conferences.sort(sortByStartDate);
const sortedConferences = conferences
.sort(sortBySpeakerRank)
.sort(sortByStartDate);
const days = (await import(`data/con/${params.edition}/days`)).default;
// Fetch data directly in a Server Component
// Forward fetched data to your Client Component
Expand All @@ -34,6 +36,7 @@ export const generateStaticParams = async () => {
{ edition: "2023" },
{ edition: "2024" },
{ edition: "2025" },
{ edition: "2026" },
];
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export default function SpeakerPageTemplate({
</div>
<div className="flex flex-col relative flex-wrap items-center bg-grey px-10 pb-10 pt-28 | lg:flex-row lg:items-start | sm:pb-20">
<div className="w-72 h-72 | md:w-80 md:h-80 | lg:w-[400px] lg:h-[400px]">
{edition === "2025" ? (
{edition === "2025" || edition === "2026" ? (
<SpeakerImage2025
speaker={speakerData}
big
Expand Down
1 change: 1 addition & 0 deletions pwa/app/(con)/[locale]/con/[edition]/speakers/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export const generateStaticParams = async () => {
{ edition: "2023" },
{ edition: "2024" },
{ edition: "2025" },
{ edition: "2026" },
];
};

Expand Down
Loading
Loading