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.
Each theme is four colors: background, panels, text, and accent. Every other color below is worked out from them.
Text
Eight sizes, four weights, and three typefaces, and nothing else. The Font size slider above scales all of them together.
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.
Tags, thumbnails
Buttons, fields, rows
Posters, tiles, toast
Panels, menus, dialogs
Chips, search, switches
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.
Buttons
One main action per dialog, always last. Everything that can be "on" uses the same accent look.
data-glass-lift on a glass piece, or on anything round it, lifts it 2px as it's hovered.ripple for a tile or carddata-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.<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.
Toolbar
The row above a list. Filter, Sort, and drop-down boxes are the same in every app. Try them.
filterButton() filterMenu() sortMenu() customSelect()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.
Forms
Labels sit above their field. Drop-downs, dates, and suggestions are always the themed versions, never the browser's own.
The default: options, filters
When the choice should stand out
Marking a thing done or seen
Done, where it should stand out
Choosing cards: the tick shows before it's chosen
Reorder a row: hover for its circle
fill and/or round to the checkbox (or its .check label). Ticks appear only in checkboxes, never in menus. Try them.The default everywhere
Music’s “seen” ✓ on a set
A big, single mark
lg or xl to the checkbox (or its .check label), or set --check-scale for anything in between.Dates
Every date is picked with this calendar. It opens just above its Pick a date button, lined up with it.
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.
Add a title
Delete “Arrival”?
Its ratings and watch dates go too. This can’t be undone.
Discard your changes?
Your changes to Appearance haven't been saved.
.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.
Watched this year
Top genres
Budget this month
Top cities
Your rating
.tiles), bars, and stacked bars (.stackbar: one bar split by category, each part in its color).Settings layout
Consistent section gaps, wrapped help and open rows without automatic divider lines.
Appearance
Your theme follows you across devices.
Lists
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.
Pictures
A flyer, a poster, or a photo kept with an item: a thumbnail that opens full size, and the picker that adds one.
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.
Lists and genres
The top of the library: which list you're looking at, and the genres in it.
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.
HuluNetflixPosters and scores
Hover a poster to see it lift.
.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.