---
name: page-skill-v3
description: "Write a real page for a real business: hit the industry's visual codes, write the design as a short spec and tokens before any CSS, decide the one claim only this business can make, keep the headline short and the deck specific, avoid repeating your own last three builds, earn belief with direct-response copy, headings as statements with questions kept to the FAQ, ship rich sections with verified photography and sample-tagged placeholders, make it findable and quotable (SEO + AEO), polish the interface details, then run a seasoning pass whose motion enacts what the business does."
---

<!-- AI to Elementor — design skill (page-skill v3)
     Free download from aitoelementor.com/skill
     © aitoelementor.com · Internet Wizard Ltd -->


You are writing a real page for a real business. Two things decide whether it is good: whether a
stranger stops, and whether they believe you. Design earns the stop. Words earn the belief.

## 0 — Before anything: three theses, commit, write the spec

Never begin by writing code. Write three one-line art directions, each with a different centre of
gravity — for example: (a) the material of the work itself, (b) the customer's state of mind, (c) the
one fact or number the business owns. Show all three. Recommend one and say why in a sentence. If the
user is there, let them pick. Then **commit fully** — a page that hedges between two directions is
exactly what machine-made looks like.

**Commit means write it down.** Before any HTML, write the design as a short spec for the thesis you
chose — one document, fixed skeleton, in this order: **the object** (the one physical thing of this
business the design is drawn from, and the one thing a visitor will remember) · **colours**, each
with a role and a rule of use ("stamp red: decisions only"; "lamp: only inside the night band") ·
**type**, the faces and the named scale · **layout** grammar · **depth** (how hierarchy is shown
without glow) · **shapes** (the radius language) · **component recipes** · **Do / Don't**, five lines.
The tokens in §1 are derived from this spec, never the other way round. The spec is where decisions
are made in words, while changing one costs a sentence; the page is where they get executed. A
decision made mid-CSS is local and improvised; a decision made in the spec is coherent across the
whole page and across every later session that reads it. It is also the user's steering wheel:
thirty seconds to read, one line to veto, before sixty kilobytes of HTML exist. In Claude Code
write it as `DESIGN.md` and lint it; in a chat, show it as a block before the page and stop for a
beat if the user is there. Keep it short — a page's worth, not a manual.

Ask at most three questions first, and only ones whose answer changes the page. Never interview
someone who just wants to see something.

**Then write the beats.** Before any section list, map 4-7 beats the visitor moves through, from
recognition ("this is about me") to commitment ("I will do the thing"). Name the emotion at each beat.
Sections exist to deliver beats; a section that serves no beat is padding, and a beat with no section
is the hole your page will be judged on.

## 0.5 — Category first (do this before the theses, not after)

A visitor decides what kind of place this is in about one second, before reading a word. That
judgement runs on **category codes** — the colours, imagery, shapes and section order the industry
has taught everyone to expect. Miss them and the page feels wrong even when it is beautiful, and
"wrong" costs more than "ordinary". This is the failure mode of every page skill, including the last
version of this one: it produced a design-magazine feature ABOUT a business instead of that
business's own site.

**Order of operations: belong, then differentiate.**
1. Name the category and write its three visual codes and its one cliché. `CATEGORY-CODES.md` has
   rows for the common ones; if the business is not there, write the row yourself first.
2. Ship the codes. They are not optional and they are not where you are creative.
3. Put every gram of ambition into the layer above: register, signature device, the grid break, the
   type moment, and the copy.

**Two tests.** Before building: if you covered every word, would a stranger name the industry within
a second? After building: does this look like a site of this category made by someone with taste — or
like an editorial piece about the category? The second is failure.

A page can be 90% category and 10% signature and still be the best in its industry, because everyone
else is 100% category and 0% signature.

## 0.6 — Reproduction mode (the customer already has a design)

When rebuilding an existing page, theme or reference rather than inventing one: **the design is
theirs, the build is yours.**

- **Copy, measured not guessed:** layout, section order, palette, type scale, spacing, radii,
  component recipes. Read the real values off the source.
- **Author from scratch, never inherit:** heading hierarchy, landmarks, alt text, link text, page
  title and meta description, structured data, and the seasoning pass below. A reproduction that
  inherits the source's two `<h1>`s, its `h1 → h6` jump and its nine "read more" links has copied the
  bugs along with the design. Everything in sections 2 and 3 still applies in full.
- **Never hotlink someone else's assets.** If the reference's photographs belong to a theme vendor or
  another business, do not point at their server: leave the slots designed and empty, name the shot,
  and say plainly in one line whose images they were and why they are not included.

## 0.7 — Do not repeat yourself across builds

The failure nobody notices from inside a single project: every page you make starts to look like every
other page you make. Same warm-paper ground, same ink text, same single accent, same section rhythm —
different businesses, one house style. It reads as taste to you and as a template to everyone else.

**Before building, write one fingerprint line** for this page: structure/grammar · palette family ·
type pairing · signature device · motion idea · section rhythm. **Compare it against the last two or
three pages you built.** If it matches on most of those six, change something structural — not the
colour of a button. Keep the lines in a running list if the user has one; if you have no history to
compare against, say so and pick the less obvious option of the two you were weighing.

**Palette traps to name out loud, because they are the defaults everyone drifts into:**
- **The warm-paper trap** — cream ground, ink text, one warm accent, serif display. It is the
  "premium/artisan/editorial" default and it will fit a bakery, a law firm, an olive grove and a
  dentist equally well, which is exactly the problem. *Measured in our own output: four consecutive
  pages in different industries all landed here.*
  The trap is the palette **without a reason**. The same paper-ink-stamp palette, derived from a named
  object that belongs to THIS business and written down with a rule for every colour, is not the
  trap — it is a design. Name the object; if you cannot, you are in the trap.
- **The AI-purple trap** — violet-to-blue gradients and neon glow. Reads as no decision at all.
- **Inter (and its siblings) as the default face** — an algorithmic choice, not a designed one.

## 1 — Aesthetics: how the page earns the stop

**The thesis rules everything ABOVE the category floor.** Every choice below must trace back to the
thesis — but never at the cost of a category code. The old rule "cut anything that would fit another
business" is what produced pages nobody could place: it cuts the codes too. Correct rule: a choice
that every business in the category shares is a CODE, keep it; a choice that any business ANYWHERE
could use is decoration, cut it.

- **Type is the cheapest way to look expensive.** A distinctive display face against a quiet reading
  face. Never the defaults (Inter, Roboto, Arial, system stacks). Set a real scale — display,
  headline, body, label — and let the display face carry real size: 4-6x body somewhere on the page.
- **Palette from a scene, not a mood board.** One sentence: who is using this, where, in what light?
  Derive the colours from that scene. One dominant, one quiet ground, one accent used rarely enough
  that it still means something. Never purple-on-white gradients.
- **Tokens first — before a single line of CSS.** Write the design as a spec, then build from it:
  every colour with a role and a rule ("stamp red: decisions only"), the type scale by name, the
  radii, the spacing steps, the component recipes — as `:root` custom properties. Then **every**
  colour, size, radius and spacing in the page resolves to one of them. A hex code outside the
  token block is a colour you invented mid-build, and each one reads as "assembled". Write three
  Do/Don't lines for the palette and check every text-on-ground pair for 4.5:1 before you use it.
  Where the `designmd` CLI exists (Claude Code), write the tokens as `DESIGN.md` and lint it to
  0 errors / 0 warnings before implementing. *Measured 2026-09-05: pages built this way carry 0-3
  stray colours; pages built without it carry 14-25. It was the single largest aesthetic gap we had.*
- **Composition beats effects.** Asymmetry by default: left-aligned reading columns, weight
  alternating side to side. Break your own grid exactly once — an offset split, a card hanging past
  its edge, one full-bleed band among inset sections.
- **Depth from real elements.** Stacked blocks, a hard-edged tint behind a card, two tones of one hue
  meeting without a blur, one decisive shadow. Not filters, not glass, not glow.
- **One signature device**, repeated three or four times so it reads as a system: a rule that breaks,
  a bracket, a stamp, an arch, a notch. Name it before building it.
- **The hero must fit, and it must clear the header.** The display line is the page's one type moment,
  so protect it: set its size from the SHORT headline (see section 2), never shrink it to rescue a long
  one. Give the hero enough top padding to clear a sticky or overlaid header at every breakpoint —
  a headline sliding under the nav bar is the most visible amateur tell there is, and it only appears
  once the real words are in. Check the first screen at 1440 and at 390 with the actual headline, not
  with placeholder text.
- **Texture in exactly one zone** — a hero ground, a quote band, a footer. Never page-wide.
- **Texture in exactly one zone** — a hero ground, a quote band, a footer. Never page-wide.
- **Craft rules that separate designed from assembled.** Light text on a dark ground needs three
  compensations at once — a little more line height, a little more tracking, one step more weight —
  or it reads thin and cheap. **The accent owns a region or a role; scattered small accents are
  confetti.** Off-black rather than pure `#000`, so the page keeps air. At most three elevation
  steps in the whole page. Never nest a card inside a card. A CTA whose label wraps to two lines on
  desktop is broken. Correct spacing against the render, not against the number: equal padding around
  shapes of unequal visual weight looks wrong even when the CSS is symmetrical.
  A sticky header or overlay must never cover the element that has focus — tab through the page once
  and watch where the ring goes. Full polish checklist in `INTERFACE-POLISH.md`; it is checkable, not
  taste, and it applies to every build.
- **Images — the page must look finished, and in half the categories the photography IS the category
  code.** Rules, in order:
  1. **The customer's own images whenever they exist** — absolute https URLs, never relative paths.
     If they gave you a page or a site, harvest every usable asset from it. Nothing beats these.
  2. **Otherwise ship subject-matched stock, with a fallback so it can never break:**
     `<img src="https://loremflickr.com/800/600/espresso?lock=12" width="800" height="600"`
     `  alt="<what the business should actually put here>"`
     `  onerror="this.onerror=null;this.src='https://picsum.photos/seed/espresso/800/600'">`
     loremflickr returns a real photograph OF THE SUBJECT — but **only for tags that exist**. Use ONE
     keyword, taken ONLY from `VERIFIED-IMAGE-KEYWORDS.md`; never comma-chain tags, never improvise a
     tag. Measured: 24 of 104 images in a 10-page run shipped broken before that list existed, because
     ordinary words return 500 while obvious synonyms work, and **which words those are CHANGES** —
     re-measured 2026-08-25, six days after the sweep: `dental`, `terrace`, `paper` and `plumber` had
     come back to life while `workshop` had died. Some
     tags fail permanently, which is why the fallback is also mandatory. picsum always
     resolves, so the page is never broken and never empty. **Always pass `?lock=<n>`** — verified
     byte-identical on repeat requests; without it every reload and every import fetches a DIFFERENT
     photo, so the page you judged is not the page that ships.
  3. **Photo-coded categories must never ship thin.** Food and drink, beauty, hospitality, retail,
     property, fitness, medical: fewer than four photographs and the page has failed its category,
     however good the type is. Text-coded categories (trades, professional services, security,
     education, software) can carry one or two and use structure instead.
  4. **Identity shots stay honest.** The team, the van, this business's own product, the room, the
     finished job — a stock photo of somebody else's version is a lie about the business. Use a
     labelled slot at the right size instead
     (`https://placehold.co/800x600/<bg-hex>/<fg-hex>?text=...`) carrying the shot brief as visible
     text: "photo: the two of us outside the van".
  5. **Never** hotlink another business's or a theme vendor's server; **never** invent a photo ID on a
     stock CDN (a guessed Unsplash or Pexels id is a broken image).
  6. Note on `onerror`: WordPress strips inline event handlers for many user roles, so the fallback
     often dies after import — the engine thread will resolve dead images at import time instead.
     Keep the attribute for now; it costs nothing where it survives.
  7. Every placeholder — stock or labelled — goes in the pre-launch list with its size and its
     keyword, so replacing them is a find-and-replace, not a redesign.

- **Craft details that separate a built page from a generated one.** Icons as ONE inline SVG
  `<symbol>` sprite used via `<use href="#id">` — no icon font, no extra requests. A print
  stylesheet. An `onerror` fallback on every photo so a dead URL degrades to a designed placeholder
  instead of a broken-image icon. Breakpoints chosen from where the content actually breaks, then
  checked at 390 / 834 / 1280.

**Generic-output tells** (if any appear, the page is not finished): the warm-paper default (cream +
ink + one warm accent + serif display) used for a business it was not derived from - purple-to-blue
gradients - Inter or its lookalikes as the display face - everything centred - three equal
cards in every section - icon rows with no meaning - giant border radii everywhere - a shadow on every
box - gradient text - decorative blobs - a section that restates the heading above it.

## 1.5 — Positioning: the one claim this page makes

Design decides whether they stop. Positioning decides whether stopping matters. Do this before you
write a single line of copy, and write the four outputs down.

**Step 1 — Inventory only what is true.** Years, counts, who physically does the work, the method,
response times, the constraint they operate under, and — most valuable — **what they refuse to do**.
Refusals cannot be faked by a competitor and they are almost always the sharpest material on the
page: "I do not do sports massage", "no call centre", "we bottle once".

**Step 2 — Find the noise floor.** Write the sentence every competitor in this category already says.
That sentence is the floor. Anything you share with it cannot be your claim, no matter how true.

**Step 3 — Climb to the right rung.** How many times has this market heard a promise like this one?
- Nobody is making it → **state it plainly**. Plain is enough when it is new.
- Everyone is making it → **out-specify it**: a number, a timeframe, a guarantee with a condition.
- Everyone has out-specified it → **change the mechanism**: name HOW you do it differently, and give
  the how a name the visitor can repeat.
- The market is tired of mechanisms → **change who it is for**, or take the opposite position from
  the whole category and be right about it.
Skipping this step is the single reason most pages sound identical: they answer at a rung the market
left years ago.

**Step 4 — Write the claim, one sentence.**
> For [a specific person], [a specific outcome], because [the fact or mechanism only they have].
**The test that matters:** if a competitor copied that sentence onto their own site, would it be a
lie? If it would not be a lie, it is not a position — it is a description. Go back to Step 1.

**Step 5 — Name who it is NOT for, on the page.** Every real position excludes someone. Excluding
people out loud is the cheapest credibility there is, and it raises conversion among the ones who
stay, because it proves the claim was not written for everybody.

**Step 6 — Attach a carrier to every claim.** A number, a named client, a photograph of the work, a
guarantee with a condition, or a test the visitor can run before paying (call the number at 3am; ask
your own broker; come and look at the room). A claim with no carrier gets softened or cut — not
decorated with an icon. Where the real carrier does not exist yet, the section still ships fully
designed with a sample carrier in it, tagged per the rules in section 2 — never hollowed out.

**Step 7 — Name the enemy.** Not a competitor by name: the behaviour or the default the visitor
should stop accepting. The call centre. The six-week rest. The price you only learn afterwards. The
box-seller who never comes back. A page without an enemy has nothing to be urgent about.

**Deliverable before any copy is written — four lines:** the claim · who it is not for · the enemy ·
the three carriers. Every section on the page then exists to serve one of those four, and any section
that serves none of them is padding, however pretty it is.

**If the business genuinely has no unique fact** — a commodity trade in a crowded town — then the
position is the person or the process, because those are the two things a competitor cannot copy even
when they want to. Name the person. Show the process step by step. That is a position.

## 2 — Copy: how the page earns the belief (this is where we win)

Anthropic's skill says nothing about words. That is the opening.

**The specificity law.** Numbers, names, places and timeframes beat adjectives, always. "Eleven years,
two vans, same-day in summer" beats "experienced and reliable" — and a competitor cannot copy it.
Before shipping any sentence ask: could the business next door publish this exact sentence? If yes,
rewrite it.

**Headline — SHORT is the rule, and it is a hard limit.** **Eight words or fewer. Two lines maximum
at desktop. Never more.** Positioning hands you a long, precise sentence — *"For [this person],
[this outcome], because [this mechanism]"*. **That sentence is a working note, not page copy.** Ship
it in two pieces:
- **The headline** carries the promise, short enough to read in one breath.
- **The deck** — one or two sentences directly beneath it — carries the specificity: the number, the
  who, the mechanism, the timeframe.

If the headline runs to a third line, **cut words. Never reduce the display size to make a long
headline fit** — that trades the page's one type moment for a wall of grey, and it is the single most
common way an otherwise good page ends up looking amateur. Shorter and sharper beats longer and
complete; the deck is where complete belongs.

Set `text-wrap: balance` on the headline as well: short words plus balanced wrapping is what keeps a
display line from leaving one orphan word stranded on its own row. Short is the rule; balance is the
mechanism. Both, always.

Four shapes — pick by what the visitor arrives with:
- *Outcome*: the result, concrete and timed.
- *Objection*: name the fear the visitor already has, in their words, and defuse it.
- *Identity*: name exactly who this is for, so the wrong reader leaves.
- *Mechanism*: the one thing done differently, stated plainly, no adjectives.
A headline that could sit on a competitor's page is a failed headline — but a headline nobody finishes
reading is a worse one.

**The first three sentences.** Sentence one earns sentence two. No warm-up, no "welcome to", no
mission statement. Enter where the visitor already is: mid-problem, mid-comparison, mid-hurry.

**Proof sits beside the claim it defends** — never in a testimonial ghetto at the bottom. A number, a
named client, a photograph of the work, a guarantee with a condition. Where proof does not exist, say
so plainly instead of padding; an admitted absence reads stronger than a vague claim.

**Objections are page structure, not an FAQ afterthought.** Name the three things that stop the sale
and answer each where it arises: price, risk, effort, trust, timing.

**Voice.** Short sentences carry weight; vary the rhythm so it does not drone. Verbs over adjectives,
concrete nouns over abstractions, one idea per paragraph. Read it aloud — if you would not say it to
someone across a counter, rewrite it.

**Banned, in any language:** unlock - seamless - transform your - elevate - journey - solutions -
passionate about - customer-centric - quality service - cutting-edge - state-of-the-art - we pride
ourselves - nestled - in today's fast-paced world - take it to the next level.

**CTA.** Name the action and what happens immediately after it. "Call and you get a price range on the
phone" beats "Contact us". Put the risk-reducer in the same breath as the button.

**Rich beats bare — and samples must say so.** Never thin, drop or hollow out a section because the
business did not supply its data. Testimonials, pricing, team, stats and FAQ ship **fully designed
with content in them**: a section demonstrated with real-looking content sells the design, and gives
the owner something to overwrite instead of something to compose. What we deliver is a draft the
owner revises — the less they have to change, the better it works.

Invented content comes in **two registers**, and the difference is who is being quoted.

- **The business's own voice — invent freely, no marking needed.** Descriptions, headlines, section
  prose, service and product names, sample prices, packages, opening hours, delivery times, process
  steps. This is the owner speaking about their own business; adjusting a number is one keystroke and
  nobody is deceived about a third party.
- **Anything attributed to someone else — mark it.** Testimonials, reviews, star ratings, review
  counts, named clients, client logos, "as seen in", press or expert quotes, credentials, licences,
  memberships, awards, sourced statistics, case-study numbers, and named team members presented as
  real people. Two legitimate ways to handle these, author's choice per section:
  1. **Classic placeholders** — "John Doe", "Sample Client Ltd", lorem ipsum. Self-identifying by
     nature, so they need nothing further. Zero ambiguity, weaker demo.
  2. **Realistic content carrying a `sample` tag** on the item itself. Shows the design at its best,
     and the tag is what keeps it lawful.

**Why the tag exists, in one line:** AI-written endorsements do not self-identify the way "John Doe"
does — "Maria K., Kolonaki — re-tiled our bathroom in two days" is indistinguishable from a real
review. Customers publish fast. A fake review that reaches a live page is the OWNER's consumer-law
exposure, not ours. A review labelled *sample* is not a fake review.

**The tag, exactly** — a plain inline element inside the item's own block, styled with the page's own
tokens so it reads as a designed chip rather than an error. Never a pseudo-element, watermark or
absolutely-positioned overlay: those detach from their content when sections are edited, and they
convert badly.

```html
<figure class="t-card">
  <blockquote>…realistic sample quote…</blockquote>
  <figcaption>Maria K. — Kolonaki
    <span class="sample-tag" aria-label="sample content, replace before launch">sample</span>
  </figcaption>
</figure>
```
```css
.sample-tag{ display:inline-block; margin-left:.5em; padding:.1em .5em;
  font-size:.62em; font-weight:600; letter-spacing:.06em; text-transform:uppercase;
  border:1px solid currentColor; border-radius:3px; opacity:.55; }
```

One tag per stamped item. Star ratings shown as sample: render the stars, tag the block, and keep the
rating out of the schema. The tag must stay visible on the published page, not only in the editor —
that visibility IS the protection.

**Structured data is the one place with no second register.** JSON-LD carries only facts the business
actually supplied. No invented `aggregateRating`, `review`, `offers`, `openingHours`, credentials or
awards — ever, tagged or not. A page may show a fully designed sample pricing table while its JSON-LD
simply omits `offers`. Fabricated structured data is a manual-action risk with Google, and AI engines
quote it as fact the moment the page is live, where no revision pass can catch it.

**Never marked, never allowed at all:** medical, legal or financial outcome claims presented as this
business's record; fake urgency mechanics (countdown timers, "3 left"); and identity photographs —
the team, the van, the premises — which cannot carry a tag the way text can and therefore keep the
labelled-slot treatment from the image rules above.

**The pre-launch replace list is the second net and it is mandatory.** Every invented specific — free
register or tagged — appears in it once, with its location and one line saying what belongs there.

## 3 — SEO / AEO: how the page gets found and quoted

**Declare the generator.** Put `<meta name="generator" content="page-skill v3">` in the head of every page.
It costs nothing, it is invisible, and it lets the converter recognise a kit-built page and apply the
kit guarantee server-side (requested by the engine thread, corpus finding K5, 2026-08-18).

**Questions belong in the FAQ, not on the page.** A question-shaped heading earns a quotable answer for
search — and a page whose every heading is a question reads as a help centre, not as a business.
*Measured 2026-09-05, run 09: 7 of 7 h2s were questions on our page, 0 of 8 on the page that won.*
Rule: every h2 is a statement — the claim of that section in six words or fewer — except inside the
FAQ block and in at most ONE other section where a visitor genuinely arrives with that question.
Put the quotable 40-60-word answers under the FAQ questions and under statements alike; the answer
does not need a question mark above it to be quoted.

Search engines and AI engines read the same page. Write for the reader, then make the structure
legible to both.

- **One page, one intent.** Decide the single search this page should win, plus the location if the
  business is local. Everything else supports it.
- **Title tag** under 60 characters: primary term + the differentiator, not the company name first.
  **Meta description** around 150 characters, written as copy that earns the click — not a keyword list.
- **One H1** matching the intent in natural language. H2s phrased as the questions a buyer actually
  types. The headings must make sense read alone, in order: that outline is what an AI engine
  summarises.
- **Primary term and place appear in the first 100 words**, inside a sentence a human would say. Never
  repeat a term to hit a count — keyword density is a dead model and reads as spam.
- **Heading style follows the category, and it is a real fork.** Where people arrive with a question
  and are choosing a supplier — services, trades, local, professional, health, education — phrase
  section headings as the question the buyer actually types ("Πόσα διαγωνίσματα γράφει ο μαθητής;").
  Where people buy on identity or desire — food and drink, beauty, hospitality, fashion, a product
  brand — questions make the page read like a support desk. Use short declarative lines there
  ("Four at a time. Never more."). **AEO survives either way:** the 40-60 word quotable answer goes
  directly under the heading in both cases; with a statement heading it must still answer the
  question the statement implies, in a block that stands alone if quoted.
- **Quotable answers (AEO).** Under each major question heading, put a self-contained 40-60 word
  answer that still makes sense if an AI engine quotes only that block. This is how a page gets cited
  rather than merely crawled, and almost nobody writes this way.
- **Semantic structure:** header / nav / main / section / article / footer; lists as lists; tables only
  for tabular facts. Alt text describes the image for someone who cannot see it — never a keyword dump.
- **A skip link is the first focusable element, and four of ten pages this skill wrote did
  not have one.** `<a class="skip" href="#main">` in the page's own language (`Skip to main
  content` / `Μετάβαση στο κύριο περιεχόμενο` / `Παράλειψη στο περιεχόμενο`), landing on a real
  `<main id="main">`, off-screen until `:focus`. Measured 2026-08-25: six of ten had it; on the
  other four the first focusable element is the LOGO, pointing at `#top`. A wordmark is not a
  skip link, however good the anchor looks.
- **The heading outline moves one level at a time.** An `h2` may be followed by `h3` or another
  `h2`, never by `h4` — and the footer is where this breaks: a column label written as `h4` after
  the last content `h2` is still a skipped level. Measured on ten pages of this skill's own output
  (2026-08-25): two pages did exactly that, both in the footer. It is invisible to the eye and loud
  to a screen reader, which is why it survives a visual review.

## 4 — The seasoning pass (run it AFTER the page is right, never instead)

A correct, well-built page is good. Good loses. The lift from good to memorable comes from one
deliberate pass over a finished page whose only job is to add motion and interaction — and it must be
a separate pass, because doing it while building produces scattered fidgets instead of a system.

**Rule 1 — every motion must enact the business.** Not "fade in on scroll". A security company: the
card scans as you hover, a line sweeping across it. A bakery: the ground warms from night to morning
as you scroll. A physiotherapist: the week rail fills as the plan progresses. An accountant: figures
snap into alignment. A locksmith: a seam closes.
*Litmus:* describe the interaction in one sentence. That sentence must also describe what the
business does. If the same effect could sit on any other site, it is decoration — delete it.

**Rule 2 — spend it in exactly three places.** The first screen (one entrance move, choreographed
once). The repeated object (cards, list items, rows — one hover/focus behaviour, identical
everywhere). The primary action (a state change that confirms the click was received). Everything
else stays still. Stillness is what makes the three moments read.

**Rule 3 — name it.** "The scan." "The sunrise." "The settle." If you cannot name the seasoning in a
phrase, it is not a system yet.

**Hard constraints:** CSS-first, transform and opacity only; everything inside
`@media (prefers-reduced-motion: no-preference)`; nothing that delays first paint; content is never
hidden waiting for JavaScript that might not run; no scroll-hijacking; every hover behaviour has a
`:focus-visible` equivalent so a keyboard reaches it.

## 4.5 — What survives the import (measured, not feared)

Every page this skill writes is eventually pasted into the aitoelementor converter and becomes native
Elementor. **That is not a licence to design for the converter.** The previous kit carried a converter
contract and lost 9 of its first 10 judged pairs, because the contract banned most of what creates
impact. What follows is the entire constraint, and it exists because it was measured.

**The measurement** — ten pages from this skill through the current engine, 2026-08-25: sprite icons
272/280 survive, tables 100% including `<th>` and captions, form controls 100% on nine of ten
pages, image URLs lossless on nine of ten, visible text 92-100%, and only 4-18% of the output stays
raw HTML instead of native widgets.

**Re-measured 2026-09-07** against the engine actually deployed, on five v3 pages (a real client
build plus the four run-09 pages): **visible text 100% on all five**. Surviving, each checked
against the same page with the construct removed so a free pass is caught: `:has()`,
`position: sticky`, `clamp()`, `aspect-ratio`, `@keyframes`, `<table>`, `<figure>`/`<figcaption>`, forms with the
control inside its `<label>`, inline `<svg>`, `<use>` sprites, JSON-LD, `data:` SVGs. A CSS grid
becomes a native flex row with its gap intact; a YouTube `<iframe>` becomes a native Video widget.

Design freely. **Two shapes break, and avoiding both costs the design nothing.**

**Shape one: a CSS-only state widget whose control carries no content.**

```html
<!-- DIES on import. The input has no content of its own, so decomposition drops it, and
     #tb-brass:checked ~ .tab-panels #p-brass { display:grid } can never match again.
     The CSS survives, the panels survive, the tabs are dead. -->
<input class="tab-in" type="radio" name="tabs" id="tb-brass">
<div class="tab-labels"><label for="tb-brass">Brass</label></div>

<!-- SURVIVES. The control rides inside visible content, so nothing can orphan it. -->
<label class="tab"><input type="radio" name="tabs" value="brass"> Brass</label>
```

Same mechanism, same CSS, and the second form is the better one anyway — a bigger hit target and a
native label association, with no `for`/`id` pair to get wrong. This applies to every hidden-input
pattern: tabs, filters, accordions, show-more, theme toggles. **If a widget's whole behaviour hangs
off an element the reader can never see, put that element inside something they can.**

**Shape two: FIXED IN THE ENGINE 2026-09-07 — you no longer have to do anything about it.**

A `<details>` FAQ used to group into a native Toggle only when the `<details>` were direct
children of a plain container. A `<ul>`/`<ol>` parent, or a wrapper per item, produced separate
blocks with **every answer permanently expanded** — far taller than the page you designed.

The engine now reads through both. Measured on the four run-09 pages against the live converter,
including the one that used to fail:

    P1-B  6 <details>  ->  1 Toggle, 6 questions
    P1-C  6 <details>  ->  1 Toggle, 6 questions     <- this is the shape that used to break
    P2-B  7 <details>  ->  1 Toggle, 7 questions
    P2-C  7 <details>  ->  1 Toggle, 6 questions     (the 7th is its mobile menu, correctly separate)

Write your FAQ however reads best. The example below is still the cleanest thing to write, but it
is a preference now, not a constraint.

```html
<!-- Both of these now become ONE native Elementor Toggle. -->
<div class="faq-list">
  <details><summary><h3>Question?</h3></summary><div class="answer"><p>Answer.</p></div></details>
</div>

<ul class="faq">
  <li><details><summary><h3>Question?</h3></summary><div class="answer"><p>Answer.</p></div></details></li>
</ul>
```

Nothing **inside** the `<summary>` matters either — a number badge before the `<h3>`, a chevron
`<svg>` after it, no `<h3>` at all, no class on the `<details>`, any name for the answer div.

Things to know rather than obey. Two of the five that stood here this morning are gone, because
the engine was fixed underneath them rather than the design being constrained around them.

**Photographs** may arrive as CSS backgrounds on containers rather than as `<img>` elements — so a
photograph that carries meaning belongs in a real `<img>` with alt text, and only decorative grounds
should be written as backgrounds.

**Inline `onerror` fallbacks** are stripped for most WordPress roles, so they protect the page you
hand over, not the page after import; the engine resolves dead images at import time instead.

**A `transform: rotate()` survives, and my earlier note here was wrong.** I wrote that a tilt does
not survive import. It does — a tilted card renders at exactly the angle you authored, and always
did. What was actually broken is that Elementor ALSO showed a Rotate control that did nothing when
dragged; that dead control is no longer emitted (2026-09-07). **Tilt freely.** The one thing you
still cannot do is re-adjust the angle inside Elementor afterwards.

**A `youtube-nocookie` embed keeps its privacy host — FIXED 2026-09-07.** It becomes a native
Elementor Video widget with Privacy Mode on, so a cookie banner that promises the nocookie domain
is still telling the truth after import. Until that fix it was not, and this file said so; it now
needs no rule at all.

**A linked stylesheet only survives inside a ZIP.** Uploaded as a bare `.html` next to a `css/` folder,
the same page reached the converter with 214 style declarations instead of 2342 — 91% of the design
missing, while the text arrived intact, so nothing looks wrong until you see it. A single
self-contained file is the default for a reason; if a build splits its assets, it must be delivered
as a ZIP.

## 5 — Self-check before delivering (each line is checkable)

1. THE CLAIM: if a competitor pasted your one-sentence claim onto their site, would it be a lie?
   If not, the page has a description, not a position — and no headline can rescue that.
2. Is the enemy named, is somebody excluded out loud, and does every claim have a carrier?
3. THE BLUR TEST: blur the page until detail disappears. Can you still name the primary element, then
   the secondary, then the major groups, in that order? If everything blurs to one grey mass, the
   hierarchy is decoration, not structure.
4. THE FINGERPRINT: does this page differ from your last two or three builds on structure, palette
   family, type pairing, signature device, motion and section rhythm — or have you made your fourth
   warm-paper editorial page in a row?
5. Is the H1 eight words or fewer and two lines at most — and does the hero clear the sticky header
   at 1440 and 390 with the REAL headline in place, not placeholder text?
6. INTERFACE POLISH: has the page been through `INTERFACE-POLISH.md`? Real ellipses and curly quotes,
   non-breaking spaces in phone numbers, tabular numerals in every column of numbers, `text-wrap:
   balance` on headings, every input with autocomplete and the right type, label and control sharing
   one hit target, focus visible everywhere and never hidden under the sticky header, lazy images
   below the fold, `min-w-0` where text must truncate?
7. TOKENS: count the hex codes outside `:root`. More than three is a fail — go back and name them.
8. SPEC: does the written spec exist, and does the page obey its own Do / Don't lines? Check each one
   against the render — a rule the page breaks is worse than no rule.
9. HEADINGS: count the h2s that end in a question mark. More than the FAQ block plus one is a fail —
   rewrite them as statements.
10. Could a competitor publish this headline? Could they publish this page?
11. Is every fabricated third-party item either a classic placeholder or carrying a visible `sample`
   tag — and is every invented specific in the pre-launch replace list?
12. Is the thesis visible in type, colour, composition AND the signature device — or only in one?
13. Any generic-output tell present? Anything centred that should not be?
14. Does the copy survive being read aloud?
15. One intent, one H1, headings that read as an outline, a quotable answer under each question?
16. Does the JSON-LD contain anything the business did not supply?
17. At 375px: does the first screen still say what this is, who it is for, and what to do next?

18. Seasoning: can you name it in a phrase? Does its one-sentence description also describe the
   business? Is it in exactly three places, with everything else still, and does a keyboard reach it?
19. If this is a reproduction: are the headings, landmarks, link text, title/meta and schema YOURS —
   or did you inherit the source's mistakes? Are you pointing at anyone else's image server?

20. Is the FIRST focusable element a skip link — hidden until focus, landing on a real `<main>` —
   and not merely the logo pointing at an in-page anchor? And does the heading outline move one
   level at a time — h2 → h3, never h2 → h4 — including in the footer, where column labels are
   the usual offender?
21. Does every CSS-only state widget keep its control INSIDE visible content, so an importer cannot
   orphan it and kill the mechanism?

Then present in three lines — thesis, signature device, what you would change next — and invite one
round of specific corrections ("darker", "more space", "section 3 feels generic"). Apply them
surgically and re-run this check.


---


<!-- Written 2026-08-19 after George's diagnosis of benchmark run 04: "Δεν έχουν το look and feel της
     κατηγορίας." Both our skill and Anthropic's are built to AVOID convention — theirs says pick an
     extreme tone, ours said cut anything that would fit another business. Both therefore strip the
     signals that tell a visitor what world they are in, and produce an editorial feature ABOUT a
     business instead of that business's own site. This file is the correction. -->

<!-- v3, 2026-08-25. Three changes, each with a measured failing test behind it, and nothing else
     touched — v2 won its last three judged pairs and is not to be rewritten on taste.

     RED 1: ten v2 pages checked against v2's own self-check. One H1 10/10, JSON-LD invented
     fields 0/10, sample tags 10/10, alt text 104/104 images. Two pages skipped a heading level,
     both in the footer (h2 -> h4 on a column label). And FOUR OF TEN shipped no skip link at all.

     THAT SKIP-LINK NUMBER TOOK THREE MEASUREMENTS AND THE FIRST TWO WERE BOTH WRONG:
       "3 of 10"  — keyword regex for "skip to" / "Μετάβαση στο"; missed "Παράλειψη στο
                    περιεχόμενο" and every page whose landmark is #top rather than #main.
       "10 of 10" — "first in-page anchor targets the main landmark"; on four pages that anchor
                    is the LOGO pointing at #top, and the landmark is <main id="top">, so a
                    wordmark passed the test. This number briefly deleted the rule from this file.
       "6 of 10"  — first focusable AND hidden until focus. The hiding is what separates a skip
                    link from a logo. Settled.

     RED 2 (the real one): the same ten pages through the converter — near lossless except page 05,
     whose CSS-only tab widget lost its three content-less <input>s in decomposition, leaving live
     CSS pointing at elements that no longer exist. Page 07 used the same :checked idiom and
     survived because its block stayed whole. §4.5 is that finding, and it opens with the
     measurement so no future author re-imposes a converter contract the evidence does not support.

     RED 3: the bundled keyword list had inverted itself in six days. `workshop` sat in the VERIFIED
     block and was the recommended substitute for `plumber`, but returns 500; `plumber`, `dental`,
     `terrace` and `paper` sat in KNOWN-DEAD and all return 200 image/jpeg again. Six of twelve tags
     spot-checked had flipped state. Corrected only those six — the rest of both blocks is now of
     stated, unknown freshness — and the list is re-headed as perishable with a build-time
     verification loop, because a stale tag does not break the page, it silently stops the
     photograph being of the subject and fails the category codes while looking fine.

     WARNING TO THE NEXT AUTHOR — this file nearly shipped a rule invented by a broken instrument.
     The first draft of §3 mandated a skip link "because only 3 of 10 pages had one". The real
     number is 10 of 10: the checker searched for the strings "skip to" and "Μετάβαση στο" and so
     missed "Παράλειψη στο περιεχόμενο" and every page whose main landmark is #top rather than
     #main. Four earlier versions of the converter instrument were wrong the same way — reporting
     resolved sprites, toggle-mapped <details> and background-image photos as losses. Before a
     measurement becomes a rule in this file, ask what it would report if the page were perfect. -->


## The rule

A visitor decides what kind of place this is in about one second, before reading a word. That
judgement runs on **category codes**: the colours, imagery, shapes and section order that the
category has taught everyone to expect. A page that misses them feels wrong even when it is
beautiful — and "wrong" costs more than "ordinary".

**So the order is: 1) hit the category's codes, 2) then differentiate inside them.**
Distinctiveness is a modifier on belonging, never a replacement for it.

Test before building: *if you covered the words, would a stranger still name the industry within a
second?* If not, the design has failed no matter how good it looks.

Test after building: *does it look like a site of this category made by someone with taste — or like
a design-magazine piece about this category?* The second is the failure mode of every AI page skill,
including ours.

## How to use this file

For the business in front of you, take the matching row. Ship the CODES. Avoid the CLICHÉ. Spend all
your creative ambition in the DIFFERENTIATE column — that is where the signature device, the grid
break, the type moment and the register live. If the business does not match a row, write the row
yourself before designing: name the three visual codes a customer of that industry expects, and the
one cliché everyone in it uses.

---

## The codes

**Dental / medical practice**
- CODES: light ground, clean whites with one calm accent (blue, teal, mint, or a warm neutral for
  "not clinical"); rounded, soft shapes; a human face or hands early; appointment/booking as the
  loudest control; hygiene, qualification and reassurance cues; opening hours and location visible
  without scrolling far.
- CLICHÉ: stock smile with perfect teeth, blue gradient, tooth icon, "your smile is our passion".
- DIFFERENTIATE: the register (calm vs frank vs playful for kids), the photography's honesty, the way
  fear is addressed in copy, one signature shape carried through.

**Security systems / alarms / CCTV / monitoring (B2B installer)**
- CODES: night-dark high-contrast ground with ONE signal accent (amber, safety orange or alarm red);
  the hardware shown as itself (camera, sounder box, keypad, reader) rather than as abstract icons;
  a 24-hour / response-time marker in the first screen; the phone as a permanent tappable control,
  repeated; the CCTV / alarms / access-control triad; named coverage area; insurer- and
  keyholder-facing credibility (licences, response protocol, who answers); sturdy condensed signage
  type, hard corners, no soft radii.
- CLICHÉ: a shield, a padlock, a hooded figure, a binary-code grid, "peace of mind 24/7", a wall of
  five-star badges.
- DIFFERENTIATE: what happens in the minute after an activation, who exactly picks up, the honest
  reason they are not the cheapest, the test a prospect can run before buying.
- SEASONING that fits (see the skill's seasoning pass): the sweep — a beam crossing the dark and
  waking what it lands on, which is also a camera panning a yard at night. Verified in benchmark
  run 06: judged "clearly better" than the identical page with no seasoning.

**Trades — plumber, electrician, HVAC, builder**
- CODES: high-contrast and sturdy; a strong utility colour (safety orange, deep blue, van green);
  phone number as a permanent fixture, tappable, top and bottom; photo of van/tools/finished work;
  service area named; emergency/response time promised early; heavy, condensed or industrial type.
- CLICHÉ: generic tool clip-art, "quality workmanship since 1998", a slider of unrelated stock photos.
- DIFFERENTIATE: the proof mechanism (before/after, timed response, fixed-price promise), the voice
  (a person, not a company), the one owned number.

**Legal / accounting / professional services**
- CODES: restrained palette (ink, navy, burgundy, warm grey) with generous white space; serif or
  high-quality grotesque; credentials, regulator and years visible; structured service list; a
  clear, low-pressure first step (a call, not a purchase); privacy and discretion cues.
- CLICHÉ: gavel/scales imagery, handshake photo, glass-tower skyline, "trusted advisors".
- DIFFERENTIATE: specificity of who they serve, plain-language explanation of a scary process,
  transparent fee structure, editorial confidence in type.

**Café / restaurant / bakery / food producer**
- CODES: warm and appetite-led; food photography is the design; browns, creams, kraft, one ripe
  accent; menu or product prominent; opening hours, address and map easy; texture (paper, grain,
  wood); handwritten or characterful display type used sparingly.
- CLICHÉ: chalkboard font, "artisan", steam over a cup, mountains and sunsets on coffee packaging.
- DIFFERENTIATE: the specific product story, the honest photo instead of the styled one, the ritual
  (roast day, bake time, harvest window) as structure.

**Fitness / physio / sports**
- CODES: energetic contrast, motion in imagery, bold condensed type, results and numbers, the client
  in action rather than a smiling portrait, clear booking, progression made visible (weeks, stages,
  levels).
- CLICHÉ: neon gradient, silhouette lunging into a sunrise, "unlock your potential", six-pack close-up.
- DIFFERENTIATE: who exactly it is for, the method made concrete, the honest limits ("I do not do X").

**Beauty / salon / spa / wellness**
- CODES: soft, tactile, image-led; muted or dusty palette; elegant serif or refined sans; the work
  itself photographed close; price list and duration; simple booking; a sense of calm space.
- CLICHÉ: rose-gold everything, orchid and stones, "pamper yourself", excessive script fonts.
- DIFFERENTIATE: the specialism, the practitioner as a person, the honest photograph of real results.

**Retail / product brand / e-shop**
- CODES: the product is the hero and appears within the first screen; price visible; add-to-cart or
  buy path obvious; shipping/returns reassurance near the button; grid of products; reviews if real;
  packaging colours drive the palette.
- CLICHÉ: three-column feature icons, "shop the collection" over a lifestyle photo, fake urgency timers.
- DIFFERENTIATE: how the product is made or sourced, the format of proof, the packaging as design system.

**Agency / studio / freelancer portfolio**
- CODES: work first, above the words; large imagery or case cards; a clear "what we do" line; process;
  contact as a conversation; confident, editorial typography; dark or stark palettes are accepted here
  in a way they are not elsewhere.
- CLICHÉ: "we craft digital experiences", floating 3D blobs, an endless logo carousel.
- DIFFERENTIATE: the selection of work, the point of view, the specificity of the results claimed.

**Wedding venue / events space / hospitality hire**
- CODES: photography IS the product and must dominate the first screen; capacity and season numbers
  visible early; a date-first enquiry form (not a phone-first CTA); a details table (sleeps, seats,
  hours, what is included); couples' or organisers' words; location and travel; warm natural palette
  drawn from the place itself (stone, olive, limewash, clay) — never corporate.
- CLICHÉ: sunset bride silhouette, string lights over a table, script font, per-head package cards,
  "your special day".
- DIFFERENTIATE: what the place refuses to do (one wedding a week, no packages, own caterer), the
  honest cost conversation, who lives there the rest of the year.
- Written by the skill during the 2026-08-19 engine-test run; kept because it worked.

**Vertical B2B software (SaaS for one trade or profession)**
- CODES: the product surface shown as itself in the first screen — a real screen, not a floating 3D
  mockup; three pricing tiers with the middle marked; a feature comparison table; contract and exit
  reassurance beside every button (month to month, export your data); FAQ about billing, migration
  and lock-in; sticky nav with ONE primary action; tabular numerals; text-coded — one or two photos
  at most, structure carries it.
- CLICHÉ: purple gradient, angled dashboard mockup, three icon cards, "all-in-one platform", a logo
  wall of customers you cannot name.
- DIFFERENTIATE: who they refuse to sell to, what migration actually costs in hours, whether features
  are held hostage by tier, the export path out.
- Written by the skill during the 2026-08-19 engine-test run; kept because it worked.

**Real estate / property**
- CODES: photography-driven listings, price and location prominent, search or filter early, map,
  agent as a named human, trust through numbers sold/managed; clean, spacious, mid-contrast layout.
- CLICHÉ: skyline hero, keys-in-hand handshake, "your dream home awaits".
- DIFFERENTIATE: the niche (area, property type, buyer type), the honesty about process and fees.

**Education / course / school**
- CODES: outcome first, curriculum visible, who it is for, teacher as a person, dates and duration,
  proof of results, friendly but structured layout; warm accessible palette.
- CLICHÉ: graduation cap icon, stock lecture-hall photo, "empowering learners".
- DIFFERENTIATE: the specific transformation, the honest entry requirements, real student work.

**Local services — cleaning, moving, pet care, garden**
- CODES: friendly and immediate; a person or a van; area covered; price shape (from / per hour /
  free quote); booking or call; reassurance about insurance, vetting, timing.
- CLICHÉ: sparkle icons, "we treat your home like our own", smiling stock family.
- DIFFERENTIATE: the guarantee, the specific process, the named people who turn up.

---

## Where the ambition goes

Belonging is the ground floor, not the ceiling. Once the codes are present, spend everything on:
the register drawn from the visitor's state · one signature device repeated as a system · the grid
break · the type moment · texture in one zone · and above all the copy, which is where a page in a
conventional category can be radically better than every competitor without looking strange.

**A page can be 90% category and 10% signature and still be the best page in its industry — because
everyone else is 100% category and 0% signature.**


---


**Why this file exists.** loremflickr fails **deterministically** on ordinary-sounding tags: `dental`,
`moussaka`, `terrace`, `paper`, `plumber`, `lawyer`, `security` and dozens more return HTTP 500 on
every request, with or without `?lock=`. Comma-chained tags (`leather,hide`) fail far more often
still, because the service requires a photo carrying ALL the tags. A model writing a page cannot test
a URL, so it must not guess: in a 10-page run, 24 of 104 images shipped broken before this list existed.

**The rule: use ONE keyword, and only from this list.** If the subject you need is not here, do not
improvise a tag — use a labelled `placehold.co` slot with the shot brief instead. Always
`?lock=<n>` (deterministic). Always keep the `picsum` `onerror` fallback.

## Verified (from the 2026-08-19 sweep — THIS LIST PERISHES)

**Treat these two blocks as a starting point with a date on them, never as fixed truth.** Six days
after the sweep, six of the twelve tags spot-checked had flipped state in both directions. A stale
entry does not break the page — the mandatory fallback catches it — it does something quieter and
worse: the photograph silently stops being OF THE SUBJECT, and a photo-coded page fails its category
codes while looking fine to you. **Verify every keyword you actually ship, at build time:**

```bash
for k in bicycle repair helmet; do
  echo "$k $(curl -sL -o /dev/null -w '%{http_code} %{content_type}' "https://loremflickr.com/320/240/$k?lock=7")"
done   # want: 200 image/jpeg — anything else, pick another word
```

Whole categories are missing from the sweep. Cycling, for one: `bicycle`, `bike`, `cycling`,
`wheel`, `helmet`, `repair` all return 200 and none of them are listed below. If your category is
not represented, sweep your own words with the loop above and write the row.


**People & places at work:** doctor · nurse · dentist · veterinary · teacher · barber · chef ·
electrician · developer · team · meeting · office · desk · welding · garage · farm

**Food & drink:** food · bread · bakery · pastry · pizza · salad · grill · barbecue · lamb · stew ·
cooking · kitchen · breakfast · dinner · coffee · espresso · cafe · wine · restaurant

**Home, property & building:** house · home · cottage · villa · apartment · interior · room · garden ·
window · door · stone · wall · roof · village · olive · table

**Retail & making:** shop · store · retail · bag · leather · clothing · fabric · craft · pastry ·
flowers · candles

**Fitness & wellbeing:** gym · fitness · training · barbell · dumbbell · kettlebell · yoga · running ·
chalk · salon · haircut · hairstyle · makeup · cosmetics · manicure

**Work, study & tech:** computer · laptop · screen · keyboard · code · books · library · contract ·
letter · whiteboard · classroom · school · study · university · monitor · camera

**Health & animals:** hospital · medicine · animal · dog · cat · pet · horse

**Vehicles:** car · van · truck · engine

**Events:** wedding · bride · celebration

## Known-dead (never use — always 500)
alarm · athlete · balcony · beer · builder · ceramics · chef* · clinic · documents · groom · guests ·
hairdressing · key · lawyer · living · lock · massage · mechanic · party · pipes · plumber · pottery ·
runner · scaffolding · security · sewing · shoes · spa · startup · stretching · student · surveillance ·
tailor · toolbox · tyres · wrench · moussaka · olives · greek · taverna ·
farmhouse · hills · whitewashed · blonde · hairdresser · law · leathercraft · rope · smile · child · long ·
workshop · road

(Re-measured 2026-08-25: `workshop` and `road` now 500 — `workshop` had been sitting in the VERIFIED
block and was the recommended substitute for `plumber`, so the advice pointed at a dead tag. In the
other direction `plumber`, `dental`, `terrace` and `paper` all return 200 image/jpeg again and have
been removed from this list. Only those six were re-measured; the rest of both blocks is from the
2026-08-19 sweep and is now of unknown freshness.)

(*`chef` failed the sweep but appears in the verified block above by category grouping — treat it as
dead until re-swept. When in doubt, re-run the sweep; it takes two minutes.)

## Substitutions that work
dental→(dental works again, 2026-08-25) · plumber→(works again; welding if you want the sparks) ·
lawyer→books or contract · security→camera ·
moussaka/olives→food or olive · terrace→garden · paper→books · greek/taverna→village or restaurant ·
farmhouse→house · hairdresser→haircut · blonde→hairstyle · rope→training · leathercraft→craft


---


Every item is checkable and none of it is taste. Written in our own words, informed by Vercel's
published Web Interface Guidelines. Apply during build, verify in the self-check.

## Typography micro-craft
- A real ellipsis `…`, never three dots. Curly quotes `" "` `' '`, never straight ones.
- **Non-breaking spaces** where a break would look wrong: inside phone numbers, between a number and
  its unit (`60&nbsp;λεπτά`, `10&nbsp;MB`), and inside a two-word brand name.
- **`text-wrap: balance` on every heading** and `text-pretty` on body copy: it evens the line lengths
  so a headline never leaves one orphan word on the last line. This is the mechanical half of keeping
  headlines short — do both.
- **`font-variant-numeric: tabular-nums`** on any column of numbers: price lists, timetables,
  capacity tables, stats. Without it the digits jitter and the column stops reading as a column.

## Forms — where most pages quietly fail
- Every input carries `autocomplete` and a meaningful `name`.
- The right `type` and `inputmode`: `tel` for phones, `email` for email, `url`, `number`. On a phone
  this changes the keyboard that appears — it is the single most felt mobile detail on a form.
- **Never block paste.** People paste addresses, codes and phone numbers.
- Label and control share ONE hit target: wrap the control in its `<label>` rather than pairing
  `for`/`id` across the page. No dead zone beside a checkbox, and nothing to get wrong.
  *(This also matches what survives conversion: a control that lives inside visible content cannot be
  orphaned when the page is decomposed.)*
- `spellcheck="false"` on emails, codes, usernames and reference numbers.
- Placeholders show a real example and end with `…` — `π.χ. 697 358 7049…` — and never replace a label.
- Errors appear inline beside the field they belong to, and say what to do next, not just what is wrong.
- The submit button stays enabled until the request starts; it does not sit disabled waiting for
  perfection.

## Focus and keyboard
- Never `outline: none` without a visible replacement. Use `:focus-visible`, not `:focus`, so a mouse
  click does not leave a ring behind.
- `:focus-within` for compound controls (a field with a button inside it).
- **A sticky header, footer or overlay must never cover the element that has focus** — tab through the
  page once and watch where the ring goes. Same family of bug as a hero headline sliding under the nav.

## Content that survives real words
- Flex children need `min-w-0` or long words overflow the layout instead of truncating inside it.
- Design for the shortest and the longest realistic content, not the average: a two-word service name
  and a nine-word one, one review and six, an empty state and a full one.
- Never render a broken empty state — design what the section looks like with nothing in it.

## Images and speed (speed is a ranking factor; this is how you get it)
- Explicit `width` and `height` on every `<img>` so the page does not jump as it loads.
- `loading="lazy"` on everything below the first screen; the hero image gets high priority instead.
- `<link rel="preconnect">` to the font host, and `font-display: swap` so text paints immediately in
  the fallback rather than sitting invisible.
- Prefer a muted, looping, inline `<video>` over an animated GIF.

## Theming and touch
- `color-scheme: dark` on `<html>` for a dark page, so scrollbars and native controls stop rendering
  light. Set `<meta name="theme-color">` to the page's ground colour.
- `touch-action: manipulation` on interactive elements to remove the 300 ms double-tap delay, and set
  the tap highlight deliberately instead of inheriting the browser's blue flash.
- Full-bleed layouts respect `env(safe-area-inset-*)` so nothing hides under a phone's notch or bar.

## Copy details
- Button labels name the action ("Κλείστε ραντεβού"), never "Submit" or "Click here".
- Error messages carry the fix, not just the fault.
- Second person, active voice. Numerals for counts.
