@@ -4,13 +4,15 @@ import Image from "next-image-export-optimizer"
4
4
import { Button } from "@/app/conf/_design-system/button"
5
5
import { Accordion } from "@/app/conf/_design-system/accordion"
6
6
7
+ import GraphQLFoundationWordmark from "../../assets/graphql-foundation-wordmark.svg?svgr"
7
8
import { Hero , HeroStripes } from "../../components/hero"
8
9
import { NavbarPlaceholder } from "../../components/navbar"
9
10
import { CalendarIcon } from "../../../_design-system/pixelarticons/calendar-icon"
10
11
import { PinIcon } from "../../../_design-system/pixelarticons/pin-icon"
11
12
import { CtaCardSection } from "../../components/cta-card-section"
12
13
13
14
import heroPhoto from "./hero-photo.webp"
15
+ import { Anchor } from "../../../_design-system/anchor"
14
16
15
17
export const metadata : Metadata = {
16
18
title : "GraphQL Day at FOST" ,
@@ -21,8 +23,6 @@ const CFP_LINK =
21
23
const TICKETS_LINK =
22
24
"https://ticket.apidays.global/event/apidays-paris-2025/3cccd07f-acb2-466e-8d91-cb1f208ecf42"
23
25
24
- const API_DAYS_COLOR = "#02B3B6"
25
-
26
26
export default function ResourcesPage ( ) {
27
27
return (
28
28
< >
@@ -68,12 +68,12 @@ export default function ResourcesPage() {
68
68
< main className = "gql-all-anchors-focusable gql-conf-navbar-strip text-neu-900 before:bg-white/40 before:dark:bg-blk/30" >
69
69
< div className = "gql-container" >
70
70
< AboutEventSection />
71
- < WhatToExpectSection />
72
71
< ExpertMeetupSection />
73
72
< VenueAndLocationSection />
73
+ < EventPartnersSection />
74
74
</ div >
75
75
< CtaCardSection
76
- title = "Join the community "
76
+ title = "Stay in the know "
77
77
description = "Meet the experts, share best practices, and discover the latest innovations shaping the future of APIs."
78
78
>
79
79
< div className = "flex gap-4 max-sm:flex-col sm:items-center" >
@@ -107,16 +107,16 @@ function HeroDateAndLocation() {
107
107
108
108
function AboutEventSection ( ) {
109
109
return (
110
- < section className = "gql-section flex gap-6 max-md:flex-col" >
111
- < h3 className = "typography-h2 md:flex-1 " > About GraphQL Day </ h3 >
110
+ < section className = "gql-section flex gap-6 bg-neu-100 max-md:flex-col xl:py-12 " >
111
+ < h3 className = "typography-h2 md:flex-[.5] " > About</ h3 >
112
112
< div className = "flex flex-col gap-6 md:flex-1" >
113
113
< p className = "typography-body-lg" >
114
114
Join us for a special GraphQL Day as part of the Future of Software
115
- Week, co- located with API Days Paris. This focused event brings
115
+ Week, co‑ located with API Days Paris. This focused event brings
116
116
together GraphQL practitioners, innovators, and thought leaders for a
117
117
day of deep technical discussions and hands-on learning.
118
118
</ p >
119
- < p className = "typography-body-lg" >
119
+ < p className = "typography-body-lg text-pretty " >
120
120
Whether you're already using GraphQL in production or just getting
121
121
started, this is your opportunity to connect with the community, share
122
122
best practices, and discover the latest developments in the GraphQL
@@ -127,60 +127,32 @@ function AboutEventSection() {
127
127
)
128
128
}
129
129
130
- function WhatToExpectSection ( ) {
131
- return (
132
- < section className = "gql-section flex gap-6 max-md:flex-col" >
133
- < h3 className = "typography-h2 md:flex-1" > What to expect</ h3 >
134
- < ul className = "flex flex-col gap-6 uppercase md:flex-1" >
135
- < ListItem number = "8+" text = "Expert talks" />
136
- < ListItem number = "12+" text = "Speakers" />
137
- < ListItem number = "3" text = "Lightning talks" />
138
- < ListItem number = "2" text = "Panel discussions" />
139
- < ListItem number = "300+" text = "Attendees" />
140
- </ ul >
141
- </ section >
142
- )
143
- }
144
-
145
- function ListItem ( { number, text } : { number : string | number ; text : string } ) {
146
- return (
147
- < li className = "list-none bg-gradient-to-r from-[#CDF27E] p-6 dark:from-[#507501]" >
148
- < span className = "inline-block text-[72px]/none [text-box:trim-both_cap_alphabetic]" >
149
- { number }
150
- </ span > { " " }
151
- < span className = "typography-menu mb-2 inline-block" > { text } </ span >
152
- </ li >
153
- )
154
- }
155
-
156
130
function ExpertMeetupSection ( ) {
157
131
return (
158
- < section className = "gql-section" >
159
- < h3 className = "typography-h2 mb-12" >
160
- Meet the experts, share your experience
161
- </ h3 >
132
+ < section className = "gql-section xl:py-12" >
133
+ < h3 className = "typography-h2 mb-12" > Why attend GraphQL Day?</ h3 >
162
134
< div className = "grid gap-8 md:grid-cols-2 lg:grid-cols-3" >
163
- < ExpertCard
135
+ < Card
164
136
title = "Technical Deep Dives"
165
137
description = "Learn advanced patterns, performance optimization techniques, and architectural decisions from teams running GraphQL at scale."
166
138
/>
167
- < ExpertCard
139
+ < Card
168
140
title = "Best Practices Exchange"
169
141
description = "Share your learnings and challenges with fellow practitioners. Discover how others solve common GraphQL problems."
170
142
/>
171
- < ExpertCard
143
+ < Card
172
144
title = "Innovation Showcase"
173
145
description = "Explore cutting-edge tools, upcoming features, and experimental approaches that are shaping GraphQL's future."
174
146
/>
175
- < ExpertCard
147
+ < Card
176
148
title = "Community Building"
177
149
description = "Connect with the European GraphQL community. Build relationships that extend beyond the conference."
178
150
/>
179
- < ExpertCard
151
+ < Card
180
152
title = "Hands-on Learning"
181
153
description = "Interactive sessions where you can experiment with new tools and techniques in real-time."
182
154
/>
183
- < ExpertCard
155
+ < Card
184
156
title = "Q& A Sessions "
185
157
description = "Direct access to library maintainers and core contributors. Get your specific questions answered."
186
158
/>
@@ -189,15 +161,9 @@ function ExpertMeetupSection() {
189
161
)
190
162
}
191
163
192
- function ExpertCard ( {
193
- title,
194
- description,
195
- } : {
196
- title : string
197
- description : string
198
- } ) {
164
+ function Card ( { title, description } : { title : string ; description : string } ) {
199
165
return (
200
- < article className = "flex flex-col gap-4 border border-neu-200 p-6 dark:border-neu-700 " >
166
+ < article className = "flex flex-col gap-4 border border-neu-200 p-6" >
201
167
< h4 className = "typography-h3" > { title } </ h4 >
202
168
< p className = "typography-body-md text-neu-700 dark:text-neu-300" >
203
169
{ description }
@@ -208,7 +174,7 @@ function ExpertCard({
208
174
209
175
function VenueAndLocationSection ( ) {
210
176
return (
211
- < section className = "gql-section" >
177
+ < section className = "gql-section xl:py-12 " >
212
178
< h3 className = "typography-h2 mb-12" > Venue & Location </ h3 >
213
179
< div className = "flex gap-x-12 gap-y-10 max-lg:flex-col" >
214
180
< article className = "flex flex-col gap-6 lg:flex-1" >
@@ -223,21 +189,19 @@ function VenueAndLocationSection() {
223
189
</ p >
224
190
< div className = "typography-body-lg" >
225
191
< address className = "not-italic" >
226
- Centre des nouvelles industries et technologies (CNIT)
192
+ Centre des nouvelles industries et technologies
227
193
< br />
228
194
2 Pl. de la Défense
229
195
< br />
230
196
92800 Puteaux, France
231
197
</ address >
232
198
</ div >
233
- < Button href = "https://maps.app.goo.gl/example" className = "w-fit" >
234
- View on Google Maps
235
- </ Button >
236
199
</ article >
237
200
238
201
< div className = "lg:flex-1" >
239
202
< h4 className = "typography-h3 mb-6" > Getting There</ h4 >
240
203
< Accordion
204
+ className = "lg:min-h-[327px]"
241
205
items = { [
242
206
{
243
207
title : "By Metro/RER" ,
@@ -279,7 +243,7 @@ function VenueAndLocationSection() {
279
243
</ div >
280
244
</ div >
281
245
< iframe
282
- src = "https://www.google.com/maps/embed?pb=!1m14!1m8 !1m3!1d1311.5979270428409 !2d2.2390248 !3d48.8926045! 3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47e66502128aae1f%3A0xe5e22af4aa16ed38!2sWestfield%20CNIT!5e0!3m2!1sen!2spl!4v1756917405738 !5m2!1sen!2spl"
246
+ src = "https://www.google.com/maps/embed?pb=!1m18!1m12 !1m3!1d57929.22297036571 !2d2.1992477079806285 !3d48.896253935132876!2m3!1f0!2f0!3f0! 3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47e66502128aae1f%3A0xe5e22af4aa16ed38!2sWestfield%20CNIT!5e0!3m2!1sen!2spl!4v1756923974711 !5m2!1sen!2spl"
283
247
width = "100%"
284
248
height = "450"
285
249
allowFullScreen
@@ -290,3 +254,46 @@ function VenueAndLocationSection() {
290
254
</ section >
291
255
)
292
256
}
257
+
258
+ function EventPartnersSection ( ) {
259
+ return (
260
+ < section className = "gql-section" >
261
+ < h3 className = "typography-h2 mb-12 text-center" > Event Partners</ h3 >
262
+ < div className = "flex flex-col gap-8" >
263
+ < div className = "text-center" >
264
+ < div className = "flex items-center justify-center gap-12 max-md:flex-col md:gap-16" >
265
+ < div className = "flex items-center justify-center" >
266
+ < Anchor
267
+ href = "https://www.apidays.global/events/paris"
268
+ className = "p-8 hover:bg-neu-100"
269
+ >
270
+ < img
271
+ src = "https://cdn.prod.website-files.com/67a0938d08d1902cd6974340/68112b11f6895235885793a7_Apidays%20logo%20v2.png"
272
+ alt = "API Days"
273
+ className = "h-24 w-auto object-contain invert dark:invert-0"
274
+ />
275
+ </ Anchor >
276
+ </ div >
277
+ < span className = "typography-h2 text-neu-400 lg:typography-d1 max-md:hidden" >
278
+ &
279
+ </ span >
280
+ < div className = "flex items-center justify-center" >
281
+ < Anchor
282
+ href = "https://graphql.org/community/foundation/"
283
+ className = "p-8 hover:bg-neu-100"
284
+ >
285
+ < GraphQLFoundationWordmark className = "h-24 w-auto [&_g]:fill-neu-900" />
286
+ </ Anchor >
287
+ </ div >
288
+ </ div >
289
+ </ div >
290
+
291
+ < p className = "typography-body-lg mx-auto max-w-2xl text-pretty text-center" >
292
+ GraphQL Day is organized by API Days and GraphQL Foundation, as
293
+ part of the Future of Software Week.
294
+ { /* todo: link to some FOST page? */ }
295
+ </ p >
296
+ </ div >
297
+ </ section >
298
+ )
299
+ }
0 commit comments