uikit 3.14.4-dev.871ba3c05 → 3.14.4-dev.ae765cd84

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 (138) hide show
  1. package/CHANGELOG.md +45 -11
  2. package/build/util.js +1 -0
  3. package/dist/css/uikit-core-rtl.css +385 -110
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +385 -110
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +402 -115
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +402 -115
  10. package/dist/css/uikit.min.css +1 -1
  11. package/dist/js/components/countdown.js +1 -1
  12. package/dist/js/components/countdown.min.js +1 -1
  13. package/dist/js/components/filter.js +7 -5
  14. package/dist/js/components/filter.min.js +1 -1
  15. package/dist/js/components/lightbox-panel.js +185 -137
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +185 -137
  18. package/dist/js/components/lightbox.min.js +1 -1
  19. package/dist/js/components/notification.js +1 -1
  20. package/dist/js/components/notification.min.js +1 -1
  21. package/dist/js/components/parallax.js +4 -5
  22. package/dist/js/components/parallax.min.js +1 -1
  23. package/dist/js/components/slider-parallax.js +4 -5
  24. package/dist/js/components/slider-parallax.min.js +1 -1
  25. package/dist/js/components/slider.js +22 -7
  26. package/dist/js/components/slider.min.js +1 -1
  27. package/dist/js/components/slideshow-parallax.js +4 -5
  28. package/dist/js/components/slideshow-parallax.min.js +1 -1
  29. package/dist/js/components/slideshow.js +22 -7
  30. package/dist/js/components/slideshow.min.js +1 -1
  31. package/dist/js/components/sortable.js +3 -3
  32. package/dist/js/components/sortable.min.js +1 -1
  33. package/dist/js/components/tooltip.js +97 -135
  34. package/dist/js/components/tooltip.min.js +1 -1
  35. package/dist/js/components/upload.js +1 -1
  36. package/dist/js/components/upload.min.js +1 -1
  37. package/dist/js/uikit-core.js +1803 -1709
  38. package/dist/js/uikit-core.min.js +14 -1
  39. package/dist/js/uikit-icons.js +1 -1
  40. package/dist/js/uikit-icons.min.js +1 -1
  41. package/dist/js/uikit.js +1051 -940
  42. package/dist/js/uikit.min.js +14 -1
  43. package/package.json +1 -1
  44. package/src/images/{backgrounds/nav-parent-open.svg → components/nav-parent-icon-large.svg} +0 -0
  45. package/src/images/components/nav-parent-icon.svg +3 -0
  46. package/src/images/components/navbar-parent-icon.svg +3 -0
  47. package/src/images/components/navbar-toggle-icon.svg +22 -3
  48. package/src/js/api/state.js +2 -2
  49. package/src/js/components/filter.js +5 -3
  50. package/src/js/components/sortable.js +2 -3
  51. package/src/js/core/accordion.js +9 -17
  52. package/src/js/core/alert.js +35 -14
  53. package/src/js/core/drop.js +95 -61
  54. package/src/js/core/height-viewport.js +14 -6
  55. package/src/js/core/icon.js +16 -0
  56. package/src/js/core/index.js +2 -0
  57. package/src/js/core/leader.js +2 -2
  58. package/src/js/core/navbar.js +44 -30
  59. package/src/js/core/offcanvas.js +1 -47
  60. package/src/js/core/scroll.js +37 -10
  61. package/src/js/core/sticky.js +8 -9
  62. package/src/js/core/toggle.js +3 -5
  63. package/src/js/mixin/media.js +4 -5
  64. package/src/js/mixin/modal.js +97 -8
  65. package/src/js/mixin/position.js +26 -11
  66. package/src/js/mixin/slider-drag.js +20 -8
  67. package/src/js/mixin/style.js +11 -0
  68. package/src/js/mixin/togglable.js +80 -133
  69. package/src/js/util/animation.js +4 -3
  70. package/src/js/util/dimensions.js +6 -6
  71. package/src/js/util/filter.js +3 -7
  72. package/src/js/util/position.js +108 -107
  73. package/src/js/util/style.js +4 -13
  74. package/src/js/util/viewport.js +5 -32
  75. package/src/less/components/_import.less +1 -0
  76. package/src/less/components/drop.less +1 -18
  77. package/src/less/components/dropbar.less +115 -0
  78. package/src/less/components/dropdown.less +16 -16
  79. package/src/less/components/leader.less +1 -1
  80. package/src/less/components/nav.less +240 -63
  81. package/src/less/components/navbar.less +81 -38
  82. package/src/less/components/utility.less +21 -4
  83. package/src/less/theme/_import.less +1 -0
  84. package/src/less/theme/dropbar.less +44 -0
  85. package/src/less/theme/dropdown.less +0 -11
  86. package/src/less/theme/nav.less +43 -9
  87. package/src/less/theme/navbar.less +7 -11
  88. package/src/scss/components/_import.scss +1 -0
  89. package/src/scss/components/drop.scss +1 -18
  90. package/src/scss/components/dropbar.scss +115 -0
  91. package/src/scss/components/dropdown.scss +16 -16
  92. package/src/scss/components/leader.scss +1 -1
  93. package/src/scss/components/nav.scss +189 -51
  94. package/src/scss/components/navbar.scss +69 -38
  95. package/src/scss/components/utility.scss +19 -3
  96. package/src/scss/mixins-theme.scss +93 -25
  97. package/src/scss/mixins.scss +89 -17
  98. package/src/scss/theme/_import.scss +1 -0
  99. package/src/scss/theme/dropbar.scss +44 -0
  100. package/src/scss/theme/dropdown.scss +0 -8
  101. package/src/scss/theme/nav.scss +41 -9
  102. package/src/scss/theme/navbar.scss +7 -8
  103. package/src/scss/variables-theme.scss +71 -18
  104. package/src/scss/variables.scss +60 -14
  105. package/tests/accordion.html +2 -2
  106. package/tests/alert.html +2 -2
  107. package/tests/countdown.html +1 -1
  108. package/tests/drop.html +457 -371
  109. package/tests/dropbar.html +456 -0
  110. package/tests/dropdown.html +26 -401
  111. package/tests/filter.html +9 -12
  112. package/tests/form.html +1 -1
  113. package/tests/index.html +126 -107
  114. package/tests/js/index.js +1 -4
  115. package/tests/lightbox.html +5 -5
  116. package/tests/list.html +8 -8
  117. package/tests/modal.html +13 -13
  118. package/tests/nav.html +117 -75
  119. package/tests/navbar.html +2002 -1131
  120. package/tests/offcanvas.html +17 -21
  121. package/tests/parallax.html +1 -1
  122. package/tests/position.html +18 -16
  123. package/tests/progress.html +9 -9
  124. package/tests/scroll.html +7 -10
  125. package/tests/search.html +5 -5
  126. package/tests/slider.html +6 -5
  127. package/tests/slideshow.html +8 -8
  128. package/tests/sortable.html +6 -8
  129. package/tests/sticky-navbar.html +6 -6
  130. package/tests/sticky.html +8 -8
  131. package/tests/switcher.html +1 -1
  132. package/tests/tab.html +1 -1
  133. package/tests/table.html +7 -7
  134. package/tests/toggle.html +2 -2
  135. package/tests/tooltip.html +1 -1
  136. package/tests/upload.html +11 -11
  137. package/tests/utility.html +19 -0
  138. package/src/images/backgrounds/nav-parent-close.svg +0 -3
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.14.4-dev.871ba3c05 | https://www.getuikit.com | (c) 2014 - 2022 YOOtheme | MIT License */
1
+ /*! UIkit 3.14.4-dev.ae765cd84 | https://www.getuikit.com | (c) 2014 - 2022 YOOtheme | MIT License */
2
2
 
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -383,12 +383,8 @@
383
383
  }
384
384
 
385
385
  function closest(element, selector) {
386
- if (startsWith(selector, '>')) {
387
- selector = selector.slice(1);
388
- }
389
-
390
386
  return isElement(element) ?
391
- element.closest(selector) :
387
+ element.closest(startsWith(selector, '>') ? selector.slice(1) : selector) :
392
388
  toNodes(element).
393
389
  map((element) => closest(element, selector)).
394
390
  filter(Boolean);
@@ -396,8 +392,8 @@
396
392
 
397
393
  function within(element, selector) {
398
394
  return isString(selector) ?
399
- matches(element, selector) || !!closest(element, selector) :
400
- element === selector || toNode(selector).contains(toNode(element));
395
+ !!closest(element, selector) :
396
+ toNode(selector).contains(toNode(element));
401
397
  }
402
398
 
403
399
  function parents(element, selector) {
@@ -785,18 +781,11 @@
785
781
  return elements[0];
786
782
  }
787
783
 
788
- const propertyRe = /^\s*(["'])?(.*?)\1\s*$/;
789
- function getCssVar(name, element) {if (element === void 0) {element = document.documentElement;}
790
- return css(element, "--uk-" + name).replace(propertyRe, '$2');
791
- }
792
-
793
784
  // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty
794
785
  const propName = memoize((name) => vendorPropName(name));
795
786
 
796
- const cssPrefixes = ['webkit', 'moz'];
797
-
798
787
  function vendorPropName(name) {
799
- if (name[0] === '-') {
788
+ if (startsWith(name, '--')) {
800
789
  return name;
801
790
  }
802
791
 
@@ -808,11 +797,8 @@
808
797
  return name;
809
798
  }
810
799
 
811
- let i = cssPrefixes.length,
812
- prefixedName;
813
-
814
- while (i--) {
815
- prefixedName = "-" + cssPrefixes[i] + "-" + name;
800
+ for (const prefix of ['webkit', 'moz']) {
801
+ const prefixedName = "-" + prefix + "-" + name;
816
802
  if (prefixedName in style) {
817
803
  return prefixedName;
818
804
  }
@@ -913,13 +899,14 @@
913
899
  const Transition = {
914
900
  start: transition,
915
901
 
916
- stop(element) {
902
+ async stop(element) {
917
903
  trigger(element, 'transitionend');
918
- return Promise.resolve();
904
+ await Promise.resolve();
919
905
  },
920
906
 
921
- cancel(element) {
907
+ async cancel(element) {
922
908
  trigger(element, 'transitioncanceled');
909
+ await Promise.resolve();
923
910
  },
924
911
 
925
912
  inProgress(element) {
@@ -929,7 +916,7 @@
929
916
 
930
917
  const animationPrefix = 'uk-animation-';
931
918
 
932
- function animate$1(element, animation, duration, origin, out) {if (duration === void 0) {duration = 200;}
919
+ function animate$2(element, animation, duration, origin, out) {if (duration === void 0) {duration = 200;}
933
920
  return Promise.all(
934
921
  toNodes(element).map(
935
922
  (element) =>
@@ -965,10 +952,10 @@
965
952
 
966
953
  const inProgress = new RegExp(animationPrefix + "(enter|leave)");
967
954
  const Animation = {
968
- in: animate$1,
955
+ in: animate$2,
969
956
 
970
957
  out(element, animation, duration, origin) {
971
- return animate$1(element, animation, duration, origin, true);
958
+ return animate$2(element, animation, duration, origin, true);
972
959
  },
973
960
 
974
961
  inProgress(element) {
@@ -1060,13 +1047,13 @@
1060
1047
  }
1061
1048
 
1062
1049
  function offsetPosition(element) {
1063
- const offset = [0, 0];
1064
-
1065
1050
  element = toNode(element);
1066
1051
 
1067
- do {
1068
- offset[0] += element.offsetTop;
1069
- offset[1] += element.offsetLeft;
1052
+ const offset = [element.offsetTop, element.offsetLeft];
1053
+
1054
+ while (element = element.offsetParent) {
1055
+ offset[0] += element.offsetTop + toFloat(css(element, "borderTopWidth"));
1056
+ offset[1] += element.offsetLeft + toFloat(css(element, "borderLeftWidth"));
1070
1057
 
1071
1058
  if (css(element, 'position') === 'fixed') {
1072
1059
  const win = toWindow(element);
@@ -1074,7 +1061,7 @@
1074
1061
  offset[1] += win.scrollX;
1075
1062
  return offset;
1076
1063
  }
1077
- } while (element = element.offsetParent);
1064
+ }
1078
1065
 
1079
1066
  return offset;
1080
1067
  }
@@ -1795,20 +1782,6 @@
1795
1782
 
1796
1783
  }
1797
1784
 
1798
- function scrollTop(element, top) {
1799
- if (isWindow(element) || isDocument(element)) {
1800
- element = scrollingElement(element);
1801
- } else {
1802
- element = toNode(element);
1803
- }
1804
-
1805
- if (isUndefined(top)) {
1806
- return element.scrollTop;
1807
- } else {
1808
- element.scrollTop = top;
1809
- }
1810
- }
1811
-
1812
1785
  function scrollIntoView(element, _temp) {let { offset: offsetBy = 0 } = _temp === void 0 ? {} : _temp;
1813
1786
  const parents = isVisible(element) ? scrollParents(element) : [];
1814
1787
  return parents.reduce(
@@ -1850,7 +1823,7 @@
1850
1823
  (function step() {
1851
1824
  const percent = ease(clamp((Date.now() - start) / duration));
1852
1825
 
1853
- scrollTop(element, scroll + top * percent);
1826
+ element.scrollTop = scroll + top * percent;
1854
1827
 
1855
1828
  // scroll more if we have not reached our destination
1856
1829
  if (percent === 1) {
@@ -1913,12 +1886,10 @@
1913
1886
  function offsetViewport(scrollElement) {
1914
1887
  const window = toWindow(scrollElement);
1915
1888
  const {
1916
- document: { body, documentElement } } =
1889
+ document: { documentElement } } =
1917
1890
  window;
1918
1891
  let viewportElement =
1919
- scrollElement === scrollingElement(scrollElement) || scrollElement === body ?
1920
- window :
1921
- scrollElement;
1892
+ scrollElement === scrollingElement(scrollElement) ? window : scrollElement;
1922
1893
 
1923
1894
  const { visualViewport } = window;
1924
1895
  if (isWindow(viewportElement) && visualViewport) {
@@ -1937,7 +1908,7 @@
1937
1908
  // iOS 12 returns <body> as scrollingElement
1938
1909
  viewportElement = documentElement;
1939
1910
  } else {
1940
- rect[start] += toFloat(css(viewportElement, "border" + ucfirst(start) + "Width"));
1911
+ rect[start] += toFloat(css(viewportElement, "border-" + start + "-width"));
1941
1912
  }
1942
1913
  rect[prop] = rect[dir] = viewportElement["client" + ucfirst(prop)];
1943
1914
  rect[end] = rect[prop] + rect[start];
@@ -1962,126 +1933,65 @@
1962
1933
  ...options.attach },
1963
1934
 
1964
1935
  offset: [0, 0],
1936
+ placement: [],
1965
1937
  ...options };
1966
1938
 
1967
1939
 
1968
- const dim = options.flip ?
1969
- attachToWithFlip(element, target, options) :
1970
- attachTo(element, target, options);
1971
-
1972
- offset(element, dim);
1973
- }
1974
-
1975
- function attachTo(element, target, options) {
1976
- let { attach, offset: offsetBy } = {
1977
- attach: {
1978
- element: ['left', 'top'],
1979
- target: ['left', 'top'],
1980
- ...options.attach },
1981
-
1982
- offset: [0, 0],
1983
- ...options };
1984
-
1985
-
1986
- const position = offset(element);
1987
- const targetOffset = offset(target);
1988
- for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
1989
- position[start] = position[dir] =
1990
- targetOffset[start] +
1991
- moveBy(attach.target[i], end, targetOffset[prop]) -
1992
- moveBy(attach.element[i], end, position[prop]) +
1993
- +offsetBy[i];
1994
- position[end] = position[start] + position[prop];
1940
+ if (!isArray(target)) {
1941
+ target = [target, target];
1995
1942
  }
1996
- return position;
1997
- }
1998
1943
 
1999
- function moveBy(start, end, dim) {
2000
- return start === 'center' ? dim / 2 : start === end ? dim : 0;
1944
+ offset(element, getPosition(element, target, options));
2001
1945
  }
2002
1946
 
2003
- function attachToWithFlip(element, target, options) {
1947
+ function getPosition(element, target, options) {
2004
1948
  const position = attachTo(element, target, options);
2005
- const targetDim = offset(target);
2006
1949
 
2007
1950
  let {
2008
- flip,
2009
1951
  attach: { element: elAttach, target: targetAttach },
2010
1952
  offset: elOffset,
2011
1953
  boundary,
2012
- viewport,
2013
- viewportOffset } =
1954
+ viewportOffset,
1955
+ placement } =
2014
1956
  options;
2015
1957
 
2016
- let viewports = scrollParents(element);
2017
- if (boundary === target) {
2018
- viewports = viewports.filter((viewport) => viewport !== boundary);
2019
- }
2020
- const [scrollElement] = viewports;
2021
- viewports.push(viewport);
2022
-
2023
- const offsetPosition = { ...position };
2024
- for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
2025
- if (flip !== true && !includes(flip, dir)) {
2026
- continue;
2027
- }
2028
-
2029
- const willFlip =
2030
- !intersectLine(position, targetDim, i) && intersectLine(position, targetDim, 1 - i);
1958
+ let offsetPosition = position;
1959
+ for (const [i, [prop,, start, end]] of Object.entries(dirs)) {
1960
+ let viewports = scrollParents(target[i]);
1961
+ const [scrollElement] = viewports;
2031
1962
 
2032
- viewport = getIntersectionArea(...viewports.filter(Boolean).map(offsetViewport));
1963
+ let viewport = getIntersectionArea(...viewports.map(offsetViewport));
2033
1964
 
2034
1965
  if (viewportOffset) {
2035
1966
  viewport[start] += viewportOffset;
2036
1967
  viewport[end] -= viewportOffset;
2037
1968
  }
2038
1969
 
2039
- if (boundary && !willFlip && position[prop] <= offset(boundary)[prop]) {
2040
- viewport = getIntersectionArea(viewport, offset(boundary));
1970
+ if (boundary) {
1971
+ viewport = getIntersectionArea(viewport, offsetViewport(boundary));
2041
1972
  }
2042
1973
 
2043
- const isInStartBoundary = position[start] >= viewport[start];
2044
- const isInEndBoundary = position[end] <= viewport[end];
1974
+ const isInStartViewport = position[start] >= viewport[start];
1975
+ const isInEndViewport = position[end] <= viewport[end];
2045
1976
 
2046
- if (isInStartBoundary && isInEndBoundary) {
1977
+ if (isInStartViewport && isInEndViewport) {
2047
1978
  continue;
2048
1979
  }
2049
1980
 
2050
- let offsetBy;
1981
+ let offsetBy = 0;
2051
1982
 
2052
1983
  // Flip
2053
- if (willFlip) {
1984
+ if (placement[i] === 'flip') {
2054
1985
  if (
2055
- elAttach[i] === end && isInStartBoundary ||
2056
- elAttach[i] === start && isInEndBoundary)
1986
+ targetAttach[i] === end && isInEndViewport ||
1987
+ targetAttach[i] === start && isInStartViewport)
2057
1988
  {
2058
1989
  continue;
2059
1990
  }
2060
1991
 
2061
- offsetBy =
2062
- (elAttach[i] === start ?
2063
- -position[prop] :
2064
- elAttach[i] === end ?
2065
- position[prop] :
2066
- 0) + (
2067
- targetAttach[i] === start ?
2068
- targetDim[prop] :
2069
- targetAttach[i] === end ?
2070
- -targetDim[prop] :
2071
- 0) -
2072
- elOffset[i] * 2;
2073
-
2074
- if (
2075
- !isInScrollArea(
2076
- {
2077
- ...position,
2078
- [start]: position[start] + offsetBy,
2079
- [end]: position[end] + offsetBy },
1992
+ offsetBy = flip(element, target, options, i)[start] - position[start];
2080
1993
 
2081
- scrollElement,
2082
- i))
2083
-
2084
- {
1994
+ if (!isInScrollArea(applyOffset(position, offsetBy, i), scrollElement, i)) {
2085
1995
  if (isInScrollArea(position, scrollElement, i)) {
2086
1996
  continue;
2087
1997
  }
@@ -2090,26 +2000,27 @@
2090
2000
  return false;
2091
2001
  }
2092
2002
 
2093
- if (flip === true || includes(flip, dirs[1 - i][1])) {
2094
- const newPos = attachToWithFlip(element, target, {
2095
- ...options,
2096
- attach: {
2097
- element: elAttach.map(flipDir).reverse(),
2098
- target: targetAttach.map(flipDir).reverse() },
2003
+ const newPos = getPosition(element, target, {
2004
+ ...options,
2005
+ attach: {
2006
+ element: elAttach.map(flipAxis).reverse(),
2007
+ target: targetAttach.map(flipAxis).reverse() },
2099
2008
 
2100
- offset: elOffset.reverse(),
2101
- flip: flip === true ? flip : [...flip, dirs[1 - i][1]],
2102
- recursion: true });
2009
+ offset: elOffset.reverse(),
2010
+ placement: placement.reverse(),
2011
+ recursion: true });
2103
2012
 
2104
2013
 
2105
- if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
2106
- return newPos;
2107
- }
2014
+ if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
2015
+ return newPos;
2108
2016
  }
2017
+
2018
+ continue;
2109
2019
  }
2110
2020
 
2111
- // Move
2112
- } else {
2021
+ // Shift
2022
+ } else if (placement[i] === 'shift') {
2023
+ const targetDim = offset(target[i]);
2113
2024
  offsetBy =
2114
2025
  clamp(
2115
2026
  clamp(position[start], viewport[start], viewport[end] - position[prop]),
@@ -2118,13 +2029,54 @@
2118
2029
  position[start];
2119
2030
  }
2120
2031
 
2121
- offsetPosition[start] = position[dir] = position[start] + offsetBy;
2122
- offsetPosition[end] += offsetBy;
2032
+ offsetPosition = applyOffset(offsetPosition, offsetBy, i);
2123
2033
  }
2124
2034
 
2125
2035
  return offsetPosition;
2126
2036
  }
2127
2037
 
2038
+ function attachTo(element, target, options) {
2039
+ let { attach, offset: offsetBy } = {
2040
+ attach: {
2041
+ element: ['left', 'top'],
2042
+ target: ['left', 'top'],
2043
+ ...options.attach },
2044
+
2045
+ offset: [0, 0],
2046
+ ...options };
2047
+
2048
+
2049
+ let elOffset = offset(element);
2050
+
2051
+ for (const [i, [prop,, start, end]] of Object.entries(dirs)) {
2052
+ const targetOffset =
2053
+ attach.target[i] === attach.element[i] ? offsetViewport(target[i]) : offset(target[i]);
2054
+
2055
+ elOffset = applyOffset(
2056
+ elOffset,
2057
+ targetOffset[start] -
2058
+ elOffset[start] +
2059
+ moveBy(attach.target[i], end, targetOffset[prop]) -
2060
+ moveBy(attach.element[i], end, elOffset[prop]) +
2061
+ +offsetBy[i],
2062
+ i);
2063
+
2064
+ }
2065
+ return elOffset;
2066
+ }
2067
+
2068
+ function applyOffset(position, offset, i) {
2069
+ const [, dir, start, end] = dirs[i];
2070
+ const newPos = { ...position };
2071
+ newPos[start] = position[dir] = position[start] + offset;
2072
+ newPos[end] += offset;
2073
+ return newPos;
2074
+ }
2075
+
2076
+ function moveBy(attach, end, dim) {
2077
+ return attach === 'center' ? dim / 2 : attach === end ? dim : 0;
2078
+ }
2079
+
2128
2080
  function getIntersectionArea() {
2129
2081
  let area = {};for (var _len = arguments.length, rects = new Array(_len), _key = 0; _key < _len; _key++) {rects[_key] = arguments[_key];}
2130
2082
  for (const rect of rects) {
@@ -2145,12 +2097,32 @@
2145
2097
  return position[start] >= viewport[start] && position[end] <= viewport[end];
2146
2098
  }
2147
2099
 
2148
- function intersectLine(dimA, dimB, dir) {
2149
- const [,, start, end] = dirs[dir];
2150
- return dimA[end] > dimB[start] && dimB[end] > dimA[start];
2100
+ function flip(element, target, _ref, i) {let { offset, attach } = _ref;
2101
+ return attachTo(element, target, {
2102
+ attach: {
2103
+ element: flipAttach(attach.element, i),
2104
+ target: flipAttach(attach.target, i) },
2105
+
2106
+ offset: flipOffset(offset, i) });
2107
+
2108
+ }
2109
+
2110
+ function flipAttach(attach, i) {
2111
+ const newAttach = [...attach];
2112
+ const index = dirs[i].indexOf(attach[i]);
2113
+ if (~index) {
2114
+ newAttach[i] = dirs[i][1 - index % 2 + 2];
2115
+ }
2116
+ return newAttach;
2117
+ }
2118
+
2119
+ function flipOffset(offset, i) {
2120
+ offset = [...offset];
2121
+ offset[i] *= -1;
2122
+ return offset;
2151
2123
  }
2152
2124
 
2153
- function flipDir(prop) {
2125
+ function flipAxis(prop) {
2154
2126
  for (let i = 0; i < dirs.length; i++) {
2155
2127
  const index = dirs[i].indexOf(prop);
2156
2128
  if (~index) {
@@ -2165,7 +2137,7 @@
2165
2137
  getImage: getImage,
2166
2138
  transition: transition,
2167
2139
  Transition: Transition,
2168
- animate: animate$1,
2140
+ animate: animate$2,
2169
2141
  Animation: Animation,
2170
2142
  attr: attr,
2171
2143
  hasAttr: hasAttr,
@@ -2295,10 +2267,8 @@
2295
2267
  findAll: findAll,
2296
2268
  escape: escape,
2297
2269
  css: css,
2298
- getCssVar: getCssVar,
2299
2270
  propName: propName,
2300
2271
  isInView: isInView,
2301
- scrollTop: scrollTop,
2302
2272
  scrollIntoView: scrollIntoView,
2303
2273
  scrolledOver: scrolledOver,
2304
2274
  scrollParents: scrollParents,
@@ -2621,7 +2591,7 @@
2621
2591
 
2622
2592
  value = props[key] === Boolean && value === '' ? true : coerce$1(props[key], value);
2623
2593
 
2624
- if (prop === 'target' && (!value || startsWith(value, '_'))) {
2594
+ if (prop === 'target' && startsWith(value, '_')) {
2625
2595
  continue;
2626
2596
  }
2627
2597
 
@@ -2632,7 +2602,7 @@
2632
2602
 
2633
2603
  for (const key in options) {
2634
2604
  const prop = camelize(key);
2635
- if (props[prop] !== undefined) {
2605
+ if (!isUndefined(props[prop])) {
2636
2606
  data$1[prop] = coerce$1(props[prop], options[key]);
2637
2607
  }
2638
2608
  }
@@ -2961,7 +2931,7 @@
2961
2931
  UIkit.data = '__uikit__';
2962
2932
  UIkit.prefix = 'uk-';
2963
2933
  UIkit.options = {};
2964
- UIkit.version = '3.14.4-dev.871ba3c05';
2934
+ UIkit.version = '3.14.4-dev.ae765cd84';
2965
2935
 
2966
2936
  globalAPI(UIkit);
2967
2937
  hooksAPI(UIkit);
@@ -3066,27 +3036,7 @@
3066
3036
  origin: false,
3067
3037
  transition: 'ease',
3068
3038
  clsEnter: 'uk-togglabe-enter',
3069
- clsLeave: 'uk-togglabe-leave',
3070
-
3071
- initProps: {
3072
- overflow: '',
3073
- maxHeight: '',
3074
- paddingTop: '',
3075
- paddingBottom: '',
3076
- marginTop: '',
3077
- marginBottom: '',
3078
- boxShadow: '' },
3079
-
3080
-
3081
- hideProps: {
3082
- overflow: 'hidden',
3083
- maxHeight: 0,
3084
- paddingTop: 0,
3085
- paddingBottom: 0,
3086
- marginTop: 0,
3087
- marginBottom: 0,
3088
- boxShadow: 'none' } },
3089
-
3039
+ clsLeave: 'uk-togglabe-leave' },
3090
3040
 
3091
3041
 
3092
3042
  computed: {
@@ -3095,7 +3045,7 @@
3095
3045
  },
3096
3046
 
3097
3047
  hasTransition(_ref2) {let { animation } = _ref2;
3098
- return startsWith(animation[0], 'slide');
3048
+ return ['slide', 'reveal'].some((transition) => startsWith(animation[0], transition));
3099
3049
  } },
3100
3050
 
3101
3051
 
@@ -3188,130 +3138,97 @@
3188
3138
  };
3189
3139
  }
3190
3140
 
3191
- function toggleTransition(cmp) {
3192
- switch (cmp.animation[0]) {
3193
- case 'slide-left':
3194
- return slideHorizontal(cmp);
3195
- case 'slide-right':
3196
- return slideHorizontal(cmp, true);}
3197
-
3198
- return slide(cmp);
3199
- }
3200
-
3201
- function slide(_ref4)
3202
-
3141
+ function toggleTransition(cmp) {var _cmp$animation$;
3142
+ const [mode = 'reveal', startProp = 'top'] = ((_cmp$animation$ = cmp.animation[0]) == null ? void 0 : _cmp$animation$.split('-')) || [];
3203
3143
 
3144
+ const dirs = [
3145
+ ['left', 'right'],
3146
+ ['top', 'bottom']];
3204
3147
 
3148
+ const dir = dirs[includes(dirs[0], startProp) ? 0 : 1];
3149
+ const end = dir[1] === startProp;
3150
+ const props = ['width', 'height'];
3151
+ const dimProp = props[dirs.indexOf(dir)];
3152
+ const marginProp = "margin-" + dir[0];
3153
+ const marginStartProp = "margin-" + startProp;
3205
3154
 
3155
+ return async (el, show) => {
3156
+ let { duration, velocity, transition, _toggle } = cmp;
3206
3157
 
3158
+ let currentDim = dimensions(el)[dimProp];
3207
3159
 
3208
-
3209
- {let { isToggled, duration, velocity, initProps, hideProps, transition, _toggle } = _ref4;
3210
- return (el, show) => {
3211
3160
  const inProgress = Transition.inProgress(el);
3212
- const inner =
3213
- !inProgress && el.hasChildNodes() ?
3214
- toFloat(css(el.firstElementChild, 'marginTop')) +
3215
- toFloat(css(el.lastElementChild, 'marginBottom')) :
3216
- 0;
3217
- const currentHeight = isVisible(el) ? toFloat(css(el, 'height')) + inner : 0;
3218
-
3219
- const props = inProgress ? css(el, Object.keys(initProps)) : show ? hideProps : initProps;
3220
-
3221
- Transition.cancel(el);
3161
+ await Transition.cancel(el);
3222
3162
 
3223
- if (!isToggled(el)) {
3163
+ if (show) {
3224
3164
  _toggle(el, true);
3225
3165
  }
3226
3166
 
3227
- css(el, 'maxHeight', '');
3228
-
3229
- // Update child components first
3230
- fastdom.flush();
3231
-
3232
- const endHeight = toFloat(css(el, 'height')) + inner;
3233
- duration = velocity * endHeight + duration;
3234
-
3235
- css(el, { ...props, maxHeight: currentHeight });
3236
-
3237
- return (
3238
- show ?
3239
- Transition.start(
3240
- el,
3241
- { ...initProps, overflow: 'hidden', maxHeight: endHeight },
3242
- duration * (1 - currentHeight / endHeight),
3243
- transition) :
3244
-
3245
- Transition.start(
3246
- el,
3247
- hideProps,
3248
- duration * (currentHeight / endHeight),
3249
- transition).
3250
- then(() => _toggle(el, false))).
3251
- then(() => css(el, initProps));
3252
- };
3253
- }
3167
+ const prevProps = Object.fromEntries(
3168
+ ['padding', 'border', 'width', 'height', 'overflow', marginProp, marginStartProp].map(
3169
+ (key) => [key, el.style[key]]));
3254
3170
 
3255
- function slideHorizontal(_ref5, right) {let { isToggled, duration, velocity, transition, _toggle } = _ref5;
3256
- return (el, show) => {
3257
- const visible = isVisible(el);
3258
- const marginLeft = toFloat(css(el, 'marginLeft'));
3259
3171
 
3260
- Transition.cancel(el);
3261
3172
 
3262
- const [scrollElement] = scrollParents(el);
3263
- css(scrollElement, 'overflowX', 'hidden');
3173
+ const dim = dimensions(el);
3174
+ const currentMargin = toFloat(css(el, marginProp));
3175
+ const marginStart = toFloat(css(el, marginStartProp));
3176
+ const endDim = dim[dimProp] + marginStart;
3264
3177
 
3265
- if (!isToggled(el)) {
3266
- _toggle(el, true);
3178
+ if (!inProgress && !show) {
3179
+ currentDim += marginStart;
3267
3180
  }
3268
3181
 
3269
- const width = toFloat(css(el, 'width'));
3270
- duration = velocity * width + duration;
3182
+ const [wrapper] = wrapInner(el, '<div>');
3183
+ css(wrapper, {
3184
+ boxSizing: 'border-box',
3185
+ height: dim.height,
3186
+ width: dim.width,
3187
+ ...css(el, [
3188
+ 'padding',
3189
+ 'borderTop',
3190
+ 'borderRight',
3191
+ 'borderBottom',
3192
+ 'borderLeft',
3193
+ 'borderImage',
3194
+ marginStartProp]) });
3271
3195
 
3272
- const percent = visible ? (width + marginLeft * (right ? -1 : 1)) / width * 100 : 0;
3273
- const offsetEl = offset(el);
3274
- const useClipPath = right ?
3275
- offsetEl.right < scrollElement.clientWidth :
3276
- Math.round(offsetEl.left) > 0;
3277
3196
 
3278
- css(el, {
3279
- clipPath: useClipPath ?
3280
- right ? "polygon(0 0," +
3281
- percent + "% 0," + percent + "% 100%,0 100%)" : "polygon(" + (
3282
- 100 - percent) + "% 0,100% 0,100% 100%," + (100 - percent) + "% 100%)" :
3283
- '',
3284
- marginLeft: (100 - percent) * (right ? 1 : -1) / 100 * width });
3285
3197
 
3198
+ css(el, {
3199
+ padding: 0,
3200
+ border: 0,
3201
+ [marginStartProp]: 0,
3202
+ width: dim.width,
3203
+ height: dim.height,
3204
+ overflow: 'hidden',
3205
+ [dimProp]: currentDim });
3286
3206
 
3287
- return (
3288
- show ?
3289
- Transition.start(
3290
- el,
3291
- {
3292
- clipPath: useClipPath ? "polygon(0 0,100% 0,100% 100%,0 100%)" : '',
3293
- marginLeft: 0 },
3294
3207
 
3295
- duration * (1 - percent / 100),
3296
- transition) :
3208
+ const percent = currentDim / endDim;
3209
+ duration = (velocity * endDim + duration) * (show ? 1 - percent : percent);
3210
+ const endProps = { [dimProp]: show ? endDim : 0 };
3297
3211
 
3298
- Transition.start(
3299
- el,
3300
- {
3301
- clipPath: useClipPath ?
3302
- right ? "polygon(0 0,0 0,0 100%,0 100%)" : "polygon(100% 0,100% 0,100% 100%,100% 100%)" :
3212
+ if (end) {
3213
+ css(el, marginProp, endDim - currentDim + currentMargin);
3214
+ endProps[marginProp] = show ? currentMargin : endDim + currentMargin;
3215
+ }
3303
3216
 
3217
+ if (!end ^ mode === 'reveal') {
3218
+ css(wrapper, marginProp, -endDim + currentDim);
3219
+ Transition.start(wrapper, { [marginProp]: show ? 0 : -endDim }, duration, transition);
3220
+ }
3304
3221
 
3305
- '',
3306
- marginLeft: (right ? 1 : -1) * width },
3222
+ try {
3223
+ await Transition.start(el, endProps, duration, transition);
3224
+ } finally {
3225
+ css(el, prevProps);
3226
+ unwrap(wrapper.firstChild);
3307
3227
 
3308
- duration * (percent / 100),
3309
- transition).
3310
- then(() => _toggle(el, false))).
3311
- then(() => {
3312
- css(scrollElement, 'overflowX', '');
3313
- css(el, { clipPath: '', marginLeft: '' });
3314
- });
3228
+ if (!show) {
3229
+ _toggle(el, false);
3230
+ }
3231
+ }
3315
3232
  };
3316
3233
  }
3317
3234
 
@@ -3336,6 +3253,7 @@
3336
3253
  mixins: [Class, Lazyload, Togglable],
3337
3254
 
3338
3255
  props: {
3256
+ animation: Boolean,
3339
3257
  targets: String,
3340
3258
  active: null,
3341
3259
  collapsible: Boolean,
@@ -3348,7 +3266,7 @@
3348
3266
  data: {
3349
3267
  targets: '> *',
3350
3268
  active: false,
3351
- animation: ['slide'],
3269
+ animation: true,
3352
3270
  collapsible: true,
3353
3271
  multiple: false,
3354
3272
  clsOpen: 'uk-open',
@@ -3394,7 +3312,7 @@
3394
3312
  hide(
3395
3313
  el,
3396
3314
  !hasClass(
3397
- this.items.find((item) => item.contains(el)),
3315
+ this.items.find((item) => within(el, item)),
3398
3316
  this.clsOpen));
3399
3317
 
3400
3318
 
@@ -3446,23 +3364,15 @@
3446
3364
  toggleClass(el, this.clsOpen, show);
3447
3365
  attr($(this.$props.toggle, el), 'aria-expanded', show);
3448
3366
 
3449
- const content = $("" + (el._wrapper ? '> * ' : '') + this.content, el);
3367
+ const content = $(this.content, el);
3450
3368
 
3451
- if (animate === false || !this.hasTransition) {
3369
+ if (animate === false || !this.animation) {
3370
+ content.hidden = !show;
3452
3371
  hide(content, !show);
3453
3372
  return;
3454
3373
  }
3455
3374
 
3456
- if (!el._wrapper) {
3457
- el._wrapper = wrapAll(content, "<div" + (show ? ' hidden' : '') + ">");
3458
- }
3459
-
3460
- hide(content, false);
3461
- await slide(this)(el._wrapper, show);
3462
- hide(content, !show);
3463
-
3464
- delete el._wrapper;
3465
- unwrap(content);
3375
+ await toggleTransition(this)(content, show);
3466
3376
 
3467
3377
  if (show) {
3468
3378
  const toggle = $(this.$props.toggle, el);
@@ -3488,18 +3398,17 @@
3488
3398
  args: 'animation',
3489
3399
 
3490
3400
  props: {
3401
+ animation: Boolean,
3491
3402
  close: String },
3492
3403
 
3493
3404
 
3494
3405
  data: {
3495
- animation: ['slide'],
3406
+ animation: true,
3496
3407
  selClose: '.uk-alert-close',
3497
- duration: 150,
3498
- hideProps: { opacity: 0, ...Togglable.data.hideProps } },
3408
+ duration: 150 },
3499
3409
 
3500
3410
 
3501
- events: [
3502
- {
3411
+ events: {
3503
3412
  name: 'click',
3504
3413
 
3505
3414
  delegate() {
@@ -3509,16 +3418,39 @@
3509
3418
  handler(e) {
3510
3419
  e.preventDefault();
3511
3420
  this.close();
3512
- } }],
3513
-
3421
+ } },
3514
3422
 
3515
3423
 
3516
3424
  methods: {
3517
3425
  async close() {
3518
- await this.toggleElement(this.$el);
3426
+ await this.toggleElement(this.$el, false, animate$1(this));
3519
3427
  this.$destroy(true);
3520
3428
  } } };
3521
3429
 
3430
+
3431
+
3432
+ function animate$1(_ref) {let { duration, transition, velocity } = _ref;
3433
+ return (el) => {
3434
+ const height = toFloat(css(el, 'height'));
3435
+ css(el, 'height', height);
3436
+ return Transition.start(
3437
+ el,
3438
+ {
3439
+ height: 0,
3440
+ marginTop: 0,
3441
+ marginBottom: 0,
3442
+ paddingTop: 0,
3443
+ paddingBottom: 0,
3444
+ borderTop: 0,
3445
+ borderBottom: 0,
3446
+ opacity: 0 },
3447
+
3448
+ velocity * height + duration,
3449
+ transition);
3450
+
3451
+ };
3452
+ }
3453
+
3522
3454
  var Video = {
3523
3455
  args: 'autoplay',
3524
3456
 
@@ -3667,13 +3599,17 @@
3667
3599
  props: {
3668
3600
  pos: String,
3669
3601
  offset: null,
3670
- flip: Boolean },
3602
+ flip: Boolean,
3603
+ shift: Boolean,
3604
+ inset: Boolean },
3671
3605
 
3672
3606
 
3673
3607
  data: {
3674
3608
  pos: "bottom-" + (isRtl ? 'right' : 'left'),
3609
+ offset: false,
3675
3610
  flip: true,
3676
- offset: false },
3611
+ shift: true,
3612
+ inset: false },
3677
3613
 
3678
3614
 
3679
3615
  connected() {
@@ -3685,19 +3621,24 @@
3685
3621
  methods: {
3686
3622
  positionAt(element, target, boundary) {
3687
3623
  let offset = [this.getPositionOffset(element), this.getShiftOffset(element)];
3624
+ const placement = [this.flip && 'flip', this.shift && 'shift'];
3688
3625
 
3689
3626
  const attach = {
3690
- element: [flipPosition(this.dir), this.align],
3627
+ element: [this.inset ? this.dir : flipPosition(this.dir), this.align],
3691
3628
  target: [this.dir, this.align] };
3692
3629
 
3693
3630
 
3694
3631
  if (this.axis === 'y') {
3695
3632
  for (const prop in attach) {
3696
- attach[prop] = attach[prop].reverse();
3633
+ attach[prop].reverse();
3697
3634
  }
3698
- offset = offset.reverse();
3635
+ offset.reverse();
3636
+ placement.reverse();
3699
3637
  }
3700
3638
 
3639
+ const [scrollElement] = scrollParents(element, /auto|scroll/);
3640
+ const { scrollTop, scrollLeft } = scrollElement;
3641
+
3701
3642
  // Ensure none positioned element does not generate scrollbars
3702
3643
  const elDim = dimensions(element);
3703
3644
  css(element, { top: -elDim.height, left: -elDim.width });
@@ -3706,93 +3647,88 @@
3706
3647
  attach,
3707
3648
  offset,
3708
3649
  boundary,
3709
- flip: this.flip,
3650
+ placement,
3710
3651
  viewportOffset: this.getViewportOffset(element) });
3711
3652
 
3653
+
3654
+ // Restore scroll position
3655
+ scrollElement.scrollTop = scrollTop;
3656
+ scrollElement.scrollLeft = scrollLeft;
3712
3657
  },
3713
3658
 
3714
3659
  getPositionOffset(element) {
3715
3660
  return (
3716
3661
  toPx(
3717
- this.offset === false ? getCssVar('position-offset', element) : this.offset,
3662
+ this.offset === false ? css(element, '--uk-position-offset') : this.offset,
3718
3663
  this.axis === 'x' ? 'width' : 'height',
3719
3664
  element) * (
3720
- includes(['left', 'top'], this.dir) ? -1 : 1));
3665
+
3666
+ includes(['left', 'top'], this.dir) ? -1 : 1) * (
3667
+ this.inset ? -1 : 1));
3721
3668
 
3722
3669
  },
3723
3670
 
3724
3671
  getShiftOffset(element) {
3725
- return includes(['center', 'justify', 'stretch'], this.align) ?
3672
+ return this.align === 'center' ?
3726
3673
  0 :
3727
3674
  toPx(
3728
- getCssVar('position-shift-offset', element),
3675
+ css(element, '--uk-position-shift-offset'),
3729
3676
  this.axis === 'y' ? 'width' : 'height',
3730
3677
  element) * (
3731
3678
  includes(['left', 'top'], this.align) ? 1 : -1);
3732
3679
  },
3733
3680
 
3734
3681
  getViewportOffset(element) {
3735
- return toPx(getCssVar('position-viewport-offset', element));
3682
+ return toPx(css(element, '--uk-position-viewport-offset'));
3736
3683
  } } };
3737
3684
 
3738
- let active$1;
3685
+ var Style = {
3686
+ beforeConnect() {
3687
+ this._style = attr(this.$el, 'style');
3688
+ },
3689
+
3690
+ disconnected() {
3691
+ attr(this.$el, 'style', this._style);
3692
+ } };
3739
3693
 
3740
- var drop = {
3741
- mixins: [Container, Lazyload, Position, Togglable],
3694
+ const active$1 = [];
3742
3695
 
3743
- args: 'pos',
3696
+ var Modal = {
3697
+ mixins: [Class, Container, Togglable],
3744
3698
 
3745
3699
  props: {
3746
- mode: 'list',
3747
- toggle: Boolean,
3748
- boundary: Boolean,
3749
- boundaryAlign: Boolean,
3750
- delayShow: Number,
3751
- delayHide: Number,
3752
- display: String,
3753
- clsDrop: String,
3754
- animateOut: Boolean },
3700
+ selPanel: String,
3701
+ selClose: String,
3702
+ escClose: Boolean,
3703
+ bgClose: Boolean,
3704
+ stack: Boolean },
3755
3705
 
3756
3706
 
3757
3707
  data: {
3758
- mode: ['click', 'hover'],
3759
- toggle: '- *',
3760
- boundary: true,
3761
- boundaryAlign: false,
3762
- delayShow: 0,
3763
- delayHide: 800,
3764
- display: null,
3765
- clsDrop: false,
3766
- animation: ['uk-animation-fade'],
3767
3708
  cls: 'uk-open',
3768
- container: false,
3769
- animateOut: false },
3709
+ escClose: true,
3710
+ bgClose: true,
3711
+ overlay: true,
3712
+ stack: false },
3770
3713
 
3771
3714
 
3772
- created() {
3773
- this.tracker = new MouseTracker();
3774
- },
3715
+ computed: {
3716
+ panel(_ref, $el) {let { selPanel } = _ref;
3717
+ return $(selPanel, $el);
3718
+ },
3775
3719
 
3776
- beforeConnect() {
3777
- this.clsDrop = this.$props.clsDrop || "uk-" + this.$options.name;
3778
- },
3720
+ transitionElement() {
3721
+ return this.panel;
3722
+ },
3779
3723
 
3780
- connected() {
3781
- addClass(this.$el, this.clsDrop);
3724
+ bgClose(_ref2) {let { bgClose } = _ref2;
3725
+ return bgClose && this.panel;
3726
+ } },
3782
3727
 
3783
- if (this.toggle && !this.target) {
3784
- this.target = this.$create('toggle', query(this.toggle, this.$el), {
3785
- target: this.$el,
3786
- mode: this.mode }).
3787
- $el;
3788
- attr(this.target, 'aria-haspopup', true);
3789
- this.lazyload(this.target);
3790
- }
3791
- },
3792
3728
 
3793
- disconnected() {
3794
- if (this.isActive()) {
3795
- active$1 = null;
3729
+ beforeDisconnect() {
3730
+ if (includes(active$1, this)) {
3731
+ this.toggleElement(this.$el, false, false);
3796
3732
  }
3797
3733
  },
3798
3734
 
@@ -3801,1776 +3737,1940 @@
3801
3737
  name: 'click',
3802
3738
 
3803
3739
  delegate() {
3804
- return "." + this.clsDrop + "-close";
3740
+ return this.selClose;
3805
3741
  },
3806
3742
 
3807
3743
  handler(e) {
3808
3744
  e.preventDefault();
3809
- this.hide(false);
3745
+ this.hide();
3810
3746
  } },
3811
3747
 
3812
3748
 
3813
3749
  {
3814
- name: 'click',
3750
+ name: 'toggle',
3815
3751
 
3816
- delegate() {
3817
- return 'a[href^="#"]';
3818
- },
3752
+ self: true,
3819
3753
 
3820
- handler(_ref) {let { defaultPrevented, current: { hash } } = _ref;
3821
- if (!defaultPrevented && hash && !within(hash, this.$el)) {
3822
- this.hide(false);
3754
+ handler(e) {
3755
+ if (e.defaultPrevented) {
3756
+ return;
3823
3757
  }
3824
- } },
3825
-
3826
3758
 
3827
- {
3828
- name: 'beforescroll',
3759
+ e.preventDefault();
3829
3760
 
3830
- handler() {
3831
- this.hide(false);
3761
+ if (this.isToggled() === includes(active$1, this)) {
3762
+ this.toggle();
3763
+ }
3832
3764
  } },
3833
3765
 
3834
3766
 
3835
3767
  {
3836
- name: 'toggle',
3768
+ name: 'beforeshow',
3837
3769
 
3838
3770
  self: true,
3839
3771
 
3840
- handler(e, toggle) {
3841
- e.preventDefault();
3772
+ handler(e) {
3773
+ if (includes(active$1, this)) {
3774
+ return false;
3775
+ }
3842
3776
 
3843
- if (this.isToggled()) {
3844
- this.hide(false);
3777
+ if (!this.stack && active$1.length) {
3778
+ Promise.all(active$1.map((modal) => modal.hide())).then(this.show);
3779
+ e.preventDefault();
3845
3780
  } else {
3846
- this.show(toggle == null ? void 0 : toggle.$el, false);
3781
+ active$1.push(this);
3847
3782
  }
3848
3783
  } },
3849
3784
 
3850
3785
 
3851
3786
  {
3852
- name: 'toggleshow',
3787
+ name: 'show',
3853
3788
 
3854
3789
  self: true,
3855
3790
 
3856
- handler(e, toggle) {
3857
- e.preventDefault();
3858
- this.show(toggle == null ? void 0 : toggle.$el);
3859
- } },
3860
-
3861
-
3862
- {
3863
- name: 'togglehide',
3864
-
3865
- self: true,
3866
-
3867
- handler(e) {
3868
- e.preventDefault();
3869
- if (!matches(this.$el, ':focus,:hover')) {
3870
- this.hide();
3871
- }
3872
- } },
3873
-
3874
-
3875
- {
3876
- name: pointerEnter + " focusin",
3877
-
3878
- filter() {
3879
- return includes(this.mode, 'hover');
3880
- },
3881
-
3882
- handler(e) {
3883
- if (!isTouch(e)) {
3884
- this.clearTimers();
3885
- }
3886
- } },
3887
-
3888
-
3889
- {
3890
- name: pointerLeave + " focusout",
3791
+ handler() {
3792
+ once(
3793
+ this.$el,
3794
+ 'hide',
3795
+ on(document, 'focusin', (e) => {
3796
+ if (last(active$1) === this && !within(e.target, this.$el)) {
3797
+ this.$el.focus();
3798
+ }
3799
+ }));
3891
3800
 
3892
- filter() {
3893
- return includes(this.mode, 'hover');
3894
- },
3895
3801
 
3896
- handler(e) {
3897
- if (!isTouch(e) && e.relatedTarget) {
3898
- this.hide();
3802
+ if (this.overlay) {
3803
+ once(this.$el, 'hidden', preventOverscroll(this.$el));
3804
+ once(this.$el, 'hidden', preventBackgroundScroll());
3899
3805
  }
3900
- } },
3901
-
3902
3806
 
3903
- {
3904
- name: 'toggled',
3905
-
3906
- self: true,
3907
-
3908
- handler(e, toggled) {
3909
- if (!toggled) {
3910
- return;
3807
+ if (this.stack) {
3808
+ css(this.$el, 'zIndex', toFloat(css(this.$el, 'zIndex')) + active$1.length);
3911
3809
  }
3912
3810
 
3913
- this.clearTimers();
3914
- this.position();
3915
- } },
3916
-
3917
-
3918
- {
3919
- name: 'show',
3920
-
3921
- self: true,
3922
-
3923
- handler() {
3924
- active$1 = this;
3811
+ addClass(document.documentElement, this.clsPage);
3925
3812
 
3926
- this.tracker.init();
3813
+ if (this.bgClose) {
3814
+ once(
3815
+ this.$el,
3816
+ 'hide',
3817
+ on(document, pointerDown, (_ref3) => {let { target } = _ref3;
3818
+ if (
3819
+ last(active$1) !== this ||
3820
+ this.overlay && !within(target, this.$el) ||
3821
+ within(target, this.panel))
3822
+ {
3823
+ return;
3824
+ }
3927
3825
 
3928
- for (const handler of [
3929
- on(
3930
- document,
3931
- pointerDown,
3932
- (_ref2) => {let { target } = _ref2;return (
3933
- !within(target, this.$el) &&
3934
3826
  once(
3935
3827
  document,
3936
3828
  pointerUp + " " + pointerCancel + " scroll",
3937
- (_ref3) => {let { defaultPrevented, type, target: newTarget } = _ref3;
3829
+ (_ref4) => {let { defaultPrevented, type, target: newTarget } = _ref4;
3938
3830
  if (
3939
3831
  !defaultPrevented &&
3940
3832
  type === pointerUp &&
3941
- target === newTarget &&
3942
- !(this.target && within(target, this.target)))
3833
+ target === newTarget)
3943
3834
  {
3944
- this.hide(false);
3835
+ this.hide();
3945
3836
  }
3946
3837
  },
3947
- true));}),
3948
-
3949
-
3838
+ true);
3950
3839
 
3951
- on(document, 'keydown', (e) => {
3952
- if (e.keyCode === 27) {
3953
- this.hide(false);
3954
- }
3955
- }),
3840
+ }),
3841
+ { self: true });
3956
3842
 
3957
- ...(this.display === 'static' && this.align !== 'stretch' ?
3958
- [] :
3959
- (() => {
3960
- const handler = () => this.$emit();
3961
- return [
3962
- on(window, 'resize', handler),
3963
- on(document, 'scroll', handler, true),
3964
- (() => {
3965
- const observer = observeResize(
3966
- scrollParents(this.$el),
3967
- handler);
3843
+ }
3968
3844
 
3969
- return () => observer.disconnect();
3970
- })()];
3845
+ if (this.escClose) {
3846
+ once(
3847
+ this.$el,
3848
+ 'hide',
3849
+ on(document, 'keydown', (e) => {
3850
+ if (e.keyCode === 27 && last(active$1) === this) {
3851
+ this.hide();
3852
+ }
3853
+ }),
3854
+ { self: true });
3971
3855
 
3972
- })())])
3973
- {
3974
- once(this.$el, 'hide', handler, { self: true });
3975
3856
  }
3976
3857
  } },
3977
3858
 
3978
3859
 
3979
3860
  {
3980
- name: 'beforehide',
3861
+ name: 'shown',
3981
3862
 
3982
3863
  self: true,
3983
3864
 
3984
3865
  handler() {
3985
- this.clearTimers();
3866
+ if (!isFocusable(this.$el)) {
3867
+ attr(this.$el, 'tabindex', '-1');
3868
+ }
3869
+
3870
+ if (!$(':focus', this.$el)) {
3871
+ this.$el.focus();
3872
+ }
3986
3873
  } },
3987
3874
 
3988
3875
 
3989
3876
  {
3990
- name: 'hide',
3877
+ name: 'hidden',
3991
3878
 
3992
- handler(_ref4) {let { target } = _ref4;
3993
- if (this.$el !== target) {
3994
- active$1 =
3995
- active$1 === null && within(target, this.$el) && this.isToggled() ?
3996
- this :
3997
- active$1;
3998
- return;
3879
+ self: true,
3880
+
3881
+ handler() {
3882
+ if (includes(active$1, this)) {
3883
+ active$1.splice(active$1.indexOf(this), 1);
3999
3884
  }
4000
3885
 
4001
- active$1 = this.isActive() ? null : active$1;
4002
- this.tracker.cancel();
3886
+ css(this.$el, 'zIndex', '');
3887
+
3888
+ if (!active$1.some((modal) => modal.clsPage === this.clsPage)) {
3889
+ removeClass(document.documentElement, this.clsPage);
3890
+ }
4003
3891
  } }],
4004
3892
 
4005
3893
 
4006
3894
 
4007
- update: {
4008
- write() {
4009
- if (this.isToggled() && !hasClass(this.$el, this.clsEnter)) {
4010
- this.position();
4011
- }
4012
- } },
3895
+ methods: {
3896
+ toggle() {
3897
+ return this.isToggled() ? this.hide() : this.show();
3898
+ },
4013
3899
 
3900
+ show() {
3901
+ if (this.container && parent(this.$el) !== this.container) {
3902
+ append(this.container, this.$el);
3903
+ return new Promise((resolve) =>
3904
+ requestAnimationFrame(() => this.show().then(resolve)));
4014
3905
 
4015
- methods: {
4016
- show(target, delay) {if (target === void 0) {target = this.target;}if (delay === void 0) {delay = true;}
4017
- if (this.isToggled() && target && this.target && target !== this.target) {
4018
- this.hide(false, false);
4019
3906
  }
4020
3907
 
4021
- this.target = target;
3908
+ return this.toggleElement(this.$el, true, animate(this));
3909
+ },
4022
3910
 
4023
- this.clearTimers();
3911
+ hide() {
3912
+ return this.toggleElement(this.$el, false, animate(this));
3913
+ } } };
4024
3914
 
4025
- if (this.isActive()) {
4026
- return;
4027
- }
4028
3915
 
4029
- if (active$1) {
4030
- if (delay && active$1.isDelaying) {
4031
- this.showTimer = setTimeout(() => matches(target, ':hover') && this.show(), 10);
4032
- return;
4033
- }
4034
3916
 
4035
- let prev;
4036
- while (active$1 && prev !== active$1 && !within(this.$el, active$1.$el)) {
4037
- prev = active$1;
4038
- active$1.hide(false, false);
4039
- }
4040
- }
3917
+ function animate(_ref5) {let { transitionElement, _toggle } = _ref5;
3918
+ return (el, show) =>
3919
+ new Promise((resolve, reject) =>
3920
+ once(el, 'show hide', () => {
3921
+ el._reject == null ? void 0 : el._reject();
3922
+ el._reject = reject;
4041
3923
 
4042
- if (this.container && parent(this.$el) !== this.container) {
4043
- append(this.container, this.$el);
4044
- }
3924
+ _toggle(el, show);
4045
3925
 
4046
- this.showTimer = setTimeout(
4047
- () => this.toggleElement(this.$el, true),
4048
- delay && this.delayShow || 0);
3926
+ const off = once(
3927
+ transitionElement,
3928
+ 'transitionstart',
3929
+ () => {
3930
+ once(transitionElement, 'transitionend transitioncancel', resolve, {
3931
+ self: true });
4049
3932
 
3933
+ clearTimeout(timer);
4050
3934
  },
3935
+ { self: true });
4051
3936
 
4052
- hide(delay, animate) {if (delay === void 0) {delay = true;}if (animate === void 0) {animate = true;}
4053
- const hide = () => this.toggleElement(this.$el, false, this.animateOut && animate);
4054
3937
 
4055
- this.clearTimers();
3938
+ const timer = setTimeout(() => {
3939
+ off();
3940
+ resolve();
3941
+ }, toMs(css(transitionElement, 'transitionDuration')));
3942
+ })).
3943
+ then(() => delete el._reject);
3944
+ }
4056
3945
 
4057
- this.isDelaying = getPositionedElements(this.$el).some((el) =>
4058
- this.tracker.movesTo(el));
3946
+ function toMs(time) {
3947
+ return time ? endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000 : 0;
3948
+ }
4059
3949
 
3950
+ function preventOverscroll(el) {
3951
+ if (CSS.supports('overscroll-behavior', 'contain')) {
3952
+ const elements = filterChildren(el, (child) => /auto|scroll/.test(css(child, 'overflow')));
3953
+ css(elements, 'overscrollBehavior', 'contain');
3954
+ return () => css(elements, 'overscrollBehavior', '');
3955
+ }
4060
3956
 
4061
- if (delay && this.isDelaying) {
4062
- this.hideTimer = setTimeout(this.hide, 50);
4063
- } else if (delay && this.delayHide) {
4064
- this.hideTimer = setTimeout(hide, this.delayHide);
4065
- } else {
4066
- hide();
4067
- }
4068
- },
3957
+ let startClientY;
4069
3958
 
4070
- clearTimers() {
4071
- clearTimeout(this.showTimer);
4072
- clearTimeout(this.hideTimer);
4073
- this.showTimer = null;
4074
- this.hideTimer = null;
4075
- this.isDelaying = false;
4076
- },
3959
+ const events = [
3960
+ on(
3961
+ el,
3962
+ 'touchstart',
3963
+ (_ref6) => {let { targetTouches } = _ref6;
3964
+ if (targetTouches.length === 1) {
3965
+ startClientY = targetTouches[0].clientY;
3966
+ }
3967
+ },
3968
+ { passive: true }),
4077
3969
 
4078
- isActive() {
4079
- return active$1 === this;
4080
- },
4081
3970
 
4082
- position() {
4083
- removeClass(this.$el, this.clsDrop + "-stack");
4084
- toggleClass(this.$el, this.clsDrop + "-boundary", this.boundaryAlign);
4085
- toggleClass(this.$el, this.clsDrop + "-stretch", this.align === 'stretch');
3971
+ on(
3972
+ el,
3973
+ 'touchmove',
3974
+ (e) => {
3975
+ if (e.targetTouches.length !== 1) {
3976
+ return;
3977
+ }
4086
3978
 
4087
- const boundary = query(this.boundary, this.$el);
4088
- const target = boundary && this.boundaryAlign ? boundary : this.target;
4089
- const [scrollParent] = scrollParents(
4090
- boundary && this.boundaryAlign ? boundary : this.$el);
3979
+ let [scrollParent] = scrollParents(e.target, /auto|scroll/);
3980
+ if (!within(scrollParent, el)) {
3981
+ scrollParent = el;
3982
+ }
4091
3983
 
4092
- const scrollParentOffset = offset(scrollParent);
4093
- const boundaryOffset = boundary ? offset(boundary) : scrollParentOffset;
4094
- const viewportOffset = this.getViewportOffset(this.$el);
3984
+ const clientY = e.targetTouches[0].clientY - startClientY;
3985
+ const { scrollTop, scrollHeight, clientHeight } = scrollParent;
4095
3986
 
4096
- css(this.$el, 'maxWidth', '');
4097
- const maxWidth = scrollParentOffset.width - 2 * viewportOffset;
3987
+ if (
3988
+ clientHeight >= scrollHeight ||
3989
+ scrollTop === 0 && clientY > 0 ||
3990
+ scrollHeight - scrollTop <= clientHeight && clientY < 0)
3991
+ {
3992
+ e.cancelable && e.preventDefault();
3993
+ }
3994
+ },
3995
+ { passive: false })];
4098
3996
 
4099
- if (this.align === 'justify') {
4100
- const prop = this.axis === 'y' ? 'width' : 'height';
4101
- css(
4102
- this.$el,
4103
- prop,
4104
- Math.min(
4105
- (boundary ? boundaryOffset : offset(this.target))[prop],
4106
- scrollParentOffset[prop] - 2 * viewportOffset));
4107
-
4108
-
4109
- } else if (this.align === 'stretch') {
4110
- this.flip = this.axis === 'y' ? 'x' : 'y';
4111
- this.display = 'static';
4112
-
4113
- const viewport = offsetViewport(scrollParent);
4114
- const targetDim = offset(target);
4115
- const elOffset = Math.abs(this.getPositionOffset(this.$el)) + viewportOffset;
4116
-
4117
- css(this.$el, {
4118
- width:
4119
- this.axis === 'y' ?
4120
- viewport.width :
4121
- (this.dir === 'left' ?
4122
- targetDim.left - viewport.left :
4123
- viewport.right - targetDim.right) - elOffset,
4124
- height:
4125
- this.axis === 'x' ?
4126
- viewport.height :
4127
- (this.dir === 'top' ?
4128
- targetDim.top - viewport.top :
4129
- viewport.bottom - targetDim.bottom) - elOffset });
4130
-
4131
- } else if (this.$el.offsetWidth > maxWidth) {
4132
- addClass(this.$el, this.clsDrop + "-stack");
4133
- }
4134
3997
 
4135
- css(this.$el, 'maxWidth', maxWidth);
4136
3998
 
4137
- this.positionAt(this.$el, target, boundary);
4138
- } } };
3999
+ return () => events.forEach((fn) => fn());
4000
+ }
4139
4001
 
4002
+ let prevented;
4003
+ function preventBackgroundScroll() {
4004
+ if (prevented) {
4005
+ return noop;
4006
+ }
4007
+ prevented = true;
4008
+ const { body, documentElement } = document;
4009
+ css(body, {
4010
+ overflowY: width(window) > documentElement.clientWidth ? 'scroll' : '',
4011
+ touchAction: 'none' });
4140
4012
 
4013
+ css(documentElement, 'overflowY', 'hidden');
4014
+ return () => {
4015
+ prevented = false;
4016
+ css(documentElement, 'overflowY', '');
4017
+ css(body, { overflowY: '', touchAction: '' });
4018
+ };
4019
+ }
4141
4020
 
4142
- function getPositionedElements(el) {
4143
- const result = [];
4144
- apply(el, (el) => css(el, 'position') !== 'static' && result.push(el));
4145
- return result;
4021
+ function filterChildren(el, fn) {
4022
+ const children = [];
4023
+ apply(el, (node) => {
4024
+ if (fn(node)) {
4025
+ children.push(node);
4026
+ }
4027
+ });
4028
+ return children;
4146
4029
  }
4147
4030
 
4148
- var formCustom = {
4149
- mixins: [Class],
4031
+ let active;
4150
4032
 
4151
- args: 'target',
4033
+ var drop = {
4034
+ mixins: [Container, Lazyload, Position, Style, Togglable],
4035
+
4036
+ args: 'pos',
4152
4037
 
4153
4038
  props: {
4154
- target: Boolean },
4039
+ mode: 'list',
4040
+ toggle: Boolean,
4041
+ boundary: Boolean,
4042
+ target: Boolean,
4043
+ targetX: Boolean,
4044
+ targetY: Boolean,
4045
+ stretch: Boolean,
4046
+ delayShow: Number,
4047
+ delayHide: Number,
4048
+ display: String,
4049
+ clsDrop: String,
4050
+ animateOut: Boolean,
4051
+ bgScroll: Boolean },
4155
4052
 
4156
4053
 
4157
4054
  data: {
4158
- target: false },
4055
+ mode: ['click', 'hover'],
4056
+ toggle: '- *',
4057
+ boundary: false,
4058
+ target: false,
4059
+ targetX: false,
4060
+ targetY: false,
4061
+ stretch: false,
4062
+ delayShow: 0,
4063
+ delayHide: 800,
4064
+ display: null,
4065
+ clsDrop: false,
4066
+ animateOut: false,
4067
+ bgScroll: true,
4068
+ animation: ['uk-animation-fade'],
4069
+ cls: 'uk-open',
4070
+ container: false },
4159
4071
 
4160
4072
 
4161
4073
  computed: {
4162
- input(_, $el) {
4163
- return $(selInput, $el);
4164
- },
4074
+ target(_ref, $el) {let { target, targetX, targetY } = _ref;
4075
+ targetX = targetX || target || this.targetEl;
4076
+ targetY = targetY || target || this.targetEl;
4165
4077
 
4166
- state() {
4167
- return this.input.nextElementSibling;
4168
- },
4169
-
4170
- target(_ref, $el) {let { target } = _ref;
4171
- return (
4172
- target && (
4173
- target === true && parent(this.input) === $el && this.input.nextElementSibling ||
4174
- $(target, $el)));
4078
+ return [
4079
+ targetX === true ? window : query(targetX, $el),
4080
+ targetY === true ? window : query(targetY, $el)];
4175
4081
 
4176
4082
  } },
4177
4083
 
4178
4084
 
4179
- update() {var _input$files;
4180
- const { target, input } = this;
4085
+ created() {
4086
+ this.tracker = new MouseTracker();
4087
+ },
4181
4088
 
4182
- if (!target) {
4183
- return;
4184
- }
4089
+ beforeConnect() {
4090
+ this.clsDrop = this.$props.clsDrop || "uk-" + this.$options.name;
4091
+ },
4185
4092
 
4186
- let option;
4187
- const prop = isInput(target) ? 'value' : 'textContent';
4188
- const prev = target[prop];
4189
- const value = (_input$files = input.files) != null && _input$files[0] ?
4190
- input.files[0].name :
4191
- matches(input, 'select') && (
4192
- option = $$('option', input).filter((el) => el.selected)[0]) // eslint-disable-line prefer-destructuring
4193
- ? option.textContent :
4194
- input.value;
4093
+ connected() {
4094
+ addClass(this.$el, this.clsDrop);
4195
4095
 
4196
- if (prev !== value) {
4197
- target[prop] = value;
4096
+ if (this.toggle && !this.targetEl) {
4097
+ this.targetEl = this.$create('toggle', query(this.toggle, this.$el), {
4098
+ target: this.$el,
4099
+ mode: this.mode }).
4100
+ $el;
4101
+ attr(this.targetEl, 'aria-haspopup', true);
4102
+ this.lazyload(this.targetEl);
4103
+ }
4104
+ },
4105
+
4106
+ disconnected() {
4107
+ if (this.isActive()) {
4108
+ active = null;
4198
4109
  }
4199
4110
  },
4200
4111
 
4201
4112
  events: [
4202
4113
  {
4203
- name: 'change',
4114
+ name: 'click',
4204
4115
 
4205
- handler() {
4206
- this.$emit();
4116
+ delegate() {
4117
+ return "." + this.clsDrop + "-close";
4118
+ },
4119
+
4120
+ handler(e) {
4121
+ e.preventDefault();
4122
+ this.hide(false);
4207
4123
  } },
4208
4124
 
4209
4125
 
4210
4126
  {
4211
- name: 'reset',
4127
+ name: 'click',
4212
4128
 
4213
- el() {
4214
- return closest(this.$el, 'form');
4129
+ delegate() {
4130
+ return 'a[href^="#"]';
4215
4131
  },
4216
4132
 
4217
- handler() {
4218
- this.$emit();
4219
- } }] };
4220
-
4221
- var Margin = {
4222
- mixins: [Resize],
4133
+ handler(_ref2) {let { defaultPrevented, current: { hash } } = _ref2;
4134
+ if (!defaultPrevented && hash && !within(hash, this.$el)) {
4135
+ this.hide(false);
4136
+ }
4137
+ } },
4223
4138
 
4224
- props: {
4225
- margin: String,
4226
- firstColumn: Boolean },
4227
4139
 
4140
+ {
4141
+ name: 'beforescroll',
4228
4142
 
4229
- data: {
4230
- margin: 'uk-margin-small-top',
4231
- firstColumn: 'uk-first-column' },
4143
+ handler() {
4144
+ this.hide(false);
4145
+ } },
4232
4146
 
4233
4147
 
4234
- resizeTargets() {
4235
- return [this.$el, ...toArray(this.$el.children)];
4236
- },
4148
+ {
4149
+ name: 'toggle',
4237
4150
 
4238
- connected() {
4239
- this.registerObserver(
4240
- observeMutation(this.$el, () => this.$reset(), {
4241
- childList: true }));
4151
+ self: true,
4242
4152
 
4153
+ handler(e, toggle) {
4154
+ e.preventDefault();
4243
4155
 
4244
- },
4156
+ if (this.isToggled()) {
4157
+ this.hide(false);
4158
+ } else {
4159
+ this.show(toggle == null ? void 0 : toggle.$el, false);
4160
+ }
4161
+ } },
4245
4162
 
4246
- update: {
4247
- read() {
4248
- const rows = getRows(this.$el.children);
4249
4163
 
4250
- return {
4251
- rows,
4252
- columns: getColumns(rows) };
4164
+ {
4165
+ name: 'toggleshow',
4253
4166
 
4254
- },
4167
+ self: true,
4255
4168
 
4256
- write(_ref) {let { columns, rows } = _ref;
4257
- for (const row of rows) {
4258
- for (const column of row) {
4259
- toggleClass(column, this.margin, rows[0] !== row);
4260
- toggleClass(column, this.firstColumn, columns[0].includes(column));
4261
- }
4262
- }
4263
- },
4169
+ handler(e, toggle) {
4170
+ e.preventDefault();
4171
+ this.show(toggle == null ? void 0 : toggle.$el);
4172
+ } },
4264
4173
 
4265
- events: ['resize'] } };
4266
4174
 
4175
+ {
4176
+ name: 'togglehide',
4267
4177
 
4178
+ self: true,
4268
4179
 
4269
- function getRows(items) {
4270
- return sortBy(items, 'top', 'bottom');
4271
- }
4180
+ handler(e) {
4181
+ e.preventDefault();
4182
+ if (!matches(this.$el, ':focus,:hover')) {
4183
+ this.hide();
4184
+ }
4185
+ } },
4272
4186
 
4273
- function getColumns(rows) {
4274
- const columns = [];
4275
4187
 
4276
- for (const row of rows) {
4277
- const sorted = sortBy(row, 'left', 'right');
4278
- for (let j = 0; j < sorted.length; j++) {
4279
- columns[j] = columns[j] ? columns[j].concat(sorted[j]) : sorted[j];
4280
- }
4281
- }
4188
+ {
4189
+ name: pointerEnter + " focusin",
4282
4190
 
4283
- return isRtl ? columns.reverse() : columns;
4284
- }
4191
+ filter() {
4192
+ return includes(this.mode, 'hover');
4193
+ },
4285
4194
 
4286
- function sortBy(items, startProp, endProp) {
4287
- const sorted = [[]];
4195
+ handler(e) {
4196
+ if (!isTouch(e)) {
4197
+ this.clearTimers();
4198
+ }
4199
+ } },
4288
4200
 
4289
- for (const el of items) {
4290
- if (!isVisible(el)) {
4291
- continue;
4292
- }
4293
4201
 
4294
- let dim = getOffset(el);
4202
+ {
4203
+ name: pointerLeave + " focusout",
4295
4204
 
4296
- for (let i = sorted.length - 1; i >= 0; i--) {
4297
- const current = sorted[i];
4205
+ filter() {
4206
+ return includes(this.mode, 'hover');
4207
+ },
4298
4208
 
4299
- if (!current[0]) {
4300
- current.push(el);
4301
- break;
4209
+ handler(e) {
4210
+ if (!isTouch(e) && e.relatedTarget) {
4211
+ this.hide();
4302
4212
  }
4213
+ } },
4303
4214
 
4304
- let startDim;
4305
- if (current[0].offsetParent === el.offsetParent) {
4306
- startDim = getOffset(current[0]);
4307
- } else {
4308
- dim = getOffset(el, true);
4309
- startDim = getOffset(current[0], true);
4310
- }
4311
4215
 
4312
- if (dim[startProp] >= startDim[endProp] - 1 && dim[startProp] !== startDim[startProp]) {
4313
- sorted.push([el]);
4314
- break;
4315
- }
4216
+ {
4217
+ name: 'toggled',
4316
4218
 
4317
- if (dim[endProp] - 1 > startDim[startProp] || dim[startProp] === startDim[startProp]) {
4318
- current.push(el);
4319
- break;
4320
- }
4219
+ self: true,
4321
4220
 
4322
- if (i === 0) {
4323
- sorted.unshift([el]);
4324
- break;
4221
+ handler(e, toggled) {
4222
+ if (!toggled) {
4223
+ return;
4325
4224
  }
4326
- }
4327
- }
4328
4225
 
4329
- return sorted;
4330
- }
4226
+ this.clearTimers();
4227
+ this.position();
4228
+ } },
4331
4229
 
4332
- function getOffset(element, offset) {if (offset === void 0) {offset = false;}
4333
- let { offsetTop, offsetLeft, offsetHeight, offsetWidth } = element;
4334
4230
 
4335
- if (offset) {
4336
- [offsetTop, offsetLeft] = offsetPosition(element);
4337
- }
4231
+ {
4232
+ name: 'show',
4338
4233
 
4339
- return {
4340
- top: offsetTop,
4341
- left: offsetLeft,
4342
- bottom: offsetTop + offsetHeight,
4343
- right: offsetLeft + offsetWidth };
4234
+ self: true,
4344
4235
 
4345
- }
4236
+ handler() {
4237
+ active = this;
4346
4238
 
4347
- var Scroll = {
4348
- connected() {
4349
- registerScrollListener(this._uid, () => this.$emit('scroll'));
4350
- },
4351
-
4352
- disconnected() {
4353
- unregisterScrollListener(this._uid);
4354
- } };
4239
+ this.tracker.init();
4355
4240
 
4241
+ for (const handler of [
4242
+ on(
4243
+ document,
4244
+ pointerDown,
4245
+ (_ref3) => {let { target } = _ref3;return (
4246
+ !within(target, this.$el) &&
4247
+ once(
4248
+ document,
4249
+ pointerUp + " " + pointerCancel + " scroll",
4250
+ (_ref4) => {let { defaultPrevented, type, target: newTarget } = _ref4;
4251
+ if (
4252
+ !defaultPrevented &&
4253
+ type === pointerUp &&
4254
+ target === newTarget &&
4255
+ !(this.targetEl && within(target, this.targetEl)))
4256
+ {
4257
+ this.hide(false);
4258
+ }
4259
+ },
4260
+ true));}),
4356
4261
 
4357
- const scrollListeners = new Map();
4358
- let unbindScrollListener;
4359
- function registerScrollListener(id, listener) {
4360
- unbindScrollListener =
4361
- unbindScrollListener ||
4362
- on(window, 'scroll', () => scrollListeners.forEach((listener) => listener()), {
4363
- passive: true,
4364
- capture: true });
4365
4262
 
4366
4263
 
4367
- scrollListeners.set(id, listener);
4368
- }
4264
+ on(document, 'keydown', (e) => {
4265
+ if (e.keyCode === 27) {
4266
+ this.hide(false);
4267
+ }
4268
+ }),
4369
4269
 
4370
- function unregisterScrollListener(id) {
4371
- scrollListeners.delete(id);
4372
- if (unbindScrollListener && !scrollListeners.size) {
4373
- unbindScrollListener();
4374
- unbindScrollListener = null;
4375
- }
4376
- }
4270
+ ...(this.bgScroll ?
4271
+ [] :
4272
+ [preventOverscroll(this.$el), preventBackgroundScroll()]),
4377
4273
 
4378
- var grid = {
4379
- extends: Margin,
4274
+ ...(this.display === 'static' ?
4275
+ [] :
4276
+ (() => {
4277
+ const handler = () => this.$emit();
4278
+ return [
4279
+ on(window, 'resize', handler),
4280
+ on([document, scrollParents(this.$el)], 'scroll', handler),
4281
+ (() => {
4282
+ const observer = observeResize(
4283
+ scrollParents(this.$el),
4284
+ handler);
4380
4285
 
4381
- mixins: [Class, Scroll],
4286
+ return () => observer.disconnect();
4287
+ })()];
4382
4288
 
4383
- name: 'grid',
4289
+ })())])
4290
+ {
4291
+ once(this.$el, 'hide', handler, { self: true });
4292
+ }
4293
+ } },
4384
4294
 
4385
- props: {
4386
- masonry: Boolean,
4387
- parallax: Number },
4388
4295
 
4296
+ {
4297
+ name: 'beforehide',
4389
4298
 
4390
- data: {
4391
- margin: 'uk-grid-margin',
4392
- clsStack: 'uk-grid-stack',
4393
- masonry: false,
4394
- parallax: 0 },
4299
+ self: true,
4395
4300
 
4301
+ handler() {
4302
+ this.clearTimers();
4303
+ } },
4396
4304
 
4397
- connected() {
4398
- this.masonry && addClass(this.$el, 'uk-flex-top uk-flex-wrap-top');
4399
- },
4400
4305
 
4401
- update: [
4402
4306
  {
4403
- write(_ref) {let { columns } = _ref;
4404
- toggleClass(this.$el, this.clsStack, columns.length < 2);
4405
- },
4307
+ name: 'hide',
4406
4308
 
4407
- events: ['resize'] },
4309
+ handler(_ref5) {let { target } = _ref5;
4310
+ if (this.$el !== target) {
4311
+ active =
4312
+ active === null && within(target, this.$el) && this.isToggled() ?
4313
+ this :
4314
+ active;
4315
+ return;
4316
+ }
4408
4317
 
4318
+ active = this.isActive() ? null : active;
4319
+ this.tracker.cancel();
4320
+ } }],
4409
4321
 
4410
- {
4411
- read(data) {
4412
- let { columns, rows } = data;
4413
4322
 
4414
- // Filter component makes elements positioned absolute
4415
- if (
4416
- !columns.length ||
4417
- !this.masonry && !this.parallax ||
4418
- positionedAbsolute(this.$el))
4419
- {
4420
- data.translates = false;
4421
- return false;
4323
+
4324
+ update: {
4325
+ write() {
4326
+ if (this.isToggled() && !hasClass(this.$el, this.clsEnter)) {
4327
+ this.position();
4328
+ }
4329
+ } },
4330
+
4331
+
4332
+ methods: {
4333
+ show(target, delay) {if (target === void 0) {target = this.targetEl;}if (delay === void 0) {delay = true;}
4334
+ if (this.isToggled() && target && this.targetEl && target !== this.targetEl) {
4335
+ this.hide(false, false);
4422
4336
  }
4423
4337
 
4424
- let translates = false;
4338
+ this.targetEl = target;
4425
4339
 
4426
- const nodes = children(this.$el);
4427
- const columnHeights = getColumnHeights(columns);
4428
- const margin = getMarginTop(nodes, this.margin) * (rows.length - 1);
4429
- const elHeight = Math.max(...columnHeights) + margin;
4340
+ this.clearTimers();
4430
4341
 
4431
- if (this.masonry) {
4432
- columns = columns.map((column) => sortBy$1(column, 'offsetTop'));
4433
- translates = getTranslates(rows, columns);
4342
+ if (this.isActive()) {
4343
+ return;
4434
4344
  }
4435
4345
 
4436
- let padding = Math.abs(this.parallax);
4437
- if (padding) {
4438
- padding = columnHeights.reduce(
4439
- (newPadding, hgt, i) =>
4440
- Math.max(
4441
- newPadding,
4442
- hgt + margin + (i % 2 ? padding : padding / 8) - elHeight),
4346
+ if (active) {
4347
+ if (delay && active.isDelaying) {
4348
+ this.showTimer = setTimeout(() => matches(target, ':hover') && this.show(), 10);
4349
+ return;
4350
+ }
4443
4351
 
4444
- 0);
4352
+ let prev;
4353
+ while (active && prev !== active && !within(this.$el, active.$el)) {
4354
+ prev = active;
4355
+ active.hide(false, false);
4356
+ }
4357
+ }
4445
4358
 
4359
+ if (this.container && parent(this.$el) !== this.container) {
4360
+ append(this.container, this.$el);
4446
4361
  }
4447
4362
 
4448
- return { padding, columns, translates, height: translates ? elHeight : '' };
4449
- },
4363
+ this.showTimer = setTimeout(
4364
+ () => this.toggleElement(this.$el, true),
4365
+ delay && this.delayShow || 0);
4450
4366
 
4451
- write(_ref2) {let { height, padding } = _ref2;
4452
- css(this.$el, 'paddingBottom', padding || '');
4453
- height !== false && css(this.$el, 'height', height);
4454
4367
  },
4455
4368
 
4456
- events: ['resize'] },
4369
+ hide(delay, animate) {if (delay === void 0) {delay = true;}if (animate === void 0) {animate = true;}
4370
+ const hide = () => this.toggleElement(this.$el, false, this.animateOut && animate);
4457
4371
 
4372
+ this.clearTimers();
4458
4373
 
4459
- {
4460
- read() {
4461
- if (this.parallax && positionedAbsolute(this.$el)) {
4462
- return false;
4374
+ this.isDelaying = getPositionedElements(this.$el).some((el) =>
4375
+ this.tracker.movesTo(el));
4376
+
4377
+
4378
+ if (delay && this.isDelaying) {
4379
+ this.hideTimer = setTimeout(this.hide, 50);
4380
+ } else if (delay && this.delayHide) {
4381
+ this.hideTimer = setTimeout(hide, this.delayHide);
4382
+ } else {
4383
+ hide();
4463
4384
  }
4385
+ },
4464
4386
 
4465
- return {
4466
- scrolled: this.parallax ?
4467
- scrolledOver(this.$el) * Math.abs(this.parallax) :
4468
- false };
4387
+ clearTimers() {
4388
+ clearTimeout(this.showTimer);
4389
+ clearTimeout(this.hideTimer);
4390
+ this.showTimer = null;
4391
+ this.hideTimer = null;
4392
+ this.isDelaying = false;
4393
+ },
4469
4394
 
4395
+ isActive() {
4396
+ return active === this;
4470
4397
  },
4471
4398
 
4472
- write(_ref3) {let { columns, scrolled, translates } = _ref3;
4473
- if (scrolled === false && !translates) {
4474
- return;
4475
- }
4399
+ position() {
4400
+ removeClass(this.$el, this.clsDrop + "-stack");
4401
+ attr(this.$el, 'style', this._style);
4476
4402
 
4477
- columns.forEach((column, i) =>
4478
- column.forEach((el, j) =>
4479
- css(
4480
- el,
4481
- 'transform',
4482
- !scrolled && !translates ?
4483
- '' : "translateY(" + (
4403
+ // Ensure none positioned element does not generate scrollbars
4404
+ this.$el.hidden = true;
4484
4405
 
4485
- (translates && -translates[i][j]) + (
4486
- scrolled ? i % 2 ? scrolled : scrolled / 8 : 0)) + "px)")));
4406
+ const boundary = query(this.boundary, this.$el);
4407
+ const boundaryOffset = offsetViewport(boundary || window);
4408
+ const viewports = this.target.map((target) => offsetViewport(scrollParents(target)[0]));
4409
+ const viewportOffset = this.getViewportOffset(this.$el);
4487
4410
 
4411
+ const dirs = [
4412
+ [0, ['x', 'width', 'left', 'right']],
4413
+ [1, ['y', 'height', 'top', 'bottom']]];
4488
4414
 
4489
4415
 
4416
+ for (const [i, [axis, prop]] of dirs) {
4417
+ if (this.axis !== axis && includes([axis, true], this.stretch)) {
4418
+ css(this.$el, {
4419
+ [prop]: Math.min(
4420
+ boundaryOffset[prop],
4421
+ viewports[i][prop] - 2 * viewportOffset),
4490
4422
 
4491
- },
4423
+ ["overflow-" + axis]: 'auto' });
4492
4424
 
4493
- events: ['scroll', 'resize'] }] };
4425
+ }
4426
+ }
4494
4427
 
4428
+ const maxWidth = viewports[0].width - 2 * viewportOffset;
4495
4429
 
4430
+ if (this.$el.offsetWidth > maxWidth) {
4431
+ addClass(this.$el, this.clsDrop + "-stack");
4432
+ }
4496
4433
 
4434
+ css(this.$el, 'maxWidth', maxWidth);
4497
4435
 
4498
- function positionedAbsolute(el) {
4499
- return children(el).some((el) => css(el, 'position') === 'absolute');
4500
- }
4436
+ this.$el.hidden = false;
4501
4437
 
4502
- function getTranslates(rows, columns) {
4503
- const rowHeights = rows.map((row) => Math.max(...row.map((el) => el.offsetHeight)));
4438
+ this.positionAt(this.$el, this.target, boundary);
4504
4439
 
4505
- return columns.map((elements) => {
4506
- let prev = 0;
4507
- return elements.map(
4508
- (element, row) =>
4509
- prev += row ? rowHeights[row - 1] - elements[row - 1].offsetHeight : 0);
4440
+ for (const [i, [axis, prop, start, end]] of dirs) {
4441
+ if (this.axis === axis && includes([axis, true], this.stretch)) {
4442
+ const positionOffset = Math.abs(this.getPositionOffset(this.$el));
4443
+ const targetOffset = offset(this.target[i]);
4444
+ const elOffset = offset(this.$el);
4510
4445
 
4511
- });
4512
- }
4446
+ css(this.$el, {
4447
+ [prop]:
4448
+ (targetOffset[start] > elOffset[start] ?
4449
+ targetOffset[start] -
4450
+ Math.max(
4451
+ boundaryOffset[start],
4452
+ viewports[i][start] + viewportOffset) :
4513
4453
 
4514
- function getMarginTop(nodes, cls) {
4515
- const [node] = nodes.filter((el) => hasClass(el, cls));
4454
+ Math.min(
4455
+ boundaryOffset[end],
4456
+ viewports[i][end] - viewportOffset) -
4457
+ targetOffset[end]) - positionOffset,
4458
+ ["overflow-" + axis]: 'auto' });
4516
4459
 
4517
- return toFloat(node ? css(node, 'marginTop') : css(nodes[0], 'paddingLeft'));
4518
- }
4519
4460
 
4520
- function getColumnHeights(columns) {
4521
- return columns.map((column) => column.reduce((sum, el) => sum + el.offsetHeight, 0));
4461
+ this.positionAt(this.$el, this.target, boundary);
4462
+ }
4463
+ }
4464
+ } } };
4465
+
4466
+
4467
+
4468
+ function getPositionedElements(el) {
4469
+ const result = [];
4470
+ apply(el, (el) => css(el, 'position') !== 'static' && result.push(el));
4471
+ return result;
4522
4472
  }
4523
4473
 
4524
- var heightMatch = {
4525
- mixins: [Resize],
4474
+ var formCustom = {
4475
+ mixins: [Class],
4526
4476
 
4527
4477
  args: 'target',
4528
4478
 
4529
4479
  props: {
4530
- target: String,
4531
- row: Boolean },
4480
+ target: Boolean },
4532
4481
 
4533
4482
 
4534
4483
  data: {
4535
- target: '> *',
4536
- row: true },
4484
+ target: false },
4537
4485
 
4538
4486
 
4539
4487
  computed: {
4540
- elements: {
4541
- get(_ref, $el) {let { target } = _ref;
4542
- return $$(target, $el);
4543
- },
4544
-
4545
- watch() {
4546
- this.$reset();
4547
- } } },
4548
-
4549
-
4550
-
4551
- resizeTargets() {
4552
- return [this.$el, ...this.elements];
4553
- },
4554
-
4555
- update: {
4556
- read() {
4557
- return {
4558
- rows: (this.row ? getRows(this.elements) : [this.elements]).map(match) };
4488
+ input(_, $el) {
4489
+ return $(selInput, $el);
4490
+ },
4559
4491
 
4492
+ state() {
4493
+ return this.input.nextElementSibling;
4560
4494
  },
4561
4495
 
4562
- write(_ref2) {let { rows } = _ref2;
4563
- for (const { heights, elements } of rows) {
4564
- elements.forEach((el, i) => css(el, 'minHeight', heights[i]));
4565
- }
4566
- },
4496
+ target(_ref, $el) {let { target } = _ref;
4497
+ return (
4498
+ target && (
4499
+ target === true && parent(this.input) === $el && this.input.nextElementSibling ||
4500
+ $(target, $el)));
4567
4501
 
4568
- events: ['resize'] } };
4502
+ } },
4569
4503
 
4570
4504
 
4505
+ update() {var _input$files;
4506
+ const { target, input } = this;
4571
4507
 
4572
- function match(elements) {
4573
- if (elements.length < 2) {
4574
- return { heights: [''], elements };
4575
- }
4508
+ if (!target) {
4509
+ return;
4510
+ }
4576
4511
 
4577
- css(elements, 'minHeight', '');
4578
- let heights = elements.map(getHeight);
4579
- const max = Math.max(...heights);
4512
+ let option;
4513
+ const prop = isInput(target) ? 'value' : 'textContent';
4514
+ const prev = target[prop];
4515
+ const value = (_input$files = input.files) != null && _input$files[0] ?
4516
+ input.files[0].name :
4517
+ matches(input, 'select') && (
4518
+ option = $$('option', input).filter((el) => el.selected)[0]) // eslint-disable-line prefer-destructuring
4519
+ ? option.textContent :
4520
+ input.value;
4580
4521
 
4581
- return {
4582
- heights: elements.map((el, i) => heights[i].toFixed(2) === max.toFixed(2) ? '' : max),
4583
- elements };
4522
+ if (prev !== value) {
4523
+ target[prop] = value;
4524
+ }
4525
+ },
4584
4526
 
4585
- }
4527
+ events: [
4528
+ {
4529
+ name: 'change',
4586
4530
 
4587
- function getHeight(element) {
4588
- let style = false;
4589
- if (!isVisible(element)) {
4590
- style = element.style.display;
4591
- css(element, 'display', 'block', 'important');
4592
- }
4531
+ handler() {
4532
+ this.$emit();
4533
+ } },
4593
4534
 
4594
- const height = dimensions(element).height - boxModelAdjust(element, 'height', 'content-box');
4595
4535
 
4596
- if (style !== false) {
4597
- css(element, 'display', style);
4598
- }
4536
+ {
4537
+ name: 'reset',
4599
4538
 
4600
- return height;
4601
- }
4539
+ el() {
4540
+ return closest(this.$el, 'form');
4541
+ },
4602
4542
 
4603
- var heightViewport = {
4543
+ handler() {
4544
+ this.$emit();
4545
+ } }] };
4546
+
4547
+ var Margin = {
4604
4548
  mixins: [Resize],
4605
4549
 
4606
4550
  props: {
4607
- expand: Boolean,
4608
- offsetTop: Boolean,
4609
- offsetBottom: Boolean,
4610
- minHeight: Number },
4551
+ margin: String,
4552
+ firstColumn: Boolean },
4611
4553
 
4612
4554
 
4613
4555
  data: {
4614
- expand: false,
4615
- offsetTop: false,
4616
- offsetBottom: false,
4617
- minHeight: 0 },
4556
+ margin: 'uk-margin-small-top',
4557
+ firstColumn: 'uk-first-column' },
4618
4558
 
4619
4559
 
4620
4560
  resizeTargets() {
4621
- // check for offsetTop change
4622
- return [this.$el, ...scrollParents(this.$el, /auto|scroll/)];
4561
+ return [this.$el, ...toArray(this.$el.children)];
4623
4562
  },
4624
4563
 
4625
- update: {
4626
- read(_ref) {let { minHeight: prev } = _ref;
4627
- if (!isVisible(this.$el)) {
4628
- return false;
4629
- }
4630
-
4631
- let minHeight = '';
4632
- const box = boxModelAdjust(this.$el, 'height', 'content-box');
4633
-
4634
- const [scrollElement] = scrollParents(this.$el, /auto|scroll/);
4635
- const { height: viewportHeight } = offsetViewport(scrollElement);
4636
-
4637
- if (this.expand) {
4638
- minHeight = Math.max(
4639
- viewportHeight - (
4640
- dimensions(scrollElement).height - dimensions(this.$el).height) -
4641
- box,
4642
- 0);
4643
-
4644
- } else {
4645
- // on mobile devices (iOS and Android) window.innerHeight !== 100vh
4646
- minHeight = "calc(" + (
4647
- document.scrollingElement === scrollElement ? '100vh' : viewportHeight + "px");
4564
+ connected() {
4565
+ this.registerObserver(
4566
+ observeMutation(this.$el, () => this.$reset(), {
4567
+ childList: true }));
4648
4568
 
4649
4569
 
4650
- if (this.offsetTop) {
4651
- const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
4652
- minHeight += top > 0 && top < viewportHeight / 2 ? " - " + top + "px" : '';
4653
- }
4570
+ },
4654
4571
 
4655
- if (this.offsetBottom === true) {
4656
- minHeight += " - " + dimensions(this.$el.nextElementSibling).height + "px";
4657
- } else if (isNumeric(this.offsetBottom)) {
4658
- minHeight += " - " + this.offsetBottom + "vh";
4659
- } else if (this.offsetBottom && endsWith(this.offsetBottom, 'px')) {
4660
- minHeight += " - " + toFloat(this.offsetBottom) + "px";
4661
- } else if (isString(this.offsetBottom)) {
4662
- minHeight += " - " + dimensions(query(this.offsetBottom, this.$el)).height + "px";
4663
- }
4572
+ update: {
4573
+ read() {
4574
+ const rows = getRows(this.$el.children);
4664
4575
 
4665
- minHeight += (box ? " - " + box + "px" : '') + ")";
4666
- }
4576
+ return {
4577
+ rows,
4578
+ columns: getColumns(rows) };
4667
4579
 
4668
- return { minHeight, prev };
4669
4580
  },
4670
4581
 
4671
- write(_ref2) {let { minHeight } = _ref2;
4672
- css(this.$el, { minHeight });
4673
-
4674
- if (this.minHeight && toFloat(css(this.$el, 'minHeight')) < this.minHeight) {
4675
- css(this.$el, 'minHeight', this.minHeight);
4582
+ write(_ref) {let { columns, rows } = _ref;
4583
+ for (const row of rows) {
4584
+ for (const column of row) {
4585
+ toggleClass(column, this.margin, rows[0] !== row);
4586
+ toggleClass(column, this.firstColumn, columns[0].includes(column));
4587
+ }
4676
4588
  }
4677
4589
  },
4678
4590
 
4679
4591
  events: ['resize'] } };
4680
4592
 
4681
- var SVG = {
4682
- args: 'src',
4683
4593
 
4684
- props: {
4685
- id: Boolean,
4686
- icon: String,
4687
- src: String,
4688
- style: String,
4689
- width: Number,
4690
- height: Number,
4691
- ratio: Number,
4692
- class: String,
4693
- strokeAnimation: Boolean,
4694
- focusable: Boolean, // IE 11
4695
- attributes: 'list' },
4696
4594
 
4595
+ function getRows(items) {
4596
+ return sortBy(items, 'top', 'bottom');
4597
+ }
4697
4598
 
4698
- data: {
4699
- ratio: 1,
4700
- include: ['style', 'class', 'focusable'],
4701
- class: '',
4702
- strokeAnimation: false },
4599
+ function getColumns(rows) {
4600
+ const columns = [];
4703
4601
 
4602
+ for (const row of rows) {
4603
+ const sorted = sortBy(row, 'left', 'right');
4604
+ for (let j = 0; j < sorted.length; j++) {
4605
+ columns[j] = columns[j] ? columns[j].concat(sorted[j]) : sorted[j];
4606
+ }
4607
+ }
4704
4608
 
4705
- beforeConnect() {
4706
- this.class += ' uk-svg';
4707
- },
4609
+ return isRtl ? columns.reverse() : columns;
4610
+ }
4708
4611
 
4709
- connected() {
4710
- if (!this.icon && includes(this.src, '#')) {
4711
- [this.src, this.icon] = this.src.split('#');
4712
- }
4612
+ function sortBy(items, startProp, endProp) {
4613
+ const sorted = [[]];
4713
4614
 
4714
- this.svg = this.getSvg().then((el) => {
4715
- if (this._connected) {
4716
- const svg = insertSVG(el, this.$el);
4615
+ for (const el of items) {
4616
+ if (!isVisible(el)) {
4617
+ continue;
4618
+ }
4717
4619
 
4718
- if (this.svgEl && svg !== this.svgEl) {
4719
- remove$1(this.svgEl);
4720
- }
4620
+ let dim = getOffset(el);
4721
4621
 
4722
- this.applyAttributes(svg, el);
4622
+ for (let i = sorted.length - 1; i >= 0; i--) {
4623
+ const current = sorted[i];
4723
4624
 
4724
- return this.svgEl = svg;
4625
+ if (!current[0]) {
4626
+ current.push(el);
4627
+ break;
4725
4628
  }
4726
- }, noop);
4727
4629
 
4728
- if (this.strokeAnimation) {
4729
- this.svg.then((el) => {
4730
- if (this._connected) {
4731
- applyAnimation(el);
4732
- this.registerObserver(
4733
- observeIntersection(el, (records, observer) => {
4734
- applyAnimation(el);
4735
- observer.disconnect();
4736
- }));
4630
+ let startDim;
4631
+ if (current[0].offsetParent === el.offsetParent) {
4632
+ startDim = getOffset(current[0]);
4633
+ } else {
4634
+ dim = getOffset(el, true);
4635
+ startDim = getOffset(current[0], true);
4636
+ }
4737
4637
 
4738
- }
4739
- });
4740
- }
4741
- },
4638
+ if (dim[startProp] >= startDim[endProp] - 1 && dim[startProp] !== startDim[startProp]) {
4639
+ sorted.push([el]);
4640
+ break;
4641
+ }
4742
4642
 
4743
- disconnected() {
4744
- this.svg.then((svg) => {
4745
- if (this._connected) {
4746
- return;
4643
+ if (dim[endProp] - 1 > startDim[startProp] || dim[startProp] === startDim[startProp]) {
4644
+ current.push(el);
4645
+ break;
4747
4646
  }
4748
4647
 
4749
- if (isVoidElement(this.$el)) {
4750
- this.$el.hidden = false;
4648
+ if (i === 0) {
4649
+ sorted.unshift([el]);
4650
+ break;
4751
4651
  }
4652
+ }
4653
+ }
4752
4654
 
4753
- remove$1(svg);
4754
- this.svgEl = null;
4755
- });
4756
-
4757
- this.svg = null;
4758
- },
4655
+ return sorted;
4656
+ }
4759
4657
 
4760
- methods: {
4761
- async getSvg() {
4762
- if (isTag(this.$el, 'img') && !this.$el.complete && this.$el.loading === 'lazy') {
4763
- return new Promise((resolve) =>
4764
- once(this.$el, 'load', () => resolve(this.getSvg())));
4658
+ function getOffset(element, offset) {if (offset === void 0) {offset = false;}
4659
+ let { offsetTop, offsetLeft, offsetHeight, offsetWidth } = element;
4765
4660
 
4766
- }
4661
+ if (offset) {
4662
+ [offsetTop, offsetLeft] = offsetPosition(element);
4663
+ }
4767
4664
 
4768
- return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject('SVG not found.');
4769
- },
4665
+ return {
4666
+ top: offsetTop,
4667
+ left: offsetLeft,
4668
+ bottom: offsetTop + offsetHeight,
4669
+ right: offsetLeft + offsetWidth };
4770
4670
 
4771
- applyAttributes(el, ref) {
4772
- for (const prop in this.$options.props) {
4773
- if (includes(this.include, prop) && prop in this) {
4774
- attr(el, prop, this[prop]);
4775
- }
4776
- }
4671
+ }
4777
4672
 
4778
- for (const attribute in this.attributes) {
4779
- const [prop, value] = this.attributes[attribute].split(':', 2);
4780
- attr(el, prop, value);
4781
- }
4673
+ var Scroll = {
4674
+ connected() {
4675
+ registerScrollListener(this._uid, () => this.$emit('scroll'));
4676
+ },
4782
4677
 
4783
- if (!this.id) {
4784
- removeAttr(el, 'id');
4785
- }
4678
+ disconnected() {
4679
+ unregisterScrollListener(this._uid);
4680
+ } };
4786
4681
 
4787
- const props = ['width', 'height'];
4788
- let dimensions = props.map((prop) => this[prop]);
4789
4682
 
4790
- if (!dimensions.some((val) => val)) {
4791
- dimensions = props.map((prop) => attr(ref, prop));
4792
- }
4683
+ const scrollListeners = new Map();
4684
+ let unbindScrollListener;
4685
+ function registerScrollListener(id, listener) {
4686
+ unbindScrollListener =
4687
+ unbindScrollListener ||
4688
+ on(window, 'scroll', () => scrollListeners.forEach((listener) => listener()), {
4689
+ passive: true,
4690
+ capture: true });
4793
4691
 
4794
- const viewBox = attr(ref, 'viewBox');
4795
- if (viewBox && !dimensions.some((val) => val)) {
4796
- dimensions = viewBox.split(' ').slice(2);
4797
- }
4798
4692
 
4799
- dimensions.forEach((val, i) => attr(el, props[i], toFloat(val) * this.ratio || null));
4800
- } } };
4693
+ scrollListeners.set(id, listener);
4694
+ }
4801
4695
 
4696
+ function unregisterScrollListener(id) {
4697
+ scrollListeners.delete(id);
4698
+ if (unbindScrollListener && !scrollListeners.size) {
4699
+ unbindScrollListener();
4700
+ unbindScrollListener = null;
4701
+ }
4702
+ }
4802
4703
 
4704
+ var grid = {
4705
+ extends: Margin,
4803
4706
 
4804
- const loadSVG = memoize(async (src) => {
4805
- if (src) {
4806
- if (startsWith(src, 'data:')) {
4807
- return decodeURIComponent(src.split(',')[1]);
4808
- } else {
4809
- return (await fetch(src)).text();
4810
- }
4811
- } else {
4812
- return Promise.reject();
4813
- }
4814
- });
4707
+ mixins: [Class, Scroll],
4815
4708
 
4816
- function parseSVG(svg, icon) {var _svg;
4817
- if (icon && includes(svg, '<symbol')) {
4818
- svg = parseSymbols(svg, icon) || svg;
4819
- }
4709
+ name: 'grid',
4820
4710
 
4821
- svg = $(svg.substr(svg.indexOf('<svg')));
4822
- return ((_svg = svg) == null ? void 0 : _svg.hasChildNodes()) && svg;
4823
- }
4711
+ props: {
4712
+ masonry: Boolean,
4713
+ parallax: Number },
4824
4714
 
4825
- const symbolRe = /<symbol([^]*?id=(['"])(.+?)\2[^]*?<\/)symbol>/g;
4826
- const symbols = {};
4827
4715
 
4828
- function parseSymbols(svg, icon) {
4829
- if (!symbols[svg]) {
4830
- symbols[svg] = {};
4716
+ data: {
4717
+ margin: 'uk-grid-margin',
4718
+ clsStack: 'uk-grid-stack',
4719
+ masonry: false,
4720
+ parallax: 0 },
4831
4721
 
4832
- symbolRe.lastIndex = 0;
4833
4722
 
4834
- let match;
4835
- while (match = symbolRe.exec(svg)) {
4836
- symbols[svg][match[3]] = "<svg xmlns=\"http://www.w3.org/2000/svg\"" + match[1] + "svg>";
4837
- }
4838
- }
4723
+ connected() {
4724
+ this.masonry && addClass(this.$el, 'uk-flex-top uk-flex-wrap-top');
4725
+ },
4839
4726
 
4840
- return symbols[svg][icon];
4841
- }
4727
+ update: [
4728
+ {
4729
+ write(_ref) {let { columns } = _ref;
4730
+ toggleClass(this.$el, this.clsStack, columns.length < 2);
4731
+ },
4842
4732
 
4843
- function applyAnimation(el) {
4844
- const length = getMaxPathLength(el);
4733
+ events: ['resize'] },
4845
4734
 
4846
- if (length) {
4847
- el.style.setProperty('--uk-animation-stroke', length);
4848
- }
4849
- }
4850
4735
 
4851
- function getMaxPathLength(el) {
4852
- return Math.ceil(
4853
- Math.max(
4854
- 0,
4855
- ...$$('[stroke]', el).map((stroke) => {
4856
- try {
4857
- return stroke.getTotalLength();
4858
- } catch (e) {
4859
- return 0;
4860
- }
4861
- })));
4736
+ {
4737
+ read(data) {
4738
+ let { columns, rows } = data;
4862
4739
 
4740
+ // Filter component makes elements positioned absolute
4741
+ if (
4742
+ !columns.length ||
4743
+ !this.masonry && !this.parallax ||
4744
+ positionedAbsolute(this.$el))
4745
+ {
4746
+ data.translates = false;
4747
+ return false;
4748
+ }
4863
4749
 
4864
- }
4750
+ let translates = false;
4865
4751
 
4866
- function insertSVG(el, root) {
4867
- if (isVoidElement(root) || isTag(root, 'canvas')) {
4868
- root.hidden = true;
4752
+ const nodes = children(this.$el);
4753
+ const columnHeights = getColumnHeights(columns);
4754
+ const margin = getMarginTop(nodes, this.margin) * (rows.length - 1);
4755
+ const elHeight = Math.max(...columnHeights) + margin;
4869
4756
 
4870
- const next = root.nextElementSibling;
4871
- return equals(el, next) ? next : after(root, el);
4872
- }
4757
+ if (this.masonry) {
4758
+ columns = columns.map((column) => sortBy$1(column, 'offsetTop'));
4759
+ translates = getTranslates(rows, columns);
4760
+ }
4873
4761
 
4874
- const last = root.lastElementChild;
4875
- return equals(el, last) ? last : append(root, el);
4876
- }
4762
+ let padding = Math.abs(this.parallax);
4763
+ if (padding) {
4764
+ padding = columnHeights.reduce(
4765
+ (newPadding, hgt, i) =>
4766
+ Math.max(
4767
+ newPadding,
4768
+ hgt + margin + (i % 2 ? padding : padding / 8) - elHeight),
4877
4769
 
4878
- function equals(el, other) {
4879
- return isTag(el, 'svg') && isTag(other, 'svg') && innerHTML(el) === innerHTML(other);
4880
- }
4770
+ 0);
4881
4771
 
4882
- function innerHTML(el) {
4883
- return (
4884
- el.innerHTML ||
4885
- new XMLSerializer().serializeToString(el).replace(/<svg.*?>(.*?)<\/svg>/g, '$1')).
4886
- replace(/\s/g, '');
4887
- }
4772
+ }
4888
4773
 
4889
- var closeIcon = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" xmlns=\"http://www.w3.org/2000/svg\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"1\" y1=\"1\" x2=\"13\" y2=\"13\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"13\" y1=\"1\" x2=\"1\" y2=\"13\"/></svg>";
4774
+ return { padding, columns, translates, height: translates ? elHeight : '' };
4775
+ },
4890
4776
 
4891
- var closeLarge = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"1\" y1=\"1\" x2=\"19\" y2=\"19\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"19\" y1=\"1\" x2=\"1\" y2=\"19\"/></svg>";
4777
+ write(_ref2) {let { height, padding } = _ref2;
4778
+ css(this.$el, 'paddingBottom', padding || '');
4779
+ height !== false && css(this.$el, 'height', height);
4780
+ },
4892
4781
 
4893
- var marker = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"9\" y=\"4\" width=\"1\" height=\"11\"/><rect x=\"4\" y=\"9\" width=\"11\" height=\"1\"/></svg>";
4782
+ events: ['resize'] },
4894
4783
 
4895
- var navbarToggleIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><rect y=\"9\" width=\"20\" height=\"2\"/><rect y=\"3\" width=\"20\" height=\"2\"/><rect y=\"15\" width=\"20\" height=\"2\"/></svg>";
4896
4784
 
4897
- var overlayIcon = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"19\" y=\"0\" width=\"1\" height=\"40\"/><rect x=\"0\" y=\"19\" width=\"40\" height=\"1\"/></svg>";
4785
+ {
4786
+ read() {
4787
+ if (this.parallax && positionedAbsolute(this.$el)) {
4788
+ return false;
4789
+ }
4898
4790
 
4899
- var paginationNext = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 1 6 6 1 11\"/></svg>";
4791
+ return {
4792
+ scrolled: this.parallax ?
4793
+ scrolledOver(this.$el) * Math.abs(this.parallax) :
4794
+ false };
4900
4795
 
4901
- var paginationPrevious = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"6 1 1 6 6 11\"/></svg>";
4796
+ },
4902
4797
 
4903
- var searchIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"9\" cy=\"9\" r=\"7\"/><path fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" d=\"M14,14 L18,18 L14,14 Z\"/></svg>";
4798
+ write(_ref3) {let { columns, scrolled, translates } = _ref3;
4799
+ if (scrolled === false && !translates) {
4800
+ return;
4801
+ }
4904
4802
 
4905
- var searchLarge = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" cx=\"17.5\" cy=\"17.5\" r=\"16.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" x1=\"38\" y1=\"39\" x2=\"29\" y2=\"30\"/></svg>";
4803
+ columns.forEach((column, i) =>
4804
+ column.forEach((el, j) =>
4805
+ css(
4806
+ el,
4807
+ 'transform',
4808
+ !scrolled && !translates ?
4809
+ '' : "translateY(" + (
4906
4810
 
4907
- var searchNavbar = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"10.5\" cy=\"10.5\" r=\"9.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"23\" y1=\"23\" x2=\"17\" y2=\"17\"/></svg>";
4811
+ (translates && -translates[i][j]) + (
4812
+ scrolled ? i % 2 ? scrolled : scrolled / 8 : 0)) + "px)")));
4908
4813
 
4909
- var slidenavNext = "<svg width=\"14\" height=\"24\" viewBox=\"0 0 14 24\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"1.225,23 12.775,12 1.225,1 \"/></svg>";
4910
4814
 
4911
- var slidenavNextLarge = "<svg width=\"25\" height=\"40\" viewBox=\"0 0 25 40\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"4.002,38.547 22.527,20.024 4,1.5 \"/></svg>";
4912
4815
 
4913
- var slidenavPrevious = "<svg width=\"14\" height=\"24\" viewBox=\"0 0 14 24\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"12.775,1 1.225,12 12.775,23 \"/></svg>";
4914
4816
 
4915
- var slidenavPreviousLarge = "<svg width=\"25\" height=\"40\" viewBox=\"0 0 25 40\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"20.527,1.5 2,20.024 20.525,38.547 \"/></svg>";
4817
+ },
4916
4818
 
4917
- var spinner = "<svg width=\"30\" height=\"30\" viewBox=\"0 0 30 30\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" cx=\"15\" cy=\"15\" r=\"14\"/></svg>";
4819
+ events: ['scroll', 'resize'] }] };
4918
4820
 
4919
- var totop = "<svg width=\"18\" height=\"10\" viewBox=\"0 0 18 10\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 9 9 1 17 9 \"/></svg>";
4920
4821
 
4921
- const icons = {
4922
- spinner,
4923
- totop,
4924
- marker,
4925
- 'close-icon': closeIcon,
4926
- 'close-large': closeLarge,
4927
- 'navbar-toggle-icon': navbarToggleIcon,
4928
- 'overlay-icon': overlayIcon,
4929
- 'pagination-next': paginationNext,
4930
- 'pagination-previous': paginationPrevious,
4931
- 'search-icon': searchIcon,
4932
- 'search-large': searchLarge,
4933
- 'search-navbar': searchNavbar,
4934
- 'slidenav-next': slidenavNext,
4935
- 'slidenav-next-large': slidenavNextLarge,
4936
- 'slidenav-previous': slidenavPrevious,
4937
- 'slidenav-previous-large': slidenavPreviousLarge };
4938
4822
 
4939
4823
 
4940
- const Icon = {
4941
- install: install$1,
4942
-
4943
- extends: SVG,
4944
-
4945
- args: 'icon',
4946
-
4947
- props: ['icon'],
4948
-
4949
- data: {
4950
- include: ['focusable'] },
4951
-
4952
-
4953
- isIcon: true,
4954
-
4955
- beforeConnect() {
4956
- addClass(this.$el, 'uk-icon');
4957
- },
4958
-
4959
- methods: {
4960
- async getSvg() {
4961
- const icon = getIcon(this.icon);
4824
+ function positionedAbsolute(el) {
4825
+ return children(el).some((el) => css(el, 'position') === 'absolute');
4826
+ }
4962
4827
 
4963
- if (!icon) {
4964
- throw 'Icon not found.';
4965
- }
4828
+ function getTranslates(rows, columns) {
4829
+ const rowHeights = rows.map((row) => Math.max(...row.map((el) => el.offsetHeight)));
4966
4830
 
4967
- return icon;
4968
- } } };
4831
+ return columns.map((elements) => {
4832
+ let prev = 0;
4833
+ return elements.map(
4834
+ (element, row) =>
4835
+ prev += row ? rowHeights[row - 1] - elements[row - 1].offsetHeight : 0);
4969
4836
 
4970
- const IconComponent = {
4971
- args: false,
4837
+ });
4838
+ }
4972
4839
 
4973
- extends: Icon,
4840
+ function getMarginTop(nodes, cls) {
4841
+ const [node] = nodes.filter((el) => hasClass(el, cls));
4974
4842
 
4975
- data: (vm) => ({
4976
- icon: hyphenate(vm.constructor.options.name) }),
4843
+ return toFloat(node ? css(node, 'marginTop') : css(nodes[0], 'paddingLeft'));
4844
+ }
4977
4845
 
4846
+ function getColumnHeights(columns) {
4847
+ return columns.map((column) => column.reduce((sum, el) => sum + el.offsetHeight, 0));
4848
+ }
4978
4849
 
4979
- beforeConnect() {
4980
- addClass(this.$el, this.$name);
4981
- } };
4850
+ var heightMatch = {
4851
+ mixins: [Resize],
4982
4852
 
4853
+ args: 'target',
4983
4854
 
4984
- const Slidenav = {
4985
- extends: IconComponent,
4855
+ props: {
4856
+ target: String,
4857
+ row: Boolean },
4986
4858
 
4987
- beforeConnect() {
4988
- addClass(this.$el, 'uk-slidenav');
4989
- const icon = this.$props.icon;
4990
- this.icon = hasClass(this.$el, 'uk-slidenav-large') ? icon + "-large" : icon;
4991
- } };
4992
4859
 
4860
+ data: {
4861
+ target: '> *',
4862
+ row: true },
4993
4863
 
4994
- const Search = {
4995
- extends: IconComponent,
4996
4864
 
4997
- beforeConnect() {
4998
- this.icon =
4999
- hasClass(this.$el, 'uk-search-icon') && parents(this.$el, '.uk-search-large').length ?
5000
- 'search-large' :
5001
- parents(this.$el, '.uk-search-navbar').length ?
5002
- 'search-navbar' :
5003
- this.$props.icon;
5004
- } };
4865
+ computed: {
4866
+ elements: {
4867
+ get(_ref, $el) {let { target } = _ref;
4868
+ return $$(target, $el);
4869
+ },
5005
4870
 
4871
+ watch() {
4872
+ this.$reset();
4873
+ } } },
5006
4874
 
5007
- const Close = {
5008
- extends: IconComponent,
5009
4875
 
5010
- beforeConnect() {
5011
- this.icon = "close-" + (hasClass(this.$el, 'uk-close-large') ? 'large' : 'icon');
5012
- } };
5013
4876
 
4877
+ resizeTargets() {
4878
+ return [this.$el, ...this.elements];
4879
+ },
5014
4880
 
5015
- const Spinner = {
5016
- extends: IconComponent,
4881
+ update: {
4882
+ read() {
4883
+ return {
4884
+ rows: (this.row ? getRows(this.elements) : [this.elements]).map(match) };
5017
4885
 
5018
- methods: {
5019
- async getSvg() {
5020
- const icon = await Icon.methods.getSvg.call(this);
4886
+ },
5021
4887
 
5022
- if (this.ratio !== 1) {
5023
- css($('circle', icon), 'strokeWidth', 1 / this.ratio);
4888
+ write(_ref2) {let { rows } = _ref2;
4889
+ for (const { heights, elements } of rows) {
4890
+ elements.forEach((el, i) => css(el, 'minHeight', heights[i]));
5024
4891
  }
4892
+ },
5025
4893
 
5026
- return icon;
5027
- } } };
4894
+ events: ['resize'] } };
5028
4895
 
5029
4896
 
5030
4897
 
5031
- const parsed = {};
5032
- function install$1(UIkit) {
5033
- UIkit.icon.add = (name, svg) => {
5034
- const added = isString(name) ? { [name]: svg } : name;
5035
- each(added, (svg, name) => {
5036
- icons[name] = svg;
5037
- delete parsed[name];
5038
- });
4898
+ function match(elements) {
4899
+ if (elements.length < 2) {
4900
+ return { heights: [''], elements };
4901
+ }
5039
4902
 
5040
- if (UIkit._initialized) {
5041
- apply(document.body, (el) =>
5042
- each(UIkit.getComponents(el), (cmp) => {
5043
- cmp.$options.isIcon && cmp.icon in added && cmp.$reset();
5044
- }));
4903
+ css(elements, 'minHeight', '');
4904
+ let heights = elements.map(getHeight);
4905
+ const max = Math.max(...heights);
4906
+
4907
+ return {
4908
+ heights: elements.map((el, i) => heights[i].toFixed(2) === max.toFixed(2) ? '' : max),
4909
+ elements };
5045
4910
 
5046
- }
5047
- };
5048
4911
  }
5049
4912
 
5050
- function getIcon(icon) {
5051
- if (!icons[icon]) {
5052
- return null;
4913
+ function getHeight(element) {
4914
+ let style = false;
4915
+ if (!isVisible(element)) {
4916
+ style = element.style.display;
4917
+ css(element, 'display', 'block', 'important');
5053
4918
  }
5054
4919
 
5055
- if (!parsed[icon]) {
5056
- parsed[icon] = $((icons[applyRtl(icon)] || icons[icon]).trim());
5057
- }
4920
+ const height = dimensions(element).height - boxModelAdjust(element, 'height', 'content-box');
5058
4921
 
5059
- return parsed[icon].cloneNode(true);
5060
- }
4922
+ if (style !== false) {
4923
+ css(element, 'display', style);
4924
+ }
5061
4925
 
5062
- function applyRtl(icon) {
5063
- return isRtl ? swap(swap(icon, 'left', 'right'), 'previous', 'next') : icon;
4926
+ return height;
5064
4927
  }
5065
4928
 
5066
- const nativeLazyLoad = inBrowser && 'loading' in HTMLImageElement.prototype;
5067
-
5068
- var img = {
5069
- args: 'dataSrc',
4929
+ var heightViewport = {
4930
+ mixins: [Resize],
5070
4931
 
5071
4932
  props: {
5072
- dataSrc: String,
5073
- sources: String,
5074
- offsetTop: String,
5075
- offsetLeft: String,
5076
- target: String,
5077
- loading: String },
4933
+ expand: Boolean,
4934
+ offsetTop: Boolean,
4935
+ offsetBottom: Boolean,
4936
+ minHeight: Number },
5078
4937
 
5079
4938
 
5080
4939
  data: {
5081
- dataSrc: '',
5082
- sources: false,
5083
- offsetTop: '50vh',
5084
- offsetLeft: '50vw',
5085
- target: false,
5086
- loading: 'lazy' },
5087
-
5088
-
5089
- connected() {
5090
- if (this.loading !== 'lazy') {
5091
- this.load();
5092
- return;
5093
- }
4940
+ expand: false,
4941
+ offsetTop: false,
4942
+ offsetBottom: false,
4943
+ minHeight: 0 },
5094
4944
 
5095
- const target = [this.$el, ...queryAll(this.$props.target, this.$el)];
5096
4945
 
5097
- if (nativeLazyLoad && isImg(this.$el)) {
5098
- this.$el.loading = 'lazy';
5099
- setSrcAttrs(this.$el);
4946
+ resizeTargets() {
4947
+ // check for offsetTop change
4948
+ return [this.$el, ...scrollParents(this.$el, /auto|scroll/)];
4949
+ },
5100
4950
 
5101
- if (target.length === 1) {
5102
- return;
4951
+ update: {
4952
+ read(_ref) {let { minHeight: prev } = _ref;
4953
+ if (!isVisible(this.$el)) {
4954
+ return false;
5103
4955
  }
5104
- }
5105
4956
 
5106
- ensureSrcAttribute(this.$el);
4957
+ let minHeight = '';
4958
+ const box = boxModelAdjust(this.$el, 'height', 'content-box');
4959
+
4960
+ const { body, scrollingElement } = document;
4961
+ const [scrollElement] = scrollParents(this.$el, /auto|scroll/);
4962
+ const { height: viewportHeight } = offsetViewport(
4963
+ scrollElement === body ? scrollingElement : scrollElement);
5107
4964
 
5108
- this.registerObserver(
5109
- observeIntersection(
5110
- target,
5111
- (entries, observer) => {
5112
- this.load();
5113
- observer.disconnect();
5114
- },
5115
- {
5116
- rootMargin: toPx(this.offsetTop, 'height') + "px " + toPx(
5117
- this.offsetLeft,
5118
- 'width') + "px" }));
5119
4965
 
4966
+ if (this.expand) {
4967
+ minHeight = Math.max(
4968
+ viewportHeight - (
4969
+ dimensions(scrollElement).height - dimensions(this.$el).height) -
4970
+ box,
4971
+ 0);
5120
4972
 
4973
+ } else {
4974
+ const isScrollingElement =
4975
+ scrollingElement === scrollElement || body === scrollElement;
5121
4976
 
4977
+ // on mobile devices (iOS and Android) window.innerHeight !== 100vh
4978
+ minHeight = "calc(" + (isScrollingElement ? '100vh' : viewportHeight + "px");
5122
4979
 
5123
- },
4980
+ if (this.offsetTop) {
4981
+ if (isScrollingElement) {
4982
+ const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
4983
+ minHeight += top > 0 && top < viewportHeight / 2 ? " - " + top + "px" : '';
4984
+ } else {
4985
+ minHeight += " - " + css(scrollElement, 'paddingTop');
4986
+ }
4987
+ }
5124
4988
 
5125
- disconnected() {
5126
- if (this._data.image) {
5127
- this._data.image.onload = '';
5128
- }
5129
- },
4989
+ if (this.offsetBottom === true) {
4990
+ minHeight += " - " + dimensions(this.$el.nextElementSibling).height + "px";
4991
+ } else if (isNumeric(this.offsetBottom)) {
4992
+ minHeight += " - " + this.offsetBottom + "vh";
4993
+ } else if (this.offsetBottom && endsWith(this.offsetBottom, 'px')) {
4994
+ minHeight += " - " + toFloat(this.offsetBottom) + "px";
4995
+ } else if (isString(this.offsetBottom)) {
4996
+ minHeight += " - " + dimensions(query(this.offsetBottom, this.$el)).height + "px";
4997
+ }
5130
4998
 
5131
- methods: {
5132
- load() {
5133
- if (this._data.image) {
5134
- return this._data.image;
4999
+ minHeight += (box ? " - " + box + "px" : '') + ")";
5135
5000
  }
5136
5001
 
5137
- const image = isImg(this.$el) ?
5138
- this.$el :
5139
- getImageFromElement(this.$el, this.dataSrc, this.sources);
5002
+ return { minHeight, prev };
5003
+ },
5140
5004
 
5141
- removeAttr(image, 'loading');
5142
- setSrcAttrs(this.$el, image.currentSrc);
5143
- return this._data.image = image;
5005
+ write(_ref2) {let { minHeight } = _ref2;
5006
+ css(this.$el, { minHeight });
5007
+
5008
+ if (this.minHeight && toFloat(css(this.$el, 'minHeight')) < this.minHeight) {
5009
+ css(this.$el, 'minHeight', this.minHeight);
5010
+ }
5011
+ },
5012
+
5013
+ events: ['resize'] } };
5014
+
5015
+ var SVG = {
5016
+ args: 'src',
5017
+
5018
+ props: {
5019
+ id: Boolean,
5020
+ icon: String,
5021
+ src: String,
5022
+ style: String,
5023
+ width: Number,
5024
+ height: Number,
5025
+ ratio: Number,
5026
+ class: String,
5027
+ strokeAnimation: Boolean,
5028
+ focusable: Boolean, // IE 11
5029
+ attributes: 'list' },
5030
+
5031
+
5032
+ data: {
5033
+ ratio: 1,
5034
+ include: ['style', 'class', 'focusable'],
5035
+ class: '',
5036
+ strokeAnimation: false },
5037
+
5038
+
5039
+ beforeConnect() {
5040
+ this.class += ' uk-svg';
5041
+ },
5042
+
5043
+ connected() {
5044
+ if (!this.icon && includes(this.src, '#')) {
5045
+ [this.src, this.icon] = this.src.split('#');
5046
+ }
5047
+
5048
+ this.svg = this.getSvg().then((el) => {
5049
+ if (this._connected) {
5050
+ const svg = insertSVG(el, this.$el);
5051
+
5052
+ if (this.svgEl && svg !== this.svgEl) {
5053
+ remove$1(this.svgEl);
5054
+ }
5055
+
5056
+ this.applyAttributes(svg, el);
5057
+
5058
+ return this.svgEl = svg;
5059
+ }
5060
+ }, noop);
5061
+
5062
+ if (this.strokeAnimation) {
5063
+ this.svg.then((el) => {
5064
+ if (this._connected) {
5065
+ applyAnimation(el);
5066
+ this.registerObserver(
5067
+ observeIntersection(el, (records, observer) => {
5068
+ applyAnimation(el);
5069
+ observer.disconnect();
5070
+ }));
5071
+
5072
+ }
5073
+ });
5074
+ }
5075
+ },
5076
+
5077
+ disconnected() {
5078
+ this.svg.then((svg) => {
5079
+ if (this._connected) {
5080
+ return;
5081
+ }
5082
+
5083
+ if (isVoidElement(this.$el)) {
5084
+ this.$el.hidden = false;
5085
+ }
5086
+
5087
+ remove$1(svg);
5088
+ this.svgEl = null;
5089
+ });
5090
+
5091
+ this.svg = null;
5092
+ },
5093
+
5094
+ methods: {
5095
+ async getSvg() {
5096
+ if (isTag(this.$el, 'img') && !this.$el.complete && this.$el.loading === 'lazy') {
5097
+ return new Promise((resolve) =>
5098
+ once(this.$el, 'load', () => resolve(this.getSvg())));
5099
+
5100
+ }
5101
+
5102
+ return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject('SVG not found.');
5103
+ },
5104
+
5105
+ applyAttributes(el, ref) {
5106
+ for (const prop in this.$options.props) {
5107
+ if (includes(this.include, prop) && prop in this) {
5108
+ attr(el, prop, this[prop]);
5109
+ }
5110
+ }
5111
+
5112
+ for (const attribute in this.attributes) {
5113
+ const [prop, value] = this.attributes[attribute].split(':', 2);
5114
+ attr(el, prop, value);
5115
+ }
5116
+
5117
+ if (!this.id) {
5118
+ removeAttr(el, 'id');
5119
+ }
5120
+
5121
+ const props = ['width', 'height'];
5122
+ let dimensions = props.map((prop) => this[prop]);
5123
+
5124
+ if (!dimensions.some((val) => val)) {
5125
+ dimensions = props.map((prop) => attr(ref, prop));
5126
+ }
5127
+
5128
+ const viewBox = attr(ref, 'viewBox');
5129
+ if (viewBox && !dimensions.some((val) => val)) {
5130
+ dimensions = viewBox.split(' ').slice(2);
5131
+ }
5132
+
5133
+ dimensions.forEach((val, i) => attr(el, props[i], toFloat(val) * this.ratio || null));
5144
5134
  } } };
5145
5135
 
5146
5136
 
5147
5137
 
5148
- function setSrcAttrs(el, src) {
5149
- if (isImg(el)) {
5150
- const parentNode = parent(el);
5151
- const elements = isPicture(parentNode) ? children(parentNode) : [el];
5152
- elements.forEach((el) => setSourceProps(el, el));
5153
- } else if (src) {
5154
- const change = !includes(el.style.backgroundImage, src);
5155
- if (change) {
5156
- css(el, 'backgroundImage', "url(" + escape(src) + ")");
5157
- trigger(el, createEvent('load', false));
5138
+ const loadSVG = memoize(async (src) => {
5139
+ if (src) {
5140
+ if (startsWith(src, 'data:')) {
5141
+ return decodeURIComponent(src.split(',')[1]);
5142
+ } else {
5143
+ return (await fetch(src)).text();
5158
5144
  }
5145
+ } else {
5146
+ return Promise.reject();
5159
5147
  }
5160
- }
5148
+ });
5161
5149
 
5162
- const srcProps = ['data-src', 'data-srcset', 'sizes'];
5163
- function setSourceProps(sourceEl, targetEl) {
5164
- srcProps.forEach((prop) => {
5165
- const value = data(sourceEl, prop);
5166
- if (value) {
5167
- attr(targetEl, prop.replace(/^(data-)+/, ''), value);
5168
- }
5169
- });
5150
+ function parseSVG(svg, icon) {var _svg;
5151
+ if (icon && includes(svg, '<symbol')) {
5152
+ svg = parseSymbols(svg, icon) || svg;
5153
+ }
5154
+
5155
+ svg = $(svg.substr(svg.indexOf('<svg')));
5156
+ return ((_svg = svg) == null ? void 0 : _svg.hasChildNodes()) && svg;
5170
5157
  }
5171
5158
 
5172
- function getImageFromElement(el, src, sources) {
5173
- const img = new Image();
5159
+ const symbolRe = /<symbol([^]*?id=(['"])(.+?)\2[^]*?<\/)symbol>/g;
5160
+ const symbols = {};
5174
5161
 
5175
- wrapInPicture(img, sources);
5176
- setSourceProps(el, img);
5177
- img.onload = () => {
5178
- setSrcAttrs(el, img.currentSrc);
5179
- };
5180
- attr(img, 'src', src);
5181
- return img;
5182
- }
5162
+ function parseSymbols(svg, icon) {
5163
+ if (!symbols[svg]) {
5164
+ symbols[svg] = {};
5183
5165
 
5184
- function wrapInPicture(img, sources) {
5185
- sources = parseSources(sources);
5166
+ symbolRe.lastIndex = 0;
5186
5167
 
5187
- if (sources.length) {
5188
- const picture = fragment('<picture>');
5189
- for (const attrs of sources) {
5190
- const source = fragment('<source>');
5191
- attr(source, attrs);
5192
- append(picture, source);
5168
+ let match;
5169
+ while (match = symbolRe.exec(svg)) {
5170
+ symbols[svg][match[3]] = "<svg xmlns=\"http://www.w3.org/2000/svg\"" + match[1] + "svg>";
5193
5171
  }
5194
- append(picture, img);
5195
5172
  }
5173
+
5174
+ return symbols[svg][icon];
5196
5175
  }
5197
5176
 
5198
- function parseSources(sources) {
5199
- if (!sources) {
5200
- return [];
5177
+ function applyAnimation(el) {
5178
+ const length = getMaxPathLength(el);
5179
+
5180
+ if (length) {
5181
+ el.style.setProperty('--uk-animation-stroke', length);
5201
5182
  }
5183
+ }
5202
5184
 
5203
- if (startsWith(sources, '[')) {
5185
+ function getMaxPathLength(el) {
5186
+ return Math.ceil(
5187
+ Math.max(
5188
+ 0,
5189
+ ...$$('[stroke]', el).map((stroke) => {
5204
5190
  try {
5205
- sources = JSON.parse(sources);
5191
+ return stroke.getTotalLength();
5206
5192
  } catch (e) {
5207
- sources = [];
5193
+ return 0;
5208
5194
  }
5209
- } else {
5210
- sources = parseOptions(sources);
5211
- }
5195
+ })));
5212
5196
 
5213
- if (!isArray(sources)) {
5214
- sources = [sources];
5215
- }
5216
5197
 
5217
- return sources.filter((source) => !isEmpty(source));
5218
5198
  }
5219
5199
 
5220
- function ensureSrcAttribute(el) {
5221
- if (isImg(el) && !hasAttr(el, 'src')) {
5222
- attr(el, 'src', 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"></svg>');
5200
+ function insertSVG(el, root) {
5201
+ if (isVoidElement(root) || isTag(root, 'canvas')) {
5202
+ root.hidden = true;
5203
+
5204
+ const next = root.nextElementSibling;
5205
+ return equals(el, next) ? next : after(root, el);
5223
5206
  }
5207
+
5208
+ const last = root.lastElementChild;
5209
+ return equals(el, last) ? last : append(root, el);
5224
5210
  }
5225
5211
 
5226
- function isPicture(el) {
5227
- return isTag(el, 'picture');
5212
+ function equals(el, other) {
5213
+ return isTag(el, 'svg') && isTag(other, 'svg') && innerHTML(el) === innerHTML(other);
5228
5214
  }
5229
5215
 
5230
- function isImg(el) {
5231
- return isTag(el, 'img');
5216
+ function innerHTML(el) {
5217
+ return (
5218
+ el.innerHTML ||
5219
+ new XMLSerializer().serializeToString(el).replace(/<svg.*?>(.*?)<\/svg>/g, '$1')).
5220
+ replace(/\s/g, '');
5232
5221
  }
5233
5222
 
5234
- var Media = {
5235
- props: {
5236
- media: Boolean },
5223
+ var closeIcon = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" xmlns=\"http://www.w3.org/2000/svg\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"1\" y1=\"1\" x2=\"13\" y2=\"13\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"13\" y1=\"1\" x2=\"1\" y2=\"13\"/></svg>";
5224
+
5225
+ var closeLarge = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"1\" y1=\"1\" x2=\"19\" y2=\"19\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"19\" y1=\"1\" x2=\"1\" y2=\"19\"/></svg>";
5226
+
5227
+ var marker = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"9\" y=\"4\" width=\"1\" height=\"11\"/><rect x=\"4\" y=\"9\" width=\"11\" height=\"1\"/></svg>";
5228
+
5229
+ var navParentIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 3.5 6 8.5 11 3.5\"/></svg>";
5230
+
5231
+ var navParentIconLarge = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 4 7 10 13 4\"/></svg>";
5232
+
5233
+ var navbarParentIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" points=\"1 3.5 6 8.5 11 3.5\"/></svg>";
5234
+
5235
+ var navbarToggleIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><style>.uk-navbar-toggle svg > [class*='line-'] {\n transition: 0.2s ease-in-out;\n transition-property: transform, opacity,;\n transform-origin: center;\n opacity: 1;\n }\n\n .uk-navbar-toggle[aria-expanded=\"true\"] svg > .line-2 { transform: rotate(45deg); }\n .uk-navbar-toggle[aria-expanded=\"true\"] svg > .line-3 { transform: rotate(-45deg); }\n\n .uk-navbar-toggle[aria-expanded=\"true\"] svg > .line-1,\n .uk-navbar-toggle[aria-expanded=\"true\"] svg > .line-4 { opacity: 0; }\n .uk-navbar-toggle[aria-expanded=\"true\"] svg > .line-1 { transform: translateY(6px) scaleX(0); }\n .uk-navbar-toggle[aria-expanded=\"true\"] svg > .line-4 { transform: translateY(-6px) scaleX(0); }</style><rect class=\"line-1\" y=\"3\" width=\"20\" height=\"2\"/><rect class=\"line-2\" y=\"9\" width=\"20\" height=\"2\"/><rect class=\"line-3\" y=\"9\" width=\"20\" height=\"2\"/><rect class=\"line-4\" y=\"15\" width=\"20\" height=\"2\"/></svg>";
5236
+
5237
+ var overlayIcon = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"19\" y=\"0\" width=\"1\" height=\"40\"/><rect x=\"0\" y=\"19\" width=\"40\" height=\"1\"/></svg>";
5238
+
5239
+ var paginationNext = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 1 6 6 1 11\"/></svg>";
5240
+
5241
+ var paginationPrevious = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"6 1 1 6 6 11\"/></svg>";
5242
+
5243
+ var searchIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"9\" cy=\"9\" r=\"7\"/><path fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" d=\"M14,14 L18,18 L14,14 Z\"/></svg>";
5244
+
5245
+ var searchLarge = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" cx=\"17.5\" cy=\"17.5\" r=\"16.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" x1=\"38\" y1=\"39\" x2=\"29\" y2=\"30\"/></svg>";
5246
+
5247
+ var searchNavbar = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"10.5\" cy=\"10.5\" r=\"9.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"23\" y1=\"23\" x2=\"17\" y2=\"17\"/></svg>";
5248
+
5249
+ var slidenavNext = "<svg width=\"14\" height=\"24\" viewBox=\"0 0 14 24\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"1.225,23 12.775,12 1.225,1 \"/></svg>";
5250
+
5251
+ var slidenavNextLarge = "<svg width=\"25\" height=\"40\" viewBox=\"0 0 25 40\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"4.002,38.547 22.527,20.024 4,1.5 \"/></svg>";
5252
+
5253
+ var slidenavPrevious = "<svg width=\"14\" height=\"24\" viewBox=\"0 0 14 24\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"12.775,1 1.225,12 12.775,23 \"/></svg>";
5254
+
5255
+ var slidenavPreviousLarge = "<svg width=\"25\" height=\"40\" viewBox=\"0 0 25 40\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"20.527,1.5 2,20.024 20.525,38.547 \"/></svg>";
5256
+
5257
+ var spinner = "<svg width=\"30\" height=\"30\" viewBox=\"0 0 30 30\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" cx=\"15\" cy=\"15\" r=\"14\"/></svg>";
5258
+
5259
+ var totop = "<svg width=\"18\" height=\"10\" viewBox=\"0 0 18 10\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 9 9 1 17 9 \"/></svg>";
5260
+
5261
+ const icons = {
5262
+ spinner,
5263
+ totop,
5264
+ marker,
5265
+ 'close-icon': closeIcon,
5266
+ 'close-large': closeLarge,
5267
+ 'nav-parent-icon': navParentIcon,
5268
+ 'nav-parent-icon-large': navParentIconLarge,
5269
+ 'navbar-parent-icon': navbarParentIcon,
5270
+ 'navbar-toggle-icon': navbarToggleIcon,
5271
+ 'overlay-icon': overlayIcon,
5272
+ 'pagination-next': paginationNext,
5273
+ 'pagination-previous': paginationPrevious,
5274
+ 'search-icon': searchIcon,
5275
+ 'search-large': searchLarge,
5276
+ 'search-navbar': searchNavbar,
5277
+ 'slidenav-next': slidenavNext,
5278
+ 'slidenav-next-large': slidenavNextLarge,
5279
+ 'slidenav-previous': slidenavPrevious,
5280
+ 'slidenav-previous-large': slidenavPreviousLarge };
5281
+
5282
+
5283
+ const Icon = {
5284
+ install: install$1,
5285
+
5286
+ extends: SVG,
5237
5287
 
5288
+ args: 'icon',
5289
+
5290
+ props: ['icon'],
5238
5291
 
5239
5292
  data: {
5240
- media: false },
5293
+ include: ['focusable'] },
5241
5294
 
5242
5295
 
5243
- connected() {
5244
- const media = toMedia(this.media);
5245
- this.matchMedia = true;
5246
- if (media) {
5247
- this.mediaObj = window.matchMedia(media);
5248
- const handler = () => {
5249
- this.matchMedia = this.mediaObj.matches;
5250
- trigger(this.$el, createEvent('mediachange', false, true, [this.mediaObj]));
5251
- };
5252
- this.offMediaObj = on(this.mediaObj, 'change', () => {
5253
- handler();
5254
- this.$emit('resize');
5255
- });
5256
- handler();
5257
- }
5296
+ isIcon: true,
5297
+
5298
+ beforeConnect() {
5299
+ addClass(this.$el, 'uk-icon');
5258
5300
  },
5259
5301
 
5260
- disconnected() {var _this$offMediaObj;
5261
- (_this$offMediaObj = this.offMediaObj) == null ? void 0 : _this$offMediaObj.call(this);
5302
+ methods: {
5303
+ async getSvg() {
5304
+ const icon = getIcon(this.icon);
5305
+
5306
+ if (!icon) {
5307
+ throw 'Icon not found.';
5308
+ }
5309
+
5310
+ return icon;
5311
+ } } };
5312
+
5313
+ const IconComponent = {
5314
+ args: false,
5315
+
5316
+ extends: Icon,
5317
+
5318
+ data: (vm) => ({
5319
+ icon: hyphenate(vm.constructor.options.name) }),
5320
+
5321
+
5322
+ beforeConnect() {
5323
+ addClass(this.$el, this.$name);
5262
5324
  } };
5263
5325
 
5264
5326
 
5265
- function toMedia(value) {
5266
- if (isString(value)) {
5267
- if (startsWith(value, '@')) {
5268
- const name = "breakpoint-" + value.substr(1);
5269
- value = toFloat(getCssVar(name));
5270
- } else if (isNaN(value)) {
5271
- return value;
5272
- }
5273
- }
5327
+ const NavParentIcon = {
5328
+ extends: IconComponent,
5274
5329
 
5275
- return value && isNumeric(value) ? "(min-width: " + value + "px)" : '';
5276
- }
5330
+ beforeConnect() {
5331
+ const icon = this.$props.icon;
5332
+ this.icon = closest(this.$el, '.uk-nav-primary') ? icon + "-large" : icon;
5333
+ } };
5277
5334
 
5278
- var leader = {
5279
- mixins: [Class, Media, Resize],
5280
5335
 
5281
- props: {
5282
- fill: String },
5336
+ const Slidenav = {
5337
+ extends: IconComponent,
5338
+
5339
+ beforeConnect() {
5340
+ addClass(this.$el, 'uk-slidenav');
5341
+ const icon = this.$props.icon;
5342
+ this.icon = hasClass(this.$el, 'uk-slidenav-large') ? icon + "-large" : icon;
5343
+ } };
5283
5344
 
5284
5345
 
5285
- data: {
5286
- fill: '',
5287
- clsWrapper: 'uk-leader-fill',
5288
- clsHide: 'uk-leader-hide',
5289
- attrFill: 'data-fill' },
5346
+ const Search = {
5347
+ extends: IconComponent,
5290
5348
 
5349
+ beforeConnect() {
5350
+ this.icon =
5351
+ hasClass(this.$el, 'uk-search-icon') && parents(this.$el, '.uk-search-large').length ?
5352
+ 'search-large' :
5353
+ parents(this.$el, '.uk-search-navbar').length ?
5354
+ 'search-navbar' :
5355
+ this.$props.icon;
5356
+ } };
5291
5357
 
5292
- computed: {
5293
- fill(_ref) {let { fill } = _ref;
5294
- return fill || getCssVar('leader-fill-content');
5295
- } },
5296
5358
 
5359
+ const Close = {
5360
+ extends: IconComponent,
5297
5361
 
5298
- connected() {
5299
- [this.wrapper] = wrapInner(this.$el, "<span class=\"" + this.clsWrapper + "\">");
5300
- },
5362
+ beforeConnect() {
5363
+ this.icon = "close-" + (hasClass(this.$el, 'uk-close-large') ? 'large' : 'icon');
5364
+ } };
5301
5365
 
5302
- disconnected() {
5303
- unwrap(this.wrapper.childNodes);
5304
- },
5305
5366
 
5306
- update: {
5307
- read() {
5308
- const width = Math.trunc(this.$el.offsetWidth / 2);
5367
+ const Spinner = {
5368
+ extends: IconComponent,
5309
5369
 
5310
- return {
5311
- width,
5312
- fill: this.fill,
5313
- hide: !this.matchMedia };
5370
+ methods: {
5371
+ async getSvg() {
5372
+ const icon = await Icon.methods.getSvg.call(this);
5314
5373
 
5315
- },
5374
+ if (this.ratio !== 1) {
5375
+ css($('circle', icon), 'strokeWidth', 1 / this.ratio);
5376
+ }
5316
5377
 
5317
- write(_ref2) {let { width, fill, hide } = _ref2;
5318
- toggleClass(this.wrapper, this.clsHide, hide);
5319
- attr(this.wrapper, this.attrFill, new Array(width).join(fill));
5320
- },
5378
+ return icon;
5379
+ } } };
5321
5380
 
5322
- events: ['resize'] } };
5323
5381
 
5324
- const active = [];
5325
5382
 
5326
- var Modal = {
5327
- mixins: [Class, Container, Togglable],
5383
+ const parsed = {};
5384
+ function install$1(UIkit) {
5385
+ UIkit.icon.add = (name, svg) => {
5386
+ const added = isString(name) ? { [name]: svg } : name;
5387
+ each(added, (svg, name) => {
5388
+ icons[name] = svg;
5389
+ delete parsed[name];
5390
+ });
5328
5391
 
5329
- props: {
5330
- selPanel: String,
5331
- selClose: String,
5332
- escClose: Boolean,
5333
- bgClose: Boolean,
5334
- stack: Boolean },
5392
+ if (UIkit._initialized) {
5393
+ apply(document.body, (el) =>
5394
+ each(UIkit.getComponents(el), (cmp) => {
5395
+ cmp.$options.isIcon && cmp.icon in added && cmp.$reset();
5396
+ }));
5335
5397
 
5398
+ }
5399
+ };
5400
+ }
5336
5401
 
5337
- data: {
5338
- cls: 'uk-open',
5339
- escClose: true,
5340
- bgClose: true,
5341
- overlay: true,
5342
- stack: false },
5402
+ function getIcon(icon) {
5403
+ if (!icons[icon]) {
5404
+ return null;
5405
+ }
5343
5406
 
5407
+ if (!parsed[icon]) {
5408
+ parsed[icon] = $((icons[applyRtl(icon)] || icons[icon]).trim());
5409
+ }
5344
5410
 
5345
- computed: {
5346
- panel(_ref, $el) {let { selPanel } = _ref;
5347
- return $(selPanel, $el);
5348
- },
5411
+ return parsed[icon].cloneNode(true);
5412
+ }
5349
5413
 
5350
- transitionElement() {
5351
- return this.panel;
5352
- },
5414
+ function applyRtl(icon) {
5415
+ return isRtl ? swap(swap(icon, 'left', 'right'), 'previous', 'next') : icon;
5416
+ }
5353
5417
 
5354
- bgClose(_ref2) {let { bgClose } = _ref2;
5355
- return bgClose && this.panel;
5356
- } },
5418
+ const nativeLazyLoad = inBrowser && 'loading' in HTMLImageElement.prototype;
5357
5419
 
5420
+ var img = {
5421
+ args: 'dataSrc',
5358
5422
 
5359
- beforeDisconnect() {
5360
- if (includes(active, this)) {
5361
- this.toggleElement(this.$el, false, false);
5362
- }
5363
- },
5423
+ props: {
5424
+ dataSrc: String,
5425
+ sources: String,
5426
+ offsetTop: String,
5427
+ offsetLeft: String,
5428
+ target: String,
5429
+ loading: String },
5364
5430
 
5365
- events: [
5366
- {
5367
- name: 'click',
5368
5431
 
5369
- delegate() {
5370
- return this.selClose;
5371
- },
5432
+ data: {
5433
+ dataSrc: '',
5434
+ sources: false,
5435
+ offsetTop: '50vh',
5436
+ offsetLeft: '50vw',
5437
+ target: false,
5438
+ loading: 'lazy' },
5372
5439
 
5373
- handler(e) {
5374
- e.preventDefault();
5375
- this.hide();
5376
- } },
5377
5440
 
5441
+ connected() {
5442
+ if (this.loading !== 'lazy') {
5443
+ this.load();
5444
+ return;
5445
+ }
5378
5446
 
5379
- {
5380
- name: 'toggle',
5447
+ const target = [this.$el, ...queryAll(this.$props.target, this.$el)];
5381
5448
 
5382
- self: true,
5449
+ if (nativeLazyLoad && isImg(this.$el)) {
5450
+ this.$el.loading = 'lazy';
5451
+ setSrcAttrs(this.$el);
5383
5452
 
5384
- handler(e) {
5385
- if (e.defaultPrevented) {
5453
+ if (target.length === 1) {
5386
5454
  return;
5387
5455
  }
5456
+ }
5388
5457
 
5389
- e.preventDefault();
5458
+ ensureSrcAttribute(this.$el);
5390
5459
 
5391
- if (this.isToggled() === includes(active, this)) {
5392
- this.toggle();
5393
- }
5394
- } },
5460
+ this.registerObserver(
5461
+ observeIntersection(
5462
+ target,
5463
+ (entries, observer) => {
5464
+ this.load();
5465
+ observer.disconnect();
5466
+ },
5467
+ {
5468
+ rootMargin: toPx(this.offsetTop, 'height') + "px " + toPx(
5469
+ this.offsetLeft,
5470
+ 'width') + "px" }));
5395
5471
 
5396
5472
 
5397
- {
5398
- name: 'beforeshow',
5399
5473
 
5400
- self: true,
5401
5474
 
5402
- handler(e) {
5403
- if (includes(active, this)) {
5404
- return false;
5405
- }
5475
+ },
5406
5476
 
5407
- if (!this.stack && active.length) {
5408
- Promise.all(active.map((modal) => modal.hide())).then(this.show);
5409
- e.preventDefault();
5410
- } else {
5411
- active.push(this);
5412
- }
5413
- } },
5477
+ disconnected() {
5478
+ if (this._data.image) {
5479
+ this._data.image.onload = '';
5480
+ }
5481
+ },
5414
5482
 
5483
+ methods: {
5484
+ load() {
5485
+ if (this._data.image) {
5486
+ return this._data.image;
5487
+ }
5415
5488
 
5416
- {
5417
- name: 'show',
5489
+ const image = isImg(this.$el) ?
5490
+ this.$el :
5491
+ getImageFromElement(this.$el, this.dataSrc, this.sources);
5418
5492
 
5419
- self: true,
5493
+ removeAttr(image, 'loading');
5494
+ setSrcAttrs(this.$el, image.currentSrc);
5495
+ return this._data.image = image;
5496
+ } } };
5420
5497
 
5421
- handler() {
5422
- const docEl = document.documentElement;
5423
5498
 
5424
- if (width(window) > docEl.clientWidth && this.overlay) {
5425
- css(document.body, 'overflowY', 'scroll');
5426
- }
5427
5499
 
5428
- if (this.stack) {
5429
- css(this.$el, 'zIndex', toFloat(css(this.$el, 'zIndex')) + active.length);
5430
- }
5500
+ function setSrcAttrs(el, src) {
5501
+ if (isImg(el)) {
5502
+ const parentNode = parent(el);
5503
+ const elements = isPicture(parentNode) ? children(parentNode) : [el];
5504
+ elements.forEach((el) => setSourceProps(el, el));
5505
+ } else if (src) {
5506
+ const change = !includes(el.style.backgroundImage, src);
5507
+ if (change) {
5508
+ css(el, 'backgroundImage', "url(" + escape(src) + ")");
5509
+ trigger(el, createEvent('load', false));
5510
+ }
5511
+ }
5512
+ }
5431
5513
 
5432
- addClass(docEl, this.clsPage);
5514
+ const srcProps = ['data-src', 'data-srcset', 'sizes'];
5515
+ function setSourceProps(sourceEl, targetEl) {
5516
+ srcProps.forEach((prop) => {
5517
+ const value = data(sourceEl, prop);
5518
+ if (value) {
5519
+ attr(targetEl, prop.replace(/^(data-)+/, ''), value);
5520
+ }
5521
+ });
5522
+ }
5433
5523
 
5434
- if (this.bgClose) {
5435
- once(
5436
- this.$el,
5437
- 'hide',
5438
- on(document, pointerDown, (_ref3) => {let { target } = _ref3;
5439
- if (
5440
- last(active) !== this ||
5441
- this.overlay && !within(target, this.$el) ||
5442
- within(target, this.panel))
5443
- {
5444
- return;
5445
- }
5524
+ function getImageFromElement(el, src, sources) {
5525
+ const img = new Image();
5446
5526
 
5447
- once(
5448
- document,
5449
- pointerUp + " " + pointerCancel + " scroll",
5450
- (_ref4) => {let { defaultPrevented, type, target: newTarget } = _ref4;
5451
- if (
5452
- !defaultPrevented &&
5453
- type === pointerUp &&
5454
- target === newTarget)
5455
- {
5456
- this.hide();
5457
- }
5458
- },
5459
- true);
5527
+ wrapInPicture(img, sources);
5528
+ setSourceProps(el, img);
5529
+ img.onload = () => {
5530
+ setSrcAttrs(el, img.currentSrc);
5531
+ };
5532
+ attr(img, 'src', src);
5533
+ return img;
5534
+ }
5460
5535
 
5461
- }),
5462
- { self: true });
5536
+ function wrapInPicture(img, sources) {
5537
+ sources = parseSources(sources);
5463
5538
 
5464
- }
5539
+ if (sources.length) {
5540
+ const picture = fragment('<picture>');
5541
+ for (const attrs of sources) {
5542
+ const source = fragment('<source>');
5543
+ attr(source, attrs);
5544
+ append(picture, source);
5545
+ }
5546
+ append(picture, img);
5547
+ }
5548
+ }
5465
5549
 
5466
- if (this.escClose) {
5467
- once(
5468
- this.$el,
5469
- 'hide',
5470
- on(document, 'keydown', (e) => {
5471
- if (e.keyCode === 27 && last(active) === this) {
5472
- this.hide();
5473
- }
5474
- }),
5475
- { self: true });
5550
+ function parseSources(sources) {
5551
+ if (!sources) {
5552
+ return [];
5553
+ }
5476
5554
 
5477
- }
5478
- } },
5555
+ if (startsWith(sources, '[')) {
5556
+ try {
5557
+ sources = JSON.parse(sources);
5558
+ } catch (e) {
5559
+ sources = [];
5560
+ }
5561
+ } else {
5562
+ sources = parseOptions(sources);
5563
+ }
5479
5564
 
5565
+ if (!isArray(sources)) {
5566
+ sources = [sources];
5567
+ }
5480
5568
 
5481
- {
5482
- name: 'shown',
5569
+ return sources.filter((source) => !isEmpty(source));
5570
+ }
5483
5571
 
5484
- self: true,
5572
+ function ensureSrcAttribute(el) {
5573
+ if (isImg(el) && !hasAttr(el, 'src')) {
5574
+ attr(el, 'src', 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"></svg>');
5575
+ }
5576
+ }
5485
5577
 
5486
- handler() {
5487
- if (!isFocusable(this.$el)) {
5488
- attr(this.$el, 'tabindex', '-1');
5489
- }
5578
+ function isPicture(el) {
5579
+ return isTag(el, 'picture');
5580
+ }
5490
5581
 
5491
- if (!$(':focus', this.$el)) {
5492
- this.$el.focus();
5493
- }
5494
- } },
5582
+ function isImg(el) {
5583
+ return isTag(el, 'img');
5584
+ }
5495
5585
 
5586
+ var Media = {
5587
+ props: {
5588
+ media: Boolean },
5496
5589
 
5497
- {
5498
- name: 'hidden',
5499
5590
 
5500
- self: true,
5591
+ data: {
5592
+ media: false },
5501
5593
 
5502
- handler() {
5503
- if (includes(active, this)) {
5504
- active.splice(active.indexOf(this), 1);
5505
- }
5506
5594
 
5507
- if (!active.length) {
5508
- css(document.body, 'overflowY', '');
5509
- }
5595
+ connected() {
5596
+ const media = toMedia(this.media, this.$el);
5597
+ this.matchMedia = true;
5598
+ if (media) {
5599
+ this.mediaObj = window.matchMedia(media);
5600
+ const handler = () => {
5601
+ this.matchMedia = this.mediaObj.matches;
5602
+ trigger(this.$el, createEvent('mediachange', false, true, [this.mediaObj]));
5603
+ };
5604
+ this.offMediaObj = on(this.mediaObj, 'change', () => {
5605
+ handler();
5606
+ this.$emit('resize');
5607
+ });
5608
+ handler();
5609
+ }
5610
+ },
5510
5611
 
5511
- css(this.$el, 'zIndex', '');
5612
+ disconnected() {var _this$offMediaObj;
5613
+ (_this$offMediaObj = this.offMediaObj) == null ? void 0 : _this$offMediaObj.call(this);
5614
+ } };
5512
5615
 
5513
- if (!active.some((modal) => modal.clsPage === this.clsPage)) {
5514
- removeClass(document.documentElement, this.clsPage);
5515
- }
5516
- } }],
5517
5616
 
5617
+ function toMedia(value, element) {
5618
+ if (isString(value)) {
5619
+ if (startsWith(value, '@')) {
5620
+ value = toFloat(css(element, "--uk-breakpoint-" + value.substr(1)));
5621
+ } else if (isNaN(value)) {
5622
+ return value;
5623
+ }
5624
+ }
5518
5625
 
5626
+ return value && isNumeric(value) ? "(min-width: " + value + "px)" : '';
5627
+ }
5519
5628
 
5520
- methods: {
5521
- toggle() {
5522
- return this.isToggled() ? this.hide() : this.show();
5523
- },
5629
+ var leader = {
5630
+ mixins: [Class, Media, Resize],
5524
5631
 
5525
- show() {
5526
- if (this.container && parent(this.$el) !== this.container) {
5527
- append(this.container, this.$el);
5528
- return new Promise((resolve) =>
5529
- requestAnimationFrame(() => this.show().then(resolve)));
5632
+ props: {
5633
+ fill: String },
5530
5634
 
5531
- }
5532
5635
 
5533
- return this.toggleElement(this.$el, true, animate(this));
5534
- },
5636
+ data: {
5637
+ fill: '',
5638
+ clsWrapper: 'uk-leader-fill',
5639
+ clsHide: 'uk-leader-hide',
5640
+ attrFill: 'data-fill' },
5535
5641
 
5536
- hide() {
5537
- return this.toggleElement(this.$el, false, animate(this));
5538
- } } };
5539
5642
 
5643
+ computed: {
5644
+ fill(_ref) {let { fill } = _ref;
5645
+ return fill || css(this.$el, '--uk-leader-fill-content');
5646
+ } },
5540
5647
 
5541
5648
 
5542
- function animate(_ref5) {let { transitionElement, _toggle } = _ref5;
5543
- return (el, show) =>
5544
- new Promise((resolve, reject) =>
5545
- once(el, 'show hide', () => {
5546
- el._reject == null ? void 0 : el._reject();
5547
- el._reject = reject;
5649
+ connected() {
5650
+ [this.wrapper] = wrapInner(this.$el, "<span class=\"" + this.clsWrapper + "\">");
5651
+ },
5548
5652
 
5549
- _toggle(el, show);
5653
+ disconnected() {
5654
+ unwrap(this.wrapper.childNodes);
5655
+ },
5550
5656
 
5551
- const off = once(
5552
- transitionElement,
5553
- 'transitionstart',
5554
- () => {
5555
- once(transitionElement, 'transitionend transitioncancel', resolve, {
5556
- self: true });
5657
+ update: {
5658
+ read() {
5659
+ const width = Math.trunc(this.$el.offsetWidth / 2);
5557
5660
 
5558
- clearTimeout(timer);
5559
- },
5560
- { self: true });
5661
+ return {
5662
+ width,
5663
+ fill: this.fill,
5664
+ hide: !this.matchMedia };
5561
5665
 
5666
+ },
5562
5667
 
5563
- const timer = setTimeout(() => {
5564
- off();
5565
- resolve();
5566
- }, toMs(css(transitionElement, 'transitionDuration')));
5567
- })).
5568
- then(() => delete el._reject);
5569
- }
5668
+ write(_ref2) {let { width, fill, hide } = _ref2;
5669
+ toggleClass(this.wrapper, this.clsHide, hide);
5670
+ attr(this.wrapper, this.attrFill, new Array(width).join(fill));
5671
+ },
5570
5672
 
5571
- function toMs(time) {
5572
- return time ? endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000 : 0;
5573
- }
5673
+ events: ['resize'] } };
5574
5674
 
5575
5675
  var modal = {
5576
5676
  install,
@@ -5734,7 +5834,9 @@
5734
5834
  align: String,
5735
5835
  offset: Number,
5736
5836
  boundary: Boolean,
5737
- boundaryAlign: Boolean,
5837
+ target: Boolean,
5838
+ targetX: Boolean,
5839
+ targetY: Boolean,
5738
5840
  clsDrop: String,
5739
5841
  delayShow: Number,
5740
5842
  delayHide: Number,
@@ -5751,9 +5853,12 @@
5751
5853
  offset: undefined,
5752
5854
  delayShow: undefined,
5753
5855
  delayHide: undefined,
5754
- boundaryAlign: undefined,
5755
- flip: 'x',
5856
+ flip: false,
5857
+ shift: true,
5756
5858
  boundary: true,
5859
+ target: false,
5860
+ targetX: false,
5861
+ targetY: false,
5757
5862
  dropbar: false,
5758
5863
  dropbarAnchor: false,
5759
5864
  duration: 200,
@@ -5788,7 +5893,7 @@
5788
5893
  },
5789
5894
 
5790
5895
  watch(dropbar) {
5791
- addClass(dropbar, 'uk-navbar-dropbar');
5896
+ addClass(dropbar, 'uk-dropbar', 'uk-dropbar-top', 'uk-navbar-dropbar');
5792
5897
  },
5793
5898
 
5794
5899
  immediate: true },
@@ -5804,7 +5909,7 @@
5804
5909
 
5805
5910
  if (this.dropContainer !== $el) {
5806
5911
  for (const el of $$("." + clsDrop, this.dropContainer)) {var _this$getDropdown;
5807
- const target = (_this$getDropdown = this.getDropdown(el)) == null ? void 0 : _this$getDropdown.target;
5912
+ const target = (_this$getDropdown = this.getDropdown(el)) == null ? void 0 : _this$getDropdown.targetEl;
5808
5913
  if (!includes(dropdowns, el) && target && within(target, this.$el)) {
5809
5914
  dropdowns.push(el);
5810
5915
  }
@@ -5821,8 +5926,7 @@
5821
5926
  {
5822
5927
  ...this.$props,
5823
5928
  boundary: this.boundary,
5824
- pos: this.pos,
5825
- offset: this.dropbar || this.offset });
5929
+ pos: this.pos });
5826
5930
 
5827
5931
 
5828
5932
  },
@@ -5867,8 +5971,8 @@
5867
5971
  if (
5868
5972
  active &&
5869
5973
  includes(active.mode, 'hover') &&
5870
- active.target &&
5871
- !within(active.target, current) &&
5974
+ active.targetEl &&
5975
+ !within(active.targetEl, current) &&
5872
5976
  !active.isDelaying)
5873
5977
  {
5874
5978
  active.hide(false);
@@ -5890,7 +5994,7 @@
5890
5994
  if (keyCode === keyMap.DOWN && hasAttr(current, 'aria-expanded')) {
5891
5995
  e.preventDefault();
5892
5996
 
5893
- if (!active || active.target !== current) {
5997
+ if (!active || active.targetEl !== current) {
5894
5998
  current.click();
5895
5999
  once(this.dropContainer, 'show', (_ref8) => {let { target } = _ref8;return (
5896
6000
  focusFirstFocusableElement(target));});
@@ -5940,8 +6044,8 @@
5940
6044
  }
5941
6045
  }
5942
6046
 
5943
- if (keyCode === keyMap.ESC) {var _active$target;
5944
- active == null ? void 0 : (_active$target = active.target) == null ? void 0 : _active$target.focus();
6047
+ if (keyCode === keyMap.ESC) {var _active$targetEl;
6048
+ active == null ? void 0 : (_active$targetEl = active.targetEl) == null ? void 0 : _active$targetEl.focus();
5945
6049
  }
5946
6050
 
5947
6051
  handleNavItemNavigation(e, this.toggles, active);
@@ -5983,8 +6087,8 @@
5983
6087
  return this.dropbar;
5984
6088
  },
5985
6089
 
5986
- handler(_, _ref9) {let { $el, align } = _ref9;
5987
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
6090
+ handler(_ref9) {let { target } = _ref9;
6091
+ if (!this.isDropbarDrop(target)) {
5988
6092
  return;
5989
6093
  }
5990
6094
 
@@ -5992,7 +6096,7 @@
5992
6096
  after(this.dropbarAnchor || this.$el, this.dropbar);
5993
6097
  }
5994
6098
 
5995
- addClass($el, this.clsDrop + "-dropbar");
6099
+ addClass(target, this.clsDrop + "-dropbar");
5996
6100
  } },
5997
6101
 
5998
6102
 
@@ -6007,19 +6111,24 @@
6007
6111
  return this.dropbar;
6008
6112
  },
6009
6113
 
6010
- handler(_, _ref10) {let { $el, align } = _ref10;
6011
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
6114
+ handler(_ref10) {let { target } = _ref10;
6115
+ if (!this.isDropbarDrop(target)) {
6012
6116
  return;
6013
6117
  }
6014
6118
 
6015
- this._observer = observeResize($el, () =>
6016
- this.transitionTo(
6017
- offset($el).bottom -
6018
- offset(this.dropbar).top +
6019
- toFloat(css($el, 'marginBottom')),
6020
- $el));
6021
-
6119
+ this._observer = observeResize(target, () => {
6120
+ const targetOffsets = parents(target, "." + this.clsDrop).
6121
+ concat(target).
6122
+ map((el) => offset(el));
6123
+ const minTop = Math.min(...targetOffsets.map((_ref11) => {let { top } = _ref11;return top;}));
6124
+ const maxBottom = Math.max(...targetOffsets.map((_ref12) => {let { bottom } = _ref12;return bottom;}));
6125
+ const dropbarOffset = offset(this.dropbar);
6126
+ css(this.dropbar, 'top', this.dropbar.offsetTop - (dropbarOffset.top - minTop));
6127
+ this.transitionTo(
6128
+ maxBottom - minTop + toFloat(css(target, 'marginBottom')),
6129
+ target);
6022
6130
 
6131
+ });
6023
6132
  } },
6024
6133
 
6025
6134
 
@@ -6034,13 +6143,13 @@
6034
6143
  return this.dropbar;
6035
6144
  },
6036
6145
 
6037
- handler(e, _ref11) {let { $el } = _ref11;
6146
+ handler(e) {
6038
6147
  const active = this.getActive();
6039
6148
 
6040
6149
  if (
6041
6150
  matches(this.dropbar, ':hover') &&
6042
- (active == null ? void 0 : active.$el) === $el &&
6043
- !this.toggles.some((el) => active.target !== el && matches(el, ':focus')))
6151
+ (active == null ? void 0 : active.$el) === e.target &&
6152
+ !this.toggles.some((el) => active.targetEl !== el && matches(el, ':focus')))
6044
6153
  {
6045
6154
  e.preventDefault();
6046
6155
  }
@@ -6058,8 +6167,8 @@
6058
6167
  return this.dropbar;
6059
6168
  },
6060
6169
 
6061
- handler(_, _ref12) {let { $el, align } = _ref12;
6062
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
6170
+ handler(_ref13) {let { target } = _ref13;
6171
+ if (!this.isDropbarDrop(target)) {
6063
6172
  return;
6064
6173
  }
6065
6174
 
@@ -6067,7 +6176,7 @@
6067
6176
 
6068
6177
  const active = this.getActive();
6069
6178
 
6070
- if (!active || (active == null ? void 0 : active.$el) === $el) {
6179
+ if (!active || (active == null ? void 0 : active.$el) === target) {
6071
6180
  this.transitionTo(0);
6072
6181
  }
6073
6182
  } }],
@@ -6076,7 +6185,7 @@
6076
6185
 
6077
6186
  methods: {
6078
6187
  getActive() {
6079
- return active$1 && within(active$1.target, this.$el) && active$1;
6188
+ return active && within(active.targetEl, this.$el) && active;
6080
6189
  },
6081
6190
 
6082
6191
  transitionTo(newHeight, el) {
@@ -6106,13 +6215,17 @@
6106
6215
 
6107
6216
  getDropdown(el) {
6108
6217
  return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');
6218
+ },
6219
+
6220
+ isDropbarDrop(el) {
6221
+ return this.getDropdown(el) && hasClass(el, this.clsDrop);
6109
6222
  } } };
6110
6223
 
6111
6224
 
6112
6225
 
6113
6226
  function handleNavItemNavigation(e, toggles, active) {
6114
6227
  const { current, keyCode } = e;
6115
- const target = (active == null ? void 0 : active.target) || current;
6228
+ const target = (active == null ? void 0 : active.targetEl) || current;
6116
6229
  const i = toggles.indexOf(target);
6117
6230
 
6118
6231
  // Left
@@ -6286,22 +6399,6 @@
6286
6399
  } },
6287
6400
 
6288
6401
 
6289
- {
6290
- name: 'touchstart',
6291
-
6292
- passive: true,
6293
-
6294
- el() {
6295
- return this.panel;
6296
- },
6297
-
6298
- handler(_ref8) {let { targetTouches } = _ref8;
6299
- if (targetTouches.length === 1) {
6300
- this.clientY = targetTouches[0].clientY;
6301
- }
6302
- } },
6303
-
6304
-
6305
6402
  {
6306
6403
  name: 'touchmove',
6307
6404
 
@@ -6317,33 +6414,6 @@
6317
6414
  } },
6318
6415
 
6319
6416
 
6320
- {
6321
- name: 'touchmove',
6322
-
6323
- passive: false,
6324
-
6325
- el() {
6326
- return this.panel;
6327
- },
6328
-
6329
- handler(e) {
6330
- if (e.targetTouches.length !== 1) {
6331
- return;
6332
- }
6333
-
6334
- const clientY = e.targetTouches[0].clientY - this.clientY;
6335
- const { scrollTop, scrollHeight, clientHeight } = this.panel;
6336
-
6337
- if (
6338
- clientHeight >= scrollHeight ||
6339
- scrollTop === 0 && clientY > 0 ||
6340
- scrollHeight - scrollTop <= clientHeight && clientY < 0)
6341
- {
6342
- e.cancelable && e.preventDefault();
6343
- }
6344
- } },
6345
-
6346
-
6347
6417
  {
6348
6418
  name: 'show',
6349
6419
 
@@ -6355,7 +6425,6 @@
6355
6425
  addClass(parent(this.panel), this.clsMode);
6356
6426
  }
6357
6427
 
6358
- css(document.documentElement, 'overflowY', this.overlay ? 'hidden' : '');
6359
6428
  addClass(document.body, this.clsContainer, this.clsFlip);
6360
6429
  css(document.body, 'touch-action', 'pan-y pinch-zoom');
6361
6430
  css(this.$el, 'display', 'block');
@@ -6363,7 +6432,7 @@
6363
6432
  addClass(
6364
6433
  this.panel,
6365
6434
  this.clsSidebarAnimation,
6366
- this.mode !== 'reveal' ? this.clsMode : '');
6435
+ this.mode === 'reveal' ? '' : this.clsMode);
6367
6436
 
6368
6437
 
6369
6438
  height(document.body); // force reflow
@@ -6400,8 +6469,6 @@
6400
6469
  removeClass(this.$el, this.clsOverlay);
6401
6470
  css(this.$el, 'display', '');
6402
6471
  removeClass(document.body, this.clsContainer, this.clsFlip);
6403
-
6404
- css(document.documentElement, 'overflowY', '');
6405
6472
  } },
6406
6473
 
6407
6474
 
@@ -6526,6 +6593,14 @@
6526
6593
  offset: 0 },
6527
6594
 
6528
6595
 
6596
+ connected() {
6597
+ registerClick(this);
6598
+ },
6599
+
6600
+ disconnected() {
6601
+ unregisterClick(this);
6602
+ },
6603
+
6529
6604
  methods: {
6530
6605
  async scrollTo(el) {
6531
6606
  el = el && $(el) || document.body;
@@ -6534,20 +6609,39 @@
6534
6609
  await scrollIntoView(el, { offset: this.offset });
6535
6610
  trigger(this.$el, 'scrolled', [this, el]);
6536
6611
  }
6537
- } },
6612
+ } } };
6538
6613
 
6539
6614
 
6540
- events: {
6541
- click(e) {
6542
- if (e.defaultPrevented) {
6543
- return;
6544
- }
6545
6615
 
6546
- e.preventDefault();
6547
- this.scrollTo(getTargetElement(this.$el));
6548
- } } };
6616
+ const components$1 = new Set();
6617
+ function registerClick(cmp) {
6618
+ if (!components$1.size) {
6619
+ on(document, 'click', clickHandler);
6620
+ }
6621
+
6622
+ components$1.add(cmp);
6623
+ }
6624
+
6625
+ function unregisterClick(cmp) {
6626
+ components$1.delete(cmp);
6627
+
6628
+ if (!components$1.length) {
6629
+ off(document, 'click', clickHandler);
6630
+ }
6631
+ }
6549
6632
 
6633
+ function clickHandler(e) {
6634
+ if (e.defaultPrevented) {
6635
+ return;
6636
+ }
6550
6637
 
6638
+ for (const component of components$1) {
6639
+ if (within(e.target, component.$el)) {
6640
+ e.preventDefault();
6641
+ component.scrollTo(getTargetElement(component.$el));
6642
+ }
6643
+ }
6644
+ }
6551
6645
 
6552
6646
  function getTargetElement(el) {
6553
6647
  return document.getElementById(decodeURIComponent(el.hash).substring(1));
@@ -6877,7 +6971,9 @@
6877
6971
  },
6878
6972
 
6879
6973
  handler() {
6880
- if (!location.hash || scrollTop(window) === 0) {
6974
+ const { scrollingElement } = document;
6975
+
6976
+ if (!location.hash || scrollingElement.scrollTop === 0) {
6881
6977
  return;
6882
6978
  }
6883
6979
 
@@ -6886,13 +6982,11 @@
6886
6982
  const elOffset = offset(this.$el);
6887
6983
 
6888
6984
  if (this.isFixed && intersectRect(targetOffset, elOffset)) {
6889
- scrollTop(
6890
- window,
6985
+ scrollingElement.scrollTop =
6891
6986
  targetOffset.top -
6892
6987
  elOffset.height -
6893
6988
  toPx(this.targetOffset, 'height', this.placeholder) -
6894
- toPx(this.offset, 'height', this.placeholder));
6895
-
6989
+ toPx(this.offset, 'height', this.placeholder);
6896
6990
  }
6897
6991
  });
6898
6992
  } }],
@@ -6990,7 +7084,7 @@
6990
7084
 
6991
7085
 
6992
7086
  {let { scroll: prevScroll = 0, dir: prevDir = 'down', overflow, overflowScroll = 0, start, end } = _ref4;
6993
- const scroll = scrollTop(window);
7087
+ const scroll = document.scrollingElement.scrollTop;
6994
7088
  const dir = prevScroll <= scroll ? 'down' : 'up';
6995
7089
 
6996
7090
  return {
@@ -7510,7 +7604,7 @@
7510
7604
 
7511
7605
 
7512
7606
  {
7513
- name: 'toggled',
7607
+ name: 'hide show',
7514
7608
 
7515
7609
  self: true,
7516
7610
 
@@ -7518,10 +7612,8 @@
7518
7612
  return this.target;
7519
7613
  },
7520
7614
 
7521
- handler(e, toggled) {
7522
- if (e.target === this.target[0]) {
7523
- this.updateAria(toggled);
7524
- }
7615
+ handler(_ref2) {let { type } = _ref2;
7616
+ this.updateAria(type === 'show');
7525
7617
  } },
7526
7618
 
7527
7619
 
@@ -7616,10 +7708,12 @@
7616
7708
  Video: Video,
7617
7709
  Close: Close,
7618
7710
  Spinner: Spinner,
7711
+ NavParentIcon: NavParentIcon,
7619
7712
  SlidenavNext: Slidenav,
7620
7713
  SlidenavPrevious: Slidenav,
7621
7714
  SearchIcon: Search,
7622
7715
  Marker: IconComponent,
7716
+ NavbarParentIcon: IconComponent,
7623
7717
  NavbarToggleIcon: IconComponent,
7624
7718
  OverlayIcon: IconComponent,
7625
7719
  PaginationNext: IconComponent,