launchframe 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,13 +43,19 @@ If the user provides additional instructions (specific fidelity level, deeper cu
43
43
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
44
44
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
45
45
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
46
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
46
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
47
47
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
48
48
 
49
49
  ## Guiding Principles
50
50
 
51
51
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
52
52
 
53
+ ### 0. Launchframe priorities: media & motion (do not defer)
54
+
55
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
56
+
57
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
58
+
53
59
  ### 1. Completeness Beats Speed
54
60
 
55
61
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -194,11 +200,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
194
200
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
195
201
 
196
202
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
197
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
198
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
199
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
200
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
201
- 6. Verify: `npm run build` passes
203
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
204
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
205
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
206
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
207
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
208
+ 7. Verify: `npm run build` passes
202
209
 
203
210
  ### Asset Discovery Script Pattern
204
211
 
@@ -355,11 +362,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
355
362
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
356
363
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
357
364
  - **Transition:** transition: all 0.3s ease
358
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
365
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
359
366
 
360
367
  ### Hover states
361
368
  - **<Element>:** <property>: <before> → <after>, transition: <value>
362
369
 
370
+ ## Motion (Framer Motion vs CSS)
371
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
372
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
373
+ - **Keyframes / springs:** <if any — match target curve>
374
+
363
375
  ## Per-State Content (if applicable)
364
376
 
365
377
  ### State: "Featured"
@@ -371,9 +383,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
371
383
  - Title: "..."
372
384
  - Cards: [...]
373
385
 
374
- ## Assets
375
- - Background image: `public/images/<file>.webp`
376
- - Overlay image: `public/images/<file>.png`
386
+ ## Assets (images & video — required detail)
387
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
388
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
389
+ - Background layers: which div uses `background-image` and resolved URL → local path
377
390
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
378
391
 
379
392
  ## Text Content (verbatim)
@@ -447,7 +460,7 @@ For every section, replace:
447
460
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
448
461
 
449
462
  What you must NOT change in this pass:
450
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
463
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
451
464
  - Section order, section count, component structure
452
465
  - Interaction models (scroll-driven stays scroll-driven, etc.)
453
466
  - Any computed-style value extracted in Phase 3
@@ -481,6 +494,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
481
494
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
482
495
  - [ ] For hover states: before/after values and transition timing are recorded
483
496
  - [ ] All images in the section are identified (including overlays and layered compositions)
497
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
498
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
484
499
  - [ ] Responsive behavior is documented for at least desktop and mobile
485
500
  - [ ] Text content is verbatim from the site, not paraphrased
486
501
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -497,6 +512,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
497
512
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
498
513
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
499
514
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
515
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
516
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
500
517
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
501
518
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
502
519
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -511,7 +528,7 @@ When done, report:
511
528
  - Total sections built
512
529
  - Total components created
513
530
  - Total spec files written (should match components)
514
- - Total assets downloaded (images, videos, SVGs, fonts)
531
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
515
532
  - Rebrand summary (path to `docs/research/REBRAND.md`)
516
533
  - Build status (`npm run build` result)
517
534
  - Visual QA results (any remaining discrepancies)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: clone-website
3
- description: Reverse-engineer and clone one or more websites in one shot — extracts assets, CSS, and content section-by-section and proactively dispatches parallel builder agents in worktrees as it goes. Use this whenever the user wants to clone, replicate, rebuild, reverse-engineer, or copy any website. Also triggers on phrases like "make a copy of this site", "rebuild this page", "pixel-perfect clone", "launch a SaaS based on", "build me a clone of", and Launchframe shorthands **Build it**, **Go**, **Ship it**, **Clone the site** (read `launchframe.config.json` only — no URL in chat). This project was scaffolded by Launchframe — read `launchframe.config.json` for the target URL and the user's SaaS-idea rebranding directive before running. URLs can also be passed inline.
3
+ description: Reverse-engineer and clone one or more websites in one shot — **prioritizes real images/videos** (download to public/) and **motion via Framer Motion** for non-trivial animation. Extracts assets, CSS, and content section-by-section and dispatches parallel builder agents in worktrees. Use this whenever the user wants to clone, replicate, rebuild, reverse-engineer, or copy any website. Also triggers on phrases like "make a copy of this site", "rebuild this page", "pixel-perfect clone", "launch a SaaS based on", "build me a clone of", and Launchframe shorthands **Build it**, **Go**, **Ship it**, **Clone the site** (read `launchframe.config.json` only — no URL in chat). This project was scaffolded by Launchframe — read `launchframe.config.json` for the target URL and the user's SaaS-idea rebranding directive before running. URLs can also be passed inline.
4
4
  argument-hint: "[<url1> <url2> ...] (optional — defaults to launchframe.config.json)"
5
5
  user-invocable: true
6
6
  ---
@@ -42,13 +42,19 @@ If the user provides additional instructions (specific fidelity level, deeper cu
42
42
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
43
43
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
44
44
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
45
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
45
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
46
46
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
47
47
 
48
48
  ## Guiding Principles
49
49
 
50
50
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
51
51
 
52
+ ### 0. Launchframe priorities: media & motion (do not defer)
53
+
54
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
55
+
56
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
57
+
52
58
  ### 1. Completeness Beats Speed
53
59
 
54
60
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -193,11 +199,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
193
199
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
194
200
 
195
201
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
196
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
197
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
198
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
199
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
200
- 6. Verify: `npm run build` passes
202
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
203
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
204
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
205
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
206
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
207
+ 7. Verify: `npm run build` passes
201
208
 
202
209
  ### Asset Discovery Script Pattern
203
210
 
@@ -354,11 +361,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
354
361
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
355
362
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
356
363
  - **Transition:** transition: all 0.3s ease
357
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
364
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
358
365
 
359
366
  ### Hover states
360
367
  - **<Element>:** <property>: <before> → <after>, transition: <value>
361
368
 
369
+ ## Motion (Framer Motion vs CSS)
370
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
371
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
372
+ - **Keyframes / springs:** <if any — match target curve>
373
+
362
374
  ## Per-State Content (if applicable)
363
375
 
364
376
  ### State: "Featured"
@@ -370,9 +382,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
370
382
  - Title: "..."
371
383
  - Cards: [...]
372
384
 
373
- ## Assets
374
- - Background image: `public/images/<file>.webp`
375
- - Overlay image: `public/images/<file>.png`
385
+ ## Assets (images & video — required detail)
386
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
387
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
388
+ - Background layers: which div uses `background-image` and resolved URL → local path
376
389
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
377
390
 
378
391
  ## Text Content (verbatim)
@@ -446,7 +459,7 @@ For every section, replace:
446
459
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
447
460
 
448
461
  What you must NOT change in this pass:
449
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
462
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
450
463
  - Section order, section count, component structure
451
464
  - Interaction models (scroll-driven stays scroll-driven, etc.)
452
465
  - Any computed-style value extracted in Phase 3
@@ -480,6 +493,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
480
493
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
481
494
  - [ ] For hover states: before/after values and transition timing are recorded
482
495
  - [ ] All images in the section are identified (including overlays and layered compositions)
496
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
497
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
483
498
  - [ ] Responsive behavior is documented for at least desktop and mobile
484
499
  - [ ] Text content is verbatim from the site, not paraphrased
485
500
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -496,6 +511,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
496
511
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
497
512
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
498
513
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
514
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
515
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
499
516
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
500
517
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
501
518
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -510,7 +527,7 @@ When done, report:
510
527
  - Total sections built
511
528
  - Total components created
512
529
  - Total spec files written (should match components)
513
- - Total assets downloaded (images, videos, SVGs, fonts)
530
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
514
531
  - Rebrand summary (path to `docs/research/REBRAND.md`)
515
532
  - Build status (`npm run build` result)
516
533
  - Visual QA results (any remaining discrepancies)
@@ -27,10 +27,18 @@ When you see that with no other instructions, **start the full clone-website pip
27
27
  ## Tech Stack
28
28
  - **Framework:** Next.js 16 (App Router, React 19, TypeScript strict)
29
29
  - **UI:** shadcn/ui (Radix primitives, Tailwind CSS v4, `cn()` utility)
30
+ - **Motion:** **Framer Motion** (`framer-motion`) — **default for non-trivial animation** (scroll reveals, staggers, layout, gestures). Use CSS `transition` / `@keyframes` only when they reproduce the target exactly without JS.
30
31
  - **Icons:** Lucide React (default — will be replaced/supplemented by extracted SVGs)
31
32
  - **Styling:** Tailwind CSS v4 with oklch design tokens
33
+ - **Media:** Real **images & videos** from the target URL, saved under `public/images/` and `public/videos/` (see `.claude/skills/clone-website/SKILL.md` and `docs/research/INSPECTION_GUIDE.md`). Do not ship a “pretty shell” with missing raster/video unless extraction is **blocked** and documented in `docs/research/EXTRACTION_LIMITATIONS.md`.
32
34
  - **Deployment:** Vercel
33
35
 
36
+ ## Priority: images, videos & motion
37
+ Treat these as **first-class deliverables**, not polish at the end.
38
+
39
+ 1. **Raster & video** — Early in recon, inventory every `<img>`, `<picture>` / `<source>`, `<video>`, poster image, and meaningful `background-image` URL. Download into `public/` and reference **local paths** in specs and components. Hero bands and marketing sections often fail visually when a single layer is skipped.
40
+ 2. **Motion** — Match the target’s feel: easing, duration, stagger, scroll triggers. Prefer **`motion` from `framer-motion`** for entrance sequences, viewport-driven animations, shared-layout-style transitions, and anything beyond a one-off CSS transition. Note in each component spec whether behavior is **CSS-only** vs **Framer Motion**.
41
+
34
42
  ## Commands
35
43
  - `npm run dev` — Start dev server
36
44
  - `npm run build` — Production build
@@ -46,6 +54,8 @@ When you see that with no other instructions, **start the full clone-website pip
46
54
  - Responsive: mobile-first
47
55
 
48
56
  ## Design Principles
57
+ - **Images & video fidelity** — prefer real downloaded assets; preserve aspect ratio, `object-fit`, layering, and poster frames. Rebrand pass may **swap** URLs for IP-safe alternates but must keep layout identical.
58
+ - **Motion fidelity** — timing and easing matter as much as color; use Framer Motion when CSS alone cannot match staggered or scroll-driven behavior.
49
59
  - **Pixel-perfect emulation** — match the target's spacing, colors, typography exactly
50
60
  - **No personal aesthetic changes during emulation phase** — match 1:1 first, rebrand later
51
61
  - **Real content during extraction** — use actual text and assets from the target site so the clone scaffolds against real shapes
@@ -81,6 +91,31 @@ scripts/ # Asset download scripts
81
91
 
82
92
  # Website Inspection Guide
83
93
 
94
+ ## Priority (read first): media & motion
95
+
96
+ Launchframe clones live pages for a **visual** result. Two things most often separate a convincing build from a hollow one:
97
+
98
+ ### 1. Images & video (do this before obsessing over utility classes)
99
+
100
+ - [ ] **Every `<img>`** — `src` / `srcset` / `currentSrc`, `sizes`, `loading`, `decoding`, `alt`, intrinsic dimensions
101
+ - [ ] **`<picture>` / `<source>`** — resolution switches, art direction, `type` (WebP/AVIF)
102
+ - [ ] **Every `<video>`** — `src` + nested `<source>`, **poster**, `autoplay`, `loop`, `muted`, `playsinline`, `controls`
103
+ - [ ] **Background images** — `background-image` on ancestors (hero stacks are often **layers** of img + gradient + PNG mockup)
104
+ - [ ] **Lazy / below-fold** — scroll the page once before asset discovery so `data-src` / lazy-loaded URLs resolve if the site uses them
105
+ - [ ] **Download** — mirror into `public/images/` and `public/videos/` with stable paths; list failures in `docs/research/EXTRACTION_LIMITATIONS.md`
106
+
107
+ If automation hits a bot wall, **do not pretend extraction succeeded** — capture what you can from successful fetches and document gaps.
108
+
109
+ ### 2. Motion (prefer Framer Motion in this repo)
110
+
111
+ - [ ] **Entrance** — fade/slide/scale on mount or on **scroll into view** (note threshold / `margin`)
112
+ - [ ] **Stagger** — children animating in sequence (hero bullets, card grids)
113
+ - [ ] **Scroll-linked** — progress, parallax, pinned sections (may combine with CSS `animation-timeline` or libs)
114
+ - [ ] **Gestures** — drag, pan, hover follow (often Framer Motion)
115
+ - [ ] **Implementation rule** — use **`framer-motion`** for anything beyond trivial single-property CSS `transition`. Record **duration, easing, delay, stagger**, and **trigger** (scroll, hover, tap) in specs.
116
+
117
+ ---
118
+
84
119
  ## How to Reverse-Engineer Any Website
85
120
 
86
121
  This guide outlines what to capture when inspecting a target website via Chrome MCP or browser DevTools.
@@ -95,6 +130,8 @@ This guide outlines what to capture when inspecting a target website via Chrome
95
130
  - [ ] Loading/skeleton states
96
131
  - [ ] Empty states
97
132
  - [ ] Error states
133
+ - [ ] **Video frames** — capture a frame mid-play for reference if motion is subtle
134
+ - [ ] **Hero / full-bleed** — wide crops where raster layers are easy to miss
98
135
 
99
136
  ### Design Tokens to Extract
100
137
  - [ ] **Colors** — background, text (primary/secondary/muted), accent, border, hover, error, success, warning
@@ -117,7 +154,7 @@ For each distinct UI component, document:
117
154
  4. **States** — default, hover, active, disabled, loading, error, empty
118
155
  5. **Responsive behavior** — how does it change at different breakpoints?
119
156
  6. **Interactions** — click, hover, focus, keyboard navigation
120
- 7. **Animations** — transitions, entrance/exit animations, micro-interactions
157
+ 7. **Animations** — transitions, entrance/exit, micro-interactions — **`framer-motion` vs CSS** and exact timing
121
158
 
122
159
  ### Common Components to Look For
123
160
  - Navigation (top bar, sidebar, bottom bar)
@@ -131,6 +168,7 @@ For each distinct UI component, document:
131
168
  - Loading skeletons
132
169
  - Toast notifications
133
170
  - Tooltips and popovers
171
+ - **Video / Lottie / canvas** blocks (do not substitute with static mockups without documenting why)
134
172
 
135
173
  ## Phase 3: Layout Architecture
136
174
 
@@ -148,14 +186,15 @@ For each distinct UI component, document:
148
186
  - [ ] **State management** — Redux (check DevTools), React Query, Zustand, Pinia
149
187
  - [ ] **API patterns** — REST, GraphQL (check network tab for `/graphql` requests)
150
188
  - [ ] **Font loading** — Google Fonts, self-hosted, system fonts
151
- - [ ] **Image strategy** — CDN, lazy loading, srcset, WebP/AVIF
152
- - [ ] **Animation library** — Framer Motion, GSAP, CSS transitions only
189
+ - [ ] **Image strategy** — CDN, lazy loading, srcset, WebP/AVIF — **mirror URLs you are allowed to fetch**
190
+ - [ ] **Animation library** — site may use GSAP, Lottie, Rive, or CSS only — **in the Next.js clone, default to Framer Motion** unless a different lib is required for parity
153
191
 
154
192
  ## Phase 5: Documentation Output
155
193
 
156
194
  After inspection, create these files in `docs/research/`:
157
195
  1. `DESIGN_TOKENS.md` — All extracted colors, typography, spacing
158
196
  2. `COMPONENT_INVENTORY.md` — Every component with structure notes
159
- 3. `LAYOUT_ARCHITECTURE.md`Page layouts, grid system, responsive behavior
160
- 4. `INTERACTION_PATTERNS.md` — Animations, transitions, hover states
161
- 5. `TECH_STACK_ANALYSIS.md` — What the site uses and our chosen equivalents
197
+ 3. **`MEDIA_MANIFEST.md`**(recommended) Table of every image/video/poster URL → local `public/` path or “blocked”
198
+ 4. `LAYOUT_ARCHITECTURE.md` — Page layouts, grid system, responsive behavior
199
+ 5. `INTERACTION_PATTERNS.md` — Animations: **CSS vs Framer Motion**, transitions, hover states
200
+ 6. `TECH_STACK_ANALYSIS.md` — What the site uses and our chosen equivalents (Framer Motion for React animation)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: clone-website
3
- description: Reverse-engineer and clone one or more websites in one shot — extracts assets, CSS, and content section-by-section and proactively dispatches parallel builder agents in worktrees as it goes. Use this whenever the user wants to clone, replicate, rebuild, reverse-engineer, or copy any website. Also triggers on phrases like "make a copy of this site", "rebuild this page", "pixel-perfect clone", "launch a SaaS based on", "build me a clone of", and Launchframe shorthands **Build it**, **Go**, **Ship it**, **Clone the site** (read `launchframe.config.json` only — no URL in chat). This project was scaffolded by Launchframe — read `launchframe.config.json` for the target URL and the user's SaaS-idea rebranding directive before running. URLs can also be passed inline.
3
+ description: Reverse-engineer and clone one or more websites in one shot — **prioritizes real images/videos** (download to public/) and **motion via Framer Motion** for non-trivial animation. Extracts assets, CSS, and content section-by-section and dispatches parallel builder agents in worktrees. Use this whenever the user wants to clone, replicate, rebuild, reverse-engineer, or copy any website. Also triggers on phrases like "make a copy of this site", "rebuild this page", "pixel-perfect clone", "launch a SaaS based on", "build me a clone of", and Launchframe shorthands **Build it**, **Go**, **Ship it**, **Clone the site** (read `launchframe.config.json` only — no URL in chat). This project was scaffolded by Launchframe — read `launchframe.config.json` for the target URL and the user's SaaS-idea rebranding directive before running. URLs can also be passed inline.
4
4
  argument-hint: "[<url1> <url2> ...] (optional — defaults to launchframe.config.json)"
5
5
  user-invocable: true
6
6
  ---
@@ -42,13 +42,19 @@ If the user provides additional instructions (specific fidelity level, deeper cu
42
42
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
43
43
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
44
44
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
45
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
45
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
46
46
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
47
47
 
48
48
  ## Guiding Principles
49
49
 
50
50
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
51
51
 
52
+ ### 0. Launchframe priorities: media & motion (do not defer)
53
+
54
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
55
+
56
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
57
+
52
58
  ### 1. Completeness Beats Speed
53
59
 
54
60
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -193,11 +199,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
193
199
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
194
200
 
195
201
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
196
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
197
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
198
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
199
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
200
- 6. Verify: `npm run build` passes
202
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
203
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
204
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
205
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
206
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
207
+ 7. Verify: `npm run build` passes
201
208
 
202
209
  ### Asset Discovery Script Pattern
203
210
 
@@ -354,11 +361,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
354
361
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
355
362
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
356
363
  - **Transition:** transition: all 0.3s ease
357
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
364
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
358
365
 
359
366
  ### Hover states
360
367
  - **<Element>:** <property>: <before> → <after>, transition: <value>
361
368
 
369
+ ## Motion (Framer Motion vs CSS)
370
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
371
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
372
+ - **Keyframes / springs:** <if any — match target curve>
373
+
362
374
  ## Per-State Content (if applicable)
363
375
 
364
376
  ### State: "Featured"
@@ -370,9 +382,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
370
382
  - Title: "..."
371
383
  - Cards: [...]
372
384
 
373
- ## Assets
374
- - Background image: `public/images/<file>.webp`
375
- - Overlay image: `public/images/<file>.png`
385
+ ## Assets (images & video — required detail)
386
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
387
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
388
+ - Background layers: which div uses `background-image` and resolved URL → local path
376
389
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
377
390
 
378
391
  ## Text Content (verbatim)
@@ -446,7 +459,7 @@ For every section, replace:
446
459
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
447
460
 
448
461
  What you must NOT change in this pass:
449
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
462
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
450
463
  - Section order, section count, component structure
451
464
  - Interaction models (scroll-driven stays scroll-driven, etc.)
452
465
  - Any computed-style value extracted in Phase 3
@@ -480,6 +493,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
480
493
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
481
494
  - [ ] For hover states: before/after values and transition timing are recorded
482
495
  - [ ] All images in the section are identified (including overlays and layered compositions)
496
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
497
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
483
498
  - [ ] Responsive behavior is documented for at least desktop and mobile
484
499
  - [ ] Text content is verbatim from the site, not paraphrased
485
500
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -496,6 +511,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
496
511
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
497
512
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
498
513
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
514
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
515
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
499
516
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
500
517
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
501
518
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -510,7 +527,7 @@ When done, report:
510
527
  - Total sections built
511
528
  - Total components created
512
529
  - Total spec files written (should match components)
513
- - Total assets downloaded (images, videos, SVGs, fonts)
530
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
514
531
  - Rebrand summary (path to `docs/research/REBRAND.md`)
515
532
  - Build status (`npm run build` result)
516
533
  - Visual QA results (any remaining discrepancies)
@@ -44,13 +44,19 @@ If the user provides additional instructions (specific fidelity level, deeper cu
44
44
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
45
45
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
46
46
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
47
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
47
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
48
48
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
49
49
 
50
50
  ## Guiding Principles
51
51
 
52
52
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
53
53
 
54
+ ### 0. Launchframe priorities: media & motion (do not defer)
55
+
56
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
57
+
58
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
59
+
54
60
  ### 1. Completeness Beats Speed
55
61
 
56
62
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -195,11 +201,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
195
201
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
196
202
 
197
203
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
198
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
199
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
200
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
201
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
202
- 6. Verify: `npm run build` passes
204
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
205
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
206
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
207
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
208
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
209
+ 7. Verify: `npm run build` passes
203
210
 
204
211
  ### Asset Discovery Script Pattern
205
212
 
@@ -356,11 +363,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
356
363
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
357
364
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
358
365
  - **Transition:** transition: all 0.3s ease
359
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
366
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
360
367
 
361
368
  ### Hover states
362
369
  - **<Element>:** <property>: <before> → <after>, transition: <value>
363
370
 
371
+ ## Motion (Framer Motion vs CSS)
372
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
373
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
374
+ - **Keyframes / springs:** <if any — match target curve>
375
+
364
376
  ## Per-State Content (if applicable)
365
377
 
366
378
  ### State: "Featured"
@@ -372,9 +384,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
372
384
  - Title: "..."
373
385
  - Cards: [...]
374
386
 
375
- ## Assets
376
- - Background image: `public/images/<file>.webp`
377
- - Overlay image: `public/images/<file>.png`
387
+ ## Assets (images & video — required detail)
388
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
389
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
390
+ - Background layers: which div uses `background-image` and resolved URL → local path
378
391
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
379
392
 
380
393
  ## Text Content (verbatim)
@@ -448,7 +461,7 @@ For every section, replace:
448
461
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
449
462
 
450
463
  What you must NOT change in this pass:
451
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
464
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
452
465
  - Section order, section count, component structure
453
466
  - Interaction models (scroll-driven stays scroll-driven, etc.)
454
467
  - Any computed-style value extracted in Phase 3
@@ -482,6 +495,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
482
495
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
483
496
  - [ ] For hover states: before/after values and transition timing are recorded
484
497
  - [ ] All images in the section are identified (including overlays and layered compositions)
498
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
499
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
485
500
  - [ ] Responsive behavior is documented for at least desktop and mobile
486
501
  - [ ] Text content is verbatim from the site, not paraphrased
487
502
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -498,6 +513,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
498
513
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
499
514
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
500
515
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
516
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
517
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
501
518
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
502
519
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
503
520
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -512,7 +529,7 @@ When done, report:
512
529
  - Total sections built
513
530
  - Total components created
514
531
  - Total spec files written (should match components)
515
- - Total assets downloaded (images, videos, SVGs, fonts)
532
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
516
533
  - Rebrand summary (path to `docs/research/REBRAND.md`)
517
534
  - Build status (`npm run build` result)
518
535
  - Visual QA results (any remaining discrepancies)