MeetTheTeam.tsx (9171B)
1 import { MeshGradient2 } from "../effects/MeshGradient.2"; 2 import { Button } from "../ui/Button"; 3 import { FormattedMessage, useIntl } from "react-intl"; 4 import Link from "next/link"; 5 import { motion } from "framer-motion"; 6 import { RoundedContainerWithGradientBorder } from "../ui/RoundedContainerWithGradientBorder"; 7 import { cn } from "@/lib/utils"; 8 import Image from "next/image"; 9 import { NostrIcon } from "../icons/NostrIcon"; 10 11 const team = [ 12 { 13 profilePicture: "/team-photos/will-casarin.webp", 14 roleIntlString: "roles.founder-and-developer", 15 fullName: "William Casarin", 16 shortName: "Will", 17 nostrNpub: "npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s", 18 }, 19 { 20 profilePicture: "/team-photos/vanessa-gray.png", 21 roleIntlString: "roles.marketer", 22 fullName: "Vanessa Gray", 23 shortName: "@vrod", 24 nostrNpub: "npub1h50pnxqw9jg7dhr906fvy4mze2yzawf895jhnc3p7qmljdugm6gsrurqev", 25 }, 26 { 27 profilePicture: "/team-photos/elsat.png", 28 roleIntlString: "roles.product-janitor", 29 fullName: "elsat", 30 shortName: "elsat", 31 nostrNpub: "npub1zafcms4xya5ap9zr7xxr0jlrtrattwlesytn2s42030lzu0dwlzqpd26k5", 32 }, 33 { 34 profilePicture: "/team-photos/roberto-agreda.png", 35 roleIntlString: "roles.designer", 36 fullName: "Roberto", 37 shortName: "Rob", 38 nostrNpub: "npub1uapy44zhu5f0markfftt7m2z3gr2zwssq6h3lw8qlce0d5pjvhrs3q9pmv", 39 }, 40 { 41 profilePicture: "/team-photos/daniel-daquino.png", 42 roleIntlString: "roles.developer", 43 fullName: "Daniel D’Aquino", 44 shortName: "Daniel", 45 nostrNpub: "npub13v47pg9dxjq96an8jfev9znhm0k7ntwtlh9y335paj9kyjsjpznqzzl3l8", 46 }, 47 { 48 profilePicture: "/team-photos/joel-klabo.png", 49 roleIntlString: "roles.developer", 50 fullName: "Joel Klabo", 51 shortName: "Joel", 52 nostrNpub: "npub19a86gzxctwtz68l8zld2u9y2fjvyyj4juyx8m5geylssrmfj27eqs22ckt" 53 }, 54 { 55 profilePicture: "/team-photos/suhail-saqan.png", 56 roleIntlString: "roles.developer", 57 fullName: "Suhail Saqan", 58 shortName: "Suhail", 59 nostrNpub: "npub1k92qsr95jcumkpu6dffurkvwwycwa2euvx4fthv78ru7gqqz0nrs2ngfwd" 60 }, 61 { 62 profilePicture: "/team-photos/terry-yiu.png", 63 roleIntlString: "roles.developer", 64 fullName: "Terry Yiu", 65 shortName: "Terry", 66 nostrNpub: "npub1yaul8k059377u9lsu67de7y637w4jtgeuwcmh5n7788l6xnlnrgs3tvjmf" 67 }, 68 { 69 profilePicture: "/team-photos/eric-holguin.png", 70 roleIntlString: "roles.developer", 71 fullName: "Eric Holguin", 72 shortName: "Eric", 73 nostrNpub: "npub12gyrpse550melzx2ey69srfxlyd8svkxkg0mjcjkjr4zakqm2cnqwa3jj5" 74 }, 75 { 76 profilePicture: "/team-photos/bryan-montz.png", 77 roleIntlString: "roles.developer", 78 fullName: "Bryan Montz", 79 shortName: "Bryan", 80 nostrNpub: "npub1qlk0nqupxmlyxravg0aqscxmcc4q4tq898z6x003rykwwh3npj0syvyayc", 81 }, 82 { 83 profilePicture: "/team-photos/mr-e.png", 84 roleIntlString: "roles.brand-ambassador", 85 fullName: "Mr. E.", 86 shortName: "Mr. E.", 87 nostrNpub: "npub1h50pnxqw9jg7dhr906fvy4mze2yzawf895jhnc3p7qmljdugm6gsrurqev", 88 }, 89 { 90 profilePicture: "/team-photos/ben-weeks.png", 91 roleIntlString: "roles.developer", 92 fullName: "Ben Weeks", 93 shortName: "Ben", 94 nostrNpub: "npub1jutptdc2m8kgjmudtws095qk2tcale0eemvp4j2xnjnl4nh6669slrf04x", 95 }, 96 { 97 profilePicture: "/team-photos/fishcake.png", 98 roleIntlString: "roles.developer", 99 fullName: "Fishcake", 100 shortName: "", 101 nostrNpub: "npub137c5pd8gmhhe0njtsgwjgunc5xjr2vmzvglkgqs5sjeh972gqqxqjak37w", 102 }, 103 { 104 profilePicture: "/team-photos/cr0bar.png", 105 roleIntlString: "roles.developer", 106 fullName: "cr0bar", 107 shortName: "cr0bar", 108 nostrNpub: "npub1794vv7hl7y6q2qw0y7m7h60rpphmvt5h7pzt5sr78z6assj6w0eqagwjhd", 109 }, 110 { 111 profilePicture: "/team-photos/thesamecat.png", 112 roleIntlString: "roles.developer", 113 fullName: "TheSameCat", 114 shortName: "", 115 nostrNpub: "npub1wtuh24gpuxjyvnmjwlvxzg8k0elhasagfmmgz0x8vp4ltcy8ples54e7js", 116 }, 117 { 118 profilePicture: "/team-photos/jeroen.png", 119 roleIntlString: "roles.first-business-intern", 120 fullName: "Jeroen", 121 shortName: "Jeroen", 122 nostrNpub: "npub17plqkxhsv66g8quxxc9p5t9mxazzn20m426exqnl8lxnh5a4cdns7jezx0" 123 }, 124 { 125 profilePicture: "https://charlie.fish/images/author/fishcharlie/current/square/256.png", 126 roleIntlString: "roles.developer", 127 fullName: "Charlie Fish", 128 shortName: "@fishcharlie", 129 nostrNpub: "npub16amr0pgqzl8l57npcupjmv8j3055042g07w4qj4tu3zf4yd48nlsh96569" 130 } 131 ] 132 133 export function MeetTheTeam({ className }: { className?: string }) { 134 const intl = useIntl() 135 136 // This type of structure is necessary in this case to make strings get picked up by `npm run i18n` 137 const roleIntlStrings: Record<string, string> = { 138 "roles.founder-and-developer": intl.formatMessage({ id: "roles.founder-and-developer", defaultMessage: "Founder & Developer" }), 139 "roles.marketer": intl.formatMessage({ id: "roles.marketer", defaultMessage: "Marketer" }), 140 "roles.product-janitor": intl.formatMessage({ id: "roles.product-janitor", defaultMessage: "Product Janitor" }), 141 "roles.designer": intl.formatMessage({ id: "roles.designer", defaultMessage: "Designer" }), 142 "roles.developer": intl.formatMessage({ id: "roles.developer", defaultMessage: "Developer" }), 143 "roles.first-business-intern": intl.formatMessage({ id: "roles.first-business-intern", defaultMessage: "First Business Intern" }), 144 "roles.brand-ambassador": intl.formatMessage({ id: "roles.brand-ambassador", defaultMessage: "Brand Ambassador" }), 145 } 146 147 return (<> 148 <div className={cn("bg-black overflow-hidden relative min-h-screen", className)}> 149 <div className="container mx-auto px-6 pb-32 pt-12"> 150 <div className="flex flex-col items-center justify-center mt-32 lg:mt-16"> 151 <div className="relative mb-32"> 152 <motion.h2 className="text-5xl md:text-7xl lg:text-8xl text-center text-transparent bg-clip-text bg-gradient-to-r from-white from-30% to-green-500 to-100% font-semibold"> 153 { intl.formatMessage({ id: "meet_the_team.headline", defaultMessage: "Meet the Damus team" }) } 154 </motion.h2> 155 </div> 156 <div className="flex flex-wrap gap-x-8 gap-y-8 md:gap-y-16 items-stretch justify-center"> 157 {team.map((item, index) => ( 158 <div key={index} className="max-w-xs flex flex-col items-center justify-center h-full"> 159 <RoundedContainerWithGradientBorder className="w-48 h-full"> 160 <div className="flex flex-col justify-center items-center"> 161 <div className="relative w-24 h-24 rounded-full overflow-hidden"> 162 <Image 163 src={item.profilePicture} 164 className="object-contain" 165 fill 166 sizes="300px" 167 alt="" 168 /> 169 </div> 170 <h3 className="text-white/70 text-center text-xs font-normal mt-4"> 171 { roleIntlStrings[item.roleIntlString] } 172 </h3> 173 <p className="text-xl font-semibold text-transparent bg-clip-text bg-gradient-to-br from-white from-30% to-cyan-200 to-100% text-center text-normal mt-1"> 174 {item.fullName} 175 </p> 176 <Link href={"https://damus.io/" + item.nostrNpub} target="_blank" className="mt-4"> 177 <Button variant="secondary" className="flex items-center"> 178 <NostrIcon className="h-6 mr-1 text-damuspink-600/80" aria-hidden="true"/> 179 <span className="text-xs">{ intl.formatMessage({ id: "meet_the_team.view_profile", defaultMessage: "Follow {shortName}"} , { shortName: item.shortName }) }</span> 180 </Button> 181 </Link> 182 </div> 183 </RoundedContainerWithGradientBorder> 184 </div> 185 ))} 186 </div> 187 </div> 188 </div> 189 </div> 190 </>) 191 }