UNPKG

@sveltek/attachments

Version:

A collection of custom attachments for Svelte.

66 lines (63 loc) 2.29 kB
//#region src/attachments/click-outside/attachment.ts function clickOutside(callback, options = {}) { return (el) => { const { event: { target = document } = {}, trigger } = options; const triggers = Array.isArray(trigger) ? trigger : [trigger]; const handler = (event) => { const target$1 = event.target; if (el.contains(target$1) || triggers.some((v) => v?.contains(target$1))) return; callback(event); }; target.addEventListener("click", handler, true); return () => { target.removeEventListener("click", handler, true); }; }; } //#endregion //#region src/attachments/keyboard/attachment.ts function keyboard(callback, options = {}) { return (el) => { const { event: { type = "keydown", target = el } = {}, keys } = options; const handler = (event) => { if (!keys || keys.includes(event.key)) callback(event); }; target.addEventListener(type, handler); return () => { target.removeEventListener(type, handler); }; }; } //#endregion //#region src/attachments/prevent-scroll/attachment.ts function preventScroll(options = {}) { return (el) => { const keys = options.keydown?.keys || [ "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "PageDown", "PageUp", "Home", "End", " " ]; const { target, handler = (e) => e.preventDefault(), handlerKey = (e) => { if (keys.includes(e.key)) e.preventDefault(); }, wheel: { enable: wheelEnable = true, target: wheelEl = el } = {}, touchmove: { enable: touchEnable = true, target: touchEl = el } = {}, keydown: { enable: keyEnable = true, target: keyEl = document } = {} } = options; const wheelTarget = target || wheelEl; const touchTarget = target || touchEl; const keyTarget = target || keyEl; if (wheelEnable) wheelTarget.addEventListener("wheel", handler, { passive: false }); if (touchEnable) touchTarget.addEventListener("touchmove", handler, { passive: false }); if (keyEnable) keyTarget.addEventListener("keydown", handlerKey); return () => { if (wheelEnable) wheelTarget.removeEventListener("wheel", handler); if (touchEnable) touchTarget.removeEventListener("touchmove", handler); if (keyEnable) keyTarget.removeEventListener("keydown", handlerKey); }; }; } //#endregion export { clickOutside, keyboard, preventScroll };