Skip to content

Commit ee59780

Browse files
feat(landing): rebuild home into an ecosystem-integrated experience
Turn the single-hero landing page into a full developer/researcher funnel that surfaces the whole RocketPy ecosystem. Sections: sticky nav (text labels + persistent Simulate CTA + live GitHub star badge + mobile menu); reworked hero with `pip install rocketpy`, CTA cluster and micro social-proof; live stats band; four-class quickstart with syntax-highlighted, copyable code and an Open-in-Colab link; output showcase; auto-scrolling features carousel; validation + used-by wall; ecosystem cards (RocketSerializer / Infinity-API / App / Docs); R&D roadmap; community; how -to-cite with copyable BibTeX; final CTA; and an expanded footer with link columns. Live stats (GitHub stars/forks/contributors, recent PyPI downloads) are fetched at build time by scripts/fetch-stats.mjs and injected into dist, with static fallbacks and continue-on-error so a flaky API never breaks a deploy. A monthly cron redeploy keeps the numbers fresh. New css/home.css reuses the about.css component recipes so both pages read as one system; footer columns are additive so the About footer is unchanged. Accessibility: prefers-reduced-motion, skip link, focus rings and a noscript fallback. No new npm dependencies. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent a977dbd commit ee59780

11 files changed

Lines changed: 2807 additions & 172 deletions

File tree

.github/workflows/static.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ on:
99
# Allows you to run this workflow manually from the Actions tab
1010
workflow_dispatch:
1111

12+
# Monthly redeploy (1st of each month, 06:00 UTC) so the live stats injected
13+
# at build time (GitHub stars/forks/contributors, PyPI downloads) stay fresh
14+
# without needing a push. Scheduled runs always execute on the default branch.
15+
schedule:
16+
- cron: "0 6 1 * *"
17+
1218
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
1319
permissions:
1420
contents: read
@@ -40,6 +46,11 @@ jobs:
4046
run: npm ci
4147
- name: Build site
4248
run: npm run build
49+
- name: Refresh live stats
50+
run: npm run stats
51+
env:
52+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
53+
continue-on-error: true
4354
- name: Add .nojekyll
4455
run: touch dist/.nojekyll
4556
- name: Setup Pages

css/footer.css

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,142 @@
191191
margin-left: 0;
192192
}
193193
}
194+
195+
/* ==========================================================================
196+
EXPANDED SITE FOOTER (landing page) — additive; the legacy
197+
.footer-left/.footer-center/.footer-right rules above still drive the
198+
About page footer unchanged.
199+
========================================================================== */
200+
.site-footer {
201+
padding: clamp(2.5rem, 5vw, 3.5rem) clamp(1.25rem, 4vw, 3rem) 1.8rem;
202+
text-align: left;
203+
font:
204+
normal 16px "Open Sans",
205+
sans-serif;
206+
}
207+
208+
.footer-top {
209+
display: grid;
210+
grid-template-columns: minmax(220px, 1fr) 2.2fr;
211+
gap: clamp(2rem, 5vw, 4rem);
212+
max-width: 1240px;
213+
margin: 0 auto;
214+
}
215+
216+
.footer-brand .footer-logo {
217+
margin-bottom: 14px;
218+
}
219+
220+
.footer-tagline {
221+
font-family: "Open Sans", sans-serif;
222+
font-size: 0.9rem;
223+
line-height: 1.6;
224+
color: rgba(255, 255, 255, 0.7);
225+
max-width: 280px;
226+
margin: 0;
227+
}
228+
229+
.footer-social {
230+
display: flex;
231+
gap: 10px;
232+
margin-top: 18px;
233+
}
234+
235+
.footer-social a {
236+
width: 38px;
237+
height: 38px;
238+
border-radius: 8px;
239+
background: #33383b;
240+
color: #ffffff;
241+
display: inline-flex;
242+
align-items: center;
243+
justify-content: center;
244+
font-size: 18px;
245+
text-decoration: none;
246+
transition:
247+
background 0.2s ease,
248+
transform 0.2s ease;
249+
}
250+
251+
.footer-social a:hover,
252+
.footer-social a:focus-visible {
253+
background: #4a5568;
254+
transform: translateY(-2px);
255+
}
256+
257+
.footer-links-grid {
258+
display: grid;
259+
grid-template-columns: repeat(4, 1fr);
260+
gap: 24px;
261+
}
262+
263+
.footer-col h4 {
264+
font-family: "Rubik", sans-serif;
265+
font-size: 13px;
266+
font-weight: 700;
267+
letter-spacing: 0.08em;
268+
text-transform: uppercase;
269+
color: #ffffff;
270+
margin: 0 0 12px;
271+
}
272+
273+
.footer-col a {
274+
display: block;
275+
font-family: "Open Sans", sans-serif;
276+
font-size: 0.9rem;
277+
font-weight: 400;
278+
color: rgba(255, 255, 255, 0.68);
279+
text-decoration: none;
280+
padding: 6px 0;
281+
transition: color 0.2s ease;
282+
}
283+
284+
.footer-col a:hover,
285+
.footer-col a:focus-visible {
286+
color: #ffffff;
287+
}
288+
289+
.footer-bottom {
290+
max-width: 1240px;
291+
margin: clamp(2rem, 4vw, 2.6rem) auto 0;
292+
padding-top: 20px;
293+
border-top: 1px solid rgba(255, 255, 255, 0.1);
294+
display: flex;
295+
flex-wrap: wrap;
296+
justify-content: space-between;
297+
gap: 10px;
298+
}
299+
300+
.footer-bottom p {
301+
font-family: "Open Sans", sans-serif;
302+
font-size: 0.82rem;
303+
color: rgba(255, 255, 255, 0.6);
304+
margin: 0;
305+
}
306+
307+
.footer-bottom a {
308+
color: rgba(255, 255, 255, 0.8);
309+
text-decoration: none;
310+
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
311+
}
312+
313+
.footer-bottom a:hover {
314+
color: #ffffff;
315+
}
316+
317+
@media (max-width: 880px) {
318+
.footer-top {
319+
grid-template-columns: 1fr;
320+
}
321+
322+
.footer-bottom {
323+
justify-content: center;
324+
text-align: center;
325+
}
326+
}
327+
328+
@media (max-width: 620px) {
329+
.footer-links-grid {
330+
grid-template-columns: 1fr 1fr;
331+
}
332+
}

0 commit comments

Comments
 (0)