uikit 3.17.12-dev.f1425d280 → 3.18.1-dev.0856bd8a6

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 (260) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/css/uikit-core-rtl.css +577 -504
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +577 -504
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +600 -527
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +600 -527
  9. package/dist/css/uikit.min.css +1 -1
  10. package/dist/js/components/countdown.js +2 -4
  11. package/dist/js/components/countdown.min.js +1 -1
  12. package/dist/js/components/filter.js +1 -1
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +96 -60
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +96 -60
  17. package/dist/js/components/lightbox.min.js +1 -1
  18. package/dist/js/components/notification.js +1 -1
  19. package/dist/js/components/notification.min.js +1 -1
  20. package/dist/js/components/parallax.js +11 -6
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +8 -3
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +735 -37
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +8 -3
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +792 -129
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +7 -7
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +2 -8
  33. package/dist/js/components/tooltip.min.js +1 -1
  34. package/dist/js/components/upload.js +1 -1
  35. package/dist/js/components/upload.min.js +1 -1
  36. package/dist/js/uikit-core.js +299 -273
  37. package/dist/js/uikit-core.min.js +1 -1
  38. package/dist/js/uikit-icons.js +9 -4
  39. package/dist/js/uikit-icons.min.js +1 -1
  40. package/dist/js/uikit.js +505 -365
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +3 -3
  43. package/src/images/components/navbar-toggle-icon.svg +1 -1
  44. package/src/images/icons/arrow-up-right.svg +4 -0
  45. package/src/images/icons/git-branch.svg +4 -4
  46. package/src/images/icons/git-fork.svg +4 -4
  47. package/src/images/icons/link-external.svg +5 -0
  48. package/src/images/icons/signal.svg +3 -0
  49. package/src/images/icons/telegram.svg +3 -0
  50. package/src/images/icons/threads.svg +3 -0
  51. package/src/images/icons/x.svg +3 -0
  52. package/src/js/components/countdown.js +1 -3
  53. package/src/js/components/internal/slider-preload.js +6 -0
  54. package/src/js/components/lightbox-panel.js +2 -6
  55. package/src/js/components/parallax.js +1 -20
  56. package/src/js/components/slider.js +38 -18
  57. package/src/js/components/slideshow.js +14 -46
  58. package/src/js/components/sortable.js +7 -6
  59. package/src/js/components/tooltip.js +1 -7
  60. package/src/js/core/accordion.js +1 -1
  61. package/src/js/core/drop.js +3 -5
  62. package/src/js/core/dropnav.js +24 -20
  63. package/src/js/core/height-match.js +7 -3
  64. package/src/js/core/height-placeholder.js +32 -0
  65. package/src/js/core/icon.js +12 -5
  66. package/src/js/core/index.js +2 -0
  67. package/src/js/core/inverse.js +103 -0
  68. package/src/js/core/modal.js +13 -0
  69. package/src/js/core/navbar.js +32 -172
  70. package/src/js/core/responsive.js +2 -29
  71. package/src/js/core/sticky.js +45 -29
  72. package/src/js/core/video.js +5 -1
  73. package/src/js/mixin/modal.js +1 -1
  74. package/src/js/mixin/parallax.js +19 -0
  75. package/src/js/mixin/slider-autoplay.js +1 -3
  76. package/src/js/mixin/slider-drag.js +22 -19
  77. package/src/js/mixin/slider-nav.js +10 -1
  78. package/src/js/mixin/slider-parallax.js +138 -0
  79. package/src/js/mixin/slider-reactive.js +1 -1
  80. package/src/js/mixin/slider.js +25 -3
  81. package/src/js/util/animation.js +14 -14
  82. package/src/js/util/dom.js +2 -2
  83. package/src/js/util/mouse.js +8 -11
  84. package/src/js/util/scroll.js +58 -0
  85. package/src/js/util/selector.js +4 -2
  86. package/src/js/util/style.js +3 -3
  87. package/src/js/util/viewport.js +8 -4
  88. package/src/less/components/align.less +2 -2
  89. package/src/less/components/animation.less +2 -2
  90. package/src/less/components/article.less +2 -2
  91. package/src/less/components/base.less +3 -3
  92. package/src/less/components/card.less +13 -6
  93. package/src/less/components/column.less +3 -3
  94. package/src/less/components/container.less +3 -3
  95. package/src/less/components/divider.less +2 -2
  96. package/src/less/components/dropbar.less +1 -1
  97. package/src/less/components/dropdown.less +1 -1
  98. package/src/less/components/dropnav.less +1 -1
  99. package/src/less/components/form.less +1 -1
  100. package/src/less/components/grid.less +3 -3
  101. package/src/less/components/height.less +1 -1
  102. package/src/less/components/icon.less +3 -3
  103. package/src/less/components/inverse.less +12 -0
  104. package/src/less/components/link.less +1 -1
  105. package/src/less/components/modal.less +3 -3
  106. package/src/less/components/nav.less +66 -0
  107. package/src/less/components/navbar.less +7 -11
  108. package/src/less/components/overlay.less +5 -0
  109. package/src/less/components/position.less +7 -7
  110. package/src/less/components/section.less +6 -5
  111. package/src/less/components/sticky.less +1 -1
  112. package/src/less/components/svg.less +3 -3
  113. package/src/less/components/tile.less +10 -0
  114. package/src/less/components/transition.less +9 -9
  115. package/src/less/components/utility.less +4 -4
  116. package/src/less/components/width.less +7 -7
  117. package/src/less/theme/alert.less +1 -1
  118. package/src/less/theme/align.less +1 -1
  119. package/src/less/theme/animation.less +1 -1
  120. package/src/less/theme/article.less +1 -1
  121. package/src/less/theme/background.less +1 -1
  122. package/src/less/theme/badge.less +1 -1
  123. package/src/less/theme/base.less +1 -1
  124. package/src/less/theme/breadcrumb.less +1 -1
  125. package/src/less/theme/button.less +1 -1
  126. package/src/less/theme/card.less +1 -1
  127. package/src/less/theme/close.less +1 -1
  128. package/src/less/theme/column.less +1 -1
  129. package/src/less/theme/comment.less +1 -1
  130. package/src/less/theme/container.less +1 -1
  131. package/src/less/theme/description-list.less +1 -1
  132. package/src/less/theme/divider.less +1 -1
  133. package/src/less/theme/dotnav.less +1 -1
  134. package/src/less/theme/drop.less +1 -1
  135. package/src/less/theme/dropbar.less +1 -1
  136. package/src/less/theme/dropdown.less +1 -1
  137. package/src/less/theme/form-range.less +1 -1
  138. package/src/less/theme/height.less +1 -1
  139. package/src/less/theme/icon.less +1 -1
  140. package/src/less/theme/iconnav.less +1 -1
  141. package/src/less/theme/inverse.less +1 -1
  142. package/src/less/theme/label.less +1 -1
  143. package/src/less/theme/leader.less +1 -1
  144. package/src/less/theme/lightbox.less +1 -1
  145. package/src/less/theme/margin.less +1 -1
  146. package/src/less/theme/modal.less +1 -1
  147. package/src/less/theme/nav.less +1 -1
  148. package/src/less/theme/navbar.less +3 -3
  149. package/src/less/theme/notification.less +1 -1
  150. package/src/less/theme/offcanvas.less +1 -1
  151. package/src/less/theme/overlay.less +1 -1
  152. package/src/less/theme/padding.less +1 -1
  153. package/src/less/theme/pagination.less +1 -1
  154. package/src/less/theme/position.less +1 -1
  155. package/src/less/theme/search.less +1 -1
  156. package/src/less/theme/spinner.less +1 -1
  157. package/src/less/theme/sticky.less +1 -1
  158. package/src/less/theme/tab.less +2 -2
  159. package/src/less/theme/table.less +1 -1
  160. package/src/less/theme/thumbnav.less +1 -1
  161. package/src/less/theme/tile.less +1 -1
  162. package/src/less/theme/tooltip.less +1 -1
  163. package/src/less/theme/totop.less +1 -1
  164. package/src/less/theme/transition.less +1 -1
  165. package/src/less/theme/utility.less +1 -1
  166. package/src/less/theme/variables.less +1 -1
  167. package/src/less/theme/width.less +1 -1
  168. package/src/less/uikit.less +1 -1
  169. package/src/scss/components/align.scss +2 -2
  170. package/src/scss/components/animation.scss +2 -2
  171. package/src/scss/components/base.scss +2 -2
  172. package/src/scss/components/card.scss +12 -6
  173. package/src/scss/components/column.scss +3 -3
  174. package/src/scss/components/container.scss +3 -3
  175. package/src/scss/components/divider.scss +2 -2
  176. package/src/scss/components/dropnav.scss +1 -1
  177. package/src/scss/components/form.scss +1 -1
  178. package/src/scss/components/grid.scss +3 -3
  179. package/src/scss/components/height.scss +1 -1
  180. package/src/scss/components/icon.scss +3 -3
  181. package/src/scss/components/inverse.scss +12 -0
  182. package/src/scss/components/modal.scss +3 -3
  183. package/src/scss/components/nav.scss +63 -0
  184. package/src/scss/components/navbar.scss +5 -8
  185. package/src/scss/components/overlay.scss +4 -0
  186. package/src/scss/components/position.scss +7 -7
  187. package/src/scss/components/section.scss +6 -5
  188. package/src/scss/components/sticky.scss +1 -1
  189. package/src/scss/components/svg.scss +3 -3
  190. package/src/scss/components/tile.scss +8 -0
  191. package/src/scss/components/transition.scss +9 -9
  192. package/src/scss/components/utility.scss +4 -4
  193. package/src/scss/components/width.scss +7 -7
  194. package/src/scss/mixins-theme.scss +10 -7
  195. package/src/scss/mixins.scss +7 -4
  196. package/src/scss/theme/alert.scss +1 -0
  197. package/src/scss/theme/align.scss +1 -1
  198. package/src/scss/theme/animation.scss +1 -1
  199. package/src/scss/theme/article.scss +1 -1
  200. package/src/scss/theme/background.scss +1 -1
  201. package/src/scss/theme/badge.scss +1 -1
  202. package/src/scss/theme/base.scss +1 -1
  203. package/src/scss/theme/breadcrumb.scss +1 -1
  204. package/src/scss/theme/button.scss +1 -1
  205. package/src/scss/theme/card.scss +1 -0
  206. package/src/scss/theme/close.scss +1 -1
  207. package/src/scss/theme/column.scss +1 -1
  208. package/src/scss/theme/comment.scss +1 -1
  209. package/src/scss/theme/container.scss +1 -1
  210. package/src/scss/theme/description-list.scss +1 -1
  211. package/src/scss/theme/divider.scss +1 -1
  212. package/src/scss/theme/dotnav.scss +1 -0
  213. package/src/scss/theme/drop.scss +1 -1
  214. package/src/scss/theme/dropbar.scss +1 -1
  215. package/src/scss/theme/dropdown.scss +1 -1
  216. package/src/scss/theme/form-range.scss +1 -1
  217. package/src/scss/theme/height.scss +1 -1
  218. package/src/scss/theme/icon.scss +1 -1
  219. package/src/scss/theme/iconnav.scss +1 -1
  220. package/src/scss/theme/inverse.scss +1 -1
  221. package/src/scss/theme/label.scss +1 -1
  222. package/src/scss/theme/leader.scss +1 -1
  223. package/src/scss/theme/lightbox.scss +1 -1
  224. package/src/scss/theme/margin.scss +1 -1
  225. package/src/scss/theme/modal.scss +1 -0
  226. package/src/scss/theme/nav.scss +1 -1
  227. package/src/scss/theme/navbar.scss +1 -1
  228. package/src/scss/theme/notification.scss +1 -1
  229. package/src/scss/theme/offcanvas.scss +1 -1
  230. package/src/scss/theme/overlay.scss +1 -1
  231. package/src/scss/theme/padding.scss +1 -1
  232. package/src/scss/theme/pagination.scss +1 -1
  233. package/src/scss/theme/position.scss +1 -1
  234. package/src/scss/theme/search.scss +1 -1
  235. package/src/scss/theme/spinner.scss +1 -1
  236. package/src/scss/theme/sticky.scss +1 -1
  237. package/src/scss/theme/tab.scss +1 -1
  238. package/src/scss/theme/table.scss +1 -0
  239. package/src/scss/theme/thumbnav.scss +1 -1
  240. package/src/scss/theme/tile.scss +1 -1
  241. package/src/scss/theme/tooltip.scss +1 -1
  242. package/src/scss/theme/totop.scss +1 -1
  243. package/src/scss/theme/transition.scss +1 -1
  244. package/src/scss/theme/utility.scss +1 -1
  245. package/src/scss/theme/variables.scss +1 -1
  246. package/src/scss/theme/width.scss +1 -1
  247. package/src/scss/uikit.scss +1 -1
  248. package/src/scss/variables-theme.scss +20 -5
  249. package/src/scss/variables.scss +20 -5
  250. package/tests/height.html +58 -1
  251. package/tests/icon.html +38 -10
  252. package/tests/nav.html +42 -0
  253. package/tests/navbar.html +1 -1
  254. package/tests/offcanvas.html +8 -8
  255. package/tests/search.html +300 -202
  256. package/tests/slider.html +58 -0
  257. package/tests/slideshow.html +66 -0
  258. package/tests/sticky-navbar.html +381 -23
  259. package/src/images/icons/pagekit.svg +0 -3
  260. package/src/js/mixin/internal/scroll.js +0 -39
@@ -9,6 +9,7 @@ import {
9
9
  height as getHeight,
10
10
  offset as getOffset,
11
11
  hasClass,
12
+ index,
12
13
  intersectRect,
13
14
  isNumeric,
14
15
  isString,
@@ -70,7 +71,7 @@ export default {
70
71
  },
71
72
 
72
73
  computed: {
73
- selTarget: ({ selTarget }, $el) => (selTarget && $(selTarget, $el)) || $el,
74
+ target: ({ selTarget }, $el) => (selTarget && $(selTarget, $el)) || $el,
74
75
  },
75
76
 
76
77
  connected() {
@@ -87,7 +88,7 @@ export default {
87
88
  beforeDisconnect() {
88
89
  if (this.isFixed) {
89
90
  this.hide();
90
- removeClass(this.selTarget, this.clsInactive);
91
+ removeClass(this.target, this.clsInactive);
91
92
  }
92
93
  reset(this.$el);
93
94
 
@@ -96,9 +97,19 @@ export default {
96
97
  },
97
98
 
98
99
  observe: [
99
- viewport(),
100
+ viewport({
101
+ handler() {
102
+ if (toPx('100vh', 'height') !== this._data.viewport) {
103
+ this.$emit('resize');
104
+ }
105
+ },
106
+ }),
100
107
  scroll({ target: () => document.scrollingElement }),
101
- resize({ target: ({ $el }) => [$el, document.scrollingElement] }),
108
+ resize({
109
+ target: () => document.scrollingElement,
110
+ options: { box: 'content-box' },
111
+ }),
112
+ resize({ target: ({ $el }) => $el }),
102
113
  ],
103
114
 
104
115
  events: [
@@ -158,7 +169,7 @@ export default {
158
169
 
159
170
  const hide = this.isFixed && !this.transitionInProgress;
160
171
  if (hide) {
161
- preventTransition(this.$el);
172
+ preventTransition(this.target);
162
173
  this.hide();
163
174
  }
164
175
 
@@ -215,7 +226,7 @@ export default {
215
226
  end ===
216
227
  Math.min(
217
228
  maxScrollHeight,
218
- parseProp('!*', this.$el, 0, true) - elHeight - offset + overflow,
229
+ parseProp(true, this.$el, 0, true) - elHeight - offset + overflow,
219
230
  ) &&
220
231
  css(parent(this.$el), 'overflowY') === 'visible';
221
232
 
@@ -224,13 +235,13 @@ export default {
224
235
  end,
225
236
  offset,
226
237
  overflow,
227
- topOffset,
228
238
  height,
229
239
  elHeight,
230
240
  width,
231
241
  margin,
232
242
  top: offsetPosition(referenceElement)[0],
233
243
  sticky,
244
+ viewport,
234
245
  };
235
246
  },
236
247
 
@@ -252,10 +263,13 @@ export default {
252
263
 
253
264
  css(placeholder, { height, width, margin });
254
265
 
255
- if (!document.contains(placeholder)) {
266
+ if (
267
+ parent(placeholder) !== parent(this.$el) ||
268
+ sticky ^ (index(placeholder) < index(this.$el))
269
+ ) {
270
+ (sticky ? before : after)(this.$el, placeholder);
256
271
  placeholder.hidden = true;
257
272
  }
258
- (sticky ? before : after)(this.$el, placeholder);
259
273
  },
260
274
 
261
275
  events: ['resize'],
@@ -269,18 +283,24 @@ export default {
269
283
  overflowScroll = 0,
270
284
  start,
271
285
  end,
286
+ elHeight,
287
+ height,
288
+ sticky,
272
289
  }) {
273
290
  const scroll = document.scrollingElement.scrollTop;
274
291
  const dir = prevScroll <= scroll ? 'down' : 'up';
292
+ const referenceElement = this.isFixed ? this.placeholder : this.$el;
275
293
 
276
294
  return {
277
295
  dir,
278
296
  prevDir,
279
297
  scroll,
280
298
  prevScroll,
281
- offsetParentTop: getOffset(
282
- (this.isFixed ? this.placeholder : this.$el).offsetParent,
283
- ).top,
299
+ below:
300
+ scroll >
301
+ getOffset(referenceElement).top +
302
+ (sticky ? Math.min(height, elHeight) : height),
303
+ offsetParentTop: getOffset(referenceElement.offsetParent).top,
284
304
  overflowScroll: clamp(
285
305
  overflowScroll + clamp(scroll, start, end) - clamp(prevScroll, start, end),
286
306
  0,
@@ -299,8 +319,7 @@ export default {
299
319
  prevScroll = 0,
300
320
  top,
301
321
  start,
302
- topOffset,
303
- height,
322
+ below,
304
323
  } = data;
305
324
 
306
325
  if (
@@ -332,7 +351,7 @@ export default {
332
351
  (this.showOnUp &&
333
352
  (scroll <= start ||
334
353
  (dir === 'down' && isScrollUpdate) ||
335
- (dir === 'up' && !this.isFixed && scroll <= topOffset + height)))
354
+ (dir === 'up' && !this.isFixed && !below)))
336
355
  ) {
337
356
  if (!this.isFixed) {
338
357
  if (Animation.inProgress(this.$el) && top > scroll) {
@@ -343,7 +362,7 @@ export default {
343
362
  return;
344
363
  }
345
364
 
346
- if (this.animation && scroll > topOffset) {
365
+ if (this.animation && below) {
347
366
  if (hasClass(this.$el, 'uk-animation-leave')) {
348
367
  return;
349
368
  }
@@ -353,11 +372,11 @@ export default {
353
372
  }
354
373
  } else if (this.isFixed) {
355
374
  this.update();
356
- } else if (this.animation && scroll > topOffset) {
375
+ } else if (this.animation && below) {
357
376
  this.show();
358
377
  Animation.in(this.$el, this.animation).catch(noop);
359
378
  } else {
360
- preventTransition(this.selTarget);
379
+ preventTransition(this.target);
361
380
  this.show();
362
381
  }
363
382
  },
@@ -400,11 +419,9 @@ export default {
400
419
  start,
401
420
  end,
402
421
  offset,
403
- topOffset,
404
- height,
405
- elHeight,
406
422
  offsetParentTop,
407
423
  sticky,
424
+ below,
408
425
  } = this._data;
409
426
  const active = start !== 0 || scroll > start;
410
427
 
@@ -422,11 +439,7 @@ export default {
422
439
  css(this.$el, 'top', offset - overflowScroll);
423
440
 
424
441
  this.setActive(active);
425
- toggleClass(
426
- this.$el,
427
- this.clsBelow,
428
- scroll > topOffset + (sticky ? Math.min(height, elHeight) : height),
429
- );
442
+ toggleClass(this.$el, this.clsBelow, below);
430
443
  addClass(this.$el, this.clsFixed);
431
444
  },
432
445
 
@@ -434,11 +447,14 @@ export default {
434
447
  const prev = this.active;
435
448
  this.active = active;
436
449
  if (active) {
437
- replaceClass(this.selTarget, this.clsInactive, this.clsActive);
450
+ replaceClass(this.target, this.clsInactive, this.clsActive);
438
451
  prev !== active && trigger(this.$el, 'active');
439
452
  } else {
440
- replaceClass(this.selTarget, this.clsActive, this.clsInactive);
441
- prev !== active && trigger(this.$el, 'inactive');
453
+ replaceClass(this.target, this.clsActive, this.clsInactive);
454
+ if (prev !== active) {
455
+ preventTransition(this.target);
456
+ trigger(this.$el, 'inactive');
457
+ }
442
458
  }
443
459
  },
444
460
  },
@@ -32,7 +32,11 @@ export default {
32
32
  intersection({
33
33
  filter: ({ $el, autoplay }) => autoplay && isVideo($el),
34
34
  handler([{ isIntersecting }]) {
35
- if (isIntersecting) {
35
+ if (
36
+ isIntersecting ||
37
+ this.$el.webkitDisplayingFullscreen ||
38
+ document.fullscreenElement === this.$el
39
+ ) {
36
40
  play(this.$el);
37
41
  } else {
38
42
  pause(this.$el);
@@ -19,9 +19,9 @@ import {
19
19
  removeClass,
20
20
  toFloat,
21
21
  } from 'uikit-util';
22
+ import { preventBackgroundScroll } from '../util/scroll';
22
23
  import Class from './class';
23
24
  import Container from './container';
24
- import { preventBackgroundScroll } from './internal/scroll';
25
25
  import Togglable from './togglable';
26
26
 
27
27
  const active = [];
@@ -384,3 +384,22 @@ function fillObject(keys, value) {
384
384
  return data;
385
385
  }, {});
386
386
  }
387
+
388
+ /*
389
+ * Inspired by https://gist.github.com/gre/1650294?permalink_comment_id=3477425#gistcomment-3477425
390
+ *
391
+ * linear: 0
392
+ * easeInSine: 0.5
393
+ * easeOutSine: -0.5
394
+ * easeInQuad: 1
395
+ * easeOutQuad: -1
396
+ * easeInCubic: 2
397
+ * easeOutCubic: -2
398
+ * easeInQuart: 3
399
+ * easeOutQuart: -3
400
+ * easeInQuint: 4
401
+ * easeOutQuint: -4
402
+ */
403
+ export function ease(percent, easing) {
404
+ return easing >= 0 ? Math.pow(percent, easing + 1) : 1 - Math.pow(1 - percent, 1 - easing);
405
+ }
@@ -30,9 +30,7 @@ export default {
30
30
  {
31
31
  name: 'visibilitychange',
32
32
 
33
- el() {
34
- return document;
35
- },
33
+ el: () => document,
36
34
 
37
35
  filter() {
38
36
  return this.autoplay;
@@ -17,7 +17,7 @@ const pointerUpOptions = { passive: true, capture: true };
17
17
  const pointerDown = 'touchstart mousedown';
18
18
  const pointerMove = 'touchmove mousemove';
19
19
  const pointerUp = 'touchend touchcancel mouseup click input scroll';
20
-
20
+ const preventClick = (e) => e.preventDefault();
21
21
  export default {
22
22
  props: {
23
23
  draggable: Boolean,
@@ -55,6 +55,7 @@ export default {
55
55
  handler(e) {
56
56
  if (
57
57
  !this.draggable ||
58
+ this.parallax ||
58
59
  (!isTouch(e) && hasSelectableText(e.target)) ||
59
60
  e.target.closest(selInput) ||
60
61
  e.button > 0 ||
@@ -123,8 +124,9 @@ export default {
123
124
  return;
124
125
  }
125
126
 
126
- // prevent click event
127
- css(this.list, 'pointerEvents', 'none');
127
+ if (!this.dragging) {
128
+ on(this.list, 'click', preventClick, pointerOptions);
129
+ }
128
130
 
129
131
  e.cancelable && e.preventDefault();
130
132
 
@@ -134,7 +136,7 @@ export default {
134
136
  let { slides, prevIndex } = this;
135
137
  let dis = Math.abs(distance);
136
138
  let nextIndex = this.getIndex(prevIndex + this.dir);
137
- let width = this._getDistance(prevIndex, nextIndex);
139
+ let width = getDistance.call(this, prevIndex, nextIndex);
138
140
 
139
141
  while (nextIndex !== prevIndex && dis > width) {
140
142
  this.drag -= width * this.dir;
@@ -142,7 +144,7 @@ export default {
142
144
  prevIndex = nextIndex;
143
145
  dis -= width;
144
146
  nextIndex = this.getIndex(prevIndex + this.dir);
145
- width = this._getDistance(prevIndex, nextIndex);
147
+ width = getDistance.call(this, prevIndex, nextIndex);
146
148
  }
147
149
 
148
150
  this.percent = dis / width;
@@ -173,16 +175,16 @@ export default {
173
175
  this.prevIndex = prevIndex;
174
176
  this.index = nextIndex;
175
177
 
176
- !edge && trigger(prev, 'beforeitemhide', [this]);
178
+ if (!edge) {
179
+ trigger(prev, 'beforeitemhide', [this]);
180
+ trigger(prev, 'itemhide', [this]);
181
+ }
182
+
177
183
  trigger(next, 'beforeitemshow', [this]);
184
+ trigger(next, 'itemshow', [this]);
178
185
  }
179
186
 
180
187
  this._transitioner = this._translate(Math.abs(this.percent), prev, !edge && next);
181
-
182
- if (changed) {
183
- !edge && trigger(prev, 'itemhide', [this]);
184
- trigger(next, 'itemshow', [this]);
185
- }
186
188
  },
187
189
 
188
190
  end() {
@@ -216,20 +218,21 @@ export default {
216
218
  }
217
219
  }
218
220
 
219
- css(this.list, { userSelect: '', pointerEvents: '' });
221
+ setTimeout(() => off(this.list, 'click', preventClick, pointerOptions));
222
+ css(this.list, { userSelect: '' });
220
223
 
221
224
  this.drag = this.percent = null;
222
225
  },
223
-
224
- _getDistance(prev, next) {
225
- return (
226
- this._getTransitioner(prev, prev !== next && next).getDistance() ||
227
- this.slides[prev].offsetWidth
228
- );
229
- },
230
226
  },
231
227
  };
232
228
 
229
+ function getDistance(prev, next) {
230
+ return (
231
+ this._getTransitioner(prev, prev !== next && next).getDistance() ||
232
+ this.slides[prev].offsetWidth
233
+ );
234
+ }
235
+
233
236
  function hasSelectableText(el) {
234
237
  return (
235
238
  css(el, 'userSelect') !== 'none' &&
@@ -148,6 +148,10 @@ export default {
148
148
  return this.selNavItem;
149
149
  },
150
150
 
151
+ filter() {
152
+ return !this.parallax;
153
+ },
154
+
151
155
  handler(e) {
152
156
  if (
153
157
  e.target.closest('a,button') &&
@@ -171,6 +175,10 @@ export default {
171
175
  return this.selNavItem;
172
176
  },
173
177
 
178
+ filter() {
179
+ return !this.parallax;
180
+ },
181
+
174
182
  handler(e) {
175
183
  const { current, keyCode } = e;
176
184
  const cmd = data(current, this.attrItem);
@@ -211,10 +219,11 @@ export default {
211
219
  const active = item === index;
212
220
 
213
221
  toggleClass(el, this.clsActive, active);
222
+ toggleClass(button, 'uk-disabled', this.parallax);
214
223
 
215
224
  attr(button, {
216
225
  'aria-selected': active,
217
- tabindex: active ? null : -1,
226
+ tabindex: active && !this.parallax ? null : -1,
218
227
  });
219
228
 
220
229
  if (active && button && matches(parent(el), ':focus-within')) {
@@ -0,0 +1,138 @@
1
+ import { hasClass, includes, query, scrolledOver, toPx, trigger } from 'uikit-util';
2
+ import { resize, scroll } from '../api/observables';
3
+ import { ease } from './parallax';
4
+
5
+ export default {
6
+ props: {
7
+ parallax: Boolean,
8
+ parallaxTarget: Boolean,
9
+ parallaxStart: String,
10
+ parallaxEnd: String,
11
+ parallaxEasing: Number,
12
+ },
13
+
14
+ data: {
15
+ parallax: false,
16
+ parallaxTarget: false,
17
+ parallaxStart: 0,
18
+ parallaxEnd: 0,
19
+ parallaxEasing: 0,
20
+ },
21
+
22
+ observe: [
23
+ resize({
24
+ target: ({ $el, parallaxTarget }) => [$el, parallaxTarget],
25
+ filter: ({ parallax }) => parallax,
26
+ }),
27
+ scroll({ filter: ({ parallax }) => parallax }),
28
+ ],
29
+
30
+ computed: {
31
+ parallaxTarget({ parallaxTarget }, $el) {
32
+ return (parallaxTarget && query(parallaxTarget, $el)) || this.list;
33
+ },
34
+ },
35
+
36
+ update: {
37
+ write() {
38
+ if (!this.parallax) {
39
+ return;
40
+ }
41
+
42
+ const target = this.parallaxTarget;
43
+ const start = toPx(this.parallaxStart, 'height', target, true);
44
+ const end = toPx(this.parallaxEnd, 'height', target, true);
45
+ const percent = ease(scrolledOver(target, start, end), this.parallaxEasing);
46
+
47
+ const [prevIndex, slidePercent] = this.getIndexAt(percent);
48
+
49
+ const nextIndex = this.getValidIndex(prevIndex + Math.ceil(slidePercent));
50
+
51
+ const prev = this.slides[prevIndex];
52
+ const next = this.slides[nextIndex];
53
+
54
+ const { triggerShow, triggerShown, triggerHide, triggerHidden } = useTriggers(this);
55
+
56
+ if (~this.prevIndex) {
57
+ for (const i of new Set([this.index, this.prevIndex])) {
58
+ if (!includes([nextIndex, prevIndex], i)) {
59
+ triggerHide(this.slides[i]);
60
+ triggerHidden(this.slides[i]);
61
+ }
62
+ }
63
+ }
64
+
65
+ const changed = this.prevIndex !== prevIndex || this.index !== nextIndex;
66
+
67
+ this.dir = 1;
68
+ this.prevIndex = prevIndex;
69
+ this.index = nextIndex;
70
+
71
+ if (prev !== next) {
72
+ triggerHide(prev);
73
+ }
74
+
75
+ triggerShow(next);
76
+
77
+ if (changed) {
78
+ triggerShown(prev);
79
+ }
80
+
81
+ this._translate(prev === next ? 1 : slidePercent, prev, next);
82
+ },
83
+
84
+ events: ['scroll', 'resize'],
85
+ },
86
+
87
+ methods: {
88
+ getIndexAt(percent) {
89
+ const index = percent * (this.length - 1);
90
+ return [Math.floor(index), index % 1];
91
+ },
92
+ },
93
+ };
94
+
95
+ function useTriggers(cmp) {
96
+ const { clsSlideActive, clsEnter, clsLeave } = cmp;
97
+
98
+ return { triggerShow, triggerShown, triggerHide, triggerHidden };
99
+
100
+ function triggerShow(el) {
101
+ if (hasClass(el, clsLeave)) {
102
+ triggerHide(el);
103
+ triggerHidden(el);
104
+ }
105
+
106
+ if (!hasClass(el, clsSlideActive)) {
107
+ trigger(el, 'beforeitemshow', [cmp]);
108
+ trigger(el, 'itemshow', [cmp]);
109
+ }
110
+ }
111
+
112
+ function triggerShown(el) {
113
+ if (hasClass(el, clsEnter)) {
114
+ trigger(el, 'itemshown', [cmp]);
115
+ }
116
+ }
117
+
118
+ function triggerHide(el) {
119
+ if (!hasClass(el, clsSlideActive)) {
120
+ triggerShow(el);
121
+ }
122
+
123
+ if (hasClass(el, clsEnter)) {
124
+ triggerShown(el);
125
+ }
126
+
127
+ if (!hasClass(el, clsLeave)) {
128
+ trigger(el, 'beforeitemhide', [cmp]);
129
+ trigger(el, 'itemhide', [cmp]);
130
+ }
131
+ }
132
+
133
+ function triggerHidden(el) {
134
+ if (hasClass(el, clsLeave)) {
135
+ trigger(el, 'itemhidden', [cmp]);
136
+ }
137
+ }
138
+ }
@@ -1,7 +1,7 @@
1
1
  export default {
2
2
  update: {
3
3
  write() {
4
- if (this.stack.length || this.dragging) {
4
+ if (this.stack.length || this.dragging || this.parallax) {
5
5
  return;
6
6
  }
7
7
 
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  $,
3
+ addClass,
3
4
  children,
4
5
  clamp,
5
6
  getIndex,
@@ -19,7 +20,7 @@ export default {
19
20
  mixins: [SliderAutoplay, SliderDrag, SliderNav, I18n],
20
21
 
21
22
  props: {
22
- clsActivated: Boolean,
23
+ clsActivated: String,
23
24
  easing: String,
24
25
  index: Number,
25
26
  finite: Boolean,
@@ -35,7 +36,10 @@ export default {
35
36
  stack: [],
36
37
  percent: 0,
37
38
  clsActive: 'uk-active',
38
- clsActivated: false,
39
+ clsActivated: '',
40
+ clsEnter: 'uk-slide-enter',
41
+ clsLeave: 'uk-slide-leave',
42
+ clsSlideActive: 'uk-slide-active',
39
43
  Transitioner: false,
40
44
  transitionOptions: {},
41
45
  }),
@@ -78,9 +82,27 @@ export default {
78
82
 
79
83
  observe: resize(),
80
84
 
85
+ events: {
86
+ itemshow({ target }) {
87
+ addClass(target, this.clsEnter, this.clsSlideActive);
88
+ },
89
+
90
+ itemshown({ target }) {
91
+ removeClass(target, this.clsEnter);
92
+ },
93
+
94
+ itemhide({ target }) {
95
+ addClass(target, this.clsLeave);
96
+ },
97
+
98
+ itemhidden({ target }) {
99
+ removeClass(target, this.clsLeave, this.clsSlideActive);
100
+ },
101
+ },
102
+
81
103
  methods: {
82
104
  show(index, force = false) {
83
- if (this.dragging || !this.length) {
105
+ if (this.dragging || !this.length || this.parallax) {
84
106
  return;
85
107
  }
86
108
 
@@ -5,8 +5,8 @@ import { startsWith, toNodes } from './lang';
5
5
  import { css, propName } from './style';
6
6
 
7
7
  const clsTransition = 'uk-transition';
8
- const clsTransitionEnd = 'transitionend';
9
- const clsTransitionCanceled = 'transitioncanceled';
8
+ const transitionEnd = 'transitionend';
9
+ const transitionCanceled = 'transitioncanceled';
10
10
 
11
11
  function transition(element, props, duration = 400, timing = 'linear') {
12
12
  duration = Math.round(duration);
@@ -21,11 +21,11 @@ function transition(element, props, duration = 400, timing = 'linear') {
21
21
  }
22
22
  }
23
23
 
24
- const timer = setTimeout(() => trigger(element, clsTransitionEnd), duration);
24
+ const timer = setTimeout(() => trigger(element, transitionEnd), duration);
25
25
 
26
26
  once(
27
27
  element,
28
- [clsTransitionEnd, clsTransitionCanceled],
28
+ [transitionEnd, transitionCanceled],
29
29
  ({ type }) => {
30
30
  clearTimeout(timer);
31
31
  removeClass(element, clsTransition);
@@ -34,7 +34,7 @@ function transition(element, props, duration = 400, timing = 'linear') {
34
34
  transitionDuration: '',
35
35
  transitionTimingFunction: '',
36
36
  });
37
- type === clsTransitionCanceled ? reject() : resolve(element);
37
+ type === transitionCanceled ? reject() : resolve(element);
38
38
  },
39
39
  { self: true },
40
40
  );
@@ -55,12 +55,12 @@ export const Transition = {
55
55
  start: transition,
56
56
 
57
57
  async stop(element) {
58
- trigger(element, clsTransitionEnd);
58
+ trigger(element, transitionEnd);
59
59
  await Promise.resolve();
60
60
  },
61
61
 
62
62
  async cancel(element) {
63
- trigger(element, clsTransitionCanceled);
63
+ trigger(element, transitionCanceled);
64
64
  await Promise.resolve();
65
65
  },
66
66
 
@@ -70,24 +70,24 @@ export const Transition = {
70
70
  };
71
71
 
72
72
  const animationPrefix = 'uk-animation-';
73
- const clsAnimationEnd = 'animationend';
74
- const clsAnimationCanceled = 'animationcanceled';
73
+ const animationEnd = 'animationend';
74
+ const animationCanceled = 'animationcanceled';
75
75
 
76
76
  function animate(element, animation, duration = 200, origin, out) {
77
77
  return Promise.all(
78
78
  toNodes(element).map(
79
79
  (element) =>
80
80
  new Promise((resolve, reject) => {
81
- trigger(element, clsAnimationCanceled);
82
- const timer = setTimeout(() => trigger(element, clsAnimationEnd), duration);
81
+ trigger(element, animationCanceled);
82
+ const timer = setTimeout(() => trigger(element, animationEnd), duration);
83
83
 
84
84
  once(
85
85
  element,
86
- [clsAnimationEnd, clsAnimationCanceled],
86
+ [animationEnd, animationCanceled],
87
87
  ({ type }) => {
88
88
  clearTimeout(timer);
89
89
 
90
- type === clsAnimationCanceled ? reject() : resolve(element);
90
+ type === animationCanceled ? reject() : resolve(element);
91
91
 
92
92
  css(element, 'animationDuration', '');
93
93
  removeClasses(element, `${animationPrefix}\\S*`);
@@ -121,6 +121,6 @@ export const Animation = {
121
121
  },
122
122
 
123
123
  cancel(element) {
124
- trigger(element, clsAnimationCanceled);
124
+ trigger(element, animationCanceled);
125
125
  },
126
126
  };