Designing with Sound

Principles for tasteful UI sound: when to play, when to stay silent, and how sensory-ui maps to Material sound guidance.

Sound should confirm, orient, and reassure. It should never just decorate. This guide distills Material's sound principles into practical rules for sensory-ui.

Principles

PrincipleWhat it meanssensory-ui rule
PurposefulEvery sound maps to a user action or system stateOnly use the 17 defined sound roles: no one-off effects
RestrainedLess is more; silence is the defaultOpt-in sound prop only. Leave low-value clicks silent (sound={false})
ConsistentSame cause → same sound, everywhereReuse one role per interaction type (e.g. all primary submits use interaction.confirm)
AccessibleSound enhances, never replaces, visual feedbackEvery cue needs a visual equivalent; respect prefers-reduced-motion (see Accessibility)
BriefUI sounds are milliseconds, not secondsInteraction 8–50ms, navigation 40–250ms. Reserve hero.* (350–1900ms) for rare milestones

When to play sound

Based on Applying sound to UI: use cases:

Use casePlayRoleExample
Confirm an actionYesinteraction.confirmForm submit, Save
Toggle stateYesinteraction.toggleSwitch, Checkbox
Open / close a surfaceYesoverlay.open / overlay.closeDialog, Sheet
Move through spaceYes, quietlynavigation.forward / navigation.backward / navigation.tabPagination, Tabs
System feedbackYesnotification.info / success / warning / errorToasts, validation
Major achievementRarelyhero.complete / hero.milestoneOnboarding done, upload finished

When to stay silent

  • Rapid-fire clicks (sliders dragging continuously, use interaction.subtle sparingly or silence)
  • Every keystroke in a text field
  • Sounds on mount / without a user gesture (browsers suspend AudioContext anyway)
  • Inside a modal that already played overlay.open, don't stack a button tap on top
  • Inline text links
// Tasteful: one sound per user intent
<Button sound="interaction.confirm">Submit form</Button>
<Button sound={false} variant="link">Learn more</Button>

Choosing a pack

All 9 sound packs share the same roles. Switching changes character, not meaning:

ContextPacks to try first
Clean SaaSaero (default), crisp, minimal
Warm / friendlysoft, organic
Playfularcade, retro
Premium / delicateglass
Bold / industrialindustrial

Keep one pack per app. Preview packs with the pack switcher on any component demo.

Volume

Master default is 0.35. UI sound should sit in the background:

  • Subtle feedback: 0.15–0.25
  • Default: 0.30–0.40
  • Demo / accessibility testing: 0.80–1.00

Per-component volume can only lower the ceiling, never raise it. See Configuration.

Putting it together

A settings dialog that follows every rule on this page:

<Dialog sound="overlay.open" closeSound="overlay.close">
  <DialogContent>
    <Switch sound="interaction.toggle">Email alerts</Switch>
    <Button sound="interaction.confirm" volume={0.8}>
      Save changes
    </Button>
    <Button variant="link" sound={false}>
      Reset to defaults
    </Button>
  </DialogContent>
</Dialog>

One paired surface sound, one toggle, one rewarded submit, one silent escape hatch. For multi-step flows with milestones, see Sound usage and the Timer + Confetti block.

Further reading