File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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 } /> ;
Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ import { HeroContent } from './hero-content';
66import { HeroTicker } from './hero-ticker' ;
77import GalleryGrid from '../gallery/gallery-grid' ;
88import { SectionHeader } from '../common/section-header' ;
9+ import { SponsorsTiers } from '../sponsors/sponsors-tiers' ;
910import type { HomeLandingCopy } from './types' ;
1011
1112export 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+ />
69+ < SponsorsTiers
70+ tiers = { copy . sponsors . tiers }
71+ ctaLabel = { copy . sponsors . cta . label }
72+ ctaLink = { copy . sponsors . cta . link }
73+ />
74+ </ section >
6075 </ main >
6176 </ >
6277 ) ;
Original file line number Diff line number Diff 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} ;
Original file line number Diff line number Diff line change 1+ 'use client' ;
2+
3+ // Note: Reverted to <img> tag to respect original SVG sizing as requested.
4+ // Using a white background for maximum contrast with dark/transparent logos.
5+ // Added grayscale-to-color hover effect.
6+
7+ type SponsorTier = {
8+ title : string ;
9+ subtitle : string ;
10+ badge : string ;
11+ items : {
12+ name : string ;
13+ logo ?: string ;
14+ link ?: string ;
15+ } [ ] ;
16+ } ;
17+
18+ type SponsorsTiersProps = {
19+ tiers : SponsorTier [ ] ;
20+ ctaLabel : string ;
21+ ctaLink : string ;
22+ } ;
23+
24+ export function SponsorsTiers ( { tiers, ctaLabel, ctaLink } : SponsorsTiersProps ) {
25+ return (
26+ < div className = "space-y-14" >
27+ { tiers . map ( ( tier ) => (
28+ < section key = { tier . title } className = "space-y-6" >
29+ < div className = "flex flex-col gap-4 border-b border-white/10 pb-4 md:flex-row md:items-end md:justify-between" >
30+ < div className = "flex items-center gap-3" >
31+ < h3 className = "font-display text-2xl uppercase tracking-tight text-white md:text-3xl" >
32+ { tier . title }
33+ </ h3 >
34+ < span className = "rounded-full border border-white/20 px-3 py-1 font-mono text-[10px] uppercase tracking-[0.2em] text-white/70" >
35+ { tier . badge }
36+ </ span >
37+ </ div >
38+ < p className = "max-w-xl font-mono text-xs uppercase tracking-[0.18em] text-white/55 md:text-right" >
39+ { tier . subtitle }
40+ </ p >
41+ </ div >
42+
43+ < div className = "grid grid-cols-2 gap-6 md:grid-cols-3 lg:grid-cols-4" >
44+ { tier . items . map ( ( sponsor ) => (
45+ < a
46+ key = { sponsor . name }
47+ href = { sponsor . link || '#' }
48+ target = "_blank"
49+ rel = "noopener noreferrer"
50+ className = "group relative flex items-center justify-center rounded-lg bg-white p-6 transition-all duration-300 hover:scale-105"
51+ >
52+ { sponsor . logo && (
53+ < img
54+ src = { sponsor . logo }
55+ alt = { sponsor . name }
56+ className = "grayscale transition-all duration-300 group-hover:grayscale-0"
57+ />
58+ ) }
59+ </ a >
60+ ) ) }
61+ </ div >
62+ </ section >
63+ ) ) }
64+
65+ < div className = "pt-2" >
66+ < a
67+ href = { ctaLink }
68+ target = "_blank"
69+ rel = "noopener noreferrer"
70+ 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"
71+ >
72+ { ctaLabel }
73+ </ a >
74+ </ div >
75+ </ div >
76+ ) ;
77+ }
Original file line number Diff line number Diff 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} ) ;
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 1+ {
2+ "header" : {
3+ "subheading" : " Commandites" ,
4+ "heading" : {
5+ "line1" : " Nos Sponsors" ,
6+ "line2" : " Construisons DevFest Ensemble"
7+ },
8+ "cta" : " Devenir Sponsor" ,
9+ "cta_link" : " https://forms.gle/xDCZe4ZuP98YoCAJ9"
10+ },
11+ "tiers" : [
12+ {
13+ "title" : " Sponsor Marquee" ,
14+ "subtitle" : " Partenaire principal qui propulse DevFest Montréal 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" : " Sponsor Or" ,
26+ "subtitle" : " Sponsor stratégique qui soutient la croissance des développeurs locaux." ,
27+ "badge" : " Or" ,
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" : " Sponsor Argent" ,
38+ "subtitle" : " Sponsor communautaire qui nous aide à connecter les talents de la ville." ,
39+ "badge" : " Argent" ,
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+ }
You can’t perform that action at this time.
0 commit comments