launchframe 0.2.2 → 0.2.4

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.
@@ -31,16 +31,35 @@ When you see that with no other instructions, **start the full clone-website pip
31
31
  ## Tech Stack
32
32
  - **Framework:** Next.js 16 (App Router, React 19, TypeScript strict)
33
33
  - **UI:** shadcn/ui (Radix primitives, Tailwind CSS v4, `cn()` utility)
34
+ - **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.
34
35
  - **Icons:** Lucide React (default — will be replaced/supplemented by extracted SVGs)
35
36
  - **Styling:** Tailwind CSS v4 with oklch design tokens
37
+ - **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`.
36
38
  - **Deployment:** Vercel
37
39
 
40
+ ## Priority: images, videos & motion
41
+ Treat these as **first-class deliverables**, not polish at the end.
42
+
43
+ 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.
44
+ 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**.
45
+
38
46
  ## Commands
39
47
  - `npm run dev` — Start dev server
40
48
  - `npm run build` — Production build
41
49
  - `npm run lint` — ESLint check
42
50
  - `npm run typecheck` — TypeScript check
43
51
  - `npm run check` — Run lint + typecheck + build
52
+ - **`npm run recon`** — **Playwright** capture: full-page screenshots, `computed-snapshot.json`, `MEDIA_MANIFEST.md` (use when Browser MCP / Chrome DevTools MCP is broken or missing)
53
+ - **`npm run recon:headed`** — Same as `recon` but **headed** Chromium (often better for WAF / “Just a moment…” pages)
54
+
55
+ **Playwright browser binaries (once per machine):** `npx playwright install chromium`
56
+
57
+ ## When Browser MCP is down
58
+ Prefer **Playwright** for repeatable extraction in-repo — do **not** rely on Chrome DevTools MCP alone.
59
+
60
+ 1. Run **`npm run recon`** (or **`npm run recon:headed`** if headless hits a challenge page).
61
+ 2. Read **`docs/research/computed-snapshot.json`**, **`docs/research/MEDIA_MANIFEST.md`**, and **`docs/research/EXTRACTION_LIMITATIONS.md`** before writing specs.
62
+ 3. Fill **`scripts/download-assets.mjs`** from `MEDIA_MANIFEST.md` and run it to populate `public/images/` and `public/videos/`.
44
63
 
45
64
  ## Code Style
46
65
  - TypeScript strict mode, no `any`
@@ -50,6 +69,8 @@ When you see that with no other instructions, **start the full clone-website pip
50
69
  - Responsive: mobile-first
51
70
 
52
71
  ## Design Principles
72
+ - **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.
73
+ - **Motion fidelity** — timing and easing matter as much as color; use Framer Motion when CSS alone cannot match staggered or scroll-driven behavior.
53
74
  - **Pixel-perfect emulation** — match the target's spacing, colors, typography exactly
54
75
  - **No personal aesthetic changes during emulation phase** — match 1:1 first, rebrand later
55
76
  - **Real content during extraction** — use actual text and assets from the target site so the clone scaffolds against real shapes
@@ -83,83 +104,112 @@ scripts/ # Asset download scripts
83
104
  - After editing `AGENTS.md`, run `bash scripts/sync-agent-rules.sh` to regenerate platform-specific instruction files.
84
105
  - After editing `.claude/skills/clone-website/SKILL.md`, run `node scripts/sync-skills.mjs` to regenerate the skill for all platforms.
85
106
 
86
- # Website Inspection Guide
87
-
88
- ## How to Reverse-Engineer Any Website
89
-
90
- This guide outlines what to capture when inspecting a target website via Chrome MCP or browser DevTools.
91
-
92
- ## Phase 1: Visual Audit
93
-
94
- ### Screenshots to Capture
95
- - [ ] Every distinct pagedesktop, tablet, mobile
96
- - [ ] Dark mode variants (if applicable)
97
- - [ ] Light mode variants (if applicable)
98
- - [ ] Key interaction states (hover, active, open menus, modals)
99
- - [ ] Loading/skeleton states
100
- - [ ] Empty states
101
- - [ ] Error states
102
-
103
- ### Design Tokens to Extract
104
- - [ ] **Colors** — background, text (primary/secondary/muted), accent, border, hover, error, success, warning
105
- - [ ] **Typography** — font family, sizes (h1-h6, body, caption, label), weights, line heights, letter spacing
106
- - [ ] **Spacing** — padding/margin patterns (look for a scale: 4px, 8px, 12px, 16px, 24px, 32px, etc.)
107
- - [ ] **Border radius** — buttons, cards, avatars, inputs
108
- - [ ] **Shadows/elevation** — card shadows, dropdown shadows, modal overlay
109
- - [ ] **Breakpoints** — when does the layout shift? (inspect with DevTools responsive mode)
110
- - [ ] **Icons** — which icon library? custom SVGs? sizes?
111
- - [ ] **Avatars** — sizes, shapes, fallback behavior
112
- - [ ] **Buttons** — all variants (primary, secondary, ghost, icon-only, danger)
113
- - [ ] **Inputs** text fields, textareas, selects, checkboxes, toggles
114
-
115
- ## Phase 2: Component Inventory
116
-
117
- For each distinct UI component, document:
118
- 1. **Name** — what would you call this component?
119
- 2. **Structure** what HTML elements / child components does it contain?
120
- 3. **Variants** does it have different sizes, colors, or states?
121
- 4. **States** default, hover, active, disabled, loading, error, empty
122
- 5. **Responsive behavior** how does it change at different breakpoints?
123
- 6. **Interactions** click, hover, focus, keyboard navigation
124
- 7. **Animations** transitions, entrance/exit animations, micro-interactions
125
-
126
- ### Common Components to Look For
127
- - Navigation (top bar, sidebar, bottom bar)
128
- - Cards / list items
129
- - Buttons and links
130
- - Forms and inputs
131
- - Modals and dialogs
132
- - Dropdowns and menus
133
- - Tabs and segmented controls
134
- - Avatars and user badges
135
- - Loading skeletons
136
- - Toast notifications
137
- - Tooltips and popovers
138
-
139
- ## Phase 3: Layout Architecture
140
-
141
- - [ ] **Grid system** — CSS Grid? Flexbox? Fixed widths?
142
- - [ ] **Column layout** — how many columns at each breakpoint?
143
- - [ ] **Max-width** — main content area max-width
144
- - [ ] **Sticky elements** — header, sidebar, floating buttons
145
- - [ ] **Z-index layers** — navigation, modals, tooltips, overlays
146
- - [ ] **Scroll behavior** — infinite scroll, pagination, virtual scrolling
147
-
148
- ## Phase 4: Technical Stack Analysis
149
-
150
- - [ ] **Framework** — React? Vue? Angular? Check `__NEXT_DATA__`, `__NUXT__`, `ng-version`
151
- - [ ] **CSS approach** — Tailwind (utility classes), CSS Modules, Styled Components, Emotion, vanilla CSS
152
- - [ ] **State management** — Redux (check DevTools), React Query, Zustand, Pinia
153
- - [ ] **API patterns** — REST, GraphQL (check network tab for `/graphql` requests)
154
- - [ ] **Font loading** — Google Fonts, self-hosted, system fonts
155
- - [ ] **Image strategy** — CDN, lazy loading, srcset, WebP/AVIF
156
- - [ ] **Animation library** — Framer Motion, GSAP, CSS transitions only
157
-
158
- ## Phase 5: Documentation Output
159
-
160
- After inspection, create these files in `docs/research/`:
161
- 1. `DESIGN_TOKENS.md` All extracted colors, typography, spacing
162
- 2. `COMPONENT_INVENTORY.md` — Every component with structure notes
163
- 3. `LAYOUT_ARCHITECTURE.md` — Page layouts, grid system, responsive behavior
164
- 4. `INTERACTION_PATTERNS.md` Animations, transitions, hover states
165
- 5. `TECH_STACK_ANALYSIS.md` What the site uses and our chosen equivalents
107
+ # Website Inspection Guide
108
+
109
+ ## Priority (read first): media & motion
110
+
111
+ Launchframe clones live pages for a **visual** result. Two things most often separate a convincing build from a hollow one:
112
+
113
+ ### 1. Images & video (do this before obsessing over utility classes)
114
+
115
+ - [ ] **Every `<img>`** — `src` / `srcset` / `currentSrc`, `sizes`, `loading`, `decoding`, `alt`, intrinsic dimensions
116
+ - [ ] **`<picture>` / `<source>`**resolution switches, art direction, `type` (WebP/AVIF)
117
+ - [ ] **Every `<video>`** `src` + nested `<source>`, **poster**, `autoplay`, `loop`, `muted`, `playsinline`, `controls`
118
+ - [ ] **Background images** `background-image` on ancestors (hero stacks are often **layers** of img + gradient + PNG mockup)
119
+ - [ ] **Lazy / below-fold** scroll the page once before asset discovery so `data-src` / lazy-loaded URLs resolve if the site uses them
120
+ - [ ] **Download** — mirror into `public/images/` and `public/videos/` with stable paths; list failures in `docs/research/EXTRACTION_LIMITATIONS.md`
121
+
122
+ If automation hits a bot wall, **do not pretend extraction succeeded** — capture what you can from successful fetches and document gaps.
123
+
124
+ ### 2. Motion (prefer Framer Motion in this repo)
125
+
126
+ - [ ] **Entrance** — fade/slide/scale on mount or on **scroll into view** (note threshold / `margin`)
127
+ - [ ] **Stagger** — children animating in sequence (hero bullets, card grids)
128
+ - [ ] **Scroll-linked** — progress, parallax, pinned sections (may combine with CSS `animation-timeline` or libs)
129
+ - [ ] **Gestures** — drag, pan, hover follow (often Framer Motion)
130
+ - [ ] **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.
131
+
132
+ ---
133
+
134
+ ## How to Reverse-Engineer Any Website
135
+
136
+ This guide outlines what to capture when inspecting a target website via Chrome MCP or browser DevTools.
137
+
138
+ ## Phase 1: Visual Audit
139
+
140
+ ### Screenshots to Capture
141
+ - [ ] Every distinct page desktop, tablet, mobile
142
+ - [ ] Dark mode variants (if applicable)
143
+ - [ ] Light mode variants (if applicable)
144
+ - [ ] Key interaction states (hover, active, open menus, modals)
145
+ - [ ] Loading/skeleton states
146
+ - [ ] Empty states
147
+ - [ ] Error states
148
+ - [ ] **Video frames** capture a frame mid-play for reference if motion is subtle
149
+ - [ ] **Hero / full-bleed** — wide crops where raster layers are easy to miss
150
+
151
+ ### Design Tokens to Extract
152
+ - [ ] **Colors** — background, text (primary/secondary/muted), accent, border, hover, error, success, warning
153
+ - [ ] **Typography** — font family, sizes (h1-h6, body, caption, label), weights, line heights, letter spacing
154
+ - [ ] **Spacing** — padding/margin patterns (look for a scale: 4px, 8px, 12px, 16px, 24px, 32px, etc.)
155
+ - [ ] **Border radius** — buttons, cards, avatars, inputs
156
+ - [ ] **Shadows/elevation** — card shadows, dropdown shadows, modal overlay
157
+ - [ ] **Breakpoints** — when does the layout shift? (inspect with DevTools responsive mode)
158
+ - [ ] **Icons** — which icon library? custom SVGs? sizes?
159
+ - [ ] **Avatars** — sizes, shapes, fallback behavior
160
+ - [ ] **Buttons** — all variants (primary, secondary, ghost, icon-only, danger)
161
+ - [ ] **Inputs** — text fields, textareas, selects, checkboxes, toggles
162
+
163
+ ## Phase 2: Component Inventory
164
+
165
+ For each distinct UI component, document:
166
+ 1. **Name** — what would you call this component?
167
+ 2. **Structure** — what HTML elements / child components does it contain?
168
+ 3. **Variants** — does it have different sizes, colors, or states?
169
+ 4. **States** default, hover, active, disabled, loading, error, empty
170
+ 5. **Responsive behavior** — how does it change at different breakpoints?
171
+ 6. **Interactions** — click, hover, focus, keyboard navigation
172
+ 7. **Animations** — transitions, entrance/exit, micro-interactions **`framer-motion` vs CSS** and exact timing
173
+
174
+ ### Common Components to Look For
175
+ - Navigation (top bar, sidebar, bottom bar)
176
+ - Cards / list items
177
+ - Buttons and links
178
+ - Forms and inputs
179
+ - Modals and dialogs
180
+ - Dropdowns and menus
181
+ - Tabs and segmented controls
182
+ - Avatars and user badges
183
+ - Loading skeletons
184
+ - Toast notifications
185
+ - Tooltips and popovers
186
+ - **Video / Lottie / canvas** blocks (do not substitute with static mockups without documenting why)
187
+
188
+ ## Phase 3: Layout Architecture
189
+
190
+ - [ ] **Grid system** — CSS Grid? Flexbox? Fixed widths?
191
+ - [ ] **Column layout** — how many columns at each breakpoint?
192
+ - [ ] **Max-width** — main content area max-width
193
+ - [ ] **Sticky elements** — header, sidebar, floating buttons
194
+ - [ ] **Z-index layers** — navigation, modals, tooltips, overlays
195
+ - [ ] **Scroll behavior** — infinite scroll, pagination, virtual scrolling
196
+
197
+ ## Phase 4: Technical Stack Analysis
198
+
199
+ - [ ] **Framework** — React? Vue? Angular? Check `__NEXT_DATA__`, `__NUXT__`, `ng-version`
200
+ - [ ] **CSS approach** — Tailwind (utility classes), CSS Modules, Styled Components, Emotion, vanilla CSS
201
+ - [ ] **State management** — Redux (check DevTools), React Query, Zustand, Pinia
202
+ - [ ] **API patterns** — REST, GraphQL (check network tab for `/graphql` requests)
203
+ - [ ] **Font loading** — Google Fonts, self-hosted, system fonts
204
+ - [ ] **Image strategy** — CDN, lazy loading, srcset, WebP/AVIF — **mirror URLs you are allowed to fetch**
205
+ - [ ] **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
206
+
207
+ ## Phase 5: Documentation Output
208
+
209
+ After inspection, create these files in `docs/research/`:
210
+ 1. `DESIGN_TOKENS.md` — All extracted colors, typography, spacing
211
+ 2. `COMPONENT_INVENTORY.md` — Every component with structure notes
212
+ 3. **`MEDIA_MANIFEST.md`** — (recommended) Table of every image/video/poster URL → local `public/` path or “blocked”
213
+ 4. `LAYOUT_ARCHITECTURE.md` — Page layouts, grid system, responsive behavior
214
+ 5. `INTERACTION_PATTERNS.md` — Animations: **CSS vs Framer Motion**, transitions, hover states
215
+ 6. `TECH_STACK_ANALYSIS.md` — What the site uses and our chosen equivalents (Framer Motion for React animation)
@@ -36,16 +36,22 @@ If the user provides additional instructions (specific fidelity level, deeper cu
36
36
  ## Pre-Flight
37
37
 
38
38
  1. **Read `launchframe.config.json`** (see Step 0 above). After a fresh `npx launchframe` scaffold, proceed immediately — only echo `url`/`idea` for confirmation if the config looks wrong or the user asked to verify.
39
- 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.
39
+ 2. **Browser automation.** Prefer an MCP (Chrome DevTools MCP, Playwright MCP, Browserbase MCP, etc.) when it is healthy. **If MCP is missing or in an error state, run `npm run recon` (Playwright)** — see `scripts/recon-playwright.mjs`. It writes `docs/research/computed-snapshot.json`, `docs/research/MEDIA_MANIFEST.md`, and full-page screenshots under `docs/design-references/`. Use `npm run recon:headed` if headless hits a WAF/challenge page. One-time install: `npx playwright install chromium`. Do not skip extraction — adapt the pipeline to the tools that work.
40
40
  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.
41
41
  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.
42
- 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>/`.
42
+ 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>/`.
43
43
  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.
44
44
 
45
45
  ## Guiding Principles
46
46
 
47
47
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
48
48
 
49
+ ### 0. Launchframe priorities: media & motion (do not defer)
50
+
51
+ **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.
52
+
53
+ **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.
54
+
49
55
  ### 1. Completeness Beats Speed
50
56
 
51
57
  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.
@@ -190,11 +196,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
190
196
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
191
197
 
192
198
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
193
- 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)
194
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
195
- 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`).
196
- 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.
197
- 6. Verify: `npm run build` passes
199
+ 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.
200
+ 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)
201
+ 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.
202
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
203
+ 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`).
204
+ 7. Verify: `npm run build` passes
198
205
 
199
206
  ### Asset Discovery Script Pattern
200
207
 
@@ -351,11 +358,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
351
358
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
352
359
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
353
360
  - **Transition:** transition: all 0.3s ease
354
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
361
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
355
362
 
356
363
  ### Hover states
357
364
  - **<Element>:** <property>: <before> → <after>, transition: <value>
358
365
 
366
+ ## Motion (Framer Motion vs CSS)
367
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
368
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
369
+ - **Keyframes / springs:** <if any — match target curve>
370
+
359
371
  ## Per-State Content (if applicable)
360
372
 
361
373
  ### State: "Featured"
@@ -367,9 +379,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
367
379
  - Title: "..."
368
380
  - Cards: [...]
369
381
 
370
- ## Assets
371
- - Background image: `public/images/<file>.webp`
372
- - Overlay image: `public/images/<file>.png`
382
+ ## Assets (images & video — required detail)
383
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
384
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
385
+ - Background layers: which div uses `background-image` and resolved URL → local path
373
386
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
374
387
 
375
388
  ## Text Content (verbatim)
@@ -443,7 +456,7 @@ For every section, replace:
443
456
  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.
444
457
 
445
458
  What you must NOT change in this pass:
446
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
459
+ - 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
447
460
  - Section order, section count, component structure
448
461
  - Interaction models (scroll-driven stays scroll-driven, etc.)
449
462
  - Any computed-style value extracted in Phase 3
@@ -477,6 +490,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
477
490
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
478
491
  - [ ] For hover states: before/after values and transition timing are recorded
479
492
  - [ ] All images in the section are identified (including overlays and layered compositions)
493
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
494
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
480
495
  - [ ] Responsive behavior is documented for at least desktop and mobile
481
496
  - [ ] Text content is verbatim from the site, not paraphrased
482
497
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -493,6 +508,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
493
508
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
494
509
  - **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.
495
510
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
511
+ - **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.
512
+ - **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.
496
513
  - **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.
497
514
  - **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.
498
515
  - **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.
@@ -507,7 +524,7 @@ When done, report:
507
524
  - Total sections built
508
525
  - Total components created
509
526
  - Total spec files written (should match components)
510
- - Total assets downloaded (images, videos, SVGs, fonts)
527
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
511
528
  - Rebrand summary (path to `docs/research/REBRAND.md`)
512
529
  - Build status (`npm run build` result)
513
530
  - Visual QA results (any remaining discrepancies)
@@ -1,20 +1,22 @@
1
- ---
2
- description: Launchframe — open folder, say "Build it", full clone + rebrand pipeline
3
- alwaysApply: true
4
- ---
5
-
6
- This is a **Launchframe** project: `launchframe.config.json` holds the target `url` and SaaS `idea`. `AGENTS.md` is the extended source of truth.
7
-
8
- ## Shorthand (what users actually type)
9
-
10
- When the user says **Build it**, **Go**, **Ship it**, **Clone the site**, **Run launchframe**, or similar, with **no** new URL or idea in the same message:
11
-
12
- 1. Read `launchframe.config.json` first (authoritative `url` + `idea`).
13
- 2. Execute the **full** workflow described in `AGENTS.md` and in `.cursor/commands/clone-website.md` (recon → foundation → component specs → build → SaaS rebrand pass → assembly → QA).
14
- 3. Continue until `npm run build` passes unless the user stops you.
15
-
16
- Do **not** ask the user to re-type the URL or idea unless the config is missing or broken. Optional: use **`/clone-website`** as the explicit slash-command alias.
17
-
18
- ## Browser automation
19
-
20
- If no Browser MCP is available, use Playwright or another local browser the user has and document limits (e.g. Cloudflare) in `docs/research/EXTRACTION_LIMITATIONS.md` when the real page is not reachable.
1
+ ---
2
+ description: Launchframe — open folder, say "Build it", full clone + rebrand pipeline
3
+ alwaysApply: true
4
+ ---
5
+
6
+ This is a **Launchframe** project: `launchframe.config.json` holds the target `url` and SaaS `idea`. `AGENTS.md` is the extended source of truth.
7
+
8
+ ## Shorthand (what users actually type)
9
+
10
+ When the user says **Build it**, **Go**, **Ship it**, **Clone the site**, **Run launchframe**, or similar, with **no** new URL or idea in the same message:
11
+
12
+ 1. Read `launchframe.config.json` first (authoritative `url` + `idea`).
13
+ 2. Execute the **full** workflow described in `AGENTS.md` and in `.cursor/commands/clone-website.md` (recon → foundation → component specs → build → SaaS rebrand pass → assembly → QA).
14
+ 3. Continue until `npm run build` passes unless the user stops you.
15
+
16
+ Do **not** ask the user to re-type the URL or idea unless the config is missing or broken. Optional: use **`/clone-website`** as the explicit slash-command alias.
17
+
18
+ ## Browser automation
19
+
20
+ If no Browser MCP is available **or Chrome DevTools MCP is in an error state**, run **`npm run recon`** (Playwright) then continue the pipeline from `docs/research/computed-snapshot.json` and `MEDIA_MANIFEST.md`. Use **`npm run recon:headed`** for tough WAF pages. Install browsers once: **`npx playwright install chromium`**.
21
+
22
+ If Playwright still hits a challenge page, document it in **`docs/research/EXTRACTION_LIMITATIONS.md`** and fall back only as a last resort.
@@ -40,16 +40,22 @@ If the user provides additional instructions (specific fidelity level, deeper cu
40
40
  ## Pre-Flight
41
41
 
42
42
  1. **Read `launchframe.config.json`** (see Step 0 above). After a fresh `npx launchframe` scaffold, proceed immediately — only echo `url`/`idea` for confirmation if the config looks wrong or the user asked to verify.
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.
43
+ 2. **Browser automation.** Prefer an MCP (Chrome DevTools MCP, Playwright MCP, Browserbase MCP, etc.) when it is healthy. **If MCP is missing or in an error state, run `npm run recon` (Playwright)** — see `scripts/recon-playwright.mjs`. It writes `docs/research/computed-snapshot.json`, `docs/research/MEDIA_MANIFEST.md`, and full-page screenshots under `docs/design-references/`. Use `npm run recon:headed` if headless hits a WAF/challenge page. One-time install: `npx playwright install chromium`. Do not skip extraction — adapt the pipeline to the tools that work.
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)