uikit 3.25.20-dev.e4f47fc → 3.25.20

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 (201) hide show
  1. package/CHANGELOG.md +2 -33
  2. package/build/prefix.js +1 -1
  3. package/build/publishDev.js +1 -1
  4. package/build/scope.js +1 -1
  5. package/build/scss.js +1 -1
  6. package/dist/css/uikit-core-rtl.css +917 -1045
  7. package/dist/css/uikit-core-rtl.min.css +1 -1
  8. package/dist/css/uikit-core.css +917 -1045
  9. package/dist/css/uikit-core.min.css +1 -1
  10. package/dist/css/uikit-rtl.css +936 -1064
  11. package/dist/css/uikit-rtl.min.css +1 -1
  12. package/dist/css/uikit.css +936 -1064
  13. package/dist/css/uikit.min.css +1 -1
  14. package/dist/js/components/countdown.js +1 -1
  15. package/dist/js/components/countdown.min.js +1 -1
  16. package/dist/js/components/filter.js +1 -1
  17. package/dist/js/components/filter.min.js +1 -1
  18. package/dist/js/components/lightbox-panel.js +132 -133
  19. package/dist/js/components/lightbox-panel.min.js +1 -1
  20. package/dist/js/components/lightbox.js +133 -134
  21. package/dist/js/components/lightbox.min.js +1 -1
  22. package/dist/js/components/notification.js +1 -1
  23. package/dist/js/components/notification.min.js +1 -1
  24. package/dist/js/components/parallax.js +12 -8
  25. package/dist/js/components/parallax.min.js +1 -1
  26. package/dist/js/components/slider-parallax.js +12 -8
  27. package/dist/js/components/slider-parallax.min.js +1 -1
  28. package/dist/js/components/slider.js +25 -41
  29. package/dist/js/components/slider.min.js +1 -1
  30. package/dist/js/components/slideshow-parallax.js +12 -8
  31. package/dist/js/components/slideshow-parallax.min.js +1 -1
  32. package/dist/js/components/slideshow.js +102 -71
  33. package/dist/js/components/slideshow.min.js +1 -1
  34. package/dist/js/components/sortable.js +1 -1
  35. package/dist/js/components/sortable.min.js +1 -1
  36. package/dist/js/components/tooltip.js +19 -19
  37. package/dist/js/components/tooltip.min.js +1 -1
  38. package/dist/js/components/upload.js +1 -1
  39. package/dist/js/components/upload.min.js +1 -1
  40. package/dist/js/uikit-core.js +262 -752
  41. package/dist/js/uikit-core.min.js +1 -1
  42. package/dist/js/uikit-icons.js +1 -1
  43. package/dist/js/uikit-icons.min.js +1 -1
  44. package/dist/js/uikit.js +374 -627
  45. package/dist/js/uikit.min.js +1 -1
  46. package/package.json +1 -1
  47. package/src/js/api/component.js +3 -2
  48. package/src/js/api/observables.js +4 -2
  49. package/src/js/api/options.js +3 -6
  50. package/src/js/api/props.js +4 -1
  51. package/src/js/api/state.js +8 -7
  52. package/src/js/components/index.js +0 -1
  53. package/src/js/components/internal/lightbox-animations.js +26 -7
  54. package/src/js/components/internal/slideshow-animations.js +62 -15
  55. package/src/js/components/lightbox-panel.js +96 -121
  56. package/src/js/components/lightbox.js +8 -5
  57. package/src/js/components/tooltip.js +2 -4
  58. package/src/js/core/accordion.js +29 -78
  59. package/src/js/core/drop.js +4 -5
  60. package/src/js/core/dropnav.js +3 -3
  61. package/src/js/core/grid.js +19 -5
  62. package/src/js/core/height-match.js +2 -1
  63. package/src/js/core/margin.js +0 -3
  64. package/src/js/core/overflow-fade.js +5 -5
  65. package/src/js/core/sticky.js +1 -1
  66. package/src/js/core/switcher.js +44 -24
  67. package/src/js/core/video.js +15 -172
  68. package/src/js/mixin/internal/slideshow-animations.js +13 -5
  69. package/src/js/mixin/internal/slideshow-transitioner.js +2 -2
  70. package/src/js/mixin/modal.js +3 -4
  71. package/src/js/mixin/parallax.js +4 -1
  72. package/src/js/mixin/position.js +1 -1
  73. package/src/js/mixin/slider-nav.js +1 -1
  74. package/src/js/mixin/slider-parallax.js +38 -9
  75. package/src/js/mixin/togglable.js +14 -13
  76. package/src/js/util/attr.js +7 -7
  77. package/src/js/util/class.js +1 -1
  78. package/src/js/util/dom.js +4 -3
  79. package/src/js/util/lang.js +1 -1
  80. package/src/js/util/player.js +4 -4
  81. package/src/js/util/style.js +15 -10
  82. package/src/js/util/viewport.js +25 -22
  83. package/src/less/components/_import.less +1 -6
  84. package/src/less/components/base.less +1 -1
  85. package/src/less/components/button.less +1 -1
  86. package/src/less/components/form.less +5 -5
  87. package/src/less/components/grid.less +65 -58
  88. package/src/less/components/margin.less +124 -155
  89. package/src/less/components/nav.less +1 -1
  90. package/src/less/components/padding.less +9 -9
  91. package/src/less/components/text.less +0 -6
  92. package/src/less/components/utility.less +163 -0
  93. package/src/less/theme/_import.less +1 -5
  94. package/src/less/theme/utility.less +32 -0
  95. package/src/scss/components/_import.scss +1 -6
  96. package/src/scss/components/base.scss +1 -1
  97. package/src/scss/components/button.scss +1 -1
  98. package/src/scss/components/form.scss +5 -5
  99. package/src/scss/components/grid.scss +64 -57
  100. package/src/scss/components/margin.scss +124 -155
  101. package/src/scss/components/nav.scss +1 -1
  102. package/src/scss/components/padding.scss +9 -9
  103. package/src/scss/components/text.scss +0 -6
  104. package/src/scss/components/utility.scss +129 -0
  105. package/src/scss/mixins-theme.scss +33 -42
  106. package/src/scss/mixins.scss +30 -39
  107. package/src/scss/variables-theme.scss +14 -14
  108. package/src/scss/variables.scss +14 -14
  109. package/tests/accordion.html +10 -77
  110. package/tests/alert.html +1 -1
  111. package/tests/align.html +5 -5
  112. package/tests/animation.html +4 -4
  113. package/tests/article.html +7 -7
  114. package/tests/background.html +2 -2
  115. package/tests/badge.html +1 -1
  116. package/tests/base.html +3 -3
  117. package/tests/button.html +1 -1
  118. package/tests/card.html +15 -15
  119. package/tests/close.html +2 -2
  120. package/tests/comment.html +9 -9
  121. package/tests/container.html +2 -2
  122. package/tests/countdown.html +21 -21
  123. package/tests/cover.html +6 -6
  124. package/tests/description-list.html +1 -1
  125. package/tests/divider.html +3 -3
  126. package/tests/dotnav.html +1 -1
  127. package/tests/drop.html +7 -7
  128. package/tests/dropbar.html +5 -5
  129. package/tests/dropdown.html +1 -1
  130. package/tests/dropnav.html +18 -18
  131. package/tests/filter.html +3 -3
  132. package/tests/form.html +14 -14
  133. package/tests/grid.html +47 -41
  134. package/tests/heading.html +2 -2
  135. package/tests/height-viewport.html +4 -4
  136. package/tests/height.html +5 -5
  137. package/tests/icon.html +8 -8
  138. package/tests/image.html +6 -6
  139. package/tests/index.html +13 -13
  140. package/tests/js/index.js +1 -1
  141. package/tests/leader.html +5 -5
  142. package/tests/lightbox.html +14 -14
  143. package/tests/link.html +1 -1
  144. package/tests/list.html +4 -4
  145. package/tests/margin.html +7 -7
  146. package/tests/marker.html +3 -3
  147. package/tests/modal.html +4 -4
  148. package/tests/nav.html +5 -5
  149. package/tests/navbar.html +27 -27
  150. package/tests/notification.html +2 -2
  151. package/tests/offcanvas.html +12 -12
  152. package/tests/overlay.html +3 -3
  153. package/tests/padding.html +1 -1
  154. package/tests/pagination.html +3 -3
  155. package/tests/parallax.html +1 -1
  156. package/tests/position.html +6 -6
  157. package/tests/scrollspy.html +12 -12
  158. package/tests/search.html +5 -5
  159. package/tests/section.html +17 -17
  160. package/tests/slidenav.html +3 -3
  161. package/tests/slider.html +5 -5
  162. package/tests/slideshow.html +4 -34
  163. package/tests/sortable.html +15 -15
  164. package/tests/sticky-navbar.html +4 -4
  165. package/tests/sticky-parallax.html +3 -3
  166. package/tests/sticky.html +3 -3
  167. package/tests/svg.html +2 -3
  168. package/tests/switcher.html +6 -6
  169. package/tests/tab.html +4 -4
  170. package/tests/text.html +3 -3
  171. package/tests/tile.html +4 -4
  172. package/tests/toggle.html +1 -1
  173. package/tests/tooltip.html +3 -3
  174. package/tests/totop.html +2 -2
  175. package/tests/transition.html +1 -1
  176. package/tests/upload.html +5 -5
  177. package/tests/utility.html +116 -16
  178. package/tests/video.html +27 -227
  179. package/tests/visibility.html +4 -4
  180. package/tests/width.html +12 -12
  181. package/dist/js/components/marquee.js +0 -179
  182. package/dist/js/components/marquee.min.js +0 -1
  183. package/src/js/components/marquee.js +0 -123
  184. package/src/js/mixin/connect.js +0 -55
  185. package/src/js/mixin/scroll-driven.js +0 -57
  186. package/src/less/components/dropcap.less +0 -71
  187. package/src/less/components/floating-shadow.less +0 -66
  188. package/src/less/components/logo.less +0 -94
  189. package/src/less/components/marquee.less +0 -133
  190. package/src/less/theme/dropcap.less +0 -29
  191. package/src/less/theme/floating-shadow.less +0 -20
  192. package/src/less/theme/logo.less +0 -29
  193. package/src/less/theme/marquee.less +0 -14
  194. package/src/scss/components/dropcap.scss +0 -63
  195. package/src/scss/components/floating-shadow.scss +0 -63
  196. package/src/scss/components/logo.scss +0 -75
  197. package/src/scss/components/marquee.scss +0 -136
  198. package/tests/dropcap.html +0 -26
  199. package/tests/floating-shadow.html +0 -44
  200. package/tests/logo.html +0 -84
  201. package/tests/marquee.html +0 -617
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "uikit",
3
3
  "title": "UIkit",
4
4
  "description": "UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.",
5
- "version": "3.25.20-dev.e4f47fc",
5
+ "version": "3.25.20",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -48,10 +48,11 @@ export function createComponent(name, element, data, ...args) {
48
48
  const instance = getComponent(element, name);
49
49
 
50
50
  if (instance) {
51
- if (!data) {
51
+ if (data) {
52
+ instance.$destroy();
53
+ } else {
52
54
  return instance;
53
55
  }
54
- instance.$destroy();
55
56
  }
56
57
 
57
58
  return new Component({ el: element, data });
@@ -43,8 +43,10 @@ export function lazyload(options = {}) {
43
43
  .forEach((el) => removeAttr(el, 'loading'));
44
44
  }
45
45
 
46
- for (const { target } of entries.filter(({ isIntersecting }) => isIntersecting)) {
47
- observer.unobserve(target);
46
+ for (const el of entries
47
+ .filter(({ isIntersecting }) => isIntersecting)
48
+ .map(({ target }) => target)) {
49
+ observer.unobserve(el);
48
50
  }
49
51
  },
50
52
  ...options,
@@ -153,14 +153,11 @@ export function parseOptions(options, args = []) {
153
153
  export function coerce(type, value) {
154
154
  if (type === Boolean) {
155
155
  return toBoolean(value);
156
- }
157
- if (type === Number) {
156
+ } else if (type === Number) {
158
157
  return toNumber(value);
159
- }
160
- if (type === 'list') {
158
+ } else if (type === 'list') {
161
159
  return toList(value);
162
- }
163
- if (type === Object && isString(value)) {
160
+ } else if (type === Object && isString(value)) {
164
161
  return parseOptions(value);
165
162
  }
166
163
 
@@ -67,7 +67,10 @@ function getProps(opts) {
67
67
 
68
68
  const getAttributes = memoize((id, props) => {
69
69
  const attributes = Object.keys(props);
70
- const filter = [...attributes, id].flatMap((key) => [hyphenate(key), `data-${hyphenate(key)}`]);
70
+ const filter = attributes
71
+ .concat(id)
72
+ .map((key) => [hyphenate(key), `data-${hyphenate(key)}`])
73
+ .flat();
71
74
  return { attributes, filter };
72
75
  });
73
76
 
@@ -43,13 +43,14 @@ function initMethods(instance) {
43
43
 
44
44
  function normalizeData({ data = {} }, { args = [], props = {} }) {
45
45
  if (isArray(data)) {
46
- data = data
47
- .slice(0, args.length)
48
- .reduce(
49
- (data, value, index) =>
50
- assign(data, isPlainObject(value) ? value : { [args[index]]: value }),
51
- {},
52
- );
46
+ data = data.slice(0, args.length).reduce((data, value, index) => {
47
+ if (isPlainObject(value)) {
48
+ assign(data, value);
49
+ } else {
50
+ data[args[index]] = value;
51
+ }
52
+ return data;
53
+ }, {});
53
54
  }
54
55
 
55
56
  for (const key in data) {
@@ -2,7 +2,6 @@ export { default as Countdown } from './countdown';
2
2
  export { default as Filter } from './filter';
3
3
  export { default as Lightbox } from './lightbox';
4
4
  export { default as LightboxPanel } from './lightbox-panel';
5
- export { default as Marquee } from './marquee';
6
5
  export { default as Notification } from './notification';
7
6
  export { default as Parallax } from './parallax';
8
7
  export { default as Slider } from './slider';
@@ -5,17 +5,36 @@ import { scale3d } from './slideshow-animations';
5
5
  export default {
6
6
  ...Animations,
7
7
  fade: {
8
- percent: (current) => 1 - css(current, 'opacity'),
8
+ show() {
9
+ return [{ opacity: 0 }, { opacity: 1 }];
10
+ },
9
11
 
10
- translate: (percent) => [{ opacity: 1 - percent }, { opacity: percent }],
12
+ percent(current) {
13
+ return 1 - css(current, 'opacity');
14
+ },
15
+
16
+ translate(percent) {
17
+ return [{ opacity: 1 - percent }, { opacity: percent }];
18
+ },
11
19
  },
12
20
 
13
21
  scale: {
14
- percent: (current) => 1 - css(current, 'opacity'),
22
+ show() {
23
+ return [
24
+ { opacity: 0, transform: scale3d(1 - 0.2) },
25
+ { opacity: 1, transform: scale3d(1) },
26
+ ];
27
+ },
28
+
29
+ percent(current) {
30
+ return 1 - css(current, 'opacity');
31
+ },
15
32
 
16
- translate: (percent) => [
17
- { opacity: 1 - percent, transform: scale3d(1 - 0.2 * percent) },
18
- { opacity: percent, transform: scale3d(1 - 0.2 + 0.2 * percent) },
19
- ],
33
+ translate(percent) {
34
+ return [
35
+ { opacity: 1 - percent, transform: scale3d(1 - 0.2 * percent) },
36
+ { opacity: percent, transform: scale3d(1 - 0.2 + 0.2 * percent) },
37
+ ];
38
+ },
20
39
  },
21
40
  };
@@ -4,24 +4,55 @@ import Animations, { translate, translated } from '../../mixin/internal/slidesho
4
4
  export default {
5
5
  ...Animations,
6
6
  fade: {
7
- percent: (current) => 1 - css(current, 'opacity'),
8
- translate: (percent) => [{ opacity: 1 - percent, zIndex: 0 }, { zIndex: -1 }],
7
+ show() {
8
+ return [{ opacity: 0, zIndex: 0 }, { zIndex: -1 }];
9
+ },
10
+
11
+ percent(current) {
12
+ return 1 - css(current, 'opacity');
13
+ },
14
+
15
+ translate(percent) {
16
+ return [{ opacity: 1 - percent, zIndex: 0 }, { zIndex: -1 }];
17
+ },
9
18
  },
10
19
 
11
20
  scale: {
12
- percent: (current) => 1 - css(current, 'opacity'),
21
+ show() {
22
+ return [{ opacity: 0, transform: scale3d(1 + 0.5), zIndex: 0 }, { zIndex: -1 }];
23
+ },
24
+
25
+ percent(current) {
26
+ return 1 - css(current, 'opacity');
27
+ },
13
28
 
14
- translate: (percent) => [
15
- { opacity: 1 - percent, transform: scale3d(1 + 0.5 * percent), zIndex: 0 },
16
- { zIndex: -1 },
17
- ],
29
+ translate(percent) {
30
+ return [
31
+ { opacity: 1 - percent, transform: scale3d(1 + 0.5 * percent), zIndex: 0 },
32
+ { zIndex: -1 },
33
+ ];
34
+ },
18
35
  },
19
36
 
20
37
  pull: {
21
- percent: (current, next, dir) => (dir < 0 ? 1 - translated(next) : translated(current)),
38
+ show(dir) {
39
+ return dir < 0
40
+ ? [
41
+ { transform: translate(30), zIndex: -1 },
42
+ { transform: translate(), zIndex: 0 },
43
+ ]
44
+ : [
45
+ { transform: translate(-100), zIndex: 0 },
46
+ { transform: translate(), zIndex: -1 },
47
+ ];
48
+ },
22
49
 
23
- translate: (percent, dir) =>
24
- dir < 0
50
+ percent(current, next, dir) {
51
+ return dir < 0 ? 1 - translated(next) : translated(current);
52
+ },
53
+
54
+ translate(percent, dir) {
55
+ return dir < 0
25
56
  ? [
26
57
  { transform: translate(30 * percent), zIndex: -1 },
27
58
  { transform: translate(-100 * (1 - percent)), zIndex: 0 },
@@ -29,14 +60,29 @@ export default {
29
60
  : [
30
61
  { transform: translate(-percent * 100), zIndex: 0 },
31
62
  { transform: translate(30 * (1 - percent)), zIndex: -1 },
32
- ],
63
+ ];
64
+ },
33
65
  },
34
66
 
35
67
  push: {
36
- percent: (current, next, dir) => (dir > 0 ? 1 - translated(next) : translated(current)),
68
+ show(dir) {
69
+ return dir < 0
70
+ ? [
71
+ { transform: translate(100), zIndex: 0 },
72
+ { transform: translate(), zIndex: -1 },
73
+ ]
74
+ : [
75
+ { transform: translate(-30), zIndex: -1 },
76
+ { transform: translate(), zIndex: 0 },
77
+ ];
78
+ },
79
+
80
+ percent(current, next, dir) {
81
+ return dir > 0 ? 1 - translated(next) : translated(current);
82
+ },
37
83
 
38
- translate: (percent, dir) =>
39
- dir < 0
84
+ translate(percent, dir) {
85
+ return dir < 0
40
86
  ? [
41
87
  { transform: translate(percent * 100), zIndex: 0 },
42
88
  { transform: translate(-30 * (1 - percent)), zIndex: -1 },
@@ -44,7 +90,8 @@ export default {
44
90
  : [
45
91
  { transform: translate(-30 * percent), zIndex: -1 },
46
92
  { transform: translate(100 * (1 - percent)), zIndex: 0 },
47
- ],
93
+ ];
94
+ },
48
95
  },
49
96
  };
50
97
 
@@ -280,23 +280,103 @@ export default {
280
280
  return;
281
281
  }
282
282
 
283
- try {
284
- for (const loader of [
285
- loadImage,
286
- loadVideo,
287
- loadIframe,
288
- loadYouTube,
289
- loadVimeo,
290
- ]) {
291
- const content = await loader({ src, type, attrs, item, cmp: this });
292
-
293
- if (content) {
294
- this.setItem(item, content);
295
- return;
296
- }
283
+ let matches;
284
+ const iframeAttrs = {
285
+ allowfullscreen: '',
286
+ style: 'max-width: 100%; box-sizing: border-box;',
287
+ 'uk-responsive': '',
288
+ 'uk-video': Boolean(this.videoAutoplay),
289
+ };
290
+
291
+ // Image
292
+ if (type === 'image' || isImage(src)) {
293
+ const img = createEl('img');
294
+
295
+ wrapInPicture(img, item.sources);
296
+ attr(img, {
297
+ src,
298
+ ...pick(item, ['alt', 'srcset', 'sizes']),
299
+ ...attrs,
300
+ });
301
+
302
+ on(img, 'load', () => this.setItem(item, parent(img) || img));
303
+ on(img, 'error', () => this.setError(item));
304
+
305
+ // Video
306
+ } else if (type === 'video' || isVideo(src)) {
307
+ const inline = this.videoAutoplay === 'inline';
308
+ const video = createEl('video', {
309
+ src,
310
+ playsinline: '',
311
+ controls: inline ? null : '',
312
+ loop: inline ? '' : null,
313
+ muted: inline ? '' : null,
314
+ poster: this.videoAutoplay ? null : item.poster,
315
+ 'uk-video': Boolean(this.videoAutoplay),
316
+ ...attrs,
317
+ });
318
+
319
+ on(video, 'loadedmetadata', () => this.setItem(item, video));
320
+ on(video, 'error', () => this.setError(item));
321
+
322
+ // Iframe
323
+ } else if (type === 'iframe' || src.match(/\.(html|php)($|\?)/i)) {
324
+ this.setItem(
325
+ item,
326
+ createEl('iframe', {
327
+ src,
328
+ allowfullscreen: '',
329
+ class: 'uk-lightbox-iframe',
330
+ ...attrs,
331
+ }),
332
+ );
333
+
334
+ // YouTube
335
+ } else if (
336
+ (matches = src.match(
337
+ /\/\/(?:.*?youtube(-nocookie)?\..*?(?:[?&]v=|\/shorts\/)|youtu\.be\/)([\w-]{11})[&?]?(.*)?/,
338
+ ))
339
+ ) {
340
+ this.setItem(
341
+ item,
342
+ createEl('iframe', {
343
+ src: `https://www.youtube${matches[1] || ''}.com/embed/${matches[2]}${
344
+ matches[3] ? `?${matches[3]}` : ''
345
+ }`,
346
+ width: 1920,
347
+ height: 1080,
348
+ ...iframeAttrs,
349
+ ...attrs,
350
+ }),
351
+ );
352
+
353
+ // Vimeo
354
+ } else if ((matches = src.match(/\/\/.*?vimeo\.[a-z]+\/(\d+)[&?]?(.*)?/))) {
355
+ try {
356
+ const { height, width } = await (
357
+ await fetch(
358
+ `https://vimeo.com/api/oembed.json?maxwidth=1920&url=${encodeURI(
359
+ src,
360
+ )}`,
361
+ { credentials: 'omit' },
362
+ )
363
+ ).json();
364
+
365
+ this.setItem(
366
+ item,
367
+ createEl('iframe', {
368
+ src: `https://player.vimeo.com/video/${matches[1]}${
369
+ matches[2] ? `?${matches[2]}` : ''
370
+ }`,
371
+ width,
372
+ height,
373
+ ...iframeAttrs,
374
+ ...attrs,
375
+ }),
376
+ );
377
+ } catch {
378
+ this.setError(item);
297
379
  }
298
- } catch {
299
- this.setError(item);
300
380
  }
301
381
  },
302
382
  },
@@ -372,111 +452,6 @@ function createEl(tag, attrs) {
372
452
  return el;
373
453
  }
374
454
 
375
- async function loadImage({ src, type, attrs, item }) {
376
- if (type !== 'image' && !isImage(src)) {
377
- return;
378
- }
379
-
380
- const img = createEl('img');
381
-
382
- wrapInPicture(img, item.sources);
383
- attr(img, {
384
- src,
385
- ...pick(item, ['alt', 'srcset', 'sizes']),
386
- ...attrs,
387
- });
388
-
389
- await img.decode();
390
-
391
- return parent(img) || img;
392
- }
393
-
394
- function loadVideo({ src, type, attrs, item, cmp }) {
395
- if (type !== 'video' && !isVideo(src)) {
396
- return;
397
- }
398
-
399
- const inline = cmp.videoAutoplay === 'inline';
400
- const video = createEl('video', {
401
- src,
402
- playsinline: '',
403
- controls: inline ? null : '',
404
- loop: inline ? '' : null,
405
- muted: inline ? '' : null,
406
- poster: cmp.videoAutoplay ? null : item.poster,
407
- 'uk-video': Boolean(cmp.videoAutoplay),
408
- ...attrs,
409
- });
410
-
411
- return new Promise((resolve, reject) => {
412
- on(video, 'loadedmetadata', () => resolve(video));
413
- on(video, 'error', reject);
414
- });
415
- }
416
-
417
- function loadIframe({ src, type, attrs }) {
418
- if (type !== 'iframe' && !/\.(html|php)($|\?)/i.test(src)) {
419
- return;
420
- }
421
-
422
- return createEl('iframe', {
423
- src,
424
- allowfullscreen: '',
425
- class: 'uk-lightbox-iframe',
426
- ...attrs,
427
- });
428
- }
429
-
430
- function loadYouTube({ src, attrs, cmp }) {
431
- const matches = src.match(
432
- /\/\/(?:.*?youtube(-nocookie)?\..*?(?:[?&]v=|\/shorts\/)|youtu\.be\/)([\w-]{11})[&?]?(.*)?/,
433
- );
434
-
435
- if (!matches) {
436
- return;
437
- }
438
-
439
- return createEl('iframe', {
440
- src: `https://www.youtube${matches[1] || ''}.com/embed/${matches[2]}${matches[3] ? `?${matches[3]}` : ''}`,
441
- width: 1920,
442
- height: 1080,
443
- ...getIframeAttrs(cmp),
444
- ...attrs,
445
- });
446
- }
447
-
448
- async function loadVimeo({ src, attrs, cmp }) {
449
- const matches = src.match(/\/\/.*?vimeo\.[a-z]+\/(\d+)[&?]?(.*)?/);
450
-
451
- if (!matches) {
452
- return;
453
- }
454
-
455
- const { height, width } = await (
456
- await fetch(
457
- `https://vimeo.com/api/oembed.json?maxwidth=1920&url=${encodeURIComponent(src)}`,
458
- { credentials: 'omit' },
459
- )
460
- ).json();
461
-
462
- return createEl('iframe', {
463
- src: `https://player.vimeo.com/video/${matches[1]}${matches[2] ? `?${matches[2]}` : ''}`,
464
- width,
465
- height,
466
- ...getIframeAttrs(cmp),
467
- ...attrs,
468
- });
469
- }
470
-
471
- function getIframeAttrs(cmp) {
472
- return {
473
- allowfullscreen: '',
474
- style: 'max-width: 100%; box-sizing: border-box;',
475
- 'uk-responsive': '',
476
- 'uk-video': Boolean(cmp.videoAutoplay),
477
- };
478
- }
479
-
480
455
  function toThumbnavItem(item, videoAutoplay) {
481
456
  const el =
482
457
  item.poster || (item.thumb && (item.type === 'image' || isImage(item.thumb)))
@@ -98,11 +98,14 @@ function ensureThumb(toggles, items) {
98
98
  continue;
99
99
  }
100
100
 
101
- const parent = [...parents(toggle).reverse(), toggle].find(
102
- (parent) =>
103
- this.$el.contains(parent) &&
104
- (parent === toggle || $$(this.toggle, parent).length === 1),
105
- );
101
+ const parent = parents(toggle)
102
+ .reverse()
103
+ .concat(toggle)
104
+ .find(
105
+ (parent) =>
106
+ this.$el.contains(parent) &&
107
+ (parent === toggle || $$(this.toggle, parent).length === 1),
108
+ );
106
109
 
107
110
  if (!parent) {
108
111
  continue;
@@ -176,10 +176,8 @@ function getAlignment(el, target, [dir, align]) {
176
176
 
177
177
  function parseProps(options) {
178
178
  const { el, id, data } = options;
179
- return {
180
- delay: getData(el, 'delay'),
181
- title: getData(el, 'title'),
179
+ return ['delay', 'title'].reduce((obj, key) => ({ [key]: getData(el, key), ...obj }), {
182
180
  ...parseOptions(getData(el, id), ['title']),
183
181
  ...data,
184
- };
182
+ });
185
183
  }