@koine/dom 2.0.0-beta.72 → 2.0.0-beta.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/$.js +1 -0
- package/$all.js +1 -0
- package/$each.js +7 -0
- package/_listen-delegation.d.ts +1 -10
- package/_listen-delegation.js +45 -0
- package/addClass.js +10 -0
- package/calculateFixedOffset.js +8 -0
- package/createElement.js +8 -0
- package/emitEvent.js +8 -0
- package/escapeSelector.js +1 -0
- package/exists.js +1 -0
- package/forEach.js +5 -0
- package/getDataAttr.js +1 -0
- package/getDocumentHeight.js +4 -0
- package/getHeight.js +1 -0
- package/getListeners.js +8 -0
- package/getOffset.js +10 -0
- package/getOffsetTop.js +10 -0
- package/getOffsetTopSlim.js +1 -0
- package/getScrollbarWidth.js +1 -0
- package/getStyleValue.js +1 -0
- package/getVisualBackgroundColor.js +15 -0
- package/index.js +45 -0
- package/injectCss.js +10 -0
- package/isHidden.js +1 -0
- package/isInViewport.js +9 -0
- package/isNodeList.js +8 -0
- package/isTotallyScrolled.js +1 -0
- package/listen.js +17 -0
- package/listenLoaded.js +2 -0
- package/listenOnce.js +8 -0
- package/listenResize.js +2 -0
- package/listenResizeDebounced.js +3 -0
- package/listenResizeThrottled.js +3 -0
- package/listenScroll.js +5 -0
- package/listenScrollDebounced.js +3 -0
- package/listenScrollThrottled.js +3 -0
- package/off.js +9 -0
- package/on.js +14 -0
- package/onClickOutside.js +16 -0
- package/once.js +9 -0
- package/package.json +2 -2
- package/removeClass.js +10 -0
- package/scrollTo.js +29 -0
- package/setDataAttr.js +7 -0
- package/setVendorCSS.js +8 -0
- package/siblings.js +13 -0
- package/toArray.js +1 -0
- package/types.js +1 -0
- package/unlisten.js +19 -0
package/$.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let $ = (selector, parent, avoidEscape) => (parent ? parent : document).querySelector(avoidEscape ? selector : selector.replace(/:/g, "\\:"));
|
package/$all.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let $all = (selector, parent, avoidEscape) => (parent ? parent : document).querySelectorAll(avoidEscape ? selector : selector.replace(/:/g, "\\:"));
|
package/$each.js
ADDED
package/_listen-delegation.d.ts
CHANGED
|
@@ -1,10 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export type EventCallback<TTarget extends AnyDOMEventTarget = AnyDOMEventTarget, TType extends AnyDOMEventType = AnyDOMEventType> = (event: AnyDOMEvent<TType>, desiredTarget: TTarget) => any;
|
|
3
|
-
export type ListenEvent = {
|
|
4
|
-
selector: string;
|
|
5
|
-
callback: EventCallback;
|
|
6
|
-
};
|
|
7
|
-
export declare let activeEvents: Partial<Record<AnyDOMEventType, ListenEvent[]>>;
|
|
8
|
-
export declare let getIndex: (arr: ListenEvent[], selector: string, callback: EventCallback) => number;
|
|
9
|
-
export declare let getRunTarget: (target: Element, selector: string | Window | Document | Element) => false | Window | Document | Element | null;
|
|
10
|
-
export declare let eventHandler: (event: Event) => void;
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isString } from "@koine/utils";
|
|
2
|
+
import { escapeSelector } from "./escapeSelector";
|
|
3
|
+
export let activeEvents = {};
|
|
4
|
+
export let getIndex = (arr, selector, callback) => {
|
|
5
|
+
for (let i = 0; i < arr.length; i++) {
|
|
6
|
+
if (arr[i].selector === selector &&
|
|
7
|
+
arr[i].callback.toString() === callback.toString())
|
|
8
|
+
return i;
|
|
9
|
+
}
|
|
10
|
+
return -1;
|
|
11
|
+
};
|
|
12
|
+
export let getRunTarget = (target, selector) => {
|
|
13
|
+
if (["*", "window", window].includes(selector)) {
|
|
14
|
+
return window;
|
|
15
|
+
}
|
|
16
|
+
if ([
|
|
17
|
+
"document",
|
|
18
|
+
"document.documentElement",
|
|
19
|
+
document,
|
|
20
|
+
document.documentElement,
|
|
21
|
+
].includes(selector))
|
|
22
|
+
return document;
|
|
23
|
+
if (isString(selector)) {
|
|
24
|
+
return target.closest(escapeSelector(selector));
|
|
25
|
+
}
|
|
26
|
+
if (typeof selector !== "string" && selector.contains) {
|
|
27
|
+
if (selector === target) {
|
|
28
|
+
return target;
|
|
29
|
+
}
|
|
30
|
+
if (selector.contains(target)) {
|
|
31
|
+
return selector;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
};
|
|
37
|
+
export let eventHandler = (event) => {
|
|
38
|
+
activeEvents[event.type]?.forEach(function (listener) {
|
|
39
|
+
const target = getRunTarget(event.target, listener.selector);
|
|
40
|
+
if (!target) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
listener.callback(event, target);
|
|
44
|
+
});
|
|
45
|
+
};
|
package/addClass.js
ADDED
package/createElement.js
ADDED
package/emitEvent.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let escapeSelector = (selector) => selector.replace(/:/g, "\\:");
|
package/exists.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let exists = (node) => node && node instanceof window.HTMLElement;
|
package/forEach.js
ADDED
package/getDataAttr.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let getDataAttr = (element, attribute) => element.getAttribute("data-" + attribute);
|
package/getHeight.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let getHeight = (element) => parseInt(window.getComputedStyle(element).height, 10);
|
package/getListeners.js
ADDED
package/getOffset.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export let getOffset = (elem) => {
|
|
2
|
+
let left = 0;
|
|
3
|
+
let top = 0;
|
|
4
|
+
while (elem && !isNaN(elem.offsetLeft) && !isNaN(elem.offsetTop)) {
|
|
5
|
+
left += elem.offsetLeft - elem.scrollLeft;
|
|
6
|
+
top += elem.offsetTop - elem.scrollTop;
|
|
7
|
+
elem = elem.offsetParent;
|
|
8
|
+
}
|
|
9
|
+
return { top, left };
|
|
10
|
+
};
|
package/getOffsetTop.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let getOffsetTopSlim = (elem) => elem.getBoundingClientRect().top + window.scrollY;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let getScrollbarWidth = (element) => window.innerWidth - (element || document.documentElement).clientWidth;
|
package/getStyleValue.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let getStyleValue = (el, prop) => getComputedStyle(el, null).getPropertyValue(prop);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export let getVisualBackgroundColor = (elem) => {
|
|
2
|
+
if (!elem)
|
|
3
|
+
return "#fff";
|
|
4
|
+
const transparent = "rgba(0, 0, 0, 0)";
|
|
5
|
+
const transparentIE11 = "transparent";
|
|
6
|
+
const bg = window.getComputedStyle(elem).backgroundColor;
|
|
7
|
+
if (bg === transparent || bg === transparentIE11) {
|
|
8
|
+
const parent = elem.parentElement;
|
|
9
|
+
if (parent) {
|
|
10
|
+
return getVisualBackgroundColor(parent);
|
|
11
|
+
}
|
|
12
|
+
return "#fff";
|
|
13
|
+
}
|
|
14
|
+
return bg;
|
|
15
|
+
};
|
package/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export { $ } from "./$";
|
|
2
|
+
export { $all } from "./$all";
|
|
3
|
+
export { $each } from "./$each";
|
|
4
|
+
export { addClass } from "./addClass";
|
|
5
|
+
export { calculateFixedOffset } from "./calculateFixedOffset";
|
|
6
|
+
export { createElement } from "./createElement";
|
|
7
|
+
export { emitEvent } from "./emitEvent";
|
|
8
|
+
export { escapeSelector } from "./escapeSelector";
|
|
9
|
+
export { exists } from "./exists";
|
|
10
|
+
export { forEach } from "./forEach";
|
|
11
|
+
export { getDataAttr } from "./getDataAttr";
|
|
12
|
+
export { getDocumentHeight } from "./getDocumentHeight";
|
|
13
|
+
export { getHeight } from "./getHeight";
|
|
14
|
+
export { getListeners } from "./getListeners";
|
|
15
|
+
export { getOffset } from "./getOffset";
|
|
16
|
+
export { getOffsetTop } from "./getOffsetTop";
|
|
17
|
+
export { getOffsetTopSlim } from "./getOffsetTopSlim";
|
|
18
|
+
export { getScrollbarWidth } from "./getScrollbarWidth";
|
|
19
|
+
export { getStyleValue } from "./getStyleValue";
|
|
20
|
+
export { getVisualBackgroundColor } from "./getVisualBackgroundColor";
|
|
21
|
+
export { injectCss } from "./injectCss";
|
|
22
|
+
export { isHidden } from "./isHidden";
|
|
23
|
+
export { isInViewport } from "./isInViewport";
|
|
24
|
+
export { isNodeList } from "./isNodeList";
|
|
25
|
+
export { isTotallyScrolled } from "./isTotallyScrolled";
|
|
26
|
+
export { listenLoaded } from "./listenLoaded";
|
|
27
|
+
export { listenOnce } from "./listenOnce";
|
|
28
|
+
export { listenResize } from "./listenResize";
|
|
29
|
+
export { listenResizeDebounced } from "./listenResizeDebounced";
|
|
30
|
+
export { listenResizeThrottled } from "./listenResizeThrottled";
|
|
31
|
+
export { listenScroll } from "./listenScroll";
|
|
32
|
+
export { listenScrollDebounced } from "./listenScrollDebounced";
|
|
33
|
+
export { listenScrollThrottled } from "./listenScrollThrottled";
|
|
34
|
+
export { listen } from "./listen";
|
|
35
|
+
export { off } from "./off";
|
|
36
|
+
export { once } from "./once";
|
|
37
|
+
export { onClickOutside } from "./onClickOutside";
|
|
38
|
+
export { on } from "./on";
|
|
39
|
+
export { removeClass } from "./removeClass";
|
|
40
|
+
export { scrollTo } from "./scrollTo";
|
|
41
|
+
export { setDataAttr } from "./setDataAttr";
|
|
42
|
+
export { setVendorCSS } from "./setVendorCSS";
|
|
43
|
+
export { siblings } from "./siblings";
|
|
44
|
+
export { toArray } from "./toArray";
|
|
45
|
+
export { unlisten } from "./unlisten";
|
package/injectCss.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { $ } from "./$";
|
|
2
|
+
export let injectCss = (id, cssString = "", root = document) => {
|
|
3
|
+
let styleblock = $("#" + id);
|
|
4
|
+
if (!styleblock) {
|
|
5
|
+
styleblock = root.createElement("style");
|
|
6
|
+
styleblock.id = id;
|
|
7
|
+
root.body.appendChild(styleblock);
|
|
8
|
+
}
|
|
9
|
+
styleblock.innerHTML = cssString;
|
|
10
|
+
};
|
package/isHidden.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let isHidden = (el) => !el || el.offsetParent === null;
|
package/isInViewport.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export let isInViewport = (elem) => {
|
|
2
|
+
const distance = elem.getBoundingClientRect();
|
|
3
|
+
return (distance.top >= 0 &&
|
|
4
|
+
distance.left >= 0 &&
|
|
5
|
+
distance.bottom <=
|
|
6
|
+
(window.innerHeight || document.documentElement.clientHeight) &&
|
|
7
|
+
distance.right <=
|
|
8
|
+
(window.innerWidth || document.documentElement.clientWidth));
|
|
9
|
+
};
|
package/isNodeList.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export let isNodeList = (nodes) => {
|
|
2
|
+
const stringRepr = Object.prototype.toString.call(nodes);
|
|
3
|
+
return (typeof nodes === "object" &&
|
|
4
|
+
/^\[object (HTMLCollection|NodeList|Object)\]$/.test(stringRepr) &&
|
|
5
|
+
typeof nodes.length === "number" &&
|
|
6
|
+
(nodes.length === 0 ||
|
|
7
|
+
(typeof nodes[0] === "object" && nodes[0].nodeType > 0)));
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let isTotallyScrolled = (el) => el ? el.scrollHeight - el.scrollTop <= el.clientHeight : false;
|
package/listen.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { activeEvents, eventHandler, } from "./_listen-delegation";
|
|
2
|
+
import { on } from "./on";
|
|
3
|
+
export let listen = (types, selector, callback) => {
|
|
4
|
+
if (!selector || !callback)
|
|
5
|
+
return;
|
|
6
|
+
types.split(",").forEach(function (type) {
|
|
7
|
+
type = type.trim();
|
|
8
|
+
if (!activeEvents[type]) {
|
|
9
|
+
activeEvents[type] = [];
|
|
10
|
+
on(window, type, eventHandler, true);
|
|
11
|
+
}
|
|
12
|
+
activeEvents[type]?.push({
|
|
13
|
+
selector: selector,
|
|
14
|
+
callback: callback,
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
};
|
package/listenLoaded.js
ADDED
package/listenOnce.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { getRunTarget } from "./_listen-delegation";
|
|
2
|
+
import { listen } from "./listen";
|
|
3
|
+
import { unlisten } from "./unlisten";
|
|
4
|
+
export let listenOnce = (types, selector, callback) => listen(types, selector, function temp(event) {
|
|
5
|
+
const target = getRunTarget(event.target, selector);
|
|
6
|
+
callback(event, target || window);
|
|
7
|
+
unlisten(types, selector, temp);
|
|
8
|
+
});
|
package/listenResize.js
ADDED
package/listenScroll.js
ADDED
package/off.js
ADDED
package/on.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { noop } from "@koine/utils";
|
|
2
|
+
import { off } from "./off";
|
|
3
|
+
export let on = (el, type, handler, options = false) => {
|
|
4
|
+
if (process.env["NODE_ENV"] === "development") {
|
|
5
|
+
if (!el) {
|
|
6
|
+
console.warn("[@koine/dom:on] unexisting DOM element");
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
if (el) {
|
|
10
|
+
el.addEventListener(type, handler, options);
|
|
11
|
+
return () => off(el, type, handler);
|
|
12
|
+
}
|
|
13
|
+
return noop;
|
|
14
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { off } from "./off";
|
|
2
|
+
import { on } from "./on";
|
|
3
|
+
export let onClickOutside = (element, callback, autoUnbind = false) => {
|
|
4
|
+
const bind = (event) => {
|
|
5
|
+
if (!element.contains(event.target)) {
|
|
6
|
+
callback(event);
|
|
7
|
+
if (autoUnbind)
|
|
8
|
+
unbind();
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const unbind = () => {
|
|
12
|
+
off(document, "click", bind);
|
|
13
|
+
};
|
|
14
|
+
on(document, "click", bind);
|
|
15
|
+
return unbind;
|
|
16
|
+
};
|
package/once.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { off } from "./off";
|
|
2
|
+
import { on } from "./on";
|
|
3
|
+
export let once = (el, type, handler, options = false) => {
|
|
4
|
+
const handlerWrapper = (event) => {
|
|
5
|
+
handler(event);
|
|
6
|
+
off(el, type, handlerWrapper);
|
|
7
|
+
};
|
|
8
|
+
return on(el, type, handlerWrapper, options);
|
|
9
|
+
};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@koine/dom",
|
|
3
3
|
"sideEffects": false,
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@koine/utils": "2.0.0-beta.
|
|
5
|
+
"@koine/utils": "2.0.0-beta.73"
|
|
6
6
|
},
|
|
7
7
|
"exports": {
|
|
8
8
|
"./package.json": "./package.json",
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
},
|
|
15
15
|
"module": "./index.esm.js",
|
|
16
16
|
"main": "./index.cjs.js",
|
|
17
|
-
"version": "2.0.0-beta.
|
|
17
|
+
"version": "2.0.0-beta.73"
|
|
18
18
|
}
|
package/removeClass.js
ADDED
package/scrollTo.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { off } from "./off";
|
|
2
|
+
import { on } from "./on";
|
|
3
|
+
export let scrollTo = (destination, callback, fallbackTimeout, behavior) => {
|
|
4
|
+
const fixedDestination = destination.toFixed();
|
|
5
|
+
if (callback) {
|
|
6
|
+
let callbackFired = false;
|
|
7
|
+
const onScroll = function () {
|
|
8
|
+
if (window.pageYOffset.toFixed() === fixedDestination) {
|
|
9
|
+
off(window, "scroll", onScroll);
|
|
10
|
+
callbackFired = true;
|
|
11
|
+
callback();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
on(window, "scroll", onScroll);
|
|
15
|
+
onScroll();
|
|
16
|
+
if (fallbackTimeout) {
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
if (!callbackFired) {
|
|
19
|
+
off(window, "scroll", onScroll);
|
|
20
|
+
callback();
|
|
21
|
+
}
|
|
22
|
+
}, fallbackTimeout);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
window.scrollTo({
|
|
26
|
+
top: destination,
|
|
27
|
+
behavior: behavior || "smooth",
|
|
28
|
+
});
|
|
29
|
+
};
|
package/setDataAttr.js
ADDED
package/setVendorCSS.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export let setVendorCSS = (element, prop, value) => {
|
|
2
|
+
const propUpper = prop.charAt(0).toUpperCase() + prop.slice(1);
|
|
3
|
+
element.style["webkit" + propUpper] = value;
|
|
4
|
+
element.style["moz" + propUpper] = value;
|
|
5
|
+
element.style["ms" + propUpper] = value;
|
|
6
|
+
element.style["o" + propUpper] = value;
|
|
7
|
+
element.style[prop] = value;
|
|
8
|
+
};
|
package/siblings.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export let siblings = (node) => {
|
|
2
|
+
if (node && node.parentNode) {
|
|
3
|
+
let n = node.parentNode.firstChild;
|
|
4
|
+
const matched = [];
|
|
5
|
+
for (; n; n = n.nextSibling) {
|
|
6
|
+
if (n.nodeType === 1 && n !== node) {
|
|
7
|
+
matched.push(n);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return matched;
|
|
11
|
+
}
|
|
12
|
+
return [];
|
|
13
|
+
};
|
package/toArray.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let toArray = (nodeList) => Array.prototype.slice.call(nodeList);
|
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/unlisten.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { activeEvents, eventHandler, getIndex, } from "./_listen-delegation";
|
|
2
|
+
import { off } from "./off";
|
|
3
|
+
export let unlisten = (types, selector, callback) => {
|
|
4
|
+
types.split(",").forEach((type) => {
|
|
5
|
+
type = type.trim();
|
|
6
|
+
const events = activeEvents[type];
|
|
7
|
+
if (!events)
|
|
8
|
+
return;
|
|
9
|
+
if (events.length < 2 || !selector) {
|
|
10
|
+
delete activeEvents[type];
|
|
11
|
+
off(window, type, eventHandler, true);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const index = getIndex(events, selector, callback);
|
|
15
|
+
if (index < 0)
|
|
16
|
+
return;
|
|
17
|
+
activeEvents[type].splice(index, 1);
|
|
18
|
+
});
|
|
19
|
+
};
|