Cade · design system · Oct 2026

Loud art.
Quiet UI.

v2 · their handoff + cade.market + ours
01

Four voices

Shout
Call it.
Barlow Cond 800 Italic
128 · 96 · 64 · 44
Call
Predict now · Sports · Live
Futura PT Cond Medium Obl.
32 · 24 · 20 · 14
Read
Short markets on live games. Pick a side before the next play.
Futura PT Book · Demi
20 · 17 · 14 · floor 13
Data
64% · 02:14 · $24.6K
JetBrains Mono 700 · 800
tabular · floor 12
Kicker
Meme Madness · What's next
Barlow Cond 600
15 · 13 · tracked .08em

Headline treatments

That's a wrap.
On dark · drop .06em
Live sports.
On art · 1px keyline + drop
Your pick.
Ink on light · one clean pass
HigherLabel on colour · double print 1.5px
02

Colour by role

Ground
Page#0E0D0C
Raised#161514
Overlay#1A1816
Paper#EFE9D8
Brand
Orange#FFA800
Orange deep#FF7A00
Violet#9652EF
Violet deep#6330D3
Violet ink#210D49
Outcome
Yes · up#91BB4F
Yes dark#3C8214
No · down#EA2A46
No dark#B21229
Signal
Yellow · sign in#FAF424
Info · sports#419FE5
Text
Primary#EFE9D8
Secondary#A1A1A1
Tertiary#8773AF
Border#343434
Yellow commitsPredict, confirm, claim.
Orange navigatesSee, open, load more.
Red alarmsErrors, live, retry.
Category is not a colourGlyph + label. Tone = mechanic.
03

Hard shadows

2hairline
3chip
4plate
5panel
8band
11hero
Zero blurOffset only. Black.
One shadowA plate carries its own. Never add a second.
No 6 or 7Off the ladder.
04

Two families

Product · dark notched

Arcade · torn stickers

Torn panel
Label banner
Banner
Modal panel
Burst
Champion burst
Value plate
Rules panel
Dark for productPanels, cards, CTAs.
Stickers for momentsBadges, toasts, stamps, kickers.
One loud shapePer section.
Odd prime bursts13 face, 11 halo.
Quiet plate

Their shape package · 24

frontend-v1/packages/shapes · code names · port, never redraw

Panels · 5
panelTorn495x197
panelTornB495x138
panelInput479x70
panelPnl762x241
panelDropdown162x183
Tabs, pills, buttons · 7
tab173x70
tabFilter187x62
pill178x55
buttonAmount163x67
buttonParallelogram167x53
buttonTime250x133
buttonLoadMore121x50
Starbursts · 3
starburst460x263
starburstTimer212x165
chevron485x307
Banners, ribbons, rows · 5
banner362x92
ribbonTicker1857x124
oddsHalf99x42
plateCell213x82
plateName367x82
Badges, glyphs · 3
badgeHex73x85
glyphCloseX29x29
plateLogoBox64x62
Curved · 1
scoreboard701x153

More of their surfaces

Label column
Section heading plate
05

Effects

Halftone · decaying field
Halftone · light
Rays · 20 spokes
Burst · 13 points
Sparkle · 5 points
Confetti · art only
Torn edge · art + hero
Lightning band
Duel gradient · bar only
Won
Ink masked to shape
+$25
Glow · chart markers only
Skeleton pulse

Motion

1200Live blink · step
150Hover lift · press
2800VS beat
280Clash burst
780Seam overshoot
1250Pool pulse
36sTicker marquee
600Pop in

Motion kit

Ported from Scotty's Remotion explainer (2026-10-02), timings measured frame by frame on the 60fps render · /lib/motion.css + /lib/motion.js (window.CadeMotion) · transform and opacity only · one prominent beat in view at a time

260Slam--cm-slam
240Stamp--cm-stamp
220 / 440Chip fall / whole drop--cm-fall --cm-drop
520 · 90Ring · gap, 3 rings--cm-ripple
300Tag pop--cm-pop
360Number roll--cm-roll
950Coin arc--cm-coin
240 / 260Shutter drop / lift--cm-shutter --cm-lift
18sGround glow drift--cm-glow
1200Ground tone fade--cm-tone
.34 1.56 .64 1Overshoot (back-out)--cm-ease-over
.55 0 1 .45Gravity in · settle out .16 1 .3 1--cm-ease-in --cm-ease-out
Go up?

slamIn

260ms · 1.55 to .94 to 1

Use it for: the selected shout line on a category switch, a section heading the first time it is on screen, a new ticker row. The streak is a clone that trails and fades. Video: the title words, about 270ms each.

already in place, no streak.

stamp

240ms · tilt · 2px knock

Use it for: a verdict on a plot. CLOSED yellow at the cut, HIGHER / YES WINS lime and LOWER / NO WINS red at the bell, VOID paper, TOO LATE orange. The rubber-stamp plate (.pnl-stamp), filled as in the video.

the stamp is placed, tilted, no slam or knock.

chipDrop + ripple + YOU

220 fall · 440 total · 3 x 520 rings

Use it for: your pick landing on the line at the entry point. Speed lines while it falls, squash on impact, one bounce, rings in the side's colour, then the YOU tag pops from the disc and follows it. Video: t=6.5 to 7.6 and t=12.8 to 13.6.

the disc and its YOU tag are simply there.

tag · youTag

300 pop · 560 bounce

Use it for: naming your own thing (YOU) and a refused late action (TOO LATE, it bounces and leaves after 1.6s). Their speech-bubble button (packages/shapes buttonTime), as a child of its target so it follows it.

the tag is shown, no pop or bounce.

rollNumber · paysPlate

360ms · ease out · 240 kick

Use it for: what your pick pays, one plate, only after a pick; the number rolls as the pool moves. Video: the YES PAYS plate, t=25 to 40.

the number is written, no roll.

shutter

240 drop · 260 lift

Use it for: the predictions cut. Faint slats over the plot (still readable) and the hazard band on its foot; CLOSED slams after it; it lifts at the bell. Video: t=39 to 43 and t=75.

placed and removed without travel.

coinBurst · coinRain

950ms arc · 7 coins

Use it for: a win, sparingly: a few gold coins tumble out of your chip once. coinRain (the video's t=14 to 17) is for an explainer, not a product page.

no coins; the WINS stamp carries the verdict.

speedLines

560ms · once

Use it for: one tension beat, behind art or a headline, never over data. Optional; the homepage does not use it. Video: t=23.

nothing is drawn.

ground

18s drift · 1200 tone fade

Use it for: the page background. Near-black, a vignette and one calm, low glow in a tone that can shift, placed behind the hero's art (at:[x%,y%]), never under copy; under 760 it steps out. No halftone since 2026-10-03 (Scotty and the owner: too many dots, the glow blobs sat over the text): dots are a component's accent, never a ground. It never moves on scroll. Video: the ground behind every shot, green at t=80.

the glow stands still; a tone change is immediate.

press

300ms · 2 rings

Use it for: the quick-predict bolt: a tiny chip drop on the icon and a small orange ripple. The bolt itself is their art, unchanged. Press it.

the press shows only its own lift and shadow.

Medallion hop

460ms · once per hover

Use it for: a card under the pointer; the identity medallion hops once, nothing else moves and the layout holds. Opt in with .cm-cards on an ancestor. Hover the card.

no hop.

The round, in order

pick · cut · bell

How the homepage strings them, one beat at a time: chipDrop + YOU, the pays plate, then shutter + CLOSED, then lift + WINS stamp + coins. Nothing loops but the ground glow, the LIVE bead and the chart halo.

each beat lands in its end state.

One decoration per bandNo rays or confetti over data.
No grainNo scanlines, no noise.
Reduced motionSettled frame, nothing hidden.
Their primitives
Halftone · dots
Halftone · edge
Ribbon segment
Ribbon seam
Ribbon row shadow
06

Actions

Commit · defaultPredict now
HoverPredict now
PressedPredict now
FocusPredict now
DisabledPaused
BusyPlacing
NavigateSee sports
AlarmRetry

Their buttons

Enter the battle
CTA slat
Higher
Slat · higher
Lower
Slat · lower
More
Load more
Close
Wallet
Menu
Sign in · nav
Pagination
Pick buttons
Yes / No
Yes / No · payout
CTA plate
Header plate · Sign In

Product pages: Sign In. Landing only: Get early access. One art slat in both, their CadeFixedArtButton (131 x 60: the black shadow path, the #FFA800 face on a 2px ink stroke), drawn by K.navLive's signIn slot: 188 x 86 at scale .6 on desktop, 157 x 72 at .65 in the phone bar; the long label takes the wide slot (310, the art stretched). Hover and focus press the face 2 / 3 into its shadow and the label follows; focus adds the 3px #FFA800 ring. Sign In opens the sign-in modal on desktop and /login/ on a phone (CadeSitemap.signIn).

07

Tabs and filters

Category rail
Slat tabs
Period pills
Sports tabs
Filter chips
Their tabs
Markets
Segmented lg
Activity
Segmented md
Rules
Market section
Selects
Volume
Sort
Sports
Type
Grid
View
Open
Context
Their nav
Nav item
Sports tab
Sports nav
Wallet · mobile
Category tiles

Their hero shortcut plate (HERO_CTA) as a tablist: selected fills with the tile tone; ink is dark on orange and yellow, white on violet (as their violet CTA). Wide on desktop, compact on the phone (a 44px hit band there). Arrow keys, Home and End move between tabs; o.controls sets aria-controls. /lib/category.js tile().

Board filter

Their SportsTab (.ntab) with the category's name and the count of markets the board shows for that tab (All is a mix of 8). No glyph on the filter: at tab size it read as a smudge (owner 2026-10-02); the label names the category. Each tab is named "Memecoins, 8 markets" for assistive tech (visually hidden text); o.controls points it at its board. Default All, then Memecoins, Sports, Stocks. /lib/category.js filter().

08

Badges and tags

Live
LIVE
Live tag · battle · bead blinks 1.2s
LIVESOON LIVE
Live feed
Feed head
LIVE
Inline
Status
Live Fair launch Awaiting result Settled Voided
Chips
$1.60M ABOVE$260K BELOW
PAYS ×1.66PAYS ×2.48IF HIGHER WINS$17.70
[04:32]
[04:32]
Timer inline
Stickers
New season
Kicker
Meme Madness kicker
#1
Rank ribbon
Won
Stamp · won
Badges
Star hex
Star
Bolt
Check
Step
Avatar
Up
Down
Flat
Medallion
Coin badge
Timer burst
Marks
MemecoinsSportsStocks
Category badges

The medallion family: every market's identity is their allstar CoinMedallion (octagon, orange ring). Memecoins carry the coin art; stocks the brand mark (Simple Icons 13, one colour) on the brand's face, or the ticker on ink when there is no mark (SPY); sports two smaller octagons in the team colours with the abbreviation (no team marks). The category glyphs (tabs, filter, shout) and their TeamBadge (game rows) stay. /lib/category.js mark(), medallion(), stockMed(), teamMed(), pairMed(), glyph().

09

Inputs

$25.00
Stake input
Search markets
Search
$10 · $50 · $100
Amount filter
Text area
Remember this device
Checkbox
Settle in USDC
Radio
Spinner
Spinner select
Duration picker
Phantom
Wallet option
Email signup
Board controls

Search and sort for a board (/markets): their SearchField and DropdownSelect (sort) silhouettes in the dark look, face #161514, the card's keyline, a hard black shadow; the keyline turns orange on focus and the 3px orange ring sits outside the plate. Real <input type=search> and <select>; the caret is their caret-down icon, no magnifier (none in their icon set). Then LOAD MORE: their landing CTA, orange because orange loads more, the label centred, no chevron; lift on hover, press sits on the shadow. /lib/category.js search(), sort(), more().

10

Data

Battle bar
LIVE
51.1%48.9%
Battle split · live

The battle bar above, recoloured to the market's two sides: the HIGHER / LOWER pool split on the landing demo card. One script, /lib/battle-split.js + .css. Each entry springs the seam, flashes the side that gained and pops its stake; a whale slams the starburst, swings the seam past its mark and shakes the bar; a lead change flies the banner; YOU pins the viewer's side; the VS burst counts the last ten seconds; at the bell the winner floods the track.

Live · a 30s loop: entries, whales, lead changes, the count and the bell
Your side · YOU pinned on higher
Tight · the thin side's number steps over the seam
Final seconds · the burst counts
The bell · lower floods the track
Split
Higher60%Lower40%50%50%
Round clock

04:12

1M market

Closed

Delayed

Countdown states
Ends in2m 0s
Final minute50s
ClosedSettled
Settlement delayed
Stats
19,915
Predictions
$69.2M
Wagered
+$1,204
P&L
Live chart

The round chart, one style on every page (landing, profile, homepage): the plot of their Wager Replay card (frontend-v1 meme-madness/components/replay/MemeMadnessWagerReplay.tsx). A smooth trace against the round's dashed yellow LINE, lime above and red below, cream until you hold a side, the crowd's entries on the curve, YOU at your entry, CLOSED at the bell. One script, /lib/replay-chart.js + .css.

Open · live round, entries pop on the curve, bigger stakes bigger
Open · up
Open · down
Final seconds · predictions close in 0:05
Predictions closed · 0:24 left
The bell · market ends in 0:06
Closed · the clock at 00:00
Your position · winning, the trace turns lime
Your position · losing, the trace turns red
Resolved · your pick won
Resolved lower · CLOSED at the bell
Odds sparkline
Live predictions band
[ Live predictions ]
DEGENMIKE$DOGEUP$1,204JUST NOW•7XK9…B3QA$PEPEDOWN$480JUST NOW•MOONPANDA$WIFUP$25012S AGO•KCFANKC -3.5YES$7520S AGO•0X9F…3ANVDAUP$2531S AGO•LAKESHOWLAL MLNO$14040S AGO•DEGENMIKE$DOGEUP$1,204JUST NOW•7XK9…B3QA$PEPEDOWN$480JUST NOW•MOONPANDA$WIFUP$25012S AGO•KCFANKC -3.5YES$7520S AGO•0X9F…3ANVDAUP$2531S AGO•LAKESHOWLAL MLNO$14040S AGO•
Activity rows
LIVE
MOONBOI
WILL $ANSEM CLOSE ABOVE THE LINE IN 1 MINUTE?
YES
$125
2MAGO
SETTLED
BLKNOIZ
WILL $TROLL CLOSE ABOVE THE LINE IN 3 MINUTES?
WINNING
SIDE
YES
5MAGO
CREATED
CADE
WILL NVDA CLOSE ABOVE THE LINE IN 5 MINUTES?
CREATED
CLICK
JUSTNOW
Their ribbons · art only
Leaderboard row
Stat strip
Summary bar
Compact
Progress
Podium
Champion
Runner up
Third
Charts
Odds
Price
Pool burst
Stat burst
Stat plates
$4.15B
Total volume wagered
14,188
Active players
510,798
Predictions
Market row
[00:44]
$12,400
[04:21]
$8,090
Market art
Seed band
Winner banner
Outcome slats
Question banner
Rules panel
Key / value
Live predictions ticker

Their CadeLandingTicker, mixing the three categories; each row carries its glyph. A labelled region with a visible PAUSE / PLAY control (WCAG 2.2.2, a text button, no drawn icon); it also pauses while off screen and stops under reduced motion. /lib/category.js ticker(), tickerToggle(), wireTicker().

Live predictions band

The ticker in its band, as a page places it: their CadeLandingFeed (FEED_FACE / FEED_SHADOW stretched to the box), the bolt badge, the [ LIVE PREDICTIONS ] kicker, the pause control. Under 720 it takes their phone band and drops the kicker. Used by /markets; /home draws the same band in its frame. /lib/category.js feed().

Tape item

Stocks: the ticker badge, the price, their vote bar and the share calling higher. /lib/category.js tape().

11

Feedback

Prediction placed
Toast · success
Market opens 20:30
Toast · info
Wallet rejected
Toast · error
Feed delayed 12s
Alert strip
Pool after fees
Tooltip
Nothing live
Empty
Modal
Sign in modal
Cookie banner · live

Loading

Skeleton, empty, unavailable · /lib/skeleton.* · the shape that loads is the shape that stays

Shimmer + tokens

Their only skeleton motion is Tailwind's animate-pulse: 2s, cubic-bezier(.4,0,.6,1), opacity 1 to .5 and back (the profile's page ticket pulses at 1.2s ease-in-out to .6). Reduced motion and ?static stop it: the ghost stays, still. All ink is the frame's paper #EFE9D8 at low alpha on the production ground #0E0D0C, black at .12 to .2 on a paper or coloured plate.

Primitives

SkeletonLine (a bar), SkeletonBlock (a plate, square here: theirs rounds 8px, the house does not), a ghost value on a paper plate, and the Foundation / Skeleton rule: no separate drawing, the plate's own silhouette flattened (CadeSkeleton.flatten(el), filter grayscale(1) brightness(0) invert(1) opacity(.14), children hidden).

Card + board

AllStarCardGhost on the homepage card's own box (400/310, 9cqw padding, the 24cqw identity band, the 720 branch), so a seat never reflows when its market lands: the medallion (octagon, as our medallion family), the clock chip, the question, the meta line, the split and the bolt. A board announces itself ONCE (one role=status); the seats are aria-hidden.

Hero

CadeLandingHeroSkeleton in flow: the panel is known, so it is drawn; copy that is static prints for real (pass it as kicker / lines); the LIVE lockup, the duel seats (their PANEL_INNER clips), the two stats and the three shortcut plates (the real HERO_CTA silhouette, stroked #4A4A4A) are ghosts. Under 720 the plates are not drawn, as their phone hero.

Chart + ticker

MarketLiveChart while its history loads: the real plate (DS_PANEL_CLIP, #111111 over a #0B0B0B 6/6 shadow) with their read, "Loading market history", the price rail and the time axis as bars. The live predictions band (FEED_FACE / their phone FEED_BAND) with the label and three runs as bars.

Rows + tickets

SoccerSkeletonRows (42 / 1fr / 48) for any list; ProfileTicketSkeleton for a prediction stub: its torn plate, the hex coin and three lines at white .10, the grey pending flap.

Status strip

AsyncStatus: loading and refreshing in the quiet tone, stale in orange, error in red, with a last-updated stamp and one action. For a read that is slow but already has something on screen.

Empty + unavailable

Three different claims, drawn differently. Loading: we do not know yet (a pulse). Empty: we know, and there is nothing (the dashed box, their .emptyBoard). Unavailable: we could not read it, which is not zero (the red read notice, role=alert, with Try again; the profile's red-titled plate). Values that failed to read stay as STILL ghosts, never a 0 or an em dash.

When it shows

A page opts in with <html data-sk> and loads /lib/skeleton.css + /lib/skeleton.js in its head, so the first paint already shows the ghosts. Each region has two twins: [data-sk-ghost] (the ghost) and [data-sk-real] (the content). The page builds its content, then calls CadeSkeleton.gate().ready(dataPromise): the ghost holds until the data, the fonts and every image in the real content are in (capped at 8s). Past 300ms the content fades in over 180ms; under, it swaps at once. Review: ?loading=1 holds the ghost, ?loading=2500 holds it 2.5s, ?state=empty / ?state=unavailable draw the other states.

<!-- head -->
<html lang="en" data-sk> … <link rel="stylesheet" href="/lib/skeleton.css"><script src="/lib/skeleton.js"></script>

<!-- a board: the ghost twin first, the real one after -->
<div id="boardG" data-sk-ghost></div><div id="board" class="your-grid" data-sk-real></div>

// JS: paint the ghosts first, then the page, then open the gate
const SK = window.CadeSkeleton;
boardG.innerHTML = SK.boardGhost(8, { cols: 4, label: 'Loading the markets board.' });
heroG.innerHTML  = SK.heroGhost({ kicker: 'Live now', lines: ['Call it.', 'Get paid.'] });
chartG.innerHTML = SK.chartGhost({ height: 380 });
feedG.innerHTML  = SK.tickerGhost();
oneSeat.innerHTML = SK.cardGhost();            // one card's seat, e.g. while a single market refreshes
SK.gate().ready(fetchMarkets());               // or .ready() when the data is local
if (SK.query.state === 'empty') board.innerHTML = SK.empty({ title: 'Nothing live', copy: '…' });
12

Cards

Hero
Sports · live now

Call the
next play.

Short markets on every drive. Pick a side before the snap.

MarketCard · memecoin
3 minutes01:50

Will $POPCAT close higher?

Mcap $412.8MPool size $140,500
Higher60%Lower40%
MarketCard · sports
Q308:41

Run or pass on the next snap?

KC 17 BUF 14Pool size $8,140
Run41%Pass59%
MarketCard · stock
NVDA1 hour42:10

Will $NVDA close above $182?

Price $181.40Pool size $22,900
Above55%Below45%

Card states

Open
D3 minutes01:50

Will $DOGE close higher?

Mcap $24.6BPool size $140,500
Higher60%Lower40%
No predictions yet
D3 minutes03:00

Will $DOGE close higher?

Mcap $24.6BPool size $0
Higher50%Lower50%
Closed round
PNext roundSoon

Will $PEPE close higher?

Mcap $4.9BPool size $105,130
Higher60%Lower40%
Pending seat
SNext roundSoon

Will $SOL close higher?

Pool size $0
Higher50%Lower50%
Loading
S

 

Event
Day 1 · Sep 14

Troll beat Fartcoin

19,915
Predictions
$69.2M
Wagered
Step
1.Pick a marketCoins, games or stocks. One tap.
Promo
What's next

Live sports.

Call the next play, not just the game.

Confirmation
Your pick
$Troll · Higher
$5.00
Their MarketCard · grid
Rail
Prediction history
Outcome
Vote card
Battle recap card

Day 5 · Sep 18

DEGEN beat GME

55,892Predictions
$348.6mWagered
2,511Players
4,178Markets
Record day

Day 8 · Sep 21

NVDA beat MOO

126,279Predictions
$1.20BWagered
7,244Players
4,195Markets
PnL card · shipped
WON

$ANSEM

HIGHER

[5 MIN MARKET]
REALIZED PNL+$172

ENTRY $200 · PAID ×1.86

JOINcade.market
Ticket · pick locked in
Their plates
Profile header
Copy / share
All Stars card · three categories

Their MemeMadnessAllStarCard silhouette, chip, split and bolt, in the default look (dark). Ours: ONE identity slot, the medallion family (coin art, the brand mark on the brand's face, two team octagons), more air (padding 9cqw; on /home 36 between cards, 44 between rows), no category tag (the chip already says it; the tag now speaks only for a state), POOL instead of POOL SIZE. One fixed identity band, so questions in a row share a line. The pool is compact ($64.2K). The whole card is the link, the bolt is its own control (named "Quick predict: get early access", a paper focus ring on the dark faces, black on cream), the split is not a side picker. Hover: their translateY(-4px), and the keyline steps up one tone. /lib/category.js card(), mark().

All Stars card · looks

One card, three looks, set by data-look on the card, the board or any ancestor (on /home: ?look=dark | cream | edge). Dark (default): the hero panel's face #1A1816, a #2E2A26 keyline, paper type; the yellow clock and the green / red split are the only colour, so the board blends with the page. Cream: their paper cleaned to #F3EEE1 with ink #141414 and a real black keyline. Edge: the arena panels' material (#161514) with the keyline in the category tone at rest 55%, full on hover. Hover shown on the second card of each look.

All Stars card · states

Loading never shows invented numbers; unavailable is not zero. Long names ellipsize on one line.

Phone board

Their CadeLandingMobileAllStarBoard, in the default look (dark): rows lead with the market's medallion and its clock as the card's yellow chip in small (sports keep the period), then the question, the market's metric and the pool; 44px price buttons and filter tabs, labels floored at 10px. Price buttons: their colours and 54 x 44 size, the shape calmed to the approved parallelogram (a 6px lean, a thin ink keyline, a 2px hard shadow). The filter names every category in full (MEMECOINS, never COINS); its tabs size to their words. On /home the rows are 120px at 390 (theirs 94). /lib/category.js board(), row().

Round pick

The featured round's two picks on /home, phone and desktop alike: a calm diagonal plate, the parallelogram approved for the /landing/v2 pill (M12 1H189L178 64H1Z), in the outcome colour (green with ink, red with white), a 1.5px ink keyline and a 3px hard shadow; the label in the SHOUT voice. At least 44px tall (a 44px hit band below that). Hover lifts 2px, press and the held pick sit down on the shadow (aria-pressed), the side not taken steps back (aria-disabled). Sports say YES / NO. Replaces their heavier notched CTA plate here (owner 2026-10-02: in our style, not too much shape). /lib/category.js pick().

Section head

Their homepage section heading: the orange star, the SHOUT title in paper, a quiet mono count. One part for every board page (/markets uses it as its h1, sized by --ch-fs). /lib/category.js heading().

Round sheet

A memecoin or stock market opened in place (the preview has no market page): a modal dialog on a dimmed ground with no panel of its own, so the live chart's plate is the one box. The medallion, the question, the yellow clock chip and two metrics, their live chart (/lib/live-chart.js), the split, the two round picks; a pick opens early access. Escape, the backdrop and Close dismiss it; focus returns to the card. Shown here inline and still. /lib/category.js sheet().

Head to head · per category

Their CadeLandingCoinPlate on hero-plate-orange / violet: a coin medallion, a team badge or a ticker badge, with their odds chips. Desktop, arena and phone geometry. /lib/category.js duel().

Category hero

The top of a category's board, one part per filter (/lib/category.js hero(), styles in category.css): memecoins and stocks carry the shout, the line, the stats, their head to head (DOGE vs PEPE, bulls vs bears on $NVDA) and the category's live round; sports is compact, the door to /sports/ beside the featured game; All opens the three categories by their tiles with the live counts. Swapped with the board filter on /markets with one slam. Shown here in ?static.

Brand accents · from the explainer

Demo · DOGE · 1-minute round

Real-time predictions,
only on cade.market

Used sparingly, never as decoration (/lib/category.css 23). The question plate (.ci-qplate) from Scotty's explainer carries a section's kicker: the round's kicker on /home and /sports, the code on 404 / 500, the rules' lead line; its padding is paid back by negative margins, so nothing moves. The hazard tape (.ci-hazard, the CLOSED shutter's band) marks an empty board (CadeSkeleton.empty). The end card's line sits under the mark in the shared footer.

Round · price chart

One live round, one implementation (/lib/category.js round()) for /home, the category heroes and the /sports featured market: our chart (/lib/replay-chart.js, price:true: the smooth line, the dashed yellow LINE, lime above and red below, the live value at the tip, the vs-line readout, the clock), the two round picks that drop the YOU chip, what each side pays under its pick, the note, Pool / Closes / Settles on; the shutter and CLOSED at the cut, the outcome stamp on the picks at the bell. Wide from 760: the copy and picks left, the chart right. The first runs live; the phone one is still.

Live predictions band · pause

Their CadeLandingFeed band around the ticker. The pause is inside the band, before its arrow-cut end: no plate (it sat box in box on the cut, owner 2026-10-02), the band's own type in the quiet ink after a hairline, the word saying the action (PAUSE / PLAY), the hit area 44px tall. /home, /markets and /sports share it.

Market page · duel frame

The single market page's parts (/market/?m=DOGE), ported from their duel-frame (MarketDuelPanel, MarketPredictTicket, MarketActivityPanel, MarketTermsPanel, the coin-empty panel): the torn plate and rail card (DS_PANEL_CLIP, compact tear under 1080), the chrome row with the lane tabs (the shared .cfilter / .ntab), the header with the round clock, the MARKET CAP / PRICE reading and its delta plate, the volumes, MARKET ACTIVITY, the ticket (their QuickPredictControls, .qp-*), YOUR POSITIONS, MARKET TERMS, the no-live-market panel. Ours: no FOMO link, fixed stake chips ($10 / $50 / $100, their fixed-usd preset), "--" where theirs prints an em dash. /lib/duel-frame.js + .css.

13

Sports

Scoreboard · ours

The game's two teams as medallions (the NFL in the house helmets, the art of the sports duel; the NBA as team octagons, colour and abbreviation), the score in DATA, the period on the card's yellow clock chip. No plate of its own (/lib/category.js scoreboard(), clock()). The /sports hero and the sports hero on /markets use it.

Sports lobby parts
Scoreboards
Football
Soccer
Baseball
Hockey
Tennis
MMA
Fields
Gridiron
Court
Pitch
Diamond
Rink
Ours
Perspective gridiron · /football
Perspective court · /basketball
Game centre statesFull size

/football · scheduled, live, halftime, final, feed lost · what the feed drives · the run in four frames · how a play is drawn · the play, timed · in their tokens

Live court statesFull size

/basketball · scheduled, live, halftime, final, feed lost · what the feed drives · the shot in four frames · how a shot is drawn · the shot, timed · in their tokens

Panels
Stat bar
Match stats
Live game burst
Team badge
Match log
Feed rail
MMA fight stats
Tale of the tape
Strike zone
Game row

Ours, from their parts: two team badges, the score, the win odds on the welded split. Each row opens its game centre. /lib/category.js gameRow().

Sports lobby

The /sports/ parts, /lib/sports.js (CadeSports) + /lib/sports.css, no new shapes: the game card on the All Stars shell in its five states (live, halftime, feed delayed, final; scheduled lives in the schedule row), the league tabs (the board filter, leagues not live yet disabled with Soon), the schedule and calls rows of their board, the playoff teaser on their team badges, the round steps, and the featured live game (their MatchScoreboard, the gameday field, MarketOddsSparkline, the Yes / No picks) on DS_PANEL_CLIP.

14

Brand

Wordmark
C mark
PFP orange
PFP violet
Banner v1
Banner v3
Banner v4

Banners · every colourway

Banner v1 · violet
Banner v2 · dark
Banner v2 · violet
Banner v3 · orange
Banner v4 · orange

App icon and social

App icon
OG · site
OG · markets
OG · leaderboard
OG · profile
OG · document
Legacy kit · Pumpcade v126 families · 75 files · reads PUMPCADE, not for new screens
Logos
brush hand lettered stylesingle
horizontal lockup wordmark onlysingle
one color black versionsingle
one color white reversedsingle
outlined versionsingle
primary wordmarksingle
primary wordmark black onorangewhite
primary wordmark orange onblack
Icons
p play markoutline
p play mark app icon simplifiedsingle
p play mark black onorange
p play mark solidblack
p play mark sticker cutsingle
p play mark white onblack
15

Patterns

Header
Section heading

Daily Titles

Aug 20

The Board

Podium
Leaderboard rows
Your rank#214 · 204 from top 10
Ranks 4 and up
Title cards

Biggest single win

The Smasher

Not awarded

Payout

–

Most predictions

The Grinder

Not awarded

Picks

–
Profile hero

gnarzilla

BbsQ…pk2C

Net P&L

$0.00

Predictions

2

Win rate

50%1W · 1L

Volume

$400.00

Best call

$150.00
Prediction rows
Won
Refunded
Loss
Pending
Period + scope pills
Footer

Real-time predictions,
only on cade.market

Sign up for email updates. Unsubscribe anytime.

© 2026 Cade Market. All rights reserved.

Prediction markets and interactive gaming are regulated differently across jurisdictions and may be prohibited in some locations. You are responsible for ensuring that your use of Cade Market is permitted where you are located.

Disclaimer: Cade Market is a prediction market platform operated by Box Car Racer Holdings (Company registration No. 054288344). Box Car Racer Holdings is licensed by the National Lottery Authority of Liberia under License No. 739/2026/OG.

Cade Market is operated by Box Car Racer Holdings, Company registration No. 054288344, registered address: Montserrado, #51, Monrovia City, Hotel Africa, Liberia.

National Lottery Authority of LiberiaVerify NLA licenseNLA Liberia
Header · house, every final page
Section head · landing

[ 01 · The receipts ]

Eight days. Eight battles.

Footer · house, every final page
Header · product, desktop
1440, scaled to the column · Sports current
1:1 · the item row, centred

K.productNav(host) on every page except the landing: K.navLive with the five items from CadeSitemap.NAV (Home · Memecoins · Sports · Stocks · Leaderboard), no gift, Sign In on the right. The current item (CadeSitemap.current(location), never set by hand) wears their cream plate: #F0EAD9 face, 2px ink keyline, ink label, aria-current="page". Transparent at the top of a page, the black band and dot field once it scrolls (.stuck). 961 to 1180 the row tightens to 26px type, 26px gaps. Below 961 the phone bar and the tab bar take over (next). Click Sign In: the real modal.

Tab bar + MORE · phone

The page

Live · tap MORE

The page

MORE open · on Leaderboard

Below 961: K.tabBar(), mounted by K.productNav on <body>. Their MobileAppBottomNav: 61px, #000 ground, a 2px rgb(52 52 52) top rule; Home · Memecoins · the raised C-mark centre (the live board) · Sports · MORE, glyphs only (the label is the aria-label). Current slot: #FFA800 glyph + a 2px #FFA800 top rule; the centre turns #FFA800 with an ink C. MORE opens their MobileNavMoreSheet: the torn top edge, grabber, KEEP EXPLORING / MORE FROM CADE, rows for Stocks, Leaderboard, Profile, How it works, Terms, Privacy Policy, and the Sign In slat pinned at the foot. Focus trap, Escape, backdrop and the close square shut it; focus returns to MORE. The top bar keeps the mark and Sign In, no hamburger. Here both are drawn inside a phone frame.

Sign In · modal + page
Modal · desktop, CadeSignIn.open()
Page · /login/, CadeSignIn.render()
Phone · /login/ at 390

lib/signin.js + lib/signin.css, a 1:1 port of their app/login AuthPage: the warm-paper ticket (#F0EAD9) with its torn clip and side dot fields, the red close square, the black CADE mark, SIGN IN over CONNECT WITH EMAIL OR GOOGLE, the orange email slat and the cream Google slat, New to Cade? Create account (early access), the dotted rule, POWERED BY PRIVY. Desktop (961 and up) opens it as a modal in place over rgba(0,0,0,.58): focus trap, Escape, a click outside closes, focus returns to the opener. A phone goes to /login/?returnTo=<path>: the same ticket as a page, no clip, --auth-unit 1.25px. Both are live: walk the email path.

Sign In · email path

The states, each drawn by CadeSignIn.render() and stepped by its own controls (at --auth-unit .9px to fit the column; live at 1.5px desktop, 1.25px phone). Sign in with email opens the email step; Send link checks the address (an invalid one gets the red keyline and ENTER A VALID EMAIL ADDRESS), the slat goes busy (signin.css [data-busy=true]: grey edge, #d8d6d3 face, the glyph at 42%) while it sends, then CHECK YOUR EMAIL with the green tick, Use a different email and Resend link. This is a preview with no backend: Continue with Google shows their recovery note (a 3px #FF5A1F rule) instead of leaving.

System pages · 404 + 500

404

This page never made the board. Memecoins, sports and stocks are live back home.

Return home

500

That one is on us, not you. Nothing you did broke it. Take another swing.

Phone · the 404 at 390

lib/system-pages.css (.sp-status), their ArcadeErrorPage: the landing hero's torn panel (shadow, face and outline art in /assets/status/), the conic rays behind the headline, the code chip ([ 404 ] orange, [ 500 ] the soft red #F24B61), the double-printed Barlow 800 italic line, one line of Futura PT, ONE orange slat (Return home on the 404; Try again on the 500, which goes back to the page that failed or reloads). The product header and footer stay on, so there is no second button. The panel scales with its container (100cqw / 960); below 720 it takes the phone sizes. Pages: /404.html, /500/.

Rules page · /rules/
Phone · /rules/ at 390

lib/system-pages.css (.sp-legal), the construction of their LegalDocument (/official-rules, /terms, /privacy-policy): Back to Cade, one black article on a 1px #27272A keyline, the title in Futura PT Cond over a 2px #FFA800 rule, the date line, the JetBrains Mono table of contents in orange, numbered headings on hairlines, bold lead terms, the zinc table (scrolls inside itself below 620px). Gutters 16 / 24 / 32 at 640 and 1024, the article 20 / 40 / 56. An excerpt here; the page is /rules/.

Explainer cabinet · ours, owner approved

Ours, owner approved 2026-10-03 ("un frame bun, ceva creativ, ceva cade"): the one piece where a new illustrated object is allowed. A vertical explainer plays as the screen of an illustrated Cade arcade cabinet (Cade, the Prediction Arcade), one implementation: CadeExplainer.mount(figure, VIDEO) in lib/explainer.js, dressed by lib/explainer.css; used by /landing/v3/ How it works. The cabinet is one inline SVG on a 400 x 750 grid (marquee, violet rails, bezel, control deck, a short lower body with their starburst and a small coin door; trimmed from 400 x 850 on 2026-10-03 so it fits one 1280 x 800 screen), ink outlines, a hard shadow. On it, house parts only: the CADE display mark lit on the marquee, a CRT glass over the video, the big PLAY plate (HERO_CTA), the split bar lit on the screen's lip as the progress (lime watched, red to come; a range input over it seeks; chapter notches named on hover / focus), two real arcade buttons (green plays / pauses, red turns the sound on / off, both at least 44px), the MarketCard clock chip stuck on the deck counting the video down, their speech bubble YOU, the kit's coins, their starburst as one soft beat of light behind. States: data-state poster, playing, paused and data-sound on, off; nothing changes size between them. Lazy (loads within 600px of the screen), muted autoplay while half in view, pauses off screen, reduced motion and ?static wait on the poster with the big PLAY plate (it starts with sound). No LIVE tag, no INSERT PICK, no caption plate (owner, 2026-10-03): the caption and note are read out as the video's aria-label. The chapter under the playhead is set as data-chapter on the figure and sent as an xf:chapter event, so a page can light its own steps in sync (/landing/v3/ lights its 1, 2, 3). This specimen plays the landing's own files.

16

Icons

31 glyphs · 32 grid · theirs, 1:1 · click to copy

alertSVG
arrow-downSVG
arrow-upSVG
boltSVG
burstSVG
caret-downSVG
caret-upSVG
checkSVG
chevron-downSVG
chevron-rightSVG
clockSVG
closeSVG
copySVG
dotSVG
hexagonSVG
lockSVG
medalSVG
menuSVG
octagonSVG
personSVG
refreshSVG
ribbonSVG
shareSVG
sparkSVG
starSVG
trend-downSVG
trend-flatSVG
trend-upSVG
trophySVG
versusSVG
walletSVG
17

Layout

Their GridOverlay, 1:1 · ds-tokens dsGrid

Desktop 1440 · 12 col · margin 40 · gutter 24
123456789101112
Mobile 480 · 4 col · margin 18 · gutter 16
1234
1180Below it, the stage becomes a column.
660Phone stage cap.
16Phone side gutter. No sideways scroll.
8 floorNothing renders under 8px, 390 to 2560.
18

Handover

Take the tokens

Same part, two names

PartOursTheirs
MarketCard.mcard · lib/marketcard.jsMemeMadnessAllStarCard
Split bar.ssbmarket/ShareSplitBar
Battle bar.raceVolumeRaceBar
LIVE tag.livetagbadges/LiveTag
Status badge.notchbadges/StatusBadge
Buttons, plates.shape[data-s]CadeLandingShapes
Focusoutline 3 #FFA800 +3cade-landing .hit
NavK.nav()NavItem · WalletButton
Category railcatRail()SportsTab
GridirongridironP()playfieldviz-gridiron
Event slateventSlat()SoccerEventPanel
Pick slabspickSlab()SlatButton
Clip shapeschapter 04packages/shapes

Sources