# Gallery Quality Standards

The living quality bar for every example in this gallery — and eventually for every site a
Mothership client agent builds. Seeded 2026-07-02; grows out of Adam's review feedback. Every
keep/kill/fix decision on a gallery page should leave a trace here.

## Technical
- One self-contained HTML file: inline CSS, no external JS dependencies. System fonts or
  Google Fonts only (Google Fonts `<link>` is the single allowed external request).
- No external images. Visuals are CSS/SVG: color blocking, gradients, inline SVG illustration,
  texture. Pages must look *designed*, not "missing images."
- No real trackers or integrations: no HubSpot, gtag/GTM, Bunny, nav-loader. Forms are plain
  markup (no action endpoints).

## Layout & responsiveness
- Mobile-first. Flawless at 375px AND 1440px; sane at every width between.
- No horizontal scroll, ever, at any viewport width.
- Clear primary CTA above the fold.
- Working in-page navigation (anchor links that actually land well, with scroll offset for a
  sticky header if there is one).
- Footer with the contact/hours pattern: address, phone, hours, and the primary CTA repeated.

## Content
- Realistic fictional business with real-sounding copy. ZERO lorem ipsum or placeholder text —
  the gallery models the bar the agent must hit, including copywriting.
- Prices, hours, addresses, menus: specific and plausible for the business type and locale.
- Vibe fidelity: the page must read unmistakably as its category + vibe slot. A stranger should
  guess the business type in one second.

## Motion (see `toolbox/animations.html` for live demos + implementations)
- Budget: ~1 motion idea per section, 2–3 technique families per page, one signature moment
  (usually the hero). Quiet everywhere else.
- Defaults ON: scroll-reveal (IntersectionObserver, animate once, 16–32px), hero entrance
  stagger (≤1s total), hover micro-interactions (150–250ms, `@media (hover:hover)`), sticky nav.
- OFF by default: parallax, text effects, scroll progress. Never: scroll-jacking, mandatory
  scroll-snap, preloaders, auto-advancing carousels, typewriters, sound.
- Animate `transform` and `opacity` ONLY. All translation/scale lives inside
  `@media (prefers-reduced-motion: no-preference)`; reduce users get fully visible static
  content. Initial hidden states are scoped to `.js` (set on `<html>` by script) so no-JS
  users see everything.
- The H1 and hero image render at first paint (LCP) — entrance animation is for the elements
  around them. Never animate in: body copy, menus/prices, hours, address, contact info.

## Media slots (see `toolbox/media.html` for placement patterns + production wiring)
- Gallery pages carry labeled placeholder frames (gradient + "PHOTO/VIDEO slot" label) sized
  and positioned exactly as production media: the agent swaps frames for real
  `<video>`/`<picture>` per the toolbox wiring.
- Video is ALWAYS muted-first: `autoplay muted loop playsinline`, sound only via explicit
  user action (unmute button or click-to-play). Poster set, lazy `data-src` + IO below the
  fold, scrim gradient under any text, reduced-motion users get the poster.
- Photos: `object-fit: cover`, explicit dimensions (zero CLS), webp+jpg `<picture>`,
  first image `fetchpriority="high"`, everything else `loading="lazy"`.

## Accessibility
- Text contrast meets WCAG AA against its actual background.
- Semantic heading hierarchy (one h1, no skipped levels).
- Alt text on any meaningful SVG/graphic (or `aria-hidden` on decoration).
- Visible focus states on links, buttons, and form fields.

## Review log
<!-- Adam's feedback gets codified here as dated entries, e.g.:
- 2026-07-XX (restaurant/warm-neighborhood): ...rule derived from feedback...
-->
- 2026-07-02 (salon-spa/calm-luxe — KILLED): Adam rejected the pale ultra-light "ethereal"
  day-spa treatment (sage/ivory, weight-300 type, gradient blobs, abstract arch shapes).
  Provisional rule until sharpened by further feedback: **pages need visual confidence —
  avoid washed-out low-contrast palettes, ultra-thin type doing all the work, and abstract
  decorative shapes that read as placeholder.** Replaced with `salon-spa/moody-luxe.html`
  (high-contrast charcoal/ivory/brass, weighted serif, concrete sections: priced menu,
  stylist cards).
