design-taste-frontend
- Use it when:
- You're building or redesigning a landing page, marketing site or portfolio, or a page looks generic and AI-made.
- It does:
- Has a script offer three design directions from a library built on 247 sites from galleries like Awwwards, then builds around an idea from your subject.
- You get:
- A finished page with full copy, real credited pictures and motion, plus a report listing the direction, critique scores and sample content to swap before launch.
- Checks:
- The page in a real browser at three widths, failing headlines over two lines, gradients, shadows, small labels above headings and empty stretches.
- Unlike the fixed looks:
- high-end-visual-design and minimalist-ui, opt-in skills from the same repo, each apply one style; this one picks a new direction per project and measures the result.
- Needs:
- Node 22+, and Chrome, Edge or Chromium; network access to search open image collections.
TL;DR
A page an agent builds by default looks like the average of every page it has seen; this skill replaces those defaults with decisions. The agent first lists eight to twelve things only this client has, such as its street, its numbers or its rituals, and plans the page as claims with proof, one per section. A script picks three art directions at random from its library; the agent chooses the one that suits the subject, and the script then supplies its type, palette, hero and section layouts. The page needs an idea from the subject that a competitor couldn't use, and one interactive element built from it. The agent writes the full copy, then builds with real pictures: the project's own, generated ones, or credited images from open collections such as Wikimedia Commons and the Met. A linter and a browser inspector enforce its style rules, such as no gradients, monospace text, numbered steps or pill-shaped labels. The agent then critiques the screenshots, fixes and checks again, adds motion and reports. Dashboards and other app screens get their own process and rules; redesigns are measured before and after.
Summarizes the skill at 6010f91. Its SKILL.md has changed by 9,818 words since.
npx skills add https://github.com/leonxlnx/taste-skill --skill design-taste-frontend skills.sh pageSource on GitHubAll skills from leonxlnx/taste-skill
- Total Downloads
- 750,784 on skills.sh, Nov 9, 2026
- Repo stars
- 112,118 leonxlnx/taste-skill
- First seen
- Feb 21, 2026 on skills.sh
Weekly values
| Week to | Installs |
|---|---|
| Sep 21 | 24,767 |
| Sep 28 | 28,341 |
| Oct 5 | 33,886 |
| Oct 12 | 32,748 |
| Oct 19 | 41,181 |
| Oct 26 | 42,584 |
| Nov 2 | 39,089 |
| Nov 9 | 34,196 |
| Category |
Taste for interfaces that don't look generated: direction, motion and accessibility. Everything for building software: planning, coding, debugging, design, frameworks, cloud, agents and skills. |
|---|---|
| Type |
A multi-step process the agent follows: interview, debug, run a TDD loop, review. |
| Effect |
Its own steps create or change files, git state or local tools. |
| Needs |
Drives a real Chromium or Chrome browser. |
| Publisher |
Everyone else. Unverified vendor claims default to community. |
| Topics |
SKILL.md
From leonxlnx/taste-skill at f6b7657. Checked daily, last changed Nov 8, 2026.
Frontmatter
name: design-taste-frontend
description: >-
tasteskill 2.5.1, the anti-slop frontend skill. Builds professional company websites at the level
of figma.com and x.ai: plain copy in a voice of its own, one system, one section per screen,
equal edges, real photographs and real product UI (licensed stand-in photographs when the client
has none; a product render only when the brief asks for 3D), a hero entrance and one or two dealt
moments on every page, shader effects and scenes only on tech, gaming and software pages, quiet
micro-interactions, and a checker and finish gate that enforce it in a real browser. Use this
whenever you build, design, redesign, restyle, polish or review a landing page, company,
product, shop, cafe, hotel, studio, SaaS, AI, developer-tool or game site, as static HTML/CSS or
inside an existing React, Next.js, Vue, Svelte, Astro or Tailwind project, or when the user says
a page looks generic, templated or "AI-made".
hooks:
Stop:
- hooks:
- type: command
command: 'for f in ${CLAUDE_SKILL_DIR:+"$CLAUDE_SKILL_DIR/scripts/gate.mjs"} ${CLAUDE_PLUGIN_ROOT:+"$CLAUDE_PLUGIN_ROOT/scripts/gate.mjs" "$CLAUDE_PLUGIN_ROOT/skills/taste-skill/scripts/gate.mjs"} ${CLAUDE_PROJECT_DIR:+"$CLAUDE_PROJECT_DIR/.claude/skills/design-taste-frontend/scripts/gate.mjs" "$CLAUDE_PROJECT_DIR/.agents/skills/design-taste-frontend/scripts/gate.mjs"} ${HOME:+"$HOME/.claude/skills/design-taste-frontend/scripts/gate.mjs" "$HOME/.agents/skills/design-taste-frontend/scripts/gate.mjs"}; do if [ -f "$f" ]; then exec node "$f" --hook claude; fi; done; if [ -d .taste-skill ]; then printf "%s gate.mjs not found; CLAUDE_PLUGIN_ROOT=%s CLAUDE_PROJECT_DIR=%s HOME=%s\n" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "${CLAUDE_PLUGIN_ROOT-}" "${CLAUDE_PROJECT_DIR-}" "${HOME-}" > .taste-skill/gate-hook-missing.txt 2>/dev/null; fi; for d in .taste-skill */.taste-skill; do if [ -f "$d/build.json" ]; then echo "tasteskill gate: gate.mjs not found (CLAUDE_PLUGIN_ROOT=${CLAUDE_PLUGIN_ROOT-}); the build in $d is not checked" >&2; break; fi; done; exit 0'
timeout: 600tasteskill 2.5
Build the website a good company would ship: it says plainly what is sold, shows the real thing on
every screen, and looks made for this client, not from a template and not like an art piece.
figma.com and x.ai are the bar (in words: layout-v4.md section 1).
<skill> is this folder. It needs Node 22+ and Chrome, Edge or Chromium (ffmpeg optional).
House rules
These nine win over everything else in this skill.
- No caption or description under any image, render or visual. Licence credits go in one footer line.
- Every visual renders, never an empty ground, at 1440, 1024, 768 and 390.
- One section per screen: the hero alone on the first screen, every section exactly one or
two screens tall at 1440x900, no second section heading peeking in. The one exception is a
live
photo-chapterssection, three or four screens, set by the moment. - Equal left and right content edges.
- Hover micro-animations: a linked card lifts 2px, a photo zooms 1.02-1.03 inside its frame,
buttons step on hover and press on click, underlines draw, card loops cycle in 2.5-4 s, repeat
and restart on hover. The motion layer does it; never strip or override it. No tilt, carousels
or timed tabs. Every hero enters once on load (
data-enter), and every page carries one dealt moment, two on a long page (the gate holds both). - More and better real photographs where they fit; nicer backgrounds; better heroes, layouts and fonts.
- Real full-colour icons (a known product's real icon, never a drawn one); small diagram visuals in cards (a hub with branches; one input, a main processor, three parallel lanes; pulses running along the lines).
- The big award-site scenes and creative moments are part of the skill: every page deals its moments (photo- and type-led off tech), but shader effects and scenes only where the trade has a technical subject (tech, AI, developer tools, gaming, fintech, hardware), never on a local cafe, bakery, guesthouse or shop: those get photographs.
- Addresses: street and district only (no street given: the district), no house number, postcode or coordinates; no register
or VAT numbers; no phone in a real format; contacts on
.example.
1. The kind of business decides everything
Write the kind on the plan's first line and declare it on the page: the page type on
<html data-type> and <meta name="page-type"> (the same value), and <meta name="site-kind">;
a place adds <meta name="page-kind" content="place">. The dealers take the last column
(start.mjs --page, moments.mjs --page), the hero dealer the page type; consistency.mjs reads
the metas.
| Brief | page type | site-kind | kind |
|---|---|---|---|
| App, SaaS, AI, developer tool, fintech or banking app, a studio selling its own software | software | software | software |
| A game, a studio launching its game | software | gaming | gaming |
| Hardware or a tech device (a drone, a robot arm, a keyboard) | product | tech | tech |
| Any other physical product or brand (a chair, a bike, coffee beans sold online) | product | other | product |
| People are hired: clinic, law firm, agency, creative studio, trade | service | other | service |
| People come to it: cafe, bar, bakery, restaurant, guesthouse, small hotel, shop, florist, bike shop, gym, local studio | place | other | place |
A maker that also opens its door or teaches (a ceramics studio, a bakery with a web shop) is a place; its web shop becomes the goods section. It is a product only when nothing happens at the door.
"Tech" below means site-kind software, gaming or tech; "other" is everything else. Effects,
scenes, loops, counts, CSS grounds, dark pages and dark heroes are tech only. An other page is
photographs, flat colour, type, real icons, the hero's entrance, its dealt moment (photo- or
type-led, moments.md) and the hover layer.
2. The page plan by kind
The full plans, deal lists and section order: references/sections.md.
- Place (a cafe, bakery, guesthouse, shop). Photographs lead: 12 to 20 on the full page, 8 to
12 compact, under 8 frames the 3-screen short page, whatever the trade; no client photographs:
the draft path and a live search (
photos.md), then count; the palette dealt by trade. The hero a photograph whenever a frame fits (a remote place: its region's landscape), the visit block on screen two, the offer, the place, orders or booking. Variety without effects (sections.mdsection 4): the offer and the place deal different compositions, never two sections round one picture; one type moment (the address or name set large); one main action a screen; list text 16px. Flat grounds, square photographs, one button style, the phone bar, the dealt moments; no effect, ground, loop, fragment, diagram or tab. - Product and service (site-kind other). Photographs lead: the product, the people, the rooms,
the work, two or more a screen on a product page. Real icons for the tools a studio uses; one
still diagram at most; flat grounds and one brand band. No shader effect, print, grain, gradient,
scene or loop (the dealt moments only); WebGL only for a product render the brief asks for. A
physical product with no photographs is shown in photographs: stand-ins of the same kind of
thing from
photos.mjs search, each listed in the report, on the full product page; a render (assets/objects/product-render, stills) only when the brief asks for 3D or a render; never a drawing, mood stock or a set of props (sections.md, Product). - Every product page (photographed, in stand-ins or rendered on a 3D ask, hardware too; the bar is Figure and 1X;
sections.md, Product): the product big where it stands whole (most of its frame, or on the ground at anchor scale), never mid-size in a grey rounded panel on a grey ground; a different picture each section, never one view twice; every headline promise pictured (a family bike shows the child bench); dealt compositions, no structure twice, one contrasting ground; the swatch changes the picture, every colour shown once; no fact twice; buttons step and press (rule 5). - Tech (software, gaming, hardware). The client's own subject leads at true size. Software: its
own UI as live HTML showing what it works on (a code-review tool: a red and green diff with its
Accept action) in one
app-frame, never a generic dashboard or only fragments on panels; cards: fragments on lit panels, pulsing diagrams, real icons. Hardware: its photographs, else stand-in photographs of its kind (a render only when the brief asks for 3D), never a split hero of only an order form or a drawn SVG. A game: its name in the h1, a launch line, its world as full-bleed key art (else its name set large over stand-in photographs of its setting), an effect never in its place (sections.md, Gaming). 60 to 80 words a screen outside UI mocks (copy.md). By deal: one effect (a shader ground in the hero or the one[data-visual]frame, a WebGL part, an object or one big scene) and one or two moments in their own sections; four live WebGL contexts at most; no card moves with the scroll (effects-usage.md). - One object never carries the page. The product or hero object whole leads the hero and two more sections at
most; another kind of visual the brief supports carries the rest (
sections.mdsection 1, its table): a game's world and crew; hardware's use at the bench, its parts close up; a still diagram card, a type moment, a context photograph where the trade allows. - The client's own assets get slots. A trailer, key art, screenshots, CAD renders or a motion
video the brief names each get a frame that reads finished now (a real
<video>with a stand-in poster, a play control only when there is a page or file to play, three to five stand-in photographs of the world, a CAD frame), named in a comment for the client's file, never empty (sections-library.md, client-slots).
3. What serves which page
Open the reference of every asset family the page uses first. A dash means never.
| Need | Asset | Software, gaming | Hardware | Product, service | Place | Reference |
|---|---|---|---|---|---|---|
| Heights, edges, heroes, type | system.css, assets/layout |
dealt hero | dealt hero | dealt hero | place hero | layout-v4.md |
| Sections and recipes | starter.html |
its plan | product plan | its plan | place plan | sections.md, sections-library.md |
| Tokens, grid, buttons, nav, footer, colour | system.css, system.js |
yes | yes | yes | place tokens | system.md |
| Forms, keyboard, head and share tags | starter.html, system.css, system.js |
yes | yes | yes | yes | system.md |
| Copy, contacts, credits | scripts/copy-lint.mjs |
yes | yes | yes | yes | copy.md, copy-voice.md |
| Hero entrance, hover, press, focus, nav, tabs | assets/motion |
yes | yes | yes | yes | motion.md |
| Card loops, a count | assets/motion, assets/ui |
yes | yes | - | - | motion.md, cards.md |
| Photographs | scripts/photos.mjs |
people, customers; a game's art, else stand-ins of its setting | lead | lead | lead, 12-20 | photos.md |
| Real tool, app and file icons | scripts/icons.mjs |
yes | yes | tools really used | - | icons.md |
| Feature cards, UI fragments | assets/ui |
lead (gaming: none) | its app | an app the client runs | - | cards.md |
| Diagram cards (hub, lanes, pulses) | assets/diagrams |
0-2, pulsing | 0-2, pulsing | 0-1, still | - | diagrams.md |
| CSS grounds | assets/backgrounds |
0-2 dealt | 0-2 dealt | flat tokens | flat tokens | backgrounds.md |
| Shader grounds | assets/effects |
the one effect | the one effect | - | - | effects-usage.md |
Creative parts (fx-*) |
assets/components |
yes | yes | fx-photo plain, fx-map still |
fx-map still |
effects-creative.md |
| Objects and prints | assets/objects |
one, as the effect; a render when the brief asks for 3D | its render when the brief asks for 3D | its render when the brief asks for 3D | - | effects-objects.md |
| Award-site moments | assets/moments |
1-2 | 1-2 | 1-2 (photo, type) | 1-2 (photo, type) | moments.md |
| Big scenes | assets/scenes |
0-1 | 0-1 | - | - | scenes.md |
| Speed and weight | scripts/perf.mjs |
yes | yes | yes | yes | perf.md |
Read copy.md, copy-voice.md, system.md, layout-v4.md and sections.md in full before the first page.
4. The run
-
The stack. An empty folder builds a static page: copy
<skill>/assetsintoassetsand start fromassets/starter.html. An existing project builds in its own stack, its components taking the starter's markup and classes, with the kit copied into its public folder (public/assets) and loaded from there as plain files. A brief that asks for Next.js builds a static export (output: 'export'), checked on its built page (--root out). -
Read the brief. Write down the kind (section 1), what is sold, who buys it, the one main action (the transaction: Book a room, Order a cake, Start a free trial; a place with neither: Get directions) and the real material: logo, screens, photographs, prices, address, hours. Then arm the finish gate, before any page exists:
node <skill>/scripts/gate.mjs --start index.html --kind <kind> --category "<what is sold>" --primary "<main action>"A framework build names its dev server's URL (
--start http://localhost:5173/) or its built page (--start dist/index.html --root dist; a Next.js export:out) in place ofindex.html, and rebuilds before every gate run. -
Write all the copy first, with the copy layer (
copy-voice.md: the fact sheet, the voice card on the plan, the page's shape, the device budget; a register fromcopy-registers.md, the moves ofcopy-moves.md) within the rules ofcopy.md: the h1 names the category and the buyer or the place (a game: its name and genre), one hard fact on the first screen, a noun in every heading, buttons as a verb and an object. Nothing is invented but a coined brand name (searched first, the result kept innames.jsonbeside the page) and, on a place, plausible hours and prices, each markeddata-assumed(copy.md, What may be assumed). A draft kept in a.mdfile lints the same way as the page (the voice card and part labels are skipped). -
Plan the page as screens. Line 1: the kind. Line 2: the deal (step 4), with one sentence on why the palette fits the trade. Then one line per section: its id, its one idea, its picture and its kind (object, use, parts, world, slot, diagram, type; three object lines at most), its screens (1 or 2, from its content height,
layout-v4.mdsection 2), which section holds a moment and why it moves (on tech also the effect or the scene). Pick the photographs now (photos.md); their count, stand-ins included, sets a place's length (section 2). Then readcards.mdand the recipe of every id you use insections-library.md. -
Deal, never choose by taste. Each command keeps a history, so pages differ:
node <skill>/assets/layout/deal.mjs --type <page type> --has <photo,ui,film,object,setting> --history .taste-skill/layout-history.json # the hero; a game adds --kind gaming, hardware --kind tech node <skill>/scripts/start.mjs deal --page <kind> --trade <trade> --history .taste-skill/history.json # three palettes made for the trade, three pairings: take the first; add --axis after a word or editorial hero node <skill>/scripts/start.mjs css --page <kind> --palette <id> --type <id> --radius soft --history .taste-skill/history.json node <skill>/scripts/start.mjs brand --page place --bg "#.." --ink "#.." --accent "#.." [--surface "#.."] [--muted "#.."] --type <id> --radius soft # the client's own colours (a logo, a painted shopfront), in place of css node <skill>/scripts/moments.mjs pick --page <kind> --count 1|2 --fits section,statement --photo --history .taste-skill/history.json # every kind node -e "for(const l of process.argv.slice(1)){const o=l.split('|');console.log(o[Math.floor(Math.random()*o.length)])}" <the kind's lists, below>Run every command from the project folder (the deal arms the gate in the folder it runs in, or joins the build already open one or two folders up). The lists, in order nav, footer, close, rhythm, buttons, mark (
sections.mdsections 2 and 3):- software:
"nav-mega|nav-cards|nav-centre" "footer-dark|footer-statement|footer-columns" "close-type|close-word" "dark-band|surface-pairs|space" "solid|pill|tonal|arrow" "wordmark|initial|arc|ring|stack|dots" - gaming:
"nav-mega|nav-centre|nav-cards" "footer-dark|footer-statement" "close-word|close-type" "dark-band|media-band|space" "solid|pill|block" "wordmark|initial|arc|ring|stack|dots" - product and hardware:
"nav-cards|nav-split|nav-mega" "footer-columns|footer-dark" "close-photo|close-type|close-word" "dark-band|brand-band" "arrow|solid|block|pill" "wordmark|initial|arc|ring|stack|dots" - service:
"nav-mega|nav-split|nav-centre" "footer-visit|footer-dark|footer-columns" "close-type|close-photo" "surface-pairs|dark-band|space" "solid|tonal|block|arrow" "wordmark|initial|arc|ring|stack|dots" - place: the whole line in
sections.mdsection 4, Place (The deal), read in its order.
A product or hardware with no photographs deals with
--has photofor its stand-ins;--has objectonly for a cut-out or a render the brief asks for (always theproducthero, its widest view across the wrap, no box); a game without art files passes--has setting(thephotohero, its name over a stand-in of its setting; a game always passes--has). A product page is dealt only the product, photo and film heroes. A place's hero is printed, never dealt (--type place). A dealt part that needs a photograph the page lacks is dealt again (sections.mdsection 2). Take the first palette and the first pairing printed (the next only when the first clashes with the client's own logo or photographs, or the pairing failshero-lines, said on plan line 2); the client's own colours go throughstart.mjs brandinstead (sections.mdsection 4, Look); never violet: deal again. Keep the:rootblock as printed. Radius:sharpfor fintech and developer tools,softby default,roundfor consumer apps, square on a place. On tech only: the lit ground (<html data-ground>:sand|sky|sagethrough the one-liner), the CSS grounds (backgrounds.md) and the one effect (effects-usage.md). Write every result on plan line 2 and in the comment at the top of<body>, and build exactly that (a short page drops what it has no section for:sections.mdsection 4). - software:
-
Build. In
starter.html: set<html lang data-type data-radius data-buttons data-motion>(lang: the brief's language), the three metas, the head block (title, description, og, icon, theme-color:system.md, Head) and the nav class; keep the skip link and them-enterhead line; copy only the<section class="hero …" data-enter>ofassets/layout/hero-<id>.html(never its nav, other sections, footer or credit line; every word and picture becomes the client's); move the dealt close and footer out of their<template>s and delete the rest. Every section ismain > sectionwith one.wrap, its h2 first,--h: 1or2. Build each to its recipe with the system's classes and tokens; write page CSS only where a reference says page CSS (inside a visual,--p-h,.wall,.rail,.device). Paste UI fromassets/ui/<name>/fragment.htmland rewrite every name, number and logo to the client's (kit icons becomedata-icon,cards.md); a diagram card isdata-diagram="<preset>"with the client's labels; runicons.mjs scan index.html --out assets/icons --colourlast, so every icon the page names is a local file. Mount an effect, object, moment or scene exactly as its reference says, never from your own script. A moment's section is copied fromassets/moments/_demo/in-page.html(place: photo-chapters, word-highlight) orin-page-service.html(pinned-chapters, picture-develops film); a moment's owndemo.htmlshows it alone and is not a page model. A form is the starter'sbooking-form(system.md, Forms). Credits: the one footer line fromphotos.mjs credits, once the markup uses the photographs (it reads the page). Copy the hero's tile fromshoot.mjsbeside the page asshare.jpg. -
Check and look. Only the skill's scripts, each running one headless Chrome with WebGL on the CPU, closed by its own PID, one at a time in the foreground with a 10-minute timeout; never in the background, a windowed browser or a browser tool. Each serves the page file itself over http on 127.0.0.1 (never
file://), so no server is needed; for a built page whose links start at the site root (/_astro/page.css), pass--rootwith the build folder (dist).--profile <dir>is the Chrome profile: a folder of its own in the OS temp folder or in the project's.taste-skillfolder (.taste-skill/chrome-check), never outside the project (no../); a relative one that leads out of it is replaced by.taste-skill/chrome-<script>. Then:node <skill>/scripts/copy-lint.mjs index.html --kind <kind> node <skill>/scripts/consistency.mjs index.html --widths 1440,1024,820,768,390 --rhythm-widths 1440,820,768,390 --profile <dir> --page <kind> --category "<what is sold>" --primary "<main action>" node <skill>/assets/layout/check.mjs --url index.html --profile <dir> --sizes 1440x900,1024x768,820x1180,768x1024,390x844 --shots shots/layout node <skill>/scripts/shoot.mjs --url index.html --w 1440 --out shots/1440.png --profile <dir> node <skill>/scripts/perf.mjs index.html --profile <dir>Shoot 1024, 820x1180, 768x1024 and 390 as well. Every
check.mjsfinding fails the page (no--no-stress). copy-lint opens no browser and takes under a second. Fix every FAIL (a copy-lint WARN too, or say why it stays) and read the copy aloud (copy-voice.mdsection 6); shoot again and read every screenshot against the checklist. In the fix rounds runconsistency.mjs --quick --widths 1440,390. Then the gate, which runs the checker at 1440 and 390 every time, walks the page at 320 for overflow, collide and tap-size, and runs copy-lint, whose FAILs block like the checker's:node <skill>/scripts/gate.mjs index.htmlFix what it lists and run it again until its last line is
GATE: PASSorGATE: OPEN, three rounds at most (in Claude Code it also runs when you finish; a stop before your first gate run is no round, and to ask the user something after a block, just stop again). When the user tells you to stop, or to ship the page as it is, rungate.mjs --done "<what they said>"(GATE: DONE) and report the open FAILs.GATE: SETUP(no page yet, a framework's source shell, a page that is not local): arm what a browser can open (step 1) and run it again.GATE: ERROR(the checks could not run) orGATE: OFF: put the line in the report and finish; do not rerun. Never edit the kit's files or hide anything from the checker. A FAIL you judge false is waived in.taste-skill/waivers.jsonwith its reason, never fixed by gaming the check (references/gate.md); a word from the client's own copy that copy-lint FAILs is waived hit by hit, the brief as the reason (a word inside the client's name, as the logo or the title writes it, is not counted: one WARN). -
Report: the
GATE:line first, then every waiver with its reason and every open FAIL; the kind, the deal (palette and why it fits, pairing, hero, grounds, effect, moments, scene); the voice card in one line and every copy-lint WARN kept, with why; the checker, layout and perf results; what you could not check; every assumed fact (the checker'sassumedlist) and the coined name's search; the form's.examplestand-in and the canonical domain still to come; the photographs and art the client must supply, every stand-in frame among them (library and live search); every client slot, its file and its stand-in.
5. Checklist
Each line names its checks: consistency.mjs ids in brackets, check.mjs findings in braces,
perf.mjs rows. The last line is for your eyes.
- First screen: says what is sold, for whom or where, with one hard fact [copy-headline, copy-fact]; the hero fills it alone at every width, its main button inside it [hero-screen, hero-fill, fold-action, fold-cut] {hero-fold}.
- One section per screen: every section 1 or 2 screens, its h2 first and top-aligned, no neighbour's heading or picture in its tile, nothing sparse, no section half empty [section-height, one-section, one-heading, section-air, one-screen, section-gaps, empty-area] {screen-short, screen-height, sparse, neighbour, neighbour-ground}.
- Equal edges: every block on the
.wraplines or the grid's columns, nothing out to one side, no sideways scroll [container-edges, row-lines, split-pair, off-grid, right-edge, col-edge, spill, off-viewport, stagger, top-stagger] {edge-left, edge-right, spill, bleed-one-side, one-sided, lines}. - Every visual draws at 1440, 1024, 768 and 390; a refused effect shows its still fallback [visual-empty, empty-visual, gl-fallback, shader-lint, no-visual, photo-weight].
- No caption explains, apologises for or labels a picture; credits in one footer line
[visual-caption, caption, credit-wall, photo-credit]; no placeholder, sample note or printed
.exampleaddress [placeholder, sample-label]. - The right things for the kind: outside tech no effect ground, print or scene, only the
dealt photo- or type-led moments (WebGL only for a product render the brief asked for)
[effect-kind, effects-fit, photo-print]; the subject itself
shows: the product big, whole in three sections at most, a new picture each [product-shown,
same-object, photo-repeat]; each asset the brief names in its slot; a game's name and its world as key art,
the diff of a code-review tool, software's
app-frame; real photographs where they fit, none twice [photo-set, photo-repeat, photo-upscale]; real icons in their own colours; flat grounds on other [grounds]; a place deals two different compositions and one type moment. - Motion: every button, link, linked card and linked photograph visibly answers the pointer, nothing tilts [motion-layer, hover, hover-move, tilt]; the hero enters once on load [hero-enter]; one or two dealt moments [moment-none]; card loops cycle in 2.5-4 s [loop-cycle]; nothing moves because the page scrolled except a dealt moment inside its own section (every kind) or the big scene (tech) [scroll-linked, scroll-reveal, pinned: expected only there]; anything moving past 5 s has a pause button [loop-pause]; under reduced motion everything rests and nothing stays hidden [reduced-motion, hidden-content]; at most four live contexts [webgl].
- Contacts as rule 9 [street-number, postcode, coordinates, company-number, phone-number]; Get directions only with a street, "See the area" with a district, no map link with a town only [map-link].
- Keyboard and head: every control named, alt on pictures, labels you can see, headings one level at a time, no tabindex above 0; Tab reaches the skip link first, its ring shows at once and never under the header; the menu button says its state; lang, title, description and share tags [a11y-name, img-alt, field-label, heading-order, tabindex, skip-link, focus-ring, focus-visible, focus-hidden, menu-toggle, lang, page-meta, share-meta].
- One system: one button pair, one card style, one radius scale, one link look [button-styles, button-shape, card-family, card-layout, link-styles]; two boxes deep at most [nesting]; one heading scale, its faces loaded [heading-scale, font-load]; text contrast [text-contrast, contrast].
- Copy and links: headings name things, buttons a verb and an object, at most two hero actions
[copy-headings, copy-buttons, copy-actions, action-count]; one action twice a screen at most
[action-repeat]; a heading's grey half is its own sentence [run-on]; one fact, one wording
[fact-agree]; assumed facts marked, never an open-now line from them [assumed, open-now]; every
link lands, forms send, a confirmation only after a real send, each error under its own field
[links, forms, form-send, form-fields]; no slop word, stock line, leftover or device used as a
tic, a voice of its own (copy-lint's ids: copy-residue, copy-slop-word, copy-stock-phrase,
copy-two-fragment, copy-virtue, ...;
copy-voice.md). - Fast: no FAIL row in
perf.mjs(image weight, contexts, layout shift). - 820, 768, 390 and 320: sections on their screens [section-height]; on a phone a section is at
least its screens and grows with what it holds, so nothing lies on anything else or under a fixed
bar [collide]; every link and control outside running text 44px tall [tap-size] (a FAIL when
another target is under 8px away); nothing past the screen at 320 [off-viewport], and nothing
lies on anything else there either [collide]; the first screen ending whole or on a clear bleed [fold-card]
(
layout-v4.md); splits stack text first, no row half empty; one column at 390, buttons full width, a full-screen menu; the place action bar. - Your eyes: beside the figma.com and x.ai frames it reads as a professional company site; nothing tilted, staggered, cut or overlapping; the hero is the work, not a mood.
6. Never
- A card, row or tile that fades in on scroll; a fade-in on every section; parallax on text; scroll-jacking; random blinking.
- Stock photographs passed off as the client's product, people or place (a stand-in is listed in the report as one, never shown with another maker's name or logo); a product page that never shows the product.
- A drawn look-alike of a real logo; invented reviews, quotes, customers or figures.
- Violet or lavender in the page's own design: accent, ground, gradient, effect colour or tint (a
real third-party logo keeps its own colours,
icons.md). - Copying a reference site's code, copy, pictures or signature effect.
- Deleting or editing the kit's own files (
assets/,scripts/) to clear a check: a check that flags a kit file is reported, and the page is checked again after any change.
References
All in references/; section 3 names the one each asset needs.