tactus
Version:
Add native-like haptic feedback to any web app.
58 lines (53 loc) • 1.66 kB
JavaScript
;
const HAPTIC_ID = "___haptic-switch___";
const HAPTIC_DURATION_MS = 10;
function isIOS$1() {
if (typeof navigator === "undefined" || typeof window === "undefined") {
return false;
}
const iOSDevice = /iPad|iPhone|iPod/.test(navigator.userAgent);
const iPadOS = navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
return iOSDevice || iPadOS;
}
let inputElement = null;
let labelElement = null;
let isIOS = false;
function mount() {
if (labelElement && inputElement) return;
isIOS = isIOS$1();
inputElement = document.querySelector(`#${HAPTIC_ID}`);
labelElement = document.querySelector(
`label[for="${HAPTIC_ID}"]`
);
if (inputElement && labelElement) return;
inputElement = document.createElement("input");
inputElement.type = "checkbox";
inputElement.id = HAPTIC_ID;
inputElement.setAttribute("switch", "");
inputElement.style.display = "none";
document.body.appendChild(inputElement);
labelElement = document.createElement("label");
labelElement.htmlFor = HAPTIC_ID;
labelElement.style.display = "none";
document.body.appendChild(labelElement);
}
if (typeof window !== "undefined") {
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", mount, {
once: true
});
} else {
mount();
}
}
function triggerHaptic(duration = HAPTIC_DURATION_MS) {
if (typeof window === "undefined") return;
if (isIOS) {
if (!inputElement || !labelElement) mount();
labelElement?.click();
} else {
if (navigator?.vibrate) navigator.vibrate(duration);
else labelElement?.click();
}
}
exports.triggerHaptic = triggerHaptic;