CATALOG MODULE
The building blocks for a shelf, a menu, or a fleet
Five components (plus a stat-strip variant) for any site that lists a repeatable set of items — a rental shelf, a restaurant menu, an equipment fleet, a listings page. Demoed here with board-game-rental sample data; the components themselves carry no domain words.
NOTHING MATCHES
Empty state
Shared by a filtered catalog grid's "nothing matches" state (and any future filtered surface): a heading, a body sentence, an optional reset control, and an optional escape-hatch link. Static — no client JS of its own; a filter runtime wires the reset button.
With both a reset button and an escape hatch
Nothing matches that combination.
Try widening the group size, or clear the filters and browse.
NOT STARS
Complexity / scale meter
A 1-N rating that isn't a quality judgment — stars mean that everywhere else on the web. Discrete filled/unfilled dots are purely decorative; a real aria-label ("Complexity 3 of 5 — moderate") carries the whole meaning for anyone not seeing the dots. Shown here on both a light and a dark surface — the concrete case preflight's badge/scale contrast gate exists to protect.
Light surface
Dark surface
ONE ITEM'S PRICE
Price block
One item's price model — not a list of many priced rows (that's the "Rate card" module). Every PriceModel kind: a per-term rate with a deposit, a flat rate, a "from" rate with a fee, a range with a minimum, and the honest "ask us" case with no number at all.
kind: "term"
kind: "fixed"
kind: "from"
kind: "range"
kind: "quote"
STATSTRIP, REUSED
Spec strip
<StatStrip variant="spec"> — same labelled-values-in-a-row shape as the everyday stat strip, but fed typed Spec[] instead of plain value/label pairs. A players count renders as a range, play time appends its unit, and complexity renders a ScaleMeter in the value slot instead of a bare number.
Game specs
-
2–5
Players
-
45 min
Play time
-
Complexity
AVAILABILITY + PRICE + CTA
Catalog panel
The item-detail page's availability card: a short status badge, the honest per-status sentence, the fixed response-time line, price (when the status policy allows showing one), a CTA, and — when present — the replacement-value disclosure and a rules link. Shown on both a light and a dark surface, the availability badge included, for the same reason as the scale meter above.
Light surface — available, with a price and a replacement-value disclosure
Dark surface — not stocked, no price shown
THE BOOKSHELF
Catalog grid + filters
<CatalogGrid> maps entries to <TileGrid> cards and stamps the data-* facet
attributes below onto each one; <CatalogFilters> is the one <form> — shelves, facets,
search, sort, reset, and "Surprise me" — whose ≤4KB runtime reads those exact attributes to filter and sort. This is a
synthetic 7-item dataset, not real inventory, wired end to end: try the category radios, the tag chips, the players/time
inputs, search, sort, and the random pick. With JavaScript disabled, "Apply filters" still submits a real GET request —
the honest "no-JS degrades to the full unfiltered grid" answer the design spec calls for.
Nothing matches that combination.
Try widening your filters, or clear them and browse.
Demo shelf
-
Gloomhaven
ReservedA sprawling campaign of tactical combat.
-
Wingspan
AvailableGoodA relaxing, engine-building game about birds.
-
Catan
AvailableTrade, build, and settle a shared island.
-
Ticket to Ride
AvailableGoodClaim train routes to connect cities across the map.
-
Azul
AvailableDraft and place tiles to build the most beautiful wall.
-
Codenames
AvailableGive one-word clues to your team, avoid the assassin.
-
Pandemic
Not stockedWork together to stop four diseases before they spread.