Premium web design skill

Create premium, Awwwards-quality website designs as React (.jsx) components that look like they were built by a top-tier agency charging $50k+ per project.

by davila7·MIT license·★ 32,299 Stars on the repo·GitHub ↗

Use now

Files of Premium web design

davila7/main1 file shown
SKILL.md
Show the full text747 lines
premium-web-design/SKILL.md747 lines · 59.4 KB
Outline
RawView on GitHub

Premium Web Design

Create React (.jsx) components that look like they belong on Awwwards — the kind of work that makes people ask "who designed this?" These are sites where every pixel is intentional, every animation is choreographed, and the overall impression is that serious creative talent and budget were involved.

The AI Aesthetic Problem

Most AI-generated websites share a recognizable DNA. Avoiding it requires knowing exactly what it looks like.

The Blacklist — Never Do These

Typography sins

  • Inter, Poppins, Montserrat, Raleway, Space Grotesk, Outfit as primary fonts — these scream "AI template". (Note: Inter Tight is a separate font family with different metrics and is allowed.)
  • Using one font family for everything
  • Uniform font sizes with predictable hierarchy (64px → 32px → 18px → 14px)
  • Default letter-spacing and line-height everywhere
  • Centered text blocks everywhere, especially multi-line paragraphs

Color sins

  • Purple-to-blue gradients (the single biggest AI design cliché)
  • Indigo/violet as a primary brand color with no contextual reason
  • White background + one accent color + gray text (the SaaS starter kit)
  • Gradients on buttons or cards for no reason
  • Using opacity or semi-transparent overlays as a substitute for real color choices
  • Neon accent colors on dark backgrounds (the "developer portfolio" look)

Layout sins

  • Hero → 3-column feature grid → testimonials → CTA → footer (the default SaaS landing page)
  • Hero → stats bar → work grid → about split → CTA → footer (the "premium AI" landing page — just as formulaic)
  • ANY predictable top-to-bottom section ordering that could be swapped between sites. Every site must have its own unique structural DNA — different number of sections, different ordering logic, sections that don't fit neatly into categories
  • Perfectly symmetrical grids with equal-sized cards
  • Everything centered, everything contained in a max-width container
  • Rounded rectangles with box-shadows as the primary UI element
  • Icon + heading + paragraph cards in a row of 3 or 4
  • Generic hero with headline + subheadline + two buttons side by side
  • Static flat hero sections with just text — hero sections should be immersive spatial experiences

Motion sins

  • Elements fading in from below on scroll (the overused AOS effect)
  • Identical transitions on everything (same duration, same easing, same direction)
  • Hover effects that just scale up or add a shadow
  • Loading spinners instead of skeleton screens or choreographed reveals

Imagery & decoration sins

  • Blob shapes as background decorations
  • Floating geometric shapes (circles, triangles) as "design elements"
  • Generic gradient mesh backgrounds
  • Stock photo grids with uniform aspect ratios
  • Emoji or generic line icons as section markers

What Expensive Actually Looks Like

Premium web design communicates craft through restraint, surprise, and obsessive attention to detail.

Typography as Identity

Typography is the #1 differentiator between a $500 website and a $50,000 one.

Font selection philosophy:

  • Use distinctive serif or display fonts for headlines — fonts with personality and opinion. Good starting points: Playfair Display, Cormorant Garamond, DM Serif Display, Fraunces, Instrument Serif for serifs. For sans-serifs that aren't overused: Syne, General Sans, Satoshi, Switzer, Cabinet Grotesk, Nacelle, Inter Tight, IBM Plex Sans, Manrope, Archivo, Work Sans, Instrument Sans.
  • Pair a characterful display font with a neutral-but-refined body font.
  • Monospaced fonts as accent typography (for labels, categories, dates) add an editorial quality — JetBrains Mono, IBM Plex Mono, Space Mono.
  • Mix weights dramatically — a 900-weight headline next to a 300-weight body creates visual tension.

Typography execution:

  • clamp() for fluid type scaling instead of breakpoint jumps
  • Dramatic size contrast — headlines can be 8vw+ on desktop
  • Negative letter-spacing on large headlines (-0.03em to -0.06em)
  • Generous line-height on body (1.6–1.8), tight on headlines (0.9–1.1)
  • Mixed alignment — left-aligned body with occasional right-aligned labels or asymmetric headings
  • max-width on paragraphs (45–75ch) and text-wrap: balance on headings
  • Uppercase micro-labels with wide letter-spacing (0.1em+) for categories, dates, metadata
Color as Atmosphere
  • Start with black and white. Add color only when it earns its place.
  • One dominant hue with intention — "what emotional territory does this color claim?"
  • Off-whites and warm grays (not pure #ffffff or #000000) feel more designed — try #FAFAF8, #F5F0EB, #1A1A1A, #0D0D0D
  • Monochromatic or analogous palettes with one moment of contrast read as more sophisticated than rainbow schemes
  • Dark themes done right: not just "white on dark gray" but considered background layering with subtle warm or cool tints
  • Color used sparingly hits harder — a single red link in a sea of black-and-white is more powerful than red everywhere
Layout as Storytelling

The #1 failure mode of this skill is producing sites that look different on the surface but share the same underlying structure — a hero, three editorial sections, a pull quote, a form, a colophon. Over a batch of sites this starts to feel like a template with different colors. Fight this actively, and deliberately.

The structural DNA uniqueness rule:

Before writing any markup, name the primary structural concept out loud — a single noun phrase, like "index manuscript" or "sticky horizontal diorama". Inside one batch of sites, no two sites may share the same primary structural concept. If the previous site was a sticky-scroll narrative, this one is not. If the previous site was a 33/67 vertical split, this one is not. The structural idea is the first thing the user notices — varying color without varying structure is cosmetic.

Structural DNA Catalog

These are distinct primary structures. Each skill invocation should pick a concept and commit to it. Do not mix two structures into one site (it dilutes both).

  1. Index Manuscript — A single long editorial column, no sections. One typographic rhythm from top to bottom. The whole page reads like a single manuscript that happens to be a website. (Good for: a chef's menu, a perfumer's letter, a manifesto.)
  2. Sticky Horizontal Diorama — The page is a long vertical scroll, but what you see as you scroll is a horizontally-panning scene. Use position: sticky + translateX driven by scroll. (Good for: a timeline of commissions, a process in stages, a collection of artifacts.)
  3. Two-Pane Permanent Split — The page is always a 50/50 (or 38/62) split; one pane is sticky, the other scrolls. Navigation happens inside a pane, never by scrolling the whole page. (Good for: an archive with a live-updating index, a librarian's catalogue.)
  4. Slide Sequence — Full-viewport-height "slides," one per screen, with snap scrolling. Each slide is a completely different composition. (Good for: a photographer's monograph, a gallery walkthrough, an editorial look-book.)
  5. Staged Object on a Plinth — A single 3D/image subject sits centered, rotatable, and the whole rest of the page is marginalia that orbits the object. (Good for: a single-product house — a watch, a flacon, a bottle.)
  6. Pinned Narrative (Scrollytelling) — A 2–4-screen-tall section pins in place while its contents advance through discrete states (image swaps, text swaps, progress). Used once in the page as its centerpiece. (Good for: a mission profile, a production process, a building collapse study.)
  7. Horizontal Navigation — The primary page scroll is horizontal. Sections read left-to-right. Vertical scroll is disabled or reserved for detail reveals. (Good for: a horological archive, a museum's wing, a film studio's slate.)
  8. Sidebar + Column — A persistent left-hand sidebar never scrolls (navigation, metadata, running footer); the right column is the entire site. (Good for: a legal practice, a research institute, an academic publisher.)
  9. Chapter Gates — Full-viewport chapter dividers between very different tonal zones. Each chapter has its own background color, typographic weight, and layout rhythm. The page changes character as you descend. (Good for: a multi-discipline studio, a retrospective.)
  10. Ledger / Registry — The page is presented as an old-school document — a bill of lading, a registry, a ship's manifest. Tabular rows dominate; typography reads like a ledger. (Good for: a waiting list, a batch register, an expedition manifest.)
  11. Collage / Grid-Breaker — A magazine-style asymmetric grid with deliberate ruptures — oversized images bleeding into columns, pull-quotes crossing gutters, footnotes in the margins. (Good for: editorial publications, cultural magazines, creative studios.)
  12. Single Object, No Chrome — The site is just the subject, rotatable, with a single short sentence below it. No nav, no footer, almost no UI. (Good for: an artist's single-piece release, a statement work.)
  13. Product UI Slate — The hero is a realistic simulation of the product's own interface (dashboard tiles, diff view, command palette). Used by tech/AI brands whose product IS a UI. (Good for: AI IDEs, dev tools.)
  14. Dashboard Tile Grid — The entire page is structured like a live-feeling dashboard with live counters, sparklines, pulsing pips. (Good for: infra, cybersecurity, observability.)
  15. Conversation Timeline — The page plays back a simulated conversation/transcript/call as the user scrolls. Feature callouts anchor to specific moments. (Good for: voice AI, support platforms, legal interviews.)

How to pick the concept:

  • Start from the client's central fact. A restaurant whose whole identity is one nine-course menu wants an Index Manuscript. A watchmaker whose identity is precision and a single calibre wants a Staged Object on a Plinth. An expedition company whose brand is one yearly journey wants a Pinned Narrative.
  • Reject the concept if it's the one used last time in this session. Pick the next-best.
  • Write down the concept and one sentence of justification before writing any JSX. Keep it visible in the prompt file.

Layout principles (apply within whichever structural concept you pick):

  • Break the grid intentionally. Full-width moments followed by narrow text columns. Oversized images bleeding off-screen. Asymmetric two-column splits (60/40, 70/30).
  • Generous whitespace isn't wasted space — it's a luxury signal. Padding of 8rem+ between sections.
  • Horizontal scrolling sections for portfolios or galleries (done well, not as the main navigation pattern — unless you deliberately chose Horizontal Navigation).
  • Overlapping elements — text over images, images breaking out of their containers, elements that cross section boundaries.
  • Sticky elements that accompany the scroll — a label that stays while content scrolls past.

Specific micro-patterns that read as premium:

  • Masonry or staggered grids for visual content instead of uniform grids.
  • Text that overlaps images with mix-blend-mode for editorial effect.
  • Numbered or indexed sections with a visible progression.
  • A visible grid system (subtle lines or columns) that the design occasionally breaks.
  • Content that transforms as you scroll past it — not just appearing, but morphing, scaling, repositioning.
  • Tabular / ledger rows for lists (batches, manifests, registries) rather than card grids.
  • Form fields that look like parts of an editorial document, not a SaaS form — labels in small monospace above serif inputs, no outlines, bottom-borders only.

Banned repeats (within a skill session):

  • Do not give two sites both a "sticky left column + scrolling right column" process section. Pick it for one; invent something else for the other.
  • Do not open two sites with a 33/67 asymmetric hero. If one did, the next opens with a centered stage, or a full-bleed backdrop, or a ledger, or no hero at all.
  • Do not end two sites with the same "enquiry form + colophon grid" pair. Vary the closing move.

Nav-bar variety — a silent failure mode to watch.

The easiest default is a grid-template-columns: auto 1fr auto top bar with "brand mark on the left, something centred, something right-aligned, mix-blend-mode: difference". After three sites, it starts to read as a signature — not a design choice. In each session, vary the nav substantially:

  • No nav at all (Single Object, No Chrome brands).
  • Nav baked into the sticky sidebar (Sidebar + Column brands).
  • Bottom-fixed command bar styled like ⌘K launcher (tech-product brands — Cursor / Linear / Arc).
  • Inline centred wordmark with tabs spread beneath as a secondary strip.
  • Full-width horizontal scroll index that doubles as the nav.
  • Marquee nav — continuously scrolling ticker with section names.
  • Left-vertical nav written bottom-to-top.
  • Status-bar nav with a live-operational pip.
  • Marquee-ticker strip (benchmark prices, metrics) plus a slim top bar.

Pick the nav that belongs to the brand and the structural DNA — do not default to the three-column top bar.

Avoid the editorial-luxury default.

This skill gravitates, under pressure, toward: warm cream ground, serif display (Fraunces / Cormorant), monospace metadata, a single brass accent, wide-tracked uppercase micro-labels, ◦ bullet symbols. It's a real aesthetic, appropriate for couture, parfumerie, haute cuisine, horlogerie. It is not appropriate for tech, AI, cybersecurity, consumer electronics, SaaS, or developer tooling — and repeatedly defaulting to it makes every site in a batch look like the same agency did them.

If the field is technology, the aesthetic should skew toward: pure-white or near-black grounds (not cream); neo-grotesque sans-serifs (Söhne-feel, Inter Tight, IBM Plex Sans, Instrument Sans) as display type; monospace used as display, not just metadata; gradient-glow edges, shipped UI screenshots, live-feeling dashboard tiles, keyboard-shortcut chips inline with copy, code blocks rendered as the hero, iridescent/chrome/glass textures rather than brass-and-paper. See Vercel, Cursor, Linear, Windsurf, Stripe, Figma, Arc, Zed, Raycast, Supabase, v0.dev, Anthropic, OpenAI.

3D Components — The Core Differentiator

Every website built with this skill features 3D components. This is what makes these sites stand out from flat designs. But the 3D must look professional and polished — amateur 3D is worse than no 3D.

DO NOT build 3D objects from Three.js geometric primitives (boxes, cylinders, cones, spheres). Cars built from boxes look like toys. Rockets built from cylinders look like diagrams. Fire built from cones looks terrible. Three.js primitives are only acceptable for subtle atmospheric background effects (particle fields, grid planes, floating dots) — never as the main hero visual.

Step 1: Research the Industry — Deeply

Most AI-generated "premium" sites look generic because the research step is skipped or done to a depth of two sentences. A real reference pull is the single biggest quality lever in this skill.

Depth requirement: Study at least 5 real reference sites (not 2) — a mix of the most obvious industry leaders and less-famous editorial/cultural operators in the same space. The less-famous references are usually where the unique moves come from; the famous ones anchor the palette.

Starting reference sets (expand, don't stop here):

  • AI tooling / developer tools / IDEs → Vercel, Cursor, Windsurf, Linear, Stripe, Figma, Arc Browser, Zed, Raycast, Supabase, Replit, v0.dev, Anthropic, OpenAI. Note: dark-first or pure-white, monospace used as display (not just metadata), precise grids, keyboard-shortcut chrome (⌘K, ⌘↵), gradient glow edges, animated code blocks in hero, dashboard-tile grids, sub-section headers in small-caps monospace, <code>-styled callouts. Interactive hero often = an animated product UI snapshot, not a still image.
  • Cybersecurity / infrastructure → Cloudflare, Tailscale, 1Password Business, Chainguard, CrowdStrike, Datadog Security, HashiCorp, Teleport. Note: scanning-beam hero animations, tessellated defensive grids, live-feeling status indicators, green/amber "operational" pips, dense data-density over whitespace.
  • Enterprise AI / voice → Anthropic, OpenAI Platform, ElevenLabs, Vapi, Retell AI, Bland AI, Cohere, Deepgram, Cartesia. Note: warm near-black grounds, editorial serif display, live transcripts as hero, latency numbers as typographic elements.
  • Aerospace / Defense → SpaceX, Rocket Lab, Blue Origin, Sierra Space, Axiom, The Planetary Society, Royal Aeronautical Society. Note: dark themes, clean sans-serifs, full-bleed photography, mission-profile diagrams, minimal color accents.
  • Automotive → Porsche, Rivian, Lucid, Singer Vehicle Design, Pagani, David Brown Automotive, Coachbuild.com. Note: dramatic product photography, mechanical drawings, full-screen immersive heroes.
  • Fashion / Luxury → Bottega Veneta, Celine, The Row, Margiela, Lemaire, A.P.C., Phoebe Philo, Hermès. Note: extreme typographic restraint, serif display, near-silent whitespace.
  • Food / Restaurants → Noma, Eleven Madison Park, Alinea, Central (Lima), Atomix, Chefs Club, René Redzepi's archive. Note: editorial photography, muted tones, menu-as-manuscript typography, course-by-course pacing.
  • Fragrance / Parfumerie → Le Labo, Byredo, Frédéric Malle, Lubin, Maison Francis Kurkdjian, Diptyque, Santa Maria Novella.
  • Architecture → 2x4, Olson Kundig, Herzog & de Meuron, Kengo Kuma, SANAA, David Chipperfield.
  • Horology → F.P. Journe, A. Lange & Söhne, Philippe Dufour, Akrivia, Grönefeld, Urban Jürgensen.
  • Art / Galleries → David Zwirner, Gagosian, Hauser & Wirth, Galerie Lelong, White Cube, Pace.
  • Publishing / Editorial → New York Review of Books, Granta, The Paris Review, Apartamento, Zeit Online, MIT Press.
  • Music / Record Labels → ECM Records, Warp, Mute, Nonesuch, Erased Tapes, Kompakt, Sub Pop.
  • Private Wealth / Fintech → Addepar, Masttro, Pictet, Edmond de Rothschild, BlackRock Aladdin, Stripe.

How to do the research pass:

  1. Find the 5 sites. Use web_search: "[field] award-winning website", "[field] Awwwards", site:awwwards.com [field], "[field] FWA winner". At least 2 of the 5 should be less-obvious editorial/cultural references, not the industry giants.
  2. Study each with web_fetch. Pull patterns, not vibes. For each site, note specifically: primary display font, secondary body font, palette as hex approximations, structural DNA (which concept from the catalog), one signature move unique to that site.
  3. Write a 6–10 line design brief before coding. In the prompt.md, write a "Design reference pull" block naming the 5 sites, the 3 specific patterns you're borrowing (and from which site), the palette (in hex), the font stack, and the structural DNA you've chosen.
  4. Do not copy — combine. Pull one thing from each reference; the combination is what makes the site feel original rather than like a clone.

The design you build should feel like it belongs alongside these real competitors — not like it came from a different universe, and not like it's a carbon copy of any single one.

Step 2: Source Topic-Relevant 3D from Spline

Spline (spline.design) is a 3D design platform with a large community library of professional, embeddable 3D scenes. A Spline scene only earns its place on a premium site if a visitor, glancing at it, immediately understands what it represents. A beautiful scene that has nothing to do with the subject is worse than no scene — it erodes the sense that every pixel is intentional, and reads as "some cool 3D the designer found," which is the opposite of premium.

No real-branded-product scenes — ever

Spline community scenes often depict real, trademarked products: a Nike Air Jordan, a Sony WH-1000XM5, an Apple Watch, a Beats Studio, a Samsung Galaxy, a Tesla Cybertruck. These are not usable for a fictional brand's website. Using them creates three compounding problems:

  1. Legal. Real branded products have trademarks, design patents, and licensing agreements. Placing a Nike shoe on a website for a fictional "Trio Nord" footwear brand is trademark confusion at best, and infringement at worst.
  2. Narrative. A viewer who recognises the product — and most will — immediately knows the site is lying. The moment that recognition happens, the luxury illusion collapses.
  3. Generic. A scene that exists because a Nike designer or Sony visualizer made it reads as "someone on Spline recreated a famous product." It never reads as our product.

Rule: Before committing a Spline scene, ask: Is the object in this scene a real, identifiable product from a real brand? If yes — reject it, no matter how well-rendered it is. Look for abstract, category-representative, or original-design scenes instead:

  • Instead of Nike Air Jordan → a generic hand-lasted leather shoe, or an abstract footwear silhouette.
  • Instead of Sony headphones → abstract floating audio-ring geometry, or a generic minimalist over-ear.
  • Instead of Apple Watch → an unbranded bezel/dial, or a mechanical-movement diagram.

If no non-branded alternative exists for the subject, either (a) fall back to photography of a generic, unbranded product, (b) build an SVG illustration, or (c) pick a different field.

Field-first, not scene-first — the direction of sourcing matters

An easy failure mode: you have a usable Spline URL in hand, and you invent a field to justify using it. This reads as desperation. "A fountain-pen ink maker" does not exist as a premium brand in the world because someone wanted one — it exists because you had a dark-fluid scene and built a house of cards around it. The prompt gives it away.

The correct order is:

  1. Pick the field. A real, plausible luxury / premium industry — automotive, horology, haute couture, fragrance, spirits, footwear, audio, eyewear, furniture, hospitality, leather goods, cutlery, skincare, private medicine, etc. The field must be one the user, shown the finished site, would immediately accept as a real business. Pen ink is not that.
  2. Define the product inside the field. What, specifically, is the subject? A ring, a sneaker, a set of over-ear headphones, a chef's knife.
  3. Then search Spline for that product. With the keyword-map expansion. Use both my.spline.design/ and prod.spline.design/ URLs.
  4. If no topic-relevant scene exists, change field — do not bend the field to match a scene you already have.

A healthy batch of sites spans genuinely-different industries a reader recognises. A batch of sites whose shared thread is "whichever field the available Spline URLs imply" is not a portfolio — it's a rationalisation.

Scene uniqueness — no reuse within a session

Within a single session / batch of sites, no two sites may use the same Spline scene URL. Reusing a scene across multiple houses reads like a stock-photo library showing through, and undoes the SKILL's entire claim that each site is its own identity.

  • If you've used worldplanet on one site, don't use it on the next, no matter how directly it "fits" the new field. Find a different scene.
  • If you can't find a unique scene for the new field, fall back to photography or a deterministic SVG/CSS illustration — never recycle.
  • Even scenes that seem interchangeable (two different Earth scenes, two different fluid scenes) should not all appear in one batch. One Earth scene per batch. One fluid scene per batch.
  • At the top of every new prompt.md, list the Spline URLs already used in this session by the previous sites. Confirm the new site's URL is NOT in that list.
The cardinal rule: topic-literal, not topic-metaphorical

A Spline scene is acceptable only when it literally depicts the subject of the site's brand. Metaphorical links are rejected, even if they're poetic:

  • A fluid scene is fine for an ink maker (the fluid IS ink) but not for a restaurant (broth does not justify a black fluid next to a menu).
  • An Earth scene is fine for a spaceflight company (the Earth is what passengers see) or a cartographer (Earth is what they map) but not for a family office "with global reach" (the link is metaphorical).
  • A watch scene is fine for a watchmaker, not for a "time-respecting" consulting firm.

Before using any Spline scene, state out loud in the prompt.md: "The scene depicts X. My site's subject is X." If those two X's are not the same noun, reject the scene. The brand itself must be in the business of whatever the scene shows — not merely invoke it symbolically.

The two-second test still applies: with no caption, a viewer should name the subject of the scene. A "nice abstract composition" is not a subject.

Theme harmony — the scene and the site must visually belong to each other

A Spline scene has its own backdrop color and lighting mood baked into the render. If that backdrop fights the site's palette, the scene will look cut out and pasted on — amateurish, no matter how premium the 3D itself is. Before committing a scene, check:

  • Dark scene on a dark site — Works. The scene's black edges dissolve into the page.
  • Light scene on a light site — Works. The scene's light backdrop extends the paper.
  • Dark scene on a light site — Usually fails (looks like a hole punched into the page). Only acceptable with a deliberate framed-viewport treatment (a bordered "window" into the dark scene, like a photograph on a wall).
  • Light scene on a dark site — Same failure pattern, inverse. Same mitigation.

Write down, in the prompt.md, the scene's native backdrop color and the site's ground color. If they're opposite and there's no framed-viewport treatment, pick a different scene or pick a different theme.

Expand the search vocabulary before searching

Never search Spline for just the topic word. A single-keyword search misses 90% of relevant scenes — most creators title their work by what's in it (wheel, tire, headlight) rather than the category.

Before searching, build a keyword map of at least 8–12 terms covering:

  • The subject itself — car, watch, perfume bottle
  • Synonyms / category terms — automobile, sportscar, vehicle, supercar; timepiece, chronograph; fragrance, parfum, scent
  • Iconic components and close-ups — wheel, tire, rim, engine, exhaust, dashboard, steering wheel, headlight; gears, tourbillon, crown, dial, movement; bottle, glass, droplet, atomiser
  • Materials and surfaces — chrome, metal, leather, carbon; brass, platinum, gold, steel; crystal, glass, amber liquid
  • Processes / environments — assembly, atelier, race track, showroom; workshop, manufacture, loupe; apothecary, laboratory
  • Symbols / metaphors — horizon, motion lines; orbit, constellation, star; flower, smoke, vapor

Also search Awwwards, Codrops, Tympanus, Dribbble, Twitter/X, and production-site HTML ("<iframe" "my.spline.design", "<spline-viewer" "scene.splinecode", site:codepen.io "my.spline.design", site:github.com "my.spline.design"). URLs found inside working iframes on live sites are guaranteed to render.

Do a minimum of three search passes:

  1. Slug/topic pass — direct site:my.spline.design [keyword] for every word in the keyword map.
  2. Community-page pass — community.spline.design/tag/[keyword].
  3. Harvesting pass — "<iframe" "my.spline.design/[topic keyword]" to find URLs already embedded in live production sites.
Spline URL format reference — know what you have

Spline has four URL formats you will encounter. Only two of them are usable as embeds.

URL shape What it is Usable as embed? How
community.spline.design/file/[uuid] Community gallery page (HTML with JS viewer) ❌ No Sends X-Frame-Options, blocks iframe. Also does not expose the embed URL in its HTML — the my.spline.design slug is added client-side after the user hits Share.
app.spline.design/community/file/[uuid] Spline editor, opened to that community file ❌ No Editor page, not an embed.
my.spline.design/[slug]/ Published HTML scene page ✅ Yes, via iframe <iframe src="https://my.spline.design/[slug]/">
prod.spline.design/[id]/scene.splinecode Raw runtime binary ✅ Yes, via spline-viewer <spline-viewer url="https://prod.spline.design/[id]/scene.splinecode">

Critical misuse to avoid: do NOT put a .splinecode URL into an <iframe src> — it renders as a broken placeholder or a binary download. Use the web component. Conversely, do NOT put a my.spline.design/ URL into a <spline-viewer url> — the viewer expects the runtime binary, not an HTML page.

Never fabricate slugs. The community file UUID and the published scene slug are different identifiers; guessing the slug almost always 403s. If you cannot verify a URL returns HTTP 200, it doesn't exist.

Community URLs: an important reality

Scenes shown at https://community.spline.design/file/[uuid] are not directly iframe-embeddable — the community domain sends X-Frame-Options headers that block framing, and Google does not index the underlying my.spline.design/[slug]/ URL. When search surfaces a perfect-looking community scene, you cannot simply iframe community.spline.design/file/....

Workarounds, in order of reliability:

  1. Ask the user to open the community file, hit Share → Public URL, and paste the my.spline.design/… link. This is the correct answer when you've found the ideal scene but can't extract its embed URL.
  2. Check if the creator linked it on their portfolio — many Spline creators embed their own scenes on their personal site.
  3. Remix workflow — the user opens the community file, clicks Remix, and the remixed copy belongs to their account with its own public my.spline.design URL they can share.
  4. Accept the limitation — if you cannot verify a URL, do not guess the slug.
Spline embed — the bulletproof pattern (both methods)

Spline sizing problems have one underlying cause: the scene's internal canvas fills 100% of the container, and the space around the 3D object is filled with the scene's internal background color — which defaults to a neutral color the creator chose, not your page's ground. When you drop a scene into a tall container, the scene looks correct in the part the object occupies and looks like a solid-color void in the rest. That void is the scene's background, not a rendering bug.

The fix has three parts, always applied together:

  1. Container defines size explicitly — width, height, position, overflow:hidden. Never rely on the scene to size itself.
  2. Scene element fills the container — position:absolute, inset:0.
  3. Match the scene's background to your page's ground — via the background attribute on <spline-viewer>, or (for iframes) by picking a scene whose native backdrop already matches.

Method 1 — iframe embed (for my.spline.design/[slug]/ URLs):

// Container — always defines size + overflow:hidden
<div
  style={{
    position: "relative",
    width: "100%",
    height: "100%",           // or a specific value / aspect-ratio / vh
    minHeight: 420,           // guarantees a usable minimum
    overflow: "hidden",
    background: "#0A0B0F",    // matches the page ground — seen during load
  }}
>
  {/* skeleton loader underneath — visible until Spline paints */}
  <div
    style={{
      position: "absolute",
      inset: 0,
      background:
        "linear-gradient(110deg, #0A0B0F 30%, #151821 50%, #0A0B0F 70%)",
      backgroundSize: "200% 100%",
      animation: "skl 1.8s ease-in-out infinite",
      zIndex: 0,
    }}
  />
  <iframe
    src="https://my.spline.design/[scene-slug]/"
    style={{
      position: "absolute", inset: 0,
      width: "100%", height: "100%",
      border: "none", display: "block",
      zIndex: 1,
    }}
    title="3D Scene"
    loading="lazy"
    allow="autoplay; fullscreen"
  />
</div>

The iframe cannot be told what background to render — you get whatever the creator baked in. If it doesn't match your page, either (a) accept a framed-viewport treatment (surround the scene with a visible bordered card), or (b) switch to a .splinecode URL of the same scene and use the web component (below), which can override the background.

Method 2 — <spline-viewer> web component (for prod.spline.design/[id]/scene.splinecode URLs):

This is the preferred method for tech sites where theme-harmony matters, because <spline-viewer> exposes a background attribute that replaces the scene's internal background entirely.

// Inject the viewer script once per app (put in main.jsx or the first component that uses it):
useEffect(() => {
  if (document.querySelector('script[data-spline-viewer]')) return;
  const s = document.createElement("script");
  s.type = "module";
  s.src = "https://unpkg.com/@splinetool/[email protected]/build/spline-viewer.js";
  s.setAttribute("data-spline-viewer", "1");
  document.head.appendChild(s);
}, []);

// Then render the viewer inside a sized container.
// Use dangerouslySetInnerHTML because JSX can't parse the custom tag's `background` attribute as a color.
<div style={{ position: "relative", width: "100%", height: "100%", minHeight: 480, overflow: "hidden" }}>
  <div
    dangerouslySetInnerHTML={{
      __html: `<spline-viewer
        url="https://prod.spline.design/[id]/scene.splinecode"
        background="#0A0B0F"
        style="position:absolute;inset:0;width:100%;height:100%;display:block;"
      ></spline-viewer>`,
    }}
  />
</div>

The background attribute accepts any CSS color value — #0A0B0F, transparent, rgba(11,16,20,0.9). Set it to your page's ground color. The empty area around the 3D object now blends into the page, and the "bottom half is black" problem disappears.

Spline scene types — avoid "hero section" scenes

Not every Spline scene is a discrete 3D object. The community is full of scenes titled things like:

  • "reeded glass prism — hero section UI concept"
  • "AI landing page hero"
  • "SaaS hero with CTA"

These scenes contain their own baked-in HTML-like text, buttons, and layout, rendered as part of the 3D composition. When you embed one, you get a full pre-designed hero inside your hero — the scene's own text fights with your page's text, and the scene's own CTA competes with yours.

Before committing a scene, read its title. If the title contains "hero section," "landing page," "UI concept," or "website template" — treat it with suspicion. Open it, look at it, and either:

  • Accept the scene AS the hero (delete your own hero HTML on top of it).
  • Reject the scene and find a pure-object scene (one whose title is just an object — "watch," "shoe," "orb" — not a composition).
Camera framing — how to fix "object too small / too zoomed"

If the scene renders at the wrong zoom (object tiny in a big canvas), the creator's baked-in camera is the cause. Three fixes, in order of simplicity:

  1. CSS transform — wrap the viewer in a container and apply transform: scale(1.4) to the inner element. The whole rendered canvas scales up; the container's overflow: hidden clips the edges. Simple, works with both iframe and web-component.
  2. Narrower container — Spline canvases auto-fit. A narrower, taller container tends to zoom the scene in; a wider, shorter container shows more empty space around it. Adjust the container's aspect-ratio to crop toward the object.
  3. React Spline with setZoom() — only if you're using @splinetool/react-spline (not <spline-viewer>). The onLoad callback receives a Spline Application object with a setZoom(level) method. Call application.setZoom(1.5) on load.
Loading states — never show blank white

Spline scenes are 1–16 MB binaries. They load in 2–8 seconds on a fast connection. During that window, a blank white viewport is the worst possible experience.

Always layer a skeleton loader beneath the scene, inside the same container. The container has the skeleton as its background (via a shimmering gradient animation), the scene paints on top when it loads. No JavaScript coordination needed.

@keyframes skl {
  0% { background-position: 0% 50%; }
  100% { background-position: -200% 50%; }
}

The skeleton should use the page's ground color + one slightly lighter tint. Never use a white skeleton on a dark site.

The relevance test — apply before committing

Once you have a candidate scene, run these four checks. If any fails, keep searching:

  1. It actually resolves. curl -I [url] returns 200, not 403/404. Guessed slugs from community UUIDs almost always 403. If you can't verify a 200, the URL doesn't exist.
  2. It looks right when rendered. Load the URL in a browser (or the preview iframe) and look at it. Many Spline URLs whose slug says "rocket" or "robot" turn out to be low-poly cartoon scenes in garish purple. A slug is not a guarantee of quality — your eye is. Screenshot the iframe before committing the site to use it.
  3. Subject recognition — With no caption and a two-second glance, would a viewer name the subject correctly? ("A car." "A rocket." "A perfume bottle.") A "nice composition" is not a subject.
  4. Brand fit — Does the scene's palette, lighting mood, and polish match the brand direction? A low-poly toy-car style is not luxury. A neon-glow cyber-robot is not a medical AI company.

Do not skip step 2. Slugs lie. Every Spline URL must be visually verified in a real browser before you commit a whole site's design around it.

After-build render-size check — MANDATORY

Verifying the URL works is not the same as verifying the scene renders at the right size in your layout. Spline scenes have their own internal camera and framing — dropping one into a small viewport, a wide banner, or an awkward aspect ratio often crops the subject out of frame or shrinks it to a speck.

After you build the site, before calling it done, do this in order:

  1. Start the preview.
  2. Load the page and wait 6–10 seconds for the Spline runtime to load.
  3. Screenshot the hero.
  4. Look at the screenshot. The subject of the scene must be:
    • Visible (not cropped off to the side, not behind a veil you forgot to make transparent)
    • Proportional (not taking 4% of a 1600px container — it should read at the intended size)
    • Intact (the model is whole, not cut in half by your typography layer)
  5. If any of those fail: adjust the container's aspect ratio, resize the iframe, add scene padding via transform: scale() on the iframe, or change to a different scene positioning (stage / backdrop / companion).
  6. Screenshot again. Repeat until the scene renders correctly.

Common size failures and fixes:

  • Scene appears tiny in a huge container → the scene's camera is at a fixed zoom and the creator set it for a different aspect. Either (a) put the scene in a smaller, matching-aspect container, or (b) apply transform: scale(1.4) on the iframe to zoom in.
  • Scene is cropped off the side → the scene's natural center is offset; use transform: translateX() on the iframe to recenter.
  • Scene disappears into a dark-on-dark background → your CSS veil is too heavy, or the site bg is suffocating the scene. Lower the veil opacity. Use background attribute.
  • Scene backdrop is the wrong color for the site → you violated the theme-harmony rule; use the background attribute (for spline-viewer) or pick a different scene.

This step is not optional. A site that contains a miscentered or wrong-sized Spline scene is strictly worse than a site with a well-composed still image.

Positioning is part of relevance

Even the right scene fails if it's placed poorly. Pick one of these spatial logics — don't just drop the scene into a panel and hope:

  • Stage — Scene is framed like a product on a plinth. Full viewport (or large contained area), centered, typography around it. Works for cars, watches, bottles, any physical object. The user can rotate it. This is usually the right choice.
  • Backdrop — Scene fills the entire viewport behind the hero typography, with a gradient veil so type stays legible. The scene is context/atmosphere, not focus. Works when the scene has a dominant subject that reads even at 20% opacity (earth, rocket, planet).
  • Companion — Scene lives in a dedicated panel (40/60 or 33/67 split) with typography on the other side. Only acceptable if the scene's subject is obviously topic-relevant.
  • Object in a spread — Scene is small-to-medium and anchored in a specific grid position, treated like a framed photograph in an editorial layout. Works in manifesto or story sections, not usually the hero.

If your chosen scene doesn't fit any of these with clear logic, that's a signal to find a different scene — not to wedge it in.

Fallback hierarchy — always layered, never a panicked switch

If no topic-relevant Spline scene can be verified after a full search, do NOT force one. And do not build a brittle "if Spline fails, swap to photo" JavaScript flip — that's a visible glitch. Instead, layer the fallback underneath the Spline viewer, so if Spline is slow or fails, the user still sees something intentional.

The hierarchy, in order:

  1. Client-provided assets — if the user has their own Spline scene, product renders, brand video, ask for them first.
  2. Verified Spline scene (my.spline.design/[slug]/ or prod.spline.design/[id]/scene.splinecode) that genuinely depicts the subject.
  3. Professional still photography (client-provided, or tightly curated from Unsplash) with CSS parallax + subtle grain/filter. Always screenshot-verify the image renders as expected.
  4. CSS / SVG illustration — a deliberate custom illustration (Geneva stripes, a hand-drawn diagram, a rendered mockup) built entirely in HTML/CSS/SVG. Deterministic, no network dependency.
  5. Three.js atmospheric layer — a minimal particle field, grid plane, or drifting-dust canvas as background atmosphere only, behind a still-image or typographic hero. Never the main visual.

Layered implementation (CSS-only fallback under Spline):

<div className="hero-stage">
  {/* Layer 0 — always visible. The base fallback (photo or illustration). */}
  <div className="hero-fallback" />

  {/* Layer 1 — Spline paints over the fallback if/when it loads.
      If Spline 404s, never loads, or is disabled, layer 0 remains visible. */}
  <div
    className="hero-scene"
    dangerouslySetInnerHTML={{
      __html: `<spline-viewer url="..." background="transparent" style="..."></spline-viewer>`
    }}
  />
</div>

/* CSS */
.hero-stage { position: relative; width: 100%; height: 100%; overflow: hidden; }
.hero-fallback {
  position: absolute; inset: 0;
  background-image: url("https://images.unsplash.com/photo-[verified-id]?w=1800&q=85");
  background-size: cover; background-position: center;
  filter: saturate(0.9) contrast(1.05);
  z-index: 0;
}
.hero-scene { position: absolute; inset: 0; z-index: 1; }

When Spline uses background="transparent", the empty space around the 3D object reveals the fallback photograph underneath. The page always has a visible hero — Spline is an enhancement, not a requirement.

Photography fallback — verify the image, don't guess

Unsplash URLs are convenient but unverifiable without loading. A URL like https://images.unsplash.com/photo-1548484352-ea579e5233a8?w=1200&q=80 looks specific (it names a photo ID) but the photographer may have replaced or removed the file, the crop may be different from what you expect, and at a different viewport aspect ratio you may see a different subject entirely than what the photo is named for.

When using photography fallback:

  1. Prefer client-supplied imagery first. Ask the user for product photos.
  2. If you must use Unsplash, pick photos you have already seen (either via a tool that can render the URL, or by asking the user to confirm the photo). Do NOT pick a photo ID because its filename implies the topic — verify.
  3. After build, screenshot the photograph in situ. Look at it. Confirm the subject, the crop, and the color treatment.
  4. If the photograph doesn't render as you expected, swap it. Search Unsplash again by the exact concrete noun — and re-screenshot.

If no relevant scene or photograph exists, a deterministic CSS/SVG illustration is always a valid alternative — built entirely in the page, no network dependency, always renders identically. Examples: a cross-section diagram of a CLT timber panel, Geneva-stripes on a watchmaker's bridge, a sneaker silhouette, a reactive orb built from conic gradients.

An irrelevant 3D scene, however pretty, damages the luxury impression. A considered still image or SVG illustration doesn't.

Color and Typography Must Match the Industry
  • Aerospace / Defense: Dark backgrounds (#0A0A0A, #0C1222), clean sans-serifs, minimal accent colors (white, silver, or a single restrained blue). Think SpaceX — not orange and white.
  • Automotive: Deep blacks, dramatic lighting effects, premium sans-serifs or geometric fonts, metallic accent tones. Think Porsche — restrained, confident.
  • Fashion / Luxury: Extreme restraint. Serifs for display, thin sans-serifs for body. Near-black and off-white. No bright accent colors. Think Bottega Veneta.
  • Food / Restaurant: Warm tones (cream, charcoal, muted earth), editorial serifs, generous whitespace. Think Noma.
  • Tech / AI tooling: Can go darker or lighter, but avoid the purple-gradient cliché. Clean, systematic layouts with monospace display. Think Linear / Vercel / Cursor.
  • Finance / Legal: Conservative palettes (navy, charcoal, forest), traditional serifs for authority, structured grids.

Bad color choices that make sites look unprofessional:

  • Orange + white for aerospace (looks like a construction company)
  • Bright cyan on black for everything (looks like a hacker movie)
  • Using the same accent color across different industries

Critical technical rules:

  • Always import React alongside hooks: import React, { useState, useEffect, useRef } from "react";
  • Never use JSX fragments (<>...</>) — use <span> or <div> instead for compatibility
  • When using iframes for Spline, set loading="lazy" and provide a styled loading placeholder
  • When using images, always include ?w=1920&q=80 parameters for Unsplash URLs
  • For any Three.js: set alpha: true, use setPixelRatio(Math.min(window.devicePixelRatio, 2)), and clean up on unmount
Scroll-Driven Experiences

Scrolling should feel like a directed journey, not just moving down a page.

Scroll-driven techniques:

  • Parallax layers: Multiple elements moving at different speeds. Track window.scrollY and apply different multipliers to different elements.
  • Horizontal scroll sections: A section that scrolls horizontally as the user scrolls vertically. Use position: sticky on a container with overflow: hidden, then translateX inner content based on scroll progress.
  • Scale-on-scroll: Elements that grow from small to full-size as you scroll through them. Use IntersectionObserver with a threshold array, or calculate progress from getBoundingClientRect().
  • Text reveal on scroll: Individual words or lines reveal as the scroll reaches them. Split text into spans and trigger each based on its position.
  • Scroll-linked color transitions: The page background or text color smoothly shifts as the user scrolls between sections.
  • Pinned scroll sequences: A section stays pinned while content within it changes — images cycle, text swaps, or a narrative progresses.
  • Zoom-through transitions: Content that the user "zooms into" as they scroll — starts small and distant, grows to fill the viewport.

Implementation pattern for scroll progress:

const getScrollProgress = (element) => {
  const rect = element.getBoundingClientRect();
  const windowHeight = window.innerHeight;
  return Math.max(0, Math.min(1, 1 - (rect.top / windowHeight)));
};

useEffect(() => {
  let ticking = false;
  const onScroll = () => {
    if (!ticking) {
      requestAnimationFrame(() => {
        // update state based on scroll
        ticking = false;
      });
      ticking = true;
    }
  };
  window.addEventListener('scroll', onScroll, { passive: true });
  return () => window.removeEventListener('scroll', onScroll);
}, []);
Motion Choreography

Beyond scroll-driven effects, all motion should feel directed and sequenced:

  • Stagger everything — nothing should move simultaneously. Orchestrate with animation-delay or sequenced timers.
  • Speed variation creates life: fast entrance (200–300ms) + slow settle (500–800ms).
  • Easing defines personality: cubic-bezier(0.16, 1, 0.3, 1) for smooth overshoots, cubic-bezier(0.77, 0, 0.175, 1) for snappy, cubic-bezier(0.33, 1, 0.68, 1) for elegant ease-out.
  • Clip-path reveals for text and images — expanding rectangles or polygons.
  • Split-text animations where each word or character animates independently.
  • Cursor-following elements or magnetic buttons for interactive moments.
Micro-Details That Signal Craft

These small things separate premium from "pretty good":

  • Custom cursor styles (a small dot cursor, or cursor that changes near interactive elements)
  • Scroll progress indicators (subtle line at the top of the viewport)
  • Smooth scroll behavior with scroll-behavior: smooth or a library like Lenis
  • Loading states that are designed — skeleton screens that match the layout, or a branded loader
  • Transitions between states (hover, active, focus) that feel considered, not default
  • Border-radius used sparingly and consistently — either sharp corners (0) for editorial/brutalist or very specific radii, never the default 8px on everything
  • Subtle grain/noise texture overlays on backgrounds for warmth and depth (use SVG filters)
  • Selection color (::selection) styled to match the brand
  • Scrollbar styling on webkit browsers

Implementation Guide for React (.jsx)

Structure
// Always use a default export with no required props
export default function SiteName() {
  return (
    <div>
      {/* Full implementation */}
    </div>
  );
}
Font Loading

Import from Google Fonts via @import in a <style> tag or use <link> in the component. Always provide a thoughtful fallback stack.

@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=DM+Sans:wght@300;400;500&display=swap');
Available Libraries
  • Three.js (r128) — for atmospheric backgrounds only (particles, grids). Import as import * as THREE from 'three'. Note: THREE.CapsuleGeometry is NOT available in r128. OrbitControls are NOT available — implement camera movement manually.
  • @splinetool/viewer via CDN script for <spline-viewer> web component
  • lucide-react for icons (but use sparingly — overuse of icons is an AI tell)
  • recharts for data visualization
  • d3 for complex animations/visualizations
  • lodash for utilities
  • Tone.js for audio
CSS Approach

Use inline styles or a <style> tag within the component. CSS variables are essential for theming consistency:

:root {
  --color-bg: #FAF9F6;
  --color-text: #1A1A1A;
  --color-text-muted: #6B6B6B;
  --color-accent: #C8553D;
  --font-display: 'Instrument Serif', Georgia, serif;
  --font-body: 'DM Sans', -apple-system, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
  --space-unit: clamp(1rem, 2vw, 2rem);
}
Animation Patterns

Prefer CSS animations and IntersectionObserver for scroll-triggered effects. Use useRef and useEffect for observers, useState for animation state triggers.

const [isVisible, setIsVisible] = useState(false);
const ref = useRef(null);

useEffect(() => {
  const observer = new IntersectionObserver(
    ([entry]) => { if (entry.isIntersecting) setIsVisible(true); },
    { threshold: 0.15 }
  );
  if (ref.current) observer.observe(ref.current);
  return () => observer.disconnect();
}, []);
Responsive Strategy

Design desktop-first for visual impact, then adapt for mobile. Use clamp() aggressively for fluid spacing and typography. Restructure layouts at breakpoints rather than just shrinking.


The prompt must be detailed — a checklist, not a paragraph

When a user (or this skill) drafts a prompt.md for a new site, a short prompt produces short output. The skill produces its best work when the prompt names every decision explicitly. A complete prompt contains each of the following, in order:

  1. Field-first declaration — the industry, the specific product inside it, why this field is real (not a dodge for a scene).
  2. Scene / subject match — Spline URL, what it depicts, what the site's subject is, confirmation they are the same noun, the scene's native backdrop color, the site's ground color, theme-harmony verdict.
  3. Previous scenes used this session — the list of URLs already used, confirming the new URL is not in it.
  4. Structural DNA — the chosen concept by name, the previous sites' DNAs, confirmation the new one is distinct.
  5. Design reference pull — 5+ specific real production sites, for each: the one move we're borrowing, named. For tech/AI, include Vercel, Cursor, Linear, Windsurf as defaults.
  6. Palette — 4–6 hex values with emotional roles (ground / ink / accent / secondary-accent).
  7. Font stack — display / body / mono, by name. Reject any of the blacklisted fonts (Inter, Poppins, Montserrat, Raleway, Space Grotesk, Outfit).
  8. Nav pattern — which of the nav variants from the catalogue this site uses; explicitly not the default top-bar three-column layout unless it's genuinely the right choice.
  9. Brand voice — 3–5 sentences of voice calibration. How does the copy read? What does this brand NOT say?
  10. Structure — every section — name, position, what it contains, length. A 6-section prompt yields a 6-section site; a vague "some sections" prompt yields a template.
  11. Specific copy hooks — at least 3 concrete lines that must appear verbatim on the site (hero headline, a pull quote, a closing line). These anchor tone.
  12. Specific technical hooks — if tech/AI: keyboard-shortcut chips, fake code blocks, specific pricing tiers, fake CLI commands, fake product names, fake customer logos (marked as illustrative). If luxury: batch numbers, commission registers, specific material provenance.
  13. Motion choreography — 2–3 specific motion techniques: one hero-entry animation, one scroll-driven behaviour, one micro-interaction. Do not repeat techniques used in previous sites this session.
  14. Critical rules / banned moves — what this site must NOT do: banned colors, banned structural moves, banned patterns from the previous sites. Explicit.
  15. Render verification checkpoint — after build, the specific screenshot the builder must take and the specific failure mode to watch for.

A prompt is "done" when every one of those 15 items has a concrete, specific answer. Vague answers ("warm palette", "some motion", "clean layout") are rejected — they are the failure mode of the SKILL.


Process

When the user asks for a premium website:

  1. Absorb the brief — field-first. Understand the brand, audience, purpose, and field/industry. The field must be a real, plausible premium industry a viewer would accept without explanation — automotive, horology, haute couture, fragrance, footwear, audio, eyewear, private medicine, etc. Do NOT invent a niche brand ("fountain-pen ink manufactory," "astronomical almanac publisher") as a dodge for an available Spline scene. Ask the user if they have product images, brand assets, videos, or specific 3D models they want used.
  2. Research the industry — deeply. Study at least 5 real reference sites (a mix of industry giants and less-obvious editorial/cultural operators). For each, write down the primary display font, body font, palette in hex, the structural DNA used, and one signature move. Compose a 6–10 line Design reference pull block at the top of the site's prompt.md.
  3. Source topic-relevant 3D from Spline — and confirm it's unique to this site. Build a keyword map of 8–12 terms for the product you're selling. Run three search passes: site:my.spline.design [keyword], community.spline.design/tag/[keyword], production-site harvest ("<iframe" "my.spline.design", "spline-viewer" "scene.splinecode"). Accept either embed format. Check the list of Spline URLs already used by previous sites in this session — the new site's URL must not match any of them. If all available scenes have already been used, fall back to photography or SVG/CSS illustration, do not recycle. Candidate scenes must pass the four-check test: resolves 200, renders at the expected quality when loaded, subject nameable in two seconds, mood matches the brand. Never fabricate a slug. Reject scenes depicting real-branded products. Decide positioning (stage / backdrop / companion / object-in-spread) before committing.
  4. Pick the structural DNA, by name. From the Structural DNA Catalog, choose one primary concept for the page and write it at the top of the prompt file as a single noun phrase. Confirm it is NOT the concept used by the previous site in this session.
  5. Commit to a concept. Based on the industry research and the structural DNA, define a creative direction that fits the field's visual language.
  6. Build the type system. Pick fonts that match the industry (based on research). Set the scale, define the hierarchy. Avoid blacklisted fonts.
  7. Design scroll-driven transitions. Plan how the user's scroll journey unfolds. Use at least 2–3 different scroll techniques throughout, but do not repeat the same technique already used as a centerpiece in a previous site this session.
  8. Obsess over details. Custom selection colors, considered hover states, refined spacing, grain textures, custom scrollbar.
  9. Verify the render — not optional. Start the preview, load the page, wait 6–10 seconds for the Spline runtime, then screenshot and look. The scene's subject must be visible, proportional, and intact; its native backdrop color must not clash with the site's ground. If the scene is cropped, miscentered, wrong-sized, or theme-clashing, fix it before calling the work done. A site with a botched Spline render is strictly worse than a site with a well-composed still image.

Never explain that you're "researching competitors" or "sourcing 3D" — just execute with craft. The design should speak for itself.

1---
2name: premium-web-design
3description: >
4 Create premium, Awwwards-quality website designs as React (.jsx) components that look like they were built by a top-tier
5 agency charging $50k+ per project. Use this skill whenever the user asks for a website, landing page, portfolio,
6 or web component that should look expensive, premium, luxury, editorial, high-end, or agency-quality. Also trigger
7 when the user mentions Awwwards, FWA, award-winning design, or references brands like Apple, Aesop, Bottega Veneta,
8 Stripe, or any luxury/fashion/design-forward brand. Trigger when the user says things like "make it look professional",
9 "make it look expensive", "I want it to look really good", "high quality design", "not generic", or expresses
10 dissatisfaction with typical AI-generated website aesthetics. Do NOT trigger for dashboards, admin panels, internal
11 tools, or functional UI where aesthetics are secondary to utility — the standard frontend-design skill handles those.
12---
13 
14# Premium Web Design
15 
16Create React (.jsx) components that look like they belong on Awwwards — the kind of work that makes people ask "who designed this?" These are sites where every pixel is intentional, every animation is choreographed, and the overall impression is that serious creative talent and budget were involved.
17 
18## The AI Aesthetic Problem
19 
20Most AI-generated websites share a recognizable DNA. Avoiding it requires knowing exactly what it looks like.
21 
22### The Blacklist — Never Do These
23 
24**Typography sins**
25- Inter, Poppins, Montserrat, Raleway, Space Grotesk, Outfit as primary fonts — these scream "AI template". (Note: *Inter Tight* is a separate font family with different metrics and is allowed.)
26- Using one font family for everything
27- Uniform font sizes with predictable hierarchy (64px → 32px → 18px → 14px)
28- Default letter-spacing and line-height everywhere
29- Centered text blocks everywhere, especially multi-line paragraphs
30 
31**Color sins**
32- Purple-to-blue gradients (the single biggest AI design cliché)
33- Indigo/violet as a primary brand color with no contextual reason
34- White background + one accent color + gray text (the SaaS starter kit)
35- Gradients on buttons or cards for no reason
36- Using opacity or semi-transparent overlays as a substitute for real color choices
37- Neon accent colors on dark backgrounds (the "developer portfolio" look)
38 
39**Layout sins**
40- Hero → 3-column feature grid → testimonials → CTA → footer (the default SaaS landing page)
41- Hero → stats bar → work grid → about split → CTA → footer (the "premium AI" landing page — just as formulaic)
42- ANY predictable top-to-bottom section ordering that could be swapped between sites. Every site must have its own unique structural DNA — different number of sections, different ordering logic, sections that don't fit neatly into categories
43- Perfectly symmetrical grids with equal-sized cards
44- Everything centered, everything contained in a max-width container
45- Rounded rectangles with box-shadows as the primary UI element
46- Icon + heading + paragraph cards in a row of 3 or 4
47- Generic hero with headline + subheadline + two buttons side by side
48- Static flat hero sections with just text — hero sections should be immersive spatial experiences
49 
50**Motion sins**
51- Elements fading in from below on scroll (the overused AOS effect)
52- Identical transitions on everything (same duration, same easing, same direction)
53- Hover effects that just scale up or add a shadow
54- Loading spinners instead of skeleton screens or choreographed reveals
55 
56**Imagery & decoration sins**
57- Blob shapes as background decorations
58- Floating geometric shapes (circles, triangles) as "design elements"
59- Generic gradient mesh backgrounds
60- Stock photo grids with uniform aspect ratios
61- Emoji or generic line icons as section markers
62 
63---
64 
65## What Expensive Actually Looks Like
66 
67Premium web design communicates craft through restraint, surprise, and obsessive attention to detail.
68 
69### Typography as Identity
70 
71Typography is the #1 differentiator between a $500 website and a $50,000 one.
72 
73**Font selection philosophy:**
74- Use distinctive serif or display fonts for headlines — fonts with personality and opinion. Good starting points: *Playfair Display, Cormorant Garamond, DM Serif Display, Fraunces, Instrument Serif* for serifs. For sans-serifs that aren't overused: *Syne, General Sans, Satoshi, Switzer, Cabinet Grotesk, Nacelle, Inter Tight, IBM Plex Sans, Manrope, Archivo, Work Sans, Instrument Sans*.
75- Pair a characterful display font with a neutral-but-refined body font.
76- Monospaced fonts as accent typography (for labels, categories, dates) add an editorial quality — *JetBrains Mono, IBM Plex Mono, Space Mono*.
77- Mix weights dramatically — a 900-weight headline next to a 300-weight body creates visual tension.
78 
79**Typography execution:**
80- `clamp()` for fluid type scaling instead of breakpoint jumps
81- Dramatic size contrast — headlines can be 8vw+ on desktop
82- Negative letter-spacing on large headlines (`-0.03em` to `-0.06em`)
83- Generous line-height on body (1.6–1.8), tight on headlines (0.9–1.1)
84- Mixed alignment — left-aligned body with occasional right-aligned labels or asymmetric headings
85- `max-width` on paragraphs (45–75ch) and `text-wrap: balance` on headings
86- Uppercase micro-labels with wide letter-spacing (`0.1em`+) for categories, dates, metadata
87 
88### Color as Atmosphere
89 
90- Start with black and white. Add color only when it earns its place.
91- One dominant hue with intention — "what emotional territory does this color claim?"
92- Off-whites and warm grays (not pure `#ffffff` or `#000000`) feel more designed — try `#FAFAF8`, `#F5F0EB`, `#1A1A1A`, `#0D0D0D`
93- Monochromatic or analogous palettes with one moment of contrast read as more sophisticated than rainbow schemes
94- Dark themes done right: not just "white on dark gray" but considered background layering with subtle warm or cool tints
95- Color used sparingly hits harder — a single red link in a sea of black-and-white is more powerful than red everywhere
96 
97### Layout as Storytelling
98 
99The #1 failure mode of this skill is producing sites that *look different on the surface but share the same underlying structure* — a hero, three editorial sections, a pull quote, a form, a colophon. Over a batch of sites this starts to feel like a template with different colors. Fight this actively, and deliberately.
100 
101**The structural DNA uniqueness rule:**
102 
103Before writing any markup, **name the primary structural concept out loud** — a single noun phrase, like *"index manuscript"* or *"sticky horizontal diorama"*. Inside one batch of sites, **no two sites may share the same primary structural concept.** If the previous site was a sticky-scroll narrative, this one is not. If the previous site was a 33/67 vertical split, this one is not. The structural idea is the first thing the user notices — varying color without varying structure is cosmetic.
104 
105#### Structural DNA Catalog
106 
107These are distinct primary structures. Each skill invocation should pick a concept and commit to it. **Do not mix two structures into one site** (it dilutes both).
108 
1091. **Index Manuscript** — A single long editorial column, no sections. One typographic rhythm from top to bottom. The whole page reads like a single manuscript that happens to be a website. (Good for: a chef's menu, a perfumer's letter, a manifesto.)
1102. **Sticky Horizontal Diorama** — The page is a long vertical scroll, but *what you see as you scroll* is a horizontally-panning scene. Use `position: sticky` + `translateX` driven by scroll. (Good for: a timeline of commissions, a process in stages, a collection of artifacts.)
1113. **Two-Pane Permanent Split** — The page is always a 50/50 (or 38/62) split; one pane is sticky, the other scrolls. Navigation happens inside a pane, never by scrolling the whole page. (Good for: an archive with a live-updating index, a librarian's catalogue.)
1124. **Slide Sequence** — Full-viewport-height "slides," one per screen, with snap scrolling. Each slide is a completely different composition. (Good for: a photographer's monograph, a gallery walkthrough, an editorial look-book.)
1135. **Staged Object on a Plinth** — A single 3D/image subject sits centered, rotatable, and the whole rest of the page is marginalia that orbits the object. (Good for: a single-product house — a watch, a flacon, a bottle.)
1146. **Pinned Narrative (Scrollytelling)** — A 2–4-screen-tall section pins in place while its contents advance through discrete states (image swaps, text swaps, progress). Used *once* in the page as its centerpiece. (Good for: a mission profile, a production process, a building collapse study.)
1157. **Horizontal Navigation** — The primary page scroll is horizontal. Sections read left-to-right. Vertical scroll is disabled or reserved for detail reveals. (Good for: a horological archive, a museum's wing, a film studio's slate.)
1168. **Sidebar + Column** — A persistent left-hand sidebar never scrolls (navigation, metadata, running footer); the right column is the entire site. (Good for: a legal practice, a research institute, an academic publisher.)
1179. **Chapter Gates** — Full-viewport chapter dividers between very different tonal zones. Each chapter has its own background color, typographic weight, and layout rhythm. The page *changes character* as you descend. (Good for: a multi-discipline studio, a retrospective.)
11810. **Ledger / Registry** — The page is presented as an old-school document — a bill of lading, a registry, a ship's manifest. Tabular rows dominate; typography reads like a ledger. (Good for: a waiting list, a batch register, an expedition manifest.)
11911. **Collage / Grid-Breaker** — A magazine-style asymmetric grid with deliberate ruptures — oversized images bleeding into columns, pull-quotes crossing gutters, footnotes in the margins. (Good for: editorial publications, cultural magazines, creative studios.)
12012. **Single Object, No Chrome** — The site is *just* the subject, rotatable, with a single short sentence below it. No nav, no footer, almost no UI. (Good for: an artist's single-piece release, a statement work.)
12113. **Product UI Slate** — The hero is a realistic simulation of the product's own interface (dashboard tiles, diff view, command palette). Used by tech/AI brands whose product IS a UI. (Good for: AI IDEs, dev tools.)
12214. **Dashboard Tile Grid** — The entire page is structured like a live-feeling dashboard with live counters, sparklines, pulsing pips. (Good for: infra, cybersecurity, observability.)
12315. **Conversation Timeline** — The page plays back a simulated conversation/transcript/call as the user scrolls. Feature callouts anchor to specific moments. (Good for: voice AI, support platforms, legal interviews.)
124 
125**How to pick the concept:**
126- Start from the client's central fact. A restaurant whose whole identity is one nine-course menu wants an *Index Manuscript*. A watchmaker whose identity is precision and a single calibre wants a *Staged Object on a Plinth*. An expedition company whose brand is one yearly journey wants a *Pinned Narrative*.
127- Reject the concept if it's the one used last time in this session. Pick the next-best.
128- Write down the concept and one sentence of justification *before* writing any JSX. Keep it visible in the prompt file.
129 
130**Layout principles (apply within whichever structural concept you pick):**
131- Break the grid intentionally. Full-width moments followed by narrow text columns. Oversized images bleeding off-screen. Asymmetric two-column splits (60/40, 70/30).
132- Generous whitespace isn't wasted space — it's a luxury signal. Padding of `8rem`+ between sections.
133- Horizontal scrolling sections for portfolios or galleries (done well, not as the main navigation pattern — unless you deliberately chose *Horizontal Navigation*).
134- Overlapping elements — text over images, images breaking out of their containers, elements that cross section boundaries.
135- Sticky elements that accompany the scroll — a label that stays while content scrolls past.
136 
137**Specific micro-patterns that read as premium:**
138- Masonry or staggered grids for visual content instead of uniform grids.
139- Text that overlaps images with mix-blend-mode for editorial effect.
140- Numbered or indexed sections with a visible progression.
141- A visible grid system (subtle lines or columns) that the design occasionally breaks.
142- Content that transforms as you scroll past it — not just appearing, but morphing, scaling, repositioning.
143- Tabular / ledger rows for lists (batches, manifests, registries) rather than card grids.
144- Form fields that look like parts of an editorial document, not a SaaS form — labels in small monospace above serif inputs, no outlines, bottom-borders only.
145 
146**Banned repeats (within a skill session):**
147- Do not give two sites both a *"sticky left column + scrolling right column"* process section. Pick it for one; invent something else for the other.
148- Do not open two sites with a *33/67 asymmetric hero*. If one did, the next opens with a centered stage, or a full-bleed backdrop, or a ledger, or no hero at all.
149- Do not end two sites with the same "enquiry form + colophon grid" pair. Vary the closing move.
150 
151**Nav-bar variety — a silent failure mode to watch.**
152 
153The easiest default is a `grid-template-columns: auto 1fr auto` top bar with "brand mark on the left, something centred, something right-aligned, mix-blend-mode: difference". After three sites, it starts to read as a signature — not a design choice. In each session, **vary the nav substantially**:
154 
155- *No nav at all* (Single Object, No Chrome brands).
156- *Nav baked into the sticky sidebar* (Sidebar + Column brands).
157- *Bottom-fixed command bar* styled like `⌘K` launcher (tech-product brands — Cursor / Linear / Arc).
158- *Inline centred wordmark* with tabs spread beneath as a secondary strip.
159- *Full-width horizontal scroll index* that doubles as the nav.
160- *Marquee nav* — continuously scrolling ticker with section names.
161- *Left-vertical nav* written bottom-to-top.
162- *Status-bar nav* with a live-operational pip.
163- *Marquee-ticker strip* (benchmark prices, metrics) plus a slim top bar.
164 
165Pick the nav that belongs to the brand and the structural DNA — do not default to the three-column top bar.
166 
167**Avoid the editorial-luxury default.**
168 
169This skill gravitates, under pressure, toward: warm cream ground, serif display (Fraunces / Cormorant), monospace metadata, a single brass accent, wide-tracked uppercase micro-labels, `◦` bullet symbols. It's a real aesthetic, appropriate for couture, parfumerie, haute cuisine, horlogerie. It is **not** appropriate for tech, AI, cybersecurity, consumer electronics, SaaS, or developer tooling — and repeatedly defaulting to it makes every site in a batch look like the same agency did them.
170 
171**If the field is technology**, the aesthetic should skew toward: pure-white or near-black grounds (not cream); neo-grotesque sans-serifs (Söhne-feel, Inter Tight, IBM Plex Sans, Instrument Sans) as display type; monospace used as *display*, not just metadata; gradient-glow edges, shipped UI screenshots, live-feeling dashboard tiles, keyboard-shortcut chips inline with copy, code blocks rendered as the hero, iridescent/chrome/glass textures rather than brass-and-paper. See Vercel, Cursor, Linear, Windsurf, Stripe, Figma, Arc, Zed, Raycast, Supabase, v0.dev, Anthropic, OpenAI.
172 
173### 3D Components — The Core Differentiator
174 
175Every website built with this skill features 3D components. This is what makes these sites stand out from flat designs. But the 3D must look professional and polished — amateur 3D is worse than no 3D.
176 
177**DO NOT build 3D objects from Three.js geometric primitives** (boxes, cylinders, cones, spheres). Cars built from boxes look like toys. Rockets built from cylinders look like diagrams. Fire built from cones looks terrible. Three.js primitives are only acceptable for subtle atmospheric background effects (particle fields, grid planes, floating dots) — never as the main hero visual.
178 
179#### Step 1: Research the Industry — Deeply
180 
181Most AI-generated "premium" sites look generic because the research step is skipped or done to a depth of two sentences. A real reference pull is the single biggest quality lever in this skill.
182 
183**Depth requirement:** Study **at least 5 real reference sites** (not 2) — a mix of the most obvious industry leaders *and* less-famous editorial/cultural operators in the same space. The less-famous references are usually where the unique moves come from; the famous ones anchor the palette.
184 
185**Starting reference sets (expand, don't stop here):**
186 
187- **AI tooling / developer tools / IDEs** → **Vercel**, **Cursor**, **Windsurf**, **Linear**, **Stripe**, **Figma**, **Arc Browser**, **Zed**, **Raycast**, **Supabase**, **Replit**, **v0.dev**, **Anthropic**, **OpenAI**. Note: **dark-first or pure-white**, **monospace used as display** (not just metadata), **precise grids**, **keyboard-shortcut chrome** (`⌘K`, `⌘↵`), **gradient glow edges**, **animated code blocks in hero**, **dashboard-tile grids**, **sub-section headers in small-caps monospace**, **`<code>`-styled callouts**. Interactive hero often = an animated product UI snapshot, not a still image.
188- **Cybersecurity / infrastructure** → **Cloudflare**, **Tailscale**, **1Password Business**, **Chainguard**, **CrowdStrike**, **Datadog Security**, **HashiCorp**, **Teleport**. Note: **scanning-beam hero animations**, **tessellated defensive grids**, **live-feeling status indicators**, **green/amber "operational" pips**, **dense data-density over whitespace**.
189- **Enterprise AI / voice** → **Anthropic**, **OpenAI Platform**, **ElevenLabs**, **Vapi**, **Retell AI**, **Bland AI**, **Cohere**, **Deepgram**, **Cartesia**. Note: warm near-black grounds, editorial serif display, live transcripts as hero, latency numbers as typographic elements.
190- **Aerospace / Defense** → SpaceX, Rocket Lab, Blue Origin, Sierra Space, Axiom, The Planetary Society, Royal Aeronautical Society. Note: dark themes, clean sans-serifs, full-bleed photography, mission-profile diagrams, minimal color accents.
191- **Automotive** → Porsche, Rivian, Lucid, Singer Vehicle Design, Pagani, David Brown Automotive, Coachbuild.com. Note: dramatic product photography, mechanical drawings, full-screen immersive heroes.
192- **Fashion / Luxury** → Bottega Veneta, Celine, The Row, Margiela, Lemaire, A.P.C., Phoebe Philo, Hermès. Note: extreme typographic restraint, serif display, near-silent whitespace.
193- **Food / Restaurants** → Noma, Eleven Madison Park, Alinea, Central (Lima), Atomix, Chefs Club, René Redzepi's archive. Note: editorial photography, muted tones, menu-as-manuscript typography, course-by-course pacing.
194- **Fragrance / Parfumerie** → Le Labo, Byredo, Frédéric Malle, Lubin, Maison Francis Kurkdjian, Diptyque, Santa Maria Novella.
195- **Architecture** → 2x4, Olson Kundig, Herzog & de Meuron, Kengo Kuma, SANAA, David Chipperfield.
196- **Horology** → F.P. Journe, A. Lange & Söhne, Philippe Dufour, Akrivia, Grönefeld, Urban Jürgensen.
197- **Art / Galleries** → David Zwirner, Gagosian, Hauser & Wirth, Galerie Lelong, White Cube, Pace.
198- **Publishing / Editorial** → New York Review of Books, Granta, The Paris Review, Apartamento, Zeit Online, MIT Press.
199- **Music / Record Labels** → ECM Records, Warp, Mute, Nonesuch, Erased Tapes, Kompakt, Sub Pop.
200- **Private Wealth / Fintech** → Addepar, Masttro, Pictet, Edmond de Rothschild, BlackRock Aladdin, Stripe.
201 
202**How to do the research pass:**
203 
2041. **Find the 5 sites.** Use `web_search`: `"[field] award-winning website"`, `"[field] Awwwards"`, `site:awwwards.com [field]`, `"[field] FWA winner"`. At least 2 of the 5 should be less-obvious editorial/cultural references, not the industry giants.
2052. **Study each with `web_fetch`.** Pull patterns, not vibes. For each site, note specifically: primary display font, secondary body font, palette as hex approximations, structural DNA (which concept from the catalog), one signature move unique to that site.
2063. **Write a 6–10 line design brief before coding.** In the prompt.md, write a "Design reference pull" block naming the 5 sites, the 3 specific patterns you're borrowing (and from which site), the palette (in hex), the font stack, and the structural DNA you've chosen.
2074. **Do not copy — combine.** Pull one thing from each reference; the combination is what makes the site feel original rather than like a clone.
208 
209The design you build should feel like it belongs alongside these real competitors — not like it came from a different universe, and not like it's a carbon copy of any single one.
210 
211#### Step 2: Source Topic-Relevant 3D from Spline
212 
213**Spline (spline.design)** is a 3D design platform with a large community library of professional, embeddable 3D scenes. A Spline scene only earns its place on a premium site if a visitor, glancing at it, immediately understands *what it represents*. A beautiful scene that has nothing to do with the subject is **worse** than no scene — it erodes the sense that every pixel is intentional, and reads as "some cool 3D the designer found," which is the opposite of premium.
214 
215##### No real-branded-product scenes — ever
216 
217Spline community scenes often depict **real, trademarked products**: a Nike Air Jordan, a Sony WH-1000XM5, an Apple Watch, a Beats Studio, a Samsung Galaxy, a Tesla Cybertruck. **These are not usable for a fictional brand's website.** Using them creates three compounding problems:
218 
2191. **Legal.** Real branded products have trademarks, design patents, and licensing agreements. Placing a Nike shoe on a website for a fictional "Trio Nord" footwear brand is trademark confusion at best, and infringement at worst.
2202. **Narrative.** A viewer who recognises the product — and most will — immediately knows the site is lying. The moment that recognition happens, the luxury illusion collapses.
2213. **Generic.** A scene that exists *because* a Nike designer or Sony visualizer made it reads as "someone on Spline recreated a famous product." It never reads as *our* product.
222 
223**Rule:** Before committing a Spline scene, ask: *Is the object in this scene a real, identifiable product from a real brand?* If yes — reject it, no matter how well-rendered it is. Look for **abstract, category-representative, or original-design** scenes instead:
224 
225- Instead of Nike Air Jordan → a generic hand-lasted leather shoe, or an abstract footwear silhouette.
226- Instead of Sony headphones → abstract floating audio-ring geometry, or a generic minimalist over-ear.
227- Instead of Apple Watch → an unbranded bezel/dial, or a mechanical-movement diagram.
228 
229If no non-branded alternative exists for the subject, either (a) fall back to photography of a generic, unbranded product, (b) build an SVG illustration, or (c) pick a different field.
230 
231##### Field-first, not scene-first — the direction of sourcing matters
232 
233An easy failure mode: you have a usable Spline URL in hand, and you invent a field to justify using it. This reads as desperation. "A fountain-pen ink maker" does not exist as a premium brand in the world because someone wanted one — it exists because you had a dark-fluid scene and built a house of cards around it. The prompt gives it away.
234 
235**The correct order is:**
236 
2371. **Pick the field.** A real, plausible luxury / premium industry — automotive, horology, haute couture, fragrance, spirits, footwear, audio, eyewear, furniture, hospitality, leather goods, cutlery, skincare, private medicine, etc. The field must be one the user, shown the finished site, would immediately accept as a real business. Pen ink is not that.
2382. **Define the product inside the field.** What, specifically, is the subject? A ring, a sneaker, a set of over-ear headphones, a chef's knife.
2393. **Then search Spline for that product.** With the keyword-map expansion. Use both `my.spline.design/` and `prod.spline.design/` URLs.
2404. **If no topic-relevant scene exists, change field — do not bend the field to match a scene you already have.**
241 
242A healthy batch of sites spans genuinely-different industries a reader recognises. A batch of sites whose shared thread is "whichever field the available Spline URLs imply" is not a portfolio — it's a rationalisation.
243 
244##### Scene uniqueness — no reuse within a session
245 
246**Within a single session / batch of sites, no two sites may use the same Spline scene URL.** Reusing a scene across multiple houses reads like a stock-photo library showing through, and undoes the SKILL's entire claim that each site is its own identity.
247 
248- If you've used `worldplanet` on one site, don't use it on the next, no matter how directly it "fits" the new field. Find a different scene.
249- If you can't find a unique scene for the new field, **fall back to photography** or a deterministic SVG/CSS illustration — never recycle.
250- Even scenes that seem interchangeable (two different Earth scenes, two different fluid scenes) should not all appear in one batch. One Earth scene per batch. One fluid scene per batch.
251- At the top of every new `prompt.md`, list the Spline URLs already used in this session by the previous sites. Confirm the new site's URL is NOT in that list.
252 
253##### The cardinal rule: topic-literal, not topic-metaphorical
254 
255A Spline scene is acceptable only when it **literally depicts the subject of the site's brand.** Metaphorical links are rejected, even if they're poetic:
256 
257- A fluid scene is fine for an **ink maker** (the fluid IS ink) but **not** for a restaurant (broth does not justify a black fluid next to a menu).
258- An Earth scene is fine for a **spaceflight company** (the Earth is what passengers see) or a **cartographer** (Earth is what they map) but **not** for a family office "with global reach" (the link is metaphorical).
259- A watch scene is fine for a watchmaker, not for a "time-respecting" consulting firm.
260 
261Before using any Spline scene, state out loud in the `prompt.md`: *"The scene depicts X. My site's subject is X."* If those two X's are not the same noun, reject the scene. The brand itself must be in the business of whatever the scene shows — not merely invoke it symbolically.
262 
263**The two-second test still applies:** with no caption, a viewer should name the subject of the scene. A "nice abstract composition" is not a subject.
264 
265##### Theme harmony — the scene and the site must visually belong to each other
266 
267A Spline scene has its **own backdrop color and lighting mood baked into the render.** If that backdrop fights the site's palette, the scene will look cut out and pasted on — amateurish, no matter how premium the 3D itself is. Before committing a scene, check:
268 
269- **Dark scene on a dark site** — Works. The scene's black edges dissolve into the page.
270- **Light scene on a light site** — Works. The scene's light backdrop extends the paper.
271- **Dark scene on a light site** — Usually **fails** (looks like a hole punched into the page). Only acceptable with a deliberate framed-viewport treatment (a bordered "window" into the dark scene, like a photograph on a wall).
272- **Light scene on a dark site** — Same failure pattern, inverse. Same mitigation.
273 
274Write down, in the `prompt.md`, the **scene's native backdrop color** and the **site's ground color**. If they're opposite and there's no framed-viewport treatment, pick a different scene or pick a different theme.
275 
276##### Expand the search vocabulary before searching
277 
278Never search Spline for just the topic word. A single-keyword search misses 90% of relevant scenes — most creators title their work by what's *in* it (wheel, tire, headlight) rather than the category.
279 
280Before searching, build a keyword map of **at least 8–12 terms** covering:
281 
282- **The subject itself** — car, watch, perfume bottle
283- **Synonyms / category terms** — automobile, sportscar, vehicle, supercar; timepiece, chronograph; fragrance, parfum, scent
284- **Iconic components and close-ups** — wheel, tire, rim, engine, exhaust, dashboard, steering wheel, headlight; gears, tourbillon, crown, dial, movement; bottle, glass, droplet, atomiser
285- **Materials and surfaces** — chrome, metal, leather, carbon; brass, platinum, gold, steel; crystal, glass, amber liquid
286- **Processes / environments** — assembly, atelier, race track, showroom; workshop, manufacture, loupe; apothecary, laboratory
287- **Symbols / metaphors** — horizon, motion lines; orbit, constellation, star; flower, smoke, vapor
288 
289Also search Awwwards, Codrops, Tympanus, Dribbble, Twitter/X, and **production-site HTML** (`"<iframe" "my.spline.design"`, `"<spline-viewer" "scene.splinecode"`, `site:codepen.io "my.spline.design"`, `site:github.com "my.spline.design"`). URLs found inside working iframes on live sites are guaranteed to render.
290 
291**Do a minimum of three search passes:**
2921. **Slug/topic pass** — direct `site:my.spline.design [keyword]` for every word in the keyword map.
2932. **Community-page pass** — `community.spline.design/tag/[keyword]`.
2943. **Harvesting pass** — `"<iframe" "my.spline.design/[topic keyword]"` to find URLs already embedded in live production sites.
295 
296##### Spline URL format reference — know what you have
297 
298Spline has **four** URL formats you will encounter. Only two of them are usable as embeds.
299 
300| URL shape | What it is | Usable as embed? | How |
301|---|---|---|---|
302| `community.spline.design/file/[uuid]` | Community gallery page (HTML with JS viewer) | ❌ No | Sends `X-Frame-Options`, blocks iframe. Also does not expose the embed URL in its HTML — the `my.spline.design` slug is added client-side after the user hits Share. |
303| `app.spline.design/community/file/[uuid]` | Spline editor, opened to that community file | ❌ No | Editor page, not an embed. |
304| `my.spline.design/[slug]/` | Published HTML scene page | ✅ Yes, via **iframe** | `<iframe src="https://my.spline.design/[slug]/">` |
305| `prod.spline.design/[id]/scene.splinecode` | Raw runtime binary | ✅ Yes, via **spline-viewer** | `<spline-viewer url="https://prod.spline.design/[id]/scene.splinecode">` |
306 
307**Critical misuse to avoid:** do NOT put a `.splinecode` URL into an `<iframe src>` — it renders as a broken placeholder or a binary download. Use the web component. Conversely, do NOT put a `my.spline.design/` URL into a `<spline-viewer url>` — the viewer expects the runtime binary, not an HTML page.
308 
309**Never fabricate slugs.** The community file UUID and the published scene slug are different identifiers; guessing the slug almost always 403s. If you cannot verify a URL returns HTTP 200, it doesn't exist.
310 
311##### Community URLs: an important reality
312 
313Scenes shown at `https://community.spline.design/file/[uuid]` are **not directly iframe-embeddable** — the community domain sends `X-Frame-Options` headers that block framing, and Google does not index the underlying `my.spline.design/[slug]/` URL. When search surfaces a perfect-looking community scene, you cannot simply iframe `community.spline.design/file/...`.
314 
315Workarounds, in order of reliability:
3161. **Ask the user** to open the community file, hit *Share → Public URL*, and paste the `my.spline.design/…` link. This is the correct answer when you've found the *ideal* scene but can't extract its embed URL.
3172. **Check if the creator linked it on their portfolio** — many Spline creators embed their own scenes on their personal site.
3183. **Remix workflow** — the user opens the community file, clicks *Remix*, and the remixed copy belongs to their account with its own public `my.spline.design` URL they can share.
3194. **Accept the limitation** — if you cannot verify a URL, do not guess the slug.
320 
321##### Spline embed — the bulletproof pattern (both methods)
322 
323Spline sizing problems have one underlying cause: the **scene's internal canvas fills 100% of the container**, and **the space around the 3D object is filled with the scene's internal background color** — which defaults to a neutral color the creator chose, *not* your page's ground. When you drop a scene into a tall container, the scene looks correct in the part the object occupies and looks like a solid-color void in the rest. That void is the scene's background, not a rendering bug.
324 
325**The fix has three parts, always applied together:**
326 
3271. **Container defines size explicitly** — width, height, position, overflow:hidden. Never rely on the scene to size itself.
3282. **Scene element fills the container — position:absolute, inset:0.**
3293. **Match the scene's background to your page's ground** — via the `background` attribute on `<spline-viewer>`, or (for iframes) by picking a scene whose native backdrop already matches.
330 
331**Method 1 — iframe embed (for `my.spline.design/[slug]/` URLs):**
332 
333```jsx
334// Container — always defines size + overflow:hidden
335<div
336 style={{
337 position: "relative",
338 width: "100%",
339 height: "100%", // or a specific value / aspect-ratio / vh
340 minHeight: 420, // guarantees a usable minimum
341 overflow: "hidden",
342 background: "#0A0B0F", // matches the page ground — seen during load
343 }}
344>
345 {/* skeleton loader underneath — visible until Spline paints */}
346 <div
347 style={{
348 position: "absolute",
349 inset: 0,
350 background:
351 "linear-gradient(110deg, #0A0B0F 30%, #151821 50%, #0A0B0F 70%)",
352 backgroundSize: "200% 100%",
353 animation: "skl 1.8s ease-in-out infinite",
354 zIndex: 0,
355 }}
356 />
357 <iframe
358 src="https://my.spline.design/[scene-slug]/"
359 style={{
360 position: "absolute", inset: 0,
361 width: "100%", height: "100%",
362 border: "none", display: "block",
363 zIndex: 1,
364 }}
365 title="3D Scene"
366 loading="lazy"
367 allow="autoplay; fullscreen"
368 />
369</div>
370```
371 
372The iframe cannot be told what background to render — you get whatever the creator baked in. If it doesn't match your page, either (a) accept a framed-viewport treatment (surround the scene with a visible bordered card), or (b) switch to a `.splinecode` URL of the same scene and use the web component (below), which can override the background.
373 
374**Method 2 — `<spline-viewer>` web component (for `prod.spline.design/[id]/scene.splinecode` URLs):**
375 
376This is the **preferred** method for tech sites where theme-harmony matters, because `<spline-viewer>` exposes a **`background` attribute** that replaces the scene's internal background entirely.
377 
378```jsx
379// Inject the viewer script once per app (put in main.jsx or the first component that uses it):
380useEffect(() => {
381 if (document.querySelector('script[data-spline-viewer]')) return;
382 const s = document.createElement("script");
383 s.type = "module";
384 s.src = "https://unpkg.com/@splinetool/[email protected]/build/spline-viewer.js";
385 s.setAttribute("data-spline-viewer", "1");
386 document.head.appendChild(s);
387}, []);
388 
389// Then render the viewer inside a sized container.
390// Use dangerouslySetInnerHTML because JSX can't parse the custom tag's `background` attribute as a color.
391<div style={{ position: "relative", width: "100%", height: "100%", minHeight: 480, overflow: "hidden" }}>
392 <div
393 dangerouslySetInnerHTML={{
394 __html: `<spline-viewer
395 url="https://prod.spline.design/[id]/scene.splinecode"
396 background="#0A0B0F"
397 style="position:absolute;inset:0;width:100%;height:100%;display:block;"
398 ></spline-viewer>`,
399 }}
400 />
401</div>
402```
403 
404The `background` attribute accepts any CSS color value — `#0A0B0F`, `transparent`, `rgba(11,16,20,0.9)`. **Set it to your page's ground color.** The empty area around the 3D object now blends into the page, and the "bottom half is black" problem disappears.
405 
406##### Spline scene types — avoid "hero section" scenes
407 
408Not every Spline scene is a discrete 3D object. The community is full of scenes titled things like:
409 
410- *"reeded glass prism — hero section UI concept"*
411- *"AI landing page hero"*
412- *"SaaS hero with CTA"*
413 
414These scenes contain their own **baked-in HTML-like text, buttons, and layout**, rendered as part of the 3D composition. When you embed one, you get a full pre-designed hero inside your hero — the scene's own text fights with your page's text, and the scene's own CTA competes with yours.
415 
416**Before committing a scene, read its title.** If the title contains *"hero section," "landing page," "UI concept,"* or *"website template"* — treat it with suspicion. Open it, look at it, and either:
417 
418- Accept the scene AS the hero (delete your own hero HTML on top of it).
419- Reject the scene and find a pure-object scene (one whose title is just an object — *"watch," "shoe," "orb"* — not a composition).
420 
421##### Camera framing — how to fix "object too small / too zoomed"
422 
423If the scene renders at the wrong zoom (object tiny in a big canvas), the creator's baked-in camera is the cause. Three fixes, in order of simplicity:
424 
4251. **CSS transform** — wrap the viewer in a container and apply `transform: scale(1.4)` to the inner element. The whole rendered canvas scales up; the container's `overflow: hidden` clips the edges. Simple, works with both iframe and web-component.
4262. **Narrower container** — Spline canvases auto-fit. A narrower, taller container tends to zoom the scene in; a wider, shorter container shows more empty space around it. Adjust the container's aspect-ratio to crop toward the object.
4273. **React Spline with `setZoom()`** — only if you're using `@splinetool/react-spline` (not `<spline-viewer>`). The `onLoad` callback receives a Spline `Application` object with a `setZoom(level)` method. Call `application.setZoom(1.5)` on load.
428 
429##### Loading states — never show blank white
430 
431Spline scenes are 1–16 MB binaries. They load in 2–8 seconds on a fast connection. During that window, a blank white viewport is the worst possible experience.
432 
433**Always layer a skeleton loader beneath the scene**, inside the same container. The container has the skeleton as its background (via a shimmering gradient animation), the scene paints on top when it loads. No JavaScript coordination needed.
434 
435```css
436@keyframes skl {
437 0% { background-position: 0% 50%; }
438 100% { background-position: -200% 50%; }
439}
440```
441 
442The skeleton should use the page's ground color + one slightly lighter tint. Never use a white skeleton on a dark site.
443 
444##### The relevance test — apply before committing
445 
446Once you have a candidate scene, run these **four** checks. If any fails, keep searching:
447 
4481. **It actually resolves.** `curl -I [url]` returns 200, not 403/404. Guessed slugs from community UUIDs almost always 403. If you can't verify a 200, the URL doesn't exist.
4492. **It looks right when rendered.** Load the URL in a browser (or the preview iframe) and *look at it*. Many Spline URLs whose slug says "rocket" or "robot" turn out to be low-poly cartoon scenes in garish purple. A slug is not a guarantee of quality — your eye is. Screenshot the iframe before committing the site to use it.
4503. **Subject recognition** — With no caption and a two-second glance, would a viewer name the subject correctly? ("A car." "A rocket." "A perfume bottle.") A "nice composition" is not a subject.
4514. **Brand fit** — Does the scene's palette, lighting mood, and polish match the brand direction? A low-poly toy-car style is not luxury. A neon-glow cyber-robot is not a medical AI company.
452 
453**Do not skip step 2.** Slugs lie. Every Spline URL must be visually verified in a real browser before you commit a whole site's design around it.
454 
455##### After-build render-size check — MANDATORY
456 
457Verifying the URL *works* is not the same as verifying the scene *renders at the right size in your layout.* Spline scenes have their own internal camera and framing — dropping one into a small viewport, a wide banner, or an awkward aspect ratio often crops the subject out of frame or shrinks it to a speck.
458 
459**After you build the site, before calling it done, do this in order:**
460 
4611. Start the preview.
4622. Load the page and wait 6–10 seconds for the Spline runtime to load.
4633. **Screenshot the hero.**
4644. Look at the screenshot. The subject of the scene must be:
465 - **Visible** (not cropped off to the side, not behind a veil you forgot to make transparent)
466 - **Proportional** (not taking 4% of a 1600px container — it should read at the intended size)
467 - **Intact** (the model is whole, not cut in half by your typography layer)
4685. If any of those fail: adjust the container's aspect ratio, resize the iframe, add scene padding via `transform: scale()` on the iframe, or change to a different scene positioning (stage / backdrop / companion).
4696. Screenshot again. Repeat until the scene renders correctly.
470 
471Common size failures and fixes:
472- *Scene appears tiny in a huge container* → the scene's camera is at a fixed zoom and the creator set it for a different aspect. Either (a) put the scene in a smaller, matching-aspect container, or (b) apply `transform: scale(1.4)` on the iframe to zoom in.
473- *Scene is cropped off the side* → the scene's natural center is offset; use `transform: translateX()` on the iframe to recenter.
474- *Scene disappears into a dark-on-dark background* → your CSS veil is too heavy, or the site bg is suffocating the scene. Lower the veil opacity. Use `background` attribute.
475- *Scene backdrop is the wrong color for the site* → you violated the theme-harmony rule; use the `background` attribute (for spline-viewer) or pick a different scene.
476 
477This step is not optional. A site that contains a miscentered or wrong-sized Spline scene is strictly worse than a site with a well-composed still image.
478 
479##### Positioning is part of relevance
480 
481Even the right scene fails if it's placed poorly. Pick one of these spatial logics — don't just drop the scene into a panel and hope:
482 
483- **Stage** — Scene is framed like a product on a plinth. Full viewport (or large contained area), centered, typography around it. Works for cars, watches, bottles, any physical object. The user can rotate it. This is usually the right choice.
484- **Backdrop** — Scene fills the entire viewport behind the hero typography, with a gradient veil so type stays legible. The scene is context/atmosphere, not focus. Works when the scene has a dominant subject that reads even at 20% opacity (earth, rocket, planet).
485- **Companion** — Scene lives in a dedicated panel (40/60 or 33/67 split) with typography on the other side. Only acceptable if the scene's subject is *obviously* topic-relevant.
486- **Object in a spread** — Scene is small-to-medium and anchored in a specific grid position, treated like a framed photograph in an editorial layout. Works in manifesto or story sections, not usually the hero.
487 
488If your chosen scene doesn't fit any of these with clear logic, that's a signal to find a different scene — not to wedge it in.
489 
490##### Fallback hierarchy — always layered, never a panicked switch
491 
492If no topic-relevant Spline scene can be verified after a full search, do NOT force one. And do not build a brittle "if Spline fails, swap to photo" JavaScript flip — that's a visible glitch. Instead, **layer the fallback underneath the Spline viewer**, so if Spline is slow or fails, the user still sees something intentional.
493 
494**The hierarchy, in order:**
495 
4961. **Client-provided assets** — if the user has their own Spline scene, product renders, brand video, ask for them first.
4972. **Verified Spline scene** (`my.spline.design/[slug]/` or `prod.spline.design/[id]/scene.splinecode`) that genuinely depicts the subject.
4983. **Professional still photography** (client-provided, or tightly curated from Unsplash) with CSS parallax + subtle grain/filter. Always screenshot-verify the image renders as expected.
4994. **CSS / SVG illustration** — a deliberate custom illustration (Geneva stripes, a hand-drawn diagram, a rendered mockup) built entirely in HTML/CSS/SVG. Deterministic, no network dependency.
5005. **Three.js atmospheric layer** — a minimal particle field, grid plane, or drifting-dust canvas as *background atmosphere only*, behind a still-image or typographic hero. Never the main visual.
501 
502**Layered implementation (CSS-only fallback under Spline):**
503 
504```jsx
505<div className="hero-stage">
506 {/* Layer 0 — always visible. The base fallback (photo or illustration). */}
507 <div className="hero-fallback" />
508 
509 {/* Layer 1 — Spline paints over the fallback if/when it loads.
510 If Spline 404s, never loads, or is disabled, layer 0 remains visible. */}
511 <div
512 className="hero-scene"
513 dangerouslySetInnerHTML={{
514 __html: `<spline-viewer url="..." background="transparent" style="..."></spline-viewer>`
515 }}
516 />
517</div>
518 
519/* CSS */
520.hero-stage { position: relative; width: 100%; height: 100%; overflow: hidden; }
521.hero-fallback {
522 position: absolute; inset: 0;
523 background-image: url("https://images.unsplash.com/photo-[verified-id]?w=1800&q=85");
524 background-size: cover; background-position: center;
525 filter: saturate(0.9) contrast(1.05);
526 z-index: 0;
527}
528.hero-scene { position: absolute; inset: 0; z-index: 1; }
529```
530 
531When Spline uses `background="transparent"`, the empty space around the 3D object reveals the fallback photograph underneath. The page always has a visible hero — Spline is an enhancement, not a requirement.
532 
533##### Photography fallback — verify the image, don't guess
534 
535Unsplash URLs are convenient but unverifiable without loading. A URL like `https://images.unsplash.com/photo-1548484352-ea579e5233a8?w=1200&q=80` looks specific (it names a photo ID) but the photographer may have replaced or removed the file, the crop may be different from what you expect, and at a different viewport aspect ratio you may see a different subject entirely than what the photo is *named* for.
536 
537When using photography fallback:
538 
5391. **Prefer client-supplied imagery first.** Ask the user for product photos.
5402. **If you must use Unsplash**, pick photos you have already seen (either via a tool that can render the URL, or by asking the user to confirm the photo). Do NOT pick a photo ID because its filename implies the topic — verify.
5413. **After build, screenshot the photograph in situ.** Look at it. Confirm the subject, the crop, and the color treatment.
5424. **If the photograph doesn't render as you expected, swap it.** Search Unsplash again by the exact concrete noun — and re-screenshot.
543 
544**If no relevant scene or photograph exists**, a deterministic **CSS/SVG illustration** is always a valid alternative — built entirely in the page, no network dependency, always renders identically. Examples: a cross-section diagram of a CLT timber panel, Geneva-stripes on a watchmaker's bridge, a sneaker silhouette, a reactive orb built from conic gradients.
545 
546**An irrelevant 3D scene, however pretty, damages the luxury impression. A considered still image or SVG illustration doesn't.**
547 
548### Color and Typography Must Match the Industry
549 
550- **Aerospace / Defense**: Dark backgrounds (`#0A0A0A`, `#0C1222`), clean sans-serifs, minimal accent colors (white, silver, or a single restrained blue). Think SpaceX — not orange and white.
551- **Automotive**: Deep blacks, dramatic lighting effects, premium sans-serifs or geometric fonts, metallic accent tones. Think Porsche — restrained, confident.
552- **Fashion / Luxury**: Extreme restraint. Serifs for display, thin sans-serifs for body. Near-black and off-white. No bright accent colors. Think Bottega Veneta.
553- **Food / Restaurant**: Warm tones (cream, charcoal, muted earth), editorial serifs, generous whitespace. Think Noma.
554- **Tech / AI tooling**: Can go darker or lighter, but avoid the purple-gradient cliché. Clean, systematic layouts with monospace display. Think Linear / Vercel / Cursor.
555- **Finance / Legal**: Conservative palettes (navy, charcoal, forest), traditional serifs for authority, structured grids.
556 
557**Bad color choices** that make sites look unprofessional:
558- Orange + white for aerospace (looks like a construction company)
559- Bright cyan on black for everything (looks like a hacker movie)
560- Using the same accent color across different industries
561 
562**Critical technical rules:**
563- Always `import React` alongside hooks: `import React, { useState, useEffect, useRef } from "react";`
564- Never use JSX fragments (`<>...</>`) — use `<span>` or `<div>` instead for compatibility
565- When using iframes for Spline, set `loading="lazy"` and provide a styled loading placeholder
566- When using images, always include `?w=1920&q=80` parameters for Unsplash URLs
567- For any Three.js: set `alpha: true`, use `setPixelRatio(Math.min(window.devicePixelRatio, 2))`, and clean up on unmount
568 
569### Scroll-Driven Experiences
570 
571Scrolling should feel like a directed journey, not just moving down a page.
572 
573**Scroll-driven techniques:**
574- **Parallax layers**: Multiple elements moving at different speeds. Track `window.scrollY` and apply different multipliers to different elements.
575- **Horizontal scroll sections**: A section that scrolls horizontally as the user scrolls vertically. Use `position: sticky` on a container with `overflow: hidden`, then `translateX` inner content based on scroll progress.
576- **Scale-on-scroll**: Elements that grow from small to full-size as you scroll through them. Use `IntersectionObserver` with a threshold array, or calculate progress from `getBoundingClientRect()`.
577- **Text reveal on scroll**: Individual words or lines reveal as the scroll reaches them. Split text into spans and trigger each based on its position.
578- **Scroll-linked color transitions**: The page background or text color smoothly shifts as the user scrolls between sections.
579- **Pinned scroll sequences**: A section stays pinned while content within it changes — images cycle, text swaps, or a narrative progresses.
580- **Zoom-through transitions**: Content that the user "zooms into" as they scroll — starts small and distant, grows to fill the viewport.
581 
582**Implementation pattern for scroll progress:**
583 
584```jsx
585const getScrollProgress = (element) => {
586 const rect = element.getBoundingClientRect();
587 const windowHeight = window.innerHeight;
588 return Math.max(0, Math.min(1, 1 - (rect.top / windowHeight)));
589};
590 
591useEffect(() => {
592 let ticking = false;
593 const onScroll = () => {
594 if (!ticking) {
595 requestAnimationFrame(() => {
596 // update state based on scroll
597 ticking = false;
598 });
599 ticking = true;
600 }
601 };
602 window.addEventListener('scroll', onScroll, { passive: true });
603 return () => window.removeEventListener('scroll', onScroll);
604}, []);
605```
606 
607### Motion Choreography
608 
609Beyond scroll-driven effects, all motion should feel directed and sequenced:
610 
611- Stagger everything — nothing should move simultaneously. Orchestrate with `animation-delay` or sequenced timers.
612- Speed variation creates life: fast entrance (200–300ms) + slow settle (500–800ms).
613- Easing defines personality: `cubic-bezier(0.16, 1, 0.3, 1)` for smooth overshoots, `cubic-bezier(0.77, 0, 0.175, 1)` for snappy, `cubic-bezier(0.33, 1, 0.68, 1)` for elegant ease-out.
614- Clip-path reveals for text and images — expanding rectangles or polygons.
615- Split-text animations where each word or character animates independently.
616- Cursor-following elements or magnetic buttons for interactive moments.
617 
618### Micro-Details That Signal Craft
619 
620These small things separate premium from "pretty good":
621 
622- Custom cursor styles (a small dot cursor, or cursor that changes near interactive elements)
623- Scroll progress indicators (subtle line at the top of the viewport)
624- Smooth scroll behavior with `scroll-behavior: smooth` or a library like Lenis
625- Loading states that are designed — skeleton screens that match the layout, or a branded loader
626- Transitions between states (hover, active, focus) that feel considered, not default
627- Border-radius used sparingly and consistently — either sharp corners (0) for editorial/brutalist or very specific radii, never the default `8px` on everything
628- Subtle grain/noise texture overlays on backgrounds for warmth and depth (use SVG filters)
629- Selection color (`::selection`) styled to match the brand
630- Scrollbar styling on webkit browsers
631 
632---
633 
634## Implementation Guide for React (.jsx)
635 
636### Structure
637 
638```jsx
639// Always use a default export with no required props
640export default function SiteName() {
641 return (
642 <div>
643 {/* Full implementation */}
644 </div>
645 );
646}
647```
648 
649### Font Loading
650 
651Import from Google Fonts via `@import` in a `<style>` tag or use `<link>` in the component. Always provide a thoughtful fallback stack.
652 
653```css
654@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=DM+Sans:wght@300;400;500&display=swap');
655```
656 
657### Available Libraries
658 
659- **Three.js (r128)** — for atmospheric backgrounds only (particles, grids). Import as `import * as THREE from 'three'`. Note: `THREE.CapsuleGeometry` is NOT available in r128. OrbitControls are NOT available — implement camera movement manually.
660- **@splinetool/viewer** via CDN script for `<spline-viewer>` web component
661- **lucide-react** for icons (but use sparingly — overuse of icons is an AI tell)
662- **recharts** for data visualization
663- **d3** for complex animations/visualizations
664- **lodash** for utilities
665- **Tone.js** for audio
666 
667### CSS Approach
668 
669Use inline styles or a `<style>` tag within the component. CSS variables are essential for theming consistency:
670 
671```css
672:root {
673 --color-bg: #FAF9F6;
674 --color-text: #1A1A1A;
675 --color-text-muted: #6B6B6B;
676 --color-accent: #C8553D;
677 --font-display: 'Instrument Serif', Georgia, serif;
678 --font-body: 'DM Sans', -apple-system, sans-serif;
679 --font-mono: 'JetBrains Mono', monospace;
680 --space-unit: clamp(1rem, 2vw, 2rem);
681}
682```
683 
684### Animation Patterns
685 
686Prefer CSS animations and `IntersectionObserver` for scroll-triggered effects. Use `useRef` and `useEffect` for observers, `useState` for animation state triggers.
687 
688```jsx
689const [isVisible, setIsVisible] = useState(false);
690const ref = useRef(null);
691 
692useEffect(() => {
693 const observer = new IntersectionObserver(
694 ([entry]) => { if (entry.isIntersecting) setIsVisible(true); },
695 { threshold: 0.15 }
696 );
697 if (ref.current) observer.observe(ref.current);
698 return () => observer.disconnect();
699}, []);
700```
701 
702### Responsive Strategy
703 
704Design desktop-first for visual impact, then adapt for mobile. Use `clamp()` aggressively for fluid spacing and typography. Restructure layouts at breakpoints rather than just shrinking.
705 
706---
707 
708## The prompt must be detailed — a checklist, not a paragraph
709 
710When a user (or this skill) drafts a `prompt.md` for a new site, a short prompt produces short output. The skill produces its best work when the prompt names every decision explicitly. A **complete prompt** contains each of the following, in order:
711 
7121. **Field-first declaration** — the industry, the specific product inside it, why this field is real (not a dodge for a scene).
7132. **Scene / subject match** — Spline URL, what it depicts, what the site's subject is, confirmation they are the same noun, the scene's native backdrop color, the site's ground color, theme-harmony verdict.
7143. **Previous scenes used this session** — the list of URLs already used, confirming the new URL is not in it.
7154. **Structural DNA** — the chosen concept by name, the previous sites' DNAs, confirmation the new one is distinct.
7165. **Design reference pull** — 5+ specific real production sites, for each: the one move we're borrowing, named. For tech/AI, include Vercel, Cursor, Linear, Windsurf as defaults.
7176. **Palette** — 4–6 hex values with emotional roles (ground / ink / accent / secondary-accent).
7187. **Font stack** — display / body / mono, by name. Reject any of the blacklisted fonts (Inter, Poppins, Montserrat, Raleway, Space Grotesk, Outfit).
7198. **Nav pattern** — which of the nav variants from the catalogue this site uses; explicitly not the default top-bar three-column layout unless it's genuinely the right choice.
7209. **Brand voice** — 3–5 sentences of voice calibration. How does the copy read? What does this brand NOT say?
72110. **Structure — every section** — name, position, what it contains, length. A 6-section prompt yields a 6-section site; a vague "some sections" prompt yields a template.
72211. **Specific copy hooks** — at least 3 concrete lines that must appear verbatim on the site (hero headline, a pull quote, a closing line). These anchor tone.
72312. **Specific technical hooks** — if tech/AI: keyboard-shortcut chips, fake code blocks, specific pricing tiers, fake CLI commands, fake product names, fake customer logos (marked as illustrative). If luxury: batch numbers, commission registers, specific material provenance.
72413. **Motion choreography** — 2–3 specific motion techniques: one hero-entry animation, one scroll-driven behaviour, one micro-interaction. Do not repeat techniques used in previous sites this session.
72514. **Critical rules / banned moves** — what this site must NOT do: banned colors, banned structural moves, banned patterns from the previous sites. Explicit.
72615. **Render verification checkpoint** — after build, the specific screenshot the builder must take and the specific failure mode to watch for.
727 
728A prompt is "done" when every one of those 15 items has a concrete, specific answer. Vague answers ("warm palette", "some motion", "clean layout") are rejected — they are the failure mode of the SKILL.
729 
730---
731 
732## Process
733 
734When the user asks for a premium website:
735 
7361. **Absorb the brief — field-first.** Understand the brand, audience, purpose, and field/industry. The field must be a **real, plausible premium industry** a viewer would accept without explanation — automotive, horology, haute couture, fragrance, footwear, audio, eyewear, private medicine, etc. Do NOT invent a niche brand ("fountain-pen ink manufactory," "astronomical almanac publisher") as a dodge for an available Spline scene. Ask the user if they have product images, brand assets, videos, or specific 3D models they want used.
7372. **Research the industry — deeply.** Study **at least 5** real reference sites (a mix of industry giants and less-obvious editorial/cultural operators). For each, write down the primary display font, body font, palette in hex, the structural DNA used, and one signature move. Compose a 6–10 line **Design reference pull** block at the top of the site's `prompt.md`.
7383. **Source topic-relevant 3D from Spline — and confirm it's unique to this site.** Build a keyword map of 8–12 terms for the product you're selling. Run three search passes: `site:my.spline.design [keyword]`, `community.spline.design/tag/[keyword]`, production-site harvest (`"<iframe" "my.spline.design"`, `"spline-viewer" "scene.splinecode"`). Accept either embed format. Check the list of Spline URLs already used by previous sites in this session — **the new site's URL must not match any of them.** If all available scenes have already been used, fall back to photography or SVG/CSS illustration, do not recycle. Candidate scenes must pass the four-check test: resolves 200, renders at the expected quality when loaded, subject nameable in two seconds, mood matches the brand. Never fabricate a slug. Reject scenes depicting real-branded products. Decide positioning (stage / backdrop / companion / object-in-spread) before committing.
7394. **Pick the structural DNA, by name.** From the Structural DNA Catalog, choose *one* primary concept for the page and write it at the top of the prompt file as a single noun phrase. Confirm it is NOT the concept used by the previous site in this session.
7405. **Commit to a concept.** Based on the industry research and the structural DNA, define a creative direction that fits the field's visual language.
7416. **Build the type system.** Pick fonts that match the industry (based on research). Set the scale, define the hierarchy. Avoid blacklisted fonts.
7427. **Design scroll-driven transitions.** Plan how the user's scroll journey unfolds. Use at least 2–3 different scroll techniques throughout, but do not repeat the same technique already used as a centerpiece in a previous site this session.
7438. **Obsess over details.** Custom selection colors, considered hover states, refined spacing, grain textures, custom scrollbar.
7449. **Verify the render — not optional.** Start the preview, load the page, wait 6–10 seconds for the Spline runtime, then **screenshot and look**. The scene's subject must be visible, proportional, and intact; its native backdrop color must not clash with the site's ground. If the scene is cropped, miscentered, wrong-sized, or theme-clashing, fix it before calling the work done. A site with a botched Spline render is strictly worse than a site with a well-composed still image.
745 
746Never explain that you're "researching competitors" or "sourcing 3D" — just execute with craft. The design should speak for itself.
747 

Discussion

Alternatives

shadcn/uiManages shadcn components and projects — adding, searching, fixing, debugging, styling, and composing UI, including chat interfaces. Provides project context, component docs, and usage examples. Applies when working with shadcn/ui, component registries, presets, --preset codes, or any project with a components.json file. Also triggers for "shadcn init", "create an app with --preset", or "switch to --preset".Coding · MITWeb artifacts builderSuite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.Coding · Apache-2.0Create STYLE_GUIDE.mdThis prompt assists users in creating a comprehensive STYLE_GUIDE.md for their projects. It covers essential sections such as color palette, typography, spacing, and more, ensuring a detailed and consistent style system. Users can also include example component design references.Coding · CC0-1.0Frontend developer skillThis prompt is designed for an elite frontend development specialist. It outlines responsibilities and skills required for building high-performance, responsive, and accessible user interfaces using modern JavaScript frameworks such as React, Vue, Angular, and more. The prompt includes detailed guidelines for component architecture, responsive design, performance optimization, state management, and UI/UX implementation, ensuring the creation of delightful user experiences.Coding · CC0-1.0