damus.io

damus.io website
git clone git://jb55.com/damus.io
Log | Files | Refs | README | LICENSE

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 }