uikit 3.21.13 → 3.21.14-dev.2e8a07c7e

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 (142) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/css/uikit-core-rtl.css +233 -85
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +233 -85
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +237 -81
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +237 -81
  9. package/dist/css/uikit.min.css +1 -1
  10. package/dist/js/components/countdown.js +1 -1
  11. package/dist/js/components/countdown.min.js +1 -1
  12. package/dist/js/components/filter.js +2 -11
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +432 -127
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +449 -132
  17. package/dist/js/components/lightbox.min.js +1 -1
  18. package/dist/js/components/notification.js +1 -1
  19. package/dist/js/components/notification.min.js +1 -1
  20. package/dist/js/components/parallax.js +2 -2
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +2 -2
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +20 -28
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +2 -2
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +25 -34
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +4 -2
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +8 -12
  33. package/dist/js/components/tooltip.min.js +1 -1
  34. package/dist/js/components/upload.js +1 -1
  35. package/dist/js/components/upload.min.js +1 -1
  36. package/dist/js/uikit-core.js +242 -241
  37. package/dist/js/uikit-core.min.js +1 -1
  38. package/dist/js/uikit-icons.js +20 -17
  39. package/dist/js/uikit-icons.min.js +1 -1
  40. package/dist/js/uikit.js +668 -549
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +3 -3
  43. package/src/images/icons/arrow-down-arrow-up.svg +6 -0
  44. package/src/images/icons/arrow-down.svg +3 -3
  45. package/src/images/icons/arrow-left.svg +3 -3
  46. package/src/images/icons/arrow-right.svg +3 -3
  47. package/src/images/icons/arrow-up-right.svg +3 -3
  48. package/src/images/icons/arrow-up.svg +3 -3
  49. package/src/images/icons/close-circle.svg +5 -0
  50. package/src/images/icons/cloud-download.svg +4 -4
  51. package/src/images/icons/cloud-upload.svg +4 -4
  52. package/src/images/icons/download.svg +4 -4
  53. package/src/images/icons/expand.svg +5 -5
  54. package/src/images/icons/link-external.svg +4 -4
  55. package/src/images/icons/pull.svg +4 -4
  56. package/src/images/icons/push.svg +3 -3
  57. package/src/images/icons/shrink.svg +5 -5
  58. package/src/images/icons/sign-in.svg +4 -3
  59. package/src/images/icons/sign-out.svg +4 -3
  60. package/src/images/icons/sorting.svg +6 -0
  61. package/src/images/icons/upload.svg +4 -4
  62. package/src/js/api/boot.js +16 -20
  63. package/src/js/api/events.js +12 -13
  64. package/src/js/api/instance.js +1 -1
  65. package/src/js/components/internal/lightbox-animations.js +2 -1
  66. package/src/js/components/internal/slideshow-animations.js +5 -5
  67. package/src/js/components/lightbox-panel.js +184 -45
  68. package/src/js/components/lightbox.js +59 -6
  69. package/src/js/components/slideshow.js +1 -2
  70. package/src/js/components/sortable.js +3 -1
  71. package/src/js/core/drop.js +3 -1
  72. package/src/js/core/grid.js +1 -1
  73. package/src/js/core/icon.js +2 -2
  74. package/src/js/core/img.js +3 -5
  75. package/src/js/core/navbar.js +6 -2
  76. package/src/js/core/scrollspy-nav.js +1 -1
  77. package/src/js/core/svg.js +8 -10
  78. package/src/js/core/video.js +4 -3
  79. package/src/js/mixin/internal/slideshow-animations.js +1 -6
  80. package/src/js/mixin/modal.js +1 -4
  81. package/src/js/mixin/slider-drag.js +5 -6
  82. package/src/js/mixin/slider-nav.js +4 -2
  83. package/src/js/mixin/slider.js +11 -13
  84. package/src/js/mixin/slideshow.js +1 -1
  85. package/src/js/mixin/togglable.js +7 -2
  86. package/src/js/util/dom.js +3 -1
  87. package/src/js/util/filter.js +3 -1
  88. package/src/js/util/player.js +0 -4
  89. package/src/less/components/background.less +1 -9
  90. package/src/less/components/breadcrumb.less +6 -2
  91. package/src/less/components/button.less +1 -1
  92. package/src/less/components/form-range.less +52 -0
  93. package/src/less/components/form.less +1 -1
  94. package/src/less/components/lightbox.less +57 -89
  95. package/src/less/components/margin.less +14 -0
  96. package/src/less/components/search.less +49 -23
  97. package/src/less/components/sticky.less +1 -10
  98. package/src/less/components/totop.less +1 -1
  99. package/src/less/components/transition.less +4 -4
  100. package/src/less/components/visibility.less +3 -2
  101. package/src/less/theme/form-range.less +12 -0
  102. package/src/less/theme/lightbox.less +2 -20
  103. package/src/less/theme/search.less +24 -10
  104. package/src/scss/components/background.scss +1 -9
  105. package/src/scss/components/breadcrumb.scss +6 -2
  106. package/src/scss/components/button.scss +1 -1
  107. package/src/scss/components/form-range.scss +12 -0
  108. package/src/scss/components/form.scss +1 -1
  109. package/src/scss/components/lightbox.scss +50 -77
  110. package/src/scss/components/margin.scss +13 -0
  111. package/src/scss/components/search.scss +30 -12
  112. package/src/scss/components/sticky.scss +1 -10
  113. package/src/scss/components/totop.scss +1 -1
  114. package/src/scss/components/transition.scss +4 -4
  115. package/src/scss/components/visibility.scss +3 -2
  116. package/src/scss/mixins-theme.scss +51 -12
  117. package/src/scss/mixins.scss +45 -6
  118. package/src/scss/theme/form-range.scss +10 -0
  119. package/src/scss/theme/lightbox.scss +2 -20
  120. package/src/scss/theme/search.scss +10 -6
  121. package/src/scss/variables-theme.scss +32 -20
  122. package/src/scss/variables.scss +29 -24
  123. package/tests/badge.html +2 -2
  124. package/tests/base.html +1 -1
  125. package/tests/breadcrumb.html +23 -5
  126. package/tests/card.html +24 -24
  127. package/tests/dropbar.html +15 -15
  128. package/tests/dropdown.html +6 -6
  129. package/tests/dropnav.html +100 -100
  130. package/tests/icon.html +8 -0
  131. package/tests/index.html +15 -15
  132. package/tests/lightbox.html +379 -28
  133. package/tests/margin.html +19 -0
  134. package/tests/nav.html +21 -21
  135. package/tests/navbar.html +292 -292
  136. package/tests/offcanvas.html +27 -27
  137. package/tests/placeholder.html +2 -2
  138. package/tests/slider.html +0 -1
  139. package/tests/slideshow.html +1 -1
  140. package/tests/sortable.html +5 -5
  141. package/tests/sticky-navbar.html +114 -114
  142. package/tests/transition.html +2 -1
@@ -1,64 +1,123 @@
1
1
  import {
2
2
  $,
3
+ $$,
4
+ Transition,
3
5
  addClass,
4
6
  append,
5
7
  attr,
6
8
  fragment,
7
9
  getIndex,
8
10
  html,
11
+ isTag,
12
+ matches,
9
13
  on,
14
+ parent,
15
+ pick,
10
16
  pointerDown,
11
17
  pointerMove,
18
+ remove,
12
19
  removeClass,
13
- Transition,
20
+ toggleClass,
14
21
  trigger,
22
+ wrapAll,
15
23
  } from 'uikit-util';
24
+ import { wrapInPicture } from '../core/img';
16
25
  import Modal from '../mixin/modal';
17
26
  import Slideshow from '../mixin/slideshow';
18
27
  import { keyMap } from '../util/keys';
19
28
  import Animations from './internal/lightbox-animations';
20
29
 
21
30
  export default {
31
+ i18n: {
32
+ counter: '%s / %s',
33
+ },
34
+
22
35
  mixins: [Modal, Slideshow],
23
36
 
24
37
  functional: true,
25
38
 
26
39
  props: {
27
- delayControls: Number,
40
+ counter: Boolean,
28
41
  preload: Number,
42
+ nav: Boolean,
43
+ slidenav: Boolean,
44
+ delayControls: Number,
29
45
  videoAutoplay: Boolean,
30
46
  template: String,
31
47
  },
32
48
 
33
49
  data: () => ({
50
+ counter: false,
34
51
  preload: 1,
35
- videoAutoplay: false,
52
+ nav: false,
53
+ slidenav: true,
36
54
  delayControls: 3000,
55
+ videoAutoplay: false,
37
56
  items: [],
38
57
  cls: 'uk-open',
39
58
  clsPage: 'uk-lightbox-page',
40
- selList: '.uk-lightbox-items',
59
+ clsFit: 'uk-lightbox-items-fit',
60
+ clsZoom: 'uk-lightbox-zoom',
41
61
  attrItem: 'uk-lightbox-item',
62
+ selList: '.uk-lightbox-items',
42
63
  selClose: '.uk-close-large',
64
+ selNav: '.uk-lightbox-thumbnav, .uk-lightbox-dotnav',
43
65
  selCaption: '.uk-lightbox-caption',
66
+ selCounter: '.uk-lightbox-counter',
44
67
  pauseOnHover: false,
45
68
  velocity: 2,
46
69
  Animations,
47
70
  template: `<div class="uk-lightbox uk-overflow-hidden">
48
71
  <div class="uk-lightbox-items"></div>
49
- <div class="uk-lightbox-toolbar uk-position-top uk-text-right uk-transition-slide-top uk-transition-opaque">
50
- <button class="uk-lightbox-toolbar-icon uk-close-large" type="button" uk-close></button>
51
- </div>
52
- <a class="uk-lightbox-button uk-position-center-left uk-position-medium uk-transition-fade" href uk-slidenav-previous uk-lightbox-item="previous"></a>
53
- <a class="uk-lightbox-button uk-position-center-right uk-position-medium uk-transition-fade" href uk-slidenav-next uk-lightbox-item="next"></a>
54
- <div class="uk-lightbox-toolbar uk-lightbox-caption uk-position-bottom uk-text-center uk-transition-slide-bottom uk-transition-opaque"></div>
72
+ <div class="uk-position-top-right uk-position-small uk-transition-fade" uk-inverse>
73
+ <button class="uk-lightbox-close uk-close-large" type="button" uk-close></button>
74
+ </div>
75
+ <div class="uk-lightbox-slidenav uk-position-center-left uk-position-medium uk-transition-fade" uk-inverse>
76
+ <a href uk-slidenav-previous uk-lightbox-item="previous"></a>
77
+ </div>
78
+ <div class="uk-lightbox-slidenav uk-position-center-right uk-position-medium uk-transition-fade" uk-inverse>
79
+ <a href uk-slidenav-next uk-lightbox-item="next"></a>
80
+ </div>
81
+ <div class="uk-position-center-right uk-position-medium uk-transition-fade" uk-inverse style="max-height: 90vh; overflow: auto;">
82
+ <ul class="uk-lightbox-thumbnav uk-lightbox-thumbnav-vertical uk-thumbnav uk-thumbnav-vertical"></ul>
83
+ <ul class="uk-lightbox-dotnav uk-dotnav uk-dotnav-vertical"></ul>
84
+ </div>
85
+ <div class="uk-lightbox-counter uk-text-large uk-position-top-left uk-position-small uk-transition-fade" uk-inverse></div>
86
+ <div class="uk-lightbox-caption uk-position-bottom uk-text-center uk-transition-slide-bottom uk-transition-opaque"></div>
55
87
  </div>`,
56
88
  }),
57
89
 
58
90
  created() {
59
- const $el = $(this.template);
91
+ let $el = $(this.template);
92
+
93
+ if (isTag($el, 'template')) {
94
+ $el = fragment(html($el));
95
+ }
96
+
60
97
  const list = $(this.selList, $el);
61
- this.items.forEach(() => append(list, '<div>'));
98
+ const navType = this.$props.nav;
99
+
100
+ remove($$(this.selNav, $el).filter((el) => !matches(el, `.uk-${navType}`)));
101
+
102
+ for (const [i, item] of this.items.entries()) {
103
+ append(list, '<div>');
104
+ if (navType === 'thumbnav') {
105
+ wrapAll(
106
+ toThumbnavItem(item, this.videoAutoplay),
107
+ append($(this.selNav, $el), `<li uk-lightbox-item="${i}"><a href></a></li>`),
108
+ );
109
+ }
110
+ }
111
+
112
+ if (!this.slidenav) {
113
+ remove($$('.uk-lightbox-slidenav', $el));
114
+ }
115
+
116
+ if (!this.counter) {
117
+ remove($(this.selCounter, $el));
118
+ }
119
+
120
+ addClass(list, this.clsFit);
62
121
 
63
122
  const close = $('[uk-close]', $el);
64
123
  const closeLabel = this.t('close');
@@ -71,9 +130,19 @@ export default {
71
130
 
72
131
  events: [
73
132
  {
74
- name: `${pointerMove} ${pointerDown} keydown`,
133
+ name: 'click',
134
+
135
+ self: true,
136
+
137
+ filter: ({ bgClose }) => bgClose,
75
138
 
76
- handler: 'showControls',
139
+ delegate: ({ selList }) => `${selList} > *`,
140
+
141
+ handler(e) {
142
+ if (!e.defaultPrevented) {
143
+ this.hide();
144
+ }
145
+ },
77
146
  },
78
147
 
79
148
  {
@@ -81,21 +150,33 @@ export default {
81
150
 
82
151
  self: true,
83
152
 
84
- delegate: ({ selList }) => `${selList} > *`,
153
+ delegate: ({ clsZoom }) => `.${clsZoom}`,
85
154
 
86
155
  handler(e) {
87
156
  if (!e.defaultPrevented) {
88
- this.hide();
157
+ toggleClass(this.list, this.clsFit);
89
158
  }
90
159
  },
91
160
  },
92
161
 
162
+ {
163
+ name: `${pointerMove} ${pointerDown} keydown`,
164
+
165
+ filter: ({ delayControls }) => delayControls,
166
+
167
+ handler() {
168
+ this.showControls();
169
+ },
170
+ },
171
+
93
172
  {
94
173
  name: 'shown',
95
174
 
96
175
  self: true,
97
176
 
98
- handler: 'showControls',
177
+ handler() {
178
+ this.showControls();
179
+ },
99
180
  },
100
181
 
101
182
  {
@@ -153,6 +234,16 @@ export default {
153
234
  name: 'beforeitemshow',
154
235
 
155
236
  handler(e) {
237
+ html($(this.selCaption, this.$el), this.getItem().caption || '');
238
+ html(
239
+ $(this.selCounter, this.$el),
240
+ this.t('counter', this.index + 1, this.slides.length),
241
+ );
242
+
243
+ for (let j = -this.preload; j <= this.preload; j++) {
244
+ this.loadItem(this.index + j);
245
+ }
246
+
156
247
  if (this.isToggled()) {
157
248
  return;
158
249
  }
@@ -163,24 +254,12 @@ export default {
163
254
 
164
255
  this.toggleElement(this.$el, true, false);
165
256
 
166
- this.animation = Animations['scale'];
257
+ this.animation = Animations.scale;
167
258
  removeClass(e.target, this.clsActive);
168
259
  this.stack.splice(1, 0, this.index);
169
260
  },
170
261
  },
171
262
 
172
- {
173
- name: 'itemshow',
174
-
175
- handler() {
176
- html($(this.selCaption, this.$el), this.getItem().caption || '');
177
-
178
- for (let j = -this.preload; j <= this.preload; j++) {
179
- this.loadItem(this.index + j);
180
- }
181
- },
182
- },
183
-
184
263
  {
185
264
  name: 'itemshown',
186
265
 
@@ -193,9 +272,9 @@ export default {
193
272
  name: 'itemload',
194
273
 
195
274
  async handler(_, item) {
196
- const { source: src, type, alt = '', poster, attrs = {} } = item;
275
+ const { source: src, type, attrs = {} } = item;
197
276
 
198
- this.setItem(item, '<span uk-spinner></span>');
277
+ this.setItem(item, '<span uk-spinner uk-inverse></span>');
199
278
 
200
279
  if (!src) {
201
280
  return;
@@ -206,26 +285,32 @@ export default {
206
285
  allowfullscreen: '',
207
286
  style: 'max-width: 100%; box-sizing: border-box;',
208
287
  'uk-responsive': '',
209
- 'uk-video': `${this.videoAutoplay}`,
288
+ 'uk-video': `${Boolean(this.videoAutoplay)}`,
210
289
  };
211
290
 
212
291
  // Image
213
- if (
214
- type === 'image' ||
215
- src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i)
216
- ) {
217
- const img = createEl('img', { src, alt, ...attrs });
218
- on(img, 'load', () => this.setItem(item, img));
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));
219
303
  on(img, 'error', () => this.setError(item));
220
304
 
221
305
  // Video
222
- } else if (type === 'video' || src.match(/\.(mp4|webm|ogv)($|\?)/i)) {
306
+ } else if (type === 'video' || isVideo(src)) {
307
+ const inline = this.videoAutoplay === 'inline';
223
308
  const video = createEl('video', {
224
309
  src,
225
- poster,
226
- controls: '',
227
310
  playsinline: '',
228
- 'uk-video': `${this.videoAutoplay}`,
311
+ controls: inline ? null : '',
312
+ poster: this.videoAutoplay ? null : item.poster,
313
+ 'uk-video': inline ? 'automute: true' : Boolean(this.videoAutoplay),
229
314
  ...attrs,
230
315
  });
231
316
 
@@ -293,8 +378,33 @@ export default {
293
378
  }
294
379
  },
295
380
  },
381
+
382
+ {
383
+ name: 'itemloaded',
384
+ handler() {
385
+ this.$emit('resize');
386
+ },
387
+ },
296
388
  ],
297
389
 
390
+ update: {
391
+ read() {
392
+ for (const media of $$(`${this.selList} :not([controls]):is(img,video)`, this.$el)) {
393
+ toggleClass(
394
+ media,
395
+ this.clsZoom,
396
+ (media.naturalHeight || media.videoHeight) - this.$el.offsetHeight >
397
+ Math.max(
398
+ 0,
399
+ (media.naturalWidth || media.videoWidth) - this.$el.offsetWidth,
400
+ ),
401
+ );
402
+ }
403
+ },
404
+
405
+ events: ['resize'],
406
+ },
407
+
298
408
  methods: {
299
409
  loadItem(index = this.index) {
300
410
  const item = this.getItem(index);
@@ -317,12 +427,13 @@ export default {
317
427
  },
318
428
 
319
429
  setError(item) {
320
- this.setItem(item, '<span uk-icon="icon: bolt; ratio: 2"></span>');
430
+ this.setItem(item, '<span uk-icon="icon: bolt; ratio: 2" uk-inverse></span>');
321
431
  },
322
432
 
323
433
  showControls() {
324
434
  clearTimeout(this.controlsTimer);
325
- this.controlsTimer = setTimeout(this.hideControls, this.delayControls);
435
+ this.controlsTimer =
436
+ this.delayControls && setTimeout(this.hideControls, this.delayControls);
326
437
 
327
438
  addClass(this.$el, 'uk-active', 'uk-transition-active');
328
439
  },
@@ -338,3 +449,31 @@ function createEl(tag, attrs) {
338
449
  attr(el, attrs);
339
450
  return el;
340
451
  }
452
+
453
+ function toThumbnavItem(item, videoAutoplay) {
454
+ const el =
455
+ item.poster || (item.thumb && (item.type === 'image' || isImage(item.thumb)))
456
+ ? createEl('img', { src: item.poster || item.thumb, alt: '' })
457
+ : item.thumb && (item.type === 'video' || isVideo(item.thumb))
458
+ ? createEl('video', {
459
+ src: item.thumb,
460
+ loop: '',
461
+ playsinline: '',
462
+ 'uk-video': `autoplay: ${Boolean(videoAutoplay)}; automute: true`,
463
+ })
464
+ : createEl('canvas');
465
+
466
+ if (item.thumbRatio) {
467
+ el.style.aspectRatio = item.thumbRatio;
468
+ }
469
+
470
+ return el;
471
+ }
472
+
473
+ function isImage(src) {
474
+ return src?.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i);
475
+ }
476
+
477
+ function isVideo(src) {
478
+ return src?.match(/\.(mp4|webm|ogv)($|\?)/i);
479
+ }
@@ -1,7 +1,21 @@
1
- import { $$, assign, attr, data, findIndex, isElement, isTag, on, uniqueBy } from 'uikit-util';
1
+ import {
2
+ $,
3
+ $$,
4
+ assign,
5
+ attr,
6
+ findIndex,
7
+ isElement,
8
+ isTag,
9
+ matches,
10
+ on,
11
+ parents,
12
+ uniqueBy,
13
+ } from 'uikit-util';
2
14
  import { parseOptions } from '../api/options';
3
15
  import LightboxPanel from './lightbox-panel';
4
16
 
17
+ const selDisabled = '.uk-disabled *, .uk-disabled, [disabled]';
18
+
5
19
  export default {
6
20
  install,
7
21
 
@@ -31,19 +45,27 @@ export default {
31
45
  events: {
32
46
  name: 'click',
33
47
 
34
- delegate: ({ toggle }) => `${toggle}:not(.uk-disabled)`,
48
+ delegate: ({ toggle }) => toggle,
35
49
 
36
50
  handler(e) {
37
51
  if (!e.defaultPrevented) {
38
52
  e.preventDefault();
39
- this.show(e.current);
53
+ if (!matches(e.current, selDisabled)) {
54
+ this.show(e.current);
55
+ }
40
56
  }
41
57
  },
42
58
  },
43
59
 
44
60
  methods: {
45
61
  show(index) {
46
- const items = uniqueBy(this.toggles.map(toItem), 'source');
62
+ let items = this.toggles.map(toItem);
63
+
64
+ if (this.nav === 'thumbnav') {
65
+ ensureThumb.call(this, this.toggles, items);
66
+ }
67
+
68
+ items = uniqueBy(items, 'source');
47
69
 
48
70
  if (isElement(index)) {
49
71
  const { source } = toItem(index);
@@ -71,11 +93,42 @@ function install(UIkit, Lightbox) {
71
93
  assign(Lightbox.props, UIkit.component('lightboxPanel').options.props);
72
94
  }
73
95
 
96
+ function ensureThumb(toggles, items) {
97
+ for (const [i, toggle] of Object.entries(toggles)) {
98
+ if (items[i].thumb) {
99
+ continue;
100
+ }
101
+
102
+ const parent = parents(toggle)
103
+ .reverse()
104
+ .concat(toggle)
105
+ .find(
106
+ (parent) =>
107
+ this.$el.contains(parent) &&
108
+ (parent === toggle || $$(this.toggle, parent).length === 1),
109
+ );
110
+
111
+ if (!parent) {
112
+ continue;
113
+ }
114
+
115
+ const media = $('img,video', parent);
116
+
117
+ if (media) {
118
+ items[i].thumb = media.currentSrc || media.poster || media.src;
119
+ items[i].thumbRatio =
120
+ (media.naturalWidth || media.videoWidth) /
121
+ (media.naturalHeight || media.videoHeight);
122
+ }
123
+ }
124
+ }
125
+
74
126
  function toItem(el) {
75
127
  const item = {};
76
128
 
77
- for (const attr of ['href', 'caption', 'type', 'poster', 'alt', 'attrs']) {
78
- item[attr === 'href' ? 'source' : attr] = data(el, attr);
129
+ for (const attribute of el.getAttributeNames()) {
130
+ const key = attribute.replace(/^data-/, '');
131
+ item[key === 'href' ? 'source' : key] = el.getAttribute(attribute);
79
132
  }
80
133
 
81
134
  item.attrs = parseOptions(item.attrs);
@@ -31,8 +31,7 @@ export default {
31
31
  aspectRatio: this.ratio ? this.ratio.replace(':', '/') : undefined,
32
32
  minHeight: this.minHeight,
33
33
  maxHeight: this.maxHeight,
34
- minWidth: '100%',
35
- maxWidth: '100%',
34
+ width: '100%',
36
35
  });
37
36
  },
38
37
  },
@@ -68,7 +68,9 @@ export default {
68
68
  events: {
69
69
  name: pointerDown,
70
70
  passive: false,
71
- handler: 'init',
71
+ handler(e) {
72
+ this.init(e);
73
+ },
72
74
  },
73
75
 
74
76
  computed: {
@@ -276,7 +276,9 @@ export default {
276
276
 
277
277
  self: true,
278
278
 
279
- handler: 'clearTimers',
279
+ handler() {
280
+ this.clearTimers();
281
+ },
280
282
  },
281
283
 
282
284
  {
@@ -165,7 +165,7 @@ function applyMasonry(rows, gutter, next) {
165
165
  let rowHeights = 0;
166
166
  for (let row of rows) {
167
167
  if (isRtl) {
168
- row = row.reverse();
168
+ row.reverse();
169
169
  }
170
170
 
171
171
  let height = 0;
@@ -5,6 +5,7 @@ import {
5
5
  attr,
6
6
  css,
7
7
  each,
8
+ fragment,
8
9
  hasAttr,
9
10
  hasClass,
10
11
  hyphenate,
@@ -35,7 +36,6 @@ import spinner from '../../images/components/spinner.svg';
35
36
  import totop from '../../images/components/totop.svg';
36
37
  import I18n from '../mixin/i18n';
37
38
  import Svg from '../mixin/svg';
38
- import { stringToSvg } from './svg';
39
39
 
40
40
  const icons = {
41
41
  spinner,
@@ -262,7 +262,7 @@ function getIcon(icon) {
262
262
  }
263
263
 
264
264
  if (!parsed[icon]) {
265
- parsed[icon] = stringToSvg(icons[applyRtl(icon)] || icons[icon]);
265
+ parsed[icon] = fragment(icons[applyRtl(icon)] || icons[icon]);
266
266
  }
267
267
 
268
268
  return parsed[icon].cloneNode(true);
@@ -101,7 +101,7 @@ function setSourceProps(sourceEl, targetEl) {
101
101
  for (const prop of srcProps) {
102
102
  const value = data(sourceEl, prop);
103
103
  if (value) {
104
- attr(targetEl, prop.replace(/^(data-)+/, ''), value);
104
+ attr(targetEl, prop.replace(/data-/g, ''), value);
105
105
  }
106
106
  }
107
107
  }
@@ -111,14 +111,12 @@ function getImageFromElement(el, src, sources) {
111
111
 
112
112
  wrapInPicture(img, sources);
113
113
  setSourceProps(el, img);
114
- img.onload = () => {
115
- setSrcAttrs(el, img.currentSrc);
116
- };
114
+ img.onload = () => setSrcAttrs(el, img.currentSrc);
117
115
  attr(img, 'src', src);
118
116
  return img;
119
117
  }
120
118
 
121
- function wrapInPicture(img, sources) {
119
+ export function wrapInPicture(img, sources) {
122
120
  sources = parseSources(sources);
123
121
 
124
122
  if (sources.length) {
@@ -1,4 +1,4 @@
1
- import { $$, addClass, css, hasClass, offset, removeClass } from 'uikit-util';
1
+ import { $$, addClass, css, hasClass, offset, parent, removeClass } from 'uikit-util';
2
2
  import Dropnav from './dropnav';
3
3
 
4
4
  const clsNavbarTransparent = 'uk-navbar-transparent';
@@ -56,7 +56,11 @@ export default {
56
56
 
57
57
  el: ({ dropContainer }) => dropContainer,
58
58
 
59
- async handler() {
59
+ async handler(e) {
60
+ if (parent(e.target) !== this.dropContainer) {
61
+ return;
62
+ }
63
+
60
64
  await awaitMacroTask();
61
65
 
62
66
  if (!this.getActive() && this._transparent) {
@@ -52,7 +52,7 @@ export default {
52
52
  update: [
53
53
  {
54
54
  read() {
55
- const targets = this.links.map((el) => getTargetedElement(el) || el.ownerDocument);
55
+ const targets = this.links.map((el) => getTargetedElement(el)).filter(Boolean);
56
56
 
57
57
  const { length } = targets;
58
58
 
@@ -2,6 +2,7 @@ import {
2
2
  addClass,
3
3
  attr,
4
4
  css,
5
+ fragment,
5
6
  includes,
6
7
  isTag,
7
8
  memoize,
@@ -94,11 +95,14 @@ const loadSVG = memoize(async (src) => {
94
95
  if (startsWith(src, 'data:')) {
95
96
  return decodeURIComponent(src.split(',')[1]);
96
97
  } else {
97
- return (await fetch(src)).text();
98
+ const response = await fetch(src);
99
+ if (response.headers.get('Content-Type') === 'image/svg+xml') {
100
+ return response.text();
101
+ }
98
102
  }
99
- } else {
100
- return Promise.reject();
101
103
  }
104
+
105
+ return Promise.reject();
102
106
  });
103
107
 
104
108
  function parseSVG(svg, icon) {
@@ -106,7 +110,7 @@ function parseSVG(svg, icon) {
106
110
  svg = parseSymbols(svg)[icon] || svg;
107
111
  }
108
112
 
109
- return stringToSvg(svg);
113
+ return fragment(svg);
110
114
  }
111
115
 
112
116
  const symbolRe = /<symbol([^]*?id=(['"])(.+?)\2[^]*?<\/)symbol>/g;
@@ -131,9 +135,3 @@ function applyAnimation(el) {
131
135
  css(el, '--uk-animation-stroke', length);
132
136
  }
133
137
  }
134
-
135
- export function stringToSvg(string) {
136
- const container = document.createElement('template');
137
- container.innerHTML = string;
138
- return container.content.firstElementChild;
139
- }
@@ -3,7 +3,6 @@ import {
3
3
  includes,
4
4
  isTag,
5
5
  isTouch,
6
- isVideo,
7
6
  mute,
8
7
  parent,
9
8
  pause,
@@ -78,7 +77,7 @@ export default {
78
77
 
79
78
  observe: [
80
79
  intersection({
81
- filter: ({ $el, autoplay }) => autoplay !== 'hover' && isVideo($el),
80
+ filter: ({ autoplay }) => autoplay !== 'hover',
82
81
  handler([{ isIntersecting }]) {
83
82
  if (!document.fullscreenElement) {
84
83
  if (isIntersecting) {
@@ -91,7 +90,9 @@ export default {
91
90
  }
92
91
  },
93
92
  args: { intersecting: false },
94
- options: ({ $el, autoplay }) => ({ root: autoplay === 'inview' ? null : parent($el) }),
93
+ options: ({ $el, autoplay }) => ({
94
+ root: autoplay === 'inview' ? null : parent($el).closest(':not(a)'),
95
+ }),
95
96
  }),
96
97
  ],
97
98
  };
@@ -24,10 +24,5 @@ export function translated(el) {
24
24
  }
25
25
 
26
26
  export function translate(value = 0, unit = '%') {
27
- value += value ? unit : '';
28
- return `translate3d(${value}, 0, 0)`;
29
- }
30
-
31
- export function scale3d(value) {
32
- return `scale3d(${value}, ${value}, 1)`;
27
+ return value ? `translate3d(${value + unit}, 0, 0)` : '';
33
28
  }