@@ -0,0 +1,415 @@
|
||||
# Homepage Redesign Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Replace the beta-gated homepage with an open, conversion-focused landing page that drives users directly into the builder.
|
||||
|
||||
**Architecture:** Two files change. `components/Banner.tsx` gets a one-line suppression for `/`. `app/page.tsx` is fully rewritten as a React Server Component with 8 sections and a page-level metadata export. No new files, no new components, no client state.
|
||||
|
||||
**Tech Stack:** Next.js 15 App Router, React Server Components, TypeScript, Tailwind CSS, `@heroicons/react/20/solid`, `next/image`, `next/link`
|
||||
|
||||
---
|
||||
|
||||
## File Map
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
| `components/Banner.tsx` | One-line change — add `|| pathname === "/"` to suppression check |
|
||||
| `app/page.tsx` | Full rewrite — RSC, metadata export, 8-section layout, new copy |
|
||||
|
||||
---
|
||||
|
||||
## Task 1: Suppress Banner on the Homepage
|
||||
|
||||
**Files:**
|
||||
- Modify: `components/Banner.tsx:8`
|
||||
|
||||
Context: `Banner` renders an "Early Access Beta" bar on every non-admin route. The new homepage is no longer beta-gated, so it must not show this bar.
|
||||
|
||||
- [ ] **Step 1: Edit `components/Banner.tsx`**
|
||||
|
||||
Change line 8 from:
|
||||
```tsx
|
||||
if (pathname?.startsWith("/admin")) return null;
|
||||
```
|
||||
To:
|
||||
```tsx
|
||||
if (pathname?.startsWith("/admin") || pathname === "/") return null;
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Verify manually**
|
||||
|
||||
Run `npm run dev` and open `http://localhost:3000`. Confirm the amber "Early Access Beta" bar is **not** visible. Navigate to `/builder` and confirm the banner **is** visible.
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add components/Banner.tsx
|
||||
git commit -m "feat: suppress Early Access Beta banner on homepage"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: Rewrite `app/page.tsx` as a React Server Component
|
||||
|
||||
**Files:**
|
||||
- Modify: `app/page.tsx` (full rewrite)
|
||||
|
||||
Context: The current file is `"use client"` with a beta signup form. Remove all client state, the form, and the `/api/beta-signup` dependency. Replace with 8 static sections. Add a `metadata` export using `{ absolute: "..." }` to bypass the root layout's `template: "%s — Battl Builders"` pattern.
|
||||
|
||||
- [ ] **Step 1: Replace `app/page.tsx` with the following content**
|
||||
|
||||
```tsx
|
||||
import type { Metadata } from "next";
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import {
|
||||
WrenchScrewdriverIcon,
|
||||
ShieldExclamationIcon,
|
||||
CurrencyDollarIcon,
|
||||
BookmarkSquareIcon,
|
||||
LinkIcon,
|
||||
LockOpenIcon,
|
||||
} from "@heroicons/react/20/solid";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: { absolute: "Battl Builders — Free AR-15 Build Planner" },
|
||||
description:
|
||||
"Pick compatible AR-15 parts, catch mismatches before you order, and compare live prices from real retailers. Free, no account required.",
|
||||
};
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<main className="min-h-screen bg-black text-zinc-50">
|
||||
{/* Grid background — retained from previous implementation */}
|
||||
<div className="pointer-events-none fixed inset-0 z-0 overflow-hidden opacity-[0.55]">
|
||||
<svg
|
||||
width="100%"
|
||||
height="100%"
|
||||
preserveAspectRatio="xMidYMid slice"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<defs>
|
||||
<pattern
|
||||
id="battlGrid"
|
||||
x="0"
|
||||
y="0"
|
||||
width="80"
|
||||
height="80"
|
||||
patternUnits="userSpaceOnUse"
|
||||
>
|
||||
<path
|
||||
d="M 80 0 L 0 0 0 80"
|
||||
fill="none"
|
||||
stroke="#fbbf24"
|
||||
strokeWidth="0.5"
|
||||
strokeOpacity="0.35"
|
||||
/>
|
||||
</pattern>
|
||||
<pattern
|
||||
id="battlHex"
|
||||
width="140"
|
||||
height="140"
|
||||
patternUnits="userSpaceOnUse"
|
||||
>
|
||||
<path
|
||||
d="M70 4 L136 40 L136 110 L70 146 L4 110 L4 40 Z"
|
||||
fill="none"
|
||||
stroke="#fbbf24"
|
||||
strokeWidth="0.4"
|
||||
strokeOpacity="0.25"
|
||||
/>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect width="100%" height="100%" fill="url(#battlGrid)" />
|
||||
<rect width="100%" height="100%" fill="url(#battlHex)" />
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div className="relative z-10">
|
||||
{/* ── 1. Nav ── */}
|
||||
<nav className="mx-auto flex max-w-5xl items-center justify-between px-4 py-5">
|
||||
<Image
|
||||
src="/battl/battl-logo-mark-f.svg"
|
||||
alt="Battl Builders"
|
||||
width={260}
|
||||
height={48}
|
||||
/>
|
||||
<div className="flex items-center gap-2">
|
||||
<Link
|
||||
href="/login"
|
||||
className="rounded-md border border-zinc-800 bg-zinc-950/60 px-3 py-2 text-xs font-medium text-zinc-200 hover:bg-zinc-900 hover:text-white"
|
||||
>
|
||||
Sign In
|
||||
</Link>
|
||||
<Link
|
||||
href="/builder"
|
||||
className="rounded-md border border-amber-500/70 bg-amber-500/90 px-3 py-2 text-xs font-semibold text-black hover:bg-amber-400"
|
||||
>
|
||||
Start a Build
|
||||
</Link>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
{/* ── 2. Hero ── */}
|
||||
<section className="mx-auto max-w-[760px] px-4 pb-16 pt-20 text-center">
|
||||
<div className="mb-7 inline-flex items-center gap-2 rounded-full border border-white/10 bg-black/40 px-4 py-[5px] text-[10px] uppercase tracking-[0.2em] text-white/55">
|
||||
<span className="h-1.5 w-1.5 flex-shrink-0 rounded-full bg-amber-400" />
|
||||
AR-15 Builder · 100% Free
|
||||
</div>
|
||||
|
||||
<h1 className="text-[clamp(38px,6.5vw,64px)] font-bold leading-[1.05] tracking-[-0.035em] text-white">
|
||||
Stop Guessing.
|
||||
<span className="block text-amber-300">Start Building.</span>
|
||||
</h1>
|
||||
|
||||
<p className="mx-auto mt-6 max-w-[540px] text-[17px] leading-[1.65] text-zinc-400">
|
||||
Not sure which parts work together? We'll walk you through it.
|
||||
Pick your components, get warned about anything that won't fit,
|
||||
and see real prices from real retailers — all in one place.
|
||||
</p>
|
||||
|
||||
<div className="mt-10 flex flex-col items-center gap-3">
|
||||
<Link
|
||||
href="/builder"
|
||||
className="inline-flex items-center gap-2 rounded-lg bg-amber-500/90 px-[38px] py-[15px] text-[15px] font-extrabold tracking-[0.03em] text-black shadow-[0_0_40px_rgba(251,191,36,0.2)] hover:bg-amber-400"
|
||||
>
|
||||
Start a Build →
|
||||
</Link>
|
||||
<span className="text-[11px] tracking-[0.05em] text-zinc-600">
|
||||
100% Free · No account required
|
||||
</span>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── 3. How It Works ── */}
|
||||
<section className="mx-auto max-w-5xl px-4 py-[72px]">
|
||||
<p className="mb-3 text-center text-[10px] font-bold uppercase tracking-[0.25em] text-amber-400 opacity-85">
|
||||
THE PROCESS
|
||||
</p>
|
||||
<h2 className="mb-1.5 text-center text-[30px] font-bold tracking-[-0.025em] text-white">
|
||||
3 Steps. One Battl-Ready Build.
|
||||
</h2>
|
||||
<p className="mb-12 text-center text-sm text-zinc-500">
|
||||
No experience required. No part numbers to memorize.
|
||||
</p>
|
||||
|
||||
<div
|
||||
className="mx-auto grid max-w-[840px] grid-cols-1 overflow-hidden rounded-xl border border-zinc-900 bg-zinc-900 sm:grid-cols-3"
|
||||
style={{ gap: "2px" }}
|
||||
>
|
||||
{[
|
||||
{
|
||||
num: "Step 01",
|
||||
title: "Pick your parts",
|
||||
body: "Browse real components organized by what they do — barrel, trigger, lower, upper, and more. No prior knowledge required.",
|
||||
},
|
||||
{
|
||||
num: "Step 02",
|
||||
title: "Flag the conflicts",
|
||||
body: "Gas length, buffer weight, caliber — Battl catches the mismatches before you spend money on the wrong part.",
|
||||
},
|
||||
{
|
||||
num: "Step 03",
|
||||
title: "Price it. Pull the trigger.",
|
||||
body: "Live prices from real retailers, side by side. Click through to buy. We never touch your order.",
|
||||
},
|
||||
].map((step) => (
|
||||
<div key={step.num} className="bg-[#0d0d0f] px-6 py-8">
|
||||
<p className="mb-3.5 text-[11px] font-bold uppercase tracking-[0.15em] text-amber-400 opacity-80">
|
||||
{step.num}
|
||||
</p>
|
||||
<h3 className="mb-2.5 text-base font-bold tracking-[-0.01em] text-white">
|
||||
{step.title}
|
||||
</h3>
|
||||
<p className="text-[13px] leading-[1.6] text-zinc-500">
|
||||
{step.body}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── 4. Builder Preview Video ── */}
|
||||
<section className="px-4 pb-[72px]">
|
||||
<div className="mx-auto max-w-[900px] overflow-hidden rounded-[14px] border border-white/[0.07] bg-black shadow-[0_24px_80px_rgba(0,0,0,0.7),0_0_0_1px_rgba(251,191,36,0.05)]">
|
||||
<div className="relative">
|
||||
<video
|
||||
autoPlay
|
||||
loop
|
||||
muted
|
||||
playsInline
|
||||
poster="/builder-preview.png"
|
||||
className="w-full object-cover"
|
||||
>
|
||||
<source src="/builder-preview.mp4" type="video/mp4" />
|
||||
</video>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
className="pointer-events-none absolute inset-x-0 bottom-0 h-24 bg-gradient-to-t from-black"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── 5. Feature Cards ── */}
|
||||
<section className="mx-auto max-w-5xl px-4 py-[72px]">
|
||||
<p className="mb-3 text-center text-[10px] font-bold uppercase tracking-[0.25em] text-amber-400 opacity-85">
|
||||
WHAT YOU GET
|
||||
</p>
|
||||
<h2 className="mb-2 text-center text-[30px] font-bold tracking-[-0.025em] text-white">
|
||||
Built by gun nerds, for the everyday AR builder.
|
||||
</h2>
|
||||
<p className="mb-11 text-center text-[13px] uppercase tracking-[0.02em] text-zinc-600">
|
||||
NO SUBSCRIPTIONS · NO SPONSORED RANKINGS · NO BULLSHIT
|
||||
</p>
|
||||
|
||||
<div
|
||||
className="mx-auto grid max-w-[900px] grid-cols-1 overflow-hidden rounded-xl border border-zinc-900 bg-zinc-900 sm:grid-cols-2 lg:grid-cols-3"
|
||||
style={{ gap: "1px" }}
|
||||
>
|
||||
{(
|
||||
[
|
||||
{
|
||||
Icon: WrenchScrewdriverIcon,
|
||||
title: "Build by role, not part number",
|
||||
body: "Parts organized by function. Know what you need, not what SKU to search for.",
|
||||
},
|
||||
{
|
||||
Icon: ShieldExclamationIcon,
|
||||
title: "Conflicts caught early",
|
||||
body: "Gas system, buffer weight, caliber — flagged before checkout, not after the box arrives.",
|
||||
},
|
||||
{
|
||||
Icon: CurrencyDollarIcon,
|
||||
title: "Real prices. Real retailers.",
|
||||
body: "Running total with live prices. No estimated MSRP. What it actually costs, today.",
|
||||
},
|
||||
{
|
||||
Icon: BookmarkSquareIcon,
|
||||
title: "Save your work",
|
||||
body: "Free account. Save builds, pick up where you left off, run multiple configs in parallel.",
|
||||
},
|
||||
{
|
||||
Icon: LinkIcon,
|
||||
title: "Share the build",
|
||||
body: "One link. Your buddy sees the full parts list — no login, no friction, no excuses.",
|
||||
},
|
||||
{
|
||||
Icon: LockOpenIcon,
|
||||
title: "No gates. No friction.",
|
||||
body: "Browse and build freely. Create an account only when you're ready to save.",
|
||||
},
|
||||
] as const
|
||||
).map(({ Icon, title, body }) => (
|
||||
<div key={title} className="bg-[#0d0d0f] p-6">
|
||||
<Icon
|
||||
className="mb-3.5 h-5 w-5 text-amber-400"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
<h3 className="mb-1.5 text-[13px] font-bold tracking-[-0.01em] text-zinc-200">
|
||||
{title}
|
||||
</h3>
|
||||
<p className="text-xs leading-[1.6] text-zinc-600">{body}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── 6. SEO Copy Block ── */}
|
||||
<section className="border-t border-zinc-900 px-4 py-[72px]">
|
||||
<div className="mx-auto max-w-[680px]">
|
||||
<h2 className="mb-4 text-[22px] font-bold tracking-[-0.02em] text-zinc-300">
|
||||
What is Battl Builders?
|
||||
</h2>
|
||||
<p className="mb-3.5 text-sm leading-[1.75] text-zinc-500">
|
||||
Battl Builders is a free{" "}
|
||||
<strong className="font-semibold text-zinc-300">
|
||||
AR-15 build planner
|
||||
</strong>{" "}
|
||||
— the tool you've been doing in spreadsheets, rebuilt for how
|
||||
builders actually work. Select parts by what they do, validate
|
||||
compatibility as you go, and price your build across multiple
|
||||
retailers without opening a new tab.
|
||||
</p>
|
||||
<p className="mb-3.5 text-sm leading-[1.75] text-zinc-500">
|
||||
Most{" "}
|
||||
<strong className="font-semibold text-zinc-300">
|
||||
AR-15 compatibility mistakes
|
||||
</strong>{" "}
|
||||
happen at the parts list stage: wrong gas system length for the
|
||||
barrel, buffer weight that fights your stock, caliber mismatches
|
||||
between upper and lower. Battl flags those conflicts automatically,
|
||||
so you catch them before they cost you a return label.
|
||||
</p>
|
||||
<p className="text-sm leading-[1.75] text-zinc-500">
|
||||
Whether you're planning your first rifle or spec'ing a
|
||||
dedicated precision upper, Battl Builders gives you a structured,
|
||||
guided way to research parts and{" "}
|
||||
<strong className="font-semibold text-zinc-300">
|
||||
buy with confidence
|
||||
</strong>
|
||||
.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── 7. Final CTA ── */}
|
||||
<section className="border-t border-zinc-900 px-4 py-24 text-center">
|
||||
<h2 className="mb-3 text-[36px] font-bold tracking-[-0.03em] text-white">
|
||||
Your build starts here.
|
||||
</h2>
|
||||
<p className="mb-8 text-sm text-zinc-600">
|
||||
Free. No account required. Takes five minutes to get rolling.
|
||||
</p>
|
||||
<Link
|
||||
href="/builder"
|
||||
className="inline-flex items-center gap-2 rounded-lg bg-amber-500/90 px-[38px] py-[15px] text-[15px] font-extrabold tracking-[0.03em] text-black shadow-[0_0_40px_rgba(251,191,36,0.2)] hover:bg-amber-400"
|
||||
>
|
||||
Start a Build →
|
||||
</Link>
|
||||
</section>
|
||||
|
||||
{/* ── 8. Footer ── */}
|
||||
<footer className="mx-auto flex max-w-5xl items-center justify-between border-t border-zinc-900 px-4 py-5 text-[11px] text-zinc-700">
|
||||
<span>© {new Date().getFullYear()} BATTL BUILDERS™</span>
|
||||
<span>Free AR-15 build planner</span>
|
||||
</footer>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Verify the build compiles**
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
Expected: no TypeScript or Next.js errors related to `app/page.tsx`. (TS errors and ESLint are suppressed in this project per `next.config.mjs`, but the file should still render without runtime errors.)
|
||||
|
||||
- [ ] **Step 3: Verify manually in the dev server**
|
||||
|
||||
Run `npm run dev` and open `http://localhost:3000`. Check all 8 sections are visible:
|
||||
- Nav: logo left, "Sign In" (ghost) + "Start a Build" (amber) right
|
||||
- Hero: badge pill, H1 with amber "Start Building.", subhead, amber CTA button, micro-copy
|
||||
- How It Works: 3-step flush grid (Step 01–03)
|
||||
- Video: rounded container playing `builder-preview.mp4` (or showing poster)
|
||||
- Feature Cards: 6-card 3-col flush grid with Heroicons
|
||||
- SEO Copy: left-aligned prose with bold keyword terms
|
||||
- Final CTA: "Your build starts here." with amber button
|
||||
- Footer: copyright left, "Free AR-15 build planner" right (no version string)
|
||||
|
||||
Also verify:
|
||||
- No "Early Access Beta" banner visible on homepage
|
||||
- Page `<title>` is "Battl Builders — Free AR-15 Build Planner" (not double-suffixed)
|
||||
- Both CTA buttons link to `/builder`
|
||||
- "Sign In" links to `/login`
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add app/page.tsx
|
||||
git commit -m "feat: redesign homepage — RSC, 8 sections, remove beta form"
|
||||
```
|
||||
Reference in New Issue
Block a user