|
1 | 1 | import { ExternalLink } from "lucide-react"; |
| 2 | +import { FaInstagram, FaLinkedinIn } from "react-icons/fa"; |
| 3 | +import { SiLinktree } from "react-icons/si"; |
2 | 4 | import { EnhancedButton } from "@/components/ui/enhanced-button"; |
3 | 5 | import { PageHeader } from "@/components/PageHeader"; |
| 6 | +import { publicAssetPath } from "@/lib/publicAsset"; |
4 | 7 |
|
5 | 8 | const INTEREST_FORM = "https://forms.gle/EQmWP1JWzDzrFji79"; |
6 | 9 | const NEWSLETTER_FORM = "https://forms.gle/qCxn93mfunF3Dtep7"; |
| 10 | +const RECRUITMENT_POST = "https://www.instagram.com/p/DcUXakNy7cj/"; |
7 | 11 |
|
8 | 12 | const forms = [ |
9 | 13 | { |
10 | | - n: "01", |
11 | | - title: "Get updates", |
12 | | - body: "Sign up for our interest form to receive updates about events, courses, and opportunities.", |
| 14 | + eyebrow: "Fall 2026 interest form", |
| 15 | + title: "Express interest", |
| 16 | + body: "Tell us you are interested and receive application updates, event announcements, and opportunities.", |
13 | 17 | src: INTEREST_FORM, |
14 | | - label: "Interest form", |
| 18 | + cta: "Fill out the interest form", |
| 19 | + preview: "/forms/interest-form-preview.webp", |
| 20 | + featured: true, |
15 | 21 | }, |
16 | 22 | { |
17 | | - n: "02", |
18 | | - title: "Newsletter", |
19 | | - body: "Subscribe to our newsletter for in-depth articles and exclusive content.", |
| 23 | + eyebrow: "Monthly newsletter", |
| 24 | + title: "Get the newsletter", |
| 25 | + body: "Subscribe for club news, upcoming socials, general meetings, and professional opportunities.", |
20 | 26 | src: NEWSLETTER_FORM, |
21 | | - label: "Newsletter form", |
| 27 | + cta: "Sign up for the newsletter", |
| 28 | + preview: "/forms/newsletter-form-preview.webp", |
| 29 | + featured: false, |
22 | 30 | }, |
23 | 31 | ]; |
24 | 32 |
|
25 | 33 | const socials = [ |
26 | | - { name: "instagram", url: "https://www.instagram.com/ucb_compbio/" }, |
27 | 34 | { |
28 | | - name: "linkedin", |
| 35 | + name: "Instagram", |
| 36 | + detail: "@ucb_compbio", |
| 37 | + url: "https://www.instagram.com/ucb_compbio/", |
| 38 | + icon: FaInstagram, |
| 39 | + }, |
| 40 | + { |
| 41 | + name: "LinkedIn", |
| 42 | + detail: "CompBio at Berkeley", |
29 | 43 | url: "https://www.linkedin.com/company/computational-biology-at-berkeley/", |
| 44 | + icon: FaLinkedinIn, |
| 45 | + }, |
| 46 | + { |
| 47 | + name: "Linktree", |
| 48 | + detail: "All club links", |
| 49 | + url: "https://linktr.ee/compbioatberkeley", |
| 50 | + icon: SiLinktree, |
30 | 51 | }, |
31 | | - { name: "linktree", url: "https://linktr.ee/compbioatberkeley" }, |
32 | 52 | ]; |
33 | 53 |
|
34 | 54 | const SignUp = () => ( |
35 | 55 | <div> |
36 | 56 | <PageHeader |
37 | | - eyebrow="05 / sign up" |
| 57 | + eyebrow="Stay connected" |
38 | 58 | title="Join our community" |
39 | 59 | lede="Stay connected with Computational Biology at Berkeley and be the first to know about events, opportunities, and updates." |
40 | 60 | /> |
41 | 61 |
|
42 | 62 | <section className="mx-auto max-w-6xl px-4 py-16 sm:px-6 md:py-20 lg:px-8"> |
43 | | - <div className="grid items-start gap-4 lg:grid-cols-3"> |
| 63 | + <div className="grid gap-4 lg:grid-cols-[1.15fr_0.85fr]"> |
| 64 | + <article className="overflow-hidden rounded border border-border bg-card lg:col-span-2"> |
| 65 | + <div className="grid lg:grid-cols-[minmax(280px,0.72fr)_1.28fr]"> |
| 66 | + <a |
| 67 | + href={RECRUITMENT_POST} |
| 68 | + target="_blank" |
| 69 | + rel="noopener noreferrer" |
| 70 | + aria-label="View the Fall 2026 recruitment timeline on Instagram (opens in a new tab)" |
| 71 | + className="group relative block overflow-hidden bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring" |
| 72 | + > |
| 73 | + <img |
| 74 | + src={publicAssetPath("/recruitment/fa26/recruitment-timeline.webp")} |
| 75 | + alt="Fall 2026 recruitment timeline: applications open August 26, Calapalooza August 27, info sessions September 2 and 7, officers event September 3, applicant social September 8, applications due September 11 at 5 PM, and interviews September 12–13." |
| 76 | + width="1080" |
| 77 | + height="1350" |
| 78 | + loading="eager" |
| 79 | + decoding="async" |
| 80 | + className="h-full max-h-[42rem] w-full object-cover object-top transition-transform duration-300 group-hover:scale-[1.015]" |
| 81 | + /> |
| 82 | + <span className="absolute inset-x-4 bottom-4 flex items-center justify-between gap-3 rounded bg-background/95 px-4 py-3 text-sm font-bold text-heading shadow-sm backdrop-blur-sm"> |
| 83 | + View the original post |
| 84 | + <ExternalLink className="h-4 w-4 shrink-0 text-link" aria-hidden="true" /> |
| 85 | + </span> |
| 86 | + </a> |
| 87 | + |
| 88 | + <div className="flex flex-col justify-center p-6 md:p-8 lg:p-10"> |
| 89 | + <p className="eyebrow">Fall 2026 recruitment</p> |
| 90 | + <h2 className="mt-3 text-3xl font-bold text-heading">Recruitment starts August 26</h2> |
| 91 | + <p className="mt-4 max-w-[52ch] text-sm leading-relaxed text-muted-foreground"> |
| 92 | + Applications and coffee chats open August 26. Meet us at Calapalooza, join an info |
| 93 | + session, and get to know our project managers and officers before applications close |
| 94 | + September 11 at 5 PM. |
| 95 | + </p> |
| 96 | + |
| 97 | + <div className="mt-7 flex flex-wrap gap-3"> |
| 98 | + <EnhancedButton asChild variant="gold" size="lg"> |
| 99 | + <a href={INTEREST_FORM} target="_blank" rel="noopener noreferrer"> |
| 100 | + Express interest |
| 101 | + <ExternalLink /> |
| 102 | + <span className="sr-only"> (opens in a new tab)</span> |
| 103 | + </a> |
| 104 | + </EnhancedButton> |
| 105 | + <EnhancedButton asChild variant="outline" size="lg"> |
| 106 | + <a href={RECRUITMENT_POST} target="_blank" rel="noopener noreferrer"> |
| 107 | + View timeline on Instagram |
| 108 | + <ExternalLink /> |
| 109 | + <span className="sr-only"> (opens in a new tab)</span> |
| 110 | + </a> |
| 111 | + </EnhancedButton> |
| 112 | + </div> |
| 113 | + </div> |
| 114 | + </div> |
| 115 | + </article> |
| 116 | + |
44 | 117 | {forms.map((form) => ( |
45 | | - <article key={form.n} className="flex flex-col overflow-hidden rounded border border-border bg-card"> |
46 | | - <div className="border-b border-border p-5"> |
47 | | - <p className="text-[11px] text-label">[{form.n}]</p> |
48 | | - <h2 className="mt-2 text-lg font-bold text-heading">{form.title}</h2> |
49 | | - <p className="mt-2 text-sm leading-relaxed text-muted-foreground">{form.body}</p> |
| 118 | + <article |
| 119 | + key={form.title} |
| 120 | + className={ |
| 121 | + form.featured |
| 122 | + ? "relative isolate flex min-h-64 flex-col overflow-hidden rounded border border-primary bg-primary p-6 text-primary-foreground md:p-8" |
| 123 | + : "relative isolate flex min-h-64 flex-col overflow-hidden rounded border border-border bg-card p-6 md:p-8" |
| 124 | + } |
| 125 | + > |
| 126 | + <div className="pointer-events-none absolute inset-0 -z-10" aria-hidden="true"> |
| 127 | + <img |
| 128 | + src={publicAssetPath(form.preview)} |
| 129 | + alt="" |
| 130 | + width="960" |
| 131 | + height="600" |
| 132 | + loading="lazy" |
| 133 | + decoding="async" |
| 134 | + draggable="false" |
| 135 | + className={ |
| 136 | + form.featured |
| 137 | + ? "h-full w-full object-cover object-top opacity-[0.18] grayscale contrast-75" |
| 138 | + : "h-full w-full object-cover object-top opacity-[0.14] grayscale contrast-75 dark:opacity-[0.1]" |
| 139 | + } |
| 140 | + /> |
| 141 | + <span |
| 142 | + className={ |
| 143 | + form.featured |
| 144 | + ? "absolute inset-0 bg-gradient-to-r from-primary via-primary/95 to-primary/70" |
| 145 | + : "absolute inset-0 bg-gradient-to-r from-card via-card/95 to-card/75" |
| 146 | + } |
| 147 | + /> |
50 | 148 | </div> |
51 | | - <iframe |
52 | | - src={form.src} |
53 | | - title={form.label} |
54 | | - className="h-[400px] w-full border-0 bg-background" |
55 | | - loading="lazy" |
56 | | - > |
57 | | - Loading... |
58 | | - </iframe> |
59 | | - <div className="border-t border-border p-4"> |
60 | | - <EnhancedButton asChild variant="outline" size="sm" className="w-full"> |
61 | | - <a href={form.src} target="_blank" rel="noopener noreferrer"> |
62 | | - open in new tab |
63 | | - <ExternalLink /> |
64 | | - </a> |
65 | | - </EnhancedButton> |
| 149 | + |
| 150 | + <div className="flex flex-1 flex-col"> |
| 151 | + <div> |
| 152 | + <p |
| 153 | + className={ |
| 154 | + form.featured |
| 155 | + ? "text-[11px] uppercase tracking-[0.14em] text-primary-foreground/75" |
| 156 | + : "eyebrow" |
| 157 | + } |
| 158 | + > |
| 159 | + {form.eyebrow} |
| 160 | + </p> |
| 161 | + <h2 |
| 162 | + className={ |
| 163 | + form.featured |
| 164 | + ? "mt-3 text-2xl font-bold text-primary-foreground" |
| 165 | + : "mt-3 text-2xl font-bold text-heading" |
| 166 | + } |
| 167 | + > |
| 168 | + {form.title} |
| 169 | + </h2> |
| 170 | + <p |
| 171 | + className={ |
| 172 | + form.featured |
| 173 | + ? "mt-3 max-w-[48ch] text-sm leading-relaxed text-primary-foreground/80" |
| 174 | + : "mt-3 max-w-[48ch] text-sm leading-relaxed text-muted-foreground" |
| 175 | + } |
| 176 | + > |
| 177 | + {form.body} |
| 178 | + </p> |
| 179 | + </div> |
| 180 | + |
| 181 | + <div className="mt-auto pt-8"> |
| 182 | + <EnhancedButton |
| 183 | + asChild |
| 184 | + variant={form.featured ? "gold" : "outline"} |
| 185 | + size="lg" |
| 186 | + className="w-full sm:w-auto" |
| 187 | + > |
| 188 | + <a href={form.src} target="_blank" rel="noopener noreferrer"> |
| 189 | + {form.cta} |
| 190 | + <ExternalLink /> |
| 191 | + <span className="sr-only"> (opens in a new tab)</span> |
| 192 | + </a> |
| 193 | + </EnhancedButton> |
| 194 | + </div> |
66 | 195 | </div> |
67 | 196 | </article> |
68 | 197 | ))} |
69 | 198 |
|
70 | | - <article className="flex min-h-[526px] flex-col overflow-hidden rounded border border-border bg-card lg:min-h-0 lg:self-stretch"> |
71 | | - <div className="border-b border-border p-5"> |
72 | | - <p className="text-[11px] text-label">[03]</p> |
73 | | - <h2 className="mt-2 text-lg font-bold text-heading">Connect with us</h2> |
74 | | - <p className="mt-2 text-sm leading-relaxed text-muted-foreground"> |
75 | | - Follow along between meetings. Events, recaps, and opportunities go out here first. |
76 | | - </p> |
77 | | - </div> |
| 199 | + <article className="rounded border border-border bg-card p-6 md:p-8 lg:col-span-2"> |
| 200 | + <div className="grid gap-8 lg:grid-cols-[0.72fr_1.28fr] lg:items-center"> |
| 201 | + <div> |
| 202 | + <p className="eyebrow">Social channels</p> |
| 203 | + <h2 className="mt-3 text-2xl font-bold text-heading">Connect with us</h2> |
| 204 | + <p className="mt-3 max-w-[42ch] text-sm leading-relaxed text-muted-foreground"> |
| 205 | + Follow along between meetings. Events, recaps, and opportunities go out here first. |
| 206 | + </p> |
| 207 | + </div> |
78 | 208 |
|
79 | | - <div className="flex flex-1 flex-col gap-2 p-5"> |
80 | | - {socials.map((social) => ( |
81 | | - <a |
82 | | - key={social.name} |
83 | | - href={social.url} |
84 | | - target="_blank" |
85 | | - rel="noopener noreferrer" |
86 | | - className="flex min-h-11 items-center justify-between rounded border border-border px-4 text-[13px] text-heading hover:border-border-strong hover:bg-muted hover:text-heading" |
87 | | - > |
88 | | - {social.name} |
89 | | - <ExternalLink className="h-4 w-4 text-muted-foreground" /> |
90 | | - </a> |
91 | | - ))} |
92 | | - <p className="mt-auto border-t border-border pt-4 text-sm leading-relaxed text-muted-foreground"> |
93 | | - Questions? Reach out through any of these platforms and we will get back to you soon. |
94 | | - </p> |
| 209 | + <div className="grid gap-3 sm:grid-cols-3"> |
| 210 | + {socials.map((social) => { |
| 211 | + const Icon = social.icon; |
| 212 | + |
| 213 | + return ( |
| 214 | + <a |
| 215 | + key={social.name} |
| 216 | + href={social.url} |
| 217 | + target="_blank" |
| 218 | + rel="noopener noreferrer" |
| 219 | + aria-label={`Visit ${social.name} (opens in a new tab)`} |
| 220 | + className="flex min-h-28 items-center gap-4 rounded border border-border bg-background p-4 text-heading transition-colors duration-150 hover:border-border-strong hover:bg-muted hover:text-heading focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background" |
| 221 | + > |
| 222 | + <Icon className="h-9 w-9 shrink-0 text-link" aria-hidden="true" /> |
| 223 | + <span className="min-w-0"> |
| 224 | + <span className="flex items-center gap-1.5 text-sm font-bold"> |
| 225 | + {social.name} |
| 226 | + <ExternalLink className="h-3.5 w-3.5 text-muted-foreground" aria-hidden="true" /> |
| 227 | + </span> |
| 228 | + <span className="mt-1 block truncate text-xs text-muted-foreground"> |
| 229 | + {social.detail} |
| 230 | + </span> |
| 231 | + </span> |
| 232 | + </a> |
| 233 | + ); |
| 234 | + })} |
| 235 | + </div> |
95 | 236 | </div> |
96 | 237 | </article> |
97 | 238 | </div> |
|
0 commit comments