@@ -3,14 +3,47 @@ import { HTMLAttributes } from "react"
3
3
import Image from "next-image-export-optimizer"
4
4
import type { StaticImageData } from "next/image"
5
5
6
- import elizabethStone from "./speakers/elizabeth-stone.webp"
7
- import kamilKisiela from "./speakers/kamil-kisiela.webp"
8
- import rajeevRajan from "./speakers/rajeev-rajan.webp"
9
- import tanmaiGopal from "./speakers/tanmai-gopal.webp"
10
- import uriGoldshtein from "./speakers/uri-goldshtein.webp"
11
6
import TwitterIcon from "@/icons/twitter.svg"
12
7
import { Button } from "@/app/conf/_design-system/button"
13
8
import { BECOME_A_SPEAKER_LINK } from "../../links"
9
+ import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration"
10
+
11
+ const previousConfSpeakers = {
12
+ benjie : {
13
+ name : "Benjie Gillam" ,
14
+ title : "GraphQL TSC & Spec" ,
15
+ src : "https://avatars.sched.co/b/99/18743846/avatar.jpg.320x320px.jpg" ,
16
+ twitter : "benjie" ,
17
+ linkedin : "benjiegillam" ,
18
+ } ,
19
+ kewei : {
20
+ name : "Kewei Qu" ,
21
+ title : "Meta, Senior Staff Engineer" ,
22
+ src : "https://avatars.sched.co/9/1a/18743864/avatar.jpg.320x320px.jpg" ,
23
+ twitter : "kewei_qu" ,
24
+ linkedin : "keweiqu" ,
25
+ } ,
26
+ donna : {
27
+ name : "Donna Zhou" ,
28
+ title : "Atlassian, GraphQL Java" ,
29
+ src : "https://avatars.sched.co/0/1d/18743879/avatar.jpg.320x320px.jpg?e1f" ,
30
+ linkedin : "donnazhou" ,
31
+ } ,
32
+ uri : {
33
+ name : "Uri Goldshtein" ,
34
+ title : "The Guild, Founder" ,
35
+ src : "https://avatars.sched.co/8/2b/14900013/avatar.jpg.320x320px.jpg?9f1" ,
36
+ twitter : "UriGoldshtein" ,
37
+ linkedin : "urigo" ,
38
+ } ,
39
+ alessia : {
40
+ name : "Alessia Bellisario" ,
41
+ title : "Apollo, Staff Engineer" ,
42
+ src : "https://avatars.sched.co/a/c6/18743837/avatar.jpg.320x320px.jpg?847" ,
43
+ twitter : "alessbell" ,
44
+ linkedin : "alessiabellisario" ,
45
+ } ,
46
+ }
14
47
15
48
interface TopMindsSectionProps extends HTMLAttributes < HTMLElement > {
16
49
hasSpeakersPage ?: boolean
@@ -30,47 +63,33 @@ export default function TopMindsSection({
30
63
{ ...rest }
31
64
>
32
65
< div className = "flex grid-cols-2 flex-wrap [@media(444px<width<743px)]:grid [@media(width<=444px)]:flex-col [@media(width<=743px)]:justify-center [@media(width>=970px)]:*:border-b-0" >
33
- { /* todo: remaining socials */ }
34
66
< h3 className = "mr-auto flex w-full grow text-pretty pb-6 pr-6 typography-h2 [@media(width>857px)]:basis-0" >
35
67
Meet the top industry minds
36
68
</ h3 >
37
69
< SpeakerCard
38
- name = "Uri Goldshtein"
39
- title = "The Guild — Founder"
40
- src = { uriGoldshtein }
41
- linkedin = "urigo"
42
- twitter = "UriGoldshtein"
70
+ { ...previousConfSpeakers . benjie }
71
+ stripes = "linear-gradient(80deg, hsl(var(--color-pri-base)) 0%, hsl(var(--color-pri-base)) 5%, transparent 40%, transparent)"
43
72
/>
44
73
< SpeakerCard
45
- name = "Elizabeth Stone"
46
- title = "Netflix — CTO"
47
- src = { elizabethStone }
48
- linkedin = "elizabeth-stone-608a754"
74
+ { ...previousConfSpeakers . kewei }
49
75
className = "[@media(width<=742px)]:border-l"
76
+ stripes = "radial-gradient(circle at bottom right, hsl(var(--color-pri-base)) 0%, hsl(var(--color-pri-base)) 10%, transparent 40%, transparent)"
50
77
/>
51
78
< div className = "flex grow border-sec-dark [@media(width<970px)]:contents [@media(width>=970px)]:border-t [@media(width>=970px)]:*:border-t-0" >
52
79
< SpeakerCard
53
- name = "Kamil Kisiela"
54
- title = "The Guild — Developer"
55
- src = { kamilKisiela }
56
- linkedin = "kamilkisiela"
57
- twitter = "kamilkisiela"
80
+ { ...previousConfSpeakers . donna }
58
81
className = "[@media(744px<=width<=970px)]:first-of-type:border-l-0"
82
+ stripes = "radial-gradient(ellipse at top left, hsl(var(--color-pri-base)) 0%, hsl(var(--color-pri-base)) 5%, transparent 40%, transparent, transparent 85%, black 100%)"
59
83
/>
60
84
< SpeakerCard
61
- name = "Rajeev Rajan"
62
- title = "Atlassian — CTO"
63
- src = { rajeevRajan }
64
- linkedin = "rajeev-rajan"
85
+ { ...previousConfSpeakers . uri }
65
86
className = "[@media(639px<=width<=970px)]:border-l"
87
+ stripes = "linear-gradient(-40deg, hsl(var(--color-pri-base)) 0%, hsl(var(--color-pri-base)) 5%, transparent 40%, transparent)"
66
88
/>
67
89
< SpeakerCard
68
- name = "Tanmai Gopal"
69
- title = "Hasura — CEO & Co-Founder"
70
- src = { tanmaiGopal }
71
- twitter = "tanmaigo"
72
- linkedin = "tanmaig"
90
+ { ...previousConfSpeakers . alessia }
73
91
className = "[@media(width<744px)]:border-l"
92
+ stripes = "radial-gradient(circle at top left, transparent 0%, transparent 65%, black 90%)"
74
93
/>
75
94
< div className = "mt-6 flex shrink-0 basis-[content] items-end justify-stretch max-lg:w-full [@media(640px<=width<=855px)]:basis-[236px] [@media(width<=444px)]:*:w-full [@media(width>742px)]:justify-end [@media(width>742px)]:pl-6 [@media(width>855px)]:grow" >
76
95
{ hasSpeakersPage ? (
@@ -96,13 +115,15 @@ function SpeakerCard({
96
115
twitter,
97
116
linkedin,
98
117
className,
118
+ stripes,
99
119
} : {
100
120
name : string
101
121
title : string
102
122
src : string | StaticImageData
103
123
twitter ?: string
104
124
linkedin ?: string
105
125
className ?: string
126
+ stripes ?: string
106
127
} ) {
107
128
return (
108
129
< article
@@ -111,13 +132,17 @@ function SpeakerCard({
111
132
className ,
112
133
) }
113
134
>
114
- < Image
115
- src = { src }
116
- alt = ""
117
- width = { 312 }
118
- height = { 312 }
119
- className = "aspect-square size-[312px] w-full object-cover transition-transform sm:h-[236px]"
120
- />
135
+ < div className = "relative overflow-hidden" >
136
+ < div className = "absolute inset-0 z-[1] bg-sec-light opacity-90 mix-blend-multiply" />
137
+ < Image
138
+ src = { src }
139
+ alt = ""
140
+ width = { 312 }
141
+ height = { 312 }
142
+ className = "aspect-square size-[312px] w-full object-cover saturate-[0.1] transition-transform sm:h-[236px]"
143
+ />
144
+ < Stripes mask = { stripes } />
145
+ </ div >
121
146
< div className = "flex flex-1 items-stretch border-t border-sec-dark" >
122
147
< div className = "flex grow flex-col justify-center gap-1 p-3 sm:h-[80px]" >
123
148
< h4 className = "typography-body-md" > { name } </ h4 >
@@ -165,3 +190,18 @@ function LinkedInIcon(props: HTMLAttributes<SVGElement>) {
165
190
</ svg >
166
191
)
167
192
}
193
+
194
+ function Stripes ( { mask } : { mask ?: string } ) {
195
+ return (
196
+ < div
197
+ role = "presentation"
198
+ className = "pointer-events-none absolute inset-0 inset-y-[-20px]"
199
+ style = { {
200
+ maskImage : mask ,
201
+ WebkitMaskImage : mask ,
202
+ } }
203
+ >
204
+ < StripesDecoration evenClassName = "bg-gradient-to-b from-sec-darker to-sec-dark" />
205
+ </ div >
206
+ )
207
+ }
0 commit comments