@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.
Files changed (50) hide show
  1. package/$.js +1 -0
  2. package/$all.js +1 -0
  3. package/$each.js +7 -0
  4. package/_listen-delegation.d.ts +1 -10
  5. package/_listen-delegation.js +45 -0
  6. package/addClass.js +10 -0
  7. package/calculateFixedOffset.js +8 -0
  8. package/createElement.js +8 -0
  9. package/emitEvent.js +8 -0
  10. package/escapeSelector.js +1 -0
  11. package/exists.js +1 -0
  12. package/forEach.js +5 -0
  13. package/getDataAttr.js +1 -0
  14. package/getDocumentHeight.js +4 -0
  15. package/getHeight.js +1 -0
  16. package/getListeners.js +8 -0
  17. package/getOffset.js +10 -0
  18. package/getOffsetTop.js +10 -0
  19. package/getOffsetTopSlim.js +1 -0
  20. package/getScrollbarWidth.js +1 -0
  21. package/getStyleValue.js +1 -0
  22. package/getVisualBackgroundColor.js +15 -0
  23. package/index.js +45 -0
  24. package/injectCss.js +10 -0
  25. package/isHidden.js +1 -0
  26. package/isInViewport.js +9 -0
  27. package/isNodeList.js +8 -0
  28. package/isTotallyScrolled.js +1 -0
  29. package/listen.js +17 -0
  30. package/listenLoaded.js +2 -0
  31. package/listenOnce.js +8 -0
  32. package/listenResize.js +2 -0
  33. package/listenResizeDebounced.js +3 -0
  34. package/listenResizeThrottled.js +3 -0
  35. package/listenScroll.js +5 -0
  36. package/listenScrollDebounced.js +3 -0
  37. package/listenScrollThrottled.js +3 -0
  38. package/off.js +9 -0
  39. package/on.js +14 -0
  40. package/onClickOutside.js +16 -0
  41. package/once.js +9 -0
  42. package/package.json +2 -2
  43. package/removeClass.js +10 -0
  44. package/scrollTo.js +29 -0
  45. package/setDataAttr.js +7 -0
  46. package/setVendorCSS.js +8 -0
  47. package/siblings.js +13 -0
  48. package/toArray.js +1 -0
  49. package/types.js +1 -0
  50. 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
@@ -0,0 +1,7 @@
1
+ import { $all } from "./$all";
2
+ export let $each = (selector, callback, parent, scope) => {
3
+ const nodes = $all(selector, parent);
4
+ for (let i = 0; i < nodes.length; i++) {
5
+ callback.call(scope, nodes[i], i);
6
+ }
7
+ };
@@ -1,10 +1 @@
1
- import type { AnyDOMEvent, AnyDOMEventTarget, AnyDOMEventType } from "./types";
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
@@ -0,0 +1,10 @@
1
+ export let addClass = (el, className = "") => {
2
+ if (process.env["NODE_ENV"] === "development") {
3
+ if (!el) {
4
+ console.warn("[@koine/dom:addClass] unexisting DOM element");
5
+ return;
6
+ }
7
+ }
8
+ if (el)
9
+ el.classList.add(className);
10
+ };
@@ -0,0 +1,8 @@
1
+ import { $each } from "./$each";
2
+ export let calculateFixedOffset = (selector = "[data-fixed]") => {
3
+ let fixedOffset = 0;
4
+ $each(selector, ($el) => {
5
+ fixedOffset += $el.offsetHeight;
6
+ });
7
+ return fixedOffset;
8
+ };
@@ -0,0 +1,8 @@
1
+ import { addClass } from "./addClass";
2
+ export let createElement = (type, className) => {
3
+ const el = document.createElement(type);
4
+ if (className) {
5
+ addClass(el, className);
6
+ }
7
+ return el;
8
+ };
package/emitEvent.js ADDED
@@ -0,0 +1,8 @@
1
+ export let emitEvent = (type = "customEvent", detail = {}) => {
2
+ if (typeof window.CustomEvent !== "function")
3
+ return;
4
+ document.dispatchEvent(new CustomEvent(type, {
5
+ bubbles: true,
6
+ detail,
7
+ }));
8
+ };
@@ -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
@@ -0,0 +1,5 @@
1
+ export let forEach = (nodes, callback, scope) => {
2
+ for (let i = 0; i < nodes.length; i++) {
3
+ callback.call(scope, nodes[i], i);
4
+ }
5
+ };
package/getDataAttr.js ADDED
@@ -0,0 +1 @@
1
+ export let getDataAttr = (element, attribute) => element.getAttribute("data-" + attribute);
@@ -0,0 +1,4 @@
1
+ export let getDocumentHeight = () => {
2
+ const { body, documentElement } = document;
3
+ return Math.max(body.scrollHeight, documentElement.scrollHeight, body.offsetHeight, documentElement.offsetHeight, body.clientHeight, documentElement.clientHeight);
4
+ };
package/getHeight.js ADDED
@@ -0,0 +1 @@
1
+ export let getHeight = (element) => parseInt(window.getComputedStyle(element).height, 10);
@@ -0,0 +1,8 @@
1
+ import { activeEvents } from "./_listen-delegation";
2
+ export let getListeners = () => {
3
+ const obj = {};
4
+ for (const type in activeEvents) {
5
+ obj[type] = activeEvents[type];
6
+ }
7
+ return obj;
8
+ };
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
+ };
@@ -0,0 +1,10 @@
1
+ export let getOffsetTop = (elem) => {
2
+ let location = 0;
3
+ if (elem.offsetParent) {
4
+ while (elem) {
5
+ location += elem.offsetTop;
6
+ elem = elem.offsetParent;
7
+ }
8
+ }
9
+ return location >= 0 ? location : 0;
10
+ };
@@ -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;
@@ -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;
@@ -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
+ };
@@ -0,0 +1,2 @@
1
+ import { on } from "./on";
2
+ export let listenLoaded = (handler) => on(document, "DOMContentLoaded", handler);
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
+ });
@@ -0,0 +1,2 @@
1
+ import { on } from "./on";
2
+ export let listenResize = (handler, el) => on(el || window, "resize", handler);
@@ -0,0 +1,3 @@
1
+ import { debounce } from "@koine/utils";
2
+ import { listenResize } from "./listenResize";
3
+ export let listenResizeDebounced = (el, ...args) => listenResize(debounce(...args), el);
@@ -0,0 +1,3 @@
1
+ import { throttle } from "@koine/utils";
2
+ import { listenResize } from "./listenResize";
3
+ export let listenResizeThrottled = (el, ...args) => listenResize(throttle(...args), el);
@@ -0,0 +1,5 @@
1
+ import { on } from "./on";
2
+ export let listenScroll = (handler, el) => on(el || window, "scroll", handler, {
3
+ capture: true,
4
+ passive: true,
5
+ });
@@ -0,0 +1,3 @@
1
+ import { debounce } from "@koine/utils";
2
+ import { listenScroll } from "./listenScroll";
3
+ export let listenScrollDebounced = (el, ...args) => listenScroll(debounce(...args), el);
@@ -0,0 +1,3 @@
1
+ import { throttle } from "@koine/utils";
2
+ import { listenScroll } from "./listenScroll";
3
+ export let listenScrollThrottled = (el, ...args) => listenScroll(throttle(...args), el);
package/off.js ADDED
@@ -0,0 +1,9 @@
1
+ export let off = (el, type, handler, options = false) => {
2
+ if (process.env["NODE_ENV"] === "development") {
3
+ if (!el) {
4
+ console.warn("[@koine/dom:off] unexisting DOM element");
5
+ }
6
+ }
7
+ if (el)
8
+ el.removeEventListener(type, handler, options);
9
+ };
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.72"
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.72"
17
+ "version": "2.0.0-beta.73"
18
18
  }
package/removeClass.js ADDED
@@ -0,0 +1,10 @@
1
+ export let removeClass = (el, className = "") => {
2
+ if (process.env["NODE_ENV"] === "development") {
3
+ if (!el) {
4
+ ("[@koine/dom:removeClass] unexisting DOM element");
5
+ return;
6
+ }
7
+ }
8
+ if (el)
9
+ el.classList.remove(className);
10
+ };
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
@@ -0,0 +1,7 @@
1
+ export let setDataAttr = (element, attribute, value) => {
2
+ if (value === null || typeof value === "undefined") {
3
+ element.removeAttribute("data-" + attribute);
4
+ return;
5
+ }
6
+ element.setAttribute("data-" + attribute, value.toString());
7
+ };
@@ -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
+ };