Nuxt 4 module for mobile haptics, powered by web-haptics.
It wraps the browser Vibration API with a Nuxt-first DX:
- client and server plugins, so SSR and prerender stay safe
useNuxtHaptics()auto-importv-nuxt-hapticdirective for declarative interactions- typed
$nuxtHapticsinjection - persisted enabled state with touch-only behavior by default
npx nuxt module add nuxt-hapticOr install manually:
bun add nuxt-hapticexport default defineNuxtConfig({
modules: ['nuxt-haptic'],
})<script setup lang="ts">
const { success } = useNuxtHaptics()
</script>
<template>
<button v-nuxt-haptic="'selection'" type="button">
Tap
</button>
<button type="button" @click="success()">
Save
</button>
</template>export default defineNuxtConfig({
modules: ['nuxt-haptic'],
nuxtHaptic: {
defaultPreset: 'selection',
enabled: true,
persistPreference: true,
preferenceStorageKey: 'nuxt-haptic:enabled',
touchOnly: true,
debug: false,
showSwitch: false,
},
})defaultPreset accepts any web-haptics input, including built-in preset names, numbers, arrays, and custom pattern objects.
Returns:
trigger(input?, options?)selection()light()success()warning()error()cancel()enabledisSupportedsetEnabled(value)toggleEnabled()config
If you need types in userland:
import type { HapticInput, PresetName, TriggerOptions } from 'nuxt-haptic'String shorthand:
<a v-nuxt-haptic="'selection'" href="/contact/">Contact</a>Object form:
<button
v-nuxt-haptic="{ input: 'light', on: 'pointerdown', intensity: 0.7 }"
type="button"
>
Press
</button>Directive fields:
input: anyweb-hapticsinputon:click,pointerdown, orpointerupintensity: optional intensity overridetouchOnly: override module default per elementdisabled: disable haptics for that node
- On devices without Vibration API support,
web-hapticsfalls back cleanly and can optionally emit debug audio. - The directive ignores non-primary mouse and pointer activation.
- The server plugin provides a no-op directive and injection so Nuxt prerender does not break.
# Install dependencies
bun install
# Prepare stubs and types
bun run dev:prepare
# Run the playground
bun run dev
# Run tests
bun run test
bun run test:types
# Build the package
bun run prepackweb-hapticsby Lochie Axon for the underlying haptics runtime.