@@ -4,6 +4,22 @@ import { PinIcon } from "../../_design-system/pixelarticons/pin-icon"
4
4
import { formatSpeakerPosition } from "./format-speaker-position"
5
5
import { GraphQLLogo } from "./graphql-conf-logo-link"
6
6
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
+
7
23
const RIGHT_COLUMN_WIDTH_PX = 476
8
24
9
25
interface SpeakerOpengraphImageProps extends React . HTMLAttributes < HTMLElement > {
@@ -22,7 +38,17 @@ export default function SpeakerOpengraphImage({
22
38
} : SpeakerOpengraphImageProps ) {
23
39
return (
24
40
< 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
+ } }
26
52
{ ...rest }
27
53
>
28
54
< ConferenceOpengraphImageHeader
@@ -31,36 +57,117 @@ export default function SpeakerOpengraphImage({
31
57
location = { location }
32
58
/>
33
59
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
+ >
39
96
{ speaker . name }
40
97
</ h3 >
41
98
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
+ >
44
115
{ formatSpeakerPosition ( speaker ) }
45
116
</ span >
46
117
</ div >
47
118
</ div >
48
119
</ div >
49
120
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
+ >
52
142
Speakers
53
143
</ span >
54
144
</ footer >
55
145
</ div >
56
146
57
147
{ 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
+ />
60
165
< img
61
166
src = { normalizeProtocolRelativeUrl ( speaker . avatar ) }
62
167
alt = ""
63
- className = "object-cover"
168
+ style = { {
169
+ objectFit : "cover" ,
170
+ } }
64
171
width = { RIGHT_COLUMN_WIDTH_PX }
65
172
height = { RIGHT_COLUMN_WIDTH_PX }
66
173
/>
@@ -81,50 +188,138 @@ export function ConferenceOpengraphImageHeader({
81
188
location : string
82
189
} ) {
83
190
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
+ />
92
234
< 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 >
95
240
</ div >
96
241
</ div >
97
242
</ div >
98
243
</ div >
99
244
</ div >
100
245
101
246
< div
102
- className = "flex h-full shrink-0 flex-col justify-center"
103
247
style = { {
248
+ display : "flex" ,
249
+ height : "100%" ,
250
+ flexShrink : 0 ,
251
+ flexDirection : "column" ,
252
+ justifyContent : "center" ,
104
253
width : RIGHT_COLUMN_WIDTH_PX ,
105
254
} }
106
255
>
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" } } >
109
269
< CalendarIcon
110
270
width = "24"
111
271
height = "24"
112
- className = "-translate-y-px text-pri-base"
272
+ style = { {
273
+ transform : "translateY(-1px)" ,
274
+ color : colors . priBase ,
275
+ } }
113
276
/>
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
+ >
115
288
{ date } , { year }
116
289
</ span >
117
290
</ div >
118
291
</ div >
119
292
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" } } >
122
305
< PinIcon
123
306
width = "24"
124
307
height = "24"
125
- className = "translate-y-[-.5px] text-pri-base"
308
+ style = { {
309
+ transform : "translateY(-0.5px)" ,
310
+ color : colors . priBase ,
311
+ } }
126
312
/>
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
+ >
128
323
{ location }
129
324
</ span >
130
325
</ div >
0 commit comments