Design decisions
The theme was chosen because it ships with the full stack we need — Astro, React, Tailwind, shadcn/ui, Framer Motion, and dark mode — without requiring a CMS or external data sources. The site is fully static: all pages are pre-rendered to HTML at build time with no server-side logic. ReactBits (DavidHDev/react-bits, 36k+ stars) is used for animated UI effects. Components are installed via the jsrepo CLI as copy-pasted source files, meaning zero runtime dependency overhead. They work as Astro islands withclient:load or client:visible directives.
The following sections were removed from the base theme because they were not requested:
Pricing.tsxTestimonials.tsxFAQ.tsx- The example markdown page (
markdown-page.md)
Site structure
Sections
Header
Header.tsx — Navigation bar with:
- HiroLeague logo/text (left)
- Nav links: GitHub repo, Docs
ThemeTogglebutton (dark/light)- Mobile-responsive hamburger menu
Hero
Hero.tsx — Main above-the-fold section with:
- Animated headline using ReactBits
BlurText - Mysterious tagline copy
- CTA button that scrolls to the waitlist section
- Gradient background animation
Features
Features.tsx — Four feature cards hinting at what HiroLeague does.
Waitlist
Waitlist.tsx — Email capture section with an input + “Notify Me” button. The form markup is UI-only. The backend integration (Brevo embedded form) is tracked in docs/internal_todo.md.
Footer
Footer.tsx — Copyright line and social icons (YouTube, Instagram, X, LinkedIn, TikTok) using Lucide icons.
Editing content
Hero, features, waitlist
Edit the corresponding React component insrc/components/. The copy is inline — no CMS or separate data file.
Blog
Add new articles as.astro files inside src/pages/blog/ following the pattern of why-we-are-building-hiroleague.astro. Then add an entry to the blogPosts array at the top of src/pages/blog/index.astro so the article appears on the listing page.
Colors and brand
The design token values are CSS custom properties insrc/styles/global.css under :root (light) and .dark (dark). The amber-to-orange brand gradient is applied inline in components — search for from-amber-500 to find all instances.
Dark mode
Theme state is stored inlocalStorage under the key theme. ThemeToggle.tsx reads and writes it. An inline <script is:inline> in src/layouts/main.astro applies the .dark class synchronously on <html> before first paint, preventing the light-to-dark flash on page load.