Open the style guide through the app
It only works at http://localhost:5050/design/styleguide.html (start the apps with run.bat first).
Style Guide

Theme

Everything on this page is drawn in the theme you pick here. Click the pencil on a theme to change its colors, or + to make a new one. Picking a theme only changes this page; edited colors reach every app once you save them.

Font size 100%

Each theme is four colors: background, panels, text, and accent. Every other color below is worked out from them.

Surfaces, back to front
BackgroundThe page
RaisedDialogs, menus, pop-overs
PanelCards, fields, buttons
Panel, hoveredHover and pressed
SunkenRecessed areas
LineEvery border and divider
Text, strongest to weakest
Titles, body, and valuesText
Long reading text, like a plotText 2
Labels, details, inactive controlsMuted
Placeholders, disabled and finished thingsFaint
Accent and status as text
Links, what's on, accent-colored wordsAccent text
Saved, watched, addedGood text
Needs attentionWarning text
Delete, errors, dropsBad text
Accent and status
AaAccentMain action, what's on, focus
GreatTop ratings
GoodSuccess, watched, added
WarningNeeds attention
BadDelete, errors, drops
Rating colors
A score runs from red through yellow and green to the theme's accent, so a 10 always matches the theme. On light themes the colors are darker so they stay readable.

Text

Eight sizes, four weights, and three typefaces, and nothing else. The Font size slider above scales all of them together.

Big numberStat tiles, overall score8.4
HeadlineList tabs, page titlesWatched
TitleDialogs, sections, brandAdd a title
ValueScores, prices, sub-titles$46.50
BodyEverything by defaultA quiet, readable line of body text.
ControlsToolbars, menus, list rowsRecently added
SecondaryDetails, chips, hints2016 · 1h 56m · PG-13
LabelSmall headings over a groupWatched this year
LinkAccent, underlined on hoverallrecipes.com · Prep 15 min · Open the product page
Rating in a lineThe score in its colorFred again.. · 21:30 · 9.0 · 5.5
Inter
Interface. Everything, unless it's one of the two below.
Fraunces
Titles. Brand, list tabs, dialog and section titles, empty states.
year:>2010
Code. Search syntax and color codes.
RegularBody MediumControls SemiboldTitles, labels, buttons BoldNumbers and scores

Shape and depth

Corners are chosen by what a thing is, not how big it is. Something inside a padded box takes the next corner down, so the curves stay parallel.

Corners
Small bits
Tags, thumbnails
Controls
Buttons, fields, rows
Cards
Posters, tiles, toast
Surfaces
Panels, menus, dialogs
Pills
Chips, search, switches
Spacing steps
Gaps and padding come from these seven steps. Page content lines up with the top bar's edge.
Depth
Card at rest
Card on hover
Menus and dialogs
4KText over a picture

Icons

One line weight for every icon. Most have a filled version too, used for the app logos and anywhere an icon needs more weight. They're grouped by what they show; any app can use any of them.

App marks
Each app's logo, a filled icon. They show in every app's switcher.
All icons
Hover an icon to see its name.

Buttons

One main action per dialog, always last. Everything that can be "on" uses the same accent look.

Primary
Secondary
Ghost
Danger
Confirm a delete
Small
Disabled
Icon buttons
The "on" look
Off
On
Yes / No
A filter in use
Pick one of a row
Unavailable (sold out)
Accent text, a soft accent border, and a faint accent fill. Never a tick: ticks are only for checkboxes.
Backdrops: solid and glass
Solid
Solid, square
Solid, several icons
Behind the glass
Glass, over a picture or scrolling content: icons, several icons, and text buttons
A page's list
The floating plus (.fab): a page's add, like Keep's
An option: data-glass-lift on a glass piece, or on anything round it, lifts it 2px as it's hovered
Any icon works on either backdrop, round or square, alone or several in one capsule. Any button can be glass too: it keeps its shape and color, and the surface turns to glass. Use Solid on a plain page and Glass where the control floats over a picture or content that scrolls under it. Pressing one shrinks it a little.
Toggles and press feedback
Toggle icons: tap to turn on
On a backdrop; two different icons
In a group
Press anywhere
Every button; .ripple for a tile or card
A toggle icon is the outline icon when off and the filled one, in accent, when on, with a quick pop as it turns on. Use data-ico-toggle (and data-ico-on for a different "on" icon) or iconToggle(). Every button and icon reacts to a press the same way: it sinks and tips toward your finger with a glow under it, then a wave runs out and it springs back. Add .ripple to give a tile or card the same; .no-ripple leaves one out.
Switches
On / off with no words: off, on, small, disabled
A setting with its switch (.switch-row): click the words or the switch
A segmented control: the highlight slides
Stacked (.seg.vertical): AM over PM
A switch is for a setting that takes effect at once (<button class="switch" role="switch" aria-checked="false">; it sends a toggle event). A setting with words goes in a <label class="switch-row">: the words on the left, the switch on the right. Hold one down and the knob stretches toward where it's going. Every segmented control's highlight slides to the new choice by itself.
Motion playground
Press for the ripple
Applies to this whole page while you try it
The sliders change the motion settings for the whole style guide, so every switch, segmented control, toggle icon, button, and ripple on the page follows them. When you like a setting, send me the line under the sliders and I'll make it the real one.

Toolbar

The row above a list. Filter, Sort, and drop-down boxes are the same in every app. Try them.

Filter: list, with counts
Filter: chips, accent only (no number)
Sort
Drop-down (turns accent when narrowing)
Drop-down, counts off
1 lb , peeledDrop-down in a line of text
Drop-down with sections, no count on "All"
A control that narrows the list turns accent while it's in use. Counts sit muted on the right of a menu, or are left off, or left off only the "All" row. A Filter menu's choices are rows or chips. Menus and drop-downs share three kinds of section, in this order: plain, folding (always closed to start), and a separate group at the foot.filterButton() filterMenu() sortMenu() customSelect()
Pages. Under a long list: plain numbers, the current page accent and underlined, the shared chevrons either side. Try it.pagerHTML()

Chips and tags

Small pills for choices, dates, and ratings. They all share the chip shape. A chip that only shows something (a reminder, a label, a status) is drawn by chipHTML(): its text ends in "…" when there's no room, and icon, text and ✕ sit centered on the capitals.

WeeknightVegetarian 12Quick 30
Chips
Showing something
Long text ends in …
A date
9.57.04.0
Rating badge (score.js)

Forms

Labels sit above their field. Drop-downs, dates, and suggestions are always the themed versions, never the browser's own.

Vices
Choose several; add your own at the foot.
Franchise
Watched on
Rewatch?
Options
Slider
65%
Price boxes keep the $ in front and are only as wide as the amount.
Checkboxes
Square
The default: options, filters
Square, filled
When the choice should stand out
Circle
Marking a thing done or seen
Circle, filled
Done, where it should stand out
Select
Choosing cards: the tick shows before it's chosen
Drag handle
Reorder a row: hover for its circle
Four kinds, off and on. Add fill and/or round to the checkbox (or its .check label). Ticks appear only in checkboxes, never in menus. Try them.
Checkbox sizes
Normal
The default everywhere
Large
Music’s “seen” ✓ on a set
Extra large
A big, single mark
Box and tick grow together. Add lg or xl to the checkbox (or its .check label), or set --check-scale for anything in between.
Text boxes. Three kinds, one look. A text box for one line. A note for a few lines (most notes). An expandable note for writing that can run long: a show's write-up, a recipe's steps. Once there's more than fits, a note scrolls with the same floating bar as everything else (grab it, or click its arrows).

Dates

Every date is picked with this calendar. It opens just above its Pick a date button, lined up with it.

One day. Today has a dot under it, always; the day you pick is filled; days you've already logged have an accent number.
A range. Start is solid, end is a ring. Used for TV seasons.

Dialogs

Delete on the left, Cancel then the main action on the right. Edits save only with Save, never as you change them. Click outside a dialog to close it, the same as ✕ or Esc. Closing or leaving with unsaved changes always asks the same question, naming what you changed. In a long dialog you scroll (a recipe), Cancel and Save stay pinned to the bottom.

.modal.small
.modal
.modal.wide
Three sizes, the same in every app (shown at half size). Small: a confirm, a quick add, a short list. Standard (plain .modal): a form, settings, Appearance; most dialogs. Wide: a page of its own (a recipe and its Edit, a title, an item, a chart). Never give a dialog its own width.

Cards and data

Stat tiles, bars, and the rating slider.

Flat · grouped by whitespace
Outlined · quiet hover
Elevated · raised hover
Elevated · raised hover with lift
Independent choices. Surface, hover elevation and lift are separate. Quiet and raised both remain available. Padding and radius are chosen by the containing component.
Blended controls and list feedback. Check or uncheck an item: its state responds first, then it moves. New rows enter gently. This uses the shared filled checkbox unchanged. Reduced motion updates immediately.

Watched this year

86 titles
12 more than last year

Top genres

Drama
42
Thriller
23
Comedy
15

Budget this month

Groceries
$412 of $660
Eating out
$276 of $300
Shopping
$318 of $250

Top cities

Tokyo48
Rome29
Lisbon14

Your rating

Slide to rate; ✕ takes it off. Not rated yet, it rests in the middle (5.5), faded, until you move or tap it.
Stats. Stat tiles (a row of them is .tiles), bars, and stacked bars (.stackbar: one bar split by category, each part in its color).
Progress banner. While something long runs.
Nothing here yet
Add a title to get started.
Empty state. When a list has nothing in it.
Added “Arrival” to Watched
Completed “Call Mom”
Toast. A short note at the bottom of the window. Undo is its icon alone.

Settings layout

Consistent section gaps, wrapped help and open rows without automatic divider lines.

Appearance

Your theme follows you across devices.

Lists

InboxDefault
Work

Names can wrap. Help belongs to its section, so the next section always starts after the same gap.

Help stays attached to its field.

Separate fields have a larger gap than a field and its help.

Shared settings composition. The stack owns section spacing; sections own their internal spacing. Panels opt into a surface treatment. Rows do not imply dividers or depth.

Pictures

A flyer, a poster, or a photo kept with an item: a thumbnail that opens full size, and the picker that adds one.

On a card
On a page
Thumbnail. Click it to see the picture full size (Esc or a click closes it).
Picture picker. Paste a link to an event page (its picture is found for you), upload, paste, or drop a file. It's kept when the form saves.

Scrolling

Anything that scrolls gets the floating bar, in its own strip so it never covers content. The bottom edge fades while there's more to see.

Main pages use the full-window scrollbar, including alongside the header. Fixed app shells connect their main scroller with pageScrollbar(selector); dialogs and secondary panes use the contained bar below.

Hover a bar to thicken it, drag it, or use the arrows on the sideways one.

Lists and genres

The top of the library: which list you're looking at, and the genres in it.

List tabs pick the list; the genre row under them scrolls sideways.

Tags and badges

Everything on a title's page that's a small pill: tags, awards, where to stream it, its franchise, and outside scores.

thrillertime travelDrama
Tags
Your own tags
Add a tag (type, then Enter)
Tag editor: your tags and "+ add tag" with suggestions (tagEditor)
🏆 Best PictureAward
HuluNetflix
Streaming services
Franchise
Related title
IMDb8.1🍅96%
Score badges

Posters and scores

Hover a poster to see it lift.

8.7
Severance
2022IMDb8.7
#3
No poster yet
A title long enough to wrap onto a second line
2019IMDb …
Posters. Your score, a rank, and season progress sit on the picture.
You8.4
IMDb7.9 /10
Score boxes. Your score next to IMDb's.
8.4OverallStory 30 · Craft 30 · Enjoyment 40
StoryPlot, writing, ideas
8.0
CraftActing, direction, look
–
EnjoymentHow much you liked it
9.0
Rating scorecard. Each part is scored on its own; the overall score is weighted. Each part uses the rainbow rating slider (.slide.rate), the same as rateInput() above; a part not rated yet is faded. The numbers 1–10 underneath are the shared .rate-ticks, each centered where the handle sits at that score.

The rules

What keeps all the apps looking like one family.

Colors come from the theme

Never a fixed color, so every theme works, light ones included.

Eight text sizes

Only the sizes and weights in Text, so the Font size setting scales everything.

Corners by kind

Small bits, controls, cards, surfaces, and pills. Nothing in between.

One set of menus

Every drop-down, Sort menu, and suggestion list is the shared one. Highlighted, never ticked.

One "on" look

Accent text, soft accent border, faint accent fill, for anything switched on.

Shared icons

Every icon comes from the shared set, so they all have the same line weight.

Every page built the same

Shared top bar with the app switcher, Appearance in the ☰ menu, floating scroll bars.

Shared, not copied

Anything another app could use goes into the shared folder and onto this page first.