The soullinked styleguide

Every token and every component the site is built from, in every state — one page, zero one-off styles. Sample copy is in-world: runs, links, the blame board.

Brand

The broken-link mark is the only logo: teal is the link that holds, coral is the one that broke. Wordmark is the brand mono at 800 with a decorative indigo .io.

the broken-link mark (1:1 icon) the broken-link lockup (16:9) soullinked.io

Color tokens

From web/static/tokens.css — the single source of truth. Text/background pairs were AA-checked when the tokens landed; components never dilute them with opacity.

Brand

--brand-teal
--brand-coral
--brand-navy
--brand-ink
--brand-indigo

Surfaces

--surface-sunken
--surface-0
--surface-1
--surface-2
--line
--line-strong

Text

--text
--text-dim

Semantic

--ok
--danger
--warn
--info
--accent
--accent-2

Tints

--tint-ok
--tint-danger
--tint-warn
--tint-info
--tint-indigo

Type scale

System stacks only — zero font files, zero layout shift. Weights: 400 body, 700 emphasis, 800 display.

--fs-xs — one falls, all fall: that is the whole rulebook.

--fs-sm — one falls, all fall: that is the whole rulebook.

--fs-base — one falls, all fall: that is the whole rulebook.

--fs-md — one falls, all fall: that is the whole rulebook.

--fs-lg — one falls, all fall: that is the whole rulebook.

--fs-xl — one falls, all fall: that is the whole rulebook.

--fs-2xl — one falls, all fall: that is the whole rulebook.

--font-mono carries the wordmark, lobby codes, tokens, and stat figures.

Spacing

4px base. If a gap is not on this ruler, it is not a gap we use.

--sp-1
--sp-2
--sp-3
--sp-4
--sp-5
--sp-6
--sp-7

Buttons

Primary is teal (the intact link), danger is coral (the broken one). Tab to any of them for the :focus-visible ring; specimens toast so nothing on this page is dead.

Forms

Cards

A default card. Most page content lives inside one.

Eyebrow heading

.card-section fronts a labeled region — settings, rosters, the run list.

SL-EXAMPLE-0000-NEVER-A-REAL-TOKEN

.card-highlight is the token-reveal well: shown once, never stored, treated like it matters.

Status pills

Every pill is icon + text — color is never the only channel.

Lobby lifecycle

draftopenactivearchived

Encounter fates

caughtfaintedfledvoid

Link state

linkeddead

Privacy (always visible on run-scoped pages)

Private — members onlyCommunityPublic board

Stub phases

Opens in BetaPlanned for 1.x

Banners

Toasts

Announced via the aria-live region the shell ships on every page.

Summary tiles

12Runs played
84Career catches
7Links broken
5Routes burned

Board table

Horizontal scroll on phones; the player column goes sticky at 768px.

PlayerCaughtFellLinks brokenRoutes burnedBadges
Mara142105
Rook134325
Junei151016

Empty state

No runs live right now. Host one and the board wakes up.

Stub state

Rendered from the real ia.js registry entry for /graveyard — real route, honest phase line, a live cross-link, zero dead controls (STUB-STANDARD).

Graveyard

Opens in Beta

Every fallen mon gets a death card — lifespan, killer, last words. The graveyard remembers what the run cost.

Deaths already land on your run’s blame board → your runs

Identity chip

The cosmetic cache made visible: dot color rides data-color through SL.applyDataStyles.

Mara

Color picker

aria-pressed marks the selection; the ring is not just color.

QR / pairing block

Drawn by the dep-free encoder (qr.js asset). The code text is the accessible equivalent — the QR is progressive.

EXAMPLE
soullinked://pair/EXAMPLE

Codes last 5 minutes and work once.

Link-graph nodes

MARSHTOMP × LOMBRE TAILLOW × SHROOMISH ROUTE 103 — burned

Feed

  • Rook’s TAILLOW fell on Route 110 — the link took Mara’s SHROOMISH with it.
  • Mara caught WINGULL on Route 104. Link formed with Junei’s ZIGZAGOON.
  • Route 103 burned — the first encounter fled and the officials do not forget.

HP bars

role="meter"; the width is the [data-hp] CSSOM pass, the class carries the severity.

Tabs

Who broke the link, counted.

Dialog

The confirm() replacement for host actions.

Archive this run?

The board stays readable forever at its permanent /run link; the join code frees up for a new lobby.

Skeletons

Static under prefers-reduced-motion — the tokens.css kill switch, not a per-component courtesy.

Icons

The inline symbol sprite, 24×24 stroke glyphs on currentColor. Decorative by rule: always aria-hidden with text alongside.

lock
globe
users
link
broken-link
skull
crown
doc
external
download
menu
close

Player palette

The 8 — player-chosen cosmetics, frozen across the rebrand, and always paired with the player’s name text.

--player-1
--player-2
--player-3
--player-4
--player-5
--player-6
--player-7
--player-8

Breakpoints

Mobile-first at 360px; the only breakpoints are min-width: 768px and min-width: 1280px. If a layout needs a third, the layout is wrong.

Colophon

  • web/static/tokens.css — every color, size, and duration
  • web/static/app.css — the component library
  • web/static/app.js — the shared runtime (window.SL)
  • web/src/shell.js — the page shell
  • web/src/ia.js — the IA registry (nav, footer, stubs)

The broken-link mark is the only logo.