Cubelets Design System

A code-truthful spec for a cozy voxel-sculpture merge puzzle. The art direction is Monument Valley by way of a watercolour set — soft, warm, and never trying to look like a video game. Every token here maps to a real value in src/index.css; when code and this doc disagree, code wins.

1 font family 7 cube hues 3 palette skins v1.0
01 · Identity

The scene is the screen.

A puzzle played on a 3D voxel field. Three principles hold the whole thing together — break any one and it stops feeling like Cubelets.

The scene is the screen.Chrome floats above the field as warm glass — never a solid panel between you and your sculpture.
One font, one weight, one rule.Nunito 600 everywhere; weight 800 is reserved for the score and the title.
The cube colours are the brand.The seven accent hues are the exact colours dropped on the field. In the chrome they read as hints.
02 · Color

Warm cream, espresso text, seven soft cubes.

No pure primaries, never cold black. Backgrounds run a three-stop warm cream gradient; text is warm espresso; and the seven cube hues carry all the saturation in the product.

Backgrounds — warm cream

bg-0
#F5E4CB
Top of gradient, page wash
bg-1
#EFD4B0
Middle plane
bg-2
#E8C09D
Bottom, vignette near field

Text — warm espresso

text
#3B2A2A
Primary, titles, score
text-dim
#7A5C4F
Body, descriptions
muted
#9B7E6C
Captions, helper text

The seven cubelet colours

c-violet
#8B5A7D
The brand accent
c-magenta
#D87888
Hot — danger + R tile
c-coral
#E8927D
Warm-pink
c-gold
#E6B94A
Bright — focus ring
c-green
#7FBFA0
The G tile
c-sky
#9ED6C2
Pale teal
c-cyan
#5FB3A8
The B tile

Gradients

g-prism
coral → magenta → violet
Logotype + primary CTA
g-warm
coral → gold
Award badges, celebration
03 · Palette variants

Three full skins from one token set.

Tokens are defined once on :root, then re-bound under body[data-palette]. A new screen must work in all three — use the --c-* tokens, never raw hex.

Base
Warm cream. The default — daytime.
Dusk
Rose plum. Backgrounds and accents shift cooler — evening play.
Neon
Misty mint. The cool sister palette (not actually neon — the name predates the look).
04 · Typography

Rounded letterforms, to match the cubes.

Nunito is the body family, set at weight 600 on the root so everything inherits it. Fredoka handles the big display moments — its rounded corners echo the rounded cubes. JetBrains Mono appears only on system-flavoured labels.

Fredoka 700Display · score · title · 56/800
Sculpture complete!
Fredoka 600Panel header · 28/800
Daily Challenge
Nunito 600Body · UI · default · 16
Drag to aim, release to drop. Line up three junk tiles of a colour to clear them. There's no timer — take all the time you want.
JetBrains MonoMicro · eyebrows · counts · 11/700 · +1px
×4 COMBO · 16 LEVELS · 25 PRISMS
05 · Spacing

A friendly base-4 scale.

Eight steps, doubling loosely from a 4px hairline to 64px big-screen rhythm.

sp-1
4px
sp-2
8px
sp-3
12px
sp-4
16px
sp-5
24px
sp-6
32px
sp-7
48px
sp-8
64px
06 · Radius

Soft on glass, soft on chips.

Nothing sharp anywhere — every corner is rounded so the chrome sits next to the rounded cubes.

Pill Score HUD, play CTA, picker
r-pill · 999px
Card Glass panels, gallery tiles
r-card · 18px
Button In-game actions
r-btn · 12px
Chip Badges, mini buttons
r-chip · 8px
07 · Elevation

Every shadow is warm brown — never grey.

Grey shadows turn the cream into beige. Warm brown alpha keeps the chrome feeling like it sits in the same scene as the cubes.

sh-sm
sh-card
glow-violet
glow-cyan
08 · Glass surfaces

One translucent layer over the field.

Every panel is a glass card: a warm-tinted translucent fill, a 1px hairline, an 18px radius, a warm card shadow, and a 1px top inset-highlight that fakes the edge reflection. Two strengths — hovering HUD chips, and the stronger settings sheet.

glass-bg · 0.62

Hovering HUD chips. You can always see the cubes behind it.

glass-bg-strong · 0.88

Settings sheet & game-over panel, where legibility wins.

09 · Components

All cut from the same glass + warm-shadow recipe.

Twelve components ship in src/components/. A representative few, rendered on the cream stage:

Buttons

Score HUD

12,480×4

Modifier picker

Double Score
Every clear counts twice this level
Slow Time
The fall slows right down
Hide Preview
No next-tile peek — play blind

Awards

The cube tiles

10 · Motion

Feedback, not decoration.

Short, springy, and purposeful. With prefers-reduced-motion on, every one of these collapses to a plain opacity fade.

Cube drop 280ms ease-out, bounce on landing
+250
Score tick number scales 1 → 1.15 → 1
menu
Panel open scale 0.96 → 1, fade in, 220ms
Hover / tap scale to 1.02, glow on, 150ms
11 · Iconography

The icon is the brand statement.

A voxel heart built from dark + red cubes with a single pink cubelet off-centre — the merge gameplay reduced to one frame. In-product glyphs are inline line icons at 1.6px stroke with rounded caps, matched to the Nunito body weight.

Cubelets app icon — a voxel heart
12 · Voice

Warm, plain, never shouty.

The copy talks to you like a friendly board-game box, not a casino. Encouraging, lower-case-comfortable, and honest about what's going on.

We say

"Nice — perfect clear!"

"No timer. Take your time."

"Beat yesterday's ghost?"

We don't say

"LIMITED TIME! Don't miss out!"

"Out of lives — buy more?"

"You're losing your streak!!!"

13 · Doing it wrong

Five ways to break the feel.

If a new screen does any of these, it isn't Cubelets anymore.

  • Don't put a solid panel over the field. Glass only — the player should always see the cubes behind their menu.
  • Don't use grey shadows. All shadows are warm brown alpha; grey turns the cream into beige.
  • Don't use saturated chrome. Saturated hue belongs to the cubes. Even the primary CTA uses the prism gradient, not a flat fill.
  • Don't switch font weight inside body copy. Nunito 600 for everything; only display (800) is a separate weight.
  • Don't break a palette variant. A new screen must work in base, dusk, and neon — use the --c-* tokens, never raw hex.
14 · Source of truth

Where every token actually lives.

This page documents the system; the code defines it. When they disagree, the code wins.

Tokenssrc/index.css
Componentssrc/components/
Game scenesrc/game/
App iconpublic/icon-512.png
Live buildcubelets.vercel.app →