Skip to content

Commit 36d68fe

Browse files
authored
Merge pull request #5 from AndroidMontreal/feat/sponsor
Feat/sponsor
2 parents 768f44f + 54c2f5c commit 36d68fe

11 files changed

Lines changed: 232 additions & 3 deletions

File tree

public/assets/images/sponsors/gold_davidson_canada.svg

Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

public/assets/images/sponsors/silver_transit.svg

Lines changed: 1 addition & 0 deletions
Loading

src/app/[locale]/page.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default async function Home({
1414

1515
const t_home = await getTranslations({ locale, namespace: 'Home' });
1616
const t_gallery = await getTranslations({ locale, namespace: 'Gallery' });
17+
const t_sponsors = await getTranslations({ locale, namespace: 'Sponsors' });
1718

1819
const copy: HomeLandingCopy = {
1920
hero: {
@@ -66,9 +67,23 @@ export default async function Home({
6667
line1: t_gallery('header.heading.line1'),
6768
line2: t_gallery('header.heading.line2'),
6869
},
70+
},
71+
items: t_gallery.raw('items') as HomeLandingCopy['gallery']['items'],
72+
},
73+
sponsors: {
74+
header: {
75+
subheading: t_sponsors('header.subheading'),
76+
heading: {
77+
line1: t_sponsors('header.heading.line1'),
78+
line2: t_sponsors('header.heading.line2'),
6979
},
70-
items: t_gallery.raw('items'),
71-
},
80+
},
81+
cta: {
82+
label: t_sponsors('header.cta'),
83+
link: t_sponsors('header.cta_link'),
84+
},
85+
tiers: t_sponsors.raw('tiers') as HomeLandingCopy['sponsors']['tiers'],
86+
},
7287
};
7388

7489
return <HomeLanding copy={copy} />;

src/components/common/section-header.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ type SectionHeaderProps = {
44
subheading: string;
55
headingLine1: string;
66
headingLine2: string;
7+
headingLine2ClassName?: string;
78
};
89

910
export const SectionHeader = ({
1011
subheading,
1112
headingLine1,
1213
headingLine2,
14+
headingLine2ClassName = 'text-google-blue',
1315
}: SectionHeaderProps) => {
1416
return (
1517
<div className="mb-24 flex flex-col items-start justify-between gap-12 border-l-2 border-primary/10 pl-10 md:flex-row md:items-end">
@@ -20,7 +22,7 @@ export const SectionHeader = ({
2022
<h2 className="font-display text-4xl font-bold uppercase leading-[0.95] tracking-tighter text-on-surface sm:text-5xl md:text-7xl">
2123
<span className="font-light">{headingLine1}</span>
2224
<br />
23-
<span className="text-google-blue">{headingLine2}</span>
25+
<span className={headingLine2ClassName}>{headingLine2}</span>
2426
</h2>
2527
</div>
2628
</div>

src/components/home/home-landing.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { HeroContent } from './hero-content';
66
import { HeroTicker } from './hero-ticker';
77
import GalleryGrid from '../gallery/gallery-grid';
88
import { SectionHeader } from '../common/section-header';
9+
import { SponsorsTiers } from '../sponsors/sponsors-tiers';
910
import type { HomeLandingCopy } from './types';
1011

1112
export type { HomeLandingCopy } from './types';
@@ -57,6 +58,20 @@ export function HomeLanding({ copy }: HomeLandingProps) {
5758
/>
5859
<GalleryGrid items={copy.gallery.items} />
5960
</section>
61+
62+
{/* Sponsors Section */}
63+
<section className="mx-auto w-full max-w-[1440px] px-6 py-32 md:px-12">
64+
<SectionHeader
65+
subheading={copy.sponsors.header.subheading}
66+
headingLine1={copy.sponsors.header.heading.line1}
67+
headingLine2={copy.sponsors.header.heading.line2}
68+
headingLine2ClassName="text-google-yellow"
69+
/>
70+
<SponsorsTiers
71+
tiers={copy.sponsors.tiers}
72+
ctaLabel={copy.sponsors.cta.label}
73+
/>
74+
</section>
6075
</main>
6176
</>
6277
);

src/components/home/types.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,27 @@ export type HomeLandingCopy = {
5757
height: number;
5858
}[];
5959
};
60+
sponsors: {
61+
header: {
62+
subheading: string;
63+
heading: {
64+
line1: string;
65+
line2: string;
66+
};
67+
};
68+
cta: {
69+
label: string;
70+
link: string;
71+
};
72+
tiers: {
73+
title: string;
74+
subtitle: string;
75+
badge: string;
76+
items: {
77+
name: string;
78+
logo?: string;
79+
link?: string;
80+
}[];
81+
}[];
82+
};
6083
};
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'use client';
2+
3+
import Image from 'next/image';
4+
5+
type SponsorTier = {
6+
title: string;
7+
subtitle: string;
8+
badge: string;
9+
items: {
10+
name: string;
11+
logo?: string;
12+
link?: string;
13+
}[];
14+
};
15+
16+
type SponsorsTiersProps = {
17+
tiers: SponsorTier[];
18+
ctaLabel: string;
19+
};
20+
21+
export function SponsorsTiers({ tiers, ctaLabel }: SponsorsTiersProps) {
22+
return (
23+
<div className="space-y-14">
24+
{tiers.map((tier) => (
25+
<section key={tier.title} className="space-y-6">
26+
<div className="flex flex-col gap-4 border-b border-white/10 pb-4 md:flex-row md:items-end md:justify-between">
27+
<div className="flex items-center gap-3">
28+
<h3 className="font-display text-2xl uppercase tracking-tight text-white md:text-3xl">
29+
{tier.title}
30+
</h3>
31+
<span className="rounded-full border border-white/20 px-3 py-1 font-mono text-[10px] uppercase tracking-[0.2em] text-white/70">
32+
{tier.badge}
33+
</span>
34+
</div>
35+
<p className="max-w-xl font-mono text-xs uppercase tracking-[0.18em] text-white/55 md:text-right">
36+
{tier.subtitle}
37+
</p>
38+
</div>
39+
40+
<div className="flex flex-col items-center gap-12 md:flex-row md:flex-wrap md:justify-start md:gap-x-16 md:gap-y-12">
41+
{tier.items.map((sponsor) => (
42+
<a
43+
key={sponsor.name}
44+
href={sponsor.link || '#'}
45+
target="_blank"
46+
rel="noopener noreferrer"
47+
className="group inline-flex w-full max-w-[420px] flex-col items-center justify-center rounded-lg bg-white p-6 transition-all duration-300 hover:scale-105 md:w-auto"
48+
>
49+
{sponsor.logo && (
50+
<Image
51+
src={sponsor.logo}
52+
alt={sponsor.name}
53+
width={400}
54+
height={250}
55+
className="block h-auto w-auto max-w-full grayscale transition-all duration-300 group-hover:grayscale-0"
56+
/>
57+
)}
58+
</a>
59+
))}
60+
</div>
61+
</section>
62+
))}
63+
64+
<div className="pt-2">
65+
<div className="inline-flex items-center border border-white/25 px-5 py-3 font-mono-tech text-xs uppercase tracking-[0.2em] text-white transition-colors hover:border-google-blue hover:text-google-blue">
66+
{ctaLabel}
67+
</div>
68+
</div>
69+
</div>
70+
);
71+
}

src/i18n/request.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default getRequestConfig(async ({ requestLocale }) => {
1818
const home = (await import(`../messages/${locale}/home.json`)).default;
1919
const gallery = (await import(`../messages/${locale}/gallery.json`)).default;
2020
const footer = (await import(`../messages/${locale}/footer.json`)).default;
21+
const sponsors = (await import(`../messages/${locale}/sponsors.json`)).default;
2122

2223
return {
2324
locale,
@@ -28,6 +29,7 @@ export default getRequestConfig(async ({ requestLocale }) => {
2829
Home: home,
2930
Gallery: gallery,
3031
Footer: footer,
32+
Sponsors: sponsors,
3133
},
3234
};
3335
});

src/messages/en/sponsors.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"header": {
3+
"subheading": "Sponsorship",
4+
"heading": {
5+
"line1": "Our Sponsors",
6+
"line2": "Build DevFest With Us"
7+
},
8+
"cta": "Become a Sponsor",
9+
"cta_link": "https://forms.gle/xDCZe4ZuP98YoCAJ9"
10+
},
11+
"tiers": [
12+
{
13+
"title": "Marquee Sponsor",
14+
"subtitle": "Headline partner powering DevFest Montreal 2026.",
15+
"badge": "Marquee",
16+
"items": [
17+
{
18+
"name": "TELUS Digital",
19+
"logo": "/assets/images/sponsors/marquee_telus_digital.svg",
20+
"link": "https://www.telusdigital.com/"
21+
}
22+
]
23+
},
24+
{
25+
"title": "Gold Sponsor",
26+
"subtitle": "Strategic sponsor supporting local developer growth.",
27+
"badge": "Gold",
28+
"items": [
29+
{
30+
"name": "Davidson Canada",
31+
"logo": "/assets/images/sponsors/gold_davidson_canada.svg",
32+
"link": "https://www.davidson.group/nos-filiales/davidson-canada"
33+
}
34+
]
35+
},
36+
{
37+
"title": "Silver Sponsor",
38+
"subtitle": "Community sponsor helping us connect builders across the city.",
39+
"badge": "Silver",
40+
"items": [
41+
{
42+
"name": "Transit",
43+
"logo": "/assets/images/sponsors/silver_transit.svg",
44+
"link": "https://manifesto.transitapp.com/fr/jobs"
45+
}
46+
]
47+
}
48+
]
49+
}

0 commit comments

Comments
 (0)