South Mole Seafood

Generative Assets · Industry Demos · how it was made

How the South Mole Seafood demo was built

South Mole Seafood is a fictional Fremantle fish market and wholesale counter beside the Fishing Boat Harbour — Abrolhos snapper and scallops, Shark Bay whiting, Exmouth prawns and western rock lobster, over the counter seven days and out to restaurant kitchens by six each morning. The page exists for one reader: the chef ordering six kilos of snapper fillets for Friday. Its single job is an order request with the species, the cut, the weight and the delivery already priced — honestly, to the whole dollar, with the restaurant rate applied where it's earned.

The Catch Board

The signature element is a drawn SVG display case seen head-on: a bed of crushed ice hatched in harbour teal over white, a stainless rail across the front, a case card clipped to the rail, the packing for your chosen delivery on the bench, and a folded paper price ticket above the ice. Every control redraws the case honestly and reprices the order from the pinned anchors:

Pinned anchors (GST inclusive, per kilo, whole kilos)

SpeciesPrep APrep BPrep C
Pink snapperwhole $28scaled & gutted $32fillets, skin on $52
Shark Bay whitingwhole $34scaled & gutted $38fillets, skinless $58
Exmouth prawnsgreen, shell on $45cooked $48peeled green $68
Abrolhos scallopsin the half shell $58roe-on meat $72roe-off meat $84
Western rock lobsterwhole raw $95whole cooked $105halved & cleaned $115
RuleAnchorWhat it multiplies / tests against
Restaurant rate−$4 a kilo from 5 kgchanges the rate, never the billed weight; the rate multiplies the actual kilos. Boundary exactly reachable — the stepper is whole kilos.
Counter pickup$0no minimum
Metro delivery$25, free from $240flat, and outside the fish subtotal. The $240 threshold tests the fish subtotal only. Reachable exactly: 5 kg snapper fillets at the trade rate = 5 × 48 = $240.
Metro minimum$120 of fishtested against the fish subtotal only, never fish + delivery. Reachable exactly: 5 kg whole snapper at the trade rate = 5 × 24 = $120.
Regional freightno number"quoted by the run" — the badge prints $<fish subtotal> + freight quoted (the W40 partially-computable form), never a bare "quoted". No minimum. No short form — the full string at every width.
Availability declarationno numberprice-less and always present, on the ticket, the ledger and the a11y mirror — and in the confirmation panel. Short form at ≤640 px: "we call before we substitute".

Every rate is a whole dollar and the weight grid is whole kilos, so no total ever needs rounding — the harness asserts every total is an integer across the whole reachable surface. There is no empty state: a species chip, a prep chip and a delivery chip are always selected, and the weight floors at 1 kg.

The delivery force, and what happens on the way back

Metro delivery starts at a $120 fish subtotal. While metro is selected, any change that drops the fish subtotal under $120 forces the order to counter pickup, remembers metro, and disables the metro chip with the reason printed on the page. Raising the subtotal back to $120 or more restores metro. Three semantics matter and all three are shipped and asserted:

Worked examples measured from the running page

ScenarioArithmeticTotalNote · line 2
Rest — pink snapper, fillets skin on, 6 kg, metrorate 52 − 4 = 48; 6 × 48 = 288 ≥ 240 → delivery $0$288"restaurant rate — $4 a kilo off, $24 off this order" · "Abrolhos, off the boat this week"
Cheapest output — snapper, whole, 1 kg, pickup1 × 28$28= the services grid floor "$28 a kilo whole"
5 kg whole snapper, metro (minimum met exactly)5 × 24 = 120 + 25$145"$20 off this order"
4 kg whole snapper, metro4 × 28 = 112 < 120 → forced to pickup$112note absent · metro disabled
…then step back to 5 kgmetro restored, 120 + 25$145note present
5 kg snapper fillets, metro (free-delivery boundary)5 × 48 = 240 → delivery free$240"$20 off this order"
4 kg snapper fillets, metro4 × 52 = 208 + 25$233note absent
8 kg peeled green prawns, pickup8 × 64$512"$32 off this order" · eight units drawn, no tray
2 kg lobster halved & cleaned, metro2 × 115 = 230 + 25$255note absent · "Fremantle boats, weather permitting"
10 kg whiting fillets, metro10 × 54 = 540 → delivery free$540eight units drawn, tray reads "10 kg"
3 kg roe-on scallops, metro3 × 72 = 216 + 25$241note absent
15 kg whole raw lobster, pickup15 × 91$1,365tray reads "15 kg"
Regional freight, 6 kg snapper fillets288, freight not priced$288 + freight quotedthe W40 partially-computable badge form
Rapid-fire — pickup, prep whole, 5 kg, then lobster → prawns → scallops → whiting in one evaluate5 × 30$150"$20 off this order" · loop count settles back to exactly 1

Every figure above, both boundary pairs, all six grid floors and 45 further control vectors across the whole reachable surface were checked against an oracle re-implemented from the anchors inside the verification harness — never by importing the page's own code. Each scenario drive sets the full control vector explicitly (species, prep, weight, delivery) rather than inheriting load state (W33).

Palette — crushed ice, wet slate, harbour water, and the flesh of a snapper fillet

A pale ice ground, wet-slate ink, harbour teal doing all the marking, and a salmon flesh tone that lives only inside the drawn catch. Cold, clean and market-honest — chalk-board discipline without the chalkboard. It is held off the near-black + acid-accent default by the slate-not-black ink, and off cream + terracotta entirely by the cold ground. Every ratio below was computed with WCAG arithmetic from the shipped tokens during Pass 1, role, hex and ratio read from the same script row.

Ice#EDF2F3 page ground; cards #FFFFFF, soft cards #F4F8F8, the case-lip steel #C9D8DB#EAF2F3
Wet slate#122A31 body ink and primary CTA · 13.27:1 on ice, 14.99:1 on white, 14.01:1 on soft cards, 12.33:1 on the teal tint; white labels on it 14.99:1 (hover #0C1F25, 16.96:1)
Harbour teal#0E6E77 rails, chip outlines, the ice hatching, the ticket's rule, the Sapience band · white labels on it 5.97:1 (hover #0B5A62, 7.92:1). As text on ice it is 5.29:1 — in the 4–6 band, so small teal copy uses the ink below.
Teal-ink#0A555C teal-coloured small copy (h1 emphasis, chip sub-labels, the map's business label) · 7.54:1 on ice, 8.51:1 on white, 7.00:1 on the teal tint
Salmon#E2705D the drawn flesh, prawn shell, scallop roe · 2.77:1 on ice — scene fill only, never text and never chrome. The slate mark on it reads 4.79:1.
Salmon-ink#A93C2A salmon-coloured copy — prices, the trade note, the rate stamp, the regional-freight run on the map · 5.52:1 on ice, 6.24:1 on white
Muted slate#3F5A62 secondary copy (eyebrows, hints, ledger declaration, scene labels) · 6.52:1 on ice, 7.37:1 on white, 6.89:1 on soft cards
Light#C6D8DB trust-strip and footer copy on slate · 10.17:1; footer quiet #A8C0C5 7.86:1
Map water#CFE0E3 the Indian Ocean and the Swan · slate labels on it 11.01:1, on the white land 14.99:1 — every map label is body ink with a ground-coloured halo (W41)

Pass 1 measurement reproduced every spec figure exactly — 13.27 / 14.99 / 16.96 / 5.97 / 7.92 / 5.29 / 7.54 / 8.51 / 2.77 / 5.52 / 6.24 all held to two decimals, so no token was re-minted. The two colours the measurement decided: the mark ink on the drawn catch is slate on the salmon, pale and shell fills (4.79 / 12.60 / 11.62:1) but flips to white on the cooked-prawn and both lobster fills, where slate would measure 3.12:1 and be swallowed (W42) — white on cooked reads 4.80:1 and on raw lobster 8.57:1. And the regional-freight labels on the map are salmon-ink on white land, never over water.

Type

$288 · 6 KG
Bricolage Grotesque 700/800 — a market-sign grotesk with cut corners and real personality. Headings, the display line above the case, the ticket price, stepper values, the case card, the wide-tracked uppercase eyebrows (.18 em).
Abrolhos snapper, Shark Bay whiting and Exmouth prawns, filleted to your order at the harbour.
IBM Plex Sans 400–700 — the workhorse: 17 px body (16.5 px on phones), labels, ledger, form, map labels. Nothing below 10.5 px anywhere, and that only on the map's scale bar.

The display moment is the rest-state line set above the case — "$288 · PINK SNAPPER · FILLETS · 6 KG" — rebuilt from state on every change, so the figure is always the live total and the species and cut are always the live selection. The price leads in salmon-ink; the middle dots travel with the token that follows them so a wrap never strands a dot at a line end. In the quoted state the same line reads "$288 + freight quoted · PINK SNAPPER · FILLETS · 6 KG".

Techniques

Conversion decisions

Local SEO we'd implement for the real business

The live page carries only WebPage, WebSite and BreadcrumbList structured data naming it a demonstration — a fictional market must not mark itself up as a real one. For the real client we would ship the block below. schema.org has no fishmonger or seafood-market subtype, and FoodEstablishment is for eating on the premises, so the top-level type is Store — an actual organisation subtype — with the specialty named through additionalType and the counter priced through hasOfferCatalog. Real reviews would be pulled from the Google Business Profile feed and marked up only with the reviewer's consent.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Store",
  "additionalType": "https://en.wikipedia.org/wiki/Fishmonger",
  "name": "South Mole Seafood",
  "description": "Fremantle fish market and restaurant supply — Abrolhos snapper and scallops, Shark Bay whiting, Exmouth prawns and western rock lobster, filleted to order.",
  "url": "https://www.example-southmole.com.au/",
  "telephone": "+61 8 9000 0372",
  "image": "https://www.example-southmole.com.au/counter.jpg",
  "priceRange": "$$",
  "currenciesAccepted": "AUD",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Fremantle",
    "addressRegion": "WA",
    "postalCode": "6160",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -32.06, "longitude": 115.74 },
  "areaServed": ["North Fremantle", "Cottesloe", "Claremont", "Subiaco", "Perth", "Leederville", "Victoria Park", "Applecross"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "06:00", "closes": "17:00" },
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Saturday","Sunday"], "opens": "07:00", "closes": "16:00" }
  ],
  "knowsAbout": ["pink snapper", "Shark Bay whiting", "Exmouth prawns", "Abrolhos scallops", "western rock lobster", "wholesale seafood", "filleting to order"],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Off the boats",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Product", "name": "Pink snapper, whole" }, "priceSpecification": { "@type": "UnitPriceSpecification", "price": "28", "priceCurrency": "AUD", "unitCode": "KGM" } },
      { "@type": "Offer", "itemOffered": { "@type": "Product", "name": "Pink snapper fillets, skin on" }, "priceSpecification": { "@type": "UnitPriceSpecification", "price": "52", "priceCurrency": "AUD", "unitCode": "KGM" } },
      { "@type": "Offer", "itemOffered": { "@type": "Product", "name": "Western rock lobster, whole raw" }, "priceSpecification": { "@type": "UnitPriceSpecification", "price": "95", "priceCurrency": "AUD", "unitCode": "KGM" } }
    ]
  },
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.8", "reviewCount": "212" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Real customer, with consent" },
      "datePublished": "2026-06-14",
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "Pulled from the live Google Business Profile feed — never hand-written."
    }
  ]
}
</script>

Alongside the schema: a Google Business Profile pinned to the Fishing Boat Harbour with the counter hours and the daily catch posted as updates, "fish market Fremantle" / "fresh seafood Perth delivery" / "wholesale seafood restaurant Perth" as the core phrases with the delivery suburbs as secondary, NAP consistency across the hospitality-supplier directories, and a reviews feed that updates without anyone touching the page.

What changes for the real client

Iteration log

Spec notes and decisions the concept left to the builder: the drawn unit is one kilo, and the cluster inside it is the honest trade quantity (one fish, two fillets, three prawns, five scallops, one lobster) — the drawn cap of eight units and the tray's printed count are the pinned honesty mechanism above 8 kg. The prep chip is an index (A/B/C) preserved across a species swap, since every species has exactly three preps that map one-to-one; the label, the rate and the drawing change with the species, the position does not. The regional-freight badge suffix has no pinned short form, so it carries the full string at every width, as the wave allows. Nothing in the concept was found arithmetically wrong: all thirteen worked figures, both boundary pairs and all six grid floors reproduced exactly against an independent oracle. Final harness totals: 443 asserts, all green — 302 in the behaviour harness (rest state, thirteen worked examples against the oracle, both boundary pairs, the force/restore/invalidate/unwind chain, every chip and stepper, two rapid-fire bursts, a 45-vector oracle sweep, the three-surface note and declaration checks with their absence cases, and the empty-then-filled form path) and 141 in the hardening harness (375 px layout and masthead, the 640/641 dock with short-versus-full forms on all three surfaces, reduced motion, focus rings, v-flag patterns, DPR 1/2/3, a live resize across the breakpoint, and the guide page's own structure and figures). Zero console errors or warnings at 375 / 640 / 641 / 1000 / 1200 and under reduced motion.