- Import web/ directory (Vue 3 + Vite + UnoCSS SPA) from feature/vue-spa branch - Add web/src/components/ClassicUIButton.vue: switch-back to Streamlit via cookie (prgn_ui=streamlit) + ?prgn_switch=streamlit query param bridge - Add web/src/composables/useFeatureFlag.ts: reads prgn_demo_tier cookie for demo toolbar visual consistency (not an authoritative gate, see issue #8) - Update .gitignore: add .superpowers/, pytest-output.txt, docs/superpowers/
20 lines
577 B
TypeScript
20 lines
577 B
TypeScript
import { useMotion } from './useMotion'
|
|
|
|
// navigator.vibrate() — Chrome for Android only. Desktop, iOS Safari: no-op.
|
|
// Always guard with feature detection. Gotcha #9.
|
|
export function useHaptics() {
|
|
const { rich } = useMotion()
|
|
|
|
function vibrate(pattern: number | number[]) {
|
|
if (rich.value && typeof navigator !== 'undefined' && 'vibrate' in navigator) {
|
|
navigator.vibrate(pattern)
|
|
}
|
|
}
|
|
|
|
return {
|
|
label: () => vibrate(40),
|
|
discard: () => vibrate([40, 30, 40]),
|
|
skip: () => vibrate(15),
|
|
undo: () => vibrate([20, 20, 60]),
|
|
}
|
|
}
|