syv
Version:
practical svelte components and utilities
101 lines (100 loc) • 4.22 kB
JavaScript
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 });
};
};