|
|
|
|
|
|
|
|
|
|
|
|
|
export let isEmpty = (o) => { |
|
return ( |
|
o === null || |
|
o === undefined || |
|
o === '' || |
|
o === 'null' || |
|
(Array.isArray(o) && o.length === 0) || |
|
(typeof o === 'object' && |
|
o.constructor.name === 'Object' && |
|
Object.getOwnPropertyNames(o).length === 0) |
|
); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export let mergeTypedArrays = (arrays) => { |
|
let totalLength = arrays.reduce((acc, array) => acc + array.length, 0); |
|
let result = new arrays[0].constructor(totalLength); |
|
let offset = 0; |
|
arrays.forEach((array) => { |
|
result.set(array, offset); |
|
offset += array.length; |
|
}); |
|
return result; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
export let bindPointerUntilRelease = (callback, releaseCallback = null) => { |
|
let onWindowPointerMove = (e) => { |
|
callback(e); |
|
} |
|
let onWindowPointerUpOrLeave = (e) => { |
|
|
|
|
|
if (e.type === "mouseleave" && (e.target !== null && e.target !== undefined && e.target.tagName !== "HTML")) { |
|
return; |
|
} |
|
if (!isEmpty(releaseCallback)) { |
|
releaseCallback(e); |
|
} |
|
window.removeEventListener("mouseup", onWindowPointerUpOrLeave, true); |
|
window.removeEventListener("mouseleave", onWindowPointerUpOrLeave, true); |
|
window.removeEventListener("touchend", onWindowPointerUpOrLeave, true); |
|
window.removeEventListener("mousemove", onWindowPointerMove, true); |
|
window.removeEventListener("touchmove", onWindowPointerMove, true); |
|
} |
|
window.addEventListener("mouseup", onWindowPointerUpOrLeave, true); |
|
window.addEventListener("mouseleave", onWindowPointerUpOrLeave, true); |
|
window.addEventListener("touchend", onWindowPointerUpOrLeave, true); |
|
window.addEventListener("mousemove", onWindowPointerMove, true); |
|
window.addEventListener("touchmove", onWindowPointerMove, true); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export let bindPointerDrag = (element, startCallback, callback, releaseCallback = null) => { |
|
const pointerStart = (e) => { |
|
if (e.type === "mousedown" && e.button !== 0) { |
|
return; |
|
} |
|
e.preventDefault(); |
|
const startPosition = e.type === "mousedown" ? e : e.touches[0]; |
|
const startPoint = {x: startPosition.clientX, y: startPosition.clientY}; |
|
if (!isEmpty(startCallback)) { |
|
startCallback({ |
|
start: startPoint, |
|
startEvent: e |
|
}); |
|
} |
|
bindPointerUntilRelease( |
|
(e2) => { |
|
const currentPosition = e2.type === "mousemove" ? e2 : e2.touches[0]; |
|
const currentPoint = {x: currentPosition.clientX, y: currentPosition.clientY}; |
|
const delta = {x: currentPoint.x - startPoint.x, y: currentPoint.y - startPoint.y}; |
|
callback({ |
|
start: startPoint, |
|
current: currentPoint, |
|
delta: delta, |
|
startEvent: e, |
|
moveEvent: e2 |
|
}); |
|
}, |
|
(e2) => { |
|
if (!isEmpty(releaseCallback)) { |
|
releaseCallback({ |
|
start: startPoint, |
|
startEvent: e, |
|
releaseEvent: e2 |
|
}); |
|
} |
|
} |
|
); |
|
}; |
|
element.addEventListener("mousedown", pointerStart); |
|
element.addEventListener("touchstart", pointerStart); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
export let replaceQuotes = (text) => { |
|
return text.replaceAll("β", "\"") |
|
.replaceAll("β", "\"") |
|
.replaceAll("β", "'") |
|
.replaceAll("β", "'"); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
export let hexToRgb = (hex) => { |
|
let bigint = parseInt(hex.replace("#", ""), 16); |
|
return [ |
|
(bigint >> 16) & 255, |
|
(bigint >> 8) & 255, |
|
bigint & 255 |
|
]; |
|
}; |
|
|