Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Looks

A Look is a complete design language — theme and typefaces bundled into one value, applied in one call. The same app, six voices, from the fenestra-looks crate — enumerate them with fenestra_looks::all(mode) for a picker or gallery:

  • product — the stock voice: Inter, neutral surfaces, blue accent.
  • editorial — print energy: Playfair Display headlines over a deep duotone field (the poster’s language, packaged).
  • terminal — instrument panel: JetBrains Mono everywhere, phosphor accent, built for dense tools.
  • console — observability console: a cool-slate field under one electric-lime accent, sans body with mono numerals, and sharp + flat chrome (RadiusScale::sharp() + Elevation::Flat) — the minimalist “tech” voice, distinct from terminal’s all-mono phosphor.
  • warm-editorial — warm paper and ink: a cream-and-terracotta field derived (Theme::derive) with Fraunces text-serif prose (a variable face with an opsz optical-sizing axis) under sans chrome, and Playfair Display kept for large display headlines — a proper display + text serif pairing. Set prose runs to FamilyRole::Serif and pair with OpticalSizing::Auto so the serif’s weight tracks the size.
  • playful — a soft pastel canvas with a saturated magenta accent, for whiteboard-class, friendly tools. (Ships with the base sans; a hand-drawn display face is a planned addition.)
let look = fenestra_looks::editorial(Mode::Dark);
let fonts = look.fonts();           // embedded base + the look's faces
render_element_with(view, &look.theme, size, &mut fonts);
// Windowed: WindowOptions::titled("…").with_font(role, bytes) per face.

Each look is golden-locked from the same sample screen, so its identity is pinned, not aspirational. Typefaces are vendored under their OFL licenses.

Two mechanics make looks possible and are available to your own: registered faces win for every family role (register under FamilyRole::Sans and body text changes voice), and a family must cover the weights you request — asking for Semibold in a family that only ships Medium falls back out of the family entirely, so looks bundle 400–700.

Build your own look: a Theme (or ThemeSpec recipe) plus (FamilyRole, bytes) pairs is the whole format.