Skip to main content

ZapInto internals

The Design Framework

Every page on ZapInto answers to the rules on this page. They exist because consistency is a feature: when spacing, type and color behave the same way everywhere, players stop noticing the interface and keep noticing the game. This is a living document — rules are added when the owner rules, never before.

01Tokens

Seven colors, two themes. Five carry the daily work; warm cream and muted gold are rare accents — warmth and prestige, spent on special occasions. The palette is closed, but it is a palette, not a cage.

light theme

  • background#e5e5e5
  • foreground#333333
  • border#c5c5c5
  • light-text#636363
  • primary#C1571C
  • cream#f4e7b6rare
  • gold#b59a4frare

dark theme

  • background#151515
  • foreground#e5e5e5
  • border#353535
  • light-text#999999
  • primary#C1571C
  • cream#f4e7b6rare
  • gold#b59a4frare

02Type: Poppins speaks, Mono counts

Poppins is the voice — every word, label, heading and button. Space Mono exists for one job only: digits. Numbers, dates, counters, scores. If it can be read aloud as a word, it is not mono. Headings are weight 500 — the site speaks, it does not shout.

✓ Right

Best run 2,490 Volts · member since Jul 9, 2026

Words in Poppins, digits in mono.

✕ Wrong

Best run follows you forever

A sentence in mono — the retired habit this law exists to kill.

03Spacing: the 15px rhythm

Stacked full-width rows sit 15px apart. Sections pad 15px on every side, uniformly. Tight inline clusters (chips, icon rows) may use 10px. Nothing earns its size through empty space — a section too empty to fill is a section that needs more to say, not bigger digits.

One full-width row
Fifteen pixels later, the next
And the rhythm holds

04Buttons: 48px, outlined, weight 500

One button, one law: 48px tall, 2px text-color border, transparent body, uppercase Poppins at weight 500, filling on hover. Orange borders are reserved for the one special action of a surface — never more than one per view.

05The orange budget

Primary #C1571C is loud on purpose — emphasis is its whole job, and it should flash where it lands. The budget controls how often it lands, not how bright it is: the selected state, the one special action, a small point of emphasis. What it may not do is bleed — filling banners edge to edge, painting large numerals, framing whole sections. When everything flashes, nothing does. Cream and gold obey the same budget, at even lower frequency.

SelectedUnselectedrecord streak 26 — one small orange fact per surface is plenty.

06Backgrounds: the pattern library

Five named patterns, used one at a time, always subtle. Heroes may layer the ghost Z over a paper; content cards stay plain.

Plus-grid paper
Ruled paper
Gradient grid
Ghost Z
Hazard stripe

07Iconography: curated, never improvised

Icons are Google Material Symbols, each wrapped as a component with currentColor fill. The set is curated by the owner: when a design needs an icon that does not exist yet, it is requested and provided — never hand-drawn, never an emoji, never a unicode stand-in.

The complete set — every icon component in src/components/icons/, with the surfaces it appears on. One tile size for all, so the set reads as a set.

addDashboard
appleSign in & sign up
badgeDashboard
bar-chartnot placed yet
bellAdmin · Dashboard · Header +1
blockBilling
boltAdmin · Billing · Dashboard +3
burgerAdmin · Header
castleDashboard
center-focusZapMap arena
checkBilling · Dashboard · landing +1
chevron-downAdmin · Category page · Core page +7
chevron-rightBilling · Category page · Core page +12
claimDashboard · Game page
clockAdmin · Share
closeZapTrail
conquestDashboard · Design page · Profile
crownAdmin · Billing · Dashboard +1
daily-streakDashboard · Profile
delete-accountProfile
desktopProfile
diceDesign page · Header · games-offer
documentAdmin
editAdmin · Dashboard · Profile
exploreDashboard · ZapMap arena · territory-map-client
facebookSign in & sign up · Footer
googleSign in & sign up
grid-squaresAdmin · Billing · Header +1
homeBilling · Header · breadcrumb
how-to-playHeader
incomplete-circleZapTrail
infoAdmin
knowledgeDashboard · Profile
landscapeDashboard · Design page · Profile +1
leaderboardAdmin · Dashboard · Leaderboard
linkedinFooter
location-onZapFolio
lockDashboard · Game page · Profile +2
lock-outlinenot placed yet
logoBilling · Dashboard · Design page +9
mediaAdmin
mobileProfile
moonHeader · Play screens · ZapMap arena
musicAdmin (Music)
music-addnot placed yet
music-offnot placed yet
open-in-newShare
passwordProfile
pin-dropDashboard · ZapFolio
ravennot placed yet
recenterZapMap arena
replayGame page · ZapTrail
searchHeader · ZapMap arena · page +2
securityDashboard · Profile
settingsAdmin · Dashboard
shareShare
shield-heartDashboard (Streak Shield)
shuffleDesign page
skillDashboard · Profile
stacksAdmin · Design page · Billing
sunHeader · Play screens · ZapMap arena
tabletProfile
tiktokFooter
targetDashboard · ZapTrail
trail-markCategory page · Core page · page +1
up-arrowDashboard · ZapTrail
uploadProfile
userAdmin · Dashboard · Header +3
view-on-mapGame page
wallDashboard
walletBilling
xFooter

Seven more live with the play screens only (src/components/play/icons.tsx): back, check, x, yes-circle, no-circle, rotate, z-logo. They size themselves through the play screens' own scaling variables, which is why they stay local.

08Frames: border and shadow match

A framed surface pairs its border with an equal shadow: 2px border carries a 2px offset shadow, 4px carries 4px. Never mixed — a heavy throw under a thin line (or the reverse) is how a page starts feeling subtly wrong without anyone knowing why.

09Numbers earn their size

A digit's size must come from its meaning, not from empty space around it. Giant numerals that exist to fill a quiet section are a confession — the section needed more to say. Data gets mono, context gets sentences, and nothing on a page should need a telescope or produce vertigo.

The scale (ruled 2026-07-25): ONE hero figure per page at 40px max · secondary figures 2428px · tertiary 1618px. Donut numbers are drawn inside the graphic and scale with it — exempt from this scale (ruled 2026-07-31).

10Dates and chips are words

Mono is for pure digit tokens only. A date ("Jul 25, 2026") contains a word, so the whole date sets in Poppins. Status chips, mode tags and level pills (Castle, Quiz, ZapCore, Locked) are words in bordered slots — Poppins 500, uppercase, tracked — never mono, never improvised abbreviations when a real name fits ("Zapegory Level 1", not "GEN"). Exception (ruled 2026-07-31): map coordinates ("C:4") count as data tokens and set in mono, letter included.

11Empty sections don't advertise

A section with nothing in it shows its head and one honest sentence — and NO link to its full page, because an empty section's full page is an equally empty dead end. The link earns its place back with the first real row. Catalog pages that are never empty (the badge ladders) keep their links.

Pending rulings

Not yet law — listed here so nobody mistakes habit for rule:

  • The single shared Button component (the law exists above; the one-primitive consolidation is scheduled).
  • Carousel arrows: below-the-strip navigation (ZapFolio) vs side arrows (badge wall) — one language may win later.

Questions about a rule, or a page that seems to break one? Tell us — consistency bugs are bugs.