From e94dcf33903e86339dfeb02d91e3cd53a1aa2743 Mon Sep 17 00:00:00 2001 From: Charlie Hinojosa Date: Tue, 20 Oct 2026 00:17:01 +0000 Subject: [PATCH 1/3] Add the Inference Day registration page Build /inference-day, a standalone registration page for the November 5, 2026 virtual event, from the design handoff. The page reuses the site's Seo, Footer, global button styles and already-loaded fonts; every new rule is scoped under .id-page so nothing leaks into the rest of the site. Sections: event nav, hero, about + registration form, agenda, speakers (Kelsey Hightower and Viktor Farcic featured, nine panelists in JSON order), and a closing CTA, plus Event JSON-LD, a downloadable .ics, and the route in the sitemap. The registration backend is not final, so the form keeps its endpoint in one constant (NEXT_PUBLIC_REGISTRATION_ENDPOINT) and handles the idle / submitting / success / error states; see the TODO in RegistrationForm. Open items are stubbed and listed for follow-up: StreamYard vs Upbound form backend, the privacy-policy link target, the OG image, SVG exports of the contrail and lockup art (PNG fallbacks committed for now), and the optional announcement bars. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_016QU1xKJitT9UNpCfjXjDxt Signed-off-by: Charlie Hinojosa --- pages/_app.tsx | 1 + pages/inference-day.tsx | 70 +++ pages/sitemap.xml.tsx | 1 + public/inference-day/contrail.png | Bin 0 -> 449127 bytes public/inference-day/inference-day.ics | 16 + public/inference-day/lockup.png | Bin 0 -> 8546 bytes public/inference-day/speakers/annie.jpg | Bin 0 -> 37942 bytes public/inference-day/speakers/dennis.jpg | Bin 0 -> 44300 bytes public/inference-day/speakers/erica.jpg | Bin 0 -> 51200 bytes public/inference-day/speakers/filippe.jpg | Bin 0 -> 46322 bytes public/inference-day/speakers/itay.jpg | Bin 0 -> 63887 bytes public/inference-day/speakers/julia.jpg | Bin 0 -> 57115 bytes public/inference-day/speakers/kashif.jpg | Bin 0 -> 54406 bytes public/inference-day/speakers/kelsey.jpg | Bin 0 -> 32238 bytes public/inference-day/speakers/nic.jpg | Bin 0 -> 126155 bytes public/inference-day/speakers/shivay.jpg | Bin 0 -> 56517 bytes public/inference-day/speakers/viktor.jpg | Bin 0 -> 43452 bytes src/components/inference-day/Agenda.tsx | 31 ++ src/components/inference-day/ClosingCta.tsx | 24 + src/components/inference-day/EventActions.tsx | 13 + src/components/inference-day/EventHero.tsx | 36 ++ src/components/inference-day/EventLockup.tsx | 11 + src/components/inference-day/EventNav.tsx | 61 +++ .../inference-day/RegisterSection.tsx | 42 ++ .../inference-day/RegistrationForm.tsx | 97 ++++ src/components/inference-day/Speakers.tsx | 71 +++ src/data/inference-day/agenda.json | 11 + src/data/inference-day/speakers.json | 32 ++ src/styles/inference-day.css | 511 ++++++++++++++++++ 29 files changed, 1028 insertions(+) create mode 100644 pages/inference-day.tsx create mode 100644 public/inference-day/contrail.png create mode 100644 public/inference-day/inference-day.ics create mode 100644 public/inference-day/lockup.png create mode 100644 public/inference-day/speakers/annie.jpg create mode 100644 public/inference-day/speakers/dennis.jpg create mode 100644 public/inference-day/speakers/erica.jpg create mode 100644 public/inference-day/speakers/filippe.jpg create mode 100644 public/inference-day/speakers/itay.jpg create mode 100644 public/inference-day/speakers/julia.jpg create mode 100644 public/inference-day/speakers/kashif.jpg create mode 100644 public/inference-day/speakers/kelsey.jpg create mode 100644 public/inference-day/speakers/nic.jpg create mode 100644 public/inference-day/speakers/shivay.jpg create mode 100644 public/inference-day/speakers/viktor.jpg create mode 100644 src/components/inference-day/Agenda.tsx create mode 100644 src/components/inference-day/ClosingCta.tsx create mode 100644 src/components/inference-day/EventActions.tsx create mode 100644 src/components/inference-day/EventHero.tsx create mode 100644 src/components/inference-day/EventLockup.tsx create mode 100644 src/components/inference-day/EventNav.tsx create mode 100644 src/components/inference-day/RegisterSection.tsx create mode 100644 src/components/inference-day/RegistrationForm.tsx create mode 100644 src/components/inference-day/Speakers.tsx create mode 100644 src/data/inference-day/agenda.json create mode 100644 src/data/inference-day/speakers.json create mode 100644 src/styles/inference-day.css diff --git a/pages/_app.tsx b/pages/_app.tsx index 26a3dc6..98d0264 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -5,6 +5,7 @@ import { Analytics } from '@vercel/analytics/react' import { SpeedInsights } from '@vercel/speed-insights/next' import MetricoolPixel from '@/components/MetricoolPixel' import '@/styles/globals.css' +import '@/styles/inference-day.css' // Google Analytics 4. The Measurement ID is not secret (it ships to the // browser). Loaded in production only so local development doesn't send hits. diff --git a/pages/inference-day.tsx b/pages/inference-day.tsx new file mode 100644 index 0000000..f48ddc4 --- /dev/null +++ b/pages/inference-day.tsx @@ -0,0 +1,70 @@ +import Seo from '@/components/Seo' +import Footer from '@/components/Footer' +import { SITE_URL } from '@/lib/site' +import EventNav from '@/components/inference-day/EventNav' +import EventHero from '@/components/inference-day/EventHero' +import RegisterSection from '@/components/inference-day/RegisterSection' +import Agenda from '@/components/inference-day/Agenda' +import Speakers from '@/components/inference-day/Speakers' +import ClosingCta from '@/components/inference-day/ClosingCta' +import EventLockup from '@/components/inference-day/EventLockup' + +const TITLE = 'Inference Day · November 5, 2026 | Modelplane' +const DESCRIPTION = + 'A free, live virtual event on the future of AI infrastructure. Kelsey Hightower, Viktor Farcic and open source maintainers from NVIDIA, Red Hat, Tetrate, Ericsson, Qualcomm, Dash0 and Upbound.' + +// Schema.org Event structured data. Times are expressed in PST (-08:00), matching +// the 8 a.m.–11 a.m. PST / 5 p.m.–8 p.m. CET agenda. +const eventJsonLd = { + '@context': 'https://schema.org', + '@type': 'Event', + name: 'Inference Day', + description: + 'A free, live virtual event on the future of AI infrastructure.', + url: `${SITE_URL}/inference-day`, + startDate: '2026-11-05T08:00:00-08:00', + endDate: '2026-11-05T11:00:00-08:00', + eventAttendanceMode: 'https://schema.org/OnlineEventAttendanceMode', + eventStatus: 'https://schema.org/EventScheduled', + isAccessibleForFree: true, + location: { + '@type': 'VirtualLocation', + url: `${SITE_URL}/inference-day`, + }, + organizer: { '@type': 'Organization', name: 'Modelplane', url: SITE_URL }, + sponsor: { '@type': 'Organization', name: 'Upbound', url: 'https://www.upbound.io' }, + performer: [ + { '@type': 'Person', name: 'Kelsey Hightower' }, + { '@type': 'Person', name: 'Viktor Farcic' }, + ], +} + +export default function InferenceDay() { + const url = `${SITE_URL}/inference-day` + + return ( + <> + {/* TODO(og-image): render a 1200×630 card (wordmark + date + contrail) and + pass it as `image`. Until then falls back to the generic card. */} + +