uikit 3.25.29-dev.7b0f736 → 3.25.29-dev.a0b5ca8

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 (61) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/css/uikit-core-rtl.css +1 -1
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +1 -1
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +1 -1
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +1 -1
  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 +3 -3
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +17 -13
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +17 -13
  17. package/dist/js/components/lightbox.min.js +1 -1
  18. package/dist/js/components/notification.js +5 -2
  19. package/dist/js/components/notification.min.js +1 -1
  20. package/dist/js/components/parallax.js +11 -15
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +11 -15
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +12 -16
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +11 -15
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +12 -16
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +2 -2
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +1 -1
  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 +73 -66
  37. package/dist/js/uikit-core.min.js +1 -1
  38. package/dist/js/uikit-icons.js +1 -1
  39. package/dist/js/uikit-icons.min.js +1 -1
  40. package/dist/js/uikit.js +76 -69
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +1 -1
  43. package/src/js/components/lightbox-panel.js +3 -3
  44. package/src/js/core/alert.js +6 -3
  45. package/src/js/core/dropnav.js +1 -1
  46. package/src/js/core/grid.js +1 -1
  47. package/src/js/core/icon.js +6 -12
  48. package/src/js/core/img.js +3 -3
  49. package/src/js/core/inverse.js +4 -2
  50. package/src/js/core/margin.js +1 -1
  51. package/src/js/core/modal.js +1 -1
  52. package/src/js/core/overflow-fade.js +6 -2
  53. package/src/js/core/svg.js +5 -1
  54. package/src/js/core/switcher.js +1 -0
  55. package/src/js/mixin/event.js +4 -1
  56. package/src/js/util/filter.js +6 -1
  57. package/src/js/util/lang.js +8 -33
  58. package/src/js/util/scroll.js +14 -9
  59. package/src/js/util/svg.js +7 -6
  60. package/tests/alert.html +2 -2
  61. package/tests/overflow-fade.test.mjs +69 -0
package/dist/js/uikit.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.25.29-dev.7b0f736 | https://www.getuikit.com | (c) 2014 - 2026 YOOtheme | MIT License */
1
+ /*! UIkit 3.25.29-dev.a0b5ca8 | https://www.getuikit.com | (c) 2014 - 2026 YOOtheme | MIT License */
2
2
 
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -156,28 +156,17 @@
156
156
  function pointInRect(point, rect) {
157
157
  return point.x <= rect.right && point.x >= rect.left && point.y <= rect.bottom && point.y >= rect.top;
158
158
  }
159
- function ratio(dimensions, prop, value) {
160
- const aProp = prop === "width" ? "height" : "width";
159
+ function cover$1(dimensions, maxDimensions) {
160
+ const scale = Math.max(
161
+ dimensions.width ? maxDimensions.width / dimensions.width : 0,
162
+ dimensions.height ? maxDimensions.height / dimensions.height : 0
163
+ );
161
164
  return {
162
- [aProp]: dimensions[prop] ? Math.round(value * dimensions[aProp] / dimensions[prop]) : dimensions[aProp],
163
- [prop]: value
165
+ width: Math.round(dimensions.width * scale),
166
+ height: Math.round(dimensions.height * scale)
164
167
  };
165
168
  }
166
- function contain(dimensions, maxDimensions) {
167
- dimensions = { ...dimensions };
168
- for (const prop in dimensions) {
169
- dimensions = dimensions[prop] > maxDimensions[prop] ? ratio(dimensions, prop, maxDimensions[prop]) : dimensions;
170
- }
171
- return dimensions;
172
- }
173
- function cover$1(dimensions, maxDimensions) {
174
- dimensions = contain(dimensions, maxDimensions);
175
- for (const prop in dimensions) {
176
- dimensions = dimensions[prop] < maxDimensions[prop] ? ratio(dimensions, prop, maxDimensions[prop]) : dimensions;
177
- }
178
- return dimensions;
179
- }
180
- const Dimensions = { ratio, contain, cover: cover$1 };
169
+ const Dimensions = { cover: cover$1 };
181
170
  function getIndex(i, elements, current = 0, finite = false) {
182
171
  elements = toNodes(elements);
183
172
  const { length } = elements;
@@ -350,7 +339,11 @@
350
339
  function getTargetedElement(el) {
351
340
  if (isSameSiteAnchor(el)) {
352
341
  const { hash, ownerDocument } = toNode(el);
353
- const id = decodeURIComponent(hash).slice(1);
342
+ let id = hash.slice(1);
343
+ try {
344
+ id = decodeURIComponent(id);
345
+ } catch {
346
+ }
354
347
  return id ? ownerDocument.getElementById(id) || ownerDocument.getElementsByName(id)[0] : ownerDocument.documentElement;
355
348
  }
356
349
  }
@@ -2109,7 +2102,7 @@
2109
2102
  }
2110
2103
  const offsetCurrent = getOffset(current[0], withOffset);
2111
2104
  if (offset.top >= offsetCurrent.bottom - 1 && offset.top !== offsetCurrent.top) {
2112
- sorted.push([el]);
2105
+ sorted.splice(i + 1, 0, [el]);
2113
2106
  break;
2114
2107
  }
2115
2108
  if (offset.bottom - 1 > offsetCurrent.top || offset.top === offsetCurrent.top) {
@@ -2373,7 +2366,7 @@
2373
2366
  }
2374
2367
 
2375
2368
  function maybeDefaultPreventClick(e) {
2376
- if (e.target.closest('a[href="#"],a[href=""]')) {
2369
+ if (e.type === "keydown" && e.keyCode === keyMap.SPACE || e.target.closest('a[href="#"],a[href=""]')) {
2377
2370
  e.preventDefault();
2378
2371
  }
2379
2372
  }
@@ -2612,8 +2605,9 @@
2612
2605
  const elements = isTag(parentNode, "picture") ? children(parentNode) : [el];
2613
2606
  elements.forEach((el2) => setSourceProps(el2, el2));
2614
2607
  } else if (src) {
2615
- if (!includes(el.style.backgroundImage, src)) {
2616
- css(el, "backgroundImage", `url(${escape(src)})`);
2608
+ const previousBackground = el.style.backgroundImage;
2609
+ css(el, "backgroundImage", `url(${escape(src)})`);
2610
+ if (el.style.backgroundImage !== previousBackground) {
2617
2611
  trigger(el, createEvent("load", false));
2618
2612
  }
2619
2613
  }
@@ -2666,7 +2660,7 @@
2666
2660
  return isTag(el, "img");
2667
2661
  }
2668
2662
 
2669
- let prevented;
2663
+ let scrollLocks = 0;
2670
2664
  function preventBackgroundScroll(el) {
2671
2665
  const off = on(
2672
2666
  el,
@@ -2701,21 +2695,25 @@
2701
2695
  },
2702
2696
  { passive: true }
2703
2697
  );
2704
- if (prevented) {
2705
- return off;
2706
- }
2707
- prevented = true;
2708
2698
  const { scrollingElement } = document;
2709
2699
  const props = {
2710
2700
  overflowY: CSS.supports("overflow", "clip") ? "clip" : "hidden",
2711
2701
  touchAction: "none",
2712
2702
  scrollbarGutter: width(window) - scrollingElement.clientWidth ? "stable" : ""
2713
2703
  };
2714
- css(scrollingElement, props);
2704
+ if (!scrollLocks++) {
2705
+ css(scrollingElement, props);
2706
+ }
2707
+ let released = false;
2715
2708
  return () => {
2716
- prevented = false;
2709
+ if (released) {
2710
+ return;
2711
+ }
2712
+ released = true;
2717
2713
  off();
2718
- resetProps(scrollingElement, props);
2714
+ if (!--scrollLocks) {
2715
+ resetProps(scrollingElement, props);
2716
+ }
2719
2717
  };
2720
2718
  }
2721
2719
 
@@ -3423,7 +3421,7 @@
3423
3421
  return Math.atan2(Math.abs(pos2.y - pos1.y), Math.abs(pos2.x - pos1.x)) * 180 / Math.PI;
3424
3422
  }
3425
3423
 
3426
- var VERSION = '3.25.29-dev.7b0f736';
3424
+ var VERSION = '3.25.29-dev.a0b5ca8';
3427
3425
 
3428
3426
  function initWatches(instance) {
3429
3427
  instance._watches = [];
@@ -4615,7 +4613,7 @@
4615
4613
  } else if (matches2 = src.match(/\/\/.*?vimeo\.[a-z]+\/(\d+)[&?]?(.*)?/)) {
4616
4614
  try {
4617
4615
  const { height, width } = await (await fetch(
4618
- `https://vimeo.com/api/oembed.json?maxwidth=1920&url=${encodeURI(
4616
+ `https://vimeo.com/api/oembed.json?maxwidth=1920&url=${encodeURIComponent(
4619
4617
  src
4620
4618
  )}`,
4621
4619
  { credentials: "omit" }
@@ -4706,10 +4704,10 @@
4706
4704
  return el;
4707
4705
  }
4708
4706
  function isImage(src) {
4709
- return src == null ? void 0 : src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|\?)/i);
4707
+ return src == null ? void 0 : src.match(/\.(avif|jpe?g|jfif|a?png|gif|svg|webp)($|[?#])/i);
4710
4708
  }
4711
4709
  function isVideo(src) {
4712
- return src == null ? void 0 : src.match(/\.(mp4|webm|ogv)($|\?)/i);
4710
+ return src == null ? void 0 : src.match(/\.(mp4|webm|ogv)($|[?#])/i);
4713
4711
  }
4714
4712
 
4715
4713
  const selDisabled$1 = ".uk-disabled *, .uk-disabled, [disabled]";
@@ -4932,12 +4930,16 @@
4932
4930
  }
4933
4931
 
4934
4932
  function getMaxPathLength(el) {
4935
- return isVisible(el) ? Math.ceil(
4936
- Math.max(0, ...$$("[stroke]", el).map((stroke) => {
4937
- var _a;
4938
- return ((_a = stroke.getTotalLength) == null ? void 0 : _a.call(stroke)) || 0;
4939
- }))
4940
- ) : 0;
4933
+ try {
4934
+ return Math.ceil(
4935
+ Math.max(0, ...$$("[stroke]", el).map((stroke) => {
4936
+ var _a;
4937
+ return ((_a = stroke.getTotalLength) == null ? void 0 : _a.call(stroke)) || 0;
4938
+ }))
4939
+ );
4940
+ } catch {
4941
+ return 0;
4942
+ }
4941
4943
  }
4942
4944
 
4943
4945
  const props = {
@@ -6913,11 +6915,10 @@
6913
6915
  mixins: [Class, Togglable],
6914
6916
  args: "animation",
6915
6917
  props: {
6916
- animation: Boolean,
6917
6918
  close: String
6918
6919
  },
6919
6920
  data: {
6920
- animation: true,
6921
+ animation: [true],
6921
6922
  selClose: ".uk-alert-close",
6922
6923
  duration: 150
6923
6924
  },
@@ -6931,7 +6932,11 @@
6931
6932
  },
6932
6933
  methods: {
6933
6934
  async close() {
6934
- await this.toggleElement(this.$el, false, this.animation ? animate : false);
6935
+ await this.toggleElement(
6936
+ this.$el,
6937
+ false,
6938
+ this.animation[0] === true || this.animation[0] === 1 ? animate : true
6939
+ );
6935
6940
  this.$destroy(true);
6936
6941
  }
6937
6942
  }
@@ -7595,7 +7600,7 @@
7595
7600
  el: ({ dropContainer }) => dropContainer,
7596
7601
  delegate: ({ clsDrop }) => `.${clsDrop}`,
7597
7602
  handler(e) {
7598
- var _a;
7603
+ var _a, _b;
7599
7604
  const { current, keyCode, target } = e;
7600
7605
  if (isInput(target) || !includes(this.dropdowns, current)) {
7601
7606
  return;
@@ -7605,15 +7610,15 @@
7605
7610
  if (~next) {
7606
7611
  e.preventDefault();
7607
7612
  const elements = $$(selFocusable, current);
7608
- elements[getIndex(
7613
+ (_a = elements[getIndex(
7609
7614
  next,
7610
7615
  elements,
7611
7616
  findIndex(elements, (el) => matches(el, ":focus"))
7612
- )].focus();
7617
+ )]) == null ? void 0 : _a.focus();
7613
7618
  return;
7614
7619
  }
7615
7620
  if (keyCode === keyMap.ESC) {
7616
- (_a = active2.targetEl) == null ? void 0 : _a.focus();
7621
+ (_b = active2.targetEl) == null ? void 0 : _b.focus();
7617
7622
  }
7618
7623
  handleNavItemNavigation(e, this.items, active2);
7619
7624
  }
@@ -7912,7 +7917,7 @@
7912
7917
  };
7913
7918
  },
7914
7919
  write({ columns, scrolled, scrollColumns, translates }) {
7915
- if (!scrolled && !translates) {
7920
+ if (scrolled === false && !translates) {
7916
7921
  return;
7917
7922
  }
7918
7923
  columns.forEach(
@@ -8331,16 +8336,9 @@
8331
8336
  beforeConnect() {
8332
8337
  const isToggle = hasClass(this.$el, "uk-search-toggle") || hasClass(this.$el, "uk-navbar-toggle");
8333
8338
  this.icon = isToggle ? "search-toggle-icon" : hasClass(this.$el, "uk-search-icon") && this.$el.closest(".uk-search-large") ? "search-large" : this.$el.closest(".uk-search-medium") ? "search-medium" : this.$props.icon;
8334
- if (hasAttr(this.$el, "aria-label")) {
8335
- return;
8336
- }
8337
- if (isToggle) {
8338
- this.$el.ariaLabel = this.t("toggle");
8339
- } else {
8340
- const button = this.$el.closest("a,button");
8341
- if (button) {
8342
- button.ariaLabel = this.t("submit");
8343
- }
8339
+ const target = isToggle ? this.$el : this.$el.closest("a,button");
8340
+ if (target && !hasAttr(target, "aria-label")) {
8341
+ target.ariaLabel = this.t(isToggle ? "toggle" : "submit");
8344
8342
  }
8345
8343
  }
8346
8344
  };
@@ -8426,7 +8424,7 @@
8426
8424
  apply(
8427
8425
  document.body,
8428
8426
  (el) => each(UIkit.getComponents(el), (cmp) => {
8429
- cmp.$options.isIcon && cmp.icon in added && cmp.$reset();
8427
+ cmp.$options.isIcon && (aliases[cmp.icon] || cmp.icon) in added && cmp.$reset();
8430
8428
  })
8431
8429
  );
8432
8430
  }
@@ -8493,6 +8491,7 @@
8493
8491
  [...toNodes(target), document.documentElement],
8494
8492
  handler
8495
8493
  );
8494
+ const transitionObserver = observeResize([], handler);
8496
8495
  const listener = [
8497
8496
  on(document, "scroll itemshown itemhidden", handler, {
8498
8497
  passive: true,
@@ -8500,11 +8499,11 @@
8500
8499
  }),
8501
8500
  on(document, "show hide transitionstart", (e) => {
8502
8501
  handler();
8503
- return observer.observe(e.target);
8502
+ return transitionObserver.observe(e.target);
8504
8503
  }),
8505
8504
  on(document, "shown hidden transitionend transitioncancel", (e) => {
8506
8505
  handler();
8507
- return observer.unobserve(e.target);
8506
+ return transitionObserver.unobserve(e.target);
8508
8507
  })
8509
8508
  ];
8510
8509
  return {
@@ -8512,6 +8511,7 @@
8512
8511
  unobserve: observer.unobserve.bind(observer),
8513
8512
  disconnect() {
8514
8513
  observer.disconnect();
8514
+ transitionObserver.disconnect();
8515
8515
  listener.forEach((off) => off());
8516
8516
  }
8517
8517
  };
@@ -8714,7 +8714,7 @@
8714
8714
  const dialog = modal.dialog(tmpl(options), options);
8715
8715
  return assign(
8716
8716
  new Promise((resolve) => {
8717
- const off = on(dialog.$el, "hide", () => resolve(hideFn()));
8717
+ const off = on(dialog.$el, "hide", () => resolve(hideFn()), { self: true });
8718
8718
  on(dialog.$el, "submit", "form", (e) => {
8719
8719
  e.preventDefault();
8720
8720
  resolve(submitFn(dialog));
@@ -9017,7 +9017,8 @@
9017
9017
  );
9018
9018
  if (!overflow[i - 1]) {
9019
9019
  const dir = i ? "Top" : "Left";
9020
- const percent = overflow[i] ? this.$el[`scroll${dir}`] / overflow[i] : 0;
9020
+ const position = this.$el[`scroll${dir}`] + (!i && isRtl ? overflow[i] : 0);
9021
+ const percent = overflow[i] ? position / overflow[i] : 0;
9021
9022
  const toValue = (value) => overflow[i] ? clamp((this.fadeDuration - value) / this.fadeDuration) : 1;
9022
9023
  css(this.$el, {
9023
9024
  "--uk-overflow-fade-start-opacity": toValue(percent),
@@ -9039,7 +9040,7 @@
9039
9040
  const { $el: el, threshold, $options } = this;
9040
9041
  let started;
9041
9042
  const off = on(document, pointerMove$1, move(e), pointerOptions);
9042
- on(document, [pointerUp$1, pointerCancel], end, { capture: true, once: true });
9043
+ once(document, [pointerUp$1, pointerCancel], end, true);
9043
9044
  function move(e2) {
9044
9045
  let origin = getEventPos(e2);
9045
9046
  let pos = origin;
@@ -9713,7 +9714,13 @@
9713
9714
  methods: {
9714
9715
  async getSvg() {
9715
9716
  if (isTag(this.$el, "img") && !this.$el.complete && this.$el.loading === "lazy") {
9716
- await new Promise((resolve) => once(this.$el, "load", resolve));
9717
+ await new Promise(
9718
+ (resolve, reject) => once(
9719
+ this.$el,
9720
+ "load error",
9721
+ (event) => event.type === "load" ? resolve() : reject(event)
9722
+ )
9723
+ );
9717
9724
  }
9718
9725
  return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject("SVG not found.");
9719
9726
  }
@@ -9821,7 +9828,7 @@
9821
9828
  name: "click keydown",
9822
9829
  delegate: ({ toggle }) => toggle,
9823
9830
  handler(e) {
9824
- if (!matches(e.current, selDisabled) && (e.type === "click" || e.keyCode === keyMap.SPACE)) {
9831
+ if (!e.defaultPrevented && !matches(e.current, selDisabled) && (e.type === "click" || e.keyCode === keyMap.SPACE)) {
9825
9832
  maybeDefaultPreventClick(e);
9826
9833
  this.show(e.current);
9827
9834
  }