UNPKG

syv

Version:

practical svelte components and utilities

101 lines (100 loc) 4.22 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import { on } from 'svelte/events'; /** autofocus element when condition is true */ export var autofocus = function (when) { if (when === void 0) { when = true; } return function (node) { return void (when && node instanceof HTMLElement && node.focus()); }; }; /** automatically expand `textarea` height according to content */ export var autoresize = function (element) { if (element.tagName !== 'TEXTAREA') return; var node = element; var _a = getComputedStyle(node), pt = _a.paddingTop, pb = _a.paddingBottom; var vertical = parseFloat(pt.slice(0, -2)) + parseFloat(pb.slice(0, -2)); var memory = node.scrollHeight + vertical; var receiver = function () { if (node.scrollHeight <= memory + vertical) return; memory = node.scrollHeight + vertical; node.style.setProperty('height', "".concat(memory, "px")); }; node.style.setProperty('overflow-y', 'hidden'); node.style.setProperty('height', "".concat(memory, "px")); return on(node, 'input', receiver); }; export var copy = function (_a) { var data = _a.data, _b = _a.handler, handler = _b === void 0 ? {} : _b; function write() { var _a; if (!data) return; var ncb = navigator.clipboard; var process; if (typeof data === 'string') { process = ncb.writeText(data); } else { // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/write process = ncb.write([new ClipboardItem((_a = {}, _a[data.type] = data, _a))]); } var _b = handler.accept, accept = _b === void 0 ? function () { } : _b, _c = handler.reject, reject = _c === void 0 ? function () { } : _c; return process.then(accept, reject); } return function (node) { return on(node, 'click', write, { capture: true }); }; }; /** determine if click is maintained for `duration` */ export var hold = function (_a) { var _b = _a === void 0 ? {} : _a, _c = _b.duration, duration = _c === void 0 ? 2000 : _c, _d = _b.invoke, invoke = _d === void 0 ? function () { } : _d; var timer; function press() { timer = setTimeout(invoke, duration); } function release() { if (timer) clearTimeout(timer); } return function (node) { var events = [on(node, 'mousedown', press), on(node, 'mouseup', release)]; return function () { return events.forEach(function (remove) { return remove(); }); }; }; }; export var observe = function (_a) { var _b = _a.selector, selector = _b === void 0 ? '' : _b, options = __rest(_a, ["selector"]); return function (node) { var targets = selector ? node.querySelectorAll(selector) : [node]; var observer = new IntersectionObserver(options.intersect, { root: node, rootMargin: options.margin || '0px', threshold: options.threshold || 0, }); $effect(function () { targets.forEach(function (target) { return observer.unobserve(target); }); targets = selector ? node.querySelectorAll(selector) : [node]; targets.forEach(function (target) { return observer.observe(target); }); }); return function () { return observer.disconnect(); }; }; }; /** determine if there is click event outside of the element */ export var outside = function (callback) { return function (node) { function clicked(event) { if (!node || !callback || event.defaultPrevented) return; if (!node.contains(event.target)) callback(event); } return on(document, 'click', clicked, { capture: true }); }; };