uikit 3.11.2-dev.57792c7e7 → 3.11.2-dev.76734f785

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 +58 -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 -363
  37. package/dist/js/components/parallax.min.js +1 -1
  38. package/dist/js/components/slider-parallax.js +343 -351
  39. package/dist/js/components/slider-parallax.min.js +1 -1
  40. package/dist/js/components/slider.js +758 -842
  41. package/dist/js/components/slider.min.js +1 -1
  42. package/dist/js/components/slideshow-parallax.js +343 -351
  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 +5423 -6687
  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 +7995 -9650
  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 +109 -89
  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 +31 -35
  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 +197 -132
  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 +173 -120
  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 +16 -7
  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 +87 -99
  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,72 @@ 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) => {
71
+ const css = { transform: '', filter: '' };
72
+ for (const prop in this.props) {
57
73
  this.props[prop](css, percent);
58
- return css;
59
- }, {transform: '', filter: ''});
60
- }
61
-
62
- }
63
-
74
+ }
75
+ return css;
76
+ },
77
+ },
64
78
  };
65
79
 
66
- function transformFn(prop, el, steps) {
67
-
68
- const unit = getUnit(steps) || {x: 'px', y: 'px', rotate: 'deg'}[prop] || '';
80
+ function transformFn(prop, el, stops) {
81
+ const unit = getUnit(stops) || { x: 'px', y: 'px', rotate: 'deg' }[prop] || '';
82
+ let transformFn;
69
83
 
70
84
  if (prop === 'x' || prop === 'y') {
71
85
  prop = `translate${ucfirst(prop)}`;
86
+ transformFn = (stop) => toFloat(toFloat(stop).toFixed(unit === 'px' ? 0 : 6));
72
87
  }
73
88
 
74
- steps = steps.map(toFloat);
75
-
76
- if (steps.length === 1) {
77
- steps.unshift(prop === 'scale' ? 1 : 0);
89
+ if (stops.length === 1) {
90
+ stops.unshift(prop === 'scale' ? 1 : 0);
78
91
  }
79
92
 
80
- return (css, percent) => {
81
- let value = getValue(steps, percent);
93
+ stops = parseStops(stops, transformFn);
82
94
 
83
- if (startsWith(prop, 'translate')) {
84
- value = toFloat(value).toFixed(unit === 'px' ? 0 : 6);
85
- }
86
-
87
- css.transform += ` ${prop}(${value}${unit})`;
95
+ return (css, percent) => {
96
+ css.transform += ` ${prop}(${getValue(stops, percent)}${unit})`;
88
97
  };
89
98
  }
90
99
 
91
- function colorFn(prop, el, steps) {
92
-
93
- if (steps.length === 1) {
94
- steps.unshift(getCssValue(el, prop, ''));
100
+ function colorFn(prop, el, stops) {
101
+ if (stops.length === 1) {
102
+ stops.unshift(getCssValue(el, prop, ''));
95
103
  }
96
104
 
97
- steps = steps.map(step => parseColor(el, step));
105
+ stops = parseStops(stops, (stop) => parseColor(el, stop));
98
106
 
99
107
  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(',');
108
+ const [start, end, p] = getStop(stops, percent);
109
+ const value = start
110
+ .map((value, i) => {
111
+ value += p * (end[i] - value);
112
+ return i === 3 ? toFloat(value) : parseInt(value, 10);
113
+ })
114
+ .join(',');
106
115
  css[prop] = `rgba(${value})`;
107
116
  };
108
117
  }
@@ -116,103 +125,90 @@ function parseColor(el, color) {
116
125
  .map(toFloat);
117
126
  }
118
127
 
119
- function filterFn(prop, el, steps) {
120
-
121
- if (steps.length === 1) {
122
- steps.unshift(0);
128
+ function filterFn(prop, el, stops) {
129
+ if (stops.length === 1) {
130
+ stops.unshift(0);
123
131
  }
124
132
 
125
- const unit = getUnit(steps) || {blur: 'px', hue: 'deg'}[prop] || '%';
126
- prop = {fopacity: 'opacity', hue: 'hue-rotate'}[prop] || prop;
127
- steps = steps.map(toFloat);
133
+ const unit = getUnit(stops) || { blur: 'px', hue: 'deg' }[prop] || '%';
134
+ prop = { fopacity: 'opacity', hue: 'hue-rotate' }[prop] || prop;
135
+ stops = parseStops(stops);
128
136
 
129
137
  return (css, percent) => {
130
- const value = getValue(steps, percent);
138
+ const value = getValue(stops, percent);
131
139
  css.filter += ` ${prop}(${value + unit})`;
132
140
  };
133
141
  }
134
142
 
135
- function cssPropFn(prop, el, steps) {
136
-
137
- if (steps.length === 1) {
138
- steps.unshift(getCssValue(el, prop, ''));
143
+ function cssPropFn(prop, el, stops) {
144
+ if (stops.length === 1) {
145
+ stops.unshift(getCssValue(el, prop, ''));
139
146
  }
140
147
 
141
- steps = steps.map(toFloat);
148
+ stops = parseStops(stops);
142
149
 
143
150
  return (css, percent) => {
144
- css[prop] = getValue(steps, percent);
151
+ css[prop] = getValue(stops, percent);
145
152
  };
146
153
  }
147
154
 
148
- function strokeFn(prop, el, steps) {
149
-
150
- if (steps.length === 1) {
151
- steps.unshift(0);
155
+ function strokeFn(prop, el, stops) {
156
+ if (stops.length === 1) {
157
+ stops.unshift(0);
152
158
  }
153
159
 
154
- const unit = getUnit(steps);
155
- steps = steps.map(toFloat);
160
+ const unit = getUnit(stops);
161
+ const length = getMaxPathLength(el);
162
+ stops = parseStops(stops.reverse(), (stop) => {
163
+ stop = toFloat(stop);
164
+ return unit === '%' ? (stop * length) / 100 : stop;
165
+ });
156
166
 
157
- if (!steps.some(step => step)) {
167
+ if (!stops.some(([value]) => value)) {
158
168
  return noop;
159
169
  }
160
170
 
161
- const length = getMaxPathLength(el);
162
171
  css(el, 'strokeDasharray', length);
163
172
 
164
- if (unit === '%') {
165
- steps = steps.map(step => step * length / 100);
166
- }
167
-
168
- steps = steps.reverse();
169
-
170
173
  return (css, percent) => {
171
- css.strokeDashoffset = getValue(steps, percent);
174
+ css.strokeDashoffset = getValue(stops, percent);
172
175
  };
173
176
  }
174
177
 
175
- function backgroundFn(prop, el, steps) {
176
-
177
- if (steps.length === 1) {
178
- steps.unshift(0);
178
+ function backgroundFn(prop, el, stops) {
179
+ if (stops.length === 1) {
180
+ stops.unshift(0);
179
181
  }
180
182
 
181
183
  prop = prop.substr(-1);
182
184
  const attr = prop === 'y' ? 'height' : 'width';
183
- steps = steps.map(step => toPx(step, attr, el));
185
+ stops = parseStops(stops, (stop) => toPx(stop, attr, el));
184
186
 
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]
187
+ const bgPos = getCssValue(el, `background-position-${prop}`, '');
187
188
 
188
189
  return getCssValue(el, 'backgroundSize', '') === 'cover'
189
- ? backgroundCoverFn.call(this, prop, el, steps, bgPos, attr)
190
- : setBackgroundPosFn(prop, steps, bgPos);
190
+ ? backgroundCoverFn(prop, el, stops, bgPos, attr)
191
+ : setBackgroundPosFn(prop, stops, bgPos);
191
192
  }
192
193
 
193
- function backgroundCoverFn(prop, el, steps, bgPos, attr) {
194
+ function backgroundCoverFn(prop, el, stops, bgPos, attr) {
195
+ const dimImage = getBackgroundImageDimensions(el);
194
196
 
195
- const image = getBackgroundImage.call(this, el);
196
-
197
- if (!image.naturalWidth) {
197
+ if (!dimImage.width) {
198
198
  return noop;
199
199
  }
200
200
 
201
- const min = Math.min(...steps);
202
- const max = Math.max(...steps);
203
- const down = steps.indexOf(min) < steps.indexOf(max);
201
+ const values = stops.map(([value]) => value);
202
+ const min = Math.min(...values);
203
+ const max = Math.max(...values);
204
+ const down = values.indexOf(min) < values.indexOf(max);
204
205
 
205
206
  const diff = max - min;
206
207
  let pos = (down ? -diff : 0) - (down ? min : max);
207
208
 
208
209
  const dimEl = {
209
210
  width: el.offsetWidth,
210
- height: el.offsetHeight
211
- };
212
-
213
- const dimImage = {
214
- width: image.naturalWidth,
215
- height: image.naturalHeight
211
+ height: el.offsetHeight,
216
212
  };
217
213
 
218
214
  const baseDim = Dimensions.cover(dimImage, dimEl);
@@ -221,7 +217,6 @@ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
221
217
  if (span < diff) {
222
218
  dimEl[attr] = baseDim[attr] + diff - span;
223
219
  } else if (span > diff) {
224
-
225
220
  const posPercentage = dimEl[attr] / toPx(bgPos, attr, el, true);
226
221
 
227
222
  if (posPercentage) {
@@ -231,7 +226,7 @@ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
231
226
 
232
227
  const dim = Dimensions.cover(dimImage, dimEl);
233
228
 
234
- const fn = setBackgroundPosFn(prop, steps, `${pos}px`);
229
+ const fn = setBackgroundPosFn(prop, stops, `${pos}px`);
235
230
  return (css, percent) => {
236
231
  fn(css, percent);
237
232
  css.backgroundSize = `${dim.width}px ${dim.height}px`;
@@ -239,50 +234,108 @@ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
239
234
  };
240
235
  }
241
236
 
242
- function setBackgroundPosFn(prop, steps, pos) {
237
+ function setBackgroundPosFn(prop, stops, pos) {
243
238
  return function (css, percent) {
244
- css[`background-position-${prop}`] = `calc(${pos} + ${getValue(steps, percent)}px)`;
239
+ css[`background-position-${prop}`] = `calc(${pos} + ${getValue(stops, percent)}px)`;
245
240
  };
246
241
  }
247
242
 
248
- function getBackgroundImage(el) {
243
+ const dimensions = {};
244
+ function getBackgroundImageDimensions(el) {
249
245
  const src = css(el, 'backgroundImage').replace(/^none|url\(["']?(.+?)["']?\)$/, '$1');
250
246
 
251
- const data = this._data;
252
-
253
- if (data[src]) {
254
- return data[src];
247
+ if (dimensions[src]) {
248
+ return dimensions[src];
255
249
  }
256
250
 
251
+ const image = new Image();
257
252
  if (src) {
258
- const img = new Image();
259
- img.src = src;
260
- if (!img.naturalWidth) {
261
- img.onload = () => this.$update();
253
+ image.src = src;
254
+
255
+ if (!image.naturalWidth) {
256
+ image.onload = () => {
257
+ dimensions[src] = toDimensions(image);
258
+ trigger(el, 'bgimageload');
259
+ };
260
+ return toDimensions(image);
262
261
  }
263
-
264
- return data[src] = img;
265
262
  }
263
+
264
+ return (dimensions[src] = toDimensions(image));
265
+ }
266
+
267
+ function toDimensions(image) {
268
+ return {
269
+ width: image.naturalWidth,
270
+ height: image.naturalHeight,
271
+ };
266
272
  }
267
273
 
268
- function getStep(steps, percent) {
269
- const count = steps.length - 1;
270
- const index = Math.min(Math.floor(count * percent), count - 1);
274
+ function parseStops(stops, fn = toFloat) {
275
+ const result = [];
276
+ const { length } = stops;
277
+ let nullIndex = 0;
278
+ for (let i = 0; i < length; i++) {
279
+ let [value, percent] = isString(stops[i]) ? stops[i].trim().split(' ') : [stops[i]];
280
+ value = fn(value);
281
+ percent = percent ? toFloat(percent) / 100 : null;
282
+
283
+ if (i === 0) {
284
+ if (percent === null) {
285
+ percent = 0;
286
+ } else if (percent) {
287
+ result.push([value, 0]);
288
+ }
289
+ } else if (i === length - 1) {
290
+ if (percent === null) {
291
+ percent = 1;
292
+ } else if (percent !== 1) {
293
+ result.push([value, percent]);
294
+ percent = 1;
295
+ }
296
+ }
271
297
 
272
- return steps
273
- .slice(index, index + 2)
274
- .concat(percent === 1 ? 1 : percent % (1 / count) * count);
298
+ result.push([value, percent]);
299
+
300
+ if (percent === null) {
301
+ nullIndex++;
302
+ } else if (nullIndex) {
303
+ const leftPercent = result[i - nullIndex - 1][1];
304
+ const p = (percent - leftPercent) / (nullIndex + 1);
305
+ for (let j = nullIndex; j > 0; j--) {
306
+ result[i - j][1] = leftPercent + p * (nullIndex - j + 1);
307
+ }
308
+
309
+ nullIndex = 0;
310
+ }
311
+ }
312
+
313
+ return result;
314
+ }
315
+
316
+ function getStop(stops, percent) {
317
+ const index = findIndex(stops.slice(1), ([, targetPercent]) => percent <= targetPercent) + 1;
318
+ return [
319
+ stops[index - 1][0],
320
+ stops[index][0],
321
+ (percent - stops[index - 1][1]) / (stops[index][1] - stops[index - 1][1]),
322
+ ];
275
323
  }
276
324
 
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;
325
+ function getValue(stops, percent) {
326
+ const [start, end, p] = getStop(stops, percent);
327
+ return isNumber(start) ? start + Math.abs(start - end) * p * (start < end ? 1 : -1) : +end;
282
328
  }
283
329
 
284
- function getUnit(steps, defaultUnit) {
285
- return steps.reduce((unit, step) => unit || isString(step) && step.replace(/[\d-]/g, '').trim(), '') || defaultUnit;
330
+ const unitRe = /^-?\d+([^\s]*)/;
331
+ function getUnit(stops, defaultUnit) {
332
+ for (const stop of stops) {
333
+ const match = stop.match?.(unitRe);
334
+ if (match) {
335
+ return match[1];
336
+ }
337
+ }
338
+ return defaultUnit;
286
339
  }
287
340
 
288
341
  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
  };