nuxt-haptic
v0.2.1
Published
Nuxt 4 module for mobile haptics powered by web-haptics.
Maintainers
Readme
nuxt-haptic
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
Install
npx nuxt module add nuxt-hapticOr install manually:
bun add nuxt-hapticexport default defineNuxtConfig({
modules: ['nuxt-haptic'],
})Quick Use
<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>Options
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.
API
useNuxtHaptics()
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'v-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
Notes
- 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.
Development
# 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 prepackCredits
web-hapticsby Lochie Axon for the underlying haptics runtime.
