From 72b09bd300d50ce37286ed390568b3e4e884d479 Mon Sep 17 00:00:00 2001 From: "Laury S." Date: Fri, 12 Jun 2026 16:05:00 +0200 Subject: [PATCH 1/2] Feat: accessibility seo (#681) * a11y(con): add image alt text and semantic landmarks * feat(con): add Person & Event/subEvent JSON-LD for speakers and talks * feat(con): richer semantic HTML for talks & speakers (article, time, section) --- .../2025/call-for-papers/components/logos.tsx | 20 +++---- .../con/2025/tickets/RegisterPage.tsx | 1 + .../2026/call-for-papers/components/logos.tsx | 20 +++---- pwa/app/(con)/[locale]/con/2026/layout.tsx | 17 +++++- .../[edition]/conferences/ConferencesPage.tsx | 23 ++++--- .../[slug]/components/ConferencePage.tsx | 12 ++-- .../[slug]/components/ConferenceSpeaker.tsx | 6 +- .../con/[edition]/conferences/[slug]/page.tsx | 8 ++- .../(con)/[locale]/con/[edition]/layout.tsx | 21 ++++++- .../schedule/components/SlotAvatar.tsx | 2 +- .../schedule/components/SlotItem.tsx | 4 +- .../[edition]/speakers/[slug]/SpeakerPage.tsx | 19 +++--- .../con/[edition]/speakers/[slug]/page.tsx | 37 ++++++++++-- pwa/components/con/home/LastEdition.tsx | 2 +- pwa/components/con/layout/Footer.tsx | 4 +- pwa/components/con/layout/LayoutBase.tsx | 2 +- pwa/components/con/review/ReviewItem.tsx | 2 +- pwa/components/con/speakers/SpeakerImage.tsx | 5 +- .../con/speakers/SpeakerImage2025.tsx | 2 +- pwa/components/con/speakers/SpeakerItem.tsx | 6 +- pwa/utils/con/index.tsx | 60 ++++++++++++++++++- 21 files changed, 204 insertions(+), 69 deletions(-) diff --git a/pwa/app/(con)/[locale]/con/2025/call-for-papers/components/logos.tsx b/pwa/app/(con)/[locale]/con/2025/call-for-papers/components/logos.tsx index 2892dd64a..0c1494354 100644 --- a/pwa/app/(con)/[locale]/con/2025/call-for-papers/components/logos.tsx +++ b/pwa/app/(con)/[locale]/con/2025/call-for-papers/components/logos.tsx @@ -1,16 +1,16 @@ export function Logos() { return ( <> - - - - - - - - - - + API Platform + Caddy + Elastic + FrankenPHP + JavaScript + Laravel + PHP + RabbitMQ + React Admin + Xdebug ); } diff --git a/pwa/app/(con)/[locale]/con/2025/tickets/RegisterPage.tsx b/pwa/app/(con)/[locale]/con/2025/tickets/RegisterPage.tsx index 10ba5c292..06e9f02b6 100644 --- a/pwa/app/(con)/[locale]/con/2025/tickets/RegisterPage.tsx +++ b/pwa/app/(con)/[locale]/con/2025/tickets/RegisterPage.tsx @@ -85,6 +85,7 @@ export default function RegisterPage() { API Platform Conference 2024
diff --git a/pwa/app/(con)/[locale]/con/2026/call-for-papers/components/logos.tsx b/pwa/app/(con)/[locale]/con/2026/call-for-papers/components/logos.tsx index 2892dd64a..0c1494354 100644 --- a/pwa/app/(con)/[locale]/con/2026/call-for-papers/components/logos.tsx +++ b/pwa/app/(con)/[locale]/con/2026/call-for-papers/components/logos.tsx @@ -1,16 +1,16 @@ export function Logos() { return ( <> - - - - - - - - - - + API Platform + Caddy + Elastic + FrankenPHP + JavaScript + Laravel + PHP + RabbitMQ + React Admin + Xdebug ); } diff --git a/pwa/app/(con)/[locale]/con/2026/layout.tsx b/pwa/app/(con)/[locale]/con/2026/layout.tsx index 8d4c9125f..19f1b2944 100644 --- a/pwa/app/(con)/[locale]/con/2026/layout.tsx +++ b/pwa/app/(con)/[locale]/con/2026/layout.tsx @@ -5,8 +5,10 @@ import nav from "data/con/2026/nav"; import footer from "data/con/2026/footer"; import { Metadata } from "next"; import { getEditionEventData } from "utils/con"; -import { i18n } from "i18n/i18n-config"; +import { i18n, Locale } from "i18n/i18n-config"; import { getRootUrl } from "utils"; +import { getAllSpeakers } from "api/con/speakers"; +import { getAllConferences } from "api/con/conferences"; type Props = { params: { edition: string; locale: string }; @@ -38,8 +40,17 @@ export async function generateMetadata({ params }: Props): Promise { }; } -function EditionLayout({ children }: { children: React.ReactNode }) { - const eventData = getEditionEventData("2026"); +async function EditionLayout({ + children, + params, +}: { + children: React.ReactNode; + params: { locale: string }; +}) { + const locale = (params?.locale || i18n.defaultLocale) as Locale; + const speakers = await getAllSpeakers("2026", locale); + const talks = await getAllConferences("2026", true, locale); + const eventData = getEditionEventData("2026", speakers, talks); return (