Skip to content

Commit 6155cbf

Browse files
committed
Enhance ScrollToTop functionality with navigation on hash targets, update sponsorship tiers with XAF equivalents, improve theme initialization logic, and refine light theme styles for better visual consistency.
Signed-off-by: Steve Yonkeu <yokwejuste@yahoo.com>
1 parent 70d57de commit 6155cbf

File tree

5 files changed

+147
-30
lines changed

5 files changed

+147
-30
lines changed

src/components/ScrollToTop.jsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
import React, { useState, useEffect } from 'react';
2-
import { useLocation } from 'react-router-dom';
2+
import { useLocation, useNavigate } from 'react-router-dom';
33

44
const ScrollToTop = () => {
55
const [isVisible, setIsVisible] = useState(false);
6-
const { pathname, hash } = useLocation();
6+
const { pathname, hash, search } = useLocation();
7+
const navigate = useNavigate();
78

89
// Scroll to top on route change, or to hash target if present
910
useEffect(() => {
1011
if (hash) {
1112
const el = document.getElementById(hash.slice(1));
1213
if (el) {
13-
setTimeout(() => el.scrollIntoView({ behavior: 'smooth' }), 100);
14+
setTimeout(() => {
15+
el.scrollIntoView({ behavior: 'smooth' });
16+
navigate(pathname + search, { replace: true });
17+
}, 100);
1418
return;
1519
}
1620
}
1721
window.scrollTo(0, 0);
18-
}, [pathname, hash]);
22+
}, [pathname, hash, search, navigate]);
1923

2024
// Show button when scrolling down
2125
useEffect(() => {

src/data/sponsors.js

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const internationalTiers = [
55
name: 'Diamond',
66
className: 'diamond',
77
price: 'USD 5,000',
8+
xafEquivalent: 'XAF 2,625,000',
89
description: 'The ultimate sponsorship package for maximum visibility and impact.',
910
features: [
1011
'Premium booth placement',
@@ -16,13 +17,13 @@ export const internationalTiers = [
1617
'Dedicated sponsor page on website',
1718
'Mention in all press releases',
1819
],
19-
btnClass: 'btn btn-primary btn-diamond',
20-
btnStyle: { width: '100%', background: '#b9f2ff', color: 'var(--color-dark)', border: '1px solid #b9f2ff' },
20+
btnClass: 'btn btn-tier btn-diamond',
2121
},
2222
{
2323
name: 'Gold',
2424
className: 'gold',
2525
price: 'USD 3,500',
26+
xafEquivalent: 'XAF 1,837,500',
2627
description: 'Excellent visibility and engagement opportunities.',
2728
features: [
2829
'Exhibition booth',
@@ -32,48 +33,47 @@ export const internationalTiers = [
3233
'Tier 2 logo placement on website',
3334
'Mention in press releases',
3435
],
35-
btnClass: 'btn btn-primary btn-gold',
36-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid var(--color-gold)', color: 'var(--color-gold)' },
36+
btnClass: 'btn btn-tier btn-gold',
3737
},
3838
{
3939
name: 'Silver',
4040
className: 'silver',
4141
price: 'USD 2,000',
42+
xafEquivalent: 'XAF 1,050,000',
4243
description: 'Great value for companies looking to support the community.',
4344
features: [
4445
'1 speaking slot',
4546
'3 conference tickets',
4647
'Tier 3 logo placement on website',
4748
],
48-
btnClass: 'btn btn-primary btn-silver',
49-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid #c0c0c0', color: '#c0c0c0' },
49+
btnClass: 'btn btn-tier btn-silver',
5050
},
5151
{
5252
name: 'Bronze',
5353
className: 'bronze',
5454
price: 'USD 1,000',
55+
xafEquivalent: 'XAF 525,000',
5556
description: 'Ideal for startups and smaller organizations.',
5657
features: [
5758
'1 speaking slot',
5859
'1 conference ticket',
5960
'Company logo on website',
6061
'Branding on select materials',
6162
],
62-
btnClass: 'btn btn-primary btn-bronze',
63-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid #cd7f32', color: '#cd7f32' },
63+
btnClass: 'btn btn-tier btn-bronze',
6464
},
6565
{
6666
name: 'Community',
6767
className: 'community',
6868
price: 'USD 500',
69+
xafEquivalent: 'XAF 262,500',
6970
description: 'Ideal for startups and smaller organizations.',
7071
features: [
7172
'1 conference ticket',
7273
'Company logo on website',
7374
'Branding on select materials',
7475
],
75-
btnClass: 'btn btn-primary',
76-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid var(--color-green)', color: 'var(--color-green)' },
76+
btnClass: 'btn btn-tier btn-community',
7777
},
7878
];
7979

@@ -94,8 +94,7 @@ export const localTiers = [
9494
'Dedicated sponsor page on website',
9595
'Mention in all press releases',
9696
],
97-
btnClass: 'btn btn-primary btn-diamond',
98-
btnStyle: { width: '100%', background: '#b9f2ff', color: 'var(--color-dark)', border: '1px solid #b9f2ff' },
97+
btnClass: 'btn btn-tier btn-diamond',
9998
},
10099
{
101100
name: 'Gold',
@@ -111,8 +110,7 @@ export const localTiers = [
111110
'Tier 2 logo placement on website',
112111
'Mention in press releases',
113112
],
114-
btnClass: 'btn btn-primary btn-gold',
115-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid var(--color-gold)', color: 'var(--color-gold)' },
113+
btnClass: 'btn btn-tier btn-gold',
116114
},
117115
{
118116
name: 'Silver',
@@ -126,8 +124,7 @@ export const localTiers = [
126124
'Conference signage with branding',
127125
'Tier 3 logo placement on website',
128126
],
129-
btnClass: 'btn btn-primary btn-silver',
130-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid #c0c0c0', color: '#c0c0c0' },
127+
btnClass: 'btn btn-tier btn-silver',
131128
},
132129
{
133130
name: 'Bronze',
@@ -141,8 +138,7 @@ export const localTiers = [
141138
'Company logo on website',
142139
'Branding on select materials',
143140
],
144-
btnClass: 'btn btn-primary btn-bronze',
145-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid #cd7f32', color: '#cd7f32' },
141+
btnClass: 'btn btn-tier btn-bronze',
146142
},
147143
{
148144
name: 'Community',
@@ -155,7 +151,6 @@ export const localTiers = [
155151
'Company logo on website',
156152
'Branding on select materials',
157153
],
158-
btnClass: 'btn btn-primary',
159-
btnStyle: { width: '100%', background: 'var(--color-dark)', border: '1px solid var(--color-green)', color: 'var(--color-green)' },
154+
btnClass: 'btn btn-tier btn-community',
160155
},
161156
];

src/hooks/useTheme.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useState, useEffect, useCallback } from 'react';
33
function getInitialTheme() {
44
const saved = localStorage.getItem('pycon-theme');
55
if (saved === 'light' || saved === 'dark') return saved;
6+
if (window.matchMedia?.('(prefers-color-scheme: light)').matches) return 'light';
67
return 'dark';
78
}
89

src/index.css

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,22 @@
126126
}
127127

128128
[data-theme="light"] .hero-background {
129-
opacity: 0.15;
130-
filter: blur(2px) saturate(0.6);
129+
opacity: 0.45;
130+
filter: blur(2px) saturate(0.85);
131131
}
132132

133133
[data-theme="light"] .hero-overlay {
134-
background: rgba(245, 245, 245, 0.75) !important;
134+
background: linear-gradient(180deg,
135+
rgba(245, 245, 245, 0.55) 0%,
136+
rgba(245, 245, 245, 0.7) 50%,
137+
rgba(245, 245, 245, 0.9) 100%) !important;
135138
}
136139

137140
[data-theme="light"] .hero-title,
138141
[data-theme="light"] .hero-subtitle,
139142
[data-theme="light"] .hero-date {
140143
color: #1a1a1a;
144+
text-shadow: 0 1px 3px rgba(255, 255, 255, 0.6);
141145
}
142146

143147
[data-theme="light"] .hero-title .highlight {
@@ -259,7 +263,69 @@
259263

260264
[data-theme="light"] .sponsor-card {
261265
background: #ffffff;
262-
border: 1px solid rgba(0, 0, 0, 0.08);
266+
border: 2px solid rgba(0, 0, 0, 0.08);
267+
}
268+
269+
[data-theme="light"] .sponsor-card.diamond {
270+
border-color: #00b8d4;
271+
}
272+
273+
[data-theme="light"] .sponsor-card.diamond .sponsor-tier {
274+
color: #00838f;
275+
}
276+
277+
[data-theme="light"] .sponsor-card.gold {
278+
border-color: #c9a800;
279+
}
280+
281+
[data-theme="light"] .sponsor-card.gold .sponsor-tier {
282+
color: #b8860b;
283+
}
284+
285+
[data-theme="light"] .sponsor-card.silver {
286+
border-color: #909090;
287+
}
288+
289+
[data-theme="light"] .sponsor-card.silver .sponsor-tier {
290+
color: #666666;
291+
}
292+
293+
[data-theme="light"] .sponsor-card.bronze {
294+
border-color: #cd7f32;
295+
}
296+
297+
[data-theme="light"] .sponsor-card.bronze .sponsor-tier {
298+
color: #8b5a2b;
299+
}
300+
301+
[data-theme="light"] .btn-tier.btn-diamond {
302+
background: #00b8d4;
303+
color: #ffffff;
304+
border-color: #00b8d4;
305+
}
306+
307+
[data-theme="light"] .btn-tier.btn-gold {
308+
background: #b8860b;
309+
color: #ffffff;
310+
border-color: #b8860b;
311+
}
312+
313+
[data-theme="light"] .btn-tier.btn-silver {
314+
background: #666666;
315+
color: #ffffff;
316+
border-color: #666666;
317+
}
318+
319+
[data-theme="light"] .btn-tier.btn-bronze {
320+
background: #8b5a2b;
321+
color: #ffffff;
322+
border-color: #8b5a2b;
323+
}
324+
325+
[data-theme="light"] .btn-tier.btn-community {
326+
background: #2d8f4e;
327+
color: #ffffff;
328+
border-color: #2d8f4e;
263329
}
264330

265331
[data-theme="light"] .timeline-item {
@@ -886,6 +952,40 @@ p {
886952
}
887953

888954
/* Specific Tier Buttons */
955+
.btn-tier {
956+
width: 100%;
957+
}
958+
959+
.btn-tier.btn-diamond {
960+
background: #b9f2ff;
961+
color: #0d0d0d;
962+
border-color: #b9f2ff;
963+
}
964+
965+
.btn-tier.btn-gold {
966+
background: #1a1a1a;
967+
color: #d4aa00;
968+
border-color: #d4aa00;
969+
}
970+
971+
.btn-tier.btn-silver {
972+
background: #1a1a1a;
973+
color: #c0c0c0;
974+
border-color: #c0c0c0;
975+
}
976+
977+
.btn-tier.btn-bronze {
978+
background: #1a1a1a;
979+
color: #cd7f32;
980+
border-color: #cd7f32;
981+
}
982+
983+
.btn-tier.btn-community {
984+
background: #1a1a1a;
985+
color: #2d8f4e;
986+
border-color: #2d8f4e;
987+
}
988+
889989
.btn-diamond::before {
890990
background-image: var(--bg-beaded);
891991
}
@@ -2486,6 +2586,18 @@ img {
24862586
margin-bottom: var(--spacing-sm);
24872587
}
24882588

2589+
.sponsor-price .price-hover {
2590+
display: none;
2591+
}
2592+
2593+
.sponsor-card:hover .price-hover {
2594+
display: inline;
2595+
}
2596+
2597+
.sponsor-card:hover .price-hover ~ .price-default {
2598+
display: none;
2599+
}
2600+
24892601
.sponsor-features {
24902602
margin: var(--spacing-md) 0;
24912603
}

src/pages/Sponsor.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,12 @@ const Sponsor = () => {
174174
<div key={tier.name} className={`card sponsor-card ${tier.className} animate-on-scroll slide-up`}
175175
style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
176176
<div className="sponsor-tier">{tier.name === 'Community' ? t('sponsor.communityPackage') : `${tier.name} ${t('sponsor.tier')}`}</div>
177-
<div className="sponsor-price">{tier.price}</div>
177+
<div className="sponsor-price">
178+
{tier.xafEquivalent && (
179+
<span className="price-hover">{tier.price}{tier.xafEquivalent}</span>
180+
)}
181+
<span className="price-default">{tier.price}</span>
182+
</div>
178183
{tier.priceNote && (
179184
<div style={{ fontSize: '0.9rem', color: 'var(--color-text-muted)', marginBottom: 'var(--spacing-md)' }}>
180185
({tier.priceNote})
@@ -193,7 +198,7 @@ const Sponsor = () => {
193198

194199
<a href={`mailto:organizers@pythoncameroon.org?subject=${tier.name} Sponsorship Inquiry`}
195200
className={tier.btnClass}
196-
style={{ ...tier.btnStyle, marginTop: 'auto' }}>{t('sponsor.select')} {tier.name}</a>
201+
style={{ marginTop: 'auto' }}>{t('sponsor.select')} {tier.name}</a>
197202
</div>
198203
))}
199204
</div>

0 commit comments

Comments
 (0)