Amazon Product Landing Page Builder
You are about to build a premium landing page for the Amazon product at $ARGUMENTS.
If the argument is a bare ASIN, the URL is https://www.amazon.com/dp/<ASIN>.
The bar is not "a clean template with the product dropped in". The bar is a page the brand
could have commissioned from a good agency: a design direction chosen for THIS product, a
distinctive type pairing, a palette pulled from the product itself, one signature visual
device, and copy that sounds like a person. Read references/design-playbook.md before
you write a line of HTML. It holds the patterns that made the best pages good.
Building it in one pass is not how the good ones happen. Phase 5 gets a correct page.
Phase 6 is where it becomes worth shipping, and it is not optional.
Reference build: B08V4PTCMR, the Ortizan X10 speaker in pink. That is the standard.
Its first draft was clean and forgettable. The elevation pass gave it a hero that arrives
in eight staggered beats, a signature light ring built from the product's own RGB feature
and reused at three sizes, grain and mesh under the colour, a bento feature grid, a
filmstrip gallery, and a near black section for the light show. Same data, same product,
same reviews. If your finished page would not sit next to that one, you stopped at Phase 5.
Requirements
- Chrome MCP is required. Test it first. If it is not available, stop and tell the user
to connect Chrome to Claude Code.
- One HTML file with Tailwind via CDN (no build step) plus an
images/ folder.
- Every fact on the page comes from the real Amazon page. Never invent a review, a number,
a badge or a spec.
- No em dashes and no en dashes anywhere in the copy. Periods and commas.
Process
Phase 1: Setup
- Create
amazon-landing-page-[short-product-name]/ in the current directory
(lowercase, hyphens, the product not the ASIN: amazon-landing-page-tongue-drum).
- Create
images/ inside it.
Phase 2: Extract product data via Chrome MCP
- Open the Amazon URL in Chrome MCP. Wait about 3 seconds for the page to settle.
- Extract with JavaScript execution:
// Product basics
({
title: document.getElementById('productTitle')?.textContent?.trim(),
price: document.querySelector('.a-price .a-offscreen')?.textContent?.trim(),
listPrice: document.querySelector('.basisPrice .a-offscreen, .a-text-price .a-offscreen')?.textContent?.trim(),
rating: document.querySelector('#acrPopover')?.title || document.querySelector('.a-icon-alt')?.textContent,
reviewCount: document.querySelector('#acrCustomerReviewText')?.textContent?.trim(),
brand: document.querySelector('#bylineInfo')?.textContent?.trim(),
badges: document.querySelector('#acBadge_feature_div, #zeitgeistBadge_feature_div')?.textContent?.trim(),
boughtRecently: document.querySelector('#social-proofing-faceout-title-tk_bought')?.textContent?.trim()
})
// Feature bullets
Array.from(document.querySelectorAll('#feature-bullets .a-list-item'))
.map(el => el.textContent?.trim()).filter(t => t && t.length > 10)
// Product details table (materials, dimensions, weight, what is included)
Array.from(document.querySelectorAll('#productDetails_techSpec_section_1 tr, #detailBullets_feature_div li, #productOverview_feature_div tr'))
.map(r => r.textContent.replace(/\s+/g,' ').trim()).filter(Boolean).slice(0,30)
// High-res image URLs, gallery order
Array.from(document.querySelectorAll('#altImages .a-button-thumbnail img'))
.map(img => img.src.replace(/\._.*_\./, '._SL1500_.'))
.filter(s => s.includes('images/I/'))
- Scroll to the reviews and extract REAL reviews only:
Array.from(document.querySelectorAll('[data-hook="review"]')).map(r => ({
stars: parseFloat(r.querySelector('[data-hook="review-star-rating"] .a-icon-alt')?.textContent || '0'),
title: r.querySelector('[data-hook="review-title"] span:last-child')?.textContent?.trim(),
body: r.querySelector('[data-hook="review-body"] span')?.textContent?.trim(),
author: r.querySelector('.a-profile-name')?.textContent?.trim(),
date: r.querySelector('[data-hook="review-date"]')?.textContent?.trim(),
verified: !!r.querySelector('[data-hook="avp-badge"]')
})).filter(r => r.stars >= 4 && r.body && r.body.length > 20 && r.verified)
If body comes back empty (Amazon changes its review markup often), fall back to
r.innerText per review and split it yourself: the first line is the author, then the star
line, then the title, then "Reviewed in ... on ", then "Verified Purchase" or "Vine
Customer Review of Free Product", then the body. Vine reviews are real but not verified
purchases: you may use them, labeled "Vine reviewer", never as "Verified".
If fewer than 3 usable reviews come back, open https://www.amazon.com/product-reviews/<ASIN>
and run the same extraction there. Trim long reviews to the strongest 1 to 3 sentences, keep
the words as written.
Price traps. If the page shows a foreign currency (ILS, EUR) or "cannot be shipped to
your location", the buy box is hidden and .a-price is a converted reference price. Get the
real USD figures from the page's embedded data instead:
var h=document.documentElement.outerHTML;
({usd:[...new Set(h.match(/\$\s?\d{2,4}\.\d{2}/g)||[])].slice(0,12),
list:(h.match(/formattedFullPrice[^$]*(\$[\d,]+\.\d{2})/)||[])[1],
save:(h.match(/percentageDisplayString[^%]*?(\d+)%/)||[])[1]})
The price to pay appears with "currencyCode":"USD" next to it; the list price as
formattedFullPrice; the saving as percentageDisplayString. Confirm the three agree
(price + saving = list) before using them.
Image trap. #altImages thumbnails are 40px sources and the _SL1500_ swap on them
returns 500px files. The full-size set is in the page script under colorImages:
[...document.scripts].map(s=>s.textContent).find(t=>t.includes('colorImages')).match(/"hiRes":"([^"]+)"/g).map(x=>x.split('"')[3])
That list is in gallery order and includes every image, 1500px. Video thumbnails
(play-icon-overlay in the URL) are not images; skip them.
Phase 3: Download images
curl -sL "[image-url]" -o images/product-1.jpg
Name them in gallery order (product-1.jpg is the main image). Check every file is over
10 KB; a 9-byte file is a blocked download, drop it and move on. Never retry a blocked URL.
Phase 4: Design direction (write it down before building)
Open the downloaded images with the Read tool. Look at the product, its packaging, the
lifestyle shots, and the brand's own colors. Then write a six-line brief into
DESIGN.md in the project folder:
- Audience and mood in one sentence. Who buys this and how the page should feel.
- Direction, one of the archetypes in the playbook (Expedition, Atelier, Playground,
Lab, Pantry, Boutique, Workshop) or a named blend. Say why it fits this product.
- Type pairing: display font + body font + mono for labels. Pick from the playbook
table for the direction. Inter on its own is never the answer.
- Palette: 5 tokens with hex codes, all pulled from the product images or packaging:
brand (the product's own color), accent (contrast for CTAs), ink, paper, and
one tint. Name them after the product ("trail", "hydro") so the code reads well.
- Signature device: exactly one from the playbook (topographic contours, spec marquee,
spotlight hero, floating spec chips, outlined numerals, bento feature grid, editorial
pull-quote, product-color section bands). One. Two is a costume party.
- Headline: three words to six, the promise not the product name. Write three
options and choose one.
This brief is the contract for Phase 5. It is what stops every page from looking like the
previous one.
Phase 5: Build the landing page
Create index.html. Sections in this order, each with an id:
- Nav: fixed, pill or bar with backdrop blur, brand mark (initial in a colored square
plus the name), section links (hidden on mobile), "Buy on Amazon · $price" button.
- Hero: the direction's hero recipe from the playbook. Eyebrow row (badge as extracted,
plus a mono category label), the headline in display type at 4.5 to 5rem with one
accented phrase, a two-line subhead written from the bullets, stars with the real
rating and count linking to Amazon reviews, price (with list price struck through if
there is one), the CTA with a soft pulse, three trust chips (30-Day Returns, Ships via
Amazon, and one that is true for this product). Image side: main image with a slow
float, one or two floating spec chips that quote real specs, and a thumbnail row that
swaps the main image.
- Proof line, not a stat strip. No row of big counters ("60W / 8h / 4.8 stars"). Every AI
landing page has one and it reads as filler. If the product has one number that sells it,
put that number inside the feature that earns it, in a sentence. Rating and review count
live in the hero and in the reviews section, nowhere else.
- Features (
id="features"): 5 to 6 features rewritten from the bullets, short
title plus one sentence each. Not a grid of equal cards. Give the strongest feature its
own full-width moment (a large image beside big type, or a bento tile that spans two
columns), then the rest smaller. Where the listing has an infographic for a feature, use
it as that feature's image. Icons are inline SVG, never an icon font.
- In the box / detail: an image beside a checklist, from the bullets and the details
table. Include dimensions and materials when the listing has them.
- Gallery (
id="gallery"): every product image, masonry or 3-column, hover zoom.
Amazon infographic images go here as they are; they carry the seller's own callouts.
- Email capture: dark or brand-colored band, one input plus button, VIP-list copy in
the product's voice. Keep the two config constants at the top of the script:
const GOOGLE_FORM_URL = ''; // Seller fills this in
const EMAIL_FIELD_ID = ''; // Seller fills this in
On submit with empty config, show the success state and a link to Amazon anyway.
- Reviews (
id="reviews"): 4 to 6 verified reviews, each with a bold title line,
stars, author, date, "Verified" chip. Headline uses the real count ("Trusted by 1,046
adventurers"). Link "Read all reviews on Amazon".
- FAQ (
id="faq"): 5 to 6 questions a real shopper asks about THIS product type,
answered from the bullets and details. Accordion, one open at a time.
- Final CTA: a full-width band in the brand color or ink, headline, price, button,
two trust lines.
- Footer: brand mark, section links, disclaimer: "Independent product page. [Brand]
is a registered trademark of its owner. Purchase fulfilled by Amazon.com."
- Sticky mobile bar: price plus Buy button, appears after the hero scrolls out.
Design ambition, before the technical rules. A page that passes QA can still be flat. Read
the finished layout against these and fix what fails:
- Rhythm. No two consecutive sections share a background tone or a layout shape. Dark,
paper, full-bleed photo, paper, dark. Two columns, then one, then a grid, then a band.
- One full-bleed photo section. The best lifestyle image from the listing, edge to edge,
with a short line of display type on it and nothing else. This is the breath in the page.
- Scale contrast. At least one headline at 5rem or more, and body copy that stays at 17
to 19px. Big and small next to each other is what makes a page feel designed.
- Asymmetry somewhere. A headline that overlaps the edge of an image, a card that sits
off the grid, a photo that bleeds off the right edge while the copy sits in the grid.
- The product in the copy's color. Pull one image out of its white background with a
soft drop shadow or place it on a tinted plate, so the product sits IN the page instead
of on top of it.
- Whitespace as a material. 96 to 128px between sections on desktop. Cramped is the
first thing an eye reads as cheap.
- Details that only a person would add. A mono label with the ASIN or the pack's
capacity in the corner of the hero. A hand-set pull quote. A tiny drawn icon that matches
the product, not a generic one.
Technical rules:
Phase 6: The elevation pass (do not skip this)
The page you just built is the draft, not the deliverable. Phase 5 gets the structure,
the real data and a defensible direction onto the screen. It reliably produces a page that
is correct and slightly flat. The difference between "clean" and "a brand paid for this" is
made here, and it is made on purpose, not by luck.
Copy the draft to index-v1.html first, so the lift is visible and reversible. Then go
back through the page and raise it two levels. Not a restyle. Each lane below changes what
the page does, and each one has a concrete implementation.
Give the hero an entrance. A page that fades in as one block reads as a template.
Stagger it: put a .hi class on the eyebrow, each line of the headline, the subhead, the
stars, the price and the CTA, each with its own style="--d:.12s" delay. Gate the whole
thing on a loaded class added by a double requestAnimationFrame, never on
window.onload, which would hold the hero hostage to the last image.
html.js-anim .hi{ opacity:0; transform:translateY(22px); }
html.js-anim.loaded .hi{ animation:rise .9s cubic-bezier(.16,.8,.3,1) forwards; animation-delay:var(--d,0s); }
@keyframes rise{ to{ opacity:1; transform:none; } }
requestAnimationFrame(function(){ requestAnimationFrame(function(){
document.documentElement.classList.add('loaded'); }); });
Build the signature device for real. In Phase 5 it is usually a gradient and a
promise. Now make it out of the product itself. The Ortizan speaker has an RGB light
ring, so the page got an actual ring: a conic-gradient through the product's own light
colours, an animatable angle via @property --a, a blurred masked halo behind the
product, and the same ring reused at 9px as the nav mark and as a status dot. One device,
built once, reused three times at three sizes. That repetition is what reads as identity.
@property --a { syntax:'<angle>'; inherits:false; initial-value:0deg; }
.ring{ --a:0deg; background:conic-gradient(from var(--a), var(--hot), var(--sun), var(--cyan), var(--hot)); }
.halo{ background:conic-gradient(from 0deg, var(--hot), var(--sun), var(--cyan), var(--hot));
mask:radial-gradient(farthest-side, transparent 46%, #000 63%, #000 80%, transparent 100%);
filter:blur(26px); animation:spin 18s linear infinite; }
Put material under the colour. Flat hex fills are the tell. Add, in this order:
a mesh gradient ground (three or four soft radial-gradient blobs in the palette over
the paper colour), a grain overlay (inline SVG feTurbulence at opacity:.09,
mix-blend-mode:soft-light) on the hero and the dark sections, and backdrop-filter
glass on the nav and any floating chips. Cheap, and it is most of the perceived jump.
Break the equal grid. If the features are still six cards of the same size, convert
to a bento: one tile spanning two columns with the strongest claim and a real image, one
tall tile, four normal. Give tiles a lift on hover
(transform:translateY(-5px) plus a deeper shadow) and scale the image inside to 1.04.
Turn the gallery into a filmstrip. Replace the masonry with a horizontal
scroll-snap-type:x mandatory strip, numbered lbl captions under each frame, prev and
next buttons, and a progress bar that tracks scrollLeft. It bleeds off the right edge,
which is the asymmetry the page was missing.
Give the best feature its own room. Find the one thing the product does that a
photograph cannot show and build a section for it, in the opposite tone to the rest of
the page. On the Ortizan that is a near black "night" section for the light show, sitting
between two bright ones. This is the section a competitor cannot paste onto their page.
Micro-interactions everywhere a finger goes. Buttons lift 2px on hover and settle to
scale(.98) on press, with a blurred glow ring behind the primary CTA. Swap the FAQ from
max-height to grid-template-rows:0fr to 1fr, which animates to the true height with
no magic number and no clipped answers. Thumbnails lift on hover.
Let the type get loud. One display face with real character, one number face for the
price and the spec numerals, tracking tightened to -.035em at the top size. Reserve
gradient text for exactly one phrase in the headline. Body stays 17 to 19px.
Housekeeping while you are in there: hoist any icon you repeat more than twice into an
<svg><symbol> sprite at the top of the body and call it with <use href="#star"/>. A
five pointed star pasted thirty times is thirty times the bytes and the first thing that
looks generated.
The bar. Open index-v1.html and index.html side by side. If you cannot name three
things that changed structurally, you restyled instead of elevating. Go again.
Phase 7: QA before you show it
- Open
index.html in the browser (Chrome MCP or open index.html).
- Take a full-page screenshot and LOOK at it. Then check, in this order:
- Every image loaded (no broken icons, no 9-byte files).
- No text overflows its box at desktop and at 390px width.
- The headline is the promise, not the Amazon title.
- Nothing on the page is invented: every number, badge and review traces to Phase 2.
- No em or en dash anywhere:
grep -c "—\|–" index.html must print 0.
- The reveal classes do not hide content when JS runs late (scroll to the bottom, all
sections visible).
- No infographic is cropped by a bleed or a negative margin; every callout at its edges
is readable. Full-bleed photos show no baked-in text panel.
- The page does not look like the last page you built. If it does, the direction in
DESIGN.md was not followed; fix the page, not the brief.
- Phase 6 actually happened.
index-v1.html exists and the two files differ by more
than colours.
- Fix what you found. Do not report "done" with a known defect.
Judge animation only in a visible window. A hidden or backgrounded browser pane freezes
requestAnimationFrame and every CSS animation, so all your reveal and entrance elements
measure at opacity:0 and the page looks catastrophically broken when nothing is wrong.
Before you believe that reading, check document.visibilityState. If it says hidden,
front the tab and measure again rather than "fixing" working code.
Phase 8: Hand over
Tell the user, in four lines: the design direction you chose and why, what the page
contains (sections, number of real reviews used), the two things they must do before
publishing (put their attribution link on the buy buttons, paste the Google Form URL and
field id for email capture), and the path. Then open the page.
Important rules
- NEVER fabricate reviews, ratings, counts, badges or specs. If a section has no real data,
leave it out and say so.
- The headline is a rewritten promise, never the Amazon title.
- One design direction per page, written down first, followed to the end.
- No Inter-only typography, no purple-gradient-on-white, no generic dark theme by default.
- FAQ answers come from the listing, phrased plainly. Unknown is "check the listing", not
a guess.
- The page should look like the brand made it, not like a template with a logo swapped.
- Never hand over the Phase 5 draft. The elevation pass in Phase 6 is part of the job, not
an upsell, and
index-v1.html is the proof it ran.
1---2name: amazon-landing-page-23description: Build a premium, brand-specific landing page from any Amazon product URL. Reads the real listing through Chrome (title, images, bullets, price, verified reviews), picks a bold design direction that fits the product, and writes one self-contained HTML file with a gallery, real reviews, FAQ, email capture and a sticky mobile buy bar. Use when the user says "build a landing page", "create a product page", "amazon landing page", or gives an Amazon product URL or ASIN.4---56# Amazon Product Landing Page Builder78You are about to build a premium landing page for the Amazon product at **$ARGUMENTS**.9If the argument is a bare ASIN, the URL is `https://www.amazon.com/dp/<ASIN>`.1011The bar is not "a clean template with the product dropped in". The bar is a page the brand12could have commissioned from a good agency: a design direction chosen for THIS product, a13distinctive type pairing, a palette pulled from the product itself, one signature visual14device, and copy that sounds like a person. Read `references/design-playbook.md` before15you write a line of HTML. It holds the patterns that made the best pages good.1617Building it in one pass is not how the good ones happen. Phase 5 gets a correct page.18**Phase 6 is where it becomes worth shipping, and it is not optional.**1920**Reference build: `B08V4PTCMR`, the Ortizan X10 speaker in pink.** That is the standard.21Its first draft was clean and forgettable. The elevation pass gave it a hero that arrives22in eight staggered beats, a signature light ring built from the product's own RGB feature23and reused at three sizes, grain and mesh under the colour, a bento feature grid, a24filmstrip gallery, and a near black section for the light show. Same data, same product,25same reviews. If your finished page would not sit next to that one, you stopped at Phase 5.2627## Requirements2829- **Chrome MCP is required.** Test it first. If it is not available, stop and tell the user30 to connect Chrome to Claude Code.31- One HTML file with Tailwind via CDN (no build step) plus an `images/` folder.32- Every fact on the page comes from the real Amazon page. Never invent a review, a number,33 a badge or a spec.34- No em dashes and no en dashes anywhere in the copy. Periods and commas.3536## Process3738### Phase 1: Setup39401. Create `amazon-landing-page-[short-product-name]/` in the current directory41 (lowercase, hyphens, the product not the ASIN: `amazon-landing-page-tongue-drum`).422. Create `images/` inside it.4344### Phase 2: Extract product data via Chrome MCP45461. Open the Amazon URL in Chrome MCP. Wait about 3 seconds for the page to settle.472. Extract with JavaScript execution:4849```javascript50// Product basics51({52 title: document.getElementById('productTitle')?.textContent?.trim(),53 price: document.querySelector('.a-price .a-offscreen')?.textContent?.trim(),54 listPrice: document.querySelector('.basisPrice .a-offscreen, .a-text-price .a-offscreen')?.textContent?.trim(),55 rating: document.querySelector('#acrPopover')?.title || document.querySelector('.a-icon-alt')?.textContent,56 reviewCount: document.querySelector('#acrCustomerReviewText')?.textContent?.trim(),57 brand: document.querySelector('#bylineInfo')?.textContent?.trim(),58 badges: document.querySelector('#acBadge_feature_div, #zeitgeistBadge_feature_div')?.textContent?.trim(),59 boughtRecently: document.querySelector('#social-proofing-faceout-title-tk_bought')?.textContent?.trim()60})61```6263```javascript64// Feature bullets65Array.from(document.querySelectorAll('#feature-bullets .a-list-item'))66 .map(el => el.textContent?.trim()).filter(t => t && t.length > 10)67```6869```javascript70// Product details table (materials, dimensions, weight, what is included)71Array.from(document.querySelectorAll('#productDetails_techSpec_section_1 tr, #detailBullets_feature_div li, #productOverview_feature_div tr'))72 .map(r => r.textContent.replace(/\s+/g,' ').trim()).filter(Boolean).slice(0,30)73```7475```javascript76// High-res image URLs, gallery order77Array.from(document.querySelectorAll('#altImages .a-button-thumbnail img'))78 .map(img => img.src.replace(/\._.*_\./, '._SL1500_.'))79 .filter(s => s.includes('images/I/'))80```81823. Scroll to the reviews and extract REAL reviews only:8384```javascript85Array.from(document.querySelectorAll('[data-hook="review"]')).map(r => ({86 stars: parseFloat(r.querySelector('[data-hook="review-star-rating"] .a-icon-alt')?.textContent || '0'),87 title: r.querySelector('[data-hook="review-title"] span:last-child')?.textContent?.trim(),88 body: r.querySelector('[data-hook="review-body"] span')?.textContent?.trim(),89 author: r.querySelector('.a-profile-name')?.textContent?.trim(),90 date: r.querySelector('[data-hook="review-date"]')?.textContent?.trim(),91 verified: !!r.querySelector('[data-hook="avp-badge"]')92})).filter(r => r.stars >= 4 && r.body && r.body.length > 20 && r.verified)93```9495If `body` comes back empty (Amazon changes its review markup often), fall back to96`r.innerText` per review and split it yourself: the first line is the author, then the star97line, then the title, then "Reviewed in ... on <date>", then "Verified Purchase" or "Vine98Customer Review of Free Product", then the body. Vine reviews are real but not verified99purchases: you may use them, labeled "Vine reviewer", never as "Verified".100101If fewer than 3 usable reviews come back, open `https://www.amazon.com/product-reviews/<ASIN>`102and run the same extraction there. Trim long reviews to the strongest 1 to 3 sentences, keep103the words as written.104105**Price traps.** If the page shows a foreign currency (ILS, EUR) or "cannot be shipped to106your location", the buy box is hidden and `.a-price` is a converted reference price. Get the107real USD figures from the page's embedded data instead:108109```javascript110var h=document.documentElement.outerHTML;111({usd:[...new Set(h.match(/\$\s?\d{2,4}\.\d{2}/g)||[])].slice(0,12),112 list:(h.match(/formattedFullPrice[^$]*(\$[\d,]+\.\d{2})/)||[])[1],113 save:(h.match(/percentageDisplayString[^%]*?(\d+)%/)||[])[1]})114```115116The price to pay appears with `"currencyCode":"USD"` next to it; the list price as117`formattedFullPrice`; the saving as `percentageDisplayString`. Confirm the three agree118(price + saving = list) before using them.119120**Image trap.** `#altImages` thumbnails are 40px sources and the `_SL1500_` swap on them121returns 500px files. The full-size set is in the page script under `colorImages`:122123```javascript124[...document.scripts].map(s=>s.textContent).find(t=>t.includes('colorImages')).match(/"hiRes":"([^"]+)"/g).map(x=>x.split('"')[3])125```126127That list is in gallery order and includes every image, 1500px. Video thumbnails128(`play-icon-overlay` in the URL) are not images; skip them.129130### Phase 3: Download images131132```bash133curl -sL "[image-url]" -o images/product-1.jpg134```135136Name them in gallery order (`product-1.jpg` is the main image). Check every file is over13710 KB; a 9-byte file is a blocked download, drop it and move on. Never retry a blocked URL.138139### Phase 4: Design direction (write it down before building)140141Open the downloaded images with the Read tool. Look at the product, its packaging, the142lifestyle shots, and the brand's own colors. Then write a six-line brief into143`DESIGN.md` in the project folder:1441451. **Audience and mood** in one sentence. Who buys this and how the page should feel.1462. **Direction**, one of the archetypes in the playbook (Expedition, Atelier, Playground,147 Lab, Pantry, Boutique, Workshop) or a named blend. Say why it fits this product.1483. **Type pairing**: display font + body font + mono for labels. Pick from the playbook149 table for the direction. Inter on its own is never the answer.1504. **Palette**: 5 tokens with hex codes, all pulled from the product images or packaging:151 `brand` (the product's own color), `accent` (contrast for CTAs), `ink`, `paper`, and152 one `tint`. Name them after the product ("trail", "hydro") so the code reads well.1535. **Signature device**: exactly one from the playbook (topographic contours, spec marquee,154 spotlight hero, floating spec chips, outlined numerals, bento feature grid, editorial155 pull-quote, product-color section bands). One. Two is a costume party.1566. **Headline**: three words to six, the promise not the product name. Write three157 options and choose one.158159This brief is the contract for Phase 5. It is what stops every page from looking like the160previous one.161162### Phase 5: Build the landing page163164Create `index.html`. Sections in this order, each with an id:1651661. **Nav**: fixed, pill or bar with backdrop blur, brand mark (initial in a colored square167 plus the name), section links (hidden on mobile), "Buy on Amazon · $price" button.1682. **Hero**: the direction's hero recipe from the playbook. Eyebrow row (badge as extracted,169 plus a mono category label), the headline in display type at 4.5 to 5rem with one170 accented phrase, a two-line subhead written from the bullets, stars with the real171 rating and count linking to Amazon reviews, price (with list price struck through if172 there is one), the CTA with a soft pulse, three trust chips (30-Day Returns, Ships via173 Amazon, and one that is true for this product). Image side: main image with a slow174 float, one or two floating spec chips that quote real specs, and a thumbnail row that175 swaps the main image.1763. **Proof line, not a stat strip.** No row of big counters ("60W / 8h / 4.8 stars"). Every AI177 landing page has one and it reads as filler. If the product has one number that sells it,178 put that number inside the feature that earns it, in a sentence. Rating and review count179 live in the hero and in the reviews section, nowhere else.1804. **Features** (`id="features"`): 5 to 6 features rewritten from the bullets, short181 title plus one sentence each. Not a grid of equal cards. Give the strongest feature its182 own full-width moment (a large image beside big type, or a bento tile that spans two183 columns), then the rest smaller. Where the listing has an infographic for a feature, use184 it as that feature's image. Icons are inline SVG, never an icon font.1855. **In the box / detail**: an image beside a checklist, from the bullets and the details186 table. Include dimensions and materials when the listing has them.1876. **Gallery** (`id="gallery"`): every product image, masonry or 3-column, hover zoom.188 Amazon infographic images go here as they are; they carry the seller's own callouts.1897. **Email capture**: dark or brand-colored band, one input plus button, VIP-list copy in190 the product's voice. Keep the two config constants at the top of the script:191 ```192 const GOOGLE_FORM_URL = ''; // Seller fills this in193 const EMAIL_FIELD_ID = ''; // Seller fills this in194 ```195 On submit with empty config, show the success state and a link to Amazon anyway.1968. **Reviews** (`id="reviews"`): 4 to 6 verified reviews, each with a bold title line,197 stars, author, date, "Verified" chip. Headline uses the real count ("Trusted by 1,046198 adventurers"). Link "Read all reviews on Amazon".1999. **FAQ** (`id="faq"`): 5 to 6 questions a real shopper asks about THIS product type,200 answered from the bullets and details. Accordion, one open at a time.20110. **Final CTA**: a full-width band in the brand color or ink, headline, price, button,202 two trust lines.20311. **Footer**: brand mark, section links, disclaimer: "Independent product page. [Brand]204 is a registered trademark of its owner. Purchase fulfilled by Amazon.com."20512. **Sticky mobile bar**: price plus Buy button, appears after the hero scrolls out.206207Design ambition, before the technical rules. A page that passes QA can still be flat. Read208the finished layout against these and fix what fails:209210- **Rhythm.** No two consecutive sections share a background tone or a layout shape. Dark,211 paper, full-bleed photo, paper, dark. Two columns, then one, then a grid, then a band.212- **One full-bleed photo section.** The best lifestyle image from the listing, edge to edge,213 with a short line of display type on it and nothing else. This is the breath in the page.214- **Scale contrast.** At least one headline at 5rem or more, and body copy that stays at 17215 to 19px. Big and small next to each other is what makes a page feel designed.216- **Asymmetry somewhere.** A headline that overlaps the edge of an image, a card that sits217 off the grid, a photo that bleeds off the right edge while the copy sits in the grid.218- **The product in the copy's color.** Pull one image out of its white background with a219 soft drop shadow or place it on a tinted plate, so the product sits IN the page instead220 of on top of it.221- **Whitespace as a material.** 96 to 128px between sections on desktop. Cramped is the222 first thing an eye reads as cheap.223- **Details that only a person would add.** A mono label with the ASIN or the pack's224 capacity in the corner of the hero. A hand-set pull quote. A tiny drawn icon that matches225 the product, not a generic one.226227Technical rules:228229- `<script src="https://cdn.tailwindcss.com">` with a `tailwind.config` that registers the230 palette tokens and font families. Google Fonts via `<link>` with preconnect.231- Custom CSS in one `<style>`: reveal classes gated behind a `js-anim` class on `<html>`232 so content is never stuck invisible, `prefers-reduced-motion` respected, the signature233 device, the CTA pulse, the accordion.234- All JavaScript at the bottom: gallery swap, scroll reveal, accordion, nav state on235 scroll, sticky bar, email form.236- Scroll reveal is a `requestAnimationFrame` throttled scroll pass, not an237 IntersectionObserver that unobserves on first hit. Elements are removed from the list once238 revealed, so nothing can be skipped by a fast scroll or an anchor jump:239 ```js240 var revealEls = Array.prototype.slice.call(document.querySelectorAll('.rv'));241 function revealPass(){242 for(var i = revealEls.length - 1; i >= 0; i--){243 if(revealEls[i].getBoundingClientRect().top < window.innerHeight - 40){244 revealEls[i].classList.add('in'); revealEls.splice(i, 1);245 }246 }247 }248 ```249 Call it once on load, then on `scroll` and `resize` behind a rAF tick.250- Every Amazon link: the product URL, `target="_blank" rel="noopener"`.251- Mobile first. Test the hero at 390px in your head: headline 2.6rem, image under the copy,252 thumbs scroll horizontally, chips hidden.253- Alt text on every image, from the listing.254255### Phase 6: The elevation pass (do not skip this)256257**The page you just built is the draft, not the deliverable.** Phase 5 gets the structure,258the real data and a defensible direction onto the screen. It reliably produces a page that259is correct and slightly flat. The difference between "clean" and "a brand paid for this" is260made here, and it is made on purpose, not by luck.261262Copy the draft to `index-v1.html` first, so the lift is visible and reversible. Then go263back through the page and raise it two levels. Not a restyle. Each lane below changes what264the page *does*, and each one has a concrete implementation.2652661. **Give the hero an entrance.** A page that fades in as one block reads as a template.267 Stagger it: put a `.hi` class on the eyebrow, each line of the headline, the subhead, the268 stars, the price and the CTA, each with its own `style="--d:.12s"` delay. Gate the whole269 thing on a `loaded` class added by a double `requestAnimationFrame`, never on270 `window.onload`, which would hold the hero hostage to the last image.271272 ```css273 html.js-anim .hi{ opacity:0; transform:translateY(22px); }274 html.js-anim.loaded .hi{ animation:rise .9s cubic-bezier(.16,.8,.3,1) forwards; animation-delay:var(--d,0s); }275 @keyframes rise{ to{ opacity:1; transform:none; } }276 ```277 ```js278 requestAnimationFrame(function(){ requestAnimationFrame(function(){279 document.documentElement.classList.add('loaded'); }); });280 ```2812822. **Build the signature device for real.** In Phase 5 it is usually a gradient and a283 promise. Now make it out of the product itself. The Ortizan speaker has an RGB light284 ring, so the page got an actual ring: a `conic-gradient` through the product's own light285 colours, an animatable angle via `@property --a`, a blurred masked halo behind the286 product, and the same ring reused at 9px as the nav mark and as a status dot. One device,287 built once, reused three times at three sizes. That repetition is what reads as identity.288289 ```css290 @property --a { syntax:'<angle>'; inherits:false; initial-value:0deg; }291 .ring{ --a:0deg; background:conic-gradient(from var(--a), var(--hot), var(--sun), var(--cyan), var(--hot)); }292 .halo{ background:conic-gradient(from 0deg, var(--hot), var(--sun), var(--cyan), var(--hot));293 mask:radial-gradient(farthest-side, transparent 46%, #000 63%, #000 80%, transparent 100%);294 filter:blur(26px); animation:spin 18s linear infinite; }295 ```2962973. **Put material under the colour.** Flat hex fills are the tell. Add, in this order:298 a mesh gradient ground (three or four soft `radial-gradient` blobs in the palette over299 the paper colour), a grain overlay (inline SVG `feTurbulence` at `opacity:.09`,300 `mix-blend-mode:soft-light`) on the hero and the dark sections, and `backdrop-filter`301 glass on the nav and any floating chips. Cheap, and it is most of the perceived jump.3023034. **Break the equal grid.** If the features are still six cards of the same size, convert304 to a bento: one tile spanning two columns with the strongest claim and a real image, one305 tall tile, four normal. Give tiles a lift on hover306 (`transform:translateY(-5px)` plus a deeper shadow) and scale the image inside to 1.04.3073085. **Turn the gallery into a filmstrip.** Replace the masonry with a horizontal309 `scroll-snap-type:x mandatory` strip, numbered `lbl` captions under each frame, prev and310 next buttons, and a progress bar that tracks `scrollLeft`. It bleeds off the right edge,311 which is the asymmetry the page was missing.3123136. **Give the best feature its own room.** Find the one thing the product does that a314 photograph cannot show and build a section for it, in the opposite tone to the rest of315 the page. On the Ortizan that is a near black "night" section for the light show, sitting316 between two bright ones. This is the section a competitor cannot paste onto their page.3173187. **Micro-interactions everywhere a finger goes.** Buttons lift 2px on hover and settle to319 `scale(.98)` on press, with a blurred glow ring behind the primary CTA. Swap the FAQ from320 `max-height` to `grid-template-rows:0fr` to `1fr`, which animates to the true height with321 no magic number and no clipped answers. Thumbnails lift on hover.3223238. **Let the type get loud.** One display face with real character, one number face for the324 price and the spec numerals, tracking tightened to `-.035em` at the top size. Reserve325 gradient text for exactly one phrase in the headline. Body stays 17 to 19px.326327Housekeeping while you are in there: hoist any icon you repeat more than twice into an328`<svg><symbol>` sprite at the top of the body and call it with `<use href="#star"/>`. A329five pointed star pasted thirty times is thirty times the bytes and the first thing that330looks generated.331332**The bar.** Open `index-v1.html` and `index.html` side by side. If you cannot name three333things that changed *structurally*, you restyled instead of elevating. Go again.334335### Phase 7: QA before you show it3363371. Open `index.html` in the browser (Chrome MCP or `open index.html`).3382. Take a full-page screenshot and LOOK at it. Then check, in this order:339 - Every image loaded (no broken icons, no 9-byte files).340 - No text overflows its box at desktop and at 390px width.341 - The headline is the promise, not the Amazon title.342 - Nothing on the page is invented: every number, badge and review traces to Phase 2.343 - No em or en dash anywhere: `grep -c "—\|–" index.html` must print 0.344 - The reveal classes do not hide content when JS runs late (scroll to the bottom, all345 sections visible).346 - No infographic is cropped by a bleed or a negative margin; every callout at its edges347 is readable. Full-bleed photos show no baked-in text panel.348 - The page does not look like the last page you built. If it does, the direction in349 DESIGN.md was not followed; fix the page, not the brief.350 - Phase 6 actually happened. `index-v1.html` exists and the two files differ by more351 than colours.3523. Fix what you found. Do not report "done" with a known defect.353354**Judge animation only in a visible window.** A hidden or backgrounded browser pane freezes355`requestAnimationFrame` and every CSS animation, so all your reveal and entrance elements356measure at `opacity:0` and the page looks catastrophically broken when nothing is wrong.357Before you believe that reading, check `document.visibilityState`. If it says `hidden`,358front the tab and measure again rather than "fixing" working code.359360### Phase 8: Hand over361362Tell the user, in four lines: the design direction you chose and why, what the page363contains (sections, number of real reviews used), the two things they must do before364publishing (put their attribution link on the buy buttons, paste the Google Form URL and365field id for email capture), and the path. Then open the page.366367## Important rules368369- NEVER fabricate reviews, ratings, counts, badges or specs. If a section has no real data,370 leave it out and say so.371- The headline is a rewritten promise, never the Amazon title.372- One design direction per page, written down first, followed to the end.373- No Inter-only typography, no purple-gradient-on-white, no generic dark theme by default.374- FAQ answers come from the listing, phrased plainly. Unknown is "check the listing", not375 a guess.376- The page should look like the brand made it, not like a template with a logo swapped.377- Never hand over the Phase 5 draft. The elevation pass in Phase 6 is part of the job, not378 an upsell, and `index-v1.html` is the proof it ran.