uikit 3.25.17-dev.80dfe87 → 3.25.17-dev.8c70e44

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 (200) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/build/prefix.js +1 -1
  3. package/build/publishDev.js +1 -1
  4. package/build/release.js +2 -2
  5. package/build/scope.js +1 -1
  6. package/build/scss.js +1 -1
  7. package/dist/css/uikit-core-rtl.css +892 -802
  8. package/dist/css/uikit-core-rtl.min.css +1 -1
  9. package/dist/css/uikit-core.css +892 -802
  10. package/dist/css/uikit-core.min.css +1 -1
  11. package/dist/css/uikit-rtl.css +893 -803
  12. package/dist/css/uikit-rtl.min.css +1 -1
  13. package/dist/css/uikit.css +893 -803
  14. package/dist/css/uikit.min.css +1 -1
  15. package/dist/js/components/countdown.js +1 -1
  16. package/dist/js/components/countdown.min.js +1 -1
  17. package/dist/js/components/filter.js +1 -1
  18. package/dist/js/components/filter.min.js +1 -1
  19. package/dist/js/components/lightbox-panel.js +133 -132
  20. package/dist/js/components/lightbox-panel.min.js +1 -1
  21. package/dist/js/components/lightbox.js +134 -133
  22. package/dist/js/components/lightbox.min.js +1 -1
  23. package/dist/js/components/marquee.js +179 -0
  24. package/dist/js/components/marquee.min.js +1 -0
  25. package/dist/js/components/notification.js +1 -1
  26. package/dist/js/components/notification.min.js +1 -1
  27. package/dist/js/components/parallax.js +8 -12
  28. package/dist/js/components/parallax.min.js +1 -1
  29. package/dist/js/components/slider-parallax.js +8 -12
  30. package/dist/js/components/slider-parallax.min.js +1 -1
  31. package/dist/js/components/slider.js +41 -25
  32. package/dist/js/components/slider.min.js +1 -1
  33. package/dist/js/components/slideshow-parallax.js +8 -12
  34. package/dist/js/components/slideshow-parallax.min.js +1 -1
  35. package/dist/js/components/slideshow.js +71 -102
  36. package/dist/js/components/slideshow.min.js +1 -1
  37. package/dist/js/components/sortable.js +1 -1
  38. package/dist/js/components/sortable.min.js +1 -1
  39. package/dist/js/components/tooltip.js +19 -19
  40. package/dist/js/components/tooltip.min.js +1 -1
  41. package/dist/js/components/upload.js +1 -1
  42. package/dist/js/components/upload.min.js +1 -1
  43. package/dist/js/uikit-core.js +754 -262
  44. package/dist/js/uikit-core.min.js +1 -1
  45. package/dist/js/uikit-icons.js +1 -1
  46. package/dist/js/uikit-icons.min.js +1 -1
  47. package/dist/js/uikit.js +629 -374
  48. package/dist/js/uikit.min.js +1 -1
  49. package/package.json +2 -2
  50. package/src/js/api/component.js +2 -3
  51. package/src/js/api/observables.js +2 -4
  52. package/src/js/api/options.js +6 -3
  53. package/src/js/api/props.js +1 -4
  54. package/src/js/api/state.js +7 -8
  55. package/src/js/components/index.js +1 -0
  56. package/src/js/components/internal/lightbox-animations.js +7 -26
  57. package/src/js/components/internal/slideshow-animations.js +15 -62
  58. package/src/js/components/lightbox-panel.js +121 -96
  59. package/src/js/components/lightbox.js +5 -8
  60. package/src/js/components/marquee.js +123 -0
  61. package/src/js/components/tooltip.js +4 -2
  62. package/src/js/core/accordion.js +78 -29
  63. package/src/js/core/drop.js +5 -4
  64. package/src/js/core/dropnav.js +3 -3
  65. package/src/js/core/grid.js +5 -19
  66. package/src/js/core/height-match.js +1 -2
  67. package/src/js/core/margin.js +3 -0
  68. package/src/js/core/overflow-fade.js +5 -5
  69. package/src/js/core/sticky.js +1 -1
  70. package/src/js/core/switcher.js +24 -44
  71. package/src/js/core/video.js +172 -15
  72. package/src/js/mixin/connect.js +57 -0
  73. package/src/js/mixin/internal/slideshow-animations.js +5 -13
  74. package/src/js/mixin/internal/slideshow-transitioner.js +2 -2
  75. package/src/js/mixin/modal.js +4 -3
  76. package/src/js/mixin/parallax.js +1 -4
  77. package/src/js/mixin/position.js +1 -1
  78. package/src/js/mixin/scroll-driven.js +57 -0
  79. package/src/js/mixin/slider-nav.js +1 -1
  80. package/src/js/mixin/slider-parallax.js +9 -38
  81. package/src/js/mixin/togglable.js +13 -14
  82. package/src/js/util/attr.js +7 -7
  83. package/src/js/util/class.js +1 -1
  84. package/src/js/util/dom.js +3 -4
  85. package/src/js/util/lang.js +1 -1
  86. package/src/js/util/player.js +4 -4
  87. package/src/js/util/style.js +10 -15
  88. package/src/js/util/viewport.js +22 -25
  89. package/src/less/components/_import.less +6 -1
  90. package/src/less/components/base.less +1 -1
  91. package/src/less/components/button.less +1 -1
  92. package/src/less/components/dropcap.less +71 -0
  93. package/src/less/components/floating-shadow.less +65 -0
  94. package/src/less/components/form.less +5 -5
  95. package/src/less/components/grid.less +57 -64
  96. package/src/less/components/logo.less +94 -0
  97. package/src/less/components/margin.less +81 -81
  98. package/src/less/components/marquee.less +133 -0
  99. package/src/less/components/nav.less +1 -1
  100. package/src/less/components/padding.less +9 -9
  101. package/src/less/components/utility.less +0 -157
  102. package/src/less/theme/_import.less +5 -1
  103. package/src/less/theme/dropcap.less +29 -0
  104. package/src/less/theme/floating-shadow.less +20 -0
  105. package/src/less/theme/logo.less +29 -0
  106. package/src/less/theme/marquee.less +14 -0
  107. package/src/less/theme/utility.less +0 -32
  108. package/src/scss/components/_import.scss +6 -1
  109. package/src/scss/components/base.scss +1 -1
  110. package/src/scss/components/button.scss +1 -1
  111. package/src/scss/components/dropcap.scss +63 -0
  112. package/src/scss/components/floating-shadow.scss +62 -0
  113. package/src/scss/components/form.scss +5 -5
  114. package/src/scss/components/grid.scss +57 -64
  115. package/src/scss/components/logo.scss +75 -0
  116. package/src/scss/components/margin.scss +81 -81
  117. package/src/scss/components/marquee.scss +136 -0
  118. package/src/scss/components/nav.scss +1 -1
  119. package/src/scss/components/padding.scss +9 -9
  120. package/src/scss/components/utility.scss +0 -128
  121. package/src/scss/mixins-theme.scss +41 -32
  122. package/src/scss/mixins.scss +38 -29
  123. package/src/scss/variables-theme.scss +14 -9
  124. package/src/scss/variables.scss +14 -9
  125. package/tests/accordion.html +77 -10
  126. package/tests/alert.html +1 -1
  127. package/tests/align.html +5 -5
  128. package/tests/animation.html +4 -4
  129. package/tests/article.html +7 -7
  130. package/tests/background.html +2 -2
  131. package/tests/badge.html +1 -1
  132. package/tests/base.html +2 -2
  133. package/tests/button.html +1 -1
  134. package/tests/card.html +15 -15
  135. package/tests/close.html +2 -2
  136. package/tests/comment.html +9 -9
  137. package/tests/container.html +2 -2
  138. package/tests/countdown.html +21 -21
  139. package/tests/cover.html +3 -3
  140. package/tests/description-list.html +1 -1
  141. package/tests/divider.html +3 -3
  142. package/tests/dotnav.html +1 -1
  143. package/tests/drop.html +7 -7
  144. package/tests/dropbar.html +5 -5
  145. package/tests/dropcap.html +26 -0
  146. package/tests/dropdown.html +1 -1
  147. package/tests/dropnav.html +18 -18
  148. package/tests/filter.html +3 -3
  149. package/tests/floating-shadow.html +44 -0
  150. package/tests/form.html +14 -14
  151. package/tests/grid.html +41 -47
  152. package/tests/heading.html +2 -2
  153. package/tests/height-viewport.html +4 -4
  154. package/tests/height.html +5 -5
  155. package/tests/icon.html +8 -8
  156. package/tests/image.html +6 -6
  157. package/tests/index.html +13 -13
  158. package/tests/js/index.js +1 -1
  159. package/tests/leader.html +5 -5
  160. package/tests/lightbox.html +6 -6
  161. package/tests/link.html +1 -1
  162. package/tests/list.html +4 -4
  163. package/tests/logo.html +84 -0
  164. package/tests/margin.html +7 -7
  165. package/tests/marker.html +3 -3
  166. package/tests/marquee.html +617 -0
  167. package/tests/modal.html +3 -3
  168. package/tests/nav.html +5 -5
  169. package/tests/navbar.html +27 -27
  170. package/tests/notification.html +2 -2
  171. package/tests/offcanvas.html +12 -12
  172. package/tests/overlay.html +3 -3
  173. package/tests/padding.html +1 -1
  174. package/tests/pagination.html +3 -3
  175. package/tests/parallax.html +1 -1
  176. package/tests/position.html +6 -6
  177. package/tests/scrollspy.html +12 -12
  178. package/tests/search.html +5 -5
  179. package/tests/section.html +17 -17
  180. package/tests/slidenav.html +3 -3
  181. package/tests/slider.html +5 -5
  182. package/tests/slideshow.html +3 -3
  183. package/tests/sortable.html +15 -15
  184. package/tests/sticky-navbar.html +4 -4
  185. package/tests/sticky-parallax.html +3 -3
  186. package/tests/sticky.html +3 -3
  187. package/tests/svg.html +3 -2
  188. package/tests/switcher.html +6 -6
  189. package/tests/tab.html +4 -4
  190. package/tests/text.html +3 -3
  191. package/tests/tile.html +4 -4
  192. package/tests/toggle.html +1 -1
  193. package/tests/tooltip.html +3 -3
  194. package/tests/totop.html +2 -2
  195. package/tests/transition.html +1 -1
  196. package/tests/upload.html +5 -5
  197. package/tests/utility.html +16 -116
  198. package/tests/video.html +224 -24
  199. package/tests/visibility.html +4 -4
  200. package/tests/width.html +12 -12
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.25.17-dev.80dfe87 | https://www.getuikit.com | (c) 2014 - 2026 YOOtheme | MIT License */
1
+ /*! UIkit 3.25.17-dev.8c70e44 | 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() :
@@ -134,7 +134,7 @@
134
134
  return array.filter(({ [prop]: check }) => seen.has(check) ? false : seen.add(check));
135
135
  }
136
136
  function pick(obj, props) {
137
- return props.reduce((res, prop) => ({ ...res, [prop]: obj[prop] }), {});
137
+ return Object.fromEntries(props.map((key) => [key, obj[key]]));
138
138
  }
139
139
  function clamp(number, min = 0, max = 1) {
140
140
  return Math.min(Math.max(toNumber(number) || 0, min), max);
@@ -230,7 +230,7 @@
230
230
  }
231
231
  }
232
232
  function toClasses(str) {
233
- return str ? isArray(str) ? str.map(toClasses).flat() : String(str).split(" ").filter(Boolean) : [];
233
+ return str ? isArray(str) ? str.flatMap(toClasses) : String(str).split(" ").filter(Boolean) : [];
234
234
  }
235
235
 
236
236
  function attr(element, name, value) {
@@ -243,13 +243,12 @@
243
243
  }
244
244
  if (isUndefined(value)) {
245
245
  return (_a = toNode(element)) == null ? void 0 : _a.getAttribute(name);
246
- } else {
247
- for (const el of toNodes(element)) {
248
- if (value === null) {
249
- removeAttr(el, name);
250
- } else {
251
- el.setAttribute(name, value);
252
- }
246
+ }
247
+ for (const el of toNodes(element)) {
248
+ if (value === null) {
249
+ removeAttr(el, name);
250
+ } else {
251
+ el.setAttribute(name, value);
253
252
  }
254
253
  }
255
254
  }
@@ -591,19 +590,14 @@
591
590
  property = propName(property);
592
591
  if (isUndefined(value)) {
593
592
  return getComputedStyle(element2).getPropertyValue(property);
594
- } else {
595
- element2.style.setProperty(
596
- property,
597
- isNumeric(value) && !cssNumber[property] && !isCustomProperty(property) ? `${value}px` : value || isNumber(value) ? value : "",
598
- priority
599
- );
600
593
  }
594
+ element2.style.setProperty(
595
+ property,
596
+ isNumeric(value) && !cssNumber[property] && !isCustomProperty(property) ? `${value}px` : value || isNumber(value) ? value : "",
597
+ priority
598
+ );
601
599
  } else if (isArray(property)) {
602
- const props = {};
603
- for (const prop of property) {
604
- props[prop] = css(element2, prop);
605
- }
606
- return props;
600
+ return Object.fromEntries(property.map((prop) => [prop, css(element2, prop)]));
607
601
  } else if (isObject(property)) {
608
602
  for (const prop in property) {
609
603
  css(element2, prop, property[prop], value);
@@ -787,7 +781,9 @@
787
781
  );
788
782
  }
789
783
  function unwrap(element) {
790
- toNodes(element).map(parent).filter((value, index, self) => self.indexOf(value) === index).forEach((parent2) => parent2.replaceWith(...parent2.childNodes));
784
+ for (const elementParent of new Set(toNodes(element).map(parent))) {
785
+ elementParent.replaceWith(...elementParent.childNodes);
786
+ }
791
787
  }
792
788
  const singleTagRe = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;
793
789
  function fragment(html2) {
@@ -827,7 +823,7 @@
827
823
  width: ["left", "right"],
828
824
  height: ["top", "bottom"]
829
825
  };
830
- function dimensions(element) {
826
+ function dimensions$1(element) {
831
827
  const rect = isElement(element) ? toNode(element).getBoundingClientRect() : { height: height(element), width: width(element), top: 0, left: 0 };
832
828
  return {
833
829
  height: rect.height,
@@ -842,7 +838,7 @@
842
838
  if (coordinates) {
843
839
  css(element, { left: 0, top: 0 });
844
840
  }
845
- const currentOffset = dimensions(element);
841
+ const currentOffset = dimensions$1(element);
846
842
  if (element) {
847
843
  const { scrollY, scrollX } = toWindow(element);
848
844
  const offsetBy = { height: scrollY, width: scrollX };
@@ -943,15 +939,15 @@
943
939
  return sumBy(parseCalc(value), (value2) => {
944
940
  const unit = parseUnit(value2);
945
941
  return unit ? percent(
946
- unit === "vh" ? getViewportHeight() : unit === "vw" ? width(toWindow(element)) : offsetDim ? element[`offset${ucfirst(property)}`] : dimensions(element)[property],
942
+ unit === "vh" ? getViewportHeight() : unit === "vw" ? width(toWindow(element)) : offsetDim ? element[`offset${ucfirst(property)}`] : dimensions$1(element)[property],
947
943
  value2
948
944
  ) : value2;
949
945
  });
950
946
  }
951
947
  const calcRe = /-?\d+(?:\.\d+)?(?:v[wh]|%|px)?/g;
952
948
  const parseCalc = memoize((calc) => calc.toString().replace(/\s/g, "").match(calcRe) || []);
953
- const unitRe = /(?:v[hw]|%)$/;
954
- const parseUnit = memoize((str) => (str.match(unitRe) || [])[0]);
949
+ const unitRe$1 = /(?:v[hw]|%)$/;
950
+ const parseUnit = memoize((str) => (str.match(unitRe$1) || [])[0]);
955
951
  function percent(base, value) {
956
952
  return base * toFloat(value) / 100;
957
953
  }
@@ -1046,7 +1042,7 @@
1046
1042
  if (!this.positions || this.positions.length < 2) {
1047
1043
  return false;
1048
1044
  }
1049
- const p = dimensions(target);
1045
+ const p = dimensions$1(target);
1050
1046
  const { left, right, top, bottom } = p;
1051
1047
  const [prevPosition] = this.positions;
1052
1048
  const position = last(this.positions);
@@ -1149,12 +1145,12 @@
1149
1145
  return isTag(el, "iframe") && (isYoutube(el) || isVimeo(el));
1150
1146
  }
1151
1147
  function isYoutube(el) {
1152
- return !!el.src.match(
1153
- /\/\/.*?youtube(-nocookie)?\.[a-z]+\/(watch\?v=[^&\s]+|embed)|youtu\.be\/.*/
1148
+ return /\/\/.*?youtube(-nocookie)?\.[a-z]+\/(watch\?v=[^&\s]+|embed)|youtu\.be\/.*/.test(
1149
+ el.src
1154
1150
  );
1155
1151
  }
1156
1152
  function isVimeo(el) {
1157
- return !!el.src.match(/vimeo\.com\/video\/.*/);
1153
+ return /vimeo\.com\/video\/.*/.test(el.src);
1158
1154
  }
1159
1155
  async function call(el, cmd) {
1160
1156
  await enableApi(el);
@@ -1163,7 +1159,7 @@
1163
1159
  function post(el, cmd) {
1164
1160
  el.contentWindow.postMessage(JSON.stringify({ event: "command", ...cmd }), "*");
1165
1161
  }
1166
- const stateKey = "_ukPlayer";
1162
+ const stateKey = /* @__PURE__ */ Symbol();
1167
1163
  let counter = 0;
1168
1164
  function enableApi(el) {
1169
1165
  if (el[stateKey]) {
@@ -1194,17 +1190,16 @@
1194
1190
  if (!isVisible(element)) {
1195
1191
  return false;
1196
1192
  }
1197
- return intersectRect(
1198
- ...overflowParents(element).map((parent2) => {
1199
- const { top, left, bottom, right } = offsetViewport(parent2);
1200
- return {
1201
- top: top - offsetTop,
1202
- left: left - offsetLeft,
1203
- bottom: bottom + offsetTop,
1204
- right: right + offsetLeft
1205
- };
1206
- }).concat(offset(element))
1207
- );
1193
+ const rects = overflowParents(element).map((parent2) => {
1194
+ const { top, left, bottom, right } = offsetViewport(parent2);
1195
+ return {
1196
+ top: top - offsetTop,
1197
+ left: left - offsetLeft,
1198
+ bottom: bottom + offsetTop,
1199
+ right: right + offsetLeft
1200
+ };
1201
+ });
1202
+ return intersectRect(...rects, offset(element));
1208
1203
  }
1209
1204
  function scrollIntoView(element, { offset: offsetBy = 0 } = {}) {
1210
1205
  const parents2 = isVisible(element) ? scrollParents(element, false, ["hidden"]) : [];
@@ -1244,7 +1239,7 @@
1244
1239
  const percent = ease(clamp((Date.now() - start) / duration));
1245
1240
  let diff = 0;
1246
1241
  if (parents2[0] === element2 && scroll + top < maxScroll) {
1247
- diff = offset(targetEl).top + (isScrollingElement ? 0 : element2.scrollTop) - targetTop - dimensions(getCoveringElement(targetEl)).height;
1242
+ diff = offset(targetEl).top + (isScrollingElement ? 0 : element2.scrollTop) - targetTop - dimensions$1(getCoveringElement(targetEl)).height;
1248
1243
  }
1249
1244
  if (css(element2, "scrollBehavior") !== "auto") {
1250
1245
  css(element2, "scrollBehavior", "auto");
@@ -1288,11 +1283,12 @@
1288
1283
  if (~fixedIndex) {
1289
1284
  ancestors = ancestors.slice(fixedIndex);
1290
1285
  }
1291
- return [scrollEl].concat(
1292
- ancestors.filter(
1286
+ return [
1287
+ scrollEl,
1288
+ ...ancestors.filter(
1293
1289
  (parent2) => css(parent2, "overflow").split(" ").some((prop) => includes(["auto", "scroll", ...props], prop)) && (!scrollable || parent2.scrollHeight > offsetViewport(parent2).height)
1294
1290
  )
1295
- ).reverse();
1291
+ ].reverse();
1296
1292
  }
1297
1293
  function scrollParent(...args) {
1298
1294
  return scrollParents(...args)[0];
@@ -1331,7 +1327,7 @@
1331
1327
  function getCoveringElement(target) {
1332
1328
  const { document } = toWindow(target);
1333
1329
  target = target || document.body;
1334
- const { left, width, top } = dimensions(target);
1330
+ const { left, width, top } = dimensions$1(target);
1335
1331
  for (const position of top ? [0, top] : [0]) {
1336
1332
  let coverEl;
1337
1333
  for (const el of document.elementsFromPoint(left + width / 2, position)) {
@@ -1340,7 +1336,7 @@
1340
1336
  parents(target).reverse().find(
1341
1337
  (parent2) => !parent2.contains(el) && !hasPosition(parent2, "static")
1342
1338
  )
1343
- ) < zIndex(el) || hasPosition(el, "sticky") && (!target || parent(el).contains(target))) && (!coverEl || dimensions(coverEl).height < dimensions(el).height)) {
1339
+ ) < zIndex(el) || hasPosition(el, "sticky") && (!target || parent(el).contains(target))) && (!coverEl || dimensions$1(coverEl).height < dimensions$1(el).height)) {
1344
1340
  coverEl = el;
1345
1341
  }
1346
1342
  }
@@ -1561,7 +1557,7 @@
1561
1557
  createEvent: createEvent,
1562
1558
  css: css,
1563
1559
  data: data,
1564
- dimensions: dimensions,
1560
+ dimensions: dimensions$1,
1565
1561
  each: each,
1566
1562
  empty: empty,
1567
1563
  endsWith: endsWith,
@@ -1681,7 +1677,7 @@
1681
1677
  wrapInner: wrapInner
1682
1678
  });
1683
1679
 
1684
- var VERSION = '3.25.17-dev.80dfe87';
1680
+ var VERSION = '3.25.17-dev.8c70e44';
1685
1681
 
1686
1682
  function initUpdates(instance) {
1687
1683
  instance._data = {};
@@ -1994,11 +1990,14 @@
1994
1990
  function coerce$1(type, value) {
1995
1991
  if (type === Boolean) {
1996
1992
  return toBoolean(value);
1997
- } else if (type === Number) {
1993
+ }
1994
+ if (type === Number) {
1998
1995
  return toNumber(value);
1999
- } else if (type === "list") {
1996
+ }
1997
+ if (type === "list") {
2000
1998
  return toList(value);
2001
- } else if (type === Object && isString(value)) {
1999
+ }
2000
+ if (type === Object && isString(value)) {
2002
2001
  return parseOptions(value);
2003
2002
  }
2004
2003
  return type ? type(value) : value;
@@ -2048,7 +2047,7 @@
2048
2047
  }
2049
2048
  const getAttributes = memoize((id, props) => {
2050
2049
  const attributes = Object.keys(props);
2051
- const filter = attributes.concat(id).map((key) => [hyphenate(key), `data-${hyphenate(key)}`]).flat();
2050
+ const filter = [...attributes, id].flatMap((key) => [hyphenate(key), `data-${hyphenate(key)}`]);
2052
2051
  return { attributes, filter };
2053
2052
  });
2054
2053
  function initPropsObserver(instance) {
@@ -2138,14 +2137,10 @@
2138
2137
  }
2139
2138
  function normalizeData({ data = {} }, { args = [], props = {} }) {
2140
2139
  if (isArray(data)) {
2141
- data = data.slice(0, args.length).reduce((data2, value, index) => {
2142
- if (isPlainObject(value)) {
2143
- assign(data2, value);
2144
- } else {
2145
- data2[args[index]] = value;
2146
- }
2147
- return data2;
2148
- }, {});
2140
+ data = data.slice(0, args.length).reduce(
2141
+ (data2, value, index) => assign(data2, isPlainObject(value) ? value : { [args[index]]: value }),
2142
+ {}
2143
+ );
2149
2144
  }
2150
2145
  for (const key in data) {
2151
2146
  if (isUndefined(data[key])) {
@@ -2193,11 +2188,10 @@
2193
2188
  function init(element2) {
2194
2189
  const instance = getComponent(element2, name);
2195
2190
  if (instance) {
2196
- if (data) {
2197
- instance.$destroy();
2198
- } else {
2191
+ if (!data) {
2199
2192
  return instance;
2200
2193
  }
2194
+ instance.$destroy();
2201
2195
  }
2202
2196
  return new Component({ el: element2, data });
2203
2197
  }
@@ -2411,8 +2405,8 @@
2411
2405
  for (const el of toNodes(isFunction(targets) ? targets(this) : targets)) {
2412
2406
  $$('[loading="lazy"]', el).slice(0, preload - 1).forEach((el2) => removeAttr(el2, "loading"));
2413
2407
  }
2414
- for (const el of entries.filter(({ isIntersecting }) => isIntersecting).map(({ target }) => target)) {
2415
- observer.unobserve(el);
2408
+ for (const { target } of entries.filter(({ isIntersecting }) => isIntersecting)) {
2409
+ observer.unobserve(target);
2416
2410
  }
2417
2411
  },
2418
2412
  ...options
@@ -2490,12 +2484,6 @@
2490
2484
  }
2491
2485
  };
2492
2486
 
2493
- function maybeDefaultPreventClick(e) {
2494
- if (e.target.closest('a[href="#"],a[href=""]')) {
2495
- e.preventDefault();
2496
- }
2497
- }
2498
-
2499
2487
  var Togglable = {
2500
2488
  props: {
2501
2489
  cls: Boolean,
@@ -2588,27 +2576,25 @@
2588
2576
  const dimProp = props[dirs.indexOf(dir)];
2589
2577
  const marginProp = `margin-${dir[0]}`;
2590
2578
  const marginStartProp = `margin-${startProp}`;
2591
- let currentDim = dimensions(el)[dimProp];
2579
+ let currentDim = dimensions$1(el)[dimProp];
2592
2580
  const inProgress = Transition.inProgress(el);
2593
2581
  await Transition.cancel(el);
2594
2582
  if (show) {
2595
2583
  _toggle(el, true);
2596
2584
  }
2597
- const prevProps = Object.fromEntries(
2598
- [
2599
- "padding",
2600
- "border",
2601
- "width",
2602
- "height",
2603
- "minWidth",
2604
- "minHeight",
2605
- "overflowY",
2606
- "overflowX",
2607
- marginProp,
2608
- marginStartProp
2609
- ].map((key) => [key, el.style[key]])
2610
- );
2611
- const dim = dimensions(el);
2585
+ const prevProps = pick(el.style, [
2586
+ "padding",
2587
+ "border",
2588
+ "width",
2589
+ "height",
2590
+ "minWidth",
2591
+ "minHeight",
2592
+ "overflowY",
2593
+ "overflowX",
2594
+ marginProp,
2595
+ marginStartProp
2596
+ ]);
2597
+ const dim = dimensions$1(el);
2612
2598
  const currentMargin = toFloat(css(el, marginProp));
2613
2599
  const marginStart = toFloat(css(el, marginStartProp));
2614
2600
  const endDim = dim[dimProp] + marginStart;
@@ -2674,6 +2660,57 @@
2674
2660
  );
2675
2661
  }
2676
2662
 
2663
+ var Connect = {
2664
+ mixins: [Togglable],
2665
+ props: {
2666
+ connect: String
2667
+ },
2668
+ data: {
2669
+ connect: "",
2670
+ cls: "uk-active"
2671
+ },
2672
+ computed: {
2673
+ connects: {
2674
+ get: ({ connect }, $el) => connect ? queryAll(connect, $el) : [],
2675
+ observe: ({ connect }) => connect
2676
+ },
2677
+ connectChildren() {
2678
+ return this.connects.flatMap((el) => children(el));
2679
+ }
2680
+ },
2681
+ watch: {
2682
+ connects(connects) {
2683
+ for (const el of connects) {
2684
+ if (isTag(el, "ul")) {
2685
+ el.role = "presentation";
2686
+ }
2687
+ }
2688
+ }
2689
+ },
2690
+ observe: lazyload({ targets: ({ connectChildren }) => connectChildren }),
2691
+ methods: {
2692
+ showConnects(index, animate) {
2693
+ const toggle = async ({ children: children2 }) => {
2694
+ const actives = toArray(children2).filter(
2695
+ (child, i) => i !== index && hasClass(child, this.cls)
2696
+ );
2697
+ if (await this.toggleElement(actives, false, animate)) {
2698
+ if (!hasClass(children2[index], this.cls)) {
2699
+ await this.toggleElement(children2[index], true, animate);
2700
+ }
2701
+ }
2702
+ };
2703
+ return Promise.all(this.connects.map(toggle));
2704
+ }
2705
+ }
2706
+ };
2707
+
2708
+ function maybeDefaultPreventClick(e) {
2709
+ if (e.target.closest('a[href="#"],a[href=""]')) {
2710
+ e.preventDefault();
2711
+ }
2712
+ }
2713
+
2677
2714
  const keyMap = {
2678
2715
  TAB: 9,
2679
2716
  ENTER: 13,
@@ -2688,27 +2725,32 @@
2688
2725
  };
2689
2726
 
2690
2727
  var Accordion = {
2691
- mixins: [Class, Togglable],
2728
+ mixins: [Class, Connect],
2692
2729
  props: {
2693
- animation: Boolean,
2694
2730
  targets: String,
2695
2731
  active: null,
2696
2732
  collapsible: Boolean,
2697
2733
  multiple: Boolean,
2698
2734
  toggle: String,
2699
2735
  content: String,
2700
- offset: Number
2736
+ offset: Number,
2737
+ switcherConnect: String
2701
2738
  },
2702
2739
  data: {
2703
2740
  targets: "> *",
2704
2741
  active: false,
2705
- animation: true,
2742
+ animation: [true],
2706
2743
  collapsible: true,
2707
2744
  multiple: false,
2708
2745
  clsOpen: "uk-open",
2746
+ cls: "uk-active",
2709
2747
  toggle: ".uk-accordion-title",
2710
2748
  content: ".uk-accordion-content",
2711
- offset: 0
2749
+ offset: 0,
2750
+ switcherConnect: ""
2751
+ },
2752
+ beforeConnect() {
2753
+ this.connect = this.$props.connect = this.switcherConnect;
2712
2754
  },
2713
2755
  computed: {
2714
2756
  items: ({ targets }, $el) => $$(targets, $el),
@@ -2732,6 +2774,12 @@
2732
2774
  this.toggle(active, false);
2733
2775
  }
2734
2776
  },
2777
+ connectChildren() {
2778
+ this.showConnects(
2779
+ findIndex(this.items, (el) => hasClass(el, this.clsOpen)),
2780
+ false
2781
+ );
2782
+ },
2735
2783
  toggles() {
2736
2784
  this.$emit();
2737
2785
  },
@@ -2782,43 +2830,66 @@
2782
2830
  continue;
2783
2831
  }
2784
2832
  toggle.id = generateId(this, toggle);
2785
- content.id = generateId(this, content);
2786
2833
  const active = includes(activeItems, this.items[index2]);
2834
+ attr(content, {
2835
+ id: generateId(this, content),
2836
+ role: "region",
2837
+ "aria-labelledby": toggle.id
2838
+ });
2839
+ if (isTag(content, "ul")) {
2840
+ attr(children(content), "role", "presentation");
2841
+ }
2842
+ const controls = [content.id];
2843
+ for (const { children: children2 } of this.connects) {
2844
+ const item = children2[index2];
2845
+ if (!item) {
2846
+ continue;
2847
+ }
2848
+ attr(item, {
2849
+ id: generateId(this, item),
2850
+ role: "tabpanel",
2851
+ "aria-labelledby": toggle.id
2852
+ });
2853
+ controls.push(item.id);
2854
+ }
2787
2855
  attr(toggle, {
2788
2856
  role: isTag(toggle, "a") ? "button" : null,
2789
- "aria-controls": content.id,
2857
+ "aria-controls": controls.join(" "),
2790
2858
  "aria-expanded": active,
2791
2859
  "aria-disabled": !this.collapsible && activeItems.length < 2 && active
2792
2860
  });
2793
- attr(content, { role: "region", "aria-labelledby": toggle.id });
2794
- if (isTag(content, "ul")) {
2795
- attr(children(content), "role", "presentation");
2796
- }
2797
2861
  }
2798
2862
  },
2799
2863
  methods: {
2800
- toggle(item, animate) {
2801
- item = this.items[getIndex(item, this.items)];
2864
+ async toggle(item, animate) {
2865
+ animate = animate !== false;
2866
+ const next = getIndex(item, this.items);
2867
+ item = this.items[next];
2802
2868
  let items = [item];
2803
2869
  const activeItems = filter(this.items, `.${this.clsOpen}`);
2804
- if (!this.multiple && !includes(activeItems, items[0])) {
2805
- items = items.concat(activeItems);
2806
- }
2807
- if (!this.collapsible && activeItems.length < 2 && includes(activeItems, item)) {
2808
- items = [];
2809
- }
2810
- return Promise.all(
2811
- items.map(
2812
- (el) => this.toggleElement(el, !includes(activeItems, el), (el2, show) => {
2813
- toggleClass(el2, this.clsOpen, show);
2814
- if (animate === false || !this.animation) {
2815
- hide($(this.content, el2), !show);
2816
- return;
2817
- }
2818
- return transition(el2, show, this);
2819
- })
2820
- )
2821
- );
2870
+ const isActive = includes(activeItems, item);
2871
+ if (isActive && !this.collapsible && activeItems.length < 2) {
2872
+ return;
2873
+ }
2874
+ if (!isActive && !this.multiple) {
2875
+ items.push(...activeItems);
2876
+ }
2877
+ const toggle = (el) => this.toggleElement(el, !includes(activeItems, el), (el2, show) => {
2878
+ toggleClass(el2, this.clsOpen, show);
2879
+ if (!animate || !this.hasAnimation) {
2880
+ hide($(this.content, el2), !show);
2881
+ return;
2882
+ }
2883
+ return transition(el2, show, this);
2884
+ });
2885
+ const hideIndex = () => {
2886
+ const index2 = findIndex(children(this.connects[0]), (el) => hasClass(el, this.cls));
2887
+ return index2 === next ? findIndex(this.items, (i) => i !== item && includes(activeItems, i)) : index2;
2888
+ };
2889
+ return Promise.all([
2890
+ ...items.map(toggle),
2891
+ this.showConnects(isActive ? hideIndex() : next, animate)
2892
+ ]);
2822
2893
  }
2823
2894
  }
2824
2895
  };
@@ -2836,7 +2907,7 @@
2836
2907
  const currentHeight = toFloat(css(wrapper, "height"));
2837
2908
  await Transition.cancel(wrapper);
2838
2909
  hide(content, false);
2839
- const endHeight = sumBy(["marginTop", "marginBottom"], (prop) => css(content, prop)) + dimensions(content).height;
2910
+ const endHeight = sumBy(["marginTop", "marginBottom"], (prop) => css(content, prop)) + dimensions$1(content).height;
2840
2911
  const percent = currentHeight / endHeight;
2841
2912
  duration = endHeight ? (velocity * endHeight + duration) * (show ? 1 - percent : percent) : 0;
2842
2913
  css(wrapper, "height", currentHeight);
@@ -2852,7 +2923,7 @@
2852
2923
  let frame;
2853
2924
  (function scroll() {
2854
2925
  frame = requestAnimationFrame(() => {
2855
- const { top } = dimensions(el);
2926
+ const { top } = dimensions$1(el);
2856
2927
  if (top < 0) {
2857
2928
  scrollElement.scrollTop += top;
2858
2929
  }
@@ -2909,22 +2980,395 @@
2909
2980
  );
2910
2981
  }
2911
2982
 
2983
+ var Media = {
2984
+ props: {
2985
+ media: Boolean
2986
+ },
2987
+ data: {
2988
+ media: false
2989
+ },
2990
+ connected() {
2991
+ const media = toMedia(this.media, this.$el);
2992
+ this.matchMedia = true;
2993
+ if (media) {
2994
+ this.mediaObj = window.matchMedia(media);
2995
+ const handler = () => {
2996
+ this.matchMedia = this.mediaObj.matches;
2997
+ trigger(this.$el, createEvent("mediachange", false, true, [this.mediaObj]));
2998
+ };
2999
+ this.offMediaObj = on(this.mediaObj, "change", () => {
3000
+ handler();
3001
+ this.$emit("resize");
3002
+ });
3003
+ handler();
3004
+ }
3005
+ },
3006
+ disconnected() {
3007
+ var _a;
3008
+ (_a = this.offMediaObj) == null ? void 0 : _a.call(this);
3009
+ }
3010
+ };
3011
+ function toMedia(value, element) {
3012
+ if (isString(value)) {
3013
+ if (startsWith(value, "@")) {
3014
+ value = toFloat(css(element, `--uk-breakpoint-${value.slice(1)}`));
3015
+ } else if (isNaN(value)) {
3016
+ return value;
3017
+ }
3018
+ }
3019
+ return value && isNumeric(value) ? `(min-width: ${value}px)` : "";
3020
+ }
3021
+
3022
+ function getMaxPathLength(el) {
3023
+ return isVisible(el) ? Math.ceil(
3024
+ Math.max(0, ...$$("[stroke]", el).map((stroke) => {
3025
+ var _a;
3026
+ return ((_a = stroke.getTotalLength) == null ? void 0 : _a.call(stroke)) || 0;
3027
+ }))
3028
+ ) : 0;
3029
+ }
3030
+
3031
+ const props = {
3032
+ x: transformFn,
3033
+ y: transformFn,
3034
+ rotate: transformFn,
3035
+ scale: transformFn,
3036
+ color: colorFn,
3037
+ backgroundColor: colorFn,
3038
+ borderColor: colorFn,
3039
+ blur: filterFn,
3040
+ hue: filterFn,
3041
+ fopacity: filterFn,
3042
+ grayscale: filterFn,
3043
+ invert: filterFn,
3044
+ saturate: filterFn,
3045
+ sepia: filterFn,
3046
+ opacity: cssPropFn,
3047
+ stroke: strokeFn,
3048
+ bgx: backgroundFn,
3049
+ bgy: backgroundFn
3050
+ };
3051
+ const { keys } = Object;
3052
+ ({
3053
+ props: fillObject(keys(props), "list"),
3054
+ data: fillObject(keys(props), void 0)});
3055
+ function transformFn(prop, el, stops) {
3056
+ let unit = getUnit(stops) || { x: "px", y: "px", rotate: "deg" }[prop] || "";
3057
+ let transformFn2;
3058
+ if (prop === "x" || prop === "y") {
3059
+ prop = `translate${ucfirst(prop)}`;
3060
+ transformFn2 = (stop) => toFloat(toFloat(stop).toFixed(unit === "px" ? 0 : 6));
3061
+ } else if (prop === "scale") {
3062
+ unit = "";
3063
+ transformFn2 = (stop) => {
3064
+ var _a;
3065
+ return getUnit([stop]) ? toPx(stop, "width", el, true) / el[`offset${((_a = stop.endsWith) == null ? void 0 : _a.call(stop, "vh")) ? "Height" : "Width"}`] : toFloat(stop);
3066
+ };
3067
+ }
3068
+ if (stops.length === 1) {
3069
+ stops.unshift(prop === "scale" ? 1 : 0);
3070
+ }
3071
+ stops = parseStops(stops, transformFn2);
3072
+ return (css2, percent) => {
3073
+ css2.transform = `${css2.transform || ""} ${prop}(${getValue(stops, percent)}${unit})`;
3074
+ };
3075
+ }
3076
+ function colorFn(prop, el, stops) {
3077
+ if (stops.length === 1) {
3078
+ stops.unshift(getCssValue(el, prop, ""));
3079
+ }
3080
+ stops = parseStops(stops, (stop) => parseColor(el, stop));
3081
+ return (css2, percent) => {
3082
+ const [start, end, p] = getStop(stops, percent);
3083
+ const value = start.map((value2, i) => {
3084
+ value2 += p * (end[i] - value2);
3085
+ return i === 3 ? toFloat(value2) : parseInt(value2, 10);
3086
+ }).join(",");
3087
+ css2[prop] = `rgba(${value})`;
3088
+ };
3089
+ }
3090
+ function parseColor(el, color) {
3091
+ return getCssValue(el, "color", color).split(/[(),]/g).slice(1, -1).concat(1).slice(0, 4).map(toFloat);
3092
+ }
3093
+ function filterFn(prop, el, stops) {
3094
+ if (stops.length === 1) {
3095
+ stops.unshift(0);
3096
+ }
3097
+ const unit = getUnit(stops) || { blur: "px", hue: "deg" }[prop] || "%";
3098
+ prop = { fopacity: "opacity", hue: "hue-rotate" }[prop] || prop;
3099
+ stops = parseStops(stops);
3100
+ return (css2, percent) => {
3101
+ const value = getValue(stops, percent);
3102
+ css2.filter = `${css2.filter || ""} ${prop}(${value + unit})`;
3103
+ };
3104
+ }
3105
+ function cssPropFn(prop, el, stops) {
3106
+ if (stops.length === 1) {
3107
+ stops.unshift(getCssValue(el, prop, ""));
3108
+ }
3109
+ stops = parseStops(stops);
3110
+ return (css2, percent) => {
3111
+ css2[prop] = getValue(stops, percent);
3112
+ };
3113
+ }
3114
+ function strokeFn(prop, el, stops) {
3115
+ if (stops.length === 1) {
3116
+ stops.unshift(0);
3117
+ }
3118
+ const unit = getUnit(stops);
3119
+ const length = getMaxPathLength(el);
3120
+ stops = parseStops(stops.reverse(), (stop) => {
3121
+ stop = toFloat(stop);
3122
+ return unit === "%" ? stop * length / 100 : stop;
3123
+ });
3124
+ if (!stops.some(([value]) => value)) {
3125
+ return noop;
3126
+ }
3127
+ css(el, "strokeDasharray", length);
3128
+ return (css2, percent) => {
3129
+ css2.strokeDashoffset = getValue(stops, percent);
3130
+ };
3131
+ }
3132
+ function backgroundFn(prop, el, stops, props2) {
3133
+ if (stops.length === 1) {
3134
+ stops.unshift(0);
3135
+ }
3136
+ const attr = prop === "bgy" ? "height" : "width";
3137
+ props2[prop] = parseStops(stops, (stop) => toPx(stop, attr, el));
3138
+ const bgProps = ["bgx", "bgy"].filter((prop2) => prop2 in props2);
3139
+ if (bgProps.length === 2 && prop === "bgx") {
3140
+ return noop;
3141
+ }
3142
+ if (getCssValue(el, "backgroundSize", "") === "cover") {
3143
+ return backgroundCoverFn(prop, el, stops, props2);
3144
+ }
3145
+ const positions = {};
3146
+ for (const prop2 of bgProps) {
3147
+ positions[prop2] = getBackgroundPos(el, prop2);
3148
+ }
3149
+ return setBackgroundPosFn(bgProps, positions, props2);
3150
+ }
3151
+ function backgroundCoverFn(prop, el, stops, props2) {
3152
+ const dimImage = getBackgroundImageDimensions(el);
3153
+ if (!dimImage.width) {
3154
+ return noop;
3155
+ }
3156
+ const dimEl = {
3157
+ width: el.offsetWidth,
3158
+ height: el.offsetHeight
3159
+ };
3160
+ const bgProps = ["bgx", "bgy"].filter((prop2) => prop2 in props2);
3161
+ const positions = {};
3162
+ for (const prop2 of bgProps) {
3163
+ const values = props2[prop2].map(([value]) => value);
3164
+ const min = Math.min(...values);
3165
+ const max = Math.max(...values);
3166
+ const down = values.indexOf(min) < values.indexOf(max);
3167
+ const diff = max - min;
3168
+ positions[prop2] = `${(down ? -diff : 0) - (down ? min : max)}px`;
3169
+ dimEl[prop2 === "bgy" ? "height" : "width"] += diff;
3170
+ }
3171
+ const dim = Dimensions.cover(dimImage, dimEl);
3172
+ for (const prop2 of bgProps) {
3173
+ const attr = prop2 === "bgy" ? "height" : "width";
3174
+ const overflow = dim[attr] - dimEl[attr];
3175
+ positions[prop2] = `max(${getBackgroundPos(el, prop2)},-${overflow}px) + ${positions[prop2]}`;
3176
+ }
3177
+ const fn = setBackgroundPosFn(bgProps, positions, props2);
3178
+ return (css2, percent) => {
3179
+ fn(css2, percent);
3180
+ css2.backgroundSize = `${dim.width}px ${dim.height}px`;
3181
+ css2.backgroundRepeat = "no-repeat";
3182
+ };
3183
+ }
3184
+ function getBackgroundPos(el, prop) {
3185
+ return getCssValue(el, `background-position-${prop.slice(-1)}`, "");
3186
+ }
3187
+ function setBackgroundPosFn(bgProps, positions, props2) {
3188
+ return function(css2, percent) {
3189
+ for (const prop of bgProps) {
3190
+ const value = getValue(props2[prop], percent);
3191
+ css2[`background-position-${prop.slice(-1)}`] = `calc(${positions[prop]} + ${value}px)`;
3192
+ }
3193
+ };
3194
+ }
3195
+ const loading = {};
3196
+ const dimensions = {};
3197
+ function getBackgroundImageDimensions(el) {
3198
+ const src = css(el, "backgroundImage").replace(/^none|url\(["']?(.+?)["']?\)$/, "$1");
3199
+ if (dimensions[src]) {
3200
+ return dimensions[src];
3201
+ }
3202
+ const image = new Image();
3203
+ if (src) {
3204
+ image.src = src;
3205
+ if (!image.naturalWidth && !loading[src]) {
3206
+ once(image, "error load", () => {
3207
+ dimensions[src] = toDimensions(image);
3208
+ trigger(el, createEvent("load", false));
3209
+ });
3210
+ loading[src] = true;
3211
+ return toDimensions(image);
3212
+ }
3213
+ }
3214
+ return dimensions[src] = toDimensions(image);
3215
+ }
3216
+ function toDimensions(image) {
3217
+ return {
3218
+ width: image.naturalWidth,
3219
+ height: image.naturalHeight
3220
+ };
3221
+ }
3222
+ function parseStops(stops, fn = toFloat) {
3223
+ const result = [];
3224
+ const { length } = stops;
3225
+ let nullIndex = 0;
3226
+ for (let i = 0; i < length; i++) {
3227
+ let [value, percent] = isString(stops[i]) ? stops[i].trim().split(/ (?![^(]*\))/) : [stops[i]];
3228
+ value = fn(value);
3229
+ percent = percent ? toFloat(percent) / 100 : null;
3230
+ if (i === 0) {
3231
+ if (percent === null) {
3232
+ percent = 0;
3233
+ } else if (percent) {
3234
+ result.push([value, 0]);
3235
+ }
3236
+ } else if (i === length - 1) {
3237
+ if (percent === null) {
3238
+ percent = 1;
3239
+ } else if (percent !== 1) {
3240
+ result.push([value, percent]);
3241
+ percent = 1;
3242
+ }
3243
+ }
3244
+ result.push([value, percent]);
3245
+ if (percent === null) {
3246
+ nullIndex++;
3247
+ } else if (nullIndex) {
3248
+ const leftPercent = result[i - nullIndex - 1][1];
3249
+ const p = (percent - leftPercent) / (nullIndex + 1);
3250
+ for (let j = nullIndex; j > 0; j--) {
3251
+ result[i - j][1] = leftPercent + p * (nullIndex - j + 1);
3252
+ }
3253
+ nullIndex = 0;
3254
+ }
3255
+ }
3256
+ return result;
3257
+ }
3258
+ function getStop(stops, percent) {
3259
+ const index = findIndex(stops.slice(1), ([, targetPercent]) => percent <= targetPercent) + 1;
3260
+ return [
3261
+ stops[index - 1][0],
3262
+ stops[index][0],
3263
+ (percent - stops[index - 1][1]) / (stops[index][1] - stops[index - 1][1])
3264
+ ];
3265
+ }
3266
+ function getValue(stops, percent) {
3267
+ const [start, end, p] = getStop(stops, percent);
3268
+ return start + (end - start) * p;
3269
+ }
3270
+ const unitRe = /^-?\d+(?:\.\d+)?(\S+)?/;
3271
+ function getUnit(stops, defaultUnit) {
3272
+ var _a;
3273
+ for (const stop of stops) {
3274
+ const match = (_a = stop.match) == null ? void 0 : _a.call(stop, unitRe);
3275
+ if (match) {
3276
+ return match[1];
3277
+ }
3278
+ }
3279
+ return defaultUnit;
3280
+ }
3281
+ function getCssValue(el, prop, value) {
3282
+ const prev = el.style[prop];
3283
+ const val = css(css(el, prop, value), prop);
3284
+ el.style[prop] = prev;
3285
+ return val;
3286
+ }
3287
+ function fillObject(keys2, value) {
3288
+ return Object.fromEntries(keys2.map((prop) => [prop, value]));
3289
+ }
3290
+ function ease(percent, easing) {
3291
+ return easing >= 0 ? Math.pow(percent, easing + 1) : 1 - Math.pow(1 - percent, 1 - easing);
3292
+ }
3293
+
3294
+ var ScrollDriven = {
3295
+ props: {
3296
+ parallaxTarget: Boolean,
3297
+ parallaxStart: String,
3298
+ parallaxEnd: String,
3299
+ parallaxEasing: Number
3300
+ },
3301
+ data: {
3302
+ parallaxTarget: false,
3303
+ parallaxStart: 0,
3304
+ parallaxEnd: 0,
3305
+ parallaxEasing: 0
3306
+ },
3307
+ observe: [
3308
+ resize({
3309
+ target: ({ $el, parallaxTarget }) => [$el, parallaxTarget],
3310
+ filter: ({ parallax }) => parallax
3311
+ }),
3312
+ scroll$1({ filter: ({ parallax }) => parallax })
3313
+ ],
3314
+ computed: {
3315
+ parallaxTargetFallback: ($props, $el) => $el,
3316
+ parallaxTarget({ parallaxTarget }, $el) {
3317
+ return parallaxTarget && query(parallaxTarget, $el) || this.parallaxTargetFallback;
3318
+ }
3319
+ },
3320
+ update: {
3321
+ read() {
3322
+ if (!this.parallax) {
3323
+ return;
3324
+ }
3325
+ const target = this.parallaxTarget;
3326
+ if (!target) {
3327
+ return;
3328
+ }
3329
+ const start = toPx(this.parallaxStart, "height", target, true);
3330
+ const end = toPx(this.parallaxEnd, "height", target, true);
3331
+ const percent = ease(scrolledOver(target, start, end), this.parallaxEasing);
3332
+ return { percent };
3333
+ },
3334
+ events: ["scroll", "resize"]
3335
+ }
3336
+ };
3337
+
3338
+ const loopKey = /* @__PURE__ */ Symbol();
2912
3339
  var Video = {
3340
+ mixins: [ScrollDriven],
2913
3341
  args: "autoplay",
2914
3342
  props: {
2915
3343
  automute: Boolean,
2916
3344
  autoplay: Boolean,
2917
3345
  restart: Boolean,
2918
- hoverTarget: Boolean
3346
+ inviewMargin: String,
3347
+ inviewQueued: Number,
3348
+ hoverTarget: Boolean,
3349
+ hoverRewind: Number,
3350
+ reducedMotionTime: Number
2919
3351
  },
2920
3352
  data: {
2921
3353
  automute: false,
2922
3354
  autoplay: true,
2923
3355
  restart: false,
2924
- hoverTarget: false
3356
+ inviewMargin: "0px",
3357
+ inviewQueued: 0,
3358
+ hoverTarget: false,
3359
+ hoverRewind: 0,
3360
+ reducedMotionTime: 0
2925
3361
  },
2926
3362
  beforeConnect() {
2927
3363
  const isVideo = isTag(this.$el, "video");
3364
+ this.restart = isVideo && this.restart;
3365
+ this.parallax = isVideo && this.autoplay === "parallax";
3366
+ this.manualControl = ["hover", "parallax"].includes(this.autoplay);
3367
+ this.inviewQueued = this.autoplay === "inview" && this.inviewQueued;
3368
+ if (this.inviewQueued) {
3369
+ this.$el[loopKey] = this.$el.loop;
3370
+ this.$el.loop = false;
3371
+ }
2928
3372
  if (this.autoplay === "inview" && isVideo && !hasAttr(this.$el, "preload")) {
2929
3373
  this.$el.preload = "none";
2930
3374
  }
@@ -2933,7 +3377,10 @@
2933
3377
  }
2934
3378
  if (this.autoplay === "hover") {
2935
3379
  if (isVideo) {
2936
- this.$el.tabIndex = 0;
3380
+ this.hoverTarget = query(this.hoverTarget, this.$el) || this.$el;
3381
+ if (!isFocusable(this.hoverTarget)) {
3382
+ this.hoverTarget.tabIndex = 0;
3383
+ }
2937
3384
  } else {
2938
3385
  this.autoplay = true;
2939
3386
  }
@@ -2942,28 +3389,49 @@
2942
3389
  mute(this.$el);
2943
3390
  }
2944
3391
  },
3392
+ disconnected() {
3393
+ if (this.$el[loopKey]) {
3394
+ this.$el.loop = true;
3395
+ }
3396
+ queue.delete(this.$el);
3397
+ },
2945
3398
  events: [
2946
3399
  {
2947
3400
  name: `${pointerEnter} focusin`,
2948
- el: ({ hoverTarget, $el }) => query(hoverTarget, $el) || $el,
3401
+ el: ({ hoverTarget }) => hoverTarget,
2949
3402
  filter: ({ autoplay }) => autoplay === "hover",
2950
3403
  handler(e) {
3404
+ var _a;
3405
+ (_a = this._reverseAbort) == null ? void 0 : _a.abort();
2951
3406
  if (!isTouch(e) || !isPlaying(this.$el)) {
2952
- play(this.$el);
3407
+ this.play();
2953
3408
  } else {
2954
- pauseHover(this.$el, this.restart);
3409
+ this.pause();
2955
3410
  }
2956
3411
  }
2957
3412
  },
2958
3413
  {
2959
3414
  name: `${pointerLeave} focusout`,
2960
- el: ({ hoverTarget, $el }) => query(hoverTarget, $el) || $el,
3415
+ el: ({ hoverTarget }) => hoverTarget,
2961
3416
  filter: ({ autoplay }) => autoplay === "hover",
2962
3417
  handler(e) {
3418
+ var _a;
2963
3419
  if (!isTouch(e)) {
2964
- pauseHover(this.$el, this.restart);
3420
+ (_a = this._reverseAbort) == null ? void 0 : _a.abort();
3421
+ this.pause();
3422
+ this._reverseAbort = playReverse(this.$el, this.hoverRewind);
2965
3423
  }
2966
3424
  }
3425
+ },
3426
+ {
3427
+ name: "error pause ended",
3428
+ filter: ({ inviewQueued }) => inviewQueued,
3429
+ handler(e) {
3430
+ if (e.type === "error" || e.type === "ended" && !this.$el[loopKey]) {
3431
+ queue.delete(this.$el);
3432
+ }
3433
+ playNextQueued();
3434
+ }
2967
3435
  }
2968
3436
  ],
2969
3437
  observe: [
@@ -2975,33 +3443,118 @@
2975
3443
  }
2976
3444
  }),
2977
3445
  intersection({
2978
- filter: ({ $el, autoplay }) => autoplay !== "hover" && $el.preload !== "none",
2979
- handler([{ isIntersecting, target }]) {
3446
+ filter: ({ $el, manualControl }) => !manualControl && $el.preload !== "none",
3447
+ handler([{ isIntersecting }]) {
2980
3448
  if (!document.fullscreenElement) {
2981
3449
  if (isIntersecting) {
2982
3450
  if (this.autoplay) {
2983
- play(target);
3451
+ this._autoplay();
2984
3452
  }
2985
3453
  } else {
2986
- pauseHover(target, this.restart);
3454
+ this.pause();
2987
3455
  }
2988
3456
  }
2989
3457
  },
2990
3458
  args: { intersecting: false },
2991
- options: ({ $el, autoplay }) => ({
2992
- root: autoplay === "inview" ? null : parent($el).closest(":not(a)")
3459
+ options: ({ $el, autoplay, inviewMargin }) => ({
3460
+ root: autoplay === "inview" ? null : parent($el).closest(":not(a)"),
3461
+ rootMargin: autoplay === "inview" ? inviewMargin : "0px"
2993
3462
  })
2994
3463
  })
2995
- ]
3464
+ ],
3465
+ update: {
3466
+ write({ percent }) {
3467
+ if (!this.parallax) {
3468
+ return;
3469
+ }
3470
+ const { duration, seeking } = this.$el;
3471
+ if (!isNaN(duration) && !seeking) {
3472
+ this.$el.currentTime = percent * duration;
3473
+ }
3474
+ },
3475
+ events: ["scroll", "resize"]
3476
+ },
3477
+ methods: {
3478
+ _autoplay() {
3479
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
3480
+ this.pause();
3481
+ if (isTag(this.$el, "video")) {
3482
+ this.$el.currentTime = this.reducedMotionTime;
3483
+ }
3484
+ } else {
3485
+ this.play();
3486
+ }
3487
+ },
3488
+ play() {
3489
+ if (this.inviewQueued) {
3490
+ queue.set(this.$el, this.inviewQueued);
3491
+ playNextQueued();
3492
+ } else {
3493
+ play(this.$el);
3494
+ }
3495
+ },
3496
+ pause() {
3497
+ pause(this.$el);
3498
+ queue.delete(this.$el);
3499
+ if (this.restart) {
3500
+ this.$el.currentTime = 0;
3501
+ }
3502
+ }
3503
+ }
2996
3504
  };
2997
3505
  function isPlaying(videoEl) {
2998
3506
  return !videoEl.paused && !videoEl.ended;
2999
3507
  }
3000
- function pauseHover(el, restart) {
3001
- pause(el);
3002
- if (restart && isTag(el, "video")) {
3003
- el.currentTime = 0;
3508
+ const queue = /* @__PURE__ */ new Map();
3509
+ const played = /* @__PURE__ */ new WeakMap();
3510
+ let frame;
3511
+ async function playNextQueued() {
3512
+ cancelAnimationFrame(frame);
3513
+ await new Promise((resolve) => frame = requestAnimationFrame(resolve));
3514
+ const getPlayed = (el) => {
3515
+ var _a;
3516
+ return (_a = played.get(el)) != null ? _a : 0;
3517
+ };
3518
+ const videos = shuffle(queue.keys()).sort((a, b) => getPlayed(a) - getPlayed(b));
3519
+ for (const el of videos) {
3520
+ const maxQueued = queue.get(el);
3521
+ if (isPlaying(el) || videos.filter(isPlaying).length / queue.size >= maxQueued) {
3522
+ continue;
3523
+ }
3524
+ played.set(el, getPlayed(el) + 1);
3525
+ play(el);
3526
+ }
3527
+ }
3528
+ function shuffle(array) {
3529
+ array = [...array];
3530
+ for (let i = array.length - 1; i > 0; i--) {
3531
+ let j = Math.floor(Math.random() * (i + 1));
3532
+ [array[i], array[j]] = [array[j], array[i]];
3533
+ }
3534
+ return array;
3535
+ }
3536
+ function playReverse(el, playbackRate) {
3537
+ const start = el.currentTime;
3538
+ if (isNaN(start) || !playbackRate) {
3539
+ return;
3004
3540
  }
3541
+ playbackRate *= Math.max(1, start / 10 + 0.5);
3542
+ const controller = new AbortController();
3543
+ const time = Date.now();
3544
+ (function next() {
3545
+ requestAnimationFrame(() => {
3546
+ if (controller.signal.aborted) {
3547
+ return;
3548
+ }
3549
+ if (!el.seeking) {
3550
+ el.currentTime = Math.max(0, start - (Date.now() - time) * playbackRate / 1e3);
3551
+ }
3552
+ if (el.currentTime > 0) {
3553
+ next();
3554
+ }
3555
+ });
3556
+ })();
3557
+ return controller;
3005
3558
  }
3006
3559
 
3007
3560
  var cover = {
@@ -3077,7 +3630,7 @@
3077
3630
  inset: false
3078
3631
  },
3079
3632
  connected() {
3080
- this.pos = this.$props.pos.split("-").concat("center").slice(0, 2);
3633
+ this.pos = [...this.$props.pos.split("-"), "center"].slice(0, 2);
3081
3634
  [this.dir, this.align] = this.pos;
3082
3635
  this.axis = includes(["top", "bottom"], this.dir) ? "y" : "x";
3083
3636
  },
@@ -3097,7 +3650,7 @@
3097
3650
  placement.reverse();
3098
3651
  }
3099
3652
  const restoreScrollPosition = storeScrollPosition(element);
3100
- const elDim = dimensions(element);
3653
+ const elDim = dimensions$1(element);
3101
3654
  css(element, { top: -elDim.height, left: -elDim.width });
3102
3655
  positionAt(element, target, {
3103
3656
  attach,
@@ -3462,6 +4015,7 @@
3462
4015
  css(this.$el, this._style);
3463
4016
  this.$el.hidden = true;
3464
4017
  const viewports = this.target.map((target) => getViewport$1(this.$el, target));
4018
+ const boundaryOffsets = this.boundary.map((el) => offset(el));
3465
4019
  const viewportOffset = this.getViewportOffset(this.$el);
3466
4020
  const dirs = [
3467
4021
  [0, ["x", "width", "left", "right"]],
@@ -3471,7 +4025,7 @@
3471
4025
  if (this.axis !== axis && includes([axis, true], this.stretch)) {
3472
4026
  css(this.$el, {
3473
4027
  [prop]: Math.min(
3474
- offset(this.boundary[i])[prop],
4028
+ boundaryOffsets[i][prop],
3475
4029
  viewports[i][prop] - 2 * viewportOffset
3476
4030
  ),
3477
4031
  [`overflow-${axis}`]: "auto"
@@ -3493,10 +4047,10 @@
3493
4047
  const elOffset = offset(this.$el);
3494
4048
  css(this.$el, {
3495
4049
  [prop]: (targetOffset[start] > elOffset[start] ? targetOffset[this.inset ? end : start] - Math.max(
3496
- offset(this.boundary[i])[start],
4050
+ boundaryOffsets[i][start],
3497
4051
  viewports[i][start] + viewportOffset
3498
4052
  ) : Math.min(
3499
- offset(this.boundary[i])[end],
4053
+ boundaryOffsets[i][end],
3500
4054
  viewports[i][end] - viewportOffset
3501
4055
  ) - targetOffset[this.inset ? start : end]) - positionOffset,
3502
4056
  [`overflow-${axis}`]: "auto"
@@ -3525,7 +4079,7 @@
3525
4079
  observeViewportResize(update),
3526
4080
  observeResize(overflowParents(drop.$el).concat(drop.target), update)
3527
4081
  ];
3528
- return () => off.map((observer) => observer.disconnect());
4082
+ return () => off.forEach((observer) => observer.disconnect());
3529
4083
  }
3530
4084
  function listenForScroll(drop, fn = () => drop.$emit()) {
3531
4085
  return on([document, ...overflowParents(drop.$el)], "scroll", fn, {
@@ -3760,7 +4314,9 @@
3760
4314
  const drop = this.getDropdown(target);
3761
4315
  const adjustHeight = () => {
3762
4316
  const maxBottom = Math.max(
3763
- ...parents(target, `.${this.clsDrop}`).concat(target).map((el) => offset(el).bottom)
4317
+ ...[...parents(target, `.${this.clsDrop}`), target].map(
4318
+ (el) => offset(el).bottom
4319
+ )
3764
4320
  );
3765
4321
  offset(this.dropbar, {
3766
4322
  left: offset(this.dropbar).left,
@@ -3940,10 +4496,12 @@
3940
4496
  var Margin = {
3941
4497
  props: {
3942
4498
  margin: String,
4499
+ firstRow: Boolean,
3943
4500
  firstColumn: Boolean
3944
4501
  },
3945
4502
  data: {
3946
4503
  margin: "uk-margin-small-top",
4504
+ firstRow: false,
3947
4505
  firstColumn: "uk-first-column"
3948
4506
  },
3949
4507
  observe: [
@@ -3983,6 +4541,7 @@
3983
4541
  for (const row of rows) {
3984
4542
  for (const el of row) {
3985
4543
  toggleClass(el, this.margin, rows[0] !== row);
4544
+ toggleClass(el, this.firstRow, rows[0] === row);
3986
4545
  toggleClass(el, this.firstColumn, row[isRtl ? row.length - 1 : 0] === el);
3987
4546
  }
3988
4547
  }
@@ -4055,7 +4614,8 @@
4055
4614
  parallaxJustify: Boolean
4056
4615
  },
4057
4616
  data: {
4058
- margin: "uk-grid-margin",
4617
+ margin: "",
4618
+ firstRow: "uk-first-row",
4059
4619
  clsStack: "uk-grid-stack",
4060
4620
  masonry: false,
4061
4621
  parallax: 0,
@@ -4077,14 +4637,14 @@
4077
4637
  {
4078
4638
  read(data) {
4079
4639
  const { rows } = data;
4080
- let { masonry, parallax, parallaxJustify, margin } = this;
4640
+ let { masonry, parallax, parallaxJustify } = this;
4081
4641
  parallax = Math.max(0, toPx(parallax));
4082
4642
  if (!(masonry || parallax || parallaxJustify) || positionedAbsolute(rows) || rows[0].some(
4083
4643
  (el, i) => rows.some((row) => row[i] && row[i].offsetWidth !== el.offsetWidth)
4084
4644
  )) {
4085
4645
  return data.translates = data.scrollColumns = false;
4086
4646
  }
4087
- let gutter = getGutter(rows, margin);
4647
+ let gutter = toFloat(css(this.$el, "row-gap"));
4088
4648
  let columns;
4089
4649
  let translates;
4090
4650
  if (masonry) {
@@ -4177,10 +4737,6 @@
4177
4737
  }
4178
4738
  return [columns, translates];
4179
4739
  }
4180
- function getGutter(rows, cls) {
4181
- const node = rows.flat().find((el) => hasClass(el, cls));
4182
- return toFloat(node ? css(node, "marginTop") : css(rows[0][0], "paddingLeft"));
4183
- }
4184
4740
  function transpose(rows) {
4185
4741
  const columns = [];
4186
4742
  for (const row of rows) {
@@ -4211,7 +4767,7 @@
4211
4767
  elements: ({ target }, $el) => $$(target, $el)
4212
4768
  },
4213
4769
  observe: resize({
4214
- target: ({ $el, elements }) => elements.reduce((elements2, el) => elements2.concat(el, ...el.children), [$el])
4770
+ target: ({ $el, elements }) => [$el, ...elements.flatMap((el) => [el, ...el.children])]
4215
4771
  }),
4216
4772
  events: {
4217
4773
  // Hidden elements may change height when fonts load
@@ -4252,7 +4808,7 @@
4252
4808
  css(element, "display", "block", "important");
4253
4809
  }
4254
4810
  css(element, "minHeight", "");
4255
- const height = dimensions(element).height - boxModelAdjust(element, "height", "content-box");
4811
+ const height = dimensions$1(element).height - boxModelAdjust(element, "height", "content-box");
4256
4812
  css(element, style);
4257
4813
  return height;
4258
4814
  }
@@ -4283,45 +4839,6 @@
4283
4839
  }
4284
4840
  };
4285
4841
 
4286
- var Media = {
4287
- props: {
4288
- media: Boolean
4289
- },
4290
- data: {
4291
- media: false
4292
- },
4293
- connected() {
4294
- const media = toMedia(this.media, this.$el);
4295
- this.matchMedia = true;
4296
- if (media) {
4297
- this.mediaObj = window.matchMedia(media);
4298
- const handler = () => {
4299
- this.matchMedia = this.mediaObj.matches;
4300
- trigger(this.$el, createEvent("mediachange", false, true, [this.mediaObj]));
4301
- };
4302
- this.offMediaObj = on(this.mediaObj, "change", () => {
4303
- handler();
4304
- this.$emit("resize");
4305
- });
4306
- handler();
4307
- }
4308
- },
4309
- disconnected() {
4310
- var _a;
4311
- (_a = this.offMediaObj) == null ? void 0 : _a.call(this);
4312
- }
4313
- };
4314
- function toMedia(value, element) {
4315
- if (isString(value)) {
4316
- if (startsWith(value, "@")) {
4317
- value = toFloat(css(element, `--uk-breakpoint-${value.slice(1)}`));
4318
- } else if (isNaN(value)) {
4319
- return value;
4320
- }
4321
- }
4322
- return value && isNumeric(value) ? `(min-width: ${value}px)` : "";
4323
- }
4324
-
4325
4842
  var heightViewport = {
4326
4843
  mixins: [Media],
4327
4844
  props: {
@@ -4360,7 +4877,7 @@
4360
4877
  const isScrollingElement = scrollingElement === scrollElement || body === scrollElement;
4361
4878
  let minHeight = `calc(${isScrollingElement ? "100vh" : `${viewportHeight}px`}`;
4362
4879
  if (this.expand) {
4363
- const diff = dimensions(scrollElement).height - dimensions(this.$el).height;
4880
+ const diff = dimensions$1(scrollElement).height - dimensions$1(this.$el).height;
4364
4881
  minHeight += ` - ${diff}px`;
4365
4882
  } else {
4366
4883
  if (this.offsetTop) {
@@ -4373,13 +4890,13 @@
4373
4890
  }
4374
4891
  }
4375
4892
  if (this.offsetBottom === true) {
4376
- minHeight += ` - ${dimensions(this.$el.nextElementSibling).height}px`;
4893
+ minHeight += ` - ${dimensions$1(this.$el.nextElementSibling).height}px`;
4377
4894
  } else if (isNumeric(this.offsetBottom)) {
4378
4895
  minHeight += ` - ${this.offsetBottom}vh`;
4379
4896
  } else if (this.offsetBottom && endsWith(this.offsetBottom, "px")) {
4380
4897
  minHeight += ` - ${toFloat(this.offsetBottom)}px`;
4381
4898
  } else if (isString(this.offsetBottom)) {
4382
- minHeight += ` - ${dimensions(query(this.offsetBottom, this.$el)).height}px`;
4899
+ minHeight += ` - ${dimensions$1(query(this.offsetBottom, this.$el)).height}px`;
4383
4900
  }
4384
4901
  }
4385
4902
  minHeight += `${box ? ` - ${box}px` : ""})`;
@@ -4931,8 +5448,8 @@
4931
5448
  }
4932
5449
  };
4933
5450
  function findTargetColor(target) {
4934
- const dim = dimensions(target);
4935
- const viewport = dimensions(window);
5451
+ const dim = dimensions$1(target);
5452
+ const viewport = dimensions$1(window);
4936
5453
  if (!intersectRect(dim, viewport)) {
4937
5454
  return false;
4938
5455
  }
@@ -5171,12 +5688,13 @@
5171
5688
  }
5172
5689
  }
5173
5690
  };
5691
+ const rejectKey = /* @__PURE__ */ Symbol();
5174
5692
  function animate(el, show, { transitionElement, _toggle }) {
5175
5693
  return new Promise(
5176
5694
  (resolve, reject) => once(el, "show hide", () => {
5177
5695
  var _a;
5178
- (_a = el._reject) == null ? void 0 : _a.call(el);
5179
- el._reject = reject;
5696
+ (_a = el[rejectKey]) == null ? void 0 : _a.call(el);
5697
+ el[rejectKey] = reject;
5180
5698
  _toggle(el, show);
5181
5699
  const off = once(
5182
5700
  transitionElement,
@@ -5197,7 +5715,7 @@
5197
5715
  toMs(css(transitionElement, "transitionDuration"))
5198
5716
  );
5199
5717
  })
5200
- ).then(() => delete el._reject);
5718
+ ).then(() => delete el[rejectKey]);
5201
5719
  }
5202
5720
  function toMs(time) {
5203
5721
  return time ? endsWith(time, "ms") ? toFloat(time) : toFloat(time) * 1e3 : 0;
@@ -5207,7 +5725,7 @@
5207
5725
  if (last(active) !== modal || modal.$el.contains(e.target)) {
5208
5726
  return;
5209
5727
  }
5210
- const { left, top, width, height } = dimensions(e.target);
5728
+ const { left, top, width, height } = dimensions$1(e.target);
5211
5729
  const topEl = document.elementFromPoint(left + width / 2, top + height / 2);
5212
5730
  if (topEl && (e.target.contains(topEl) || topEl.contains(e.target))) {
5213
5731
  return;
@@ -5585,7 +6103,7 @@
5585
6103
  return {
5586
6104
  max: Math.max(
5587
6105
  this.minHeight,
5588
- height(this.container) - (dimensions(this.content).height - height(this.$el))
6106
+ height(this.container) - (dimensions$1(this.content).height - height(this.$el))
5589
6107
  )
5590
6108
  };
5591
6109
  },
@@ -5628,11 +6146,11 @@
5628
6146
  ],
5629
6147
  update: {
5630
6148
  read() {
5631
- const overflow = [];
5632
- for (const prop of ["Width", "Height"]) {
5633
- overflow.push(this.$el[`scroll${prop}`] - this.$el[`client${prop}`]);
5634
- }
5635
- return { overflow };
6149
+ return {
6150
+ overflow: ["Width", "Height"].map(
6151
+ (prop) => this.$el[`scroll${prop}`] - this.$el[`client${prop}`]
6152
+ )
6153
+ };
5636
6154
  },
5637
6155
  write({ overflow }) {
5638
6156
  for (let i = 0; i < 2; i++) {
@@ -5910,7 +6428,7 @@
5910
6428
  if (scrollTop >= max) {
5911
6429
  active = length - 1;
5912
6430
  } else {
5913
- const offsetBy = this.offset + dimensions(getCoveringElement()).height + viewport.height * 0.1;
6431
+ const offsetBy = this.offset + dimensions$1(getCoveringElement()).height + viewport.height * 0.1;
5914
6432
  for (let i = 0; i < targets.length; i++) {
5915
6433
  if (offset(targets[i]).top - viewport.top - offsetBy > 0) {
5916
6434
  break;
@@ -6049,7 +6567,7 @@
6049
6567
  this.hide();
6050
6568
  }
6051
6569
  if (!this.active) {
6052
- ({ height: height$1, width } = dimensions(this.$el));
6570
+ ({ height: height$1, width } = dimensions$1(this.$el));
6053
6571
  margin = css(this.$el, "margin");
6054
6572
  }
6055
6573
  if (hide) {
@@ -6071,7 +6589,7 @@
6071
6589
  const overflow = this.overflowFlip ? 0 : Math.max(0, elementBox - viewport2);
6072
6590
  const topOffset = offset(referenceElement).top - // offset possible `transform: translateY` animation 'uk-animation-slide-top' while hiding
6073
6591
  new DOMMatrix(css(referenceElement, "transform")).m42;
6074
- const elHeight = dimensions(this.$el).height;
6592
+ const elHeight = dimensions$1(this.$el).height;
6075
6593
  const start = (this.start === false ? topOffset : parseProp(this.start, this.$el, topOffset)) - offset$1;
6076
6594
  const end = this.end === false ? maxScrollHeight : Math.min(
6077
6595
  maxScrollHeight,
@@ -6263,7 +6781,7 @@
6263
6781
  if (!value) {
6264
6782
  return 0;
6265
6783
  }
6266
- if (isNumeric(value) || isString(value) && value.match(/^-?\d/)) {
6784
+ if (isNumeric(value) || isString(value) && /^-?\d/.test(value)) {
6267
6785
  return propOffset + toPx(value, "height", el, true);
6268
6786
  } else {
6269
6787
  const refElement = value === true ? getVisibleParent(el) : query(value, el);
@@ -6297,15 +6815,6 @@
6297
6815
  }
6298
6816
  }
6299
6817
 
6300
- function getMaxPathLength(el) {
6301
- return isVisible(el) ? Math.ceil(
6302
- Math.max(0, ...$$("[stroke]", el).map((stroke) => {
6303
- var _a;
6304
- return ((_a = stroke.getTotalLength) == null ? void 0 : _a.call(stroke)) || 0;
6305
- }))
6306
- ) : 0;
6307
- }
6308
-
6309
6818
  var svg = {
6310
6819
  mixins: [Svg],
6311
6820
  args: "src",
@@ -6387,10 +6896,9 @@
6387
6896
 
6388
6897
  const selDisabled = ".uk-disabled *, .uk-disabled, [disabled]";
6389
6898
  var Switcher = {
6390
- mixins: [Togglable],
6899
+ mixins: [Connect],
6391
6900
  args: "connect",
6392
6901
  props: {
6393
- connect: String,
6394
6902
  toggle: String,
6395
6903
  itemNav: String,
6396
6904
  active: Number,
@@ -6402,20 +6910,12 @@
6402
6910
  toggle: "> * > :first-child",
6403
6911
  itemNav: false,
6404
6912
  active: 0,
6405
- cls: "uk-active",
6406
6913
  attrItem: "uk-switcher-item",
6407
6914
  selVertical: ".uk-nav",
6408
6915
  followFocus: false,
6409
6916
  swiping: true
6410
6917
  },
6411
6918
  computed: {
6412
- connects: {
6413
- get: ({ connect }, $el) => queryAll(connect, $el),
6414
- observe: ({ connect }) => connect
6415
- },
6416
- connectChildren() {
6417
- return this.connects.map((el) => children(el)).flat();
6418
- },
6419
6919
  toggles: ({ toggle }, $el) => $$(toggle, $el),
6420
6920
  children(_, $el) {
6421
6921
  return children($el).filter(
@@ -6446,10 +6946,7 @@
6446
6946
  connected() {
6447
6947
  this.$el.role = "tablist";
6448
6948
  },
6449
- observe: [
6450
- lazyload({ targets: ({ connectChildren }) => connectChildren }),
6451
- swipe({ target: ({ connects }) => connects, filter: ({ swiping }) => swiping })
6452
- ],
6949
+ observe: swipe({ target: ({ connects }) => connects, filter: ({ swiping }) => swiping }),
6453
6950
  events: [
6454
6951
  {
6455
6952
  name: "click keydown",
@@ -6499,24 +6996,27 @@
6499
6996
  }
6500
6997
  ],
6501
6998
  update() {
6502
- var _a;
6503
- for (const el of this.connects) {
6504
- if (isTag(el, "ul")) {
6505
- el.role = "presentation";
6506
- }
6507
- }
6508
6999
  attr(children(this.$el), "role", "presentation");
6509
7000
  for (const index in this.toggles) {
6510
7001
  const toggle = this.toggles[index];
6511
- const item = (_a = this.connects[0]) == null ? void 0 : _a.children[index];
6512
- toggle.role = "tab";
6513
- if (!item) {
6514
- continue;
6515
- }
6516
7002
  toggle.id = generateId(this, toggle);
6517
- item.id = generateId(this, item);
6518
- toggle.ariaControls = item.id;
6519
- attr(item, { role: "tabpanel", "aria-labelledby": toggle.id });
7003
+ const controls = [];
7004
+ for (const { children: children2 } of this.connects) {
7005
+ const item = children2[index];
7006
+ if (!item) {
7007
+ continue;
7008
+ }
7009
+ attr(item, {
7010
+ id: generateId(this, item),
7011
+ role: "tabpanel",
7012
+ "aria-labelledby": toggle.id
7013
+ });
7014
+ controls.push(item.id);
7015
+ }
7016
+ attr(toggle, {
7017
+ role: "tab",
7018
+ "aria-controls": controls.join(" ")
7019
+ });
6520
7020
  }
6521
7021
  attr(this.$el, "aria-orientation", matches(this.$el, this.selVertical) ? "vertical" : null);
6522
7022
  },
@@ -6549,15 +7049,7 @@
6549
7049
  tabindex: next === i ? null : -1
6550
7050
  });
6551
7051
  });
6552
- const animate = prev >= 0 && prev !== next;
6553
- this.connects.forEach(async ({ children: children2 }) => {
6554
- const actives = toArray(children2).filter(
6555
- (child, i) => i !== next && hasClass(child, this.cls)
6556
- );
6557
- if (await this.toggleElement(actives, false, animate)) {
6558
- await this.toggleElement(children2[next], true, animate);
6559
- }
6560
- });
7052
+ return this.showConnects(next, prev >= 0);
6561
7053
  }
6562
7054
  }
6563
7055
  };