@@ -4,6 +4,22 @@ import { PinIcon } from "../../_design-system/pixelarticons/pin-icon"
44import { formatSpeakerPosition } from "./format-speaker-position"
55import { GraphQLLogo } from "./graphql-conf-logo-link"
66
7+ export const colors = {
8+ neu0 : "hsl(0 0% 100%)" ,
9+ neu50 : "hsl(75 57% 97%)" ,
10+ neu100 : "hsl(75 15% 95%)" ,
11+ neu200 : "hsl(77 14% 90%)" ,
12+ neu300 : "hsl(76 14% 85%)" ,
13+ neu400 : "hsl(77 14% 80%)" ,
14+ neu500 : "hsl(74 14% 70%)" ,
15+ neu600 : "hsl(76 15% 60%)" ,
16+ neu700 : "hsl(76 15% 40%)" ,
17+ neu800 : "hsl(77 14% 20%)" ,
18+ neu900 : "hsl(75 15% 5%)" ,
19+ secLighter : "hsl(79 80% 90%)" ,
20+ priBase : "hsl(319 100% 44.1%)" ,
21+ }
22+
723const RIGHT_COLUMN_WIDTH_PX = 476
824
925interface SpeakerOpengraphImageProps extends React . HTMLAttributes < HTMLElement > {
@@ -22,7 +38,17 @@ export default function SpeakerOpengraphImage({
2238} : SpeakerOpengraphImageProps ) {
2339 return (
2440 < article
25- className = "flex h-[630px] w-[1200px] flex-col overflow-hidden border-2 border-neu-300 bg-neu-100"
41+ style = { {
42+ display : "flex" ,
43+ height : "630px" ,
44+ width : "1200px" ,
45+ flexDirection : "column" ,
46+ overflow : "hidden" ,
47+ borderWidth : "2px" ,
48+ backgroundColor : colors . neu100 ,
49+ borderColor : colors . neu600 ,
50+ fontFamily : "'Host Grotesk'" ,
51+ } }
2652 { ...rest }
2753 >
2854 < ConferenceOpengraphImageHeader
@@ -31,36 +57,117 @@ export default function SpeakerOpengraphImage({
3157 location = { location }
3258 />
3359
34- < div className = "flex" >
35- < div className = "flex flex-1 flex-col justify-center" >
36- < div className = "flex flex-1 flex-col justify-center gap-10 pl-10 pr-16" >
37- < div className = "flex w-[454px] flex-col gap-10" >
38- < h3 className = "m-0 font-sans text-[88px] font-normal leading-tight text-neu-900" >
60+ < div style = { { display : "flex" } } >
61+ < div
62+ style = { {
63+ display : "flex" ,
64+ flex : 1 ,
65+ flexDirection : "column" ,
66+ justifyContent : "center" ,
67+ } }
68+ >
69+ < div
70+ style = { {
71+ display : "flex" ,
72+ flex : 1 ,
73+ flexDirection : "column" ,
74+ justifyContent : "center" ,
75+ gap : "2.5rem" ,
76+ padding : "2.5rem" ,
77+ paddingRight : "4rem" ,
78+ } }
79+ >
80+ < div
81+ style = { {
82+ display : "flex" ,
83+ flexDirection : "column" ,
84+ gap : "2.5rem" ,
85+ } }
86+ >
87+ < h3
88+ style = { {
89+ margin : 0 ,
90+ fontSize : "88px" ,
91+ fontWeight : "normal" ,
92+ lineHeight : "1.25" ,
93+ color : colors . neu900 ,
94+ } }
95+ >
3996 { speaker . name }
4097 </ h3 >
4198
42- < div className = "flex items-center gap-8" >
43- < span className = "font-sans text-[32px] font-normal leading-tight text-neu-700" >
99+ < div
100+ style = { {
101+ display : "flex" ,
102+ alignItems : "center" ,
103+ gap : "2rem" ,
104+ } }
105+ >
106+ < span
107+ style = { {
108+ fontFamily : "'Host Grotesk'" ,
109+ fontSize : "32px" ,
110+ fontWeight : "normal" ,
111+ lineHeight : "1.25" ,
112+ color : colors . neu700 ,
113+ } }
114+ >
44115 { formatSpeakerPosition ( speaker ) }
45116 </ span >
46117 </ div >
47118 </ div >
48119 </ div >
49120
50- < footer className = "flex items-center border-t-2 border-neu-300 px-16 py-8 pl-10" >
51- < span className = "font-mono text-2xl font-normal uppercase leading-none text-neu-900" >
121+ < footer
122+ style = { {
123+ display : "flex" ,
124+ alignItems : "center" ,
125+ borderTop : `2px solid ${ colors . neu600 } ` ,
126+ paddingLeft : "2.5rem" ,
127+ paddingRight : "4rem" ,
128+ paddingTop : "2rem" ,
129+ paddingBottom : "2rem" ,
130+ } }
131+ >
132+ < span
133+ style = { {
134+ fontFamily : "monospace" ,
135+ fontSize : "1.5rem" ,
136+ fontWeight : "normal" ,
137+ textTransform : "uppercase" ,
138+ lineHeight : "1" ,
139+ color : colors . neu900 ,
140+ } }
141+ >
52142 Speakers
53143 </ span >
54144 </ footer >
55145 </ div >
56146
57147 { speaker . avatar && (
58- < div className = "relative flex overflow-hidden border-l-2 border-neu-300" >
59- < div className = "absolute inset-0 z-[1] bg-sec-lighter mix-blend-multiply" />
148+ < div
149+ style = { {
150+ position : "relative" ,
151+ display : "flex" ,
152+ overflow : "hidden" ,
153+ borderLeft : `2px solid ${ colors . neu600 } ` ,
154+ } }
155+ >
156+ < div
157+ style = { {
158+ position : "absolute" ,
159+ inset : 0 ,
160+ zIndex : 1 ,
161+ backgroundColor : colors . secLighter ,
162+ mixBlendMode : "multiply" ,
163+ } }
164+ />
60165 < img
61166 src = { normalizeProtocolRelativeUrl ( speaker . avatar ) }
62167 alt = ""
63- className = "object-cover"
168+ style = { {
169+ objectFit : "cover" ,
170+ } }
64171 width = { RIGHT_COLUMN_WIDTH_PX }
65172 height = { RIGHT_COLUMN_WIDTH_PX }
66173 />
@@ -81,50 +188,138 @@ export function ConferenceOpengraphImageHeader({
81188 location : string
82189} ) {
83190 return (
84- < header className = "flex items-center border-b-2 border-neu-300" >
85- < div className = "flex flex-1 items-center gap-6 border-r-2 border-neu-300 p-10 pr-16" >
86- < div className = "flex items-center gap-4" >
87- < div className = "font-mono font-normal uppercase leading-none text-neu-900" >
88- < div className = "flex h-[74px] items-center gap-4 text-[40px]/none uppercase" >
89- < div className = "text-pri-base" >
90- < GraphQLLogo className = "h-12" />
91- </ div >
191+ < header
192+ style = { {
193+ display : "flex" ,
194+ alignItems : "center" ,
195+ borderBottom : `2px solid ${ colors . neu600 } ` ,
196+ } }
197+ >
198+ < div
199+ style = { {
200+ display : "flex" ,
201+ flex : 1 ,
202+ alignItems : "center" ,
203+ gap : "1.5rem" ,
204+ borderRight : `2px solid ${ colors . neu600 } ` ,
205+ padding : "2.5rem" ,
206+ paddingRight : "4rem" ,
207+ } }
208+ >
209+ < div style = { { display : "flex" , alignItems : "center" , gap : "1rem" } } >
210+ < div
211+ style = { {
212+ fontFamily : "monospace" ,
213+ display : "flex" ,
214+ fontWeight : "normal" ,
215+ textTransform : "uppercase" ,
216+ lineHeight : "1" ,
217+ color : colors . neu900 ,
218+ } }
219+ >
220+ < div
221+ style = { {
222+ display : "flex" ,
223+ height : "74px" ,
224+ alignItems : "center" ,
225+ gap : "1rem" ,
226+ fontSize : "40px" ,
227+ lineHeight : "1" ,
228+ textTransform : "uppercase" ,
229+ } }
230+ >
231+ < GraphQLLogo
232+ style = { { height : "3rem" , width : "3rem" , color : colors . priBase } }
233+ />
92234 < span > /</ span >
93- < div >
94- GraphQLConf < span className = "text-pri-base" > { year } </ span >
235+ < div
236+ style = { { display : "flex" , alignItems : "center" , gap : "0.5rem" } }
237+ >
238+ GraphQLConf{ " " }
239+ < span style = { { color : colors . priBase } } > { year } </ span >
95240 </ div >
96241 </ div >
97242 </ div >
98243 </ div >
99244 </ div >
100245
101246 < div
102- className = "flex h-full shrink-0 flex-col justify-center"
103247 style = { {
248+ display : "flex" ,
249+ height : "100%" ,
250+ flexShrink : 0 ,
251+ flexDirection : "column" ,
252+ justifyContent : "center" ,
104253 width : RIGHT_COLUMN_WIDTH_PX ,
105254 } }
106255 >
107- < div className = "flex items-center gap-6 border-b-2 border-neu-300 px-6 py-[26px]" >
108- < div className = "flex items-center gap-2" >
256+ < div
257+ style = { {
258+ display : "flex" ,
259+ alignItems : "center" ,
260+ gap : "1.5rem" ,
261+ borderBottom : `2px solid ${ colors . neu600 } ` ,
262+ paddingLeft : "1.5rem" ,
263+ paddingRight : "1.5rem" ,
264+ paddingTop : "26px" ,
265+ paddingBottom : "26px" ,
266+ } }
267+ >
268+ < div style = { { display : "flex" , alignItems : "center" , gap : "0.5rem" } } >
109269 < CalendarIcon
110270 width = "24"
111271 height = "24"
112- className = "-translate-y-px text-pri-base"
272+ style = { {
273+ transform : "translateY(-1px)" ,
274+ color : colors . priBase ,
275+ } }
113276 />
114- < span className = "font-mono text-xl font-normal uppercase leading-[1.2] text-neu-900" >
277+ < span
278+ style = { {
279+ fontFamily : "monospace" ,
280+ display : "flex" ,
281+ fontSize : "1.25rem" ,
282+ fontWeight : "normal" ,
283+ textTransform : "uppercase" ,
284+ lineHeight : "1.2" ,
285+ color : colors . neu900 ,
286+ } }
287+ >
115288 { date } , { year }
116289 </ span >
117290 </ div >
118291 </ div >
119292
120- < div className = "flex items-center gap-6 px-6 py-[26px]" >
121- < div className = "flex items-center gap-2" >
293+ < div
294+ style = { {
295+ display : "flex" ,
296+ alignItems : "center" ,
297+ gap : "1.5rem" ,
298+ paddingLeft : "1.5rem" ,
299+ paddingRight : "1.5rem" ,
300+ paddingTop : "26px" ,
301+ paddingBottom : "26px" ,
302+ } }
303+ >
304+ < div style = { { display : "flex" , alignItems : "center" , gap : "0.5rem" } } >
122305 < PinIcon
123306 width = "24"
124307 height = "24"
125- className = "translate-y-[-.5px] text-pri-base"
308+ style = { {
309+ transform : "translateY(-0.5px)" ,
310+ color : colors . priBase ,
311+ } }
126312 />
127- < span className = "font-mono text-xl font-normal uppercase leading-[1.2] text-neu-900" >
313+ < span
314+ style = { {
315+ fontFamily : "monospace" ,
316+ fontSize : "1.25rem" ,
317+ fontWeight : "normal" ,
318+ textTransform : "uppercase" ,
319+ lineHeight : "1.2" ,
320+ color : colors . neu900 ,
321+ } }
322+ >
128323 { location }
129324 </ span >
130325 </ div >
0 commit comments