uikit 3.11.2-dev.f2970ffaa → 3.12.0

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 (226) 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 +55 -19
  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 +133 -201
  19. package/dist/css/uikit-core-rtl.min.css +1 -1
  20. package/dist/css/uikit-core.css +133 -201
  21. package/dist/css/uikit-core.min.css +1 -1
  22. package/dist/css/uikit-rtl.css +135 -207
  23. package/dist/css/uikit-rtl.min.css +1 -1
  24. package/dist/css/uikit.css +135 -207
  25. package/dist/css/uikit.min.css +1 -1
  26. package/dist/js/components/countdown.js +66 -138
  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 +1091 -1319
  31. package/dist/js/components/lightbox-panel.min.js +1 -1
  32. package/dist/js/components/lightbox.js +1137 -1396
  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 +347 -372
  37. package/dist/js/components/parallax.min.js +1 -1
  38. package/dist/js/components/slider-parallax.js +345 -360
  39. package/dist/js/components/slider-parallax.min.js +1 -1
  40. package/dist/js/components/slider.js +749 -843
  41. package/dist/js/components/slider.min.js +1 -1
  42. package/dist/js/components/slideshow-parallax.js +345 -360
  43. package/dist/js/components/slideshow-parallax.min.js +1 -1
  44. package/dist/js/components/slideshow.js +628 -798
  45. package/dist/js/components/slideshow.min.js +1 -1
  46. package/dist/js/components/sortable.js +587 -620
  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 +156 -167
  51. package/dist/js/components/upload.min.js +1 -1
  52. package/dist/js/uikit-core.js +5324 -6527
  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 +8006 -9663
  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 +199 -187
  66. package/src/js/components/countdown.js +32 -85
  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-preload.js +9 -0
  71. package/src/js/components/internal/slider-transitioner.js +66 -45
  72. package/src/js/components/internal/slideshow-animations.js +46 -64
  73. package/src/js/components/lightbox-panel.js +107 -105
  74. package/src/js/components/lightbox.js +17 -39
  75. package/src/js/components/notification.js +49 -43
  76. package/src/js/components/parallax.js +21 -46
  77. package/src/js/components/slider-parallax.js +13 -23
  78. package/src/js/components/slider.js +117 -89
  79. package/src/js/components/slideshow-parallax.js +1 -1
  80. package/src/js/components/slideshow.js +15 -13
  81. package/src/js/components/sortable.js +125 -106
  82. package/src/js/components/tooltip.js +41 -31
  83. package/src/js/components/upload.js +53 -63
  84. package/src/js/core/accordion.js +58 -48
  85. package/src/js/core/alert.js +9 -17
  86. package/src/js/core/core.js +17 -69
  87. package/src/js/core/cover.js +15 -15
  88. package/src/js/core/drop.js +110 -94
  89. package/src/js/core/form-custom.js +22 -27
  90. package/src/js/core/gif.js +3 -7
  91. package/src/js/core/grid.js +57 -58
  92. package/src/js/core/height-match.js +16 -29
  93. package/src/js/core/height-viewport.js +30 -34
  94. package/src/js/core/icon.js +47 -52
  95. package/src/js/core/img.js +153 -143
  96. package/src/js/core/index.js +39 -39
  97. package/src/js/core/leader.js +9 -18
  98. package/src/js/core/margin.js +21 -37
  99. package/src/js/core/modal.js +49 -36
  100. package/src/js/core/nav.js +2 -4
  101. package/src/js/core/navbar.js +113 -85
  102. package/src/js/core/offcanvas.js +51 -54
  103. package/src/js/core/overflow-auto.js +13 -17
  104. package/src/js/core/responsive.js +14 -12
  105. package/src/js/core/scroll.js +10 -20
  106. package/src/js/core/scrollspy-nav.js +34 -31
  107. package/src/js/core/scrollspy.js +37 -54
  108. package/src/js/core/sticky.js +175 -123
  109. package/src/js/core/svg.js +68 -83
  110. package/src/js/core/switcher.js +56 -47
  111. package/src/js/core/tab.js +7 -10
  112. package/src/js/core/toggle.js +69 -68
  113. package/src/js/core/video.js +22 -21
  114. package/src/js/mixin/animate.js +19 -20
  115. package/src/js/mixin/class.js +2 -4
  116. package/src/js/mixin/container.js +7 -11
  117. package/src/js/mixin/internal/animate-fade.js +73 -30
  118. package/src/js/mixin/internal/animate-slide.js +58 -41
  119. package/src/js/mixin/internal/slideshow-animations.js +7 -14
  120. package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
  121. package/src/js/mixin/lazyload.js +20 -0
  122. package/src/js/mixin/media.js +5 -10
  123. package/src/js/mixin/modal.js +89 -66
  124. package/src/js/mixin/parallax.js +149 -107
  125. package/src/js/mixin/position.js +26 -20
  126. package/src/js/mixin/slider-autoplay.js +12 -21
  127. package/src/js/mixin/slider-drag.js +64 -65
  128. package/src/js/mixin/slider-nav.js +26 -35
  129. package/src/js/mixin/slider-reactive.js +2 -8
  130. package/src/js/mixin/slider.js +47 -60
  131. package/src/js/mixin/slideshow.js +12 -22
  132. package/src/js/mixin/swipe.js +72 -0
  133. package/src/js/mixin/togglable.js +89 -63
  134. package/src/js/uikit-core.js +2 -4
  135. package/src/js/uikit.js +2 -4
  136. package/src/js/util/ajax.js +25 -40
  137. package/src/js/util/animation.js +77 -75
  138. package/src/js/util/attr.js +17 -21
  139. package/src/js/util/class.js +14 -52
  140. package/src/js/util/dimensions.js +78 -49
  141. package/src/js/util/dom.js +37 -66
  142. package/src/js/util/env.js +7 -12
  143. package/src/js/util/event.js +60 -59
  144. package/src/js/util/fastdom.js +1 -6
  145. package/src/js/util/filter.js +18 -36
  146. package/src/js/util/index.js +1 -1
  147. package/src/js/util/lang.js +82 -121
  148. package/src/js/util/mouse.js +19 -17
  149. package/src/js/util/observer.js +36 -0
  150. package/src/js/util/options.js +35 -49
  151. package/src/js/util/player.js +41 -36
  152. package/src/js/util/position.js +54 -46
  153. package/src/js/util/selector.js +43 -58
  154. package/src/js/util/style.js +39 -49
  155. package/src/js/util/viewport.js +75 -64
  156. package/src/less/components/base.less +10 -33
  157. package/src/less/components/flex.less +0 -9
  158. package/src/less/components/form-range.less +48 -95
  159. package/src/less/components/form.less +0 -1
  160. package/src/less/components/height.less +3 -0
  161. package/src/less/components/leader.less +0 -1
  162. package/src/less/components/lightbox.less +0 -1
  163. package/src/less/components/modal.less +3 -7
  164. package/src/less/components/navbar.less +0 -7
  165. package/src/less/components/progress.less +14 -36
  166. package/src/less/components/slider.less +0 -3
  167. package/src/less/components/slideshow.less +0 -3
  168. package/src/less/components/text.less +16 -32
  169. package/src/less/components/utility.less +25 -0
  170. package/src/scss/components/base.scss +10 -33
  171. package/src/scss/components/flex.scss +0 -9
  172. package/src/scss/components/form-range.scss +48 -95
  173. package/src/scss/components/form.scss +3 -4
  174. package/src/scss/components/height.scss +3 -0
  175. package/src/scss/components/icon.scss +2 -2
  176. package/src/scss/components/leader.scss +0 -1
  177. package/src/scss/components/lightbox.scss +0 -1
  178. package/src/scss/components/modal.scss +3 -7
  179. package/src/scss/components/navbar.scss +0 -7
  180. package/src/scss/components/progress.scss +14 -36
  181. package/src/scss/components/search.scss +1 -1
  182. package/src/scss/components/slider.scss +0 -3
  183. package/src/scss/components/slideshow.scss +0 -3
  184. package/src/scss/components/text.scss +16 -32
  185. package/src/scss/components/utility.scss +25 -0
  186. package/src/scss/mixins-theme.scss +1 -1
  187. package/src/scss/mixins.scss +1 -1
  188. package/src/scss/variables-theme.scss +9 -9
  189. package/src/scss/variables.scss +9 -9
  190. package/tests/align.html +10 -10
  191. package/tests/animation.html +2 -2
  192. package/tests/article.html +2 -2
  193. package/tests/base.html +3 -3
  194. package/tests/card.html +10 -10
  195. package/tests/column.html +3 -3
  196. package/tests/comment.html +9 -9
  197. package/tests/countdown.html +10 -8
  198. package/tests/dotnav.html +3 -3
  199. package/tests/image.html +296 -64
  200. package/tests/images/image-type.avif +0 -0
  201. package/tests/images/image-type.jpeg +0 -0
  202. package/tests/images/image-type.webp +0 -0
  203. package/tests/index.html +8 -8
  204. package/tests/js/index.js +114 -85
  205. package/tests/lightbox.html +10 -10
  206. package/tests/marker.html +2 -2
  207. package/tests/modal.html +8 -9
  208. package/tests/navbar.html +2 -2
  209. package/tests/overlay.html +7 -7
  210. package/tests/parallax.html +16 -7
  211. package/tests/position.html +12 -12
  212. package/tests/slidenav.html +12 -12
  213. package/tests/slider.html +20 -20
  214. package/tests/sortable.html +1 -1
  215. package/tests/sticky-parallax.html +87 -99
  216. package/tests/sticky.html +56 -24
  217. package/tests/svg.html +6 -6
  218. package/tests/table.html +11 -11
  219. package/tests/thumbnav.html +12 -12
  220. package/tests/transition.html +30 -30
  221. package/tests/utility.html +50 -33
  222. package/tests/video.html +1 -1
  223. package/tests/width.html +1 -1
  224. package/src/js/mixin/flex-bug.js +0 -56
  225. package/src/js/util/promise.js +0 -191
  226. package/tests/images/animated.gif +0 -0
@@ -1,7 +1,6 @@
1
- import {isFunction, isObject, isUndefined, toNode, toNodes} from './lang';
1
+ import { isFunction, isObject, isUndefined, toNode, toNodes } from './lang';
2
2
 
3
3
  export function attr(element, name, value) {
4
-
5
4
  if (isObject(name)) {
6
5
  for (const key in name) {
7
6
  attr(element, key, name[key]);
@@ -10,42 +9,39 @@ export function attr(element, name, value) {
10
9
  }
11
10
 
12
11
  if (isUndefined(value)) {
13
- element = toNode(element);
14
- return element && element.getAttribute(name);
12
+ return toNode(element)?.getAttribute(name);
15
13
  } else {
16
- toNodes(element).forEach(element => {
17
-
14
+ for (const el of toNodes(element)) {
18
15
  if (isFunction(value)) {
19
- value = value.call(element, attr(element, name));
16
+ value = value.call(el, attr(el, name));
20
17
  }
21
18
 
22
19
  if (value === null) {
23
- removeAttr(element, name);
20
+ removeAttr(el, name);
24
21
  } else {
25
- element.setAttribute(name, value);
22
+ el.setAttribute(name, value);
26
23
  }
27
- });
24
+ }
28
25
  }
29
-
30
26
  }
31
27
 
32
28
  export function hasAttr(element, name) {
33
- return toNodes(element).some(element => element.hasAttribute(name));
29
+ return toNodes(element).some((element) => element.hasAttribute(name));
34
30
  }
35
31
 
36
32
  export function removeAttr(element, name) {
37
- element = toNodes(element);
38
- name.split(' ').forEach(name =>
39
- element.forEach(element =>
40
- element.hasAttribute(name) && element.removeAttribute(name)
41
- )
42
- );
33
+ const elements = toNodes(element);
34
+ for (const attribute of name.split(' ')) {
35
+ for (const element of elements) {
36
+ element.removeAttribute(attribute);
37
+ }
38
+ }
43
39
  }
44
40
 
45
41
  export function data(element, attribute) {
46
- for (let i = 0, attrs = [attribute, `data-${attribute}`]; i < attrs.length; i++) {
47
- if (hasAttr(element, attrs[i])) {
48
- return attr(element, attrs[i]);
42
+ for (const name of [attribute, `data-${attribute}`]) {
43
+ if (hasAttr(element, name)) {
44
+ return attr(element, name);
49
45
  }
50
46
  }
51
47
  }
@@ -1,5 +1,5 @@
1
- import {attr} from './attr';
2
- import {isUndefined, toNodes} from './lang';
1
+ import { attr } from './attr';
2
+ import { isUndefined, toNodes } from './lang';
3
3
 
4
4
  export function addClass(element, ...args) {
5
5
  apply(element, args, 'add');
@@ -10,7 +10,7 @@ export function removeClass(element, ...args) {
10
10
  }
11
11
 
12
12
  export function removeClasses(element, cls) {
13
- attr(element, 'class', value => (value || '').replace(new RegExp(`\\b${cls}\\b`, 'g'), ''));
13
+ attr(element, 'class', (value) => (value || '').replace(new RegExp(`\\b${cls}\\b`, 'g'), ''));
14
14
  }
15
15
 
16
16
  export function replaceClass(element, ...args) {
@@ -20,9 +20,8 @@ export function replaceClass(element, ...args) {
20
20
 
21
21
  export function hasClass(element, cls) {
22
22
  [cls] = getClasses(cls);
23
- const nodes = toNodes(element);
24
- for (let n = 0; n < nodes.length; n++) {
25
- if (cls && nodes[n].classList.contains(cls)) {
23
+ for (const node of toNodes(element)) {
24
+ if (cls && node.classList.contains(cls)) {
26
25
  return true;
27
26
  }
28
27
  }
@@ -30,64 +29,27 @@ export function hasClass(element, cls) {
30
29
  }
31
30
 
32
31
  export function toggleClass(element, cls, force) {
32
+ const classes = getClasses(cls);
33
33
 
34
- cls = getClasses(cls);
34
+ if (!isUndefined(force)) {
35
+ force = !!force;
36
+ }
35
37
 
36
- const nodes = toNodes(element);
37
- for (let n = 0; n < nodes.length; n++) {
38
- const list = nodes[n].classList;
39
- for (let i = 0; i < cls.length; i++) {
40
- if (isUndefined(force)) {
41
- list.toggle(cls[i]);
42
- } else if (supports.Force) {
43
- list.toggle(cls[i], !!force);
44
- } else {
45
- list[force ? 'add' : 'remove'](cls[i]);
46
- }
38
+ for (const node of toNodes(element)) {
39
+ for (const cls of classes) {
40
+ node.classList.toggle(cls, force);
47
41
  }
48
42
  }
49
43
  }
50
44
 
51
45
  function apply(element, args, fn) {
52
-
53
46
  args = args.reduce((args, arg) => args.concat(getClasses(arg)), []);
54
47
 
55
- const nodes = toNodes(element);
56
- for (let n = 0; n < nodes.length; n++) {
57
- if (supports.Multiple) {
58
- nodes[n].classList[fn](...args);
59
- } else {
60
- args.forEach(cls => nodes[n].classList[fn](cls));
61
- }
48
+ for (const node of toNodes(element)) {
49
+ node.classList[fn](...args);
62
50
  }
63
51
  }
64
52
 
65
53
  function getClasses(str) {
66
54
  return String(str).split(/\s|,/).filter(Boolean);
67
55
  }
68
-
69
- // IE 11
70
- let supports = {
71
-
72
- get Multiple() {
73
- return this.get('Multiple');
74
- },
75
-
76
- get Force() {
77
- return this.get('Force');
78
- },
79
-
80
- get(key) {
81
-
82
- const {classList} = document.createElement('_');
83
- classList.add('a', 'b');
84
- classList.toggle('c', false);
85
- supports = {
86
- Multiple: classList.contains('b'),
87
- Force: !classList.contains('c')
88
- };
89
-
90
- return supports[key];
91
- }
92
-
93
- };
@@ -1,16 +1,27 @@
1
- import {css} from './style';
2
- import {each, endsWith, isDocument, isElement, isNumeric, isUndefined, isWindow, toFloat, toNode, toWindow, ucfirst} from './lang';
1
+ import { css } from './style';
2
+ import {
3
+ each,
4
+ isDocument,
5
+ isElement,
6
+ isString,
7
+ isUndefined,
8
+ isWindow,
9
+ memoize,
10
+ toFloat,
11
+ toNode,
12
+ toWindow,
13
+ ucfirst,
14
+ } from './lang';
3
15
 
4
16
  const dirs = {
5
17
  width: ['left', 'right'],
6
- height: ['top', 'bottom']
18
+ height: ['top', 'bottom'],
7
19
  };
8
20
 
9
21
  export function dimensions(element) {
10
-
11
22
  const rect = isElement(element)
12
23
  ? toNode(element).getBoundingClientRect()
13
- : {height: height(element), width: width(element), top: 0, left: 0};
24
+ : { height: height(element), width: width(element), top: 0, left: 0 };
14
25
 
15
26
  return {
16
27
  height: rect.height,
@@ -18,17 +29,16 @@ export function dimensions(element) {
18
29
  top: rect.top,
19
30
  left: rect.left,
20
31
  bottom: rect.top + rect.height,
21
- right: rect.left + rect.width
32
+ right: rect.left + rect.width,
22
33
  };
23
34
  }
24
35
 
25
36
  export function offset(element, coordinates) {
26
-
27
37
  const currentOffset = dimensions(element);
28
38
 
29
39
  if (element) {
30
- const {pageYOffset, pageXOffset} = toWindow(element);
31
- const offsetBy = {height: pageYOffset, width: pageXOffset};
40
+ const { scrollY, scrollX } = toWindow(element);
41
+ const offsetBy = { height: scrollY, width: scrollX };
32
42
 
33
43
  for (const dir in dirs) {
34
44
  for (const i in dirs[dir]) {
@@ -44,23 +54,30 @@ export function offset(element, coordinates) {
44
54
  const pos = css(element, 'position');
45
55
 
46
56
  each(css(element, ['left', 'top']), (value, prop) =>
47
- css(element, prop, coordinates[prop]
48
- - currentOffset[prop]
49
- + toFloat(pos === 'absolute' && value === 'auto'
50
- ? position(element)[prop]
51
- : value)
57
+ css(
58
+ element,
59
+ prop,
60
+ coordinates[prop] -
61
+ currentOffset[prop] +
62
+ toFloat(pos === 'absolute' && value === 'auto' ? position(element)[prop] : value)
52
63
  )
53
64
  );
54
65
  }
55
66
 
56
67
  export function position(element) {
68
+ let { top, left } = offset(element);
57
69
 
58
- let {top, left} = offset(element);
59
-
60
- const {ownerDocument: {body, documentElement}, offsetParent} = toNode(element);
70
+ const {
71
+ ownerDocument: { body, documentElement },
72
+ offsetParent,
73
+ } = toNode(element);
61
74
  let parent = offsetParent || documentElement;
62
75
 
63
- while (parent && (parent === body || parent === documentElement) && css(parent, 'position') === 'static') {
76
+ while (
77
+ parent &&
78
+ (parent === body || parent === documentElement) &&
79
+ css(parent, 'position') === 'static'
80
+ ) {
64
81
  parent = parent.parentNode;
65
82
  }
66
83
 
@@ -72,7 +89,7 @@ export function position(element) {
72
89
 
73
90
  return {
74
91
  top: top - toFloat(css(element, 'marginTop')),
75
- left: left - toFloat(css(element, 'marginLeft'))
92
+ left: left - toFloat(css(element, 'marginLeft')),
76
93
  };
77
94
  }
78
95
 
@@ -82,17 +99,15 @@ export function offsetPosition(element) {
82
99
  element = toNode(element);
83
100
 
84
101
  do {
85
-
86
102
  offset[0] += element.offsetTop;
87
103
  offset[1] += element.offsetLeft;
88
104
 
89
105
  if (css(element, 'position') === 'fixed') {
90
106
  const win = toWindow(element);
91
- offset[0] += win.pageYOffset;
92
- offset[1] += win.pageXOffset;
107
+ offset[0] += win.scrollY;
108
+ offset[1] += win.scrollX;
93
109
  return offset;
94
110
  }
95
-
96
111
  } while ((element = element.offsetParent));
97
112
 
98
113
  return offset;
@@ -104,9 +119,7 @@ export const width = dimension('width');
104
119
  function dimension(prop) {
105
120
  const propName = ucfirst(prop);
106
121
  return (element, value) => {
107
-
108
122
  if (isUndefined(value)) {
109
-
110
123
  if (isWindow(element)) {
111
124
  return element[`inner${propName}`];
112
125
  }
@@ -122,26 +135,27 @@ function dimension(prop) {
122
135
  value = value === 'auto' ? element[`offset${propName}`] : toFloat(value) || 0;
123
136
 
124
137
  return value - boxModelAdjust(element, prop);
125
-
126
138
  } else {
127
-
128
- return css(element, prop, !value && value !== 0
129
- ? ''
130
- : +value + boxModelAdjust(element, prop) + 'px'
139
+ return css(
140
+ element,
141
+ prop,
142
+ !value && value !== 0 ? '' : +value + boxModelAdjust(element, prop) + 'px'
131
143
  );
132
-
133
144
  }
134
-
135
145
  };
136
146
  }
137
147
 
138
148
  export function boxModelAdjust(element, prop, sizing = 'border-box') {
139
149
  return css(element, 'boxSizing') === sizing
140
- ? dirs[prop].map(ucfirst).reduce((value, prop) =>
141
- value
142
- + toFloat(css(element, `padding${prop}`))
143
- + toFloat(css(element, `border${prop}Width`))
144
- , 0)
150
+ ? dirs[prop]
151
+ .map(ucfirst)
152
+ .reduce(
153
+ (value, prop) =>
154
+ value +
155
+ toFloat(css(element, `padding${prop}`)) +
156
+ toFloat(css(element, `border${prop}Width`)),
157
+ 0
158
+ )
145
159
  : 0;
146
160
  }
147
161
 
@@ -157,19 +171,34 @@ export function flipPosition(pos) {
157
171
  }
158
172
 
159
173
  export function toPx(value, property = 'width', element = window, offsetDim = false) {
160
- return isNumeric(value)
161
- ? +value
162
- : endsWith(value, 'vh')
163
- ? percent(height(toWindow(element)), value)
164
- : endsWith(value, 'vw')
165
- ? percent(width(toWindow(element)), value)
166
- : endsWith(value, '%')
167
- ? percent(offsetDim
168
- ? element[`offset${ucfirst(property)}`]
169
- : dimensions(element)[property], value)
170
- : toFloat(value);
174
+ if (!isString(value)) {
175
+ return toFloat(value);
176
+ }
177
+
178
+ return parseCalc(value).reduce((result, value) => {
179
+ const unit = parseUnit(value);
180
+ if (unit) {
181
+ value = percent(
182
+ unit === 'vh'
183
+ ? height(toWindow(element))
184
+ : unit === 'vw'
185
+ ? width(toWindow(element))
186
+ : offsetDim
187
+ ? element[`offset${ucfirst(property)}`]
188
+ : dimensions(element)[property],
189
+ value
190
+ );
191
+ }
192
+
193
+ return result + toFloat(value);
194
+ }, 0);
171
195
  }
172
196
 
197
+ const calcRe = /-?\d+(?:\.\d+)?(?:v[wh]|%|px)?/g;
198
+ const parseCalc = memoize((calc) => calc.toString().replace(/\s/g, '').match(calcRe) || []);
199
+ const unitRe = /(?:v[hw]|%)$/;
200
+ const parseUnit = memoize((str) => (str.match(unitRe) || [])[0]);
201
+
173
202
  function percent(base, value) {
174
- return base * toFloat(value) / 100;
203
+ return (base * toFloat(value)) / 100;
175
204
  }
@@ -1,10 +1,9 @@
1
- import {once} from './event';
2
- import {parent} from './filter';
3
- import {find, findAll} from './selector';
4
- import {isElement, isString, isUndefined, toNode, toNodes} from './lang';
1
+ import { once } from './event';
2
+ import { parent } from './filter';
3
+ import { find, findAll } from './selector';
4
+ import { isElement, isString, isUndefined, startsWith, toNode, toNodes } from './lang';
5
5
 
6
6
  export function ready(fn) {
7
-
8
7
  if (document.readyState !== 'loading') {
9
8
  fn();
10
9
  return;
@@ -13,63 +12,37 @@ export function ready(fn) {
13
12
  once(document, 'DOMContentLoaded', fn);
14
13
  }
15
14
 
16
- export function empty(element) {
17
- element = $(element);
18
- element.innerHTML = '';
19
- return element;
20
- }
21
-
22
- export function html(parent, html) {
23
- parent = $(parent);
24
- return isUndefined(html)
25
- ? parent.innerHTML
26
- : append(parent.hasChildNodes() ? empty(parent) : parent, html);
27
- }
28
-
29
- export function prepend(parent, element) {
30
-
31
- parent = $(parent);
32
-
33
- if (parent.hasChildNodes()) {
34
- return insertNodes(element, element => parent.insertBefore(element, parent.firstChild));
35
- } else {
36
- return append(parent, element);
37
- }
15
+ export function isTag(element, tagName) {
16
+ return element?.tagName?.toLowerCase() === tagName.toLowerCase();
38
17
  }
39
18
 
40
- export function append(parent, element) {
41
- parent = $(parent);
42
- return insertNodes(element, element => parent.appendChild(element));
19
+ export function empty(element) {
20
+ return replaceChildren(element, '');
43
21
  }
44
22
 
45
- export function before(ref, element) {
46
- ref = $(ref);
47
- return insertNodes(element, element => ref.parentNode.insertBefore(element, ref));
23
+ export function html(parent, html) {
24
+ return isUndefined(html) ? $(parent).innerHTML : replaceChildren(parent, html);
48
25
  }
49
26
 
50
- export function after(ref, element) {
51
- ref = $(ref);
52
- return insertNodes(element, element => ref.nextSibling
53
- ? before(ref.nextSibling, element)
54
- : append(ref.parentNode, element)
55
- );
56
- }
27
+ export const replaceChildren = applyFn('replaceChildren');
28
+ export const prepend = applyFn('prepend');
29
+ export const append = applyFn('append');
30
+ export const before = applyFn('before');
31
+ export const after = applyFn('after');
57
32
 
58
- function insertNodes(element, fn) {
59
- element = isString(element) ? fragment(element) : element;
60
- return element
61
- ? 'length' in element
62
- ? toNodes(element).map(fn)
63
- : fn(element)
64
- : null;
33
+ function applyFn(fn) {
34
+ return function (ref, element) {
35
+ const nodes = toNodes(isString(element) ? fragment(element) : element);
36
+ $(ref)?.[fn](...nodes);
37
+ return unwrapSingle(nodes);
38
+ };
65
39
  }
66
40
 
67
41
  export function remove(element) {
68
- toNodes(element).forEach(element => element.parentNode && element.parentNode.removeChild(element));
42
+ toNodes(element).forEach((element) => element.remove());
69
43
  }
70
44
 
71
45
  export function wrapAll(element, structure) {
72
-
73
46
  structure = toNode(before(element, structure));
74
47
 
75
48
  while (structure.firstChild) {
@@ -82,26 +55,26 @@ export function wrapAll(element, structure) {
82
55
  }
83
56
 
84
57
  export function wrapInner(element, structure) {
85
- return toNodes(toNodes(element).map(element =>
86
- element.hasChildNodes ? wrapAll(toNodes(element.childNodes), structure) : append(element, structure)
87
- ));
58
+ return toNodes(
59
+ toNodes(element).map((element) =>
60
+ element.hasChildNodes()
61
+ ? wrapAll(toNodes(element.childNodes), structure)
62
+ : append(element, structure)
63
+ )
64
+ );
88
65
  }
89
66
 
90
67
  export function unwrap(element) {
91
68
  toNodes(element)
92
69
  .map(parent)
93
70
  .filter((value, index, self) => self.indexOf(value) === index)
94
- .forEach(parent => {
95
- before(parent, parent.childNodes);
96
- remove(parent);
97
- });
71
+ .forEach((parent) => parent.replaceWith(...parent.childNodes));
98
72
  }
99
73
 
100
74
  const fragmentRe = /^\s*<(\w+|!)[^>]*>/;
101
75
  const singleTagRe = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;
102
76
 
103
77
  export function fragment(html) {
104
-
105
78
  const matches = singleTagRe.exec(html);
106
79
  if (matches) {
107
80
  return document.createElement(matches[1]);
@@ -114,12 +87,14 @@ export function fragment(html) {
114
87
  container.textContent = html;
115
88
  }
116
89
 
117
- return container.childNodes.length > 1 ? toNodes(container.childNodes) : container.firstChild;
90
+ return unwrapSingle(container.childNodes);
91
+ }
118
92
 
93
+ function unwrapSingle(nodes) {
94
+ return nodes.length > 1 ? nodes : nodes[0];
119
95
  }
120
96
 
121
97
  export function apply(node, fn) {
122
-
123
98
  if (!isElement(node)) {
124
99
  return;
125
100
  }
@@ -134,17 +109,13 @@ export function apply(node, fn) {
134
109
  }
135
110
 
136
111
  export function $(selector, context) {
137
- return isHtml(selector)
138
- ? toNode(fragment(selector))
139
- : find(selector, context);
112
+ return isHtml(selector) ? toNode(fragment(selector)) : find(selector, context);
140
113
  }
141
114
 
142
115
  export function $$(selector, context) {
143
- return isHtml(selector)
144
- ? toNodes(fragment(selector))
145
- : findAll(selector, context);
116
+ return isHtml(selector) ? toNodes(fragment(selector)) : findAll(selector, context);
146
117
  }
147
118
 
148
119
  function isHtml(str) {
149
- return isString(str) && (str[0] === '<' || str.match(/^\s*</));
120
+ return isString(str) && startsWith(str.trim(), '<');
150
121
  }
@@ -1,19 +1,14 @@
1
- /* global DocumentTouch */
2
- import {attr} from './attr';
1
+ import { attr } from './attr';
3
2
 
4
3
  export const inBrowser = typeof window !== 'undefined';
5
- export const isIE = inBrowser && /msie|trident/i.test(window.navigator.userAgent);
6
4
  export const isRtl = inBrowser && attr(document.documentElement, 'dir') === 'rtl';
7
5
 
8
- const hasTouchEvents = inBrowser && 'ontouchstart' in window;
6
+ export const hasTouch = inBrowser && 'ontouchstart' in window;
9
7
  const hasPointerEvents = inBrowser && window.PointerEvent;
10
- export const hasTouch = inBrowser && (hasTouchEvents
11
- || window.DocumentTouch && document instanceof DocumentTouch
12
- || navigator.maxTouchPoints); // IE >=11
13
8
 
14
- export const pointerDown = hasPointerEvents ? 'pointerdown' : hasTouchEvents ? 'touchstart' : 'mousedown';
15
- export const pointerMove = hasPointerEvents ? 'pointermove' : hasTouchEvents ? 'touchmove' : 'mousemove';
16
- export const pointerUp = hasPointerEvents ? 'pointerup' : hasTouchEvents ? 'touchend' : 'mouseup';
17
- export const pointerEnter = hasPointerEvents ? 'pointerenter' : hasTouchEvents ? '' : 'mouseenter';
18
- export const pointerLeave = hasPointerEvents ? 'pointerleave' : hasTouchEvents ? '' : 'mouseleave';
9
+ export const pointerDown = hasPointerEvents ? 'pointerdown' : hasTouch ? 'touchstart' : 'mousedown';
10
+ export const pointerMove = hasPointerEvents ? 'pointermove' : hasTouch ? 'touchmove' : 'mousemove';
11
+ export const pointerUp = hasPointerEvents ? 'pointerup' : hasTouch ? 'touchend' : 'mouseup';
12
+ export const pointerEnter = hasPointerEvents ? 'pointerenter' : hasTouch ? '' : 'mouseenter';
13
+ export const pointerLeave = hasPointerEvents ? 'pointerleave' : hasTouch ? '' : 'mouseleave';
19
14
  export const pointerCancel = hasPointerEvents ? 'pointercancel' : 'touchcancel';