uikit 3.11.2-dev.57792c7e7 → 3.11.2-dev.72dbb9a19

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 (171) hide show
  1. package/.eslintrc.json +4 -49
  2. package/.prettierignore +14 -0
  3. package/.prettierrc.json +13 -0
  4. package/.webstorm.js +3 -3
  5. package/CHANGELOG.md +21 -0
  6. package/build/.eslintrc.json +1 -3
  7. package/build/build.js +26 -28
  8. package/build/icons.js +7 -11
  9. package/build/less.js +48 -36
  10. package/build/package.json +2 -2
  11. package/build/prefix.js +21 -18
  12. package/build/publishDev.js +6 -8
  13. package/build/release.js +20 -17
  14. package/build/scope.js +21 -11
  15. package/build/scss.js +72 -39
  16. package/build/util.js +71 -62
  17. package/build/wrapper/icons.js +0 -2
  18. package/dist/css/uikit-core-rtl.css +42 -32
  19. package/dist/css/uikit-core-rtl.min.css +1 -1
  20. package/dist/css/uikit-core.css +42 -32
  21. package/dist/css/uikit-core.min.css +1 -1
  22. package/dist/css/uikit-rtl.css +42 -32
  23. package/dist/css/uikit-rtl.min.css +1 -1
  24. package/dist/css/uikit.css +42 -32
  25. package/dist/css/uikit.min.css +1 -1
  26. package/dist/js/components/countdown.js +88 -133
  27. package/dist/js/components/countdown.min.js +1 -1
  28. package/dist/js/components/filter.js +408 -439
  29. package/dist/js/components/filter.min.js +1 -1
  30. package/dist/js/components/lightbox-panel.js +1098 -1316
  31. package/dist/js/components/lightbox-panel.min.js +1 -1
  32. package/dist/js/components/lightbox.js +1144 -1393
  33. package/dist/js/components/lightbox.min.js +1 -1
  34. package/dist/js/components/notification.js +94 -114
  35. package/dist/js/components/notification.min.js +1 -1
  36. package/dist/js/components/parallax.js +297 -352
  37. package/dist/js/components/parallax.min.js +1 -1
  38. package/dist/js/components/slider-parallax.js +295 -340
  39. package/dist/js/components/slider-parallax.min.js +1 -1
  40. package/dist/js/components/slider.js +722 -852
  41. package/dist/js/components/slider.min.js +1 -1
  42. package/dist/js/components/slideshow-parallax.js +295 -340
  43. package/dist/js/components/slideshow-parallax.min.js +1 -1
  44. package/dist/js/components/slideshow.js +612 -802
  45. package/dist/js/components/slideshow.min.js +1 -1
  46. package/dist/js/components/sortable.js +587 -621
  47. package/dist/js/components/sortable.min.js +1 -1
  48. package/dist/js/components/tooltip.js +324 -356
  49. package/dist/js/components/tooltip.min.js +1 -1
  50. package/dist/js/components/upload.js +155 -167
  51. package/dist/js/components/upload.min.js +1 -1
  52. package/dist/js/uikit-core.js +5370 -6659
  53. package/dist/js/uikit-core.min.js +1 -1
  54. package/dist/js/uikit-icons.js +7 -9
  55. package/dist/js/uikit-icons.min.js +1 -1
  56. package/dist/js/uikit.js +7904 -9673
  57. package/dist/js/uikit.min.js +1 -1
  58. package/jsconfig.json +1 -1
  59. package/package.json +64 -60
  60. package/src/js/api/boot.js +25 -32
  61. package/src/js/api/component.js +15 -28
  62. package/src/js/api/global.js +6 -12
  63. package/src/js/api/hooks.js +14 -33
  64. package/src/js/api/instance.js +7 -15
  65. package/src/js/api/state.js +79 -100
  66. package/src/js/components/countdown.js +24 -50
  67. package/src/js/components/filter.js +70 -66
  68. package/src/js/components/index.js +13 -13
  69. package/src/js/components/internal/lightbox-animations.js +14 -25
  70. package/src/js/components/internal/slider-transitioner.js +66 -45
  71. package/src/js/components/internal/slideshow-animations.js +46 -64
  72. package/src/js/components/lightbox-panel.js +107 -105
  73. package/src/js/components/lightbox.js +17 -39
  74. package/src/js/components/notification.js +49 -43
  75. package/src/js/components/parallax.js +21 -46
  76. package/src/js/components/slider-parallax.js +13 -23
  77. package/src/js/components/slider.js +75 -64
  78. package/src/js/components/slideshow-parallax.js +1 -1
  79. package/src/js/components/slideshow.js +8 -13
  80. package/src/js/components/sortable.js +126 -108
  81. package/src/js/components/tooltip.js +41 -31
  82. package/src/js/components/upload.js +52 -63
  83. package/src/js/core/accordion.js +53 -48
  84. package/src/js/core/alert.js +9 -17
  85. package/src/js/core/core.js +74 -53
  86. package/src/js/core/cover.js +11 -15
  87. package/src/js/core/drop.js +107 -93
  88. package/src/js/core/form-custom.js +20 -25
  89. package/src/js/core/gif.js +3 -7
  90. package/src/js/core/grid.js +57 -58
  91. package/src/js/core/height-match.js +16 -29
  92. package/src/js/core/height-viewport.js +29 -36
  93. package/src/js/core/icon.js +38 -50
  94. package/src/js/core/img.js +59 -58
  95. package/src/js/core/index.js +39 -39
  96. package/src/js/core/leader.js +9 -18
  97. package/src/js/core/margin.js +21 -37
  98. package/src/js/core/modal.js +49 -36
  99. package/src/js/core/nav.js +2 -4
  100. package/src/js/core/navbar.js +113 -85
  101. package/src/js/core/offcanvas.js +49 -53
  102. package/src/js/core/overflow-auto.js +13 -17
  103. package/src/js/core/responsive.js +14 -12
  104. package/src/js/core/scroll.js +10 -20
  105. package/src/js/core/scrollspy-nav.js +34 -31
  106. package/src/js/core/scrollspy.js +37 -54
  107. package/src/js/core/sticky.js +187 -116
  108. package/src/js/core/svg.js +60 -79
  109. package/src/js/core/switcher.js +47 -46
  110. package/src/js/core/tab.js +7 -10
  111. package/src/js/core/toggle.js +64 -66
  112. package/src/js/core/video.js +11 -22
  113. package/src/js/mixin/animate.js +19 -20
  114. package/src/js/mixin/class.js +2 -4
  115. package/src/js/mixin/container.js +7 -11
  116. package/src/js/mixin/internal/animate-fade.js +73 -30
  117. package/src/js/mixin/internal/animate-slide.js +58 -41
  118. package/src/js/mixin/internal/slideshow-animations.js +7 -14
  119. package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
  120. package/src/js/mixin/media.js +5 -10
  121. package/src/js/mixin/modal.js +89 -66
  122. package/src/js/mixin/parallax.js +80 -64
  123. package/src/js/mixin/position.js +26 -20
  124. package/src/js/mixin/slider-autoplay.js +12 -21
  125. package/src/js/mixin/slider-drag.js +64 -65
  126. package/src/js/mixin/slider-nav.js +26 -35
  127. package/src/js/mixin/slider-reactive.js +2 -8
  128. package/src/js/mixin/slider.js +48 -55
  129. package/src/js/mixin/slideshow.js +13 -19
  130. package/src/js/mixin/togglable.js +89 -63
  131. package/src/js/uikit-core.js +2 -4
  132. package/src/js/uikit.js +2 -4
  133. package/src/js/util/ajax.js +20 -39
  134. package/src/js/util/animation.js +77 -75
  135. package/src/js/util/attr.js +17 -21
  136. package/src/js/util/class.js +14 -52
  137. package/src/js/util/dimensions.js +76 -47
  138. package/src/js/util/dom.js +40 -73
  139. package/src/js/util/env.js +7 -12
  140. package/src/js/util/event.js +60 -59
  141. package/src/js/util/fastdom.js +3 -8
  142. package/src/js/util/filter.js +17 -34
  143. package/src/js/util/index.js +0 -1
  144. package/src/js/util/lang.js +81 -121
  145. package/src/js/util/mouse.js +19 -17
  146. package/src/js/util/options.js +35 -49
  147. package/src/js/util/player.js +40 -36
  148. package/src/js/util/position.js +54 -46
  149. package/src/js/util/selector.js +43 -58
  150. package/src/js/util/style.js +36 -46
  151. package/src/js/util/viewport.js +81 -66
  152. package/src/less/components/base.less +0 -5
  153. package/src/less/components/flex.less +0 -9
  154. package/src/less/components/leader.less +0 -1
  155. package/src/less/components/navbar.less +0 -7
  156. package/src/less/components/utility.less +22 -0
  157. package/src/scss/components/base.scss +0 -5
  158. package/src/scss/components/flex.scss +0 -9
  159. package/src/scss/components/form.scss +3 -3
  160. package/src/scss/components/icon.scss +2 -2
  161. package/src/scss/components/leader.scss +0 -1
  162. package/src/scss/components/navbar.scss +0 -7
  163. package/src/scss/components/search.scss +1 -1
  164. package/src/scss/components/utility.scss +22 -0
  165. package/src/scss/variables-theme.scss +6 -6
  166. package/src/scss/variables.scss +6 -6
  167. package/tests/js/index.js +114 -85
  168. package/tests/sticky-parallax.html +44 -41
  169. package/tests/sticky.html +56 -24
  170. package/src/js/mixin/flex-bug.js +0 -56
  171. package/src/js/util/promise.js +0 -191
@@ -1,19 +1,15 @@
1
- import {isIE} from './env';
2
- import {findAll} from './selector';
3
- import {closest, within} from './filter';
4
- import {isArray, isBoolean, isFunction, isString, toNode, toNodes} from './lang';
1
+ import { findAll } from './selector';
2
+ import { closest, within } from './filter';
3
+ import { isArray, isFunction, isString, toNode, toNodes } from './lang';
5
4
 
6
5
  export function on(...args) {
7
-
8
- let [targets, type, selector, listener, useCapture] = getArgs(args);
9
-
10
- targets = toEventTargets(targets);
6
+ let [targets, types, selector, listener, useCapture = false] = getArgs(args);
11
7
 
12
8
  if (listener.length > 1) {
13
9
  listener = detail(listener);
14
10
  }
15
11
 
16
- if (useCapture && useCapture.self) {
12
+ if (useCapture?.self) {
17
13
  listener = selfFilter(listener);
18
14
  }
19
15
 
@@ -21,80 +17,92 @@ export function on(...args) {
21
17
  listener = delegate(selector, listener);
22
18
  }
23
19
 
24
- useCapture = useCaptureFilter(useCapture);
20
+ for (const type of types) {
21
+ for (const target of targets) {
22
+ target.addEventListener(type, listener, useCapture);
23
+ }
24
+ }
25
25
 
26
- type.split(' ').forEach(type =>
27
- targets.forEach(target =>
28
- target.addEventListener(type, listener, useCapture)
29
- )
30
- );
31
- return () => off(targets, type, listener, useCapture);
26
+ return () => off(targets, types, listener, useCapture);
32
27
  }
33
28
 
34
- export function off(targets, type, listener, useCapture = false) {
35
- useCapture = useCaptureFilter(useCapture);
36
- targets = toEventTargets(targets);
37
- type.split(' ').forEach(type =>
38
- targets.forEach(target =>
39
- target.removeEventListener(type, listener, useCapture)
40
- )
41
- );
29
+ export function off(...args) {
30
+ let [targets, types, , listener, useCapture = false] = getArgs(args);
31
+ for (const type of types) {
32
+ for (const target of targets) {
33
+ target.removeEventListener(type, listener, useCapture);
34
+ }
35
+ }
42
36
  }
43
37
 
44
38
  export function once(...args) {
45
-
46
- const [element, type, selector, listener, useCapture, condition] = getArgs(args);
47
- const off = on(element, type, selector, e => {
48
- const result = !condition || condition(e);
49
- if (result) {
50
- off();
51
- listener(e, result);
52
- }
53
- }, useCapture);
39
+ const [element, types, selector, listener, useCapture = false, condition] = getArgs(args);
40
+ const off = on(
41
+ element,
42
+ types,
43
+ selector,
44
+ (e) => {
45
+ const result = !condition || condition(e);
46
+ if (result) {
47
+ off();
48
+ listener(e, result);
49
+ }
50
+ },
51
+ useCapture
52
+ );
54
53
 
55
54
  return off;
56
55
  }
57
56
 
58
57
  export function trigger(targets, event, detail) {
59
- return toEventTargets(targets).reduce((notCanceled, target) =>
60
- notCanceled && target.dispatchEvent(createEvent(event, true, true, detail))
61
- , true);
58
+ return toEventTargets(targets).every((target) =>
59
+ target.dispatchEvent(createEvent(event, true, true, detail))
60
+ );
62
61
  }
63
62
 
64
63
  export function createEvent(e, bubbles = true, cancelable = false, detail) {
65
64
  if (isString(e)) {
66
- const event = document.createEvent('CustomEvent'); // IE 11
67
- event.initCustomEvent(e, bubbles, cancelable, detail);
68
- e = event;
65
+ e = new CustomEvent(e, { bubbles, cancelable, detail });
69
66
  }
70
67
 
71
68
  return e;
72
69
  }
73
70
 
74
71
  function getArgs(args) {
72
+ // Event targets
73
+ args[0] = toEventTargets(args[0]);
74
+
75
+ // Event types
76
+ if (isString(args[1])) {
77
+ args[1] = args[1].split(' ');
78
+ }
79
+
80
+ // Delegate?
75
81
  if (isFunction(args[2])) {
76
82
  args.splice(2, 0, false);
77
83
  }
84
+
78
85
  return args;
79
86
  }
80
87
 
81
88
  function delegate(selector, listener) {
82
- return e => {
83
-
84
- const current = selector[0] === '>'
85
- ? findAll(selector, e.currentTarget).reverse().filter(element => within(e.target, element))[0]
86
- : closest(e.target, selector);
89
+ return (e) => {
90
+ const current =
91
+ selector[0] === '>'
92
+ ? findAll(selector, e.currentTarget)
93
+ .reverse()
94
+ .filter((element) => within(e.target, element))[0]
95
+ : closest(e.target, selector);
87
96
 
88
97
  if (current) {
89
98
  e.current = current;
90
99
  listener.call(this, e);
91
100
  }
92
-
93
101
  };
94
102
  }
95
103
 
96
104
  function detail(listener) {
97
- return e => isArray(e.detail) ? listener(e, ...e.detail) : listener(e);
105
+ return (e) => (isArray(e.detail) ? listener(e, ...e.detail) : listener(e));
98
106
  }
99
107
 
100
108
  function selfFilter(listener) {
@@ -105,12 +113,6 @@ function selfFilter(listener) {
105
113
  };
106
114
  }
107
115
 
108
- function useCaptureFilter(options) {
109
- return options && isIE && !isBoolean(options)
110
- ? !!options.capture
111
- : options;
112
- }
113
-
114
116
  function isEventTarget(target) {
115
117
  return target && 'addEventListener' in target;
116
118
  }
@@ -123,10 +125,10 @@ export function toEventTargets(target) {
123
125
  return isArray(target)
124
126
  ? target.map(toEventTarget).filter(Boolean)
125
127
  : isString(target)
126
- ? findAll(target)
127
- : isEventTarget(target)
128
- ? [target]
129
- : toNodes(target);
128
+ ? findAll(target)
129
+ : isEventTarget(target)
130
+ ? [target]
131
+ : toNodes(target);
130
132
  }
131
133
 
132
134
  export function isTouch(e) {
@@ -134,8 +136,7 @@ export function isTouch(e) {
134
136
  }
135
137
 
136
138
  export function getEventPos(e) {
137
- const {touches, changedTouches} = e;
138
- const {clientX: x, clientY: y} = touches && touches[0] || changedTouches && changedTouches[0] || e;
139
+ const { clientX: x, clientY: y } = e.touches?.[0] || e.changedTouches?.[0] || e;
139
140
 
140
- return {x, y};
141
+ return { x, y };
141
142
  }
@@ -1,4 +1,3 @@
1
- import {Promise} from './promise';
2
1
  /*
3
2
  Based on:
4
3
  Copyright (c) 2016 Wilson Page wilsonpage@me.com
@@ -6,7 +5,6 @@ import {Promise} from './promise';
6
5
  */
7
6
 
8
7
  export const fastdom = {
9
-
10
8
  reads: [],
11
9
  writes: [],
12
10
 
@@ -27,11 +25,10 @@ export const fastdom = {
27
25
  remove(this.writes, task);
28
26
  },
29
27
 
30
- flush
31
-
28
+ flush,
32
29
  };
33
30
 
34
- function flush(recursion = 1) {
31
+ function flush(recursion) {
35
32
  runTasks(fastdom.reads);
36
33
  runTasks(fastdom.writes.splice(0));
37
34
 
@@ -44,7 +41,6 @@ function flush(recursion = 1) {
44
41
 
45
42
  const RECURSION_LIMIT = 4;
46
43
  function scheduleFlush(recursion) {
47
-
48
44
  if (fastdom.scheduled) {
49
45
  return;
50
46
  }
@@ -53,9 +49,8 @@ function scheduleFlush(recursion) {
53
49
  if (recursion && recursion < RECURSION_LIMIT) {
54
50
  Promise.resolve().then(() => flush(recursion));
55
51
  } else {
56
- requestAnimationFrame(() => flush());
52
+ requestAnimationFrame(() => flush(1));
57
53
  }
58
-
59
54
  }
60
55
 
61
56
  function runTasks(tasks) {
@@ -1,5 +1,4 @@
1
- import {inBrowser} from './env';
2
- import {isDocument, isElement, isString, noop, startsWith, toNode, toNodes} from './lang';
1
+ import { isElement, isString, startsWith, toNode, toNodes } from './lang';
3
2
 
4
3
  const voidElements = {
5
4
  area: true,
@@ -17,19 +16,21 @@ const voidElements = {
17
16
  param: true,
18
17
  source: true,
19
18
  track: true,
20
- wbr: true
19
+ wbr: true,
21
20
  };
22
21
  export function isVoidElement(element) {
23
- return toNodes(element).some(element => voidElements[element.tagName.toLowerCase()]);
22
+ return toNodes(element).some((element) => voidElements[element.tagName.toLowerCase()]);
24
23
  }
25
24
 
26
25
  export function isVisible(element) {
27
- return toNodes(element).some(element => element.offsetWidth || element.offsetHeight || element.getClientRects().length);
26
+ return toNodes(element).some(
27
+ (element) => element.offsetWidth || element.offsetHeight || element.getClientRects().length
28
+ );
28
29
  }
29
30
 
30
31
  export const selInput = 'input,select,textarea,button';
31
32
  export function isInput(element) {
32
- return toNodes(element).some(element => matches(element, selInput));
33
+ return toNodes(element).some((element) => matches(element, selInput));
33
34
  }
34
35
 
35
36
  export const selFocusable = `${selInput},a[href],[tabindex]`;
@@ -43,45 +44,29 @@ export function parent(element) {
43
44
  }
44
45
 
45
46
  export function filter(element, selector) {
46
- return toNodes(element).filter(element => matches(element, selector));
47
+ return toNodes(element).filter((element) => matches(element, selector));
47
48
  }
48
49
 
49
- const elProto = inBrowser ? Element.prototype : {};
50
- const matchesFn = elProto.matches || elProto.webkitMatchesSelector || elProto.msMatchesSelector || noop;
51
-
52
50
  export function matches(element, selector) {
53
- return toNodes(element).some(element => matchesFn.call(element, selector));
51
+ return toNodes(element).some((element) => element.matches(selector));
54
52
  }
55
53
 
56
- const closestFn = elProto.closest || function (selector) {
57
- let ancestor = this;
58
-
59
- do {
60
-
61
- if (matches(ancestor, selector)) {
62
- return ancestor;
63
- }
64
-
65
- } while ((ancestor = parent(ancestor)));
66
- };
67
-
68
54
  export function closest(element, selector) {
69
-
70
55
  if (startsWith(selector, '>')) {
71
56
  selector = selector.slice(1);
72
57
  }
73
58
 
74
59
  return isElement(element)
75
- ? closestFn.call(element, selector)
76
- : toNodes(element).map(element => closest(element, selector)).filter(Boolean);
60
+ ? element.closest(selector)
61
+ : toNodes(element)
62
+ .map((element) => closest(element, selector))
63
+ .filter(Boolean);
77
64
  }
78
65
 
79
66
  export function within(element, selector) {
80
- return !isString(selector)
81
- ? element === selector || (isDocument(selector)
82
- ? selector.documentElement
83
- : toNode(selector)).contains(toNode(element)) // IE 11 document does not implement contains
84
- : matches(element, selector) || !!closest(element, selector);
67
+ return isString(selector)
68
+ ? matches(element, selector) || !!closest(element, selector)
69
+ : element === selector || toNode(selector).contains(toNode(element));
85
70
  }
86
71
 
87
72
  export function parents(element, selector) {
@@ -103,7 +88,5 @@ export function children(element, selector) {
103
88
  }
104
89
 
105
90
  export function index(element, ref) {
106
- return ref
107
- ? toNodes(element).indexOf(toNode(ref))
108
- : children(parent(element)).indexOf(element);
91
+ return ref ? toNodes(element).indexOf(toNode(ref)) : children(parent(element)).indexOf(element);
109
92
  }
@@ -13,7 +13,6 @@ export * from './mouse';
13
13
  export * from './options';
14
14
  export * from './player';
15
15
  export * from './position';
16
- export * from './promise';
17
16
  export * from './selector';
18
17
  export * from './style';
19
18
  export * from './viewport';
@@ -1,5 +1,4 @@
1
- const objPrototype = Object.prototype;
2
- const {hasOwnProperty} = objPrototype;
1
+ const { hasOwnProperty, toString } = Object.prototype;
3
2
 
4
3
  export function hasOwn(obj, key) {
5
4
  return hasOwnProperty.call(obj, key);
@@ -7,18 +6,13 @@ export function hasOwn(obj, key) {
7
6
 
8
7
  const hyphenateRe = /\B([A-Z])/g;
9
8
 
10
- export const hyphenate = memoize(str => str
11
- .replace(hyphenateRe, '-$1')
12
- .toLowerCase()
13
- );
9
+ export const hyphenate = memoize((str) => str.replace(hyphenateRe, '-$1').toLowerCase());
14
10
 
15
11
  const camelizeRe = /-(\w)/g;
16
12
 
17
- export const camelize = memoize(str =>
18
- str.replace(camelizeRe, toUpper)
19
- );
13
+ export const camelize = memoize((str) => str.replace(camelizeRe, toUpper));
20
14
 
21
- export const ucfirst = memoize(str =>
15
+ export const ucfirst = memoize((str) =>
22
16
  str.length ? toUpper(null, str.charAt(0)) + str.slice(1) : ''
23
17
  );
24
18
 
@@ -26,43 +20,24 @@ function toUpper(_, c) {
26
20
  return c ? c.toUpperCase() : '';
27
21
  }
28
22
 
29
- const strPrototype = String.prototype;
30
- const startsWithFn = strPrototype.startsWith || function (search) { return this.lastIndexOf(search, 0) === 0; };
31
-
32
23
  export function startsWith(str, search) {
33
- return startsWithFn.call(str, search);
24
+ return str.startsWith(search);
34
25
  }
35
26
 
36
- const endsWithFn = strPrototype.endsWith || function (search) { return this.substr(-search.length) === search; };
37
-
38
27
  export function endsWith(str, search) {
39
- return endsWithFn.call(str, search);
28
+ return str.endsWith(search);
40
29
  }
41
30
 
42
- const arrPrototype = Array.prototype;
43
-
44
- const includesFn = function (search, i) { return !!~this.indexOf(search, i); };
45
- const includesStr = strPrototype.includes || includesFn;
46
- const includesArray = arrPrototype.includes || includesFn;
47
-
48
31
  export function includes(obj, search) {
49
- return obj && (isString(obj) ? includesStr : includesArray).call(obj, search);
32
+ return obj && obj.includes(search);
50
33
  }
51
34
 
52
- const findIndexFn = arrPrototype.findIndex || function (predicate) {
53
- for (let i = 0; i < this.length; i++) {
54
- if (predicate.call(arguments[1], this[i], i, this)) {
55
- return i;
56
- }
57
- }
58
- return -1;
59
- };
60
-
61
35
  export function findIndex(array, predicate) {
62
- return findIndexFn.call(array, predicate);
36
+ return array.findIndex(predicate);
63
37
  }
64
38
 
65
- export const {isArray} = Array;
39
+ export const { isArray, from: toArray } = Array;
40
+ export const { assign } = Object;
66
41
 
67
42
  export function isFunction(obj) {
68
43
  return typeof obj === 'function';
@@ -72,7 +47,6 @@ export function isObject(obj) {
72
47
  return obj !== null && typeof obj === 'object';
73
48
  }
74
49
 
75
- const {toString} = objPrototype;
76
50
  export function isPlainObject(obj) {
77
51
  return toString.call(obj) === '[object Object]';
78
52
  }
@@ -110,16 +84,11 @@ export function isNumber(value) {
110
84
  }
111
85
 
112
86
  export function isNumeric(value) {
113
- return isNumber(value) || isString(value) && !isNaN(value - parseFloat(value));
87
+ return isNumber(value) || (isString(value) && !isNaN(value - parseFloat(value)));
114
88
  }
115
89
 
116
90
  export function isEmpty(obj) {
117
- return !(isArray(obj)
118
- ? obj.length
119
- : isObject(obj)
120
- ? Object.keys(obj).length
121
- : false
122
- );
91
+ return !(isArray(obj) ? obj.length : isObject(obj) ? Object.keys(obj).length : false);
123
92
  }
124
93
 
125
94
  export function isUndefined(value) {
@@ -130,10 +99,10 @@ export function toBoolean(value) {
130
99
  return isBoolean(value)
131
100
  ? value
132
101
  : value === 'true' || value === '1' || value === ''
133
- ? true
134
- : value === 'false' || value === '0'
135
- ? false
136
- : value;
102
+ ? true
103
+ : value === 'false' || value === '0'
104
+ ? false
105
+ : value;
137
106
  }
138
107
 
139
108
  export function toNumber(value) {
@@ -145,14 +114,12 @@ export function toFloat(value) {
145
114
  return parseFloat(value) || 0;
146
115
  }
147
116
 
148
- export const toArray = Array.from || (value => arrPrototype.slice.call(value));
149
-
150
117
  export function toNode(element) {
151
118
  return toNodes(element)[0];
152
119
  }
153
120
 
154
121
  export function toNodes(element) {
155
- return element && (isNode(element) ? [element] : toArray(element).filter(isNode)) || [];
122
+ return (element && (isNode(element) ? [element] : Array.from(element).filter(isNode))) || [];
156
123
  }
157
124
 
158
125
  export function toWindow(element) {
@@ -162,52 +129,27 @@ export function toWindow(element) {
162
129
 
163
130
  element = toNode(element);
164
131
 
165
- return element
166
- ? (isDocument(element)
167
- ? element
168
- : element.ownerDocument
169
- ).defaultView
170
- : window;
132
+ return element ? (isDocument(element) ? element : element.ownerDocument).defaultView : window;
171
133
  }
172
134
 
173
135
  export function toMs(time) {
174
- return !time
175
- ? 0
176
- : endsWith(time, 'ms')
177
- ? toFloat(time)
178
- : toFloat(time) * 1000;
136
+ return time ? (endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000) : 0;
179
137
  }
180
138
 
181
139
  export function isEqual(value, other) {
182
- return value === other
183
- || isObject(value)
184
- && isObject(other)
185
- && Object.keys(value).length === Object.keys(other).length
186
- && each(value, (val, key) => val === other[key]);
140
+ return (
141
+ value === other ||
142
+ (isObject(value) &&
143
+ isObject(other) &&
144
+ Object.keys(value).length === Object.keys(other).length &&
145
+ each(value, (val, key) => val === other[key]))
146
+ );
187
147
  }
188
148
 
189
149
  export function swap(value, a, b) {
190
- return value.replace(
191
- new RegExp(`${a}|${b}`, 'g'),
192
- match => match === a ? b : a
193
- );
150
+ return value.replace(new RegExp(`${a}|${b}`, 'g'), (match) => (match === a ? b : a));
194
151
  }
195
152
 
196
- export const assign = Object.assign || function (target, ...args) {
197
- target = Object(target);
198
- for (let i = 0; i < args.length; i++) {
199
- const source = args[i];
200
- if (source !== null) {
201
- for (const key in source) {
202
- if (hasOwn(source, key)) {
203
- target[key] = source[key];
204
- }
205
- }
206
- }
207
- }
208
- return target;
209
- };
210
-
211
153
  export function last(array) {
212
154
  return array[array.length - 1];
213
155
  }
@@ -222,21 +164,16 @@ export function each(obj, cb) {
222
164
  }
223
165
 
224
166
  export function sortBy(array, prop) {
225
- return array.slice().sort(({[prop]: propA = 0}, {[prop]: propB = 0}) =>
226
- propA > propB
227
- ? 1
228
- : propB > propA
229
- ? -1
230
- : 0
231
- );
167
+ return array
168
+ .slice()
169
+ .sort(({ [prop]: propA = 0 }, { [prop]: propB = 0 }) =>
170
+ propA > propB ? 1 : propB > propA ? -1 : 0
171
+ );
232
172
  }
233
173
 
234
174
  export function uniqueBy(array, prop) {
235
175
  const seen = new Set();
236
- return array.filter(({[prop]: check}) => seen.has(check)
237
- ? false
238
- : seen.add(check) || true // IE 11 does not return the Set object
239
- );
176
+ return array.filter(({ [prop]: check }) => (seen.has(check) ? false : seen.add(check)));
240
177
  }
241
178
 
242
179
  export function clamp(number, min = 0, max = 1) {
@@ -246,36 +183,48 @@ export function clamp(number, min = 0, max = 1) {
246
183
  export function noop() {}
247
184
 
248
185
  export function intersectRect(...rects) {
249
- return [['bottom', 'top'], ['right', 'left']].every(([minProp, maxProp]) =>
250
- Math.min(...rects.map(({[minProp]: min}) => min)) - Math.max(...rects.map(({[maxProp]: max}) => max)) > 0
186
+ return [
187
+ ['bottom', 'top'],
188
+ ['right', 'left'],
189
+ ].every(
190
+ ([minProp, maxProp]) =>
191
+ Math.min(...rects.map(({ [minProp]: min }) => min)) -
192
+ Math.max(...rects.map(({ [maxProp]: max }) => max)) >
193
+ 0
251
194
  );
252
195
  }
253
196
 
254
197
  export function pointInRect(point, rect) {
255
- return point.x <= rect.right &&
198
+ return (
199
+ point.x <= rect.right &&
256
200
  point.x >= rect.left &&
257
201
  point.y <= rect.bottom &&
258
- point.y >= rect.top;
202
+ point.y >= rect.top
203
+ );
259
204
  }
260
205
 
261
206
  export const Dimensions = {
262
-
263
207
  ratio(dimensions, prop, value) {
264
-
265
208
  const aProp = prop === 'width' ? 'height' : 'width';
266
209
 
267
210
  return {
268
- [aProp]: dimensions[prop] ? Math.round(value * dimensions[aProp] / dimensions[prop]) : dimensions[aProp],
269
- [prop]: value
211
+ [aProp]: dimensions[prop]
212
+ ? Math.round((value * dimensions[aProp]) / dimensions[prop])
213
+ : dimensions[aProp],
214
+ [prop]: value,
270
215
  };
271
216
  },
272
217
 
273
218
  contain(dimensions, maxDimensions) {
274
- dimensions = assign({}, dimensions);
275
-
276
- each(dimensions, (_, prop) => dimensions = dimensions[prop] > maxDimensions[prop]
277
- ? this.ratio(dimensions, prop, maxDimensions[prop])
278
- : dimensions
219
+ dimensions = { ...dimensions };
220
+
221
+ each(
222
+ dimensions,
223
+ (_, prop) =>
224
+ (dimensions =
225
+ dimensions[prop] > maxDimensions[prop]
226
+ ? this.ratio(dimensions, prop, maxDimensions[prop])
227
+ : dimensions)
279
228
  );
280
229
 
281
230
  return dimensions;
@@ -284,21 +233,23 @@ export const Dimensions = {
284
233
  cover(dimensions, maxDimensions) {
285
234
  dimensions = this.contain(dimensions, maxDimensions);
286
235
 
287
- each(dimensions, (_, prop) => dimensions = dimensions[prop] < maxDimensions[prop]
288
- ? this.ratio(dimensions, prop, maxDimensions[prop])
289
- : dimensions
236
+ each(
237
+ dimensions,
238
+ (_, prop) =>
239
+ (dimensions =
240
+ dimensions[prop] < maxDimensions[prop]
241
+ ? this.ratio(dimensions, prop, maxDimensions[prop])
242
+ : dimensions)
290
243
  );
291
244
 
292
245
  return dimensions;
293
- }
294
-
246
+ },
295
247
  };
296
248
 
297
249
  export function getIndex(i, elements, current = 0, finite = false) {
298
-
299
250
  elements = toNodes(elements);
300
251
 
301
- const {length} = elements;
252
+ const { length } = elements;
302
253
 
303
254
  if (!length) {
304
255
  return -1;
@@ -307,10 +258,10 @@ export function getIndex(i, elements, current = 0, finite = false) {
307
258
  i = isNumeric(i)
308
259
  ? toNumber(i)
309
260
  : i === 'next'
310
- ? current + 1
311
- : i === 'previous'
312
- ? current - 1
313
- : elements.indexOf(toNode(i));
261
+ ? current + 1
262
+ : i === 'previous'
263
+ ? current - 1
264
+ : elements.indexOf(toNode(i));
314
265
 
315
266
  if (finite) {
316
267
  return clamp(i, 0, length - 1);
@@ -323,5 +274,14 @@ export function getIndex(i, elements, current = 0, finite = false) {
323
274
 
324
275
  export function memoize(fn) {
325
276
  const cache = Object.create(null);
326
- return key => cache[key] || (cache[key] = fn(key));
277
+ return (key) => cache[key] || (cache[key] = fn(key));
278
+ }
279
+
280
+ export class Deferred {
281
+ constructor() {
282
+ this.promise = new Promise((resolve, reject) => {
283
+ this.reject = reject;
284
+ this.resolve = resolve;
285
+ });
286
+ }
327
287
  }