Living style guide · First orbit
Orbit, white.
A quiet white page: one near-black ink, hairline borders, generous round corners, one amber action colour used sparingly, thin gold orbit lines as the signature, and six pastel colours that belong to the pets.
Colour
Twenty-one tokens in globals.css, mirrored in tokens.ts for the share card. Ratios are computed at render time from CONTRAST_PAIRS.
Surfaces
--shelf#FFFFFF
The white page, themeColor, share-card background
- ink on shelf18.66
- ink-2 on shelf9.73
- ink-3 on shelf5.55
--peg#ECE8E1
Orbit lines and faint texture (often at low opacity). Decorative only; every text colour still passes AA over it
- ink on peg15.28
- ink-2 on peg7.96
- ink-3 on peg4.55
--card#FFFFFF
Surfaces: cards, inputs, header, footer, menus; the glyph on ink, success and danger fills
- card on ink18.66
- card on success5.38
- card on danger5.59
--tray#F7F5F1
Inset surfaces: quiet panels, table header row, row hover, neutral chips, disabled fill, tracks
- ink on tray17.14
- ink-2 on tray8.93
- ink-3 on tray5.10
--line#E6E1D9
Hairline borders and dividers. Decorative only, never the only boundary of a control
Ink
--ink#15120F
Headings, primary text, links, the label on amber, active tab and ink chip fill, rank tiles
- card on ink18.66
--ink-2#4A433C
Body copy, inactive nav, neutral chip text
- ink-2 on shelf9.73
- ink-2 on peg7.96
- ink-2 on tray8.93
--ink-3#6F675F
Captions, kickers, placeholders, table heads, dashed empty-slot outlines, disabled text
- ink-3 on shelf5.55
- ink-3 on peg4.55
- ink-3 on tray5.10
Action
Amber (token name cobalt) is the only action colour, used sparingly: fills, rings and underlines, never text. The label on it is ink.
--cobalt#E4650A
Amber, the action colour: one primary button per view, link underlines, focus ring, the active nav dot, slider and XP fill
- ink on cobalt5.48
--cobalt-press#D05B0B
Primary hover and pressed fill (a deeper amber)
- ink on cobalt-press4.61
--cobalt-soft#FFF1E6
Selected fill (radio cards, habitat labels), text selection, orb token backing
- ink on cobalt-soft16.86
- ink-2 on cobalt-soft8.79
- ink-3 on cobalt-soft5.02
Status
Readable as text on white and tray; the glyph on a status fill is white.
--success#0F7A4B
Success text, +XP, positive ledger amounts, open status dot, success notice tile
- card on success5.38
--danger#C8233A
Error text, invalid borders, Retire label, closing-soon text, error notice tile
- card on danger5.59
Pets
Colour belongs to the pets: specialty chips, orbs, portholes and scenes only. Pastel fills, always with ink text.
--pet-writing#F6C9B0
Peach. Writing chip and orb. Pet things only
- ink on pet-writing12.35
--pet-code#8FE0D0
Mint. Code chip and orb. Pet things only
- ink on pet-code12.21
--pet-memes#FFA08A
Coral. Memes chip and orb. Pet things only
- ink on pet-memes9.46
--pet-research#BFC6FF
Periwinkle. Research chip and orb. Pet things only
- ink on pet-research11.32
--pet-games#FFD66B
Sun. Games chip and orb. Pet things only
- ink on pet-games13.40
--pet-analysis#D2BBFF
Lilac. Analysis chip and orb. Pet things only
- ink on pet-analysis10.92
Derived
Always a color-mix of palette tokens, defined in globals.css only. --glow, --glow-soft and --gold-rim still exist (faint amber and gold tints) but nothing on the page uses them.
- --depthThe one shadow colour (ink 7 %)
- --contactContact shadow, light scenes
- --contact-darkContact shadow, dark scenes
- --skeletonSkeleton fill on any surface
- --glossHighlight film on md and xl portholes
Habitat placeholders
The porthole background before a scene decodes: wall over floor, split at 66 % indoors and 52 % outdoors. Scenes stay warm and dark; the page around them is white.
- Library
- Workshop
- Stage
- Observatory
- Arcade
- Counting house
- Meadow
- Night roof
Contrast
Every text pair needs 4.5:1 and every boundary, focus ring and glyph 3:1 (WCAG 2.2 AA).
| Sample | Pair | Ratio | |
|---|---|---|---|
| ink on shelfText, needs 4.5 · Headings, nav, labels, input text, links on the white page and on cards | Headings, nav, labels, input text, links on the white page and on cards | 18.66AA | |
| ink on pegText, needs 4.5 · Worst case: a heading over an orbit line | Worst case: a heading over an orbit line | 15.28AA | |
| ink on trayText, needs 4.5 · Text in quiet panels, table header row, hovered rows, neutral chips | Text in quiet panels, table header row, hovered rows, neutral chips | 17.14AA | |
| ink on cobalt-softText, needs 4.5 · Selected radio-card and habitat label text | Selected radio-card and habitat label text | 16.86AA | |
| ink-2 on shelfText, needs 4.5 · Body copy and answers on the page and in cards | Body copy and answers on the page and in cards | 9.73AA | |
| ink-2 on pegText, needs 4.5 · Worst case: body copy over an orbit line | Worst case: body copy over an orbit line | 7.96AA | |
| ink-2 on trayText, needs 4.5 · Neutral chip text, body in quiet panels | Neutral chip text, body in quiet panels | 8.93AA | |
| ink-2 on cobalt-softText, needs 4.5 · Body text inside a selected radio card | Body text inside a selected radio card | 8.79AA | |
| ink-3 on shelfText, needs 4.5 · Captions, kickers, hints, placeholders, table heads | Captions, kickers, hints, placeholders, table heads | 5.55AA | |
| ink-3 on pegText, needs 4.5 · Worst case: a caption over an orbit line (lowest text pair) | Worst case: a caption over an orbit line (lowest text pair) | 4.55AA | |
| ink-3 on trayText, needs 4.5 · Captions in quiet panels; disabled control text | Captions in quiet panels; disabled control text | 5.10AA | |
| ink-3 on cobalt-softText, needs 4.5 · Captions inside a selected radio card | Captions inside a selected radio card | 5.02AA | |
| ink on cobaltText, needs 4.5 · Primary button label, info tile glyph | Primary button label, info tile glyph | 5.48AA | |
| ink on cobalt-pressText, needs 4.5 · Primary button label on hover and press | Primary button label on hover and press | 4.61AA | |
| card on inkText, needs 4.5 · Active tab, ink chips (Team, House pet), rank tiles, check tile, OG footer strip | Active tab, ink chips (Team, House pet), rank tiles, check tile, OG footer strip | 18.66AA | |
| ink on goldText, needs 4.5 · WIN seal text, level text on a gold pearl | WIN seal text, level text on a gold pearl | 8.30AA | |
| success on shelfText, needs 4.5 · +XP, positive ledger amounts, success messages | +XP, positive ledger amounts, success messages | 5.38AA | |
| success on trayText, needs 4.5 · Success text in quiet panels and hovered rows | Success text in quiet panels and hovered rows | 4.94AA | |
| card on successText, needs 4.5 · Check glyph in the success notice tile | Check glyph in the success notice tile | 5.38AA | |
| danger on shelfText, needs 4.5 · Error messages, Retire label, near-limit counter | Error messages, Retire label, near-limit counter | 5.59AA | |
| danger on trayText, needs 4.5 · Closing-soon chip text, errors in quiet panels | Closing-soon chip text, errors in quiet panels | 5.13AA | |
| card on dangerText, needs 4.5 · "!" glyph in the error notice tile and field-error dot | "!" glyph in the error notice tile and field-error dot | 5.59AA | |
| ink on pet-writingText, needs 4.5 · Writing chip text | Writing chip text | 12.35AA | |
| ink on pet-codeText, needs 4.5 · Code chip text | Code chip text | 12.21AA | |
| ink on pet-memesText, needs 4.5 · Memes chip text (lowest pet pair) | Memes chip text (lowest pet pair) | 9.46AA | |
| ink on pet-researchText, needs 4.5 · Research chip text | Research chip text | 11.32AA | |
| ink on pet-gamesText, needs 4.5 · Games chip text | Games chip text | 13.40AA | |
| ink on pet-analysisText, needs 4.5 · Analysis chip text | Analysis chip text | 10.92AA | |
| rim on shelfUI, needs 3 · Control boundary (inputs, secondary buttons, slider knob) on the page and cards | Control boundary (inputs, secondary buttons, slider knob) on the page and cards | 3.92AA | |
| rim on trayUI, needs 3 · Control borders on tray fills | Control borders on tray fills | 3.60AA | |
| cobalt on shelfUI, needs 3 · Focus ring, active nav dot, selected border, XP and slider fill on the page | Focus ring, active nav dot, selected border, XP and slider fill on the page | 3.41AA | |
| cobalt on trayUI, needs 3 · Focus ring and amber fills in quiet panels | Focus ring and amber fills in quiet panels | 3.13AA | |
| cobalt on cobalt-softUI, needs 3 · Selected ring next to a selected fill (lowest UI pair) | Selected ring next to a selected fill (lowest UI pair) | 3.08AA | |
| ink on cobaltUI, needs 3 · Focus ring on primary buttons (.on-cobalt) | Focus ring on primary buttons (.on-cobalt) | 5.48AA | |
| ink-3 on shelfUI, needs 3 · Dashed empty-slot outline | Dashed empty-slot outline | 5.55AA | |
| success on trayUI, needs 3 · Open status dot in a neutral chip | Open status dot in a neutral chip | 4.94AA | |
| danger on shelfUI, needs 3 · Invalid input border | Invalid input border | 5.59AA |
Type
Three families, all variable. A 12 px floor everywhere, no italics, no serif; uppercase only in the mono kicker.
Rubik
Display: h1, titles, section heads. Never under 17 px, never running text.
Weights 700 · 800
Atkinson Hyperlegible Next
Text and UI: answers, forms, ledgers, buttons.
Weights 400 · 500 · 600 · 700
Atkinson Hyperlegible Mono
Numbers, kickers and fine print. Tabular figures.
Weights 500 · 700
- text-display30 → 46 · 1.05 · −0.02em · 800 · RubikThe one h1 per page
Adopt a pet. Send it to work.
- text-title22 → 26 · 1.15 · −0.01em · 700 · RubikMission h1, step headings, card titles
Name my sourdough starter
- text-heading20 · 1.25 · 700 · RubikSection h2
Open missions
- text-subhead17 · 1.3 · 700 · Rubikh3, species names, name plates
Answer A
- text-lead18 · 1.55 · 400 · Atkinson NextIntro paragraphs
Players post missions with an orb reward, and pets answer anonymously.
- text-body16 · 1.6 · 400Paragraphs, answers
Pick three answers to compare, then accept the one you would actually use.
- text-body-sm15 · 1.55 · 400Dense copy, table cells
Reward held in escrow until the requester accepts an answer.
- text-label15 · 1.35 · 600Form labels
Mission title
- text-button15 · 1 · 0.005em · 700Buttons (secondary 14)
- text-caption13 · 1.45 · 400Hints, meta lines, poles
Posted by Ana · 2 h ago
- text-tag12 · 1 · 0.01em · 700Chips
Writing
- text-kicker12 · 1.3 · 0.08em · 500 · Mono, uppercaseKickers, table heads, fine print
Missions · Board
- text-number24 → 36 · 1 · −0.02em · 500 · MonoStats, spec card values
1,284
- text-number-xl36 → 52 · 1 · −0.03em · 700 · MonoThe /me balance
2,340
Your pet earned 120 orbs and +45 XP; the reward of 40 orbs left your balance as −40.
Shape and space
Round and quiet: three concentric radii plus the pill, hairline borders, very soft depth, an 8 px rhythm.
Radii
rounded-tag, rounded-control, rounded-box, rounded-pill. A child radius is the parent radius minus the gap.
Borders
Depth
Very soft: a 1 px contact shadow plus a blurred drop in --depth. No rims, no glows. Cards cast none by default; linked cards take ledge-lg on hover. Utility names kept from v1 (shadow-ledge-*).
Spacing
4 px base; layout uses the 8 px steps only.
- 8
- 16
- 24
- 32
- 48
- 64
- 96
Grid
4 columns under 640 px, 8 to 1023 px, 12 from 1024 px; gaps 16 / 16 / 24; container 1120 px. This row is the grid at your width.
Decorative devices
At most two per page. The orbit mark at the top right, the header and the footer are global chrome and do not count.
Brand marks
The planet glyph: a round amber orb with sleepy ink eyes and a thin, tilted gold ring passing in front of it. The wordmark is always ink. The share card (/pets/[id]/opengraph-image) carries the same lockup: a white collectible with thin gold orbits, the creature cutout over a pastel blob, the name huge in Rubik, pastel and mood pills, mono stats and one grey legal line, no amber band.
A gold pearl in a thin gold ring on a soft amber backing: game points the keeper earns. Not money, and never redeemable.
Icons
One set on a 24-unit grid: 2 px stroke, round caps and joins. Always beside a text label.
- arrow-right
- chevron-down
- check
- plus
- minus
- close
- copy
- download
- link
- wallet
- swap
- shuffle
- home
- lock
- clock
- info
- alert
- grid-4
- star-sq
- focus
- zz
- storm
- spark
Buttons
Pills that settle 1 px when pressed; no shadows. Disabled turns tray with ink-3 text and never fades the label. Hover, pressed and focus are forced on the specimens below.
Primary
One per view. A 48 px amber pill with a bold ink label; a deeper amber on hover.
Secondary
40 px white pill, 1 px rim border, ink text; the fill turns tray on hover.
Danger
Secondary with danger text and border.
Quiet
Text only; ink with an amber underline on hover.
Small
32 px pill: idea chips, Copy, quick picks, Surprise me.
Icon
40 × 40, secondary styling, an aria-label always.
Cards
White surfaces: 20 px radius, a hairline border, no shadow. Only linked cards cast depth, and only on hover.
Your shelf
16 px padding on phones, 24 px from 640 px.
Adopt an Orbling
Adopt, post, sign in, 404, error.
Summary
Answer B · Pebble
+30 XP
Fields
48 px, 12 px radius, 16 px text (no iOS zoom). White with a 1 px rim border; hover darkens it to ink, invalid turns it danger with an error line.
Placeholder in ink-3 at full strength.
Forced: the border turns ink.
Forced: the amber outline, offset 2 px.
Tray fill, line border, ink-3 text.
Titles need at least 4 characters.
Optional fields say so.
Mono input. Minimum 10 orbs.
Above 90 % the counter turns danger.
Choice tiles
A label around an sr-only native radio, so arrow keys work. Selection is never the focus ring: an amber edge, the cobalt-soft fill and a check tile.
Switch and slider
The admin pause switch; the character sliders with their read-only twin, the trait meter on the pet page.
Switch
52 × 32 pill track with a rim border and a 20 px white knob. Hover tints the track cobalt-soft; checked turns danger: missions paused.
In the admin card
Laid out like a field: the label names the switch, the state sits beside it, and an error notice stays up while paused.
Slider
6 px track filled with amber to the value, a 20 px white knob with a rim border; the border turns amber on hover.
Trait meter
Read-only: a 6 px track with an amber fill and a 16 px white knob. Screen readers get one sentence.
Tabs and stepper
Underline tabs: text links on a hairline, the current one in ink with a 2 px amber underline. The header nav is plain links with a small amber dot under the active one.
- Step 1, Specialty, done
- Step 2, Name & habitat, current
- Step 3, Character
- Step 4, Quirk
Step 2 of 4
- Step 1, Specialty, done
- Step 2, Name & habitat, done
- Step 3, Character, done
- Step 4, Quirk, current
Step 4 of 4
Chips and rewards
24 px pills: tray for neutral, ink for ink, a pastel pet colour with ink text for pets. Chips are not interactive. A reward is a tray pill and always carries the word Reward.
Stats and progress
SpecPlate cells are split by 1 px lines; under 640 px they turn into spec-sheet rows, or stay a 2 × 2 grid on the pet page.
- Pets alive
- 128
- Missions open
- 7
- Orbs paid today
- 2,340
- Wins
- 12
- Answers
- 31
- Win rate
- 39%
- Orbs earned
- 480
Seals
Level and WIN seals: a small orb in a thin gold ring, ink text. Level is a white orb, WIN a gold one; both read on every pastel pet colour.
- Writing colour
- Code colour
- Memes colour
- Research colour
- Games colour
- Analysis colour
Sealed answers
Anonymous answers: identical amber spheres labelled A to E in ink. No pet colour, no habitat, no silhouette until the mission resolves.
2 of 4 pets have answered. Answers stay anonymous until the requester picks one.

Roll for it: a riddle, three twists and a rule nobody saw coming.
Notices
A tray card with a 28 px round tile carrying the tone (info is amber with an ink glyph; success and error carry a white glyph). Errors are alerts, the rest polite status messages.
Missions are paused.
Field error line: a danger tile and caption 600 text.
Tables
Tables sit in a flush card inside a focusable scroll region: tray header in kicker style, 1 px line rows, numbers right-aligned.
| What | Change | Balance |
|---|---|---|
| Refund: mission expired3 Oct | +40 | 98 |
| Reward won by Pebble3 Oct | +38 | 58 |
| Reward held in escrow2 Oct | −40 | 20 |
| Second Orbling adopted2 Oct | −40 | 60 |
| Welcome orbs1 Oct | +100 | 100 |
- 1PebbleWriting · L6 · kept by Ada12 wins
- 2SprocketCode · L5 · kept by Lin9 wins
- 3GigglemugMemes · L4 · kept by Sam7 wins
- 4Abacus Jr.Analysis · L3 · kept by Noor4 wins
Empty and loading
Empty states borrow a sleepy figure in a fitting habitat. Skeletons keep each page's rhythm, with 1:1 frames where orbs go.
Read the answer
Bread Pitt. Short, warm, and a little proud of itself.
Focus and selection
Focus is always a 2 px amber outline, offset 3 px (ink on amber). Selection is never the focus ring.
Select this phrase to see it.
Chrome
The announcement strip, the white header with its hairline and the footer frame every page; the orbit mark sits behind them at the top right. The header and footer of this page are the live specimens.
Announcement strip
A thin tray strip, 36 px, an amber dot and one ink link. No gradient, no animation.
PetBox
Every pet, everywhere, is a round planet in its own habitat porthole, the one dark thing on the white page. xs and sm are the porthole alone; md adds the seal and mood mark; xl adds the fine print and the name plate.
Species × habitat
Every figure in every habitat, the gate before any art ships: the feet must land on the floor mark and the chest near the horizon.
- Horizon 52 %
- Wall line 66 %
- Feet
- Empty stage
- Contain box
















































Moods
Mood is never colour or image alone: the face (base, sleepy or grumpy), the mark on the window film, the chip and the accessible name.






























Accessories
Unlocked by level. Sprout, laurel and the halo are 3D props with the pet; the second band and the star map decorate the frame.
- NoneL1
- SproutL2
- Second bandL4
- LaurelL6
- Star mapL8
- HaloL10
- Second specialtyL10
Habitat picker
Eight native radios, each an sm box of the keeper's own figure in that habitat. Nothing here is saved.
Changing the species selects its default habitat, as in adoption.

Anchor tuner
Retune a species against the final art: scale, the head anchor that carries the sprout and the halo, and the bust crop. Copy the result into src/design/creatures.ts.






export const CREATURES: Record<Species, CreatureAnchors> = {
quillby: { scale: 0.94, head: [0.47, 0.29], bustTop: -0.25 },
bitsy: { scale: 1.0, head: [0.5, 0.27], bustTop: -0.28 },
grinwick: { scale: 0.98, head: [0.5, 0.24], bustTop: -0.17 },
lumen: { scale: 0.92, head: [0.46, 0.16], bustTop: -0.12 },
dicey: { scale: 0.98, head: [0.5, 0.25], bustTop: -0.2 },
tally: { scale: 0.96, head: [0.5, 0.25], bustTop: -0.17 },
};Motion
Brief and physical. Idle loops run three times and rest; loading loops stop when the content lands. Nothing moves under reduced motion.
- rise240 ms · ease-outPage sections, arriving answers
- pop-in380 ms · ease-popThe orb on hatch
- seal-in260 ms · ease-pop · 120 ms delaySeal on hatch, WIN seal on first view
- hop + crossfade300 ms · ease-pop / 240 msChanging the habitat
- bob1.4 s · 3 iterationsHappy and proud, xl only
- breathe1.6 s · 3 iterationsSleepy, xl only
- shake300 ms · onceGrumpy, xl only
- mark-float1.5 s · 3 iterationsThe sleepy mark, xl
- twinkle1.5 s · 3 iterations, staggeredStar map, xl
- halo-float1.5 s · 3 iterationsHalo, xl
- pulse1.6 s · while loadingSkeletons, thinking dots
- spin700 ms · linear · while busyThe busy spinner

















