Skip to content
Site volume
Colourway

Components

VolumeDial

The visitor volume dial: four stops, each named in its own voice, in the nav and the footer.

Import from@maxgrits/overprint-react/volume-dial
On this page

Example#

Look of this example
Site volume
Live render of examples/volume-dial/basic.tsx

Usage#

The volume dial is how visitors choose how loud the site prints, from Quiet to Rave (D-B3, D-B12). It lives in the navbar (compact) and the footer (inline). A visitor's choice wins over every authored volume except specimen frames like the ones on this page.

  • Compact is a 44 px key with a gauge glyph and the stop's word; it opens the inline dial in a popover.
  • Inline is a radio group of four stop keys, each name printed in its own voice: Quiet condensed, Studio standard, Press wide, Rave wide italic.
  • Reset. When a preference exists, "Use the page's own volume" clears it.
  • Never motion. The dial changes the ink; reduced motion is the visitor's system setting and the dial never overrides it.

Anatomy#

Site volume
The parts of examples/volume-dial/basic.tsx, numbered:
  1. LegendSite volume..mk-volume-dial-legend
  2. StopA key per volume, its name in its own voice..mk-volume-dial-stop
  3. DescriptionOne line on what the stop prints..mk-volume-dial-description

Volume#

The dial is reading layer: identical at every volume, so it can always be found and turned back.

  • Quiet

    Site volume

    Docs, forms, legal and long reads. Flat inks, no art in motion.

  • Studio

    Site volume

    The site default. Art on its own plates, one display moment per view.

  • Press

    Site volume

    Hero moments, covers and campaigns. Halftone fields and the second ink.

  • Rave

    Site volume

    Launches, posters and the 404. Every ink, and the words still win.

Content#

  • Stop names are Quiet, Studio, Press and Rave, in that order, everywhere.
  • Descriptions say what changes, in a few words: "Paper and type, art holds still".

Do and don't#

Do

Site volume

Always there to turn back.

Don't

A volume dial that turns the page up but hides itself at Rave.

A setting that removes its own control.

A visitor who turns the site up must be able to turn it down again. The dial is reading layer, so it never gets lost in the art.

Accessibility#

  • Native radios named by the stop and described by its line; the compact key is named "Site volume: Studio" and opens a native popover.
  • Choosing a stop never changes reduced-motion behaviour; "Use the page's own volume" clears the choice.
KeysWhat happens
EnterorSpace on the compact keyOpens the dial in a popover; Escape or a press outside closes it
TabMoves into the stops, onto the current one
Arrow keysPick another stop; the site changes at once

The colour pairs it prints, with their contrast on both papers:

TextSurfaceRoleBoneNight
--mk-on-control--mk-controluinot in this looknot in this look
--mk-on-selected--mk-selecteduinot in this looknot in this look
--mk-text--mk-surface-raiseduinot in this looknot in this look
--mk-text--mk-surfaceuinot in this looknot in this look

Process at Studio, normal contrast. Every look: the press check.

Props#

PropTypeDefaultDescription
appearance"compact" | "inline"none
size"md" | "sm"noneStop names at 28 px (`md`) or 22 px (`sm`, the footer).
copyPartial<VolumeDialCopy>none
classNamestringnone

Generated from VolumeDialProps in packages/overprint-react/src/reading/volume-dial/volume-dial.tsx.

Tokens#

Changelog#

Arrived in 0.1.0.

0.1.024 October 2026

  • MinorreactThe reading layer's controls, overlays, forms and visitor prefs (P2-T1 to P2-T5): every Button is the comic hit key, with IconButton, Link and Tooltip; Input, Textarea, Select, Checkbox and CheckboxGroup, Radio and RadioGroup, Switch, Slider with the ruler, RulerReadout and SegmentedControl; Dialog, Drawer, NavSheet, Tabs, Disclosure, Faq and faqJsonLd on Base UI 1.9 where the platform falls short; Field, Fieldset, Form with the site's inline validation, ErrorSummary, Callout, Honeypot, FormTimestamp and QuoteForm; PrefsScript under 1 KB, usePref and setPref with cross-tab sync, ThemeToggle and the visitor VolumeDial; VisuallyHidden.
  • PatchreactSegmentedControl, Tabs and CodeBlock draw LC-05's ring outside the focused key (2 px at 2 px) instead of inset; RadioGroup and CheckboxGroup keys and cards, VolumeDial stops and link Cards mark the element that draws the ring (data-mk-focus-ring); a focusable VisuallyHidden draws the ring. Read the whole entry