Synthesized tactile sounds (Web Audio) + real device haptics, in ~4KB with zero dependencies. Tap anything below — on Android you'll feel it; on iOS ≤26.4 too.
12 synthesized sounds, each with a matched vibration pattern (ms). Every trigger is subtly randomized (±2% pitch) so it never feels robotic.
Wired with data attributes only — no per-component JS.
Defaults respect prefers-reduced-motion (both off if set).
<script src="/lcfx.js"></script>
<button data-fx-press data-fx-release>Save</button> <!-- press+release feel -->
<button data-fx="success">Submit</button> <!-- one-shot on click -->
<input type="checkbox" data-fx-toggle> <!-- toggle on/off pair -->
LCFX.trigger('success') // programmatic: sound + haptic together
LCFX.config({volume:.5}) // persisted user prefs
Engine source: /lcfx.js (~4KB, readable). Haptics: navigator.vibrate on Android; on iOS a hidden <input type="checkbox" switch> toggle fires the Taptic Engine (iOS 17.4–26.4 — Apple patched 26.5; degrades silently to sound-only).