uikit 3.16.27 → 3.17.1-dev.7c0766a6f

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 (119) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/less.js +5 -4
  3. package/build/util.js +7 -9
  4. package/dist/css/uikit-core-rtl.css +53 -18
  5. package/dist/css/uikit-core-rtl.min.css +1 -1
  6. package/dist/css/uikit-core.css +53 -18
  7. package/dist/css/uikit-core.min.css +1 -1
  8. package/dist/css/uikit-rtl.css +56 -17
  9. package/dist/css/uikit-rtl.min.css +1 -1
  10. package/dist/css/uikit.css +56 -17
  11. package/dist/css/uikit.min.css +1 -1
  12. package/dist/js/components/countdown.js +1 -1
  13. package/dist/js/components/countdown.min.js +1 -1
  14. package/dist/js/components/filter.js +24 -43
  15. package/dist/js/components/filter.min.js +1 -1
  16. package/dist/js/components/lightbox-panel.js +2 -3
  17. package/dist/js/components/lightbox-panel.min.js +1 -1
  18. package/dist/js/components/lightbox.js +2 -3
  19. package/dist/js/components/lightbox.min.js +1 -1
  20. package/dist/js/components/notification.js +2 -2
  21. package/dist/js/components/notification.min.js +1 -1
  22. package/dist/js/components/parallax.js +7 -17
  23. package/dist/js/components/parallax.min.js +1 -1
  24. package/dist/js/components/slider-parallax.js +6 -13
  25. package/dist/js/components/slider-parallax.min.js +1 -1
  26. package/dist/js/components/slider.js +2 -2
  27. package/dist/js/components/slider.min.js +1 -1
  28. package/dist/js/components/slideshow-parallax.js +6 -13
  29. package/dist/js/components/slideshow-parallax.min.js +1 -1
  30. package/dist/js/components/slideshow.js +19 -4
  31. package/dist/js/components/slideshow.min.js +1 -1
  32. package/dist/js/components/sortable.js +24 -43
  33. package/dist/js/components/sortable.min.js +1 -1
  34. package/dist/js/components/tooltip.js +1 -2
  35. package/dist/js/components/tooltip.min.js +1 -1
  36. package/dist/js/components/upload.js +1 -1
  37. package/dist/js/components/upload.min.js +1 -1
  38. package/dist/js/uikit-core.js +455 -185
  39. package/dist/js/uikit-core.min.js +1 -1
  40. package/dist/js/uikit-icons.js +1 -1
  41. package/dist/js/uikit-icons.min.js +1 -1
  42. package/dist/js/uikit.js +483 -240
  43. package/dist/js/uikit.min.js +1 -9502
  44. package/package.json +1 -1
  45. package/src/js/api/boot.js +2 -2
  46. package/src/js/api/computed.js +1 -1
  47. package/src/js/api/observables.js +1 -4
  48. package/src/js/components/notification.js +1 -1
  49. package/src/js/components/slideshow.js +19 -2
  50. package/src/js/core/cover.js +30 -1
  51. package/src/js/core/drop.js +15 -9
  52. package/src/js/core/dropnav.js +16 -2
  53. package/src/js/core/grid.js +119 -64
  54. package/src/js/core/height-viewport.js +4 -1
  55. package/src/js/core/margin.js +23 -39
  56. package/src/js/core/navbar.js +219 -1
  57. package/src/js/core/scrollspy-nav.js +13 -4
  58. package/src/js/core/scrollspy.js +1 -1
  59. package/src/js/core/sticky.js +10 -11
  60. package/src/js/mixin/internal/animate-fade.js +1 -11
  61. package/src/js/mixin/internal/slideshow-animations.js +1 -1
  62. package/src/js/mixin/slider-reactive.js +1 -1
  63. package/src/js/mixin/togglable.js +0 -2
  64. package/src/js/util/animation.js +19 -13
  65. package/src/js/util/class.js +30 -26
  66. package/src/js/util/dom.js +3 -8
  67. package/src/js/util/filter.js +2 -6
  68. package/src/js/util/viewport.js +26 -4
  69. package/src/less/components/base.less +6 -3
  70. package/src/less/components/form.less +3 -0
  71. package/src/less/components/heading.less +18 -0
  72. package/src/less/components/navbar.less +6 -12
  73. package/src/less/components/pagination.less +13 -6
  74. package/src/less/components/position.less +1 -0
  75. package/src/less/components/section.less +6 -0
  76. package/src/less/theme/heading.less +4 -0
  77. package/src/less/theme/navbar.less +5 -0
  78. package/src/scss/components/base.scss +4 -2
  79. package/src/scss/components/form.scss +3 -0
  80. package/src/scss/components/heading.scss +13 -0
  81. package/src/scss/components/navbar.scss +5 -12
  82. package/src/scss/components/pagination.scss +13 -6
  83. package/src/scss/components/position.scss +1 -0
  84. package/src/scss/components/section.scss +4 -0
  85. package/src/scss/mixins-theme.scss +13 -1
  86. package/src/scss/mixins.scss +8 -1
  87. package/src/scss/theme/heading.scss +4 -0
  88. package/src/scss/variables-theme.scss +7 -0
  89. package/src/scss/variables.scss +7 -0
  90. package/tests/cover.html +2 -2
  91. package/tests/drop.html +13 -7
  92. package/tests/dropnav.html +22 -10
  93. package/tests/filter.html +5 -5
  94. package/tests/form.html +1 -1
  95. package/tests/grid-masonry.html +49 -73
  96. package/tests/grid-parallax.html +82 -40
  97. package/tests/grid.html +21 -3
  98. package/tests/heading.html +33 -4
  99. package/tests/height-viewport.html +3 -3
  100. package/tests/height.html +2 -2
  101. package/tests/icon.html +1 -1
  102. package/tests/image.html +6 -6
  103. package/tests/leader.html +3 -3
  104. package/tests/nav.html +1 -1
  105. package/tests/navbar.html +28 -10
  106. package/tests/notification.html +1 -1
  107. package/tests/offcanvas.html +2 -2
  108. package/tests/parallax.html +1 -1
  109. package/tests/scrollspy.html +3 -3
  110. package/tests/sortable.html +3 -3
  111. package/tests/sticky-navbar.html +233 -14
  112. package/tests/sticky.html +8 -8
  113. package/tests/svg.html +1 -1
  114. package/tests/tab.html +1 -1
  115. package/tests/toggle.html +2 -2
  116. package/tests/tooltip.html +2 -2
  117. package/tests/upload.html +16 -16
  118. package/tests/utility.html +2 -2
  119. package/tests/video.html +3 -3
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.16.27 | https://www.getuikit.com | (c) 2014 - 2023 YOOtheme | MIT License */
1
+ /*! UIkit 3.17.1-dev.7c0766a6f | https://www.getuikit.com | (c) 2014 - 2023 YOOtheme | MIT License */
2
2
 
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -118,7 +118,7 @@
118
118
  }
119
119
  return true;
120
120
  }
121
- function sortBy$1(array, prop) {
121
+ function sortBy(array, prop) {
122
122
  return array.slice().sort(
123
123
  ({ [prop]: propA = 0 }, { [prop]: propB = 0 }) => propA > propB ? 1 : propB > propA ? -1 : 0
124
124
  );
@@ -229,29 +229,40 @@
229
229
  }
230
230
  }
231
231
 
232
- function addClass(element, ...args) {
233
- apply$1(element, args, "add");
232
+ function addClass(element, ...classes) {
233
+ for (const node of toNodes(element)) {
234
+ const add = toClasses(classes).filter((cls) => !hasClass(node, cls));
235
+ if (add.length) {
236
+ node.classList.add(...add);
237
+ }
238
+ }
234
239
  }
235
- function removeClass(element, ...args) {
236
- apply$1(element, args, "remove");
240
+ function removeClass(element, ...classes) {
241
+ for (const node of toNodes(element)) {
242
+ const remove = toClasses(classes).filter((cls) => hasClass(node, cls));
243
+ if (remove.length) {
244
+ node.classList.remove(...remove);
245
+ }
246
+ }
237
247
  }
238
- function removeClasses(element, cls) {
239
- attr(
240
- element,
241
- "class",
242
- (value) => (value || "").replace(new RegExp(`\\b${cls}\\b\\s?`, "g"), "")
243
- );
248
+ function removeClasses$1(element, clsRegex) {
249
+ clsRegex = new RegExp(clsRegex);
250
+ for (const node of toNodes(element)) {
251
+ node.classList.remove(...toArray(node.classList).filter((cls) => cls.match(clsRegex)));
252
+ }
244
253
  }
245
- function replaceClass(element, ...args) {
246
- args[0] && removeClass(element, args[0]);
247
- args[1] && addClass(element, args[1]);
254
+ function replaceClass(element, oldClass, newClass) {
255
+ newClass = toClasses(newClass);
256
+ oldClass = toClasses(oldClass).filter((cls) => !includes(newClass, cls));
257
+ removeClass(element, oldClass);
258
+ addClass(element, newClass);
248
259
  }
249
260
  function hasClass(element, cls) {
250
- [cls] = getClasses(cls);
251
- return !!cls && toNodes(element).some((node) => node.classList.contains(cls));
261
+ [cls] = toClasses(cls);
262
+ return toNodes(element).some((node) => node.classList.contains(cls));
252
263
  }
253
264
  function toggleClass(element, cls, force) {
254
- const classes = getClasses(cls);
265
+ const classes = toClasses(cls);
255
266
  if (!isUndefined(force)) {
256
267
  force = !!force;
257
268
  }
@@ -261,14 +272,8 @@
261
272
  }
262
273
  }
263
274
  }
264
- function apply$1(element, args, fn) {
265
- args = args.reduce((args2, arg) => args2.concat(getClasses(arg)), []);
266
- for (const node of toNodes(element)) {
267
- node.classList[fn](...args);
268
- }
269
- }
270
- function getClasses(str) {
271
- return String(str).split(/[ ,]/).filter(Boolean);
275
+ function toClasses(str) {
276
+ return isArray(str) ? str.map(toClasses).flat() : String(str).split(/[ ,]/).filter(Boolean);
272
277
  }
273
278
 
274
279
  const voidElements = {
@@ -315,7 +320,8 @@
315
320
  return toNodes(element).some((element2) => element2.matches(selector));
316
321
  }
317
322
  function closest(element, selector) {
318
- return isElement(element) ? element.closest(startsWith(selector, ">") ? selector.slice(1) : selector) : toNodes(element).map((element2) => closest(element2, selector)).filter(Boolean);
323
+ var _a;
324
+ return (_a = toNode(element)) == null ? void 0 : _a.closest(startsWith(selector, ">") ? selector.slice(1) : selector);
319
325
  }
320
326
  function within(element, selector) {
321
327
  return isString(selector) ? !!closest(element, selector) : toNode(selector).contains(toNode(element));
@@ -594,6 +600,9 @@
594
600
  }
595
601
  }
596
602
 
603
+ const clsTransition = "uk-transition";
604
+ const clsTransitionEnd = "transitionend";
605
+ const clsTransitionCanceled = "transitioncanceled";
597
606
  function transition$1(element, props, duration = 400, timing = "linear") {
598
607
  duration = Math.round(duration);
599
608
  return Promise.all(
@@ -605,23 +614,23 @@
605
614
  css(element2, name, value);
606
615
  }
607
616
  }
608
- const timer = setTimeout(() => trigger(element2, "transitionend"), duration);
617
+ const timer = setTimeout(() => trigger(element2, clsTransitionEnd), duration);
609
618
  once(
610
619
  element2,
611
- "transitionend transitioncanceled",
620
+ [clsTransitionEnd, clsTransitionCanceled],
612
621
  ({ type }) => {
613
622
  clearTimeout(timer);
614
- removeClass(element2, "uk-transition");
623
+ removeClass(element2, clsTransition);
615
624
  css(element2, {
616
625
  transitionProperty: "",
617
626
  transitionDuration: "",
618
627
  transitionTimingFunction: ""
619
628
  });
620
- type === "transitioncanceled" ? reject() : resolve(element2);
629
+ type === clsTransitionCanceled ? reject() : resolve(element2);
621
630
  },
622
631
  { self: true }
623
632
  );
624
- addClass(element2, "uk-transition");
633
+ addClass(element2, clsTransition);
625
634
  css(element2, {
626
635
  transitionProperty: Object.keys(props).map(propName).join(","),
627
636
  transitionDuration: `${duration}ms`,
@@ -635,32 +644,34 @@
635
644
  const Transition = {
636
645
  start: transition$1,
637
646
  async stop(element) {
638
- trigger(element, "transitionend");
647
+ trigger(element, clsTransitionEnd);
639
648
  await Promise.resolve();
640
649
  },
641
650
  async cancel(element) {
642
- trigger(element, "transitioncanceled");
651
+ trigger(element, clsTransitionCanceled);
643
652
  await Promise.resolve();
644
653
  },
645
654
  inProgress(element) {
646
- return hasClass(element, "uk-transition");
655
+ return hasClass(element, clsTransition);
647
656
  }
648
657
  };
649
658
  const animationPrefix = "uk-animation-";
659
+ const clsAnimationEnd = "animationend";
660
+ const clsAnimationCanceled = "animationcanceled";
650
661
  function animate$2(element, animation, duration = 200, origin, out) {
651
662
  return Promise.all(
652
663
  toNodes(element).map(
653
664
  (element2) => new Promise((resolve, reject) => {
654
- trigger(element2, "animationcanceled");
655
- const timer = setTimeout(() => trigger(element2, "animationend"), duration);
665
+ trigger(element2, clsAnimationCanceled);
666
+ const timer = setTimeout(() => trigger(element2, clsAnimationEnd), duration);
656
667
  once(
657
668
  element2,
658
- "animationend animationcanceled",
669
+ [clsAnimationEnd, clsAnimationCanceled],
659
670
  ({ type }) => {
660
671
  clearTimeout(timer);
661
- type === "animationcanceled" ? reject() : resolve(element2);
672
+ type === clsAnimationCanceled ? reject() : resolve(element2);
662
673
  css(element2, "animationDuration", "");
663
- removeClasses(element2, `${animationPrefix}\\S*`);
674
+ removeClasses$1(element2, `${animationPrefix}\\S*`);
664
675
  },
665
676
  { self: true }
666
677
  );
@@ -684,7 +695,7 @@
684
695
  return inProgressRe.test(attr(element, "class"));
685
696
  },
686
697
  cancel(element) {
687
- trigger(element, "animationcanceled");
698
+ trigger(element, clsAnimationCanceled);
688
699
  }
689
700
  };
690
701
 
@@ -742,20 +753,15 @@
742
753
  function unwrap(element) {
743
754
  toNodes(element).map(parent).filter((value, index, self) => self.indexOf(value) === index).forEach((parent2) => parent2.replaceWith(...parent2.childNodes));
744
755
  }
745
- const fragmentRe = /^\s*<(\w+|!)[^>]*>/;
746
756
  const singleTagRe = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;
747
757
  function fragment(html2) {
748
758
  const matches = singleTagRe.exec(html2);
749
759
  if (matches) {
750
760
  return document.createElement(matches[1]);
751
761
  }
752
- const container = document.createElement("div");
753
- if (fragmentRe.test(html2)) {
754
- container.insertAdjacentHTML("beforeend", html2.trim());
755
- } else {
756
- container.textContent = html2;
757
- }
758
- return unwrapSingle(container.childNodes);
762
+ const container = document.createElement("template");
763
+ container.innerHTML = html2.trim();
764
+ return unwrapSingle(container.content.childNodes);
759
765
  }
760
766
  function unwrapSingle(nodes) {
761
767
  return nodes.length > 1 ? nodes : nodes[0];
@@ -1210,21 +1216,34 @@
1210
1216
  offsetBy -= top;
1211
1217
  top = 0;
1212
1218
  }
1213
- return () => scrollTo(scrollElement, top - scrollTop).then(fn);
1219
+ return () => scrollTo(scrollElement, top - scrollTop, element, maxScroll).then(fn);
1214
1220
  },
1215
1221
  () => Promise.resolve()
1216
1222
  )();
1217
- function scrollTo(element2, top) {
1223
+ function scrollTo(element2, top, targetEl, maxScroll) {
1218
1224
  return new Promise((resolve) => {
1219
1225
  const scroll = element2.scrollTop;
1220
1226
  const duration = getDuration(Math.abs(top));
1221
1227
  const start = Date.now();
1228
+ const targetTop = offset(targetEl).top;
1229
+ let prev = 0;
1230
+ let frames = 15;
1222
1231
  (function step() {
1223
1232
  const percent = ease(clamp((Date.now() - start) / duration));
1224
- element2.scrollTop = scroll + top * percent;
1225
- if (percent === 1) {
1233
+ let diff = 0;
1234
+ if (parents2[0] === element2 && scroll + top < maxScroll) {
1235
+ diff = offset(targetEl).top - targetTop;
1236
+ const fixedEl = findFixedElement(targetEl);
1237
+ diff -= fixedEl ? offset(fixedEl).height : 0;
1238
+ }
1239
+ element2.scrollTop = Math[top + diff > 0 ? "max" : "min"](
1240
+ element2.scrollTop,
1241
+ scroll + (top + diff) * percent
1242
+ );
1243
+ if (percent === 1 && (prev === diff || !frames--)) {
1226
1244
  resolve();
1227
1245
  } else {
1246
+ prev = diff;
1228
1247
  requestAnimationFrame(step);
1229
1248
  }
1230
1249
  })();
@@ -1236,6 +1255,11 @@
1236
1255
  function ease(k) {
1237
1256
  return 0.5 * (1 - Math.cos(Math.PI * k));
1238
1257
  }
1258
+ function findFixedElement(target) {
1259
+ return target.ownerDocument.elementsFromPoint(0, 0).find(
1260
+ (el) => ["fixed", "sticky"].includes(css(el, "position")) && !el.contains(target)
1261
+ );
1262
+ }
1239
1263
  }
1240
1264
  function scrolledOver(element, startOffset = 0, endOffset = 0) {
1241
1265
  if (!isVisible(element)) {
@@ -1598,7 +1622,7 @@
1598
1622
  remove: remove$1,
1599
1623
  removeAttr: removeAttr,
1600
1624
  removeClass: removeClass,
1601
- removeClasses: removeClasses,
1625
+ removeClasses: removeClasses$1,
1602
1626
  replaceClass: replaceClass,
1603
1627
  scrollIntoView: scrollIntoView,
1604
1628
  scrollParent: scrollParent,
@@ -1606,7 +1630,7 @@
1606
1630
  scrolledOver: scrolledOver,
1607
1631
  selFocusable: selFocusable,
1608
1632
  selInput: selInput,
1609
- sortBy: sortBy$1,
1633
+ sortBy: sortBy,
1610
1634
  startsWith: startsWith,
1611
1635
  sumBy: sumBy,
1612
1636
  swap: swap,
@@ -1766,8 +1790,8 @@
1766
1790
  }
1767
1791
  });
1768
1792
  observer.observe(document, {
1769
- childList: true,
1770
- subtree: true
1793
+ subtree: true,
1794
+ childList: true
1771
1795
  });
1772
1796
  }
1773
1797
 
@@ -1865,7 +1889,7 @@
1865
1889
  return childVal !== false && concatStrat(childVal || parentVal);
1866
1890
  };
1867
1891
  strats.update = function(parentVal, childVal) {
1868
- return sortBy$1(
1892
+ return sortBy(
1869
1893
  concatStrat(parentVal, isFunction(childVal) ? { read: childVal } : childVal),
1870
1894
  "order"
1871
1895
  );
@@ -2122,7 +2146,7 @@
2122
2146
  };
2123
2147
  App.util = util;
2124
2148
  App.options = {};
2125
- App.version = "3.16.27";
2149
+ App.version = "3.17.1-dev.7c0766a6f";
2126
2150
 
2127
2151
  const PREFIX = "uk-";
2128
2152
  const DATA = "__uikit__";
@@ -2202,12 +2226,12 @@
2202
2226
  apply(document.body, connect);
2203
2227
  }
2204
2228
  new MutationObserver((records) => records.forEach(applyChildListMutation)).observe(document, {
2205
- childList: true,
2206
- subtree: true
2229
+ subtree: true,
2230
+ childList: true
2207
2231
  });
2208
2232
  new MutationObserver((records) => records.forEach(applyAttributeMutation)).observe(document, {
2209
- attributes: true,
2210
- subtree: true
2233
+ subtree: true,
2234
+ attributes: true
2211
2235
  });
2212
2236
  App._initialized = true;
2213
2237
  }
@@ -2393,10 +2417,7 @@
2393
2417
  function scroll$1(options) {
2394
2418
  return observe(
2395
2419
  (target, handler) => ({
2396
- disconnect: on(toScrollTargets(target), "scroll", handler, {
2397
- passive: true,
2398
- capture: true
2399
- })
2420
+ disconnect: on(toScrollTargets(target), "scroll", handler, { passive: true })
2400
2421
  }),
2401
2422
  options,
2402
2423
  "scroll"
@@ -2629,7 +2650,6 @@
2629
2650
  }
2630
2651
  }
2631
2652
  function toggleAnimation(el, show, cmp) {
2632
- Animation.cancel(el);
2633
2653
  const { animation, duration, _toggle } = cmp;
2634
2654
  if (show) {
2635
2655
  _toggle(el, true);
@@ -2926,6 +2946,17 @@
2926
2946
  }
2927
2947
  };
2928
2948
 
2949
+ const coverProps = {
2950
+ top: 0,
2951
+ // resets the css from [uk-cover]
2952
+ left: 0,
2953
+ // resets the css from [uk-cover]
2954
+ width: "100%",
2955
+ height: "100%",
2956
+ transform: "none",
2957
+ objectFit: "cover",
2958
+ objectPosition: "center"
2959
+ };
2929
2960
  var cover = {
2930
2961
  mixins: [Video],
2931
2962
  props: {
@@ -2941,10 +2972,25 @@
2941
2972
  }
2942
2973
  },
2943
2974
  observe: resize({
2944
- target: ({ $el }) => [getPositionedParent($el) || parent($el)]
2975
+ target: ({ $el }) => [getPositionedParent($el) || parent($el)],
2976
+ filter: ({ _useObjectFit }) => !_useObjectFit
2945
2977
  }),
2978
+ connected() {
2979
+ this._useObjectFit = isTag(this.$el, "img", "video");
2980
+ if (this._useObjectFit) {
2981
+ css(this.$el, coverProps);
2982
+ }
2983
+ },
2984
+ disconnected() {
2985
+ if (this._useObjectFit) {
2986
+ attr(this.$el, "style", "");
2987
+ }
2988
+ },
2946
2989
  update: {
2947
2990
  read() {
2991
+ if (this._useObjectFit) {
2992
+ return;
2993
+ }
2948
2994
  const { ratio, cover } = Dimensions;
2949
2995
  const { $el, width, height } = this;
2950
2996
  let dim = { width, height };
@@ -3127,7 +3173,8 @@
3127
3173
  autoUpdate: Boolean,
3128
3174
  clsDrop: String,
3129
3175
  animateOut: Boolean,
3130
- bgScroll: Boolean
3176
+ bgScroll: Boolean,
3177
+ closeOnScroll: Boolean
3131
3178
  },
3132
3179
  data: {
3133
3180
  mode: ["click", "hover"],
@@ -3147,7 +3194,8 @@
3147
3194
  bgScroll: true,
3148
3195
  animation: ["uk-animation-fade"],
3149
3196
  cls: "uk-open",
3150
- container: false
3197
+ container: false,
3198
+ closeOnScroll: false
3151
3199
  },
3152
3200
  computed: {
3153
3201
  boundary({ boundary, boundaryX, boundaryY }, $el) {
@@ -3274,12 +3322,10 @@
3274
3322
  name: "toggled",
3275
3323
  self: true,
3276
3324
  handler(e, toggled) {
3277
- attr(this.targetEl, "aria-expanded", toggled ? true : null);
3278
- if (!toggled) {
3279
- return;
3325
+ if (toggled) {
3326
+ this.clearTimers();
3327
+ this.position();
3280
3328
  }
3281
- this.clearTimers();
3282
- this.position();
3283
3329
  }
3284
3330
  },
3285
3331
  {
@@ -3288,11 +3334,13 @@
3288
3334
  handler() {
3289
3335
  active$1 = this;
3290
3336
  this.tracker.init();
3337
+ attr(this.targetEl, "aria-expanded", true);
3291
3338
  const handlers = [
3292
3339
  listenForResize(this),
3293
3340
  listenForEscClose$1(this),
3294
3341
  listenForBackgroundClose$1(this),
3295
3342
  this.autoUpdate && listenForScroll(this),
3343
+ this.closeOnScroll && listenForScrollClose(this),
3296
3344
  !this.bgScroll && preventBackgroundScroll(this.$el)
3297
3345
  ];
3298
3346
  once(this.$el, "hide", () => handlers.forEach((handler) => handler && handler()), {
@@ -3316,6 +3364,7 @@
3316
3364
  }
3317
3365
  active$1 = this.isActive() ? null : active$1;
3318
3366
  this.tracker.cancel();
3367
+ attr(this.targetEl, "aria-expanded", null);
3319
3368
  }
3320
3369
  }
3321
3370
  ],
@@ -3358,6 +3407,7 @@
3358
3407
  hide(delay = true, animate = true) {
3359
3408
  const hide = () => this.toggleElement(this.$el, false, this.animateOut && animate);
3360
3409
  this.clearTimers();
3410
+ this.isDelayedHide = delay;
3361
3411
  this.isDelaying = getPositionedElements(this.$el).some(
3362
3412
  (el) => this.tracker.movesTo(el)
3363
3413
  );
@@ -3453,8 +3503,8 @@
3453
3503
  ];
3454
3504
  return () => off.map((observer) => observer.disconnect());
3455
3505
  }
3456
- function listenForScroll(drop) {
3457
- return on([document, ...overflowParents(drop.$el)], "scroll", () => drop.$emit(), {
3506
+ function listenForScroll(drop, fn = () => drop.$emit()) {
3507
+ return on([document, ...overflowParents(drop.$el)], "scroll", fn, {
3458
3508
  passive: true
3459
3509
  });
3460
3510
  }
@@ -3465,6 +3515,9 @@
3465
3515
  }
3466
3516
  });
3467
3517
  }
3518
+ function listenForScrollClose(drop) {
3519
+ return listenForScroll(drop, () => drop.hide(false));
3520
+ }
3468
3521
  function listenForBackgroundClose$1(drop) {
3469
3522
  return on(document, pointerDown, ({ target }) => {
3470
3523
  if (!within(target, drop.$el)) {
@@ -3500,7 +3553,8 @@
3500
3553
  targetX: Boolean,
3501
3554
  targetY: Boolean,
3502
3555
  animation: Boolean,
3503
- animateOut: Boolean
3556
+ animateOut: Boolean,
3557
+ closeOnScroll: Boolean
3504
3558
  },
3505
3559
  data: {
3506
3560
  align: isRtl ? "right" : "left",
@@ -3524,6 +3578,9 @@
3524
3578
  dropbar = this._dropbar || query(dropbar, this.$el) || $(`+ .${this.clsDropbar}`, this.$el);
3525
3579
  return dropbar ? dropbar : this._dropbar = $("<div></div>");
3526
3580
  },
3581
+ dropbarOffset() {
3582
+ return 0;
3583
+ },
3527
3584
  dropContainer(_, $el) {
3528
3585
  return this.container || $el;
3529
3586
  },
@@ -3685,9 +3742,13 @@
3685
3742
  const minTop = Math.min(...targetOffsets.map(({ top }) => top));
3686
3743
  const maxBottom = Math.max(...targetOffsets.map(({ bottom }) => bottom));
3687
3744
  const dropbarOffset = offset(this.dropbar);
3688
- css(this.dropbar, "top", this.dropbar.offsetTop - (dropbarOffset.top - minTop));
3745
+ css(
3746
+ this.dropbar,
3747
+ "top",
3748
+ this.dropbar.offsetTop - (dropbarOffset.top - minTop) - this.dropbarOffset
3749
+ );
3689
3750
  this.transitionTo(
3690
- maxBottom - minTop + toFloat(css(target, "marginBottom")),
3751
+ maxBottom - minTop + toFloat(css(target, "marginBottom")) + this.dropbarOffset,
3691
3752
  target
3692
3753
  );
3693
3754
  };
@@ -3705,7 +3766,7 @@
3705
3766
  },
3706
3767
  handler(e) {
3707
3768
  const active2 = this.getActive();
3708
- if (matches(this.dropbar, ":hover") && active2.$el === e.target && !this.items.some((el) => active2.targetEl !== el && matches(el, ":focus"))) {
3769
+ if (matches(this.dropbar, ":hover") && active2.$el === e.target && includes(active2.mode, "hover") && active2.isDelayedHide && !this.items.some((el) => active2.targetEl !== el && matches(el, ":focus"))) {
3709
3770
  e.preventDefault();
3710
3771
  }
3711
3772
  }
@@ -3874,62 +3935,51 @@
3874
3935
  ],
3875
3936
  update: {
3876
3937
  read() {
3877
- const rows = getRows(this.$el.children);
3878
3938
  return {
3879
- rows,
3880
- columns: getColumns(rows)
3939
+ rows: getRows(toArray(this.$el.children))
3881
3940
  };
3882
3941
  },
3883
- write({ columns, rows }) {
3942
+ write({ rows }) {
3884
3943
  for (const row of rows) {
3885
- for (const column of row) {
3886
- toggleClass(column, this.margin, rows[0] !== row);
3887
- toggleClass(column, this.firstColumn, columns[0].includes(column));
3944
+ for (const el of row) {
3945
+ toggleClass(el, this.margin, rows[0] !== row);
3946
+ toggleClass(el, this.firstColumn, row[isRtl ? row.length - 1 : 0] === el);
3888
3947
  }
3889
3948
  }
3890
3949
  },
3891
3950
  events: ["resize"]
3892
3951
  }
3893
3952
  };
3894
- function getRows(items) {
3895
- return sortBy(items, "top", "bottom");
3896
- }
3897
- function getColumns(rows) {
3898
- const columns = [];
3899
- for (const row of rows) {
3900
- const sorted = sortBy(row, "left", "right");
3901
- for (let j = 0; j < sorted.length; j++) {
3902
- columns[j] = columns[j] ? columns[j].concat(sorted[j]) : sorted[j];
3903
- }
3904
- }
3905
- return isRtl ? columns.reverse() : columns;
3906
- }
3907
- function sortBy(items, startProp, endProp) {
3953
+ function getRows(elements) {
3908
3954
  const sorted = [[]];
3909
- for (const el of items) {
3955
+ const withOffset = elements.some(
3956
+ (el, i) => i && elements[i - 1].offsetParent !== el.offsetParent
3957
+ );
3958
+ for (const el of elements) {
3910
3959
  if (!isVisible(el)) {
3911
3960
  continue;
3912
3961
  }
3913
- let dim = getOffset(el);
3962
+ const offset = getOffset(el, withOffset);
3914
3963
  for (let i = sorted.length - 1; i >= 0; i--) {
3915
3964
  const current = sorted[i];
3916
3965
  if (!current[0]) {
3917
3966
  current.push(el);
3918
3967
  break;
3919
3968
  }
3920
- let startDim;
3921
- if (current[0].offsetParent === el.offsetParent) {
3922
- startDim = getOffset(current[0]);
3923
- } else {
3924
- dim = getOffset(el, true);
3925
- startDim = getOffset(current[0], true);
3926
- }
3927
- if (dim[startProp] >= startDim[endProp] - 1 && dim[startProp] !== startDim[startProp]) {
3969
+ const offsetCurrent = getOffset(current[0], withOffset);
3970
+ if (offset.top >= offsetCurrent.bottom - 1 && offset.top !== offsetCurrent.top) {
3928
3971
  sorted.push([el]);
3929
3972
  break;
3930
3973
  }
3931
- if (dim[endProp] - 1 > startDim[startProp] || dim[startProp] === startDim[startProp]) {
3932
- current.push(el);
3974
+ if (offset.bottom - 1 > offsetCurrent.top || offset.top === offsetCurrent.top) {
3975
+ let j = current.length - 1;
3976
+ for (; j >= 0; j--) {
3977
+ const offsetCurrent2 = getOffset(current[j], withOffset);
3978
+ if (offset.left >= offsetCurrent2.left) {
3979
+ break;
3980
+ }
3981
+ }
3982
+ current.splice(j + 1, 0, el);
3933
3983
  break;
3934
3984
  }
3935
3985
  if (i === 0) {
@@ -3959,52 +4009,77 @@
3959
4009
  name: "grid",
3960
4010
  props: {
3961
4011
  masonry: Boolean,
3962
- parallax: Number
4012
+ parallax: String,
4013
+ parallaxStart: String,
4014
+ parallaxEnd: String,
4015
+ parallaxJustify: Boolean
3963
4016
  },
3964
4017
  data: {
3965
4018
  margin: "uk-grid-margin",
3966
4019
  clsStack: "uk-grid-stack",
3967
4020
  masonry: false,
3968
- parallax: 0
4021
+ parallax: 0,
4022
+ parallaxStart: 0,
4023
+ parallaxEnd: 0,
4024
+ parallaxJustify: false
3969
4025
  },
3970
4026
  connected() {
3971
- this.masonry && addClass(this.$el, "uk-flex-top uk-flex-wrap-top");
4027
+ this.masonry && addClass(this.$el, "uk-flex-top", "uk-flex-wrap-top");
3972
4028
  },
3973
- observe: scroll$1({ filter: ({ parallax }) => parallax }),
4029
+ observe: scroll$1({ filter: ({ parallax, parallaxJustify }) => parallax || parallaxJustify }),
3974
4030
  update: [
3975
4031
  {
3976
- write({ columns }) {
3977
- toggleClass(this.$el, this.clsStack, columns.length < 2);
4032
+ write({ rows }) {
4033
+ toggleClass(this.$el, this.clsStack, !rows[0][1]);
3978
4034
  },
3979
4035
  events: ["resize"]
3980
4036
  },
3981
4037
  {
3982
4038
  read(data) {
3983
- let { columns, rows } = data;
3984
- if (!columns.length || !this.masonry && !this.parallax || positionedAbsolute(this.$el)) {
3985
- data.translates = false;
3986
- return false;
4039
+ const { rows } = data;
4040
+ let { masonry, parallax, parallaxJustify, margin } = this;
4041
+ parallax = Math.max(0, toPx(parallax));
4042
+ if (!(masonry || parallax || parallaxJustify) || positionedAbsolute(rows) || rows[0].some(
4043
+ (el, i) => rows.some((row) => row[i] && row[i].offsetWidth !== el.offsetWidth)
4044
+ )) {
4045
+ return data.translates = data.scrollColumns = false;
3987
4046
  }
3988
- let translates = false;
3989
- const nodes = children(this.$el);
3990
- const columnHeights = columns.map((column) => sumBy(column, "offsetHeight"));
3991
- const margin = getMarginTop(nodes, this.margin) * (rows.length - 1);
3992
- const elHeight = Math.max(...columnHeights) + margin;
3993
- if (this.masonry) {
3994
- columns = columns.map((column) => sortBy$1(column, "offsetTop"));
3995
- translates = getTranslates(rows, columns);
4047
+ let gutter = getGutter(rows, margin);
4048
+ let columns;
4049
+ let translates;
4050
+ if (masonry) {
4051
+ [columns, translates] = applyMasonry(rows, gutter, masonry === "next");
4052
+ } else {
4053
+ columns = transpose(rows);
3996
4054
  }
3997
- let padding = Math.abs(this.parallax);
3998
- if (padding) {
3999
- padding = columnHeights.reduce(
4000
- (newPadding, hgt, i) => Math.max(
4001
- newPadding,
4002
- hgt + margin + (i % 2 ? padding : padding / 8) - elHeight
4003
- ),
4004
- 0
4055
+ const columnHeights = columns.map(
4056
+ (column) => sumBy(column, "offsetHeight") + gutter * (column.length - 1)
4057
+ );
4058
+ const height = Math.max(0, ...columnHeights);
4059
+ let scrollColumns;
4060
+ let parallaxStart;
4061
+ let parallaxEnd;
4062
+ if (parallax || parallaxJustify) {
4063
+ scrollColumns = columnHeights.map(
4064
+ (hgt, i) => parallaxJustify ? height - hgt + parallax : parallax / (i % 2 || 8)
4005
4065
  );
4066
+ if (!parallaxJustify) {
4067
+ parallax = Math.max(
4068
+ ...columnHeights.map((hgt, i) => hgt + scrollColumns[i] - height)
4069
+ );
4070
+ }
4071
+ parallaxStart = toPx(this.parallaxStart, "height", this.$el, true);
4072
+ parallaxEnd = toPx(this.parallaxEnd, "height", this.$el, true);
4006
4073
  }
4007
- return { padding, columns, translates, height: translates ? elHeight : "" };
4074
+ return {
4075
+ columns,
4076
+ translates,
4077
+ scrollColumns,
4078
+ parallaxStart,
4079
+ parallaxEnd,
4080
+ padding: parallax,
4081
+ height: translates ? height : ""
4082
+ };
4008
4083
  },
4009
4084
  write({ height, padding }) {
4010
4085
  css(this.$el, "paddingBottom", padding || "");
@@ -4013,47 +4088,78 @@
4013
4088
  events: ["resize"]
4014
4089
  },
4015
4090
  {
4016
- read() {
4017
- if (this.parallax && positionedAbsolute(this.$el)) {
4091
+ read({ rows, scrollColumns, parallaxStart, parallaxEnd }) {
4092
+ if (scrollColumns && positionedAbsolute(rows)) {
4018
4093
  return false;
4019
4094
  }
4020
4095
  return {
4021
- scrolled: this.parallax ? scrolledOver(this.$el) * Math.abs(this.parallax) : false
4096
+ scrolled: scrollColumns ? scrolledOver(this.$el, parallaxStart, parallaxEnd) : false
4022
4097
  };
4023
4098
  },
4024
- write({ columns, scrolled, translates }) {
4025
- if (scrolled === false && !translates) {
4099
+ write({ columns, scrolled, scrollColumns, translates }) {
4100
+ if (!scrolled && !translates) {
4026
4101
  return;
4027
4102
  }
4028
4103
  columns.forEach(
4029
- (column, i) => column.forEach(
4030
- (el, j) => css(
4031
- el,
4032
- "transform",
4033
- !scrolled && !translates ? "" : `translateY(${(translates && -translates[i][j]) + (scrolled ? i % 2 ? scrolled : scrolled / 8 : 0)}px)`
4034
- )
4035
- )
4104
+ (column, i) => column.forEach((el, j) => {
4105
+ let [x, y] = translates && translates[i][j] || [0, 0];
4106
+ if (scrolled) {
4107
+ y += scrolled * scrollColumns[i];
4108
+ }
4109
+ css(el, "transform", `translate(${x}px, ${y}px)`);
4110
+ })
4036
4111
  );
4037
4112
  },
4038
4113
  events: ["scroll", "resize"]
4039
4114
  }
4040
4115
  ]
4041
4116
  };
4042
- function positionedAbsolute(el) {
4043
- return children(el).some((el2) => css(el2, "position") === "absolute");
4044
- }
4045
- function getTranslates(rows, columns) {
4046
- const rowHeights = rows.map((row) => Math.max(...row.map((el) => el.offsetHeight)));
4047
- return columns.map((elements) => {
4048
- let prev = 0;
4049
- return elements.map(
4050
- (element, row) => prev += row ? rowHeights[row - 1] - elements[row - 1].offsetHeight : 0
4051
- );
4052
- });
4117
+ function positionedAbsolute(rows) {
4118
+ return rows.flat().some((el) => css(el, "position") === "absolute");
4053
4119
  }
4054
- function getMarginTop(nodes, cls) {
4055
- const [node] = nodes.filter((el) => hasClass(el, cls));
4056
- return toFloat(node ? css(node, "marginTop") : css(nodes[0], "paddingLeft"));
4120
+ function applyMasonry(rows, gutter, next) {
4121
+ const columns = [];
4122
+ const translates = [];
4123
+ const columnHeights = Array(rows[0].length).fill(0);
4124
+ let rowHeights = 0;
4125
+ for (let row of rows) {
4126
+ if (isRtl) {
4127
+ row = row.reverse();
4128
+ }
4129
+ let height = 0;
4130
+ for (const j in row) {
4131
+ const { offsetWidth, offsetHeight } = row[j];
4132
+ const index = next ? j : columnHeights.indexOf(Math.min(...columnHeights));
4133
+ push(columns, index, row[j]);
4134
+ push(translates, index, [
4135
+ (index - j) * offsetWidth * (isRtl ? -1 : 1),
4136
+ columnHeights[index] - rowHeights
4137
+ ]);
4138
+ columnHeights[index] += offsetHeight + gutter;
4139
+ height = Math.max(height, offsetHeight);
4140
+ }
4141
+ rowHeights += height + gutter;
4142
+ }
4143
+ return [columns, translates];
4144
+ }
4145
+ function getGutter(rows, cls) {
4146
+ const node = rows.flat().find((el) => hasClass(el, cls));
4147
+ return toFloat(node ? css(node, "marginTop") : css(rows[0][0], "paddingLeft"));
4148
+ }
4149
+ function transpose(rows) {
4150
+ const columns = [];
4151
+ for (const row of rows) {
4152
+ for (const i in row) {
4153
+ push(columns, i, row[i]);
4154
+ }
4155
+ }
4156
+ return columns;
4157
+ }
4158
+ function push(array, index, value) {
4159
+ if (!array[index]) {
4160
+ array[index] = [];
4161
+ }
4162
+ array[index].push(value);
4057
4163
  }
4058
4164
 
4059
4165
  var heightMatch = {
@@ -4148,7 +4254,8 @@
4148
4254
  } else {
4149
4255
  if (this.offsetTop) {
4150
4256
  if (isScrollingElement) {
4151
- const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
4257
+ const offsetTopEl = this.offsetTop === true ? this.$el : query(this.offsetTop, this.$el);
4258
+ const top = offsetPosition(offsetTopEl)[0] - offsetPosition(scrollElement)[0];
4152
4259
  minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : "";
4153
4260
  } else {
4154
4261
  minHeight += ` - ${css(scrollElement, "paddingTop")}`;
@@ -5005,10 +5112,23 @@
5005
5112
 
5006
5113
  var navbar = {
5007
5114
  extends: Dropnav,
5115
+ props: {
5116
+ dropbarTransparentMode: Boolean
5117
+ },
5008
5118
  data: {
5009
5119
  clsDrop: "uk-navbar-dropdown",
5010
- selNavItem: ".uk-navbar-nav > li > a,a.uk-navbar-item,button.uk-navbar-item,.uk-navbar-item a,.uk-navbar-item button,.uk-navbar-toggle"
5120
+ selNavItem: ".uk-navbar-nav > li > a,a.uk-navbar-item,button.uk-navbar-item,.uk-navbar-item a,.uk-navbar-item button,.uk-navbar-toggle",
5011
5121
  // Simplify with :where() selector once browser target is Safari 14+
5122
+ selTransparentTarget: '[class*="uk-section"]',
5123
+ dropbarTransparentMode: false
5124
+ },
5125
+ computed: {
5126
+ dropbarOffset() {
5127
+ return this.dropbarTransparentMode === "behind" ? this.$el.offsetHeight : 0;
5128
+ },
5129
+ navbarContainer() {
5130
+ return closest(this.$el, ".uk-navbar-container");
5131
+ }
5012
5132
  },
5013
5133
  watch: {
5014
5134
  items() {
@@ -5027,8 +5147,153 @@
5027
5147
  );
5028
5148
  }
5029
5149
  }
5150
+ },
5151
+ disconnect() {
5152
+ var _a;
5153
+ (_a = this._colorListener) == null ? void 0 : _a.call(this);
5154
+ },
5155
+ observe: [
5156
+ mutation({
5157
+ target: ({ navbarContainer }) => navbarContainer,
5158
+ handler() {
5159
+ this.registerColorListener();
5160
+ },
5161
+ options: { attributes: true, attributeFilter: ["class"], attributeOldValue: true }
5162
+ }),
5163
+ intersection({
5164
+ handler(records) {
5165
+ this._isIntersecting = records[0].isIntersecting;
5166
+ this.registerColorListener();
5167
+ },
5168
+ args: { intersecting: false }
5169
+ })
5170
+ ],
5171
+ events: [
5172
+ {
5173
+ name: "show",
5174
+ el() {
5175
+ return this.dropContainer;
5176
+ },
5177
+ handler({ target }) {
5178
+ const transparentMode = this.getTransparentMode(target);
5179
+ if (!transparentMode || this._mode) {
5180
+ return;
5181
+ }
5182
+ const storePrevColor = () => this._mode = removeClasses(this.navbarContainer, "uk-light", "uk-dark");
5183
+ if (transparentMode === "behind") {
5184
+ const mode = getDropbarBehindColor(this.$el);
5185
+ if (mode) {
5186
+ storePrevColor();
5187
+ addClass(this.navbarContainer, `uk-${mode}`);
5188
+ }
5189
+ }
5190
+ if (transparentMode === "remove") {
5191
+ storePrevColor();
5192
+ removeClass(this.navbarContainer, "uk-navbar-transparent");
5193
+ }
5194
+ }
5195
+ },
5196
+ {
5197
+ name: "hide",
5198
+ el() {
5199
+ return this.dropContainer;
5200
+ },
5201
+ async handler({ target }) {
5202
+ const transparentMode = this.getTransparentMode(target);
5203
+ if (!transparentMode || !this._mode) {
5204
+ return;
5205
+ }
5206
+ await awaitMacroTask();
5207
+ if (this.getActive()) {
5208
+ return;
5209
+ }
5210
+ if (transparentMode === "behind") {
5211
+ const mode = getDropbarBehindColor(this.$el);
5212
+ if (mode) {
5213
+ removeClass(this.navbarContainer, `uk-${mode}`);
5214
+ }
5215
+ }
5216
+ addClass(this.navbarContainer, this._mode);
5217
+ if (transparentMode === "remove") {
5218
+ addClass(this.navbarContainer, "uk-navbar-transparent");
5219
+ }
5220
+ this._mode = null;
5221
+ }
5222
+ }
5223
+ ],
5224
+ methods: {
5225
+ getTransparentMode(el) {
5226
+ if (!this.navbarContainer) {
5227
+ return;
5228
+ }
5229
+ if (this.dropbar && this.isDropbarDrop(el)) {
5230
+ return this.dropbarTransparentMode;
5231
+ }
5232
+ const drop = this.getDropdown(el);
5233
+ if (!drop || !hasClass(el, "uk-dropbar")) {
5234
+ return;
5235
+ }
5236
+ return drop.inset ? "behind" : "remove";
5237
+ },
5238
+ registerColorListener() {
5239
+ const active = this._isIntersecting && hasClass(this.navbarContainer, "uk-navbar-transparent") && !isWithinMixBlendMode(this.navbarContainer) && !$$(".uk-drop", this.dropContainer).map(this.getDropdown).some(
5240
+ (drop) => drop.isToggled() && (drop.inset || this.getTransparentMode(drop.$el) === "behind")
5241
+ );
5242
+ if (this._colorListener) {
5243
+ if (!active) {
5244
+ this._colorListener();
5245
+ this._colorListener = null;
5246
+ }
5247
+ return;
5248
+ }
5249
+ if (!active) {
5250
+ return;
5251
+ }
5252
+ this._colorListener = listenForPositionChange(this.navbarContainer, () => {
5253
+ const { left, top, height } = offset(this.navbarContainer);
5254
+ const startPoint = { x: left, y: Math.max(0, top) + height / 2 };
5255
+ const target = $$(this.selTransparentTarget).find(
5256
+ (target2) => pointInRect(startPoint, offset(target2))
5257
+ );
5258
+ const color = css(target, "--uk-navbar-color");
5259
+ if (color) {
5260
+ replaceClass(this.navbarContainer, "uk-light,uk-dark", `uk-${color}`);
5261
+ }
5262
+ });
5263
+ }
5030
5264
  }
5031
5265
  };
5266
+ function removeClasses(el, ...classes) {
5267
+ for (const cls of classes) {
5268
+ if (hasClass(el, cls)) {
5269
+ removeClass(el, cls);
5270
+ return cls;
5271
+ }
5272
+ }
5273
+ }
5274
+ async function awaitMacroTask() {
5275
+ return new Promise((resolve) => setTimeout(resolve));
5276
+ }
5277
+ function getDropbarBehindColor(el) {
5278
+ return css(el, "--uk-navbar-dropbar-behind-color");
5279
+ }
5280
+ function listenForPositionChange(el, handler) {
5281
+ const parent2 = scrollParent(el, true);
5282
+ const scrollEl = parent2 === document.documentElement ? document : parent2;
5283
+ const off = on(scrollEl, "scroll", handler, { passive: true });
5284
+ const observer = observeResize([el, parent2], handler);
5285
+ return () => {
5286
+ off();
5287
+ observer.disconnect();
5288
+ };
5289
+ }
5290
+ function isWithinMixBlendMode(el) {
5291
+ do {
5292
+ if (css(el, "mixBlendMode") !== "normal") {
5293
+ return true;
5294
+ }
5295
+ } while (el = parent(el));
5296
+ }
5032
5297
 
5033
5298
  var offcanvas = {
5034
5299
  mixins: [Modal],
@@ -5343,7 +5608,7 @@
5343
5608
  }
5344
5609
  this.$emit();
5345
5610
  },
5346
- options: (instance) => ({ rootMargin: instance.margin }),
5611
+ options: ({ margin }) => ({ rootMargin: margin }),
5347
5612
  args: { intersecting: false }
5348
5613
  }),
5349
5614
  update: [
@@ -5378,7 +5643,7 @@
5378
5643
  toggleClass(el, this.inViewClass, inview);
5379
5644
  toggleClass(el, state.cls);
5380
5645
  if (/\buk-animation-/.test(state.cls)) {
5381
- const removeAnimationClasses = () => removeClasses(el, "uk-animation-[\\w-]+");
5646
+ const removeAnimationClasses = () => removeClasses$1(el, "uk-animation-[\\w-]+");
5382
5647
  if (inview) {
5383
5648
  state.off = once(el, "animationcancel animationend", removeAnimationClasses);
5384
5649
  } else {
@@ -5395,7 +5660,7 @@
5395
5660
  var scrollspyNav = {
5396
5661
  props: {
5397
5662
  cls: String,
5398
- closest: String,
5663
+ closest: Boolean,
5399
5664
  scroll: Boolean,
5400
5665
  overflow: Boolean,
5401
5666
  offset: Number
@@ -5412,13 +5677,13 @@
5412
5677
  return $$('a[href*="#"]', $el).filter((el) => el.hash && isSameSiteAnchor(el));
5413
5678
  },
5414
5679
  elements({ closest: selector }) {
5415
- return closest(this.links, selector || "*");
5680
+ return this.links.map((el) => closest(el, selector || "*"));
5416
5681
  }
5417
5682
  },
5418
5683
  watch: {
5419
5684
  links(links) {
5420
5685
  if (this.scroll) {
5421
- this.$create("scroll", links, { offset: this.offset || 0 });
5686
+ this.$create("scroll", links, { offset: this.offset });
5422
5687
  }
5423
5688
  }
5424
5689
  },
@@ -5440,7 +5705,9 @@
5440
5705
  active = length - 1;
5441
5706
  } else {
5442
5707
  for (let i = 0; i < targets.length; i++) {
5443
- if (offset(targets[i]).top - viewport.top - this.offset > 0) {
5708
+ const fixedEl = findFixedElement(targets[i]);
5709
+ const offsetBy = this.offset + (fixedEl ? offset(fixedEl).height : 0);
5710
+ if (offset(targets[i]).top - viewport.top - offsetBy > 0) {
5444
5711
  break;
5445
5712
  }
5446
5713
  active = +i;
@@ -5465,6 +5732,9 @@
5465
5732
  }
5466
5733
  ]
5467
5734
  };
5735
+ function findFixedElement(target) {
5736
+ return target.ownerDocument.elementsFromPoint(1, 1).find((el) => ["fixed", "sticky"].includes(css(el, "position")) && !el.contains(target));
5737
+ }
5468
5738
 
5469
5739
  var sticky = {
5470
5740
  mixins: [Class, Media],
@@ -5553,7 +5823,6 @@
5553
5823
  },
5554
5824
  {
5555
5825
  name: "transitionstart",
5556
- capture: true,
5557
5826
  handler() {
5558
5827
  this.transitionInProgress = once(
5559
5828
  this.$el,
@@ -5584,7 +5853,10 @@
5584
5853
  }
5585
5854
  const viewport2 = toPx("100vh", "height");
5586
5855
  const dynamicViewport = height(window);
5587
- const maxScrollHeight = document.scrollingElement.scrollHeight - viewport2;
5856
+ const maxScrollHeight = Math.max(
5857
+ 0,
5858
+ document.scrollingElement.scrollHeight - viewport2
5859
+ );
5588
5860
  let position = this.position;
5589
5861
  if (this.overflowFlip && height$1 > viewport2) {
5590
5862
  position = position === "top" ? "bottom" : "top";
@@ -5699,7 +5971,9 @@
5699
5971
  return;
5700
5972
  }
5701
5973
  if (this.animation && scroll2 > topOffset) {
5702
- Animation.cancel(this.$el);
5974
+ if (hasClass(this.$el, "uk-animation-leave")) {
5975
+ return;
5976
+ }
5703
5977
  Animation.out(this.$el, this.animation).then(() => this.hide(), noop);
5704
5978
  } else {
5705
5979
  this.hide();
@@ -5707,7 +5981,6 @@
5707
5981
  } else if (this.isFixed) {
5708
5982
  this.update();
5709
5983
  } else if (this.animation && scroll2 > topOffset) {
5710
- Animation.cancel(this.$el);
5711
5984
  this.show();
5712
5985
  Animation.in(this.$el, this.animation).catch(noop);
5713
5986
  } else {
@@ -5760,15 +6033,12 @@
5760
6033
  if (!sticky) {
5761
6034
  let position = "fixed";
5762
6035
  if (scroll2 > end) {
5763
- offset += end - offsetParentTop;
6036
+ offset += end - offsetParentTop + overflowScroll - overflow;
5764
6037
  position = "absolute";
5765
6038
  }
5766
6039
  css(this.$el, { position, width, marginTop: 0 }, "important");
5767
6040
  }
5768
- if (overflow) {
5769
- offset -= overflowScroll;
5770
- }
5771
- css(this.$el, "top", offset);
6041
+ css(this.$el, "top", offset - overflowScroll);
5772
6042
  this.setActive(active);
5773
6043
  toggleClass(
5774
6044
  this.$el,