@@ -6,6 +6,7 @@ import type { StaticImageData } from "next/image"
66import TwitterIcon from "@/icons/twitter.svg"
77import { Button } from "@/app/conf/_design-system/button"
88import { BECOME_A_SPEAKER_LINK } from "../../links"
9+ import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration"
910
1011const previousConfSpeakers = {
1112 benjie : {
@@ -17,27 +18,27 @@ const previousConfSpeakers = {
1718 } ,
1819 kewei : {
1920 name : "Kewei Qu" ,
20- title : "Meta — Senior Staff Software Engineer" ,
21+ title : "Meta, Senior Staff Engineer" ,
2122 src : "https://avatars.sched.co/9/1a/18743864/avatar.jpg.320x320px.jpg" ,
2223 twitter : "kewei_qu" ,
2324 linkedin : "keweiqu" ,
2425 } ,
2526 donna : {
2627 name : "Donna Zhou" ,
27- title : "Atlassian — Maintainer of GraphQL Java" ,
28+ title : "Atlassian, GraphQL Java" ,
2829 src : "https://avatars.sched.co/0/1d/18743879/avatar.jpg.320x320px.jpg?e1f" ,
2930 linkedin : "donnazhou" ,
3031 } ,
3132 uri : {
3233 name : "Uri Goldshtein" ,
33- title : "The Guild — Founder" ,
34+ title : "The Guild, Founder" ,
3435 src : "https://avatars.sched.co/8/2b/14900013/avatar.jpg.320x320px.jpg?9f1" ,
3536 twitter : "UriGoldshtein" ,
3637 linkedin : "urigo" ,
3738 } ,
3839 alessia : {
3940 name : "Alessia Bellisario" ,
40- title : "Apollo GraphQL — Staff Open Source Engineer" ,
41+ title : "Apollo, Staff Engineer" ,
4142 src : "https://avatars.sched.co/a/c6/18743837/avatar.jpg.320x320px.jpg?847" ,
4243 twitter : "alessbell" ,
4344 linkedin : "alessiabellisario" ,
@@ -62,27 +63,33 @@ export default function TopMindsSection({
6263 { ...rest }
6364 >
6465 < 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 */ }
6666 < h3 className = "mr-auto flex w-full grow text-pretty pb-6 pr-6 typography-h2 [@media(width>857px)]:basis-0" >
6767 Meet the top industry minds
6868 </ 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+ />
7073 < SpeakerCard
7174 { ...previousConfSpeakers . kewei }
7275 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)"
7377 />
7478 < div className = "flex grow border-sec-dark [@media(width<970px)]:contents [@media(width>=970px)]:border-t [@media(width>=970px)]:*:border-t-0" >
7579 < SpeakerCard
7680 { ...previousConfSpeakers . donna }
7781 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%)"
7883 />
7984 < SpeakerCard
8085 { ...previousConfSpeakers . uri }
8186 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)"
8288 />
8389 < SpeakerCard
8490 { ...previousConfSpeakers . alessia }
8591 className = "[@media(width<744px)]:border-l"
92+ stripes = "radial-gradient(circle at top left, transparent 0%, transparent 65%, black 90%)"
8693 />
8794 < 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" >
8895 { hasSpeakersPage ? (
@@ -108,13 +115,15 @@ function SpeakerCard({
108115 twitter,
109116 linkedin,
110117 className,
118+ stripes,
111119} : {
112120 name : string
113121 title : string
114122 src : string | StaticImageData
115123 twitter ?: string
116124 linkedin ?: string
117125 className ?: string
126+ stripes ?: string
118127} ) {
119128 return (
120129 < article
@@ -123,13 +132,17 @@ function SpeakerCard({
123132 className ,
124133 ) }
125134 >
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 >
133146 < div className = "flex flex-1 items-stretch border-t border-sec-dark" >
134147 < div className = "flex grow flex-col justify-center gap-1 p-3 sm:h-[80px]" >
135148 < h4 className = "typography-body-md" > { name } </ h4 >
@@ -177,3 +190,18 @@ function LinkedInIcon(props: HTMLAttributes<SVGElement>) {
177190 </ svg >
178191 )
179192}
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