JoyfulSystems
Design system · v0.3 · Nov 3, 2026

The Joyful Systems brand.

How Joyful Systems looks, moves, sounds and talks. Every value on this page is read live from one file, shared/tokens.css, and the home page uses the same file, so the two always match.

Color

02 · Eight flavors

Eight bright flavors on a cool white console. The hues are always used at full strength. Depth comes from gloss and shadow, never from a darker hue. Click any swatch to copy its hex.

Neutrals

Proportion a typical screen

Paper
Plastic
Ink

Contrast WCAG 2, computed live

  • Text on a flavor is Ink. Ink passes AA on all eight flavors. The badges on each swatch show the live ratios.
  • White on a flavor is for large type (24px+, or 19px+ bold) on Blue only. No flavor passes AA for white body text.
  • Flavors are not text colors on white. Use them for fills, parts, rings and the wordmark insert.
  • Mute is for labels only: mono, uppercase, 11px and up, never for sentences. Use Slate for body copy on white.
  • Cyan is the cursor. Focus and hover rings default to Cyan, with a 3px white gap so the ring reads on any fill.
  • One flavor per surface. A channel takes its flavor as a full fill or as its ring, never both, and never two flavors mixed into a gradient.

Typography

03 · IBM Plex

IBM Plex Sans for everything people read. IBM Plex Mono for the system’s own voice: labels, the clock, counts and tags. The specimens below are live. Type in them and try the weights.

Aa
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 · ! ? & ( ) “ ” →
IBM Plex Sans · 400 · 500 · 600 · 700
Aa
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 · 12:41 · A1 A2 A3
IBM Plex Mono · 400 · 500 · 600

Scale

Display weight
Display--t-display
44–92 / 0.98 · 600
Make work play.
H2--t-h2
30–48 / 1.05 · 600
Founding principles
H3--t-h3
22 / 1.3 · 600
Flow is a sequence of decisions
Lead20 / 1.45 · 400
A small studio making humane, game-like software for the things that take real effort.
Body--t-body
18 / 1.5 · 400
Plain sentences. One idea each. You come away smarter, happier and more productive.
Small--t-small
14 / 1.5 · 400
Sound is off until you turn it on.
Label--t-label
12 mono · caps · +8%
Channel 01 · Message board · 7 rules
Clock44 mono · 500
12:41
  • 600 for headings, 400 to 500 for text. 700 only for single letters on parts.
  • Tight at the top: tracking −3.5% on Display, −2.5% on H2, 0 for body.
  • Sentence case for headings and buttons. Uppercase only in mono labels.
  • Measure: 34 to 60 characters per line for reading text.

Plastic parts

04 · Materials

The accent material. Chunky molded pieces, like parts still on the tree in a model kit. They add touch and play, but they never carry the message. The channels stay in charge.

How a part is made

1 · Flavor
2 · + Gloss
3 · + Part shadow
P4 · + Label

Primitives hover them

Y

Materials

Parts trayLabel on plastic
Parts tree (sprue)
Tray (recessed)
  • A part is a primitive: circle, pill, rounded square or cross, in one full-strength flavor.
  • One gloss, one shadow. --gloss on top and --part-shadow under. Never more layers, never a darker hue.
  • Labels on plastic are ink on a white chip, or ink on the part itself. Mono for part numbers (A1, A2…).
  • A parts tree is one flavor. It holds pieces of something still being made.
  • At most one tray and one parts tree per screen. Loose parts have real weight: they fall, stack and can be dragged.
  • Accent, not message. Parts sit beside the content, not behind headlines, and never replace a channel.

Channel tiles

05 · The home menu

The home screen is a menu of channels, like a console. Each tile is a glossy piece of white plastic that shows one thing and opens when you press it.

Anatomy

1234
  1. Shell: 16:10.5, radius 24, white plastic with a soft top gloss and --tile-shadow.
  2. Art: one flavor fill or one molded pictogram. Simple shapes, one idea.
  3. Name: Plex Sans 600, 17px, bottom left. Ink on light, white on Blue or Ink fills.
  4. Tag: mono label on a white pill, bottom right. A count or a status, never a sentence. Hidden on phones.

States try the last one

Principles
RestFlat, glossy, still.
Principles
Hover / focusLift to 1.045, 3px white gap, 4px ring in the channel’s flavor.
Principles
PressedSettle to 1.01 in 80ms, with a press cue.
LiveHover, focus and press it.

Grid

  • 4-up with 24px gutters on desktop, 2-up with 12px on phones, inside one glass console panel.
  • Every channel opens. Pressing shows a preview sheet with Menu and Start, like a console home screen.
  • One flavor per channel, as a fill or as its ring. Hovering a channel also tints the wordmark insert.
  • No empty slots and no teasers. Fill the grid with real channels. Leave out anything that isn’t ready to open.

Motion & sound

06 · Every press answers

Motion is quick and springy, like pressing a good button. Sound is a small set of synthesized cues tied to real actions. It is always off until someone turns it on.

Durations press to run

Easing

Out

Fast start, soft landing. Default for UI.

--e-out: cubic-bezier(.2,.9,.25,1)
Spring

A small overshoot. For things that pop: tiles, parts, the wordmark insert.

--e-spring: cubic-bezier(.34,1.56,.64,1)

Press

Scale to 0.98 in 80ms, then spring back

Sound opt-in

Sound is off. Turn it on to hear each cue. Nothing plays until you do.

  • Nothing longer than 300ms in interface motion. Ambient loops live only on brand surfaces.
  • Physics only in the parts tray. Gravity, light bounce, drag to throw. Everything else uses the curves above.
  • Sound is off by default and turns on only from a Sound switch. It never autoplays and never loops.
  • Cues map to mechanics, one each: hover, press, open, confirm, toggle, and a pop or thud when parts collide.
  • Reduced motion turns every loop and spring off; state changes become instant.
  • Quiet by design: one master gain, short envelopes, no cue over about 350ms.

Voice & tone

07 · Plain, colorful, delightful

We write the way the interface feels: clear first, bright second. The delight comes from what happens when you press, not from jokes in the copy.

Plain

Short sentences, one idea each, common words. Say what it is and what it does.

Colorful

Concrete and specific. Name the real thing: a channel, a part, a world, a character.

Delightful

Let the product carry the joy. Copy sets it up and gets out of the way.

Warm

No gushing, no “we’re so excited”, no hugs. Friendly, not sweet.

Witty

No puns, winks or jokes. If a line needs a laugh to work, rewrite it.

Hype

No “supercharge”, “unlock” or “revolutionize”. No exclamation points or emoji.

Do and don’t

Joyful Systems makes software that turns focused work into play.Hero line
Supercharge your productivity with gamified workflows!Hype, and “gamified”
Sound is off until you turn it on.Setting
Shhh 🤫 we’re keeping things quiet for now.Too cute
Seven rules everything we make follows.Channel preview
Our secret sauce, served with love.Warm and witty
Drag a piece. Tap to drop more.Tray hint
Go ahead, make it rain!Joke, exclamation
  • Sentence case everywhere except mono labels.
  • Numbers as numerals: 7 rules, 8 flavors, 1 letter.
  • Verbs on buttons: Read, Open, Start, Tidy. One or two words.
  • “Play” is a verb we earn. Use it where something actually responds to you.

Space & radius

08 · 4px base

A 4px base keeps everything snapping together like parts. Corners get rounder as things get bigger.

Space

Radius

6
chips
10
inputs
16
cards
24
tiles
32
panels
pill
buttons

Tokens

09 · CSS custom properties

Everything above, as CSS variables. Both routes load the same file, so changing a value here changes the whole site. The values below are read from the live stylesheet.

shared/tokens.css · :rootDownload tokens.css