@@ -6,6 +6,7 @@ import type { StaticImageData } from "next/image"
6
6
import TwitterIcon from "@/icons/twitter.svg"
7
7
import { Button } from "@/app/conf/_design-system/button"
8
8
import { BECOME_A_SPEAKER_LINK } from "../../links"
9
+ import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration"
9
10
10
11
const previousConfSpeakers = {
11
12
benjie : {
@@ -17,27 +18,27 @@ const previousConfSpeakers = {
17
18
} ,
18
19
kewei : {
19
20
name : "Kewei Qu" ,
20
- title : "Meta — Senior Staff Software Engineer" ,
21
+ title : "Meta, Senior Staff Engineer" ,
21
22
src : "https://avatars.sched.co/9/1a/18743864/avatar.jpg.320x320px.jpg" ,
22
23
twitter : "kewei_qu" ,
23
24
linkedin : "keweiqu" ,
24
25
} ,
25
26
donna : {
26
27
name : "Donna Zhou" ,
27
- title : "Atlassian — Maintainer of GraphQL Java" ,
28
+ title : "Atlassian, GraphQL Java" ,
28
29
src : "https://avatars.sched.co/0/1d/18743879/avatar.jpg.320x320px.jpg?e1f" ,
29
30
linkedin : "donnazhou" ,
30
31
} ,
31
32
uri : {
32
33
name : "Uri Goldshtein" ,
33
- title : "The Guild — Founder" ,
34
+ title : "The Guild, Founder" ,
34
35
src : "https://avatars.sched.co/8/2b/14900013/avatar.jpg.320x320px.jpg?9f1" ,
35
36
twitter : "UriGoldshtein" ,
36
37
linkedin : "urigo" ,
37
38
} ,
38
39
alessia : {
39
40
name : "Alessia Bellisario" ,
40
- title : "Apollo GraphQL — Staff Open Source Engineer" ,
41
+ title : "Apollo, Staff Engineer" ,
41
42
src : "https://avatars.sched.co/a/c6/18743837/avatar.jpg.320x320px.jpg?847" ,
42
43
twitter : "alessbell" ,
43
44
linkedin : "alessiabellisario" ,
@@ -62,27 +63,33 @@ export default function TopMindsSection({
62
63
{ ...rest }
63
64
>
64
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" >
65
- { /* todo: remaining socials */ }
66
66
< h3 className = "mr-auto flex w-full grow text-pretty pb-6 pr-6 typography-h2 [@media(width>857px)]:basis-0" >
67
67
Meet the top industry minds
68
68
</ h3 >
69
- < SpeakerCard { ...previousConfSpeakers . benjie } />
69
+ < SpeakerCard
70
+ { ...previousConfSpeakers . benjie }
71
+ stripes = "linear-gradient(80deg, hsl(var(--color-pri-base)) 0%, hsl(var(--color-pri-base)) 5%, transparent 40%, transparent)"
72
+ />
70
73
< SpeakerCard
71
74
{ ...previousConfSpeakers . kewei }
72
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)"
73
77
/>
74
78
< div className = "flex grow border-sec-dark [@media(width<970px)]:contents [@media(width>=970px)]:border-t [@media(width>=970px)]:*:border-t-0" >
75
79
< SpeakerCard
76
80
{ ...previousConfSpeakers . donna }
77
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%)"
78
83
/>
79
84
< SpeakerCard
80
85
{ ...previousConfSpeakers . uri }
81
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)"
82
88
/>
83
89
< SpeakerCard
84
90
{ ...previousConfSpeakers . alessia }
85
91
className = "[@media(width<744px)]:border-l"
92
+ stripes = "radial-gradient(circle at top left, transparent 0%, transparent 65%, black 90%)"
86
93
/>
87
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" >
88
95
{ hasSpeakersPage ? (
@@ -108,13 +115,15 @@ function SpeakerCard({
108
115
twitter,
109
116
linkedin,
110
117
className,
118
+ stripes,
111
119
} : {
112
120
name : string
113
121
title : string
114
122
src : string | StaticImageData
115
123
twitter ?: string
116
124
linkedin ?: string
117
125
className ?: string
126
+ stripes ?: string
118
127
} ) {
119
128
return (
120
129
< article
@@ -123,13 +132,17 @@ function SpeakerCard({
123
132
className ,
124
133
) }
125
134
>
126
- < Image
127
- src = { src }
128
- alt = ""
129
- width = { 312 }
130
- height = { 312 }
131
- className = "aspect-square size-[312px] w-full object-cover transition-transform sm:h-[236px]"
132
- />
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 >
133
146
< div className = "flex flex-1 items-stretch border-t border-sec-dark" >
134
147
< div className = "flex grow flex-col justify-center gap-1 p-3 sm:h-[80px]" >
135
148
< h4 className = "typography-body-md" > { name } </ h4 >
@@ -177,3 +190,18 @@ function LinkedInIcon(props: HTMLAttributes<SVGElement>) {
177
190
</ svg >
178
191
)
179
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