uikit 3.11.1 → 3.11.2-dev.03e47c2ff

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 (222) hide show
  1. package/.eslintrc.json +4 -49
  2. package/.prettierignore +14 -0
  3. package/.prettierrc.json +13 -0
  4. package/.webstorm.js +3 -3
  5. package/CHANGELOG.md +59 -17
  6. package/build/.eslintrc.json +1 -3
  7. package/build/build.js +26 -28
  8. package/build/icons.js +7 -11
  9. package/build/less.js +48 -36
  10. package/build/package.json +2 -2
  11. package/build/prefix.js +21 -18
  12. package/build/publishDev.js +6 -8
  13. package/build/release.js +20 -17
  14. package/build/scope.js +21 -11
  15. package/build/scss.js +72 -39
  16. package/build/util.js +71 -62
  17. package/build/wrapper/icons.js +0 -2
  18. package/dist/css/uikit-core-rtl.css +127 -201
  19. package/dist/css/uikit-core-rtl.min.css +1 -1
  20. package/dist/css/uikit-core.css +127 -201
  21. package/dist/css/uikit-core.min.css +1 -1
  22. package/dist/css/uikit-rtl.css +129 -207
  23. package/dist/css/uikit-rtl.min.css +1 -1
  24. package/dist/css/uikit.css +129 -207
  25. package/dist/css/uikit.min.css +1 -1
  26. package/dist/js/components/countdown.js +88 -133
  27. package/dist/js/components/countdown.min.js +1 -1
  28. package/dist/js/components/filter.js +408 -439
  29. package/dist/js/components/filter.min.js +1 -1
  30. package/dist/js/components/lightbox-panel.js +1098 -1316
  31. package/dist/js/components/lightbox-panel.min.js +1 -1
  32. package/dist/js/components/lightbox.js +1144 -1393
  33. package/dist/js/components/lightbox.min.js +1 -1
  34. package/dist/js/components/notification.js +94 -114
  35. package/dist/js/components/notification.min.js +1 -1
  36. package/dist/js/components/parallax.js +345 -362
  37. package/dist/js/components/parallax.min.js +1 -1
  38. package/dist/js/components/slider-parallax.js +343 -350
  39. package/dist/js/components/slider-parallax.min.js +1 -1
  40. package/dist/js/components/slider.js +768 -843
  41. package/dist/js/components/slider.min.js +1 -1
  42. package/dist/js/components/slideshow-parallax.js +343 -350
  43. package/dist/js/components/slideshow-parallax.min.js +1 -1
  44. package/dist/js/components/slideshow.js +645 -793
  45. package/dist/js/components/slideshow.min.js +1 -1
  46. package/dist/js/components/sortable.js +587 -621
  47. package/dist/js/components/sortable.min.js +1 -1
  48. package/dist/js/components/tooltip.js +324 -356
  49. package/dist/js/components/tooltip.min.js +1 -1
  50. package/dist/js/components/upload.js +155 -167
  51. package/dist/js/components/upload.min.js +1 -1
  52. package/dist/js/uikit-core.js +5430 -6690
  53. package/dist/js/uikit-core.min.js +1 -1
  54. package/dist/js/uikit-icons.js +7 -9
  55. package/dist/js/uikit-icons.min.js +1 -1
  56. package/dist/js/uikit.js +8143 -9784
  57. package/dist/js/uikit.min.js +1 -1
  58. package/jsconfig.json +1 -1
  59. package/package.json +64 -60
  60. package/src/js/api/boot.js +25 -32
  61. package/src/js/api/component.js +15 -28
  62. package/src/js/api/global.js +6 -12
  63. package/src/js/api/hooks.js +14 -33
  64. package/src/js/api/instance.js +7 -15
  65. package/src/js/api/state.js +79 -100
  66. package/src/js/components/countdown.js +24 -50
  67. package/src/js/components/filter.js +70 -66
  68. package/src/js/components/index.js +13 -13
  69. package/src/js/components/internal/lightbox-animations.js +14 -25
  70. package/src/js/components/internal/slider-preload.js +37 -0
  71. package/src/js/components/internal/slider-transitioner.js +66 -45
  72. package/src/js/components/internal/slideshow-animations.js +46 -64
  73. package/src/js/components/lightbox-panel.js +107 -105
  74. package/src/js/components/lightbox.js +17 -39
  75. package/src/js/components/notification.js +49 -43
  76. package/src/js/components/parallax.js +21 -46
  77. package/src/js/components/slider-parallax.js +13 -23
  78. package/src/js/components/slider.js +95 -64
  79. package/src/js/components/slideshow-parallax.js +1 -1
  80. package/src/js/components/slideshow.js +15 -13
  81. package/src/js/components/sortable.js +126 -108
  82. package/src/js/components/tooltip.js +41 -31
  83. package/src/js/components/upload.js +52 -63
  84. package/src/js/core/accordion.js +53 -48
  85. package/src/js/core/alert.js +9 -17
  86. package/src/js/core/core.js +74 -53
  87. package/src/js/core/cover.js +11 -15
  88. package/src/js/core/drop.js +107 -93
  89. package/src/js/core/form-custom.js +20 -25
  90. package/src/js/core/gif.js +3 -7
  91. package/src/js/core/grid.js +57 -58
  92. package/src/js/core/height-match.js +16 -29
  93. package/src/js/core/height-viewport.js +29 -36
  94. package/src/js/core/icon.js +47 -52
  95. package/src/js/core/img.js +156 -138
  96. package/src/js/core/index.js +39 -39
  97. package/src/js/core/leader.js +9 -18
  98. package/src/js/core/margin.js +21 -37
  99. package/src/js/core/modal.js +49 -36
  100. package/src/js/core/nav.js +2 -4
  101. package/src/js/core/navbar.js +113 -85
  102. package/src/js/core/offcanvas.js +49 -53
  103. package/src/js/core/overflow-auto.js +13 -17
  104. package/src/js/core/responsive.js +14 -12
  105. package/src/js/core/scroll.js +10 -20
  106. package/src/js/core/scrollspy-nav.js +34 -31
  107. package/src/js/core/scrollspy.js +37 -54
  108. package/src/js/core/sticky.js +194 -123
  109. package/src/js/core/svg.js +68 -83
  110. package/src/js/core/switcher.js +47 -46
  111. package/src/js/core/tab.js +7 -10
  112. package/src/js/core/toggle.js +66 -67
  113. package/src/js/core/video.js +11 -22
  114. package/src/js/mixin/animate.js +19 -20
  115. package/src/js/mixin/class.js +2 -4
  116. package/src/js/mixin/container.js +7 -11
  117. package/src/js/mixin/internal/animate-fade.js +73 -30
  118. package/src/js/mixin/internal/animate-slide.js +58 -41
  119. package/src/js/mixin/internal/slideshow-animations.js +7 -14
  120. package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
  121. package/src/js/mixin/media.js +5 -10
  122. package/src/js/mixin/modal.js +89 -66
  123. package/src/js/mixin/parallax.js +175 -121
  124. package/src/js/mixin/position.js +26 -20
  125. package/src/js/mixin/slider-autoplay.js +12 -21
  126. package/src/js/mixin/slider-drag.js +64 -65
  127. package/src/js/mixin/slider-nav.js +26 -35
  128. package/src/js/mixin/slider-reactive.js +2 -8
  129. package/src/js/mixin/slider.js +48 -55
  130. package/src/js/mixin/slideshow.js +13 -19
  131. package/src/js/mixin/togglable.js +89 -63
  132. package/src/js/uikit-core.js +2 -4
  133. package/src/js/uikit.js +2 -4
  134. package/src/js/util/ajax.js +25 -40
  135. package/src/js/util/animation.js +77 -75
  136. package/src/js/util/attr.js +17 -21
  137. package/src/js/util/class.js +14 -52
  138. package/src/js/util/dimensions.js +78 -49
  139. package/src/js/util/dom.js +39 -66
  140. package/src/js/util/env.js +7 -12
  141. package/src/js/util/event.js +60 -59
  142. package/src/js/util/fastdom.js +3 -8
  143. package/src/js/util/filter.js +17 -34
  144. package/src/js/util/index.js +0 -1
  145. package/src/js/util/lang.js +82 -121
  146. package/src/js/util/mouse.js +19 -17
  147. package/src/js/util/options.js +35 -49
  148. package/src/js/util/player.js +41 -36
  149. package/src/js/util/position.js +54 -46
  150. package/src/js/util/selector.js +43 -58
  151. package/src/js/util/style.js +39 -49
  152. package/src/js/util/viewport.js +81 -66
  153. package/src/less/components/base.less +10 -33
  154. package/src/less/components/flex.less +0 -9
  155. package/src/less/components/form-range.less +48 -95
  156. package/src/less/components/form.less +0 -1
  157. package/src/less/components/height.less +3 -0
  158. package/src/less/components/leader.less +0 -1
  159. package/src/less/components/lightbox.less +0 -1
  160. package/src/less/components/modal.less +3 -7
  161. package/src/less/components/navbar.less +0 -7
  162. package/src/less/components/progress.less +14 -36
  163. package/src/less/components/slider.less +0 -3
  164. package/src/less/components/slideshow.less +0 -3
  165. package/src/less/components/text.less +16 -32
  166. package/src/less/components/utility.less +22 -0
  167. package/src/scss/components/base.scss +10 -33
  168. package/src/scss/components/flex.scss +0 -9
  169. package/src/scss/components/form-range.scss +48 -95
  170. package/src/scss/components/form.scss +3 -4
  171. package/src/scss/components/height.scss +3 -0
  172. package/src/scss/components/icon.scss +2 -2
  173. package/src/scss/components/leader.scss +0 -1
  174. package/src/scss/components/lightbox.scss +0 -1
  175. package/src/scss/components/modal.scss +3 -7
  176. package/src/scss/components/navbar.scss +0 -7
  177. package/src/scss/components/progress.scss +14 -36
  178. package/src/scss/components/search.scss +1 -1
  179. package/src/scss/components/slider.scss +0 -3
  180. package/src/scss/components/slideshow.scss +0 -3
  181. package/src/scss/components/text.scss +16 -32
  182. package/src/scss/components/utility.scss +22 -0
  183. package/src/scss/mixins-theme.scss +1 -1
  184. package/src/scss/mixins.scss +1 -1
  185. package/src/scss/variables-theme.scss +9 -9
  186. package/src/scss/variables.scss +9 -9
  187. package/tests/align.html +10 -10
  188. package/tests/animation.html +2 -2
  189. package/tests/article.html +2 -2
  190. package/tests/base.html +3 -3
  191. package/tests/card.html +10 -10
  192. package/tests/column.html +3 -3
  193. package/tests/comment.html +9 -9
  194. package/tests/dotnav.html +3 -3
  195. package/tests/image.html +296 -64
  196. package/tests/images/image-type.avif +0 -0
  197. package/tests/images/image-type.jpeg +0 -0
  198. package/tests/images/image-type.webp +0 -0
  199. package/tests/index.html +8 -8
  200. package/tests/js/index.js +114 -85
  201. package/tests/lightbox.html +10 -10
  202. package/tests/marker.html +2 -2
  203. package/tests/modal.html +8 -9
  204. package/tests/navbar.html +2 -2
  205. package/tests/overlay.html +7 -7
  206. package/tests/parallax.html +14 -5
  207. package/tests/position.html +12 -12
  208. package/tests/slidenav.html +12 -12
  209. package/tests/slider.html +20 -20
  210. package/tests/sortable.html +1 -1
  211. package/tests/sticky-parallax.html +86 -98
  212. package/tests/sticky.html +56 -24
  213. package/tests/svg.html +6 -6
  214. package/tests/table.html +11 -11
  215. package/tests/thumbnav.html +12 -12
  216. package/tests/transition.html +30 -30
  217. package/tests/utility.html +33 -33
  218. package/tests/video.html +1 -1
  219. package/tests/width.html +1 -1
  220. package/src/js/mixin/flex-bug.js +0 -56
  221. package/src/js/util/promise.js +0 -191
  222. package/tests/images/animated.gif +0 -0
@@ -1,6 +1,19 @@
1
1
  import Media from '../mixin/media';
2
- import {getMaxPathLength} from '../core/svg';
3
- import {css, Dimensions, each, isNumber, isString, isUndefined, noop, startsWith, toFloat, toPx, ucfirst} from 'uikit-util';
2
+ import { getMaxPathLength } from '../core/svg';
3
+ import {
4
+ css,
5
+ Dimensions,
6
+ each,
7
+ findIndex,
8
+ isNumber,
9
+ isString,
10
+ isUndefined,
11
+ noop,
12
+ toFloat,
13
+ toPx,
14
+ trigger,
15
+ ucfirst,
16
+ } from 'uikit-util';
4
17
 
5
18
  const props = {
6
19
  x: transformFn,
@@ -20,13 +33,12 @@ const props = {
20
33
  opacity: cssPropFn,
21
34
  stroke: strokeFn,
22
35
  bgx: backgroundFn,
23
- bgy: backgroundFn
36
+ bgy: backgroundFn,
24
37
  };
25
38
 
26
- const {keys} = Object;
39
+ const { keys } = Object;
27
40
 
28
41
  export default {
29
-
30
42
  mixins: [Media],
31
43
 
32
44
  props: fillObject(keys(props), 'list'),
@@ -34,75 +46,74 @@ export default {
34
46
  data: fillObject(keys(props), undefined),
35
47
 
36
48
  computed: {
37
-
38
49
  props(properties, $el) {
39
50
  return keys(props).reduce((result, prop) => {
40
51
  if (!isUndefined(properties[prop])) {
41
- result[prop] = props[prop].call(this, prop, $el, properties[prop].slice());
52
+ result[prop] = props[prop](prop, $el, properties[prop].slice());
42
53
  }
43
54
  return result;
44
55
  }, {});
45
- }
56
+ },
57
+ },
46
58
 
59
+ events: {
60
+ bgimageload() {
61
+ this.$emit();
62
+ },
47
63
  },
48
64
 
49
65
  methods: {
50
-
51
66
  reset() {
52
67
  each(this.getCss(0), (_, prop) => css(this.$el, prop, ''));
53
68
  },
54
69
 
55
70
  getCss(percent) {
56
- return keys(this.props).reduce((css, prop) => {
57
- this.props[prop](css, percent);
58
- return css;
59
- }, {transform: '', filter: ''});
60
- }
61
-
62
- }
63
-
71
+ return keys(this.props).reduce(
72
+ (css, prop) => {
73
+ this.props[prop](css, percent);
74
+ return css;
75
+ },
76
+ { transform: '', filter: '' }
77
+ );
78
+ },
79
+ },
64
80
  };
65
81
 
66
- function transformFn(prop, el, steps) {
67
-
68
- const unit = getUnit(steps) || {x: 'px', y: 'px', rotate: 'deg'}[prop] || '';
82
+ function transformFn(prop, el, stops) {
83
+ const unit = getUnit(stops) || { x: 'px', y: 'px', rotate: 'deg' }[prop] || '';
84
+ let transformFn;
69
85
 
70
86
  if (prop === 'x' || prop === 'y') {
71
87
  prop = `translate${ucfirst(prop)}`;
88
+ transformFn = (stop) => toFloat(toFloat(stop).toFixed(unit === 'px' ? 0 : 6));
72
89
  }
73
90
 
74
- steps = steps.map(toFloat);
75
-
76
- if (steps.length === 1) {
77
- steps.unshift(prop === 'scale' ? 1 : 0);
91
+ if (stops.length === 1) {
92
+ stops.unshift(prop === 'scale' ? 1 : 0);
78
93
  }
79
94
 
80
- return (css, percent) => {
81
- let value = getValue(steps, percent);
82
-
83
- if (startsWith(prop, 'translate')) {
84
- value = toFloat(value).toFixed(unit === 'px' ? 0 : 6);
85
- }
95
+ stops = parseStops(stops, transformFn);
86
96
 
87
- css.transform += ` ${prop}(${value}${unit})`;
97
+ return (css, percent) => {
98
+ css.transform += ` ${prop}(${getValue(stops, percent)}${unit})`;
88
99
  };
89
100
  }
90
101
 
91
- function colorFn(prop, el, steps) {
92
-
93
- if (steps.length === 1) {
94
- steps.unshift(getCssValue(el, prop, ''));
102
+ function colorFn(prop, el, stops) {
103
+ if (stops.length === 1) {
104
+ stops.unshift(getCssValue(el, prop, ''));
95
105
  }
96
106
 
97
- steps = steps.map(step => parseColor(el, step));
107
+ stops = parseStops(stops, (stop) => parseColor(el, stop));
98
108
 
99
109
  return (css, percent) => {
100
-
101
- const [start, end, p] = getStep(steps, percent);
102
- const value = start.map((value, i) => {
103
- value += p * (end[i] - value);
104
- return i === 3 ? toFloat(value) : parseInt(value, 10);
105
- }).join(',');
110
+ const [start, end, p] = getStop(stops, percent);
111
+ const value = start
112
+ .map((value, i) => {
113
+ value += p * (end[i] - value);
114
+ return i === 3 ? toFloat(value) : parseInt(value, 10);
115
+ })
116
+ .join(',');
106
117
  css[prop] = `rgba(${value})`;
107
118
  };
108
119
  }
@@ -116,103 +127,90 @@ function parseColor(el, color) {
116
127
  .map(toFloat);
117
128
  }
118
129
 
119
- function filterFn(prop, el, steps) {
120
-
121
- if (steps.length === 1) {
122
- steps.unshift(0);
130
+ function filterFn(prop, el, stops) {
131
+ if (stops.length === 1) {
132
+ stops.unshift(0);
123
133
  }
124
134
 
125
- const unit = getUnit(steps) || {blur: 'px', hue: 'deg'}[prop] || '%';
126
- prop = {fopacity: 'opacity', hue: 'hue-rotate'}[prop] || prop;
127
- steps = steps.map(toFloat);
135
+ const unit = getUnit(stops) || { blur: 'px', hue: 'deg' }[prop] || '%';
136
+ prop = { fopacity: 'opacity', hue: 'hue-rotate' }[prop] || prop;
137
+ stops = parseStops(stops);
128
138
 
129
139
  return (css, percent) => {
130
- const value = getValue(steps, percent);
140
+ const value = getValue(stops, percent);
131
141
  css.filter += ` ${prop}(${value + unit})`;
132
142
  };
133
143
  }
134
144
 
135
- function cssPropFn(prop, el, steps) {
136
-
137
- if (steps.length === 1) {
138
- steps.unshift(getCssValue(el, prop, ''));
145
+ function cssPropFn(prop, el, stops) {
146
+ if (stops.length === 1) {
147
+ stops.unshift(getCssValue(el, prop, ''));
139
148
  }
140
149
 
141
- steps = steps.map(toFloat);
150
+ stops = parseStops(stops);
142
151
 
143
152
  return (css, percent) => {
144
- css[prop] = getValue(steps, percent);
153
+ css[prop] = getValue(stops, percent);
145
154
  };
146
155
  }
147
156
 
148
- function strokeFn(prop, el, steps) {
149
-
150
- if (steps.length === 1) {
151
- steps.unshift(0);
157
+ function strokeFn(prop, el, stops) {
158
+ if (stops.length === 1) {
159
+ stops.unshift(0);
152
160
  }
153
161
 
154
- const unit = getUnit(steps);
155
- steps = steps.map(toFloat);
162
+ const unit = getUnit(stops);
163
+ const length = getMaxPathLength(el);
164
+ stops = parseStops(stops.reverse(), (stop) => {
165
+ stop = toFloat(stop);
166
+ return unit === '%' ? (stop * length) / 100 : stop;
167
+ });
156
168
 
157
- if (!steps.some(step => step)) {
169
+ if (!stops.some(([value]) => value)) {
158
170
  return noop;
159
171
  }
160
172
 
161
- const length = getMaxPathLength(el);
162
173
  css(el, 'strokeDasharray', length);
163
174
 
164
- if (unit === '%') {
165
- steps = steps.map(step => step * length / 100);
166
- }
167
-
168
- steps = steps.reverse();
169
-
170
175
  return (css, percent) => {
171
- css.strokeDashoffset = getValue(steps, percent);
176
+ css.strokeDashoffset = getValue(stops, percent);
172
177
  };
173
178
  }
174
179
 
175
- function backgroundFn(prop, el, steps) {
176
-
177
- if (steps.length === 1) {
178
- steps.unshift(0);
180
+ function backgroundFn(prop, el, stops) {
181
+ if (stops.length === 1) {
182
+ stops.unshift(0);
179
183
  }
180
184
 
181
185
  prop = prop.substr(-1);
182
186
  const attr = prop === 'y' ? 'height' : 'width';
183
- steps = steps.map(step => toPx(step, attr, el));
187
+ stops = parseStops(stops, (stop) => toPx(stop, attr, el));
184
188
 
185
- css(el, `background-position-${prop}`, '');
186
- const bgPos = css(el, 'backgroundPosition').split(' ')[prop === 'x' ? 0 : 1]; // IE 11 can't read background-position-[x|y]
189
+ const bgPos = getCssValue(el, `background-position-${prop}`, '');
187
190
 
188
191
  return getCssValue(el, 'backgroundSize', '') === 'cover'
189
- ? backgroundCoverFn.call(this, prop, el, steps, bgPos, attr)
190
- : setBackgroundPosFn(prop, steps, bgPos);
192
+ ? backgroundCoverFn(prop, el, stops, bgPos, attr)
193
+ : setBackgroundPosFn(prop, stops, bgPos);
191
194
  }
192
195
 
193
- function backgroundCoverFn(prop, el, steps, bgPos, attr) {
194
-
195
- const image = getBackgroundImage.call(this, el);
196
+ function backgroundCoverFn(prop, el, stops, bgPos, attr) {
197
+ const dimImage = getBackgroundImageDimensions(el);
196
198
 
197
- if (!image.naturalWidth) {
199
+ if (!dimImage.width) {
198
200
  return noop;
199
201
  }
200
202
 
201
- const min = Math.min(...steps);
202
- const max = Math.max(...steps);
203
- const down = steps.indexOf(min) < steps.indexOf(max);
203
+ const values = stops.map(([value]) => value);
204
+ const min = Math.min(...values);
205
+ const max = Math.max(...values);
206
+ const down = values.indexOf(min) < values.indexOf(max);
204
207
 
205
208
  const diff = max - min;
206
209
  let pos = (down ? -diff : 0) - (down ? min : max);
207
210
 
208
211
  const dimEl = {
209
212
  width: el.offsetWidth,
210
- height: el.offsetHeight
211
- };
212
-
213
- const dimImage = {
214
- width: image.naturalWidth,
215
- height: image.naturalHeight
213
+ height: el.offsetHeight,
216
214
  };
217
215
 
218
216
  const baseDim = Dimensions.cover(dimImage, dimEl);
@@ -221,7 +219,6 @@ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
221
219
  if (span < diff) {
222
220
  dimEl[attr] = baseDim[attr] + diff - span;
223
221
  } else if (span > diff) {
224
-
225
222
  const posPercentage = dimEl[attr] / toPx(bgPos, attr, el, true);
226
223
 
227
224
  if (posPercentage) {
@@ -231,7 +228,7 @@ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
231
228
 
232
229
  const dim = Dimensions.cover(dimImage, dimEl);
233
230
 
234
- const fn = setBackgroundPosFn(prop, steps, `${pos}px`);
231
+ const fn = setBackgroundPosFn(prop, stops, `${pos}px`);
235
232
  return (css, percent) => {
236
233
  fn(css, percent);
237
234
  css.backgroundSize = `${dim.width}px ${dim.height}px`;
@@ -239,50 +236,107 @@ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
239
236
  };
240
237
  }
241
238
 
242
- function setBackgroundPosFn(prop, steps, pos) {
239
+ function setBackgroundPosFn(prop, stops, pos) {
243
240
  return function (css, percent) {
244
- css[`background-position-${prop}`] = `calc(${pos} + ${getValue(steps, percent)}px)`;
241
+ css[`background-position-${prop}`] = `calc(${pos} + ${getValue(stops, percent)}px)`;
245
242
  };
246
243
  }
247
244
 
248
- function getBackgroundImage(el) {
245
+ const dimensions = {};
246
+ function getBackgroundImageDimensions(el) {
249
247
  const src = css(el, 'backgroundImage').replace(/^none|url\(["']?(.+?)["']?\)$/, '$1');
250
248
 
251
- const data = this._data;
252
-
253
- if (data[src]) {
254
- return data[src];
249
+ if (dimensions[src]) {
250
+ return dimensions[src];
255
251
  }
256
252
 
253
+ const image = new Image();
257
254
  if (src) {
258
- const img = new Image();
259
- img.src = src;
260
- if (!img.naturalWidth) {
261
- img.onload = () => this.$update();
262
- }
255
+ image.src = src;
263
256
 
264
- return data[src] = img;
257
+ if (!image.naturalWidth) {
258
+ image.onload = () => {
259
+ dimensions[src] = toDimensions(image);
260
+ trigger(el, 'bgimageload');
261
+ };
262
+ }
265
263
  }
264
+
265
+ return (dimensions[src] = toDimensions(image));
266
+ }
267
+
268
+ function toDimensions(image) {
269
+ return {
270
+ width: image.naturalWidth,
271
+ height: image.naturalHeight,
272
+ };
266
273
  }
267
274
 
268
- function getStep(steps, percent) {
269
- const count = steps.length - 1;
270
- const index = Math.min(Math.floor(count * percent), count - 1);
275
+ function parseStops(stops, fn = toFloat) {
276
+ const result = [];
277
+ const { length } = stops;
278
+ let nullIndex = 0;
279
+ for (let i = 0; i < length; i++) {
280
+ let [value, percent] = isString(stops[i]) ? stops[i].trim().split(' ') : [stops[i]];
281
+ value = fn(value);
282
+ percent = percent ? toFloat(percent) / 100 : null;
283
+
284
+ if (i === 0) {
285
+ if (percent === null) {
286
+ percent = 0;
287
+ } else if (percent) {
288
+ result.push([value, 0]);
289
+ }
290
+ } else if (i === length - 1) {
291
+ if (percent === null) {
292
+ percent = 1;
293
+ } else if (percent !== 1) {
294
+ result.push([value, percent]);
295
+ percent = 1;
296
+ }
297
+ }
271
298
 
272
- return steps
273
- .slice(index, index + 2)
274
- .concat(percent === 1 ? 1 : percent % (1 / count) * count);
299
+ result.push([value, percent]);
300
+
301
+ if (percent === null) {
302
+ nullIndex++;
303
+ } else if (nullIndex) {
304
+ const leftPercent = result[i - nullIndex - 1][1];
305
+ const p = (percent - leftPercent) / (nullIndex + 1);
306
+ for (let j = nullIndex; j > 0; j--) {
307
+ result[i - j][1] = leftPercent + p * (nullIndex - j + 1);
308
+ }
309
+
310
+ nullIndex = 0;
311
+ }
312
+ }
313
+
314
+ return result;
315
+ }
316
+
317
+ function getStop(stops, percent) {
318
+ const index = findIndex(stops.slice(1), ([, targetPercent]) => percent <= targetPercent) + 1;
319
+ return [
320
+ stops[index - 1][0],
321
+ stops[index][0],
322
+ (percent - stops[index - 1][1]) / (stops[index][1] - stops[index - 1][1]),
323
+ ];
275
324
  }
276
325
 
277
- function getValue(steps, percent) {
278
- const [start, end, p] = getStep(steps, percent);
279
- return isNumber(start)
280
- ? start + Math.abs(start - end) * p * (start < end ? 1 : -1)
281
- : +end;
326
+ function getValue(stops, percent) {
327
+ const [start, end, p] = getStop(stops, percent);
328
+ return isNumber(start) ? start + Math.abs(start - end) * p * (start < end ? 1 : -1) : +end;
282
329
  }
283
330
 
284
- function getUnit(steps, defaultUnit) {
285
- return steps.reduce((unit, step) => unit || isString(step) && step.replace(/[\d-]/g, '').trim(), '') || defaultUnit;
331
+ const unitRe = /^-?\d+([^\s]*)/;
332
+ function getUnit(stops, defaultUnit) {
333
+ for (const stop of stops) {
334
+ const match = stop.match?.(unitRe);
335
+ if (match) {
336
+ return match[1];
337
+ }
338
+ }
339
+ return defaultUnit;
286
340
  }
287
341
 
288
342
  function getCssValue(el, prop, value) {
@@ -1,24 +1,31 @@
1
- import {$, flipPosition, offset as getOffset, isNumeric, isRtl, positionAt, removeClasses, toggleClass} from 'uikit-util';
1
+ import {
2
+ $,
3
+ flipPosition,
4
+ offset as getOffset,
5
+ isNumeric,
6
+ isRtl,
7
+ positionAt,
8
+ removeClasses,
9
+ toggleClass,
10
+ } from 'uikit-util';
2
11
 
3
12
  export default {
4
-
5
13
  props: {
6
14
  pos: String,
7
15
  offset: null,
8
16
  flip: Boolean,
9
- clsPos: String
17
+ clsPos: String,
10
18
  },
11
19
 
12
20
  data: {
13
21
  pos: `bottom-${isRtl ? 'right' : 'left'}`,
14
22
  flip: true,
15
23
  offset: false,
16
- clsPos: ''
24
+ clsPos: '',
17
25
  },
18
26
 
19
27
  computed: {
20
-
21
- pos({pos}) {
28
+ pos({ pos }) {
22
29
  return pos.split('-').concat('center').slice(0, 2);
23
30
  },
24
31
 
@@ -28,32 +35,34 @@ export default {
28
35
 
29
36
  align() {
30
37
  return this.pos[1];
31
- }
32
-
38
+ },
33
39
  },
34
40
 
35
41
  methods: {
36
-
37
42
  positionAt(element, target, boundary) {
38
-
39
43
  removeClasses(element, `${this.clsPos}-(top|bottom|left|right)(-[a-z]+)?`);
40
44
 
41
- let {offset} = this;
45
+ let { offset } = this;
42
46
  const axis = this.getAxis();
43
47
 
44
48
  if (!isNumeric(offset)) {
45
49
  const node = $(offset);
46
50
  offset = node
47
- ? getOffset(node)[axis === 'x' ? 'left' : 'top'] - getOffset(target)[axis === 'x' ? 'right' : 'bottom']
51
+ ? getOffset(node)[axis === 'x' ? 'left' : 'top'] -
52
+ getOffset(target)[axis === 'x' ? 'right' : 'bottom']
48
53
  : 0;
49
54
  }
50
55
 
51
- const {x, y} = positionAt(
56
+ const { x, y } = positionAt(
52
57
  element,
53
58
  target,
54
- axis === 'x' ? `${flipPosition(this.dir)} ${this.align}` : `${this.align} ${flipPosition(this.dir)}`,
59
+ axis === 'x'
60
+ ? `${flipPosition(this.dir)} ${this.align}`
61
+ : `${this.align} ${flipPosition(this.dir)}`,
55
62
  axis === 'x' ? `${this.dir} ${this.align}` : `${this.align} ${this.dir}`,
56
- axis === 'x' ? `${this.dir === 'left' ? -offset : offset}` : ` ${this.dir === 'top' ? -offset : offset}`,
63
+ axis === 'x'
64
+ ? `${this.dir === 'left' ? -offset : offset}`
65
+ : ` ${this.dir === 'top' ? -offset : offset}`,
57
66
  null,
58
67
  this.flip,
59
68
  boundary
@@ -63,13 +72,10 @@ export default {
63
72
  this.align = axis === 'x' ? y : x;
64
73
 
65
74
  toggleClass(element, `${this.clsPos}-${this.dir}-${this.align}`, this.offset === false);
66
-
67
75
  },
68
76
 
69
77
  getAxis() {
70
78
  return this.dir === 'top' || this.dir === 'bottom' ? 'y' : 'x';
71
- }
72
-
73
- }
74
-
79
+ },
80
+ },
75
81
  };
@@ -1,17 +1,16 @@
1
- import {$, attr, matches} from 'uikit-util';
1
+ import { $, attr, matches } from 'uikit-util';
2
2
 
3
3
  export default {
4
-
5
4
  props: {
6
5
  autoplay: Boolean,
7
6
  autoplayInterval: Number,
8
- pauseOnHover: Boolean
7
+ pauseOnHover: Boolean,
9
8
  },
10
9
 
11
10
  data: {
12
11
  autoplay: false,
13
12
  autoplayInterval: 7000,
14
- pauseOnHover: true
13
+ pauseOnHover: true,
15
14
  },
16
15
 
17
16
  connected() {
@@ -27,9 +26,7 @@ export default {
27
26
  },
28
27
 
29
28
  events: [
30
-
31
29
  {
32
-
33
30
  name: 'visibilitychange',
34
31
 
35
32
  el() {
@@ -46,32 +43,26 @@ export default {
46
43
  } else {
47
44
  this.startAutoplay();
48
45
  }
49
- }
50
-
51
- }
52
-
46
+ },
47
+ },
53
48
  ],
54
49
 
55
50
  methods: {
56
-
57
51
  startAutoplay() {
58
-
59
52
  this.stopAutoplay();
60
53
 
61
54
  this.interval = setInterval(
62
- () => (!this.draggable || !$(':focus', this.$el))
63
- && (!this.pauseOnHover || !matches(this.$el, ':hover'))
64
- && !this.stack.length
65
- && this.show('next'),
55
+ () =>
56
+ (!this.draggable || !$(':focus', this.$el)) &&
57
+ (!this.pauseOnHover || !matches(this.$el, ':hover')) &&
58
+ !this.stack.length &&
59
+ this.show('next'),
66
60
  this.autoplayInterval
67
61
  );
68
-
69
62
  },
70
63
 
71
64
  stopAutoplay() {
72
65
  this.interval && clearInterval(this.interval);
73
- }
74
-
75
- }
76
-
66
+ },
67
+ },
77
68
  };