uikit 3.25.29-dev.3bc1304 → 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 (58) hide show
  1. package/CHANGELOG.md +20 -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 +2 -2
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +16 -12
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +16 -12
  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 +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 +11 -15
  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 +11 -15
  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 +63 -52
  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 +66 -55
  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/dropnav.js +1 -1
  45. package/src/js/core/grid.js +1 -1
  46. package/src/js/core/icon.js +3 -1
  47. package/src/js/core/img.js +3 -3
  48. package/src/js/core/inverse.js +4 -2
  49. package/src/js/core/margin.js +1 -1
  50. package/src/js/core/modal.js +1 -1
  51. package/src/js/core/overflow-fade.js +6 -2
  52. package/src/js/core/svg.js +5 -1
  53. package/src/js/core/switcher.js +1 -0
  54. package/src/js/util/filter.js +6 -1
  55. package/src/js/util/lang.js +8 -33
  56. package/src/js/util/scroll.js +14 -9
  57. package/src/js/util/svg.js +7 -6
  58. package/tests/overflow-fade.test.mjs +69 -0
package/dist/js/uikit.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.25.29-dev.3bc1304 | 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) {
@@ -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.3bc1304';
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 = {
@@ -7598,7 +7600,7 @@
7598
7600
  el: ({ dropContainer }) => dropContainer,
7599
7601
  delegate: ({ clsDrop }) => `.${clsDrop}`,
7600
7602
  handler(e) {
7601
- var _a;
7603
+ var _a, _b;
7602
7604
  const { current, keyCode, target } = e;
7603
7605
  if (isInput(target) || !includes(this.dropdowns, current)) {
7604
7606
  return;
@@ -7608,15 +7610,15 @@
7608
7610
  if (~next) {
7609
7611
  e.preventDefault();
7610
7612
  const elements = $$(selFocusable, current);
7611
- elements[getIndex(
7613
+ (_a = elements[getIndex(
7612
7614
  next,
7613
7615
  elements,
7614
7616
  findIndex(elements, (el) => matches(el, ":focus"))
7615
- )].focus();
7617
+ )]) == null ? void 0 : _a.focus();
7616
7618
  return;
7617
7619
  }
7618
7620
  if (keyCode === keyMap.ESC) {
7619
- (_a = active2.targetEl) == null ? void 0 : _a.focus();
7621
+ (_b = active2.targetEl) == null ? void 0 : _b.focus();
7620
7622
  }
7621
7623
  handleNavItemNavigation(e, this.items, active2);
7622
7624
  }
@@ -7915,7 +7917,7 @@
7915
7917
  };
7916
7918
  },
7917
7919
  write({ columns, scrolled, scrollColumns, translates }) {
7918
- if (!scrolled && !translates) {
7920
+ if (scrolled === false && !translates) {
7919
7921
  return;
7920
7922
  }
7921
7923
  columns.forEach(
@@ -8422,7 +8424,7 @@
8422
8424
  apply(
8423
8425
  document.body,
8424
8426
  (el) => each(UIkit.getComponents(el), (cmp) => {
8425
- cmp.$options.isIcon && cmp.icon in added && cmp.$reset();
8427
+ cmp.$options.isIcon && (aliases[cmp.icon] || cmp.icon) in added && cmp.$reset();
8426
8428
  })
8427
8429
  );
8428
8430
  }
@@ -8489,6 +8491,7 @@
8489
8491
  [...toNodes(target), document.documentElement],
8490
8492
  handler
8491
8493
  );
8494
+ const transitionObserver = observeResize([], handler);
8492
8495
  const listener = [
8493
8496
  on(document, "scroll itemshown itemhidden", handler, {
8494
8497
  passive: true,
@@ -8496,11 +8499,11 @@
8496
8499
  }),
8497
8500
  on(document, "show hide transitionstart", (e) => {
8498
8501
  handler();
8499
- return observer.observe(e.target);
8502
+ return transitionObserver.observe(e.target);
8500
8503
  }),
8501
8504
  on(document, "shown hidden transitionend transitioncancel", (e) => {
8502
8505
  handler();
8503
- return observer.unobserve(e.target);
8506
+ return transitionObserver.unobserve(e.target);
8504
8507
  })
8505
8508
  ];
8506
8509
  return {
@@ -8508,6 +8511,7 @@
8508
8511
  unobserve: observer.unobserve.bind(observer),
8509
8512
  disconnect() {
8510
8513
  observer.disconnect();
8514
+ transitionObserver.disconnect();
8511
8515
  listener.forEach((off) => off());
8512
8516
  }
8513
8517
  };
@@ -8710,7 +8714,7 @@
8710
8714
  const dialog = modal.dialog(tmpl(options), options);
8711
8715
  return assign(
8712
8716
  new Promise((resolve) => {
8713
- const off = on(dialog.$el, "hide", () => resolve(hideFn()));
8717
+ const off = on(dialog.$el, "hide", () => resolve(hideFn()), { self: true });
8714
8718
  on(dialog.$el, "submit", "form", (e) => {
8715
8719
  e.preventDefault();
8716
8720
  resolve(submitFn(dialog));
@@ -9013,7 +9017,8 @@
9013
9017
  );
9014
9018
  if (!overflow[i - 1]) {
9015
9019
  const dir = i ? "Top" : "Left";
9016
- 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;
9017
9022
  const toValue = (value) => overflow[i] ? clamp((this.fadeDuration - value) / this.fadeDuration) : 1;
9018
9023
  css(this.$el, {
9019
9024
  "--uk-overflow-fade-start-opacity": toValue(percent),
@@ -9035,7 +9040,7 @@
9035
9040
  const { $el: el, threshold, $options } = this;
9036
9041
  let started;
9037
9042
  const off = on(document, pointerMove$1, move(e), pointerOptions);
9038
- on(document, [pointerUp$1, pointerCancel], end, { capture: true, once: true });
9043
+ once(document, [pointerUp$1, pointerCancel], end, true);
9039
9044
  function move(e2) {
9040
9045
  let origin = getEventPos(e2);
9041
9046
  let pos = origin;
@@ -9709,7 +9714,13 @@
9709
9714
  methods: {
9710
9715
  async getSvg() {
9711
9716
  if (isTag(this.$el, "img") && !this.$el.complete && this.$el.loading === "lazy") {
9712
- 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
+ );
9713
9724
  }
9714
9725
  return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject("SVG not found.");
9715
9726
  }
@@ -9817,7 +9828,7 @@
9817
9828
  name: "click keydown",
9818
9829
  delegate: ({ toggle }) => toggle,
9819
9830
  handler(e) {
9820
- 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)) {
9821
9832
  maybeDefaultPreventClick(e);
9822
9833
  this.show(e.current);
9823
9834
  }