Canonical reference · 2026-07-30
Swiss-institutional and light — a register entry, not a newspaper spread and not app chrome. This page is the source every other surface is built from: the :root block below is copied verbatim into the public site and the app, and no downstream file forks a token value. Green marks the consistent verdict and the one primary action. Nothing else is coloured.
Every figure on this page is sample data for layout. Population counts, sub-grades, reference images, sighting dates and quality readouts are rendered here to fix the design. The live app fills those slots only from data it actually holds — a grader record, a population figure, a SecureScan image, a measured capture metric — and otherwise prints the honest “not available for this grader” row. Nothing is ever invented to fill a slot.
01 · Tokens
Paper, ink and hairlines carry the whole layout. The four signal values are restricted to verdict surfaces and the single primary action — a signal colour used for decoration is a bug, because it spends the meaning of the seal.
The block, to copy
:root{
/* ground + ink */
--paper:#F6F7F5; /* page ground */
--card:#FFFFFF; /* input + seal field surface */
--ink:#141414; /* primary text, strong rules */
--sub:#5A5F58; /* secondary text, labels, captions */
--hair:#CDD1CA; /* fine hairline between ledger rows */
--hair-strong:#9AA097; /* control borders, opening rule */
--placeholder:#71766F; /* input placeholder (AA on --card) */
/* signal — verdict surfaces and the one primary action ONLY */
--green:#0B6B4F; /* consistent / no-conflicts + Verify */
--green-press:#095A42; /* that action, hover + pressed */
--caution:#8A4B00; /* caution signal */
--red:#8A1C13; /* RESERVED: strongest negative only */
/* type — production intent first, system fallback after */
--font:"Inter","Söhne",-apple-system,BlinkMacSystemFont,"Segoe UI",
Roboto,Helvetica,Arial,sans-serif;
--mono:"IBM Plex Mono",ui-monospace,"SF Mono",SFMono-Regular,
Menlo,Consolas,monospace;
/* geometry */
--radius:3px; /* one small radius; no corner inflation */
--maxw:clamp(760px, 40vw + 250px, 1180px); /* measure; margins carry the authority */
/* type scale — fluid, mobile -> desktop. Premium reads LARGE +
LIGHT + TIGHT, so display and h2 carry weight 400. */
--fs-display: clamp(2.5rem, 1.1rem + 5.6vw, 4.5rem); /* 40 -> 72px H1 */
--fs-h2: clamp(1.5rem, 1.1rem + 1.6vw, 2.125rem); /* 24 -> 34px */
--fs-h3: clamp(1.125rem, 1rem + 0.5vw, 1.375rem); /* 18 -> 22px */
--fs-body: 1rem; /* 16px */
--fs-small: 0.9375rem; /* 15px secondary prose */
--fs-caption: 0.8125rem; /* 13px captions, notes */
--fs-eyebrow: 0.6875rem; /* 11px mono, uppercase, tracked */
--fs-cert: clamp(1.25rem, 1rem + 1vw, 1.75rem); /* 20 -> 28px cert */
--lh-display: 0.98; --ls-display: -0.022em; --fw-display: 400;
--lh-h2: 1.12; --ls-h2: -0.012em; --fw-h2: 400;
--lh-body: 1.6; --ls-eyebrow: 0.14em;
/* motion — one interaction curve, one duration ladder */
--dur-micro: 120ms; /* the focus ring leaving */
--dur-color: 150ms; /* colour only */
--dur-enter: 200ms; /* the two one-shot keyframes */
--dur-state: 300ms; /* control + hover */
--dur-reveal: 500ms; /* entrance and scroll reveal */
--ease: cubic-bezier(0.2, 0, 0, 1); /* seal press ONLY */
--ease-soft: cubic-bezier(0.4, 0, 0.2, 1); /* interaction */
}
Light only, pinned. html{color-scheme:light} plus explicit values on every surface, and a prefers-color-scheme:dark block that re-declares the same eleven values rather than inverting them. A viewer who forces dark keeps the institutional register and never gets invisible text.
Layout rules that travel with the tokens. Strict grid, generous margins, everything left-aligned. Results are labeled ledger rows separated by fine hairlines — a register entry, never a card stack. No drop shadows, no gradients, no decorative icons; the only glyphs in the system are the six seal marks.
The ground is plain paper
The hero band used to carry a ruled “ledger paper” ground: a repeating hairline behind the eyebrow and the display headline, on a 32px rhythm. On a real screen it read as banding across the page rather than as paper, so it is gone and nothing replaces it.
Do not reintroduce a page texture. The ground is flat --paper. Every hairline that remains is structural — the rule between two ledger rows, the rule that opens a section, a control border — and each one separates two things a reader can name. A rule that separates nothing is decoration, and decoration is what made the page look like a rendering artefact.
02 · Type
Premium is LARGE, LIGHT and TIGHT; mass-market is small, heavy and loose. Display and h2 therefore sit at weight 400 — confidence comes from size, not bold. Every cert number, grade and population figure is tabular mono, which is the precision cue and is not optional. Each row below renders through the token it names.
The rules that travel with the scale. The cert number is the hero datum: --fs-cert, mono, tabular figures, letter-spacing:.04em. Body copy is never set below 15px, and eyebrows are the only 11px text. Maximum measure for prose is 68ch — a longer paragraph is a density smell, not a layout to widen.
Sentence case everywhere. Uppercase is reserved for mono micro-labels (eyebrows, seal labels, badges, table headers) where letter-spacing does the work.
03 · Signature
The one signature element. A flat matte field pressed into the page: hairline edge, inset shadow at the top-left, inset light at the bottom-right, an engraved inner ring, and a debossed glyph over a mono label. Never glossy, no gradient, no shadow cast onto the page. The seal carries the verdict colour; nothing else on the result does.
Why the seal is allowed one filter. The glyph carries drop-shadow(0 1px 0 rgba(255,255,255,.9)) — a 1px light cast directly beneath the stroke. That is the letterpress highlight that makes the glyph read as pressed in rather than drawn on. It is the emboss, not a shadow effect, and it is the only filter in the system.
04 · Components · the hero control
One oversized mono field, one segmented grader selector, one green action. Nothing competes with it. Focus the field to see the hairline turn green; the scan line sweeps once, at --dur-enter, while the lookup is in flight.
The masthead readout at the top of every surface carries the same figure as the first stat. One number, one source — and on these static pages it is dated, because it is a snapshot rather than a live count.
Empty field · placeholder
Loading · the scan line sweeps the input
PSA · 84771904 reading the grader record and the sighting graph
Motion is near-none. Production sweeps the line once (.certwrap.scanning, --dur-enter). The field above is a still frame of that sweep (.sg-line) so the line can be read on a static page: the loop that used to stand in for it is gone, because there is no looping animation anywhere in this system. The sweep and the result entrance both sit inside prefers-reduced-motion guards and vanish entirely when reduced motion is requested — no motion in this system carries information.
The interaction system
One curve and one duration ladder. Every transition uses --ease-soft; --ease is spent on a single thing, the seal press. A new interaction picks a rung of this ladder or it does not move — there is no second scale.
| Token | Value | What uses it |
|---|---|---|
| --dur-micro | 120ms | The focus ring leaving, and nothing else |
| --dur-color | 150ms | Colour-only change: a link on hover, the ledger-row wash |
| --dur-enter | 200ms | The two one-shot keyframes: the seal press, the lookup sweep |
| --dur-state | 300ms | Standard control and hover: quiet buttons, chips, segments, the cert field, disclosure, nav links |
| --dur-reveal | 500ms | Entrances and scroll reveals, and the whole of the one primary action |
| --ease | cubic-bezier(0.2, 0, 0, 1) | The decisive ease-out. RESERVED: the verdict seal press, nothing else |
| --ease-soft | cubic-bezier(0.4, 0, 0.2, 1) | The default curve: every transition on every surface |
Why two tiers for colour. A colour change a reader is not looking at — a row washing under the cursor, a link warming — settles in 150ms. A control they are aiming at takes 300ms, because that is long enough to read as a response and short enough not to lag the cursor. The one primary action takes the whole 500ms, on transition:all, so its fill, its border and its lift arrive as a single movement.
What every surface owes a reader
Transitions, not keyframes. Three keyframes exist in the whole system — the seal press, the lookup sweep and the result's rise — and each runs once. Everything else a reader can trigger is a transition between two states. No animation loops, and nothing moves that a reader did not ask to move.
Reduced motion, and the rule that outranks it. Under prefers-reduced-motion: reduce every transform and reveal is off, opacity fades survive at --dur-micro, the seal appears without the press, and the scan line does not sweep. Content outranks the animation. The reveal can only hide a section behind .js-reveal, a class the boot script sets solely when an observer exists and motion is allowed; the observer stops watching an element the moment it reveals; a 1.6s failsafe drops the class if the observer never fires at all; a catch drops it on any script error; and the reduced-motion block states opacity:1 outright. No reader can be left looking at an empty page.
Error · the field rejects before any lookup
999 is too short for a PSA number — check the digits, or the grader.
Buttons, links, badges, focus
Inline link: jump to the verdict states. Badges: psa reviewed re-verify reported
Focus. One ring everywhere: 2px solid green at 2px offset, on buttons, chips, links, the field, each segment of the grader selector, and every disclosure summary. Tab through this page to check it. Every interactive target is at least 44px tall.
05 · Components · the ledger row block
Identity first, then labeled rows for grade and sub-grades, population, and the reference-image slot — each separated by a fine hairline, with a heavier rule opening the ledger. Labels sit left in sub, values sit right in mono. The verdict and its seal close the entry.
Data honesty. Three slot classes exist for exactly this reason: .row .v for a figure we hold, .row .v.na for a field the grader does not issue, and .naslot for a whole group we cannot read. A slot is never filled with an estimate, an average, or a plausible-looking number.
06 · Components · verdict states
The vocabulary is fixed. SlabEye reports what it observed against the record and the sighting graph — it never states that a card is or is not what the label says, because it cannot see inside a holder. State 01 has two copy variants: one when a grader record was actually read, one when only the sighting graph was checked. State 06 is designed but not emitted live.
01a · consistent with the record
Consistent with the record. The grader's record for this number describes the same card, set and grade as the listing, and our last sweep saw the number on no other live listing. A matching scan doesn't confirm the specific card sealed inside the holder.
01b · no conflicts observed · collision check only
No conflicts observed. The number fits ACE's format and our last sweep saw it on no other live listing. That is the absence of an observed conflict within our coverage — no record was read, so nothing here describes the card. A matching scan doesn't confirm the specific card sealed inside the holder.
02 · seen on other live listings
Seen on other live listings. A graded slab is a single physical item, and our last sweep observed this number on three then-active listings from different sellers. The ordinary explanation is one seller's photo reused across items, and that alone is not a problem. Confirm which copy PSA sealed before any money changes hands.
03 · resolves to a different card than the listing claims
Resolves to a different card than the listing claims. The number returns a record, and that record describes another card entirely. The disagreement is between the listing and the record behind the number — which is the thing worth resolving before you pay.
04 · no record found for this cert
No record found for this cert. The number fits CGC's format, but no matching record came back and our sweeps saw no conflicting activity. Neither clear nor flagged — open CGC's own record before relying on the number.
05 · doesn't match this grader's cert format
Doesn't match this grader's cert format. 999 cannot be a PSA number — it does not fit the shape PSA issues. Usually that is a typo or the wrong grader selected. Check both and re-enter; if it still does not fit, don't rely on the number.
06 · flagged by a report · designed state, not emitted live
Flagged by a report. A dealer or collector filed a report against this number. SlabEye records the observation and points at the grader's own page; it makes no claim about any person. Treat a filed report as a strong prompt to slow down and check.
State 06 is design-only. Reserved red, and the one state with no data behind it — no report corpus exists. It is rendered here and in the demo so the design is settled; the live app must not emit it until real reports exist on a record.
Vocabulary discipline. Four words are barred from every SlabEye surface: the noun for deliberate deception, the adjective for an object that is a copy passed off as the original, and the two adjectives that assert an object is the real article. The list lives in DESIGN-BUILD-SPEC.md and is deliberately not reproduced here, so a grep of any shipped surface returns nothing. No surface claims a card is or is not what the label says. The six statements above are the whole vocabulary — a new state needs a new honest sentence, not a stronger adjective.
07 · Components · the ceiling line
Persistent, never dismissible, and attached to every green verdict. It is the structural limit of the whole product: two copies of the same print scan identically, so a clean screen cannot reach the object inside the holder.
Consistent with the record. A matching scan doesn't confirm the specific card sealed inside the holder.
Where it must appear. On state 01a and 01b, always, in the verdict body — not in a footnote, not behind a disclosure. It rides inside .vtext as .ceiling: a left hairline rule, sub colour, one sentence.
One contracted variant. The app's live string is asserted by its embedded test suite as “A matching scan does not confirm the specific card sealed inside the holder.” — the same sentence, uncontracted. Either is canonical; do not reword the clause itself.
08 · Components · record-check outcomes
After the deep link out, one tap records the comparison. Three equal-weight quiet buttons — deliberately not colour-coded, because colouring one answer steers the log. The log is append-only; undo appends a retraction rather than deleting anything.
Opened PSA's own record? Log what you saw — one tap, stored as a comparison result only, never what the grader's page showed.
Append-only, in the UI too. The retraction shows in the log as its own row. Nothing disappears, so the surface cannot imply a cleaner history than the data holds.
09 · Components · capture
Three shots, each gated on its own. The indicator shows which are in and which is next, and marks the label shot required because the cert read comes from it. It does not pretend to be a locked wizard: the server can only advise after a shot arrives, so the copy says so.
Nothing here is locked. Each shot is checked on its own once it arrives — the check happens on the server, so it can advise and ask for a retake, not stop you mid-shot. Shoot them in any order, redo one without losing the others, or stop after the label: that is the only shot the cert read needs. Photos are read, then discarded.
No forced camera. These inputs carry accept="image/*" and nothing else. The capture attribute was removed on 2026-07-30 because it forces the rear camera and strips the Photo Library and Files out of the picker. Do not re-add it.
Retake coaching — one instruction, one physical fix
Glare on the slab.
Tilt the slab a few degrees or step out of direct light — a bright hotspot is hiding part of the surface.
shot labelglare 6.4% of print area bar ≤1.0%sharpness ok
Third glare refusal in a row on this shot: move away from the overhead light, or shoot near a window.
One reason, never a list. The gate short-circuits on the most fatal failure and names exactly one fix. After three consecutive refusals for the same reason the copy escalates from a nudge to a concrete change of light, because on a phone the only real lever is the room. A refusal to read a shot is never a verdict — a verdict only exists for a shot that cleared the bar.
10 · Components · dense table
Hairline rows, mono for anything countable, sellers as opaque handles. The table scrolls inside its own container so the page never scrolls sideways.
| Seller | Marketplace | First seen | Last seen | Read from | State |
|---|---|---|---|---|---|
| s-4c19 | eBay US | 2026-07-24 | 2026-07-30 | title | live |
| s-8b70 | eBay UK | 2026-07-28 | 2026-07-30 | image | live |
| s-1f52 | eBay DE | 2026-07-30 | 2026-07-30 | title | live |
| s-4c19 | eBay US | 2026-06-02 | 2026-06-19 | title | ended |
Sightings are seller-entered and unverified until a collision review runs. The same handle appearing twice is a relisting, not a second slab — the table shows the observation, and the wording never converts it into an accusation.
Empty state
11 · Components · structure
Numbered ledger rows · .steps
Fact rows · .facts
Hairline rule above · .rule
Strong ink rule above · .rule-strong
Disclosure · .qa
Error state · the lookup itself failed
12 · The three hero screens
Same tokens, same components, no new pieces. This is the canvas that matters: a phone held at a counter, one hand, bright ambient light.
Check a cert number before you pay.
Scan the slab
or type the number
Seen on other live listings. A graded slab is one physical item. Our last sweep saw this number on three then-active listings from different sellers — likeliest one seller's photo reused. Confirm which copy PSA sealed first.
| Seller | Market | First seen |
|---|---|---|
| s-4c19 | eBay US | 07-24 |
| s-8b70 | eBay UK | 07-28 |
| s-1f52 | eBay DE | 07-30 |
Opened PSA's page? Log what you saw.
Capture · shot 2 of 3
Glare on the slab.
Tilt the slab a few degrees or step out of direct light — a bright hotspot is hiding part of the surface.
shot labelglare 6.4%bar ≤1.0%
Nothing is locked — the check runs after a shot arrives, so it can advise and ask again, not stop you mid-shot. No verdict is produced from a shot that didn't clear the bar.