Skip to content

Commit 3366e79

Browse files
authored
Merge pull request #186 from gdg-ibadan01/staging
Implement partnership section components and manual payment refetch
2 parents 096c92f + 6facda2 commit 3366e79

20 files changed

Lines changed: 576 additions & 42 deletions
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use client';
2+
3+
import { FC } from 'react';
4+
import {
5+
PartnershipHeader,
6+
PartnershipBenefits,
7+
PartnershipContactSection,
8+
} from './partnership';
9+
10+
const CallForPartnership: FC = () => {
11+
return (
12+
<section
13+
id="partnership"
14+
className="w-full bg-white border-t border-[#E2DFD8]"
15+
>
16+
<div className="w-full md:max-w-[1138px] mx-auto px-4 sm:px-6 lg:px-24 py-24 md:py-48 lg:py-96">
17+
{/* Section Header */}
18+
<PartnershipHeader />
19+
20+
{/* Two Columns: Why Partner (Left) & Contact Leads (Right) */}
21+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-[32px] lg:gap-[48px] items-stretch">
22+
<PartnershipBenefits />
23+
<PartnershipContactSection />
24+
</div>
25+
</div>
26+
</section>
27+
);
28+
};
29+
30+
export default CallForPartnership;
31+
export * from './partnership';

app/component/CallForSpeakers.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@ import { motion } from 'framer-motion';
66

77
const submissionSteps = [
88
{
9-
title: 'Applications Open',
9+
title: 'Applications open',
1010
description: 'Submit your topic and abstract',
1111
dotColor: '#34A853', // Green
1212
},
1313
{
14-
title: 'Review Period',
14+
title: 'Review period',
1515
description: 'Our team reviews all submissions',
1616
dotColor: '#FBBC04', // Yellow
1717
},
1818
{
19-
title: 'Speakers Announced',
19+
title: 'Speakers announced',
2020
description: 'Selected speakers notified via email',
2121
dotColor: '#EA4335', // Red
2222
},
2323
{
24-
title: 'Event Day — 21st Nov 2026',
24+
title: 'Event day — 21st Nov 2026',
2525
description: 'Take the stage at DevFest Ibadan',
2626
dotColor: '#4285F4', // Blue
2727
},
@@ -35,7 +35,7 @@ const statsData = [
3535
description: 'Expert talks, code labs, and pure technical vibes.',
3636
},
3737
{
38-
stat: '4+ TRACKS',
38+
stat: 'All TRACKS',
3939
color: '#EA4335', // Red
4040
label: 'WEB · MOBILE · AI · E.T.C',
4141
description:
@@ -53,7 +53,7 @@ const statsData = [
5353
color: '#4285F4', // Blue
5454
label: 'COMMUNITY LEGACY',
5555
description:
56-
'Celebrating 10+ years of empowering and connecting South-West devs.',
56+
'Celebrating 10+ years of empowering and connecting tech lovers and enthusiast',
5757
},
5858
];
5959

@@ -73,7 +73,7 @@ const CallForSpeakers: FC = () => {
7373
>
7474
<div className="border border-black rounded-3xl p-6 sm:p-8 md:p-[32px] bg-white shadow-sm">
7575
<h3 className="text-xs sm:text-sm font-mono font-bold tracking-widest text-black uppercase mb-7">
76-
SUBMISSION DETAILS
76+
SUBMISSION PROCESS
7777
</h3>
7878

7979
<div className="space-y-6 sm:space-y-7">
@@ -108,8 +108,8 @@ const CallForSpeakers: FC = () => {
108108
transition={{ duration: 0.5, delay: 0.1 }}
109109
className="flex flex-col items-start"
110110
>
111-
<h2 className="font-semibold text-4xl lg:text-[40px] xl:text-[48px] tracking-[0%] leading-[105%] text-[#111111] font-grotesk">
112-
Got Something Worth Sharing? Take the Stage.
111+
<h2 className="font-semibold text-4xl lg:text-[40px] xl:text-[48px] tracking-[0%] leading-[130%] sm:leading-[120%] text-[#111111] font-grotesk">
112+
Got something worth sharing? Take the stage.
113113
</h2>
114114

115115
<p className="mt-[10px] sm:mt-[20px] text-base sm:text-lg text-[#4B5563] leading-relaxed max-w-xl">

app/component/HowItGoesDown.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const eventCards: EventCard[] = [
3939
{
4040
eventTag: 'DEVFEST IBADAN 2026.',
4141
dateTag: 'OCT-NOV 2026',
42-
title: 'PreDevFest Series',
42+
title: 'PreDevFest series',
4343
label: 'LEAD-IN EXPERIENCE',
4444
description:
4545
'3 weekends of workshops, talks, and community sessions leading up to the main event (1 week gap between each).',
@@ -51,7 +51,7 @@ const eventCards: EventCard[] = [
5151
{
5252
eventTag: 'DEVFEST IBADAN 2026.',
5353
dateTag: '20 NOV 2026',
54-
title: 'Virtual Event',
54+
title: 'Virtual event',
5555
label: 'REMOTE ACCESS',
5656
description:
5757
'Join us online the Friday before D-Day. Keynotes, panels, and networking — from anywhere in the world.',
@@ -63,7 +63,7 @@ const eventCards: EventCard[] = [
6363
{
6464
eventTag: 'DEVFEST IBADAN 2026.',
6565
dateTag: '21 NOV 2026',
66-
title: 'Physical Event',
66+
title: 'Physical event',
6767
label: 'MAIN EVENT',
6868
description:
6969
'The main event! A full day of talks across all tracks, workshops, codelabs, sponsor booths, networking, and swag — live at Kakanfo Inn, Ibadan.',
@@ -86,9 +86,9 @@ const HowItGoesDown: FC = () => {
8686
whileInView={{ opacity: 1, y: 0 }}
8787
viewport={{ once: true }}
8888
transition={{ duration: 0.5 }}
89-
className="font-black text-3xl sm:text-4xl md:text-5xl text-black tracking-tight font-grotesk"
89+
className="font-black text-3xl sm:text-4xl md:text-5xl text-black tracking-tight leading-[125%] font-grotesk"
9090
>
91-
How It All Goes Down
91+
How it all goes down
9292
</motion.h2>
9393

9494
<motion.p

app/component/SwagsAndTickets.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,37 @@ import { SwagTicketCard, SwagTicketCardProps } from './SwagTicketCard';
66

77
const swagPerks = [
88
'Official DevFest T-Shirt & Lanyard',
9-
'Custom Sticker Pack & Notebook',
10-
'Access to Sponsor Booth Swags',
11-
'Conference Tote Bag & Badge and a lots more...',
9+
'Custom DevFest Slingshot & Notepad',
10+
'DevFest Bottle',
11+
'And More DevFest Goodies..',
1212
];
1313

1414
const ticketPerks = [
1515
'Entry pass to all tracks',
16-
'Exclusive DevFest Luncheon & Coffee',
16+
'Access to Sponsor Booth Swags',
1717
'Access to Workshop & Codelabs',
18-
'Networking Mixer with Global Speakers',
18+
'Networking Opportunities with Speakers & Attendees',
1919
];
2020

2121
const cardsData: SwagTicketCardProps[] = [
2222
{
23-
title: 'Get Swags',
23+
title: 'Get swags',
2424
category: 'STANDARD SWAG',
2525
description: 'Score the official DevFest Ibadan 2026 premium merch pack.',
2626
perks: swagPerks,
27-
buttonText: 'Buy Swags',
27+
buttonText: 'Buy swags',
2828
buttonHref: 'https://selar.co/m/gdg-ibadan1',
2929
isExternal: true,
3030
colorScheme: 'green',
3131
delay: 0,
3232
},
3333
{
34-
title: 'Get Tickets',
34+
title: 'Get tickets',
3535
category: 'ALL ACCESS PASS',
3636
description:
3737
'Reserve your guaranteed spot at the biggest developer experience in Ibadan.',
3838
perks: ticketPerks,
39-
buttonText: 'Get Tickets',
39+
buttonText: 'Get tickets',
4040
buttonHref: '/tickets/buy',
4141
colorScheme: 'red',
4242
delay: 0.15,
@@ -54,9 +54,9 @@ const SwagsAndTickets: FC = () => {
5454
whileInView={{ opacity: 1, y: 0 }}
5555
viewport={{ once: true }}
5656
transition={{ duration: 0.5 }}
57-
className="font-black text-3xl sm:text-4xl md:text-5xl text-black tracking-tight font-grotesk"
57+
className="font-black text-3xl sm:text-4xl md:text-5xl text-black tracking-tight leading-[125%] font-grotesk"
5858
>
59-
Swags &amp; Tickets
59+
Swags &amp; tickets
6060
</motion.h2>
6161

6262
<motion.p
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
'use client';
2+
3+
import { FC } from 'react';
4+
import { motion } from 'framer-motion';
5+
import { Sparkles } from 'lucide-react';
6+
import { PARTNERSHIP_BENEFITS } from './data';
7+
8+
export const PartnershipBenefits: FC = () => {
9+
return (
10+
<motion.div
11+
initial={{ opacity: 0, y: 20 }}
12+
whileInView={{ opacity: 1, y: 0 }}
13+
viewport={{ once: true }}
14+
transition={{ duration: 0.5 }}
15+
className="w-full max-w-xl mx-auto lg:mx-0 flex flex-col"
16+
>
17+
<div className="border border-black rounded-3xl p-6 sm:p-8 md:p-[32px] bg-white shadow-sm flex-1 flex flex-col justify-between">
18+
<div>
19+
<div className="flex items-center justify-between gap-2 mb-7">
20+
<h3 className="text-xs sm:text-sm font-mono font-bold tracking-widest text-black uppercase">
21+
WHY PARTNER WITH DEVFEST IBADAN
22+
</h3>
23+
<Sparkles className="w-4 h-4 text-[#FBBC04]" />
24+
</div>
25+
26+
<div className="space-y-6 sm:space-y-7">
27+
{PARTNERSHIP_BENEFITS.map((item) => (
28+
<div
29+
key={item.title}
30+
className="flex items-start gap-3.5 sm:gap-4"
31+
>
32+
<span
33+
className="w-3 h-3 rounded-full shrink-0 mt-1"
34+
style={{ backgroundColor: item.dotColor }}
35+
/>
36+
<div>
37+
<h4 className="font-mono font-bold text-sm sm:text-base text-black leading-snug">
38+
{item.title}
39+
</h4>
40+
<p className="text-xs sm:text-sm text-[#4B5563] mt-1 leading-relaxed">
41+
{item.description}
42+
</p>
43+
</div>
44+
</div>
45+
))}
46+
</div>
47+
</div>
48+
49+
<div className="mt-8 pt-6 border-t border-[#E2DFD8] flex items-center justify-between text-xs font-mono text-[#4B5563]">
50+
<span>CUSTOM SPONSORSHIP TIERS AVAILABLE</span>
51+
<span className="text-[#34A853] font-bold">2026 EDITION</span>
52+
</div>
53+
</div>
54+
</motion.div>
55+
);
56+
};
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
'use client';
2+
3+
import { FC } from 'react';
4+
import { Mail, Copy, Check, ArrowUpRight } from 'lucide-react';
5+
import { PartnerContact } from './types';
6+
7+
interface PartnershipContactCardProps {
8+
contact: PartnerContact;
9+
isCopied: boolean;
10+
onCopy: (email: string) => void;
11+
}
12+
13+
export const PartnershipContactCard: FC<PartnershipContactCardProps> = ({
14+
contact,
15+
isCopied,
16+
onCopy,
17+
}) => {
18+
const mailtoLink = `mailto:${contact.email}?subject=DevFest%20Ibadan%202026%20Partnership%20Inquiry`;
19+
20+
return (
21+
<div className="group border border-black/80 rounded-2xl p-4 sm:p-5 bg-[#FAFAFA] hover:bg-white transition-all duration-200 hover:shadow-md">
22+
<div className="flex items-center justify-between gap-3 mb-2">
23+
<div className="flex items-center gap-2.5">
24+
<span
25+
className="w-2.5 h-2.5 rounded-full"
26+
style={{ backgroundColor: contact.accentColor }}
27+
/>
28+
<h4 className="font-mono font-bold text-base text-black">
29+
{contact.name}
30+
</h4>
31+
</div>
32+
33+
<span
34+
className="text-[11px] font-mono font-bold px-2.5 py-0.5 rounded-xl uppercase"
35+
style={{
36+
backgroundColor: contact.badgeBg,
37+
color: '#111111',
38+
}}
39+
>
40+
{contact.role}
41+
</span>
42+
</div>
43+
44+
{/* Email row with clickable mailto and copy button */}
45+
<div className="flex items-center justify-between gap-2 mt-3 pt-3 border-t border-black/10">
46+
<a
47+
href={mailtoLink}
48+
className="font-mono text-xs sm:text-sm text-black hover:text-[#4285F4] transition-colors flex items-center gap-1.5 truncate font-medium"
49+
title={`Email ${contact.name}`}
50+
>
51+
<Mail className="w-3.5 h-3.5 shrink-0 text-[#4B5563]" />
52+
<span className="truncate">{contact.email}</span>
53+
<ArrowUpRight className="w-3.5 h-3.5 shrink-0 opacity-60 group-hover:opacity-100 group-hover:translate-x-0.5 group-hover:-translate-y-0.5 transition-transform" />
54+
</a>
55+
56+
<button
57+
type="button"
58+
onClick={() => onCopy(contact.email)}
59+
className="inline-flex items-center gap-1 px-2.5 py-1 text-xs font-mono rounded-lg border border-black/20 bg-white hover:bg-black hover:text-white transition-colors shrink-0"
60+
aria-label={`Copy ${contact.email}`}
61+
>
62+
{isCopied ? (
63+
<>
64+
<Check className="w-3 h-3 text-[#34A853]" />
65+
<span className="font-semibold text-[#34A853]">Copied!</span>
66+
</>
67+
) : (
68+
<>
69+
<Copy className="w-3 h-3" />
70+
<span>Copy</span>
71+
</>
72+
)}
73+
</button>
74+
</div>
75+
</div>
76+
);
77+
};

0 commit comments

Comments
 (0)