billyhunt.com

Lisa

v0.1

Ink does the talking. The rainbow does the shouting. Shadows by day, glow by night.

Lisa is a neon, 90s-school-supplies design system with two modes, Day and Dusk. Every value on this page comes from one set of tokens, the same ones in lisa.css. Flip the mode switch and only the tokens change. The rulebook explains why; tokens.json has the same values for design tools.

Principles

Six rules. When in doubt, these win.

1

Neon is a fill.

By Day it never carries text. By Dusk it may, because every fill passes 4.5:1 on Midnight.

2

Ink does the talking.

One text colour, one muted, one accent for links. That is all the coloured text there is.

3

Every edge is 3px.

Borders, rules, outlines and shapes. It keeps the neon from melting together, and it keeps working when colour drops out.

4

Shadows by day, glow by night.

Depth is the one token that changes shape between modes. Everything else only swaps colour.

5

Tilt one thing per view.

A sticker, a badge, a burst. Two tilted things and the page looks dropped.

6

One job per shape.

Two buttons, two toggles, a badge, an avatar, a tile and one unicorn. Shapes never swap jobs.

Colour

Seventeen tokens. Same names in both modes; the values swap.

--bgPage groundDay Paper #FFFFFF
Dusk Midnight #160B2B
--surfaceCards, wells, table headsDay Lilac #F6F1FF
Dusk Dusk #24123F
--textBody textDay Ink #14001F
Dusk Starlight #F6EEFF
--text-mutedSecondary text, metadataDay Smudge #5B4A66
Dusk Moonlight #B9A6D6
--borderEvery edge, 3pxDay Ink #14001F
Dusk Moonlight #B9A6D6
--accent-textLinks. The only coloured text.Day Berry #B5006A
Dusk Flamingo #FF4FD8
--on-fillText on any fillDay Ink #14001F
Dusk Midnight #160B2B
--ringFocus ringDay Violet #8A2BFF
Dusk Starlight #F6EEFF
--fill-1Primary action, errors, heartsDay Magenta #FF2DA0
Dusk Flamingo #FF4FD8
--fill-2Badges, warningsDay Tangerine #FF8A00
Dusk Sunset #FF9F45
--fill-3Notices, highlights, starsDay Lemon #FFE600
Dusk Lemon #FFE600
--fill-4SuccessDay Lime #39E61A
Dusk Lime #39E61A
--fill-5Selection, infoDay Cyan #00D4FF
Dusk Lagoon #3DE8FF
--fill-6Decoration onlyDay Violet #8A2BFF
Dusk Ultraviolet #9B5CFF
--code-bgCode wellsDay Ink #14001F
Dusk Void #0E061D
--code-textCode textDay Lemon #FFE600
Dusk Lemon #FFE600
--spectrumSlabs and focus frames. Top and bottom only.fill-1 → fill-6
Do · fill under ink

Due Friday reads at a glance.

Don't · neon text by Day

Lime on paper is 1.6:1. By Dusk, neon text is allowed: every fill passes 4.5:1 on Midnight.

Contrast · WCAG 2 · AA is 4.5:1, AAA is 7:1
PairWhereDayDusk
--text / --bgBody20.0 AAA16.7 AAA
--text / --surfaceCards18.1 AAA15.1 AAA
--text-muted / --bgSecondary text8.0 AAA8.5 AAA
--text-muted / --surfaceSecondary on cards7.2 AAA7.7 AAA
--accent-text / --bgLinks6.6 AA6.6 AA
--on-fill / --fill-1Primary buttons, errors5.9 AA6.6 AA
--on-fill / --fill-2Badges, warnings8.5 AAA9.2 AAA
--on-fill / --fill-3Notices15.8 AAA14.8 AAA
--on-fill / --fill-4Success11.9 AAA11.2 AAA
--on-fill / --fill-5Selection11.3 AAA12.7 AAA
--on-fill-6 / --fill-6Violet (avoid text)5.4 AA4.8 AA
--code-text / --code-bgCode15.8 AAA15.6 AAA
--ring / --bgFocus (needs 3:1)5.4 pass16.7 pass

--fill-6 by Day is the one exception: ink on violet is 3.7:1, so violet takes white text (--on-fill-6). Keep words off it.

Type

Three families, seven sizes. Display is always capitals.

Bungee--font-display · 400

Headings and short shouts. Capitals, tight leading, 24px and up.

Nunito--font-body · 400 / 700 / 900

Body and UI. Rounded terminals keep the loud parts friendly.

Space Mono--font-mono · 400 / 700

Labels, tokens, metadata and code. 12px capitals, +0.08em.

--text-display · 88Lisa
--text-h1 · 48Heading one
--text-h2 · 30Heading two
--text-h3 · 22Heading three, Nunito 900
--text-body · 17Body copy at 17 on 1.6. Rounded, friendly, readable all day.
--text-sm · 15Small text for captions and helper lines.
--text-label · 12Label · mono caps

Space

Eight steps on a 4px base. Nothing in between.

--space-1 · 4px
Icon to label
--space-2 · 8px
Chip padding, tight gaps
--space-3 · 12px
Button padding, top and bottom
--space-4 · 16px
Card padding, list gaps
--space-5 · 24px
Button padding at the sides, grid gaps
--space-6 · 32px
Between groups
--space-7 · 48px
Header padding
--space-8 · 64px
Between sections

Shape & depth

Round corners, hard edges. Depth is the only thing that changes with mode.

--radius 14 · -sm 10 · -pill 999
--rule 3 · -heavy 6 · --slab 16
--depth · ink by Day, glow by Dusk
--tilt −6° · one per view

Shapes

Two kinds: decoration, and fat shapes that do a job.

Decoration · headers, margins, empty states. Never in data, never as action icons.
Star
Heart
Sparkle
Bolt
Burst
Rainbow
Squiggle
Fat shapes · one job each. The dashed box is the safe area: text lives inside it.
Cloud pillButton · ≤ 16 chars

Most text buttons. Min height 48. Dense UI and long labels use the plain pill.

Fat heartToggle · count ≤ 4

Like, with its count inside. Min 64 wide.

Chubby starToggle · icon only

Favorite. Min 56. The smallest safe area in the set.

Soft burstBadge · ≤ 4 chars

Counters, NEW, stamps. Never clickable; it rides on something that is.

Puffy sparkleAvatar · 2 initials

People. Min 48.

Puffy tilePick one · title + 1 line

Category pickers and launchers.

Fat unicornHero button · ≤ 14 chars

The mascot, and the one hero button. The label sits on the belly. Once per product: "Surprise me", "Start", "Let's go".

Min 200 wide; smaller and the horn and legs blur into a blob. Never a small icon.

Components

Real controls. Hover, press, Tab through them, click the toggles.

Buttons · cloud pill for most actions, plain pill for dense UI, unicorn once

States. Hover brightens the fill. Pressed drops --depth and shifts --press (3px). Focus draws a --ring that follows the outline. Disabled goes dashed and muted, with no depth.

Cloud pills are fixed sizes in v0.1. Long or translated labels use the plain pill until the cloud can stretch.

Toggles · heart and star
Badges & chips
Inbox12
DoneDraftLate
Folder card · the house container

Lab report

Due Friday · 3 pages
Alerts · sticker card · avatars
Heads up: 3 unsaved pages in this binder.
Couldn't sync. Check your connection and try again.
NEW 3 editing
Puffy tiles · pick one
Empty state · where the big shapes earn their keep
No binders yet

Start one and it shows up here.

Prose

Plain HTML inside .lisa-prose. Links are --accent-text; code is a dark well.

Keep the loud stuff in its lane

Colour carries state, never meaning on its own. Read the principles before adding a seventh neon, and highlight one phrase per block at most.

  • Spectrum slabs top and bottom only
  • One neon fill per component
  • One tilt per view
The rainbow is the border. Ink does the talking.
.button {
  background: var(--fill-1);
  color: var(--on-fill);
  border: var(--rule) solid var(--border);
  border-radius: var(--radius-pill);
  box-shadow: var(--depth-sm);
}

Use it

Four files. Link the stylesheet and the fonts, add class="lisa", and opt components in.

FileWhat it is
index.htmlThis page. Every token and component, live, in both modes.
README.mdThe rules and why they exist. Read it before designing anything new.
lisa.cssDrop-in stylesheet: tokens for Day and Dusk, .lisa-* components, prose, print. Inert until an element opts in.
tokens.jsonThe same tokens in the Design Tokens Community Group format, for design tools.
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Bungee&family=Nunito:wght@400;700;900&family=Space+Mono:wght@400;700&display=swap">
<link rel="stylesheet" href="lisa.css">

<body class="lisa">            <!-- Day, or Dusk when the OS is dark -->
<html data-theme="dusk">      <!-- force a mode: "day" or "dusk" -->

<button class="lisa-btn lisa-btn--primary">Save</button>
<div class="lisa-alert lisa-alert--notice" role="status">Saved.</div>

Mark & print

The wordmark, the icon, and what survives paper.

Lisa

The unicorn icon holds at 64px and up. At 32px it turns into a blob, so the favicon uses the sparkle.

Print

Always prints in Day. White ground; glows and the airbrush sky drop out. Fills stay under ink. The spectrum slab prints as a solid ink bar, and every shape keeps its 3px outline, so nothing depends on colour.