School’s Out design system
Start here

How a business’s brand is built

Six steps turn a business’s listing into a finished page that’s easy to read.

Six steps

Every business goes through the same steps, so every page looks consistent and reads well, even when a business gave us very little.

Show logic
buildBrand(input, { design, viewer }): { settings, intake, assess, resolve, normalize, finish, emit }
inputThe listing, plus what the sampler read from its logo and photo (pending until read)
designThe fixed design, brandConfig.design
viewerLight or dark, card colors, text color, and readability goal
OrderCollect, Check, Fill gaps, Match color; the text tint comes from the primary color; then Make readable and Apply
StepFileFunction
Collectintake.tsbrandIntake(input: BrandInput): BrandIntake
Checkassess.tsassessBrand(business, intake): BrandAssessment
Fill gapsresolve.ts (+ stock-photos.ts)resolveBrand(business, intake, assessment): BrandResolution
Match colornormalize.tsnormalizeBrandPalette(colors, overrides, enabled): NormalizedBrand
Make readablefinish.tsfinishBrand(settings, brand, placeholder, intake, tintColor, name): BrandFinish
Applyemit.tsemitBrand(settings, finish): BrandTokens

Relationship functions

FunctionFrom → toHome
validBrandColorsraw declared colors → valid colorsintake.ts
candidatesFromPixelspixels → color candidatesintake.ts
logoGroundFromPixelspixels → logo backgroundintake.ts
ownBrandColorslisting → own usable colorsassess.ts
brandRolesoverrides + own colors → primary, secondary, accentsresolve.ts
suggestFromCandidatescandidates → suggested paletteresolve.ts
companionPalettedeclared primary + candidates → paletteresolve.ts
monogramname → two initialsresolve.ts
colorReadinghex → OKLCH lightness, chroma, hue, gamut sharenormalize.ts
familyForHuehue → familynormalize.ts
classifyBrandColorcolor → family or neutralnormalize.ts
paletteColorfamily → the color cards render it asfinish.ts
textTintColorprimary → text tintfinish.ts
finishLuminancecontrast goal + ink → card luminancefinish.ts
cardAssignmentsbrand → each card’s color, companion, and shadefinish.ts
inkChoicesurfaces → text colorfinish.ts
actionPillink + surfaces → button base and floorfinish.ts
placeholderTonesweep index → grayed tone at 6.4:1finish.ts
markTilebrand → initials tile colorsfinish.ts
logoTileGrounddeclared + sampled background + brand → logo tilefinish.ts
accentColorsbrand → accent colors and inksfinish.ts
lightTextink → whether the card’s glass dimsfinish.ts
surfaceActionVariablesink + surfaces → button variablesemit.ts
activityStyleVariablessettings → page variablesemit.ts

Where each piece lives

LevelHome
Valuesmodules/brand-system/config.ts
Color modelmodules/brand-system/color.ts
Stepsmodules/brand-system, one file each
Entry pointmodules/brand-system/build.ts (buildBrand)
Adapterscommon/schools-out/brand-sampling.ts, runtime/schools-out/useBrandSystem.ts
Componentselements/, components/, patterns/schools-out (read emit only)

Spec: modules/brand-system/README.md.

Follow one business

What each step decided for the business chosen above.