Skip to content

Commit 1dee4f0

Browse files
ChengaDevclaude
andcommitted
Add arena video hero, Play page, localization updates, and SEO improvements
- Add basketball arena video background to landing page hero with deferred loading (500ms after mount) so it never competes with LCP on critical path - Add Launch Clock CTA button with pulsing ring animation in hero - Add Play page (/play) with animated mode cards (clock, training, YouTube) - Wire Play link into Navigation and Footer - Redesign landing page mode cards and feature cards with SVG icons, TopBar/OrbGlow/Shimmer animation system - Fully localize feature card content and How It Works section title in all 5 languages (en, it, es, fr, el) - Update Shot Clock mode card title to "Shot Clock Operation" with TV/YouTube tip - Add pageBlurb SEO text below How It Works section on landing page - Fix OG/Twitter image tags missing from Helmet (now set dynamically per page) - Add inLanguage to WebSite and WebApplication schemas for multilingual pages - Remove duplicate WebApplication schema from LandingPage (SEO.tsx handles it) - Update index.html fallback meta/OG/Twitter tags to match current brand - Improve light theme colors for better contrast and vibrancy - Fix reaction training hint display bug and mobile button sizing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 922b13e commit 1dee4f0

18 files changed

Lines changed: 1716 additions & 48 deletions

public/arena.mp4

10.7 MB
Binary file not shown.

public/index.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,24 @@
77
<meta name="theme-color" content="#000000" />
88
<meta
99
name="description"
10-
content="Professional basketball shot clock training application. Practice your 24-second shot clock operation skills with real-time simulation. Perfect for referees, scorekeepers, and basketball enthusiasts."
10+
content="Free online basketball shot clock for fans, coaches, and referees. Start the 24-second countdown, apply the 14-second reset, and hear the buzzer — no download needed."
1111
/>
12-
<meta name="keywords" content="basketball shot clock, shot clock training, basketball referee, FIBA rules, basketball timer, shot clock simulator, basketball scoring" />
12+
<meta name="keywords" content="basketball shot clock, 24 second shot clock, shot clock online, basketball timer, FIBA shot clock, NBA shot clock, basketball referee tool, shot clock simulator, basketball scorekeeper" />
1313
<meta name="author" content="Chen Gazit" />
1414

1515
<!-- Open Graph / Facebook -->
1616
<meta property="og:type" content="website" />
1717
<meta property="og:url" content="https://www.24shotclock.com/" />
18-
<meta property="og:title" content="ShotClock Pro - Basketball Shot Clock Training" />
19-
<meta property="og:description" content="Professional basketball shot clock training application. Practice your 24-second shot clock operation skills with real-time simulation." />
18+
<meta property="og:title" content="ShotClock Pro – Free Online Basketball Shot Clock" />
19+
<meta property="og:description" content="Free online basketball shot clock for fans, coaches, and referees. Start the 24-second countdown, apply the 14-second reset, and hear the buzzer — no download needed." />
2020
<meta property="og:image" content="%PUBLIC_URL%/og-image.png" />
2121
<meta property="og:image:alt" content="ShotClock Pro — free online basketball shot clock" />
2222

2323
<!-- Twitter -->
2424
<meta property="twitter:card" content="summary_large_image" />
2525
<meta property="twitter:url" content="https://www.24shotclock.com/" />
26-
<meta property="twitter:title" content="ShotClock Pro - Basketball Shot Clock Training" />
27-
<meta property="twitter:description" content="Professional basketball shot clock training application. Practice your 24-second shot clock operation skills with real-time simulation." />
26+
<meta property="twitter:title" content="ShotClock Pro – Free Online Basketball Shot Clock" />
27+
<meta property="twitter:description" content="Free online basketball shot clock for fans, coaches, and referees. Start the 24-second countdown, apply the 14-second reset, and hear the buzzer — no download needed." />
2828
<meta property="twitter:image" content="%PUBLIC_URL%/og-image.png" />
2929
<meta property="twitter:image:alt" content="ShotClock Pro — free online basketball shot clock" />
3030

@@ -55,7 +55,7 @@
5555
async
5656
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"
5757
></script>
58-
<title>ShotClock Pro - Basketball Shot Clock Training</title>
58+
<title>ShotClock Pro – Free Online Basketball Shot Clock</title>
5959
<!-- Preload clock font so it's ready before React renders the display -->
6060
<link rel="preload" href="/fonts/DSEG14ClassicRegular.ttf" as="font" type="font/ttf" crossorigin="anonymous" fetchpriority="high" />
6161
<style>

public/sitemap.xml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,34 @@
6464
<xhtml:link rel="alternate" hreflang="x-default" href="https://www.24shotclock.com/faq"/>
6565
</url>
6666

67+
<!-- Play page -->
68+
<url>
69+
<loc>https://www.24shotclock.com/play</loc>
70+
<lastmod>2026-04-16</lastmod>
71+
<changefreq>weekly</changefreq>
72+
<priority>0.9</priority>
73+
<xhtml:link rel="alternate" hreflang="en" href="https://www.24shotclock.com/play"/>
74+
<xhtml:link rel="alternate" hreflang="it" href="https://www.24shotclock.com/it/play"/>
75+
<xhtml:link rel="alternate" hreflang="es" href="https://www.24shotclock.com/es/play"/>
76+
<xhtml:link rel="alternate" hreflang="fr" href="https://www.24shotclock.com/fr/play"/>
77+
<xhtml:link rel="alternate" hreflang="el" href="https://www.24shotclock.com/el/play"/>
78+
<xhtml:link rel="alternate" hreflang="x-default" href="https://www.24shotclock.com/play"/>
79+
</url>
80+
81+
<!-- Clock page -->
82+
<url>
83+
<loc>https://www.24shotclock.com/clock</loc>
84+
<lastmod>2026-04-16</lastmod>
85+
<changefreq>weekly</changefreq>
86+
<priority>0.9</priority>
87+
<xhtml:link rel="alternate" hreflang="en" href="https://www.24shotclock.com/clock"/>
88+
<xhtml:link rel="alternate" hreflang="it" href="https://www.24shotclock.com/it/clock"/>
89+
<xhtml:link rel="alternate" hreflang="es" href="https://www.24shotclock.com/es/clock"/>
90+
<xhtml:link rel="alternate" hreflang="fr" href="https://www.24shotclock.com/fr/clock"/>
91+
<xhtml:link rel="alternate" hreflang="el" href="https://www.24shotclock.com/el/clock"/>
92+
<xhtml:link rel="alternate" hreflang="x-default" href="https://www.24shotclock.com/clock"/>
93+
</url>
94+
6795
<!-- Privacy Policy (English only, no lang variants) -->
6896
<url>
6997
<loc>https://www.24shotclock.com/privacy-policy</loc>
@@ -73,6 +101,18 @@
73101
</url>
74102

75103
<!-- Italian -->
104+
<url>
105+
<loc>https://www.24shotclock.com/it/play</loc>
106+
<lastmod>2026-04-16</lastmod>
107+
<changefreq>weekly</changefreq>
108+
<priority>0.8</priority>
109+
</url>
110+
<url>
111+
<loc>https://www.24shotclock.com/it/clock</loc>
112+
<lastmod>2026-04-16</lastmod>
113+
<changefreq>weekly</changefreq>
114+
<priority>0.8</priority>
115+
</url>
76116
<url>
77117
<loc>https://www.24shotclock.com/it</loc>
78118
<lastmod>2026-04-07</lastmod>
@@ -105,6 +145,18 @@
105145
</url>
106146

107147
<!-- Spanish -->
148+
<url>
149+
<loc>https://www.24shotclock.com/es/play</loc>
150+
<lastmod>2026-04-16</lastmod>
151+
<changefreq>weekly</changefreq>
152+
<priority>0.8</priority>
153+
</url>
154+
<url>
155+
<loc>https://www.24shotclock.com/es/clock</loc>
156+
<lastmod>2026-04-16</lastmod>
157+
<changefreq>weekly</changefreq>
158+
<priority>0.8</priority>
159+
</url>
108160
<url>
109161
<loc>https://www.24shotclock.com/es</loc>
110162
<lastmod>2026-04-07</lastmod>
@@ -137,6 +189,18 @@
137189
</url>
138190

139191
<!-- French -->
192+
<url>
193+
<loc>https://www.24shotclock.com/fr/play</loc>
194+
<lastmod>2026-04-16</lastmod>
195+
<changefreq>weekly</changefreq>
196+
<priority>0.8</priority>
197+
</url>
198+
<url>
199+
<loc>https://www.24shotclock.com/fr/clock</loc>
200+
<lastmod>2026-04-16</lastmod>
201+
<changefreq>weekly</changefreq>
202+
<priority>0.8</priority>
203+
</url>
140204
<url>
141205
<loc>https://www.24shotclock.com/fr</loc>
142206
<lastmod>2026-04-07</lastmod>
@@ -169,6 +233,18 @@
169233
</url>
170234

171235
<!-- Greek -->
236+
<url>
237+
<loc>https://www.24shotclock.com/el/play</loc>
238+
<lastmod>2026-04-16</lastmod>
239+
<changefreq>weekly</changefreq>
240+
<priority>0.8</priority>
241+
</url>
242+
<url>
243+
<loc>https://www.24shotclock.com/el/clock</loc>
244+
<lastmod>2026-04-16</lastmod>
245+
<changefreq>weekly</changefreq>
246+
<priority>0.8</priority>
247+
</url>
172248
<url>
173249
<loc>https://www.24shotclock.com/el</loc>
174250
<lastmod>2026-04-15</lastmod>

src/App.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ import { useSpring, animated } from 'react-spring'
1313
import Themes from './constants/Themes'
1414

1515
const ShotClockPage = lazy(() => import('./components/ShotClockPage'))
16+
const LandingPage = lazy(() => import('./components/LandingPage'))
1617
const AboutUs = lazy(() => import('./components/AboutUs'))
1718
const Instructions = lazy(() => import('./components/Instructions'))
1819
const FIBAResources = lazy(() => import('./components/FIBAResources'))
1920
const FAQ = lazy(() => import('./components/FAQ'))
2021
const PrivacyPolicy = lazy(() => import('./components/PrivacyPolicy'))
2122
const NotFound = lazy(() => import('./components/NotFound'))
2223
const ReactionTrainingPage = lazy(() => import('./components/training/ReactionTrainingPage'))
24+
const PlayPage = lazy(() => import('./components/PlayPage'))
2325

2426
const NON_ENGLISH_LANGS = ['it', 'es', 'fr', 'el']
2527

@@ -92,7 +94,9 @@ const LangLayout = () => {
9294

9395
const pageRoutes = (
9496
<>
95-
<Route index element={
97+
<Route index element={<LandingPage />} />
98+
<Route path="play" element={<PlayPage />} />
99+
<Route path="clock" element={
96100
<>
97101
<ShotClockPage />
98102
<ShareButtons

src/AppRoutes.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const AppRoutes = (lang: string) => ({
44
FIBAResources: lang === 'en' ? '/fiba-resources' : `/${lang}/fiba-resources`,
55
About: lang === 'en' ? '/about' : `/${lang}/about`,
66
FAQ: lang === 'en' ? '/faq' : `/${lang}/faq`,
7+
Play: lang === 'en' ? '/play' : `/${lang}/play`,
8+
Clock: lang === 'en' ? '/clock' : `/${lang}/clock`,
79
ReactionTraining: lang === 'en' ? '/reaction-training' : `/${lang}/reaction-training`,
810
})
911

src/components/Footer.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import DonateButton from './DonateButton'
44
import LanguageSelector from './LanguageSelector'
55
import { useLocalization } from '../contexts/Language/LanguageProvider'
66
import AppRoutes from '../AppRoutes'
7-
import featureFlags from '../featureFlags'
87

98
const Footer = () => {
109
const { locals, languageCode } = useLocalization()
@@ -23,13 +22,11 @@ const Footer = () => {
2322
<FooterSection>
2423
<FooterTitle>{locals.quickLinks}</FooterTitle>
2524
<FooterLinks>
25+
<FooterNavLink to={routes.Play}>{locals.play}</FooterNavLink>
2626
<FooterNavLink to={routes.Instructions}>{locals.instructions}</FooterNavLink>
2727
<FooterNavLink to={routes.FIBAResources}>{locals.fibaResources}</FooterNavLink>
2828
<FooterNavLink to={routes.FAQ}>{locals.faq}</FooterNavLink>
2929
<FooterNavLink to={routes.About}>{locals.about}</FooterNavLink>
30-
{featureFlags.reactionTraining && (
31-
<FooterNavLink to={routes.ReactionTraining}>{locals.reactionTraining}</FooterNavLink>
32-
)}
3330
<FooterNavLink to="/privacy-policy">Privacy Policy</FooterNavLink>
3431
</FooterLinks>
3532
</FooterSection>

0 commit comments

Comments
 (0)