Skip to content
cccskills
FreePublished on GitHub

web-haptics

Add haptic feedback to web apps using the web-haptics library. Use when building mobile-facing UIs that need tactile feedback on buttons, toggles, forms, pickers, and other interactive elements.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1,219 stars(GitHub 1,219 + cccskills 0)

Run score Not tested

See how to install

Files included (1)

  • SKILL.md4.5 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Install web-haptics (npm i web-haptics) and add haptic feedback to the app following these rules:

Package: web-haptics

Repository: https://github.com/lochie/web-haptics | License: MIT | Zero dependencies Uses the Web Vibration API. Silently no-ops on unsupported platforms (desktop). No error handling or feature detection needed.

Trigger Types

trigger() accepts one of these strings (empty value defaults to a sensible "medium" impact):

Notification (task outcomes):

  • "success" -- form saved, payment confirmed, upload complete
  • "warning" -- destructive action ahead, approaching limit, irreversible step
  • "error" -- validation failure, network error, permission denied

Impact (physical collisions):

  • "light" -- small toggle, subtle tap, minor interaction
  • "medium" -- button press, card snap-to-position, drop into place
  • "heavy" -- major state change, heavy element landed, force press

Selection (discrete stepping):

  • "selection" -- picker scroll, stepper increment, slider detent, segment switch

Framework Imports

React:

import { useWebHaptics } from "web-haptics/react";

const haptic = useWebHaptics();

<button onClick={() => haptic.trigger()}>Tap me</button>;

Vue:

<script setup>
import { useWebHaptics } from "web-haptics/vue";
const haptic = useWebHaptics();
</script>

<template>
  <button @click="haptic.trigger()">Tap me</button>
</template>

Svelte:

<script>
  import { createWebHaptics } from "web-haptics/svelte";
  import { onDestroy } from "svelte";
  const haptic = createWebHaptics();
  onDestroy(() => haptic.destroy());
</script>

<button on:click={() => haptic.trigger()}>Tap me</button>

Vanilla JS:

import { WebHaptics } from "web-haptics";

const haptics = new WebHaptics();
haptics.trigger(); // medium impact
haptics.trigger("success");

Next.js: add "use client" to any component using useWebHaptics(). Nuxt/SvelteKit: works directly, library handles SSR.

Trigger Presets & defaultPatterns

All named string presets have a corresponding object in defaultPatterns. Use when you need to pass a preset as a value rather than a string literal:

import { WebHaptics, defaultPatterns } from 'web-haptics'

const haptics = new WebHaptics()
haptics.trigger(defaultPatterns.light)

Extra presets not listed above: "soft", "rigid", "nudge", "buzz". See defaultPatterns for all available values.

Apple HIG Design Rules -- FOLLOW THESE

  1. Haptics supplement, never replace. Always pair with visual feedback. UI must work fully without haptics.
  2. Build causal relationships. The haptic must feel like a direct physical consequence of the user action.
  3. Match intensity to significance. Light interactions = light/selection. Standard = medium/success. Major = heavy/error/warning.
  4. Do not overuse. If every tap vibrates, nothing feels special. Reserve for meaningful moments only.
  5. Synchronize perfectly. Fire haptic at the exact instant the visual change occurs.
  6. Respect conventions. success=positive, error=negative, warning=cautionary, selection=discrete ticks only.
  7. For async ops, trigger when the RESULT arrives, synced with the visual state change:
    try {
      await submit();
      haptic.trigger("success");
    } catch {
      haptic.trigger("error");
    }
    

Interaction to Type Quick Reference

Primary button tap = "medium" | Secondary button = "light" Form success = "success" | Validation error = "error" | Network error = "error" Toggle switch = "light" | Delete before confirm = "warning" Picker/wheel = "selection" | Slider detents = "selection" | Tab switch = "selection" Drag-drop snap = "medium" | Long press = "heavy" | Modal appear = "medium" Pull-to-refresh threshold = "light" | Swipe dismiss threshold = "light" Payment confirmed = "success"

Anti-Patterns -- AVOID

  • Haptic on every tap (fatigue)
  • "error" for non-errors (breaks conventions)
  • Haptic without visual feedback (some devices cannot vibrate)
  • Haptic on page load or passive scroll (invasive)
  • "heavy" for minor interactions (jarring)
  • Long continuous vibrations (web haptics = brief transient pulses)

Before implementing, confirm with the user:

  • Which interactive elements to target
  • Whether to add at shared component level or individual call sites

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

ink

Free

Comprehensive Ink skill for building CLI applications with React. Covers components (Text, Box, Static, Transform), hooks (useInput, useApp, useFocus), Flexbox layout, testing, and accessibility.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1.2KUpdated Oct 7, 2026

Launch and promote a custom shadcn/ui registry end-to-end: validate registry.json, prepare the official shadcn-ui/ui directory PR, community directory PRs (registry.directory, shadcntemplates, birobirobiro/awesome-shadcn-ui, bytefer/awesome-shadcn-ui), and draft social posts for Reddit r/shadcn, X, Dev.to, and Hacker News. Use whenever the user says "launch my registry", "list on shadcn directory", "submit to awesome-shadcn-ui", "announce my shadcn registry", "registry.directory PR", or wants to promote a new @scope registry — even if they do not say "launch-shadcn-registry" explicitly.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1.2KUpdated Oct 7, 2026

Comprehensive OpenTUI skill for building terminal user interfaces. Covers the core imperative API, React reconciler, and Solid reconciler. Use for any TUI development task including components, layout, keyboard handling, animations, and testing.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1.2KUpdated Oct 7, 2026

Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1.2KUpdated Oct 7, 2026

Guide for implementing smooth, native-feeling animations using React's View Transition API (`<ViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter/exit of components, animate list reorder, implement directional (forward/back) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view transitions, `startViewTransition`, `ViewTransition`, transition types, or asks about animating between UI states in React without third-party animation libraries.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1.2KUpdated Oct 7, 2026

Reference for writing and editing skills well — the vocabulary and principles that make a skill predictable.

The English summary is being prepared. Showing the original description.

shadcn-labs/termcn1.2KUpdated Oct 7, 2026

See all skills by shadcn-labs

Report a problem with this skill