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,4 +1,4 @@
1
- /*! UIkit 3.21.14-dev.028df7be8 | https://www.getuikit.com | (c) 2014 - 2024 YOOtheme | MIT License */
1
+ /*! UIkit 3.21.14-dev.2e8a07c7e | https://www.getuikit.com | (c) 2014 - 2024 YOOtheme | MIT License */
2
2
 
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('uikit-util')) :
@@ -6,6 +6,191 @@
6
6
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.UIkitLightbox_panel = factory(global.UIkit.util));
7
7
  })(this, (function (util) { 'use strict';
8
8
 
9
+ function callUpdate(instance, e = "update") {
10
+ if (!instance._connected) {
11
+ return;
12
+ }
13
+ if (!instance._updates.length) {
14
+ return;
15
+ }
16
+ if (!instance._queued) {
17
+ instance._queued = /* @__PURE__ */ new Set();
18
+ util.fastdom.read(() => {
19
+ if (instance._connected) {
20
+ runUpdates(instance, instance._queued);
21
+ }
22
+ instance._queued = null;
23
+ });
24
+ }
25
+ instance._queued.add(e.type || e);
26
+ }
27
+ function runUpdates(instance, types) {
28
+ for (const { read, write, events = [] } of instance._updates) {
29
+ if (!types.has("update") && !events.some((type) => types.has(type))) {
30
+ continue;
31
+ }
32
+ let result;
33
+ if (read) {
34
+ result = read.call(instance, instance._data, types);
35
+ if (result && util.isPlainObject(result)) {
36
+ util.assign(instance._data, result);
37
+ }
38
+ }
39
+ if (write && result !== false) {
40
+ util.fastdom.write(() => {
41
+ if (instance._connected) {
42
+ write.call(instance, instance._data, types);
43
+ }
44
+ });
45
+ }
46
+ }
47
+ }
48
+
49
+ function resize(options) {
50
+ return observe(util.observeResize, options, "resize");
51
+ }
52
+ function intersection(options) {
53
+ return observe(util.observeIntersection, options);
54
+ }
55
+ function observe(observe2, options, emit) {
56
+ return {
57
+ observe: observe2,
58
+ handler() {
59
+ callUpdate(this, emit);
60
+ },
61
+ ...options
62
+ };
63
+ }
64
+
65
+ function parseOptions(options, args = []) {
66
+ try {
67
+ return options ? util.startsWith(options, "{") ? JSON.parse(options) : args.length && !util.includes(options, ":") ? { [args[0]]: options } : options.split(";").reduce((options2, option) => {
68
+ const [key, value] = option.split(/:(.*)/);
69
+ if (key && !util.isUndefined(value)) {
70
+ options2[key.trim()] = value.trim();
71
+ }
72
+ return options2;
73
+ }, {}) : {};
74
+ } catch (e) {
75
+ return {};
76
+ }
77
+ }
78
+
79
+ ({
80
+ args: "dataSrc",
81
+ props: {
82
+ dataSrc: String,
83
+ sources: String,
84
+ margin: String,
85
+ target: String,
86
+ loading: String
87
+ },
88
+ data: {
89
+ dataSrc: "",
90
+ sources: false,
91
+ margin: "50%",
92
+ target: false,
93
+ loading: "lazy"
94
+ },
95
+ connected() {
96
+ if (this.loading !== "lazy") {
97
+ this.load();
98
+ } else if (isImg(this.$el)) {
99
+ this.$el.loading = "lazy";
100
+ setSrcAttrs(this.$el);
101
+ }
102
+ },
103
+ disconnected() {
104
+ if (this.img) {
105
+ this.img.onload = "";
106
+ }
107
+ delete this.img;
108
+ },
109
+ observe: intersection({
110
+ handler(entries, observer) {
111
+ this.load();
112
+ observer.disconnect();
113
+ },
114
+ options: ({ margin }) => ({ rootMargin: margin }),
115
+ filter: ({ loading }) => loading === "lazy",
116
+ target: ({ $el, $props }) => $props.target ? [$el, ...util.queryAll($props.target, $el)] : $el
117
+ }),
118
+ methods: {
119
+ load() {
120
+ if (this.img) {
121
+ return this.img;
122
+ }
123
+ const image = isImg(this.$el) ? this.$el : getImageFromElement(this.$el, this.dataSrc, this.sources);
124
+ util.removeAttr(image, "loading");
125
+ setSrcAttrs(this.$el, image.currentSrc);
126
+ return this.img = image;
127
+ }
128
+ }
129
+ });
130
+ function setSrcAttrs(el, src) {
131
+ if (isImg(el)) {
132
+ const parentNode = util.parent(el);
133
+ const elements = util.isTag(parentNode, "picture") ? util.children(parentNode) : [el];
134
+ elements.forEach((el2) => setSourceProps(el2, el2));
135
+ } else if (src) {
136
+ const change = !util.includes(el.style.backgroundImage, src);
137
+ if (change) {
138
+ util.css(el, "backgroundImage", `url(${util.escape(src)})`);
139
+ util.trigger(el, util.createEvent("load", false));
140
+ }
141
+ }
142
+ }
143
+ const srcProps = ["data-src", "data-srcset", "sizes"];
144
+ function setSourceProps(sourceEl, targetEl) {
145
+ for (const prop of srcProps) {
146
+ const value = util.data(sourceEl, prop);
147
+ if (value) {
148
+ util.attr(targetEl, prop.replace(/data-/g, ""), value);
149
+ }
150
+ }
151
+ }
152
+ function getImageFromElement(el, src, sources) {
153
+ const img = new Image();
154
+ wrapInPicture(img, sources);
155
+ setSourceProps(el, img);
156
+ img.onload = () => setSrcAttrs(el, img.currentSrc);
157
+ util.attr(img, "src", src);
158
+ return img;
159
+ }
160
+ function wrapInPicture(img, sources) {
161
+ sources = parseSources(sources);
162
+ if (sources.length) {
163
+ const picture = util.fragment("<picture>");
164
+ for (const attrs of sources) {
165
+ const source = util.fragment("<source>");
166
+ util.attr(source, attrs);
167
+ util.append(picture, source);
168
+ }
169
+ util.append(picture, img);
170
+ }
171
+ }
172
+ function parseSources(sources) {
173
+ if (!sources) {
174
+ return [];
175
+ }
176
+ if (util.startsWith(sources, "[")) {
177
+ try {
178
+ sources = JSON.parse(sources);
179
+ } catch (e) {
180
+ sources = [];
181
+ }
182
+ } else {
183
+ sources = parseOptions(sources);
184
+ }
185
+ if (!util.isArray(sources)) {
186
+ sources = [sources];
187
+ }
188
+ return sources.filter((source) => !util.isEmpty(source));
189
+ }
190
+ function isImg(el) {
191
+ return util.isTag(el, "img");
192
+ }
193
+
9
194
  let prevented;
10
195
  function preventBackgroundScroll(el) {
11
196
  const off = util.on(
@@ -78,6 +263,16 @@
78
263
  }
79
264
  };
80
265
 
266
+ function storeScrollPosition(element) {
267
+ const scrollElement = util.scrollParent(element);
268
+ const { scrollTop } = scrollElement;
269
+ return () => {
270
+ if (scrollTop !== scrollElement.scrollTop) {
271
+ scrollElement.scrollTop = scrollTop;
272
+ }
273
+ };
274
+ }
275
+
81
276
  var Togglable = {
82
277
  props: {
83
278
  cls: Boolean,
@@ -115,8 +310,14 @@
115
310
  util.addClass(el, cls);
116
311
  util.trigger(el, show ? "show" : "hide", [this]);
117
312
  const done = () => {
313
+ var _a;
118
314
  util.removeClass(el, cls);
119
315
  util.trigger(el, show ? "shown" : "hidden", [this]);
316
+ if (show) {
317
+ const restoreScrollPosition = storeScrollPosition(el);
318
+ (_a = util.$$("[autofocus]", el).find(util.isVisible)) == null ? void 0 : _a.focus();
319
+ restoreScrollPosition();
320
+ }
120
321
  };
121
322
  return promise ? promise.then(done, () => {
122
323
  util.removeClass(el, cls);
@@ -149,7 +350,6 @@
149
350
  if (changed) {
150
351
  util.trigger(el, "toggled", [toggled, this]);
151
352
  }
152
- util.$$("[autofocus]", el).some((el2) => util.isVisible(el2) ? el2.focus() || true : el2.blur());
153
353
  }
154
354
  }
155
355
  };
@@ -280,9 +480,6 @@
280
480
  panel: ({ selPanel }, $el) => util.$(selPanel, $el),
281
481
  transitionElement() {
282
482
  return this.panel;
283
- },
284
- bgClose({ bgClose }) {
285
- return bgClose && this.panel;
286
483
  }
287
484
  },
288
485
  connected() {
@@ -445,7 +642,7 @@
445
642
  }
446
643
  function listenForBackgroundClose(modal) {
447
644
  return util.on(document, util.pointerDown, ({ target }) => {
448
- if (util.last(active) !== modal || modal.overlay && !modal.$el.contains(target) || modal.panel.contains(target)) {
645
+ if (util.last(active) !== modal || modal.overlay && !modal.$el.contains(target) || !modal.panel || modal.panel.contains(target)) {
449
646
  return;
450
647
  }
451
648
  util.once(
@@ -468,59 +665,6 @@
468
665
  });
469
666
  }
470
667
 
471
- function callUpdate(instance, e = "update") {
472
- if (!instance._connected) {
473
- return;
474
- }
475
- if (!instance._updates.length) {
476
- return;
477
- }
478
- if (!instance._queued) {
479
- instance._queued = /* @__PURE__ */ new Set();
480
- util.fastdom.read(() => {
481
- if (instance._connected) {
482
- runUpdates(instance, instance._queued);
483
- }
484
- instance._queued = null;
485
- });
486
- }
487
- instance._queued.add(e.type || e);
488
- }
489
- function runUpdates(instance, types) {
490
- for (const { read, write, events = [] } of instance._updates) {
491
- if (!types.has("update") && !events.some((type) => types.has(type))) {
492
- continue;
493
- }
494
- let result;
495
- if (read) {
496
- result = read.call(instance, instance._data, types);
497
- if (result && util.isPlainObject(result)) {
498
- util.assign(instance._data, result);
499
- }
500
- }
501
- if (write && result !== false) {
502
- util.fastdom.write(() => {
503
- if (instance._connected) {
504
- write.call(instance, instance._data, types);
505
- }
506
- });
507
- }
508
- }
509
- }
510
-
511
- function resize(options) {
512
- return observe(util.observeResize, options, "resize");
513
- }
514
- function observe(observe2, options, emit) {
515
- return {
516
- observe: observe2,
517
- handler() {
518
- callUpdate(this, emit);
519
- },
520
- ...options
521
- };
522
- }
523
-
524
668
  var Animations$1 = {
525
669
  slide: {
526
670
  show(dir) {
@@ -541,11 +685,7 @@
541
685
  return Math.abs(new DOMMatrix(util.css(el, "transform")).m41 / el.offsetWidth);
542
686
  }
543
687
  function translate(value = 0, unit = "%") {
544
- value += value ? unit : "";
545
- return `translate3d(${value}, 0, 0)`;
546
- }
547
- function scale3d(value) {
548
- return `scale3d(${value}, ${value}, 1)`;
688
+ return value ? `translate3d(${value + unit}, 0, 0)` : "";
549
689
  }
550
690
 
551
691
  function Transitioner(prev, next, dir, { animation, easing }) {
@@ -679,7 +819,6 @@
679
819
  const pointerDown = "touchstart mousedown";
680
820
  const pointerMove = "touchmove mousemove";
681
821
  const pointerUp = "touchend touchcancel mouseup click input scroll";
682
- const preventClick = (e) => e.preventDefault();
683
822
  var SliderDrag = {
684
823
  props: {
685
824
  draggable: Boolean
@@ -747,9 +886,6 @@
747
886
  if (distance === 0 || this.prevPos === this.pos || !this.dragging && Math.abs(distance) < this.threshold) {
748
887
  return;
749
888
  }
750
- if (!this.dragging) {
751
- util.on(this.list, "click", preventClick, pointerOptions);
752
- }
753
889
  e.cancelable && e.preventDefault();
754
890
  this.dragging = true;
755
891
  this.dir = distance < 0 ? 1 : -1;
@@ -798,6 +934,7 @@
798
934
  util.off(document, pointerMove, this.move, pointerOptions);
799
935
  util.off(document, pointerUp, this.end, pointerUpOptions);
800
936
  if (this.dragging) {
937
+ setTimeout(util.on(this.list, "click", (e) => e.preventDefault(), pointerOptions));
801
938
  this.dragging = null;
802
939
  if (this.index === this.prevIndex) {
803
940
  this.percent = 1 - this.percent;
@@ -808,6 +945,8 @@
808
945
  const dirChange = (util.isRtl ? this.dir * (util.isRtl ? 1 : -1) : this.dir) < 0 === this.prevPos > this.pos;
809
946
  this.index = dirChange ? this.index : this.prevIndex;
810
947
  if (dirChange) {
948
+ util.trigger(this.slides[this.prevIndex], "itemhidden", [this]);
949
+ util.trigger(this.slides[this.index], "itemshown", [this]);
811
950
  this.percent = 1 - this.percent;
812
951
  }
813
952
  this.show(
@@ -816,7 +955,6 @@
816
955
  );
817
956
  }
818
957
  }
819
- setTimeout(() => util.off(this.list, "click", preventClick, pointerOptions));
820
958
  util.css(this.list, { userSelect: "" });
821
959
  this.drag = this.percent = null;
822
960
  }
@@ -841,16 +979,11 @@
841
979
  }
842
980
 
843
981
  const keyMap = {
844
- TAB: 9,
845
- ESC: 27,
846
982
  SPACE: 32,
847
983
  END: 35,
848
984
  HOME: 36,
849
985
  LEFT: 37,
850
- UP: 38,
851
- RIGHT: 39,
852
- DOWN: 40
853
- };
986
+ RIGHT: 39};
854
987
 
855
988
  var SliderNav = {
856
989
  i18n: {
@@ -996,7 +1129,7 @@
996
1129
  const item = util.toNumber(cmd);
997
1130
  const active = item === index;
998
1131
  util.toggleClass(el, this.clsActive, active);
999
- util.toggleClass(button, "uk-disabled", this.parallax);
1132
+ util.toggleClass(button, "uk-disabled", !!this.parallax);
1000
1133
  util.attr(button, {
1001
1134
  "aria-selected": active,
1002
1135
  tabindex: active && !this.parallax ? null : -1
@@ -1099,7 +1232,7 @@
1099
1232
  }
1100
1233
  },
1101
1234
  methods: {
1102
- show(index, force = false) {
1235
+ async show(index, force = false) {
1103
1236
  var _a;
1104
1237
  if (this.dragging || !this.length || this.parallax) {
1105
1238
  return;
@@ -1135,18 +1268,16 @@
1135
1268
  reset();
1136
1269
  return;
1137
1270
  }
1138
- const promise = this._show(prev, next, force).then(() => {
1139
- prev && util.trigger(prev, "itemhidden", [this]);
1140
- util.trigger(next, "itemshown", [this]);
1141
- stack.shift();
1142
- this._transitioner = null;
1143
- if (stack.length) {
1144
- requestAnimationFrame(() => stack.length && this.show(stack.shift(), true));
1145
- }
1146
- });
1147
1271
  prev && util.trigger(prev, "itemhide", [this]);
1148
1272
  util.trigger(next, "itemshow", [this]);
1149
- return promise;
1273
+ await this._show(prev, next, force);
1274
+ prev && util.trigger(prev, "itemhidden", [this]);
1275
+ util.trigger(next, "itemshown", [this]);
1276
+ stack.shift();
1277
+ this._transitioner = null;
1278
+ if (stack.length) {
1279
+ requestAnimationFrame(() => stack.length && this.show(stack.shift(), true));
1280
+ }
1150
1281
  },
1151
1282
  getIndex(index = this.index, prev = this.index) {
1152
1283
  return util.clamp(
@@ -1216,7 +1347,7 @@
1216
1347
  },
1217
1348
  observe: resize(),
1218
1349
  events: {
1219
- beforeitemshow({ target }) {
1350
+ itemshow({ target }) {
1220
1351
  util.addClass(target, this.clsActive);
1221
1352
  },
1222
1353
  itemshown({ target }) {
@@ -1228,6 +1359,84 @@
1228
1359
  }
1229
1360
  };
1230
1361
 
1362
+ ({
1363
+ ...Animations$1,
1364
+ fade: {
1365
+ show() {
1366
+ return [{ opacity: 0, zIndex: 0 }, { zIndex: -1 }];
1367
+ },
1368
+ percent(current) {
1369
+ return 1 - util.css(current, "opacity");
1370
+ },
1371
+ translate(percent) {
1372
+ return [{ opacity: 1 - percent, zIndex: 0 }, { zIndex: -1 }];
1373
+ }
1374
+ },
1375
+ scale: {
1376
+ show() {
1377
+ return [{ opacity: 0, transform: scale3d(1 + 0.5), zIndex: 0 }, { zIndex: -1 }];
1378
+ },
1379
+ percent(current) {
1380
+ return 1 - util.css(current, "opacity");
1381
+ },
1382
+ translate(percent) {
1383
+ return [
1384
+ { opacity: 1 - percent, transform: scale3d(1 + 0.5 * percent), zIndex: 0 },
1385
+ { zIndex: -1 }
1386
+ ];
1387
+ }
1388
+ },
1389
+ pull: {
1390
+ show(dir) {
1391
+ return dir < 0 ? [
1392
+ { transform: translate(30), zIndex: -1 },
1393
+ { transform: translate(), zIndex: 0 }
1394
+ ] : [
1395
+ { transform: translate(-100), zIndex: 0 },
1396
+ { transform: translate(), zIndex: -1 }
1397
+ ];
1398
+ },
1399
+ percent(current, next, dir) {
1400
+ return dir < 0 ? 1 - translated(next) : translated(current);
1401
+ },
1402
+ translate(percent, dir) {
1403
+ return dir < 0 ? [
1404
+ { transform: translate(30 * percent), zIndex: -1 },
1405
+ { transform: translate(-100 * (1 - percent)), zIndex: 0 }
1406
+ ] : [
1407
+ { transform: translate(-percent * 100), zIndex: 0 },
1408
+ { transform: translate(30 * (1 - percent)), zIndex: -1 }
1409
+ ];
1410
+ }
1411
+ },
1412
+ push: {
1413
+ show(dir) {
1414
+ return dir < 0 ? [
1415
+ { transform: translate(100), zIndex: 0 },
1416
+ { transform: translate(), zIndex: -1 }
1417
+ ] : [
1418
+ { transform: translate(-30), zIndex: -1 },
1419
+ { transform: translate(), zIndex: 0 }
1420
+ ];
1421
+ },
1422
+ percent(current, next, dir) {
1423
+ return dir > 0 ? 1 - translated(next) : translated(current);
1424
+ },
1425
+ translate(percent, dir) {
1426
+ return dir < 0 ? [
1427
+ { transform: translate(percent * 100), zIndex: 0 },
1428
+ { transform: translate(-30 * (1 - percent)), zIndex: -1 }
1429
+ ] : [
1430
+ { transform: translate(-30 * percent), zIndex: -1 },
1431
+ { transform: translate(100 * (1 - percent)), zIndex: 0 }
1432
+ ];
1433
+ }
1434
+ }
1435
+ });
1436
+ function scale3d(value) {
1437
+ return `scale3d(${value}, ${value}, 1)`;
1438
+ }
1439
+
1231
1440
  var Animations = {
1232
1441
  ...Animations$1,
1233
1442
  fade: {
@@ -1261,34 +1470,67 @@
1261
1470
  };
1262
1471
 
1263
1472
  var Component = {
1473
+ i18n: {
1474
+ counter: "%s / %s"
1475
+ },
1264
1476
  mixins: [Modal, Slideshow],
1265
1477
  functional: true,
1266
1478
  props: {
1267
- delayControls: Number,
1479
+ counter: Boolean,
1268
1480
  preload: Number,
1481
+ nav: Boolean,
1482
+ slidenav: Boolean,
1483
+ delayControls: Number,
1269
1484
  videoAutoplay: Boolean,
1270
1485
  template: String
1271
1486
  },
1272
1487
  data: () => ({
1488
+ counter: false,
1273
1489
  preload: 1,
1274
- videoAutoplay: false,
1490
+ nav: false,
1491
+ slidenav: true,
1275
1492
  delayControls: 3e3,
1493
+ videoAutoplay: false,
1276
1494
  items: [],
1277
1495
  cls: "uk-open",
1278
1496
  clsPage: "uk-lightbox-page",
1279
- selList: ".uk-lightbox-items",
1497
+ clsFit: "uk-lightbox-items-fit",
1498
+ clsZoom: "uk-lightbox-zoom",
1280
1499
  attrItem: "uk-lightbox-item",
1500
+ selList: ".uk-lightbox-items",
1281
1501
  selClose: ".uk-close-large",
1502
+ selNav: ".uk-lightbox-thumbnav, .uk-lightbox-dotnav",
1282
1503
  selCaption: ".uk-lightbox-caption",
1504
+ selCounter: ".uk-lightbox-counter",
1283
1505
  pauseOnHover: false,
1284
1506
  velocity: 2,
1285
1507
  Animations,
1286
- template: `<div class="uk-lightbox uk-overflow-hidden"> <div class="uk-lightbox-items"></div> <div class="uk-lightbox-toolbar uk-position-top uk-text-right uk-transition-slide-top uk-transition-opaque"> <button class="uk-lightbox-toolbar-icon uk-close-large" type="button" uk-close></button> </div> <a class="uk-lightbox-button uk-position-center-left uk-position-medium uk-transition-fade" href uk-slidenav-previous uk-lightbox-item="previous"></a> <a class="uk-lightbox-button uk-position-center-right uk-position-medium uk-transition-fade" href uk-slidenav-next uk-lightbox-item="next"></a> <div class="uk-lightbox-toolbar uk-lightbox-caption uk-position-bottom uk-text-center uk-transition-slide-bottom uk-transition-opaque"></div> </div>`
1508
+ template: `<div class="uk-lightbox uk-overflow-hidden"> <div class="uk-lightbox-items"></div> <div class="uk-position-top-right uk-position-small uk-transition-fade" uk-inverse> <button class="uk-lightbox-close uk-close-large" type="button" uk-close></button> </div> <div class="uk-lightbox-slidenav uk-position-center-left uk-position-medium uk-transition-fade" uk-inverse> <a href uk-slidenav-previous uk-lightbox-item="previous"></a> </div> <div class="uk-lightbox-slidenav uk-position-center-right uk-position-medium uk-transition-fade" uk-inverse> <a href uk-slidenav-next uk-lightbox-item="next"></a> </div> <div class="uk-position-center-right uk-position-medium uk-transition-fade" uk-inverse style="max-height: 90vh; overflow: auto;"> <ul class="uk-lightbox-thumbnav uk-lightbox-thumbnav-vertical uk-thumbnav uk-thumbnav-vertical"></ul> <ul class="uk-lightbox-dotnav uk-dotnav uk-dotnav-vertical"></ul> </div> <div class="uk-lightbox-counter uk-text-large uk-position-top-left uk-position-small uk-transition-fade" uk-inverse></div> <div class="uk-lightbox-caption uk-position-bottom uk-text-center uk-transition-slide-bottom uk-transition-opaque"></div> </div>`
1287
1509
  }),
1288
1510
  created() {
1289
- const $el = util.$(this.template);
1511
+ let $el = util.$(this.template);
1512
+ if (util.isTag($el, "template")) {
1513
+ $el = util.fragment(util.html($el));
1514
+ }
1290
1515
  const list = util.$(this.selList, $el);
1291
- this.items.forEach(() => util.append(list, "<div>"));
1516
+ const navType = this.$props.nav;
1517
+ util.remove(util.$$(this.selNav, $el).filter((el) => !util.matches(el, `.uk-${navType}`)));
1518
+ for (const [i, item] of this.items.entries()) {
1519
+ util.append(list, "<div>");
1520
+ if (navType === "thumbnav") {
1521
+ util.wrapAll(
1522
+ toThumbnavItem(item, this.videoAutoplay),
1523
+ util.append(util.$(this.selNav, $el), `<li uk-lightbox-item="${i}"><a href></a></li>`)
1524
+ );
1525
+ }
1526
+ }
1527
+ if (!this.slidenav) {
1528
+ util.remove(util.$$(".uk-lightbox-slidenav", $el));
1529
+ }
1530
+ if (!this.counter) {
1531
+ util.remove(util.$(this.selCounter, $el));
1532
+ }
1533
+ util.addClass(list, this.clsFit);
1292
1534
  const close = util.$("[uk-close]", $el);
1293
1535
  const closeLabel = this.t("close");
1294
1536
  if (close && closeLabel) {
@@ -1298,21 +1540,33 @@
1298
1540
  },
1299
1541
  events: [
1300
1542
  {
1301
- name: `${util.pointerMove} ${util.pointerDown} keydown`,
1302
- handler() {
1303
- this.showControls();
1543
+ name: "click",
1544
+ self: true,
1545
+ filter: ({ bgClose }) => bgClose,
1546
+ delegate: ({ selList }) => `${selList} > *`,
1547
+ handler(e) {
1548
+ if (!e.defaultPrevented) {
1549
+ this.hide();
1550
+ }
1304
1551
  }
1305
1552
  },
1306
1553
  {
1307
1554
  name: "click",
1308
1555
  self: true,
1309
- delegate: ({ selList }) => `${selList} > *`,
1556
+ delegate: ({ clsZoom }) => `.${clsZoom}`,
1310
1557
  handler(e) {
1311
1558
  if (!e.defaultPrevented) {
1312
- this.hide();
1559
+ util.toggleClass(this.list, this.clsFit);
1313
1560
  }
1314
1561
  }
1315
1562
  },
1563
+ {
1564
+ name: `${util.pointerMove} ${util.pointerDown} keydown`,
1565
+ filter: ({ delayControls }) => delayControls,
1566
+ handler() {
1567
+ this.showControls();
1568
+ }
1569
+ },
1316
1570
  {
1317
1571
  name: "shown",
1318
1572
  self: true,
@@ -1361,26 +1615,25 @@
1361
1615
  {
1362
1616
  name: "beforeitemshow",
1363
1617
  handler(e) {
1618
+ util.html(util.$(this.selCaption, this.$el), this.getItem().caption || "");
1619
+ util.html(
1620
+ util.$(this.selCounter, this.$el),
1621
+ this.t("counter", this.index + 1, this.slides.length)
1622
+ );
1623
+ for (let j = -this.preload; j <= this.preload; j++) {
1624
+ this.loadItem(this.index + j);
1625
+ }
1364
1626
  if (this.isToggled()) {
1365
1627
  return;
1366
1628
  }
1367
1629
  this.draggable = false;
1368
1630
  e.preventDefault();
1369
1631
  this.toggleElement(this.$el, true, false);
1370
- this.animation = Animations["scale"];
1632
+ this.animation = Animations.scale;
1371
1633
  util.removeClass(e.target, this.clsActive);
1372
1634
  this.stack.splice(1, 0, this.index);
1373
1635
  }
1374
1636
  },
1375
- {
1376
- name: "itemshow",
1377
- handler() {
1378
- util.html(util.$(this.selCaption, this.$el), this.getItem().caption || "");
1379
- for (let j = -this.preload; j <= this.preload; j++) {
1380
- this.loadItem(this.index + j);
1381
- }
1382
- }
1383
- },
1384
1637
  {
1385
1638
  name: "itemshown",
1386
1639
  handler() {
@@ -1390,29 +1643,36 @@
1390
1643
  {
1391
1644
  name: "itemload",
1392
1645
  async handler(_, item) {
1393
- const { source: src, type, alt = "", poster, attrs = {} } = item;
1394
- this.setItem(item, "<span uk-spinner></span>");
1646
+ const { source: src, type, attrs = {} } = item;
1647
+ this.setItem(item, "<span uk-spinner uk-inverse></span>");
1395
1648
  if (!src) {
1396
1649
  return;
1397
1650
  }
1398
- let matches;
1651
+ let matches2;
1399
1652
  const iframeAttrs = {
1400
1653
  allowfullscreen: "",
1401
1654
  style: "max-width: 100%; box-sizing: border-box;",
1402
1655
  "uk-responsive": "",
1403
- "uk-video": `${this.videoAutoplay}`
1656
+ "uk-video": `${Boolean(this.videoAutoplay)}`
1404
1657
  };
1405
- if (type === "image" || src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i)) {
1406
- const img = createEl("img", { src, alt, ...attrs });
1407
- util.on(img, "load", () => this.setItem(item, img));
1658
+ if (type === "image" || isImage(src)) {
1659
+ const img = createEl("img");
1660
+ wrapInPicture(img, item.sources);
1661
+ util.attr(img, {
1662
+ src,
1663
+ ...util.pick(item, ["alt", "srcset", "sizes"]),
1664
+ ...attrs
1665
+ });
1666
+ util.on(img, "load", () => this.setItem(item, util.parent(img) || img));
1408
1667
  util.on(img, "error", () => this.setError(item));
1409
- } else if (type === "video" || src.match(/\.(mp4|webm|ogv)($|\?)/i)) {
1668
+ } else if (type === "video" || isVideo(src)) {
1669
+ const inline = this.videoAutoplay === "inline";
1410
1670
  const video = createEl("video", {
1411
1671
  src,
1412
- poster,
1413
- controls: "",
1414
1672
  playsinline: "",
1415
- "uk-video": `${this.videoAutoplay}`,
1673
+ controls: inline ? null : "",
1674
+ poster: this.videoAutoplay ? null : item.poster,
1675
+ "uk-video": inline ? "automute: true" : Boolean(this.videoAutoplay),
1416
1676
  ...attrs
1417
1677
  });
1418
1678
  util.on(video, "loadedmetadata", () => this.setItem(item, video));
@@ -1427,20 +1687,20 @@
1427
1687
  ...attrs
1428
1688
  })
1429
1689
  );
1430
- } else if (matches = src.match(
1690
+ } else if (matches2 = src.match(
1431
1691
  /\/\/(?:.*?youtube(-nocookie)?\..*?(?:[?&]v=|\/shorts\/)|youtu\.be\/)([\w-]{11})[&?]?(.*)?/
1432
1692
  )) {
1433
1693
  this.setItem(
1434
1694
  item,
1435
1695
  createEl("iframe", {
1436
- src: `https://www.youtube${matches[1] || ""}.com/embed/${matches[2]}${matches[3] ? `?${matches[3]}` : ""}`,
1696
+ src: `https://www.youtube${matches2[1] || ""}.com/embed/${matches2[2]}${matches2[3] ? `?${matches2[3]}` : ""}`,
1437
1697
  width: 1920,
1438
1698
  height: 1080,
1439
1699
  ...iframeAttrs,
1440
1700
  ...attrs
1441
1701
  })
1442
1702
  );
1443
- } else if (matches = src.match(/\/\/.*?vimeo\.[a-z]+\/(\d+)[&?]?(.*)?/)) {
1703
+ } else if (matches2 = src.match(/\/\/.*?vimeo\.[a-z]+\/(\d+)[&?]?(.*)?/)) {
1444
1704
  try {
1445
1705
  const { height, width } = await (await fetch(
1446
1706
  `https://vimeo.com/api/oembed.json?maxwidth=1920&url=${encodeURI(
@@ -1451,7 +1711,7 @@
1451
1711
  this.setItem(
1452
1712
  item,
1453
1713
  createEl("iframe", {
1454
- src: `https://player.vimeo.com/video/${matches[1]}${matches[2] ? `?${matches[2]}` : ""}`,
1714
+ src: `https://player.vimeo.com/video/${matches2[1]}${matches2[2] ? `?${matches2[2]}` : ""}`,
1455
1715
  width,
1456
1716
  height,
1457
1717
  ...iframeAttrs,
@@ -1463,8 +1723,29 @@
1463
1723
  }
1464
1724
  }
1465
1725
  }
1726
+ },
1727
+ {
1728
+ name: "itemloaded",
1729
+ handler() {
1730
+ this.$emit("resize");
1731
+ }
1466
1732
  }
1467
1733
  ],
1734
+ update: {
1735
+ read() {
1736
+ for (const media of util.$$(`${this.selList} :not([controls]):is(img,video)`, this.$el)) {
1737
+ util.toggleClass(
1738
+ media,
1739
+ this.clsZoom,
1740
+ (media.naturalHeight || media.videoHeight) - this.$el.offsetHeight > Math.max(
1741
+ 0,
1742
+ (media.naturalWidth || media.videoWidth) - this.$el.offsetWidth
1743
+ )
1744
+ );
1745
+ }
1746
+ },
1747
+ events: ["resize"]
1748
+ },
1468
1749
  methods: {
1469
1750
  loadItem(index = this.index) {
1470
1751
  const item = this.getItem(index);
@@ -1482,11 +1763,11 @@
1482
1763
  return this.slides[this.items.indexOf(item)];
1483
1764
  },
1484
1765
  setError(item) {
1485
- this.setItem(item, '<span uk-icon="icon: bolt; ratio: 2"></span>');
1766
+ this.setItem(item, '<span uk-icon="icon: bolt; ratio: 2" uk-inverse></span>');
1486
1767
  },
1487
1768
  showControls() {
1488
1769
  clearTimeout(this.controlsTimer);
1489
- this.controlsTimer = setTimeout(this.hideControls, this.delayControls);
1770
+ this.controlsTimer = this.delayControls && setTimeout(this.hideControls, this.delayControls);
1490
1771
  util.addClass(this.$el, "uk-active", "uk-transition-active");
1491
1772
  },
1492
1773
  hideControls() {
@@ -1499,6 +1780,24 @@
1499
1780
  util.attr(el, attrs);
1500
1781
  return el;
1501
1782
  }
1783
+ function toThumbnavItem(item, videoAutoplay) {
1784
+ const el = item.poster || item.thumb && (item.type === "image" || isImage(item.thumb)) ? createEl("img", { src: item.poster || item.thumb, alt: "" }) : item.thumb && (item.type === "video" || isVideo(item.thumb)) ? createEl("video", {
1785
+ src: item.thumb,
1786
+ loop: "",
1787
+ playsinline: "",
1788
+ "uk-video": `autoplay: ${Boolean(videoAutoplay)}; automute: true`
1789
+ }) : createEl("canvas");
1790
+ if (item.thumbRatio) {
1791
+ el.style.aspectRatio = item.thumbRatio;
1792
+ }
1793
+ return el;
1794
+ }
1795
+ function isImage(src) {
1796
+ return src == null ? void 0 : src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i);
1797
+ }
1798
+ function isVideo(src) {
1799
+ return src == null ? void 0 : src.match(/\.(mp4|webm|ogv)($|\?)/i);
1800
+ }
1502
1801
 
1503
1802
  if (typeof window !== "undefined" && window.UIkit) {
1504
1803
  window.UIkit.component("lightboxPanel", Component);