uikit 3.21.14-dev.028df7be8 → 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 (140) 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 +425 -126
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +442 -131
  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 +17 -27
  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 +22 -33
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +3 -3
  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 +225 -221
  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 +644 -530
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +2 -2
  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/events.js +15 -14
  63. package/src/js/api/instance.js +1 -1
  64. package/src/js/components/internal/lightbox-animations.js +2 -1
  65. package/src/js/components/internal/slideshow-animations.js +5 -5
  66. package/src/js/components/lightbox-panel.js +180 -45
  67. package/src/js/components/lightbox.js +59 -6
  68. package/src/js/components/slideshow.js +1 -2
  69. package/src/js/components/sortable.js +2 -2
  70. package/src/js/core/grid.js +1 -1
  71. package/src/js/core/icon.js +2 -2
  72. package/src/js/core/img.js +3 -5
  73. package/src/js/core/navbar.js +6 -2
  74. package/src/js/core/scrollspy-nav.js +1 -1
  75. package/src/js/core/svg.js +8 -10
  76. package/src/js/core/video.js +4 -3
  77. package/src/js/mixin/internal/slideshow-animations.js +1 -6
  78. package/src/js/mixin/modal.js +1 -4
  79. package/src/js/mixin/slider-drag.js +5 -6
  80. package/src/js/mixin/slider-nav.js +1 -1
  81. package/src/js/mixin/slider.js +11 -13
  82. package/src/js/mixin/slideshow.js +1 -1
  83. package/src/js/mixin/togglable.js +7 -2
  84. package/src/js/util/dom.js +3 -1
  85. package/src/js/util/filter.js +3 -1
  86. package/src/js/util/player.js +0 -4
  87. package/src/less/components/background.less +1 -9
  88. package/src/less/components/breadcrumb.less +6 -2
  89. package/src/less/components/button.less +1 -1
  90. package/src/less/components/form-range.less +52 -0
  91. package/src/less/components/form.less +1 -1
  92. package/src/less/components/lightbox.less +57 -89
  93. package/src/less/components/margin.less +14 -0
  94. package/src/less/components/search.less +49 -23
  95. package/src/less/components/sticky.less +1 -10
  96. package/src/less/components/totop.less +1 -1
  97. package/src/less/components/transition.less +4 -4
  98. package/src/less/components/visibility.less +3 -2
  99. package/src/less/theme/form-range.less +12 -0
  100. package/src/less/theme/lightbox.less +2 -20
  101. package/src/less/theme/search.less +24 -10
  102. package/src/scss/components/background.scss +1 -9
  103. package/src/scss/components/breadcrumb.scss +6 -2
  104. package/src/scss/components/button.scss +1 -1
  105. package/src/scss/components/form-range.scss +12 -0
  106. package/src/scss/components/form.scss +1 -1
  107. package/src/scss/components/lightbox.scss +50 -77
  108. package/src/scss/components/margin.scss +13 -0
  109. package/src/scss/components/search.scss +30 -12
  110. package/src/scss/components/sticky.scss +1 -10
  111. package/src/scss/components/totop.scss +1 -1
  112. package/src/scss/components/transition.scss +4 -4
  113. package/src/scss/components/visibility.scss +3 -2
  114. package/src/scss/mixins-theme.scss +51 -12
  115. package/src/scss/mixins.scss +45 -6
  116. package/src/scss/theme/form-range.scss +10 -0
  117. package/src/scss/theme/lightbox.scss +2 -20
  118. package/src/scss/theme/search.scss +10 -6
  119. package/src/scss/variables-theme.scss +32 -20
  120. package/src/scss/variables.scss +29 -24
  121. package/tests/badge.html +2 -2
  122. package/tests/base.html +1 -1
  123. package/tests/breadcrumb.html +23 -5
  124. package/tests/card.html +24 -24
  125. package/tests/dropbar.html +15 -15
  126. package/tests/dropdown.html +6 -6
  127. package/tests/dropnav.html +100 -100
  128. package/tests/icon.html +8 -0
  129. package/tests/index.html +15 -15
  130. package/tests/lightbox.html +379 -28
  131. package/tests/margin.html +19 -0
  132. package/tests/nav.html +21 -21
  133. package/tests/navbar.html +292 -292
  134. package/tests/offcanvas.html +27 -27
  135. package/tests/placeholder.html +2 -2
  136. package/tests/slider.html +0 -1
  137. package/tests/slideshow.html +1 -1
  138. package/tests/sortable.html +5 -5
  139. package/tests/sticky-navbar.html +114 -114
  140. 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,10 +130,18 @@ export default {
71
130
 
72
131
  events: [
73
132
  {
74
- name: `${pointerMove} ${pointerDown} keydown`,
133
+ name: 'click',
75
134
 
76
- handler() {
77
- this.showControls();
135
+ self: true,
136
+
137
+ filter: ({ bgClose }) => bgClose,
138
+
139
+ delegate: ({ selList }) => `${selList} > *`,
140
+
141
+ handler(e) {
142
+ if (!e.defaultPrevented) {
143
+ this.hide();
144
+ }
78
145
  },
79
146
  },
80
147
 
@@ -83,15 +150,25 @@ export default {
83
150
 
84
151
  self: true,
85
152
 
86
- delegate: ({ selList }) => `${selList} > *`,
153
+ delegate: ({ clsZoom }) => `.${clsZoom}`,
87
154
 
88
155
  handler(e) {
89
156
  if (!e.defaultPrevented) {
90
- this.hide();
157
+ toggleClass(this.list, this.clsFit);
91
158
  }
92
159
  },
93
160
  },
94
161
 
162
+ {
163
+ name: `${pointerMove} ${pointerDown} keydown`,
164
+
165
+ filter: ({ delayControls }) => delayControls,
166
+
167
+ handler() {
168
+ this.showControls();
169
+ },
170
+ },
171
+
95
172
  {
96
173
  name: 'shown',
97
174
 
@@ -157,6 +234,16 @@ export default {
157
234
  name: 'beforeitemshow',
158
235
 
159
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
+
160
247
  if (this.isToggled()) {
161
248
  return;
162
249
  }
@@ -167,24 +254,12 @@ export default {
167
254
 
168
255
  this.toggleElement(this.$el, true, false);
169
256
 
170
- this.animation = Animations['scale'];
257
+ this.animation = Animations.scale;
171
258
  removeClass(e.target, this.clsActive);
172
259
  this.stack.splice(1, 0, this.index);
173
260
  },
174
261
  },
175
262
 
176
- {
177
- name: 'itemshow',
178
-
179
- handler() {
180
- html($(this.selCaption, this.$el), this.getItem().caption || '');
181
-
182
- for (let j = -this.preload; j <= this.preload; j++) {
183
- this.loadItem(this.index + j);
184
- }
185
- },
186
- },
187
-
188
263
  {
189
264
  name: 'itemshown',
190
265
 
@@ -197,9 +272,9 @@ export default {
197
272
  name: 'itemload',
198
273
 
199
274
  async handler(_, item) {
200
- const { source: src, type, alt = '', poster, attrs = {} } = item;
275
+ const { source: src, type, attrs = {} } = item;
201
276
 
202
- this.setItem(item, '<span uk-spinner></span>');
277
+ this.setItem(item, '<span uk-spinner uk-inverse></span>');
203
278
 
204
279
  if (!src) {
205
280
  return;
@@ -210,26 +285,32 @@ export default {
210
285
  allowfullscreen: '',
211
286
  style: 'max-width: 100%; box-sizing: border-box;',
212
287
  'uk-responsive': '',
213
- 'uk-video': `${this.videoAutoplay}`,
288
+ 'uk-video': `${Boolean(this.videoAutoplay)}`,
214
289
  };
215
290
 
216
291
  // Image
217
- if (
218
- type === 'image' ||
219
- src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i)
220
- ) {
221
- const img = createEl('img', { src, alt, ...attrs });
222
- 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));
223
303
  on(img, 'error', () => this.setError(item));
224
304
 
225
305
  // Video
226
- } else if (type === 'video' || src.match(/\.(mp4|webm|ogv)($|\?)/i)) {
306
+ } else if (type === 'video' || isVideo(src)) {
307
+ const inline = this.videoAutoplay === 'inline';
227
308
  const video = createEl('video', {
228
309
  src,
229
- poster,
230
- controls: '',
231
310
  playsinline: '',
232
- 'uk-video': `${this.videoAutoplay}`,
311
+ controls: inline ? null : '',
312
+ poster: this.videoAutoplay ? null : item.poster,
313
+ 'uk-video': inline ? 'automute: true' : Boolean(this.videoAutoplay),
233
314
  ...attrs,
234
315
  });
235
316
 
@@ -297,8 +378,33 @@ export default {
297
378
  }
298
379
  },
299
380
  },
381
+
382
+ {
383
+ name: 'itemloaded',
384
+ handler() {
385
+ this.$emit('resize');
386
+ },
387
+ },
300
388
  ],
301
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
+
302
408
  methods: {
303
409
  loadItem(index = this.index) {
304
410
  const item = this.getItem(index);
@@ -321,12 +427,13 @@ export default {
321
427
  },
322
428
 
323
429
  setError(item) {
324
- 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>');
325
431
  },
326
432
 
327
433
  showControls() {
328
434
  clearTimeout(this.controlsTimer);
329
- this.controlsTimer = setTimeout(this.hideControls, this.delayControls);
435
+ this.controlsTimer =
436
+ this.delayControls && setTimeout(this.hideControls, this.delayControls);
330
437
 
331
438
  addClass(this.$el, 'uk-active', 'uk-transition-active');
332
439
  },
@@ -342,3 +449,31 @@ function createEl(tag, attrs) {
342
449
  attr(el, attrs);
343
450
  return el;
344
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,8 +68,8 @@ export default {
68
68
  events: {
69
69
  name: pointerDown,
70
70
  passive: false,
71
- handler() {
72
- this.init();
71
+ handler(e) {
72
+ this.init(e);
73
73
  },
74
74
  },
75
75
 
@@ -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
  }
@@ -53,10 +53,6 @@ export default {
53
53
  transitionElement() {
54
54
  return this.panel;
55
55
  },
56
-
57
- bgClose({ bgClose }) {
58
- return bgClose && this.panel;
59
- },
60
56
  },
61
57
 
62
58
  connected() {
@@ -266,6 +262,7 @@ function listenForBackgroundClose(modal) {
266
262
  if (
267
263
  last(active) !== modal ||
268
264
  (modal.overlay && !modal.$el.contains(target)) ||
265
+ !modal.panel ||
269
266
  modal.panel.contains(target)
270
267
  ) {
271
268
  return;