@@ -3,14 +3,47 @@ import { HTMLAttributes } from "react"
33import Image from "next-image-export-optimizer"
44import type { StaticImageData } from "next/image"
55
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"
116import TwitterIcon from "@/icons/twitter.svg"
127import { Button } from "@/app/conf/_design-system/button"
138import { 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+ }
1447
1548interface TopMindsSectionProps extends HTMLAttributes < HTMLElement > {
1649 hasSpeakersPage ?: boolean
@@ -30,47 +63,33 @@ export default function TopMindsSection({
3063 { ...rest }
3164 >
3265 < 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 */ }
3466 < h3 className = "mr-auto flex w-full grow text-pretty pb-6 pr-6 typography-h2 [@media(width>857px)]:basis-0" >
3567 Meet the top industry minds
3668 </ h3 >
3769 < 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)"
4372 />
4473 < SpeakerCard
45- name = "Elizabeth Stone"
46- title = "Netflix — CTO"
47- src = { elizabethStone }
48- linkedin = "elizabeth-stone-608a754"
74+ { ...previousConfSpeakers . kewei }
4975 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)"
5077 />
5178 < div className = "flex grow border-sec-dark [@media(width<970px)]:contents [@media(width>=970px)]:border-t [@media(width>=970px)]:*:border-t-0" >
5279 < SpeakerCard
53- name = "Kamil Kisiela"
54- title = "The Guild — Developer"
55- src = { kamilKisiela }
56- linkedin = "kamilkisiela"
57- twitter = "kamilkisiela"
80+ { ...previousConfSpeakers . donna }
5881 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%)"
5983 />
6084 < SpeakerCard
61- name = "Rajeev Rajan"
62- title = "Atlassian — CTO"
63- src = { rajeevRajan }
64- linkedin = "rajeev-rajan"
85+ { ...previousConfSpeakers . uri }
6586 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)"
6688 />
6789 < SpeakerCard
68- name = "Tanmai Gopal"
69- title = "Hasura — CEO & Co-Founder"
70- src = { tanmaiGopal }
71- twitter = "tanmaigo"
72- linkedin = "tanmaig"
90+ { ...previousConfSpeakers . alessia }
7391 className = "[@media(width<744px)]:border-l"
92+ stripes = "radial-gradient(circle at top left, transparent 0%, transparent 65%, black 90%)"
7493 />
7594 < 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" >
7695 { hasSpeakersPage ? (
@@ -96,13 +115,15 @@ function SpeakerCard({
96115 twitter,
97116 linkedin,
98117 className,
118+ stripes,
99119} : {
100120 name : string
101121 title : string
102122 src : string | StaticImageData
103123 twitter ?: string
104124 linkedin ?: string
105125 className ?: string
126+ stripes ?: string
106127} ) {
107128 return (
108129 < article
@@ -111,13 +132,17 @@ function SpeakerCard({
111132 className ,
112133 ) }
113134 >
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 >
121146 < div className = "flex flex-1 items-stretch border-t border-sec-dark" >
122147 < div className = "flex grow flex-col justify-center gap-1 p-3 sm:h-[80px]" >
123148 < h4 className = "typography-body-md" > { name } </ h4 >
@@ -165,3 +190,18 @@ function LinkedInIcon(props: HTMLAttributes<SVGElement>) {
165190 </ svg >
166191 )
167192}
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