# Frontend Visual Overhaul 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 flat, image-less Phase 1 UI with a real WebGL 3D hero, generated product/style/portrait photography, and tighter, more animated layouts across all four existing pages (Home, Shop, Book, Rules).
**Architecture:** Additive changes on top of the existing React 19 + TypeScript + Vite + framer-motion + react-router-dom stack. A new `@react-three/fiber` scene replaces the current CSS-only `Hero3D` on Home. Product/service images are generated once as static files and wired into the already-existing (but previously unused) `image` fields on `Product`/`Service`. No new routes, no new data shapes, no backend.
**Tech Stack:** Adds `three`, `@react-three/fiber`, `@react-three/drei` for the 3D hero. Everything else reuses the existing Vitest + React Testing Library + framer-motion toolchain.
## Global Constraints
- Palette stays cream `#F7F3EC` / `#EFE7D8`, charcoal `#3A332E`, gold `#B08D57` — no new colors, no rebrand.
- Typography stays Georgia/serif for body/labels, the existing script font for headline moments — no new fonts.
- 3D treatment is scoped to the Home hero only — not product cards, not other pages (explicit user decision).
- All motion continues to respect `prefers-reduced-motion` (existing `useReducedMotion` pattern from `framer-motion`), including the new 3D scene, which falls back to a static element and skips mounting the WebGL canvas entirely for those users.
- No backend/network calls — imagery is static files under `public/`, generated once and committed.
- `three`/`@react-three/fiber`/`@react-three/drei` must only be imported from the Home hero component so they don't bloat the Shop/Book/Rules bundles (Vite's existing route-based code splitting handles this automatically as long as the import stays local to that one component).
---
### Task 1: Install 3D dependencies
**Files:**
- Modify: `package.json`, `package-lock.json`
**Interfaces:**
- Produces: `three`, `@react-three/fiber`, `@react-three/drei` available as npm dependencies for Task 3.
- [ ] **Step 1: Install the packages**
```bash
npm install three @react-three/fiber @react-three/drei
```
- [ ] **Step 2: Verify the install didn't break the existing build**
Run: `npm run build`
Expected: succeeds with zero TypeScript errors (these packages ship their own types, no `@types/three` needed for the API surface used in this plan).
- [ ] **Step 3: Verify the existing test suite is unaffected**
Run: `npx vitest run`
Expected: all existing tests still pass (44/44 as of the last Phase 1 merge).
- [ ] **Step 4: Commit**
```bash
git add package.json package-lock.json
git commit -m "chore: add three, @react-three/fiber, @react-three/drei for the 3D hero"
```
---
### Task 2: Generate product, style, portrait, and testimonial imagery
**Files:**
- Create: `public/products/edge-control.jpg`
- Create: `public/products/braid-oil.jpg`
- Create: `public/products/leave-in.jpg`
- Create: `public/products/kanekalon-black.jpg`
- Create: `public/products/kanekalon-brown.jpg`
- Create: `public/products/locs-extension.jpg`
- Create: `public/products/rat-tail-comb.jpg`
- Create: `public/products/edge-brush.jpg`
- Create: `public/products/gold-cuffs.jpg`
- Create: `public/products/satin-bonnet.jpg`
- Create: `public/styles/knotless.jpg`
- Create: `public/styles/boho.jpg`
- Create: `public/styles/locs.jpg`
- Create: `public/styles/cornrows.jpg`
- Create: `public/about/mira-portrait.jpg`
- Create: `public/testimonials/amara.jpg`
- Create: `public/testimonials/keisha.jpg`
- Create: `public/testimonials/nadia.jpg`
**Interfaces:**
- Produces: static image files at the exact paths above. These paths already match the `image` fields hardcoded in `src/data/products.ts` and `src/data/services.ts` from Phase 1 (e.g. `products.ts` already has `image: '/products/edge-control.jpg'`) — **do not rename files or change the data files**, the filenames here are load-bearing for Tasks 4 and 5.
This task has no code to write and no tests to run — it's content generation. Use whatever AI image-generation tool is available in your environment (search your available tools for an image generation capability before starting). Generate each image individually or in batches if your tool supports batch generation, then save/move each result to its exact destination path listed above.
- [ ] **Step 1: Generate the 10 product images**
Use these prompts (adapt wording to your tool's requirements, but preserve the subject, framing, and palette guidance in each):
1. `public/products/edge-control.jpg` — "Product photography of a small round jar of hair edge control gel, cream and gold label, soft studio lighting, on a plain warm cream (#F7F3EC) background, minimalist beauty product shot"
2. `public/products/braid-oil.jpg` — "Product photography of a small amber glass dropper bottle labeled as a hair oil, soft studio lighting, on a plain warm cream background, minimalist beauty product shot"
3. `public/products/leave-in.jpg` — "Product photography of a white pump bottle of leave-in hair conditioner, cream and gold label, soft studio lighting, on a plain warm cream background, minimalist beauty product shot"
4. `public/products/kanekalon-black.jpg` — "Product photography of a neatly coiled bundle of jet black synthetic braiding hair extensions, soft studio lighting, on a plain warm cream background"
5. `public/products/kanekalon-brown.jpg` — "Product photography of a neatly coiled bundle of warm chestnut brown synthetic braiding hair extensions, soft studio lighting, on a plain warm cream background"
6. `public/products/locs-extension.jpg` — "Product photography of pre-looped faux locs hair extensions arranged neatly, dark brown, soft studio lighting, on a plain warm cream background"
7. `public/products/rat-tail-comb.jpg` — "Product photography of a steel rat-tail hair parting comb, minimalist, soft studio lighting, on a plain warm cream background"
8. `public/products/edge-brush.jpg` — "Product photography of a small dual-sided hair edge brush, dark handle, soft studio lighting, on a plain warm cream background"
9. `public/products/gold-cuffs.jpg` — "Product photography of a set of six small gold adjustable hair cuffs for braids, soft studio lighting, on a plain warm cream background"
10. `public/products/satin-bonnet.jpg` — "Product photography of a folded charcoal-brown satin hair sleep bonnet, soft studio lighting, on a plain warm cream background"
- [ ] **Step 2: Generate the 4 signature-style images**
1. `public/styles/knotless.jpg` — "Editorial beauty portrait of a woman with long knotless box braids, warm natural lighting, neutral cream studio background, elegant and calm expression"
2. `public/styles/boho.jpg` — "Editorial beauty portrait of a woman with boho knotless braids featuring loose curly pieces woven in, warm natural lighting, neutral cream studio background"
3. `public/styles/locs.jpg` — "Editorial beauty portrait of a woman with natural-looking faux locs, warm natural lighting, neutral cream studio background"
4. `public/styles/cornrows.jpg` — "Editorial beauty portrait of a woman with sleek straight-back cornrows, warm natural lighting, neutral cream studio background"
- [ ] **Step 3: Generate the About Mira portrait**
`public/about/mira-portrait.jpg` — "Warm editorial portrait of a confident Black hairstylist in her salon, soft natural window light, neutral warm tones, three-quarter view, professional and approachable"
- [ ] **Step 4: Generate the 3 testimonial avatars**
1. `public/testimonials/amara.jpg` — "Small circular-crop friendly headshot portrait of a smiling Black woman, warm natural lighting, neutral cream background"
2. `public/testimonials/keisha.jpg` — "Small circular-crop friendly headshot portrait of a smiling Black woman, different from a previous portrait, warm natural lighting, neutral cream background"
3. `public/testimonials/nadia.jpg` — "Small circular-crop friendly headshot portrait of a smiling Black woman, different from previous portraits, warm natural lighting, neutral cream background"
- [ ] **Step 5: Verify every file exists and is a valid image**
```bash
for f in public/products/edge-control.jpg public/products/braid-oil.jpg public/products/leave-in.jpg \
public/products/kanekalon-black.jpg public/products/kanekalon-brown.jpg public/products/locs-extension.jpg \
public/products/rat-tail-comb.jpg public/products/edge-brush.jpg public/products/gold-cuffs.jpg \
public/products/satin-bonnet.jpg public/styles/knotless.jpg public/styles/boho.jpg public/styles/locs.jpg \
public/styles/cornrows.jpg public/about/mira-portrait.jpg public/testimonials/amara.jpg \
public/testimonials/keisha.jpg public/testimonials/nadia.jpg; do
file "$f"
done
```
Expected: every line reports a valid JPEG (or PNG — if your tool outputs PNG, save with a `.jpg` extension is fine as long as `` tags render it correctly, but prefer actually generating/converting to JPEG for smaller file size; either way every file must exist and be non-zero bytes).
- [ ] **Step 6: Commit**
```bash
git add public/products public/styles public/about public/testimonials
git commit -m "content: add generated product, style, portrait, and testimonial imagery"
```
---
### Task 3: `Hero3DScene` — WebGL 3D hero component
**Files:**
- Create: `src/components/Hero3DScene.tsx`, `src/components/Hero3DScene.module.css`
- Test: `src/components/Hero3DScene.test.tsx`
- Modify: `src/pages/Home.tsx` (swap `Hero3D` for `Hero3DScene`)
- Modify: `src/pages/Home.test.tsx` (if it references the old testid — check and update)
- Delete: `src/components/Hero3D.tsx`, `src/components/Hero3D.module.css`, `src/components/Hero3D.test.tsx` (fully replaced by `Hero3DScene`)
**Interfaces:**
- Produces: `Hero3DScene` component (no props) — renders a `data-testid="hero-3d-scene"` container. Under normal motion, renders an `@react-three/fiber` `