uikit 3.14.4-dev.cd89debeb → 3.14.4-dev.d2929b5b7

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 (134) hide show
  1. package/CHANGELOG.md +41 -12
  2. package/build/util.js +1 -0
  3. package/dist/css/uikit-core-rtl.css +380 -102
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +380 -102
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +397 -107
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +397 -107
  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 +99 -135
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +99 -135
  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 +93 -132
  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 +419 -381
  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 +472 -417
  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 +1 -1
  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 +90 -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 +42 -30
  59. package/src/js/core/scroll.js +37 -10
  60. package/src/js/core/sticky.js +8 -9
  61. package/src/js/mixin/media.js +4 -5
  62. package/src/js/mixin/modal.js +9 -6
  63. package/src/js/mixin/position.js +22 -8
  64. package/src/js/mixin/slider-drag.js +20 -8
  65. package/src/js/mixin/togglable.js +80 -133
  66. package/src/js/util/animation.js +4 -3
  67. package/src/js/util/dimensions.js +6 -6
  68. package/src/js/util/filter.js +3 -7
  69. package/src/js/util/position.js +43 -47
  70. package/src/js/util/style.js +4 -13
  71. package/src/js/util/viewport.js +5 -32
  72. package/src/less/components/_import.less +1 -0
  73. package/src/less/components/drop.less +1 -18
  74. package/src/less/components/dropbar.less +115 -0
  75. package/src/less/components/dropdown.less +16 -16
  76. package/src/less/components/leader.less +1 -1
  77. package/src/less/components/nav.less +240 -63
  78. package/src/less/components/navbar.less +73 -28
  79. package/src/less/components/utility.less +21 -4
  80. package/src/less/theme/_import.less +1 -0
  81. package/src/less/theme/dropbar.less +44 -0
  82. package/src/less/theme/dropdown.less +0 -11
  83. package/src/less/theme/nav.less +43 -9
  84. package/src/less/theme/navbar.less +4 -10
  85. package/src/scss/components/_import.scss +1 -0
  86. package/src/scss/components/drop.scss +1 -18
  87. package/src/scss/components/dropbar.scss +115 -0
  88. package/src/scss/components/dropdown.scss +16 -16
  89. package/src/scss/components/leader.scss +1 -1
  90. package/src/scss/components/nav.scss +189 -51
  91. package/src/scss/components/navbar.scss +61 -28
  92. package/src/scss/components/utility.scss +19 -3
  93. package/src/scss/mixins-theme.scss +93 -25
  94. package/src/scss/mixins.scss +89 -17
  95. package/src/scss/theme/_import.scss +1 -0
  96. package/src/scss/theme/dropbar.scss +44 -0
  97. package/src/scss/theme/dropdown.scss +0 -8
  98. package/src/scss/theme/nav.scss +41 -9
  99. package/src/scss/theme/navbar.scss +4 -7
  100. package/src/scss/variables-theme.scss +69 -17
  101. package/src/scss/variables.scss +58 -13
  102. package/tests/accordion.html +2 -2
  103. package/tests/alert.html +2 -2
  104. package/tests/countdown.html +1 -1
  105. package/tests/drop.html +453 -371
  106. package/tests/dropbar.html +456 -0
  107. package/tests/dropdown.html +26 -401
  108. package/tests/filter.html +9 -12
  109. package/tests/form.html +1 -1
  110. package/tests/index.html +126 -107
  111. package/tests/lightbox.html +5 -5
  112. package/tests/list.html +8 -8
  113. package/tests/modal.html +13 -13
  114. package/tests/nav.html +117 -75
  115. package/tests/navbar.html +1997 -1138
  116. package/tests/offcanvas.html +17 -21
  117. package/tests/parallax.html +1 -1
  118. package/tests/position.html +13 -24
  119. package/tests/progress.html +9 -9
  120. package/tests/scroll.html +7 -10
  121. package/tests/search.html +5 -5
  122. package/tests/slider.html +6 -5
  123. package/tests/slideshow.html +8 -8
  124. package/tests/sortable.html +6 -8
  125. package/tests/sticky-navbar.html +6 -6
  126. package/tests/sticky.html +8 -8
  127. package/tests/switcher.html +1 -1
  128. package/tests/tab.html +1 -1
  129. package/tests/table.html +7 -7
  130. package/tests/toggle.html +2 -2
  131. package/tests/tooltip.html +1 -1
  132. package/tests/upload.html +11 -11
  133. package/tests/utility.html +19 -0
  134. package/src/images/backgrounds/nav-parent-close.svg +0 -3
@@ -19,6 +19,7 @@ import {
19
19
  offset,
20
20
  once,
21
21
  parent,
22
+ parents,
22
23
  query,
23
24
  remove,
24
25
  selFocusable,
@@ -36,7 +37,7 @@ export default {
36
37
  align: String,
37
38
  offset: Number,
38
39
  boundary: Boolean,
39
- boundaryAlign: Boolean,
40
+ target: Boolean,
40
41
  clsDrop: String,
41
42
  delayShow: Number,
42
43
  delayHide: Number,
@@ -53,9 +54,12 @@ export default {
53
54
  offset: undefined,
54
55
  delayShow: undefined,
55
56
  delayHide: undefined,
56
- boundaryAlign: undefined,
57
- flip: 'x',
57
+ flip: false,
58
+ shift: true,
58
59
  boundary: true,
60
+ target: false,
61
+ targetX: false,
62
+ targetY: false,
59
63
  dropbar: false,
60
64
  dropbarAnchor: false,
61
65
  duration: 200,
@@ -90,7 +94,7 @@ export default {
90
94
  },
91
95
 
92
96
  watch(dropbar) {
93
- addClass(dropbar, 'uk-navbar-dropbar');
97
+ addClass(dropbar, 'uk-dropbar', 'uk-dropbar-top', 'uk-navbar-dropbar');
94
98
  },
95
99
 
96
100
  immediate: true,
@@ -106,7 +110,7 @@ export default {
106
110
 
107
111
  if (this.dropContainer !== $el) {
108
112
  for (const el of $$(`.${clsDrop}`, this.dropContainer)) {
109
- const target = this.getDropdown(el)?.target;
113
+ const target = this.getDropdown(el)?.targetEl;
110
114
  if (!includes(dropdowns, el) && target && within(target, this.$el)) {
111
115
  dropdowns.push(el);
112
116
  }
@@ -124,7 +128,6 @@ export default {
124
128
  ...this.$props,
125
129
  boundary: this.boundary,
126
130
  pos: this.pos,
127
- offset: this.dropbar || this.offset,
128
131
  }
129
132
  );
130
133
  },
@@ -169,8 +172,8 @@ export default {
169
172
  if (
170
173
  active &&
171
174
  includes(active.mode, 'hover') &&
172
- active.target &&
173
- !within(active.target, current) &&
175
+ active.targetEl &&
176
+ !within(active.targetEl, current) &&
174
177
  !active.isDelaying
175
178
  ) {
176
179
  active.hide(false);
@@ -192,7 +195,7 @@ export default {
192
195
  if (keyCode === keyMap.DOWN && hasAttr(current, 'aria-expanded')) {
193
196
  e.preventDefault();
194
197
 
195
- if (!active || active.target !== current) {
198
+ if (!active || active.targetEl !== current) {
196
199
  current.click();
197
200
  once(this.dropContainer, 'show', ({ target }) =>
198
201
  focusFirstFocusableElement(target)
@@ -243,7 +246,7 @@ export default {
243
246
  }
244
247
 
245
248
  if (keyCode === keyMap.ESC) {
246
- active?.target?.focus();
249
+ active?.targetEl?.focus();
247
250
  }
248
251
 
249
252
  handleNavItemNavigation(e, this.toggles, active);
@@ -285,8 +288,8 @@ export default {
285
288
  return this.dropbar;
286
289
  },
287
290
 
288
- handler(_, { $el, align }) {
289
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
291
+ handler({ target }) {
292
+ if (!this.isDropbarDrop(target)) {
290
293
  return;
291
294
  }
292
295
 
@@ -294,7 +297,7 @@ export default {
294
297
  after(this.dropbarAnchor || this.$el, this.dropbar);
295
298
  }
296
299
 
297
- addClass($el, `${this.clsDrop}-dropbar`);
300
+ addClass(target, `${this.clsDrop}-dropbar`);
298
301
  },
299
302
  },
300
303
 
@@ -309,19 +312,24 @@ export default {
309
312
  return this.dropbar;
310
313
  },
311
314
 
312
- handler(_, { $el, align }) {
313
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
315
+ handler({ target }) {
316
+ if (!this.isDropbarDrop(target)) {
314
317
  return;
315
318
  }
316
319
 
317
- this._observer = observeResize($el, () =>
320
+ this._observer = observeResize(target, () => {
321
+ const targetOffsets = parents(target, `.${this.clsDrop}`)
322
+ .concat(target)
323
+ .map((el) => offset(el));
324
+ const minTop = Math.min(...targetOffsets.map(({ top }) => top));
325
+ const maxBottom = Math.max(...targetOffsets.map(({ bottom }) => bottom));
326
+ const dropbarOffset = offset(this.dropbar);
327
+ css(this.dropbar, 'top', this.dropbar.offsetTop - (dropbarOffset.top - minTop));
318
328
  this.transitionTo(
319
- offset($el).bottom -
320
- offset(this.dropbar).top +
321
- toFloat(css($el, 'marginBottom')),
322
- $el
323
- )
324
- );
329
+ maxBottom - minTop + toFloat(css(target, 'marginBottom')),
330
+ target
331
+ );
332
+ });
325
333
  },
326
334
  },
327
335
 
@@ -336,13 +344,13 @@ export default {
336
344
  return this.dropbar;
337
345
  },
338
346
 
339
- handler(e, { $el }) {
347
+ handler(e) {
340
348
  const active = this.getActive();
341
349
 
342
350
  if (
343
351
  matches(this.dropbar, ':hover') &&
344
- active?.$el === $el &&
345
- !this.toggles.some((el) => active.target !== el && matches(el, ':focus'))
352
+ active?.$el === e.target &&
353
+ !this.toggles.some((el) => active.targetEl !== el && matches(el, ':focus'))
346
354
  ) {
347
355
  e.preventDefault();
348
356
  }
@@ -360,8 +368,8 @@ export default {
360
368
  return this.dropbar;
361
369
  },
362
370
 
363
- handler(_, { $el, align }) {
364
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
371
+ handler({ target }) {
372
+ if (!this.isDropbarDrop(target)) {
365
373
  return;
366
374
  }
367
375
 
@@ -369,7 +377,7 @@ export default {
369
377
 
370
378
  const active = this.getActive();
371
379
 
372
- if (!active || active?.$el === $el) {
380
+ if (!active || active?.$el === target) {
373
381
  this.transitionTo(0);
374
382
  }
375
383
  },
@@ -378,7 +386,7 @@ export default {
378
386
 
379
387
  methods: {
380
388
  getActive() {
381
- return active && within(active.target, this.$el) && active;
389
+ return active && within(active.targetEl, this.$el) && active;
382
390
  },
383
391
 
384
392
  transitionTo(newHeight, el) {
@@ -409,12 +417,16 @@ export default {
409
417
  getDropdown(el) {
410
418
  return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');
411
419
  },
420
+
421
+ isDropbarDrop(el) {
422
+ return this.getDropdown(el) && hasClass(el, this.clsDrop);
423
+ },
412
424
  },
413
425
  };
414
426
 
415
427
  function handleNavItemNavigation(e, toggles, active) {
416
428
  const { current, keyCode } = e;
417
- const target = active?.target || current;
429
+ const target = active?.targetEl || current;
418
430
  const i = toggles.indexOf(target);
419
431
 
420
432
  // Left
@@ -1,4 +1,4 @@
1
- import { $, scrollIntoView, trigger } from 'uikit-util';
1
+ import { $, off, on, scrollIntoView, trigger, within } from 'uikit-util';
2
2
 
3
3
  export default {
4
4
  props: {
@@ -9,6 +9,14 @@ export default {
9
9
  offset: 0,
10
10
  },
11
11
 
12
+ connected() {
13
+ registerClick(this);
14
+ },
15
+
16
+ disconnected() {
17
+ unregisterClick(this);
18
+ },
19
+
12
20
  methods: {
13
21
  async scrollTo(el) {
14
22
  el = (el && $(el)) || document.body;
@@ -19,18 +27,37 @@ export default {
19
27
  }
20
28
  },
21
29
  },
30
+ };
22
31
 
23
- events: {
24
- click(e) {
25
- if (e.defaultPrevented) {
26
- return;
27
- }
32
+ const components = new Set();
33
+ function registerClick(cmp) {
34
+ if (!components.size) {
35
+ on(document, 'click', clickHandler);
36
+ }
37
+
38
+ components.add(cmp);
39
+ }
28
40
 
41
+ function unregisterClick(cmp) {
42
+ components.delete(cmp);
43
+
44
+ if (!components.length) {
45
+ off(document, 'click', clickHandler);
46
+ }
47
+ }
48
+
49
+ function clickHandler(e) {
50
+ if (e.defaultPrevented) {
51
+ return;
52
+ }
53
+
54
+ for (const component of components) {
55
+ if (within(e.target, component.$el)) {
29
56
  e.preventDefault();
30
- this.scrollTo(getTargetElement(this.$el));
31
- },
32
- },
33
- };
57
+ component.scrollTo(getTargetElement(component.$el));
58
+ }
59
+ }
60
+ }
34
61
 
35
62
  export function getTargetElement(el) {
36
63
  return document.getElementById(decodeURIComponent(el.hash).substring(1));
@@ -23,7 +23,6 @@ import {
23
23
  remove,
24
24
  removeClass,
25
25
  replaceClass,
26
- scrollTop,
27
26
  toFloat,
28
27
  toggleClass,
29
28
  toPx,
@@ -125,7 +124,9 @@ export default {
125
124
  },
126
125
 
127
126
  handler() {
128
- if (!location.hash || scrollTop(window) === 0) {
127
+ const { scrollingElement } = document;
128
+
129
+ if (!location.hash || scrollingElement.scrollTop === 0) {
129
130
  return;
130
131
  }
131
132
 
@@ -134,13 +135,11 @@ export default {
134
135
  const elOffset = getOffset(this.$el);
135
136
 
136
137
  if (this.isFixed && intersectRect(targetOffset, elOffset)) {
137
- scrollTop(
138
- window,
138
+ scrollingElement.scrollTop =
139
139
  targetOffset.top -
140
- elOffset.height -
141
- toPx(this.targetOffset, 'height', this.placeholder) -
142
- toPx(this.offset, 'height', this.placeholder)
143
- );
140
+ elOffset.height -
141
+ toPx(this.targetOffset, 'height', this.placeholder) -
142
+ toPx(this.offset, 'height', this.placeholder);
144
143
  }
145
144
  });
146
145
  },
@@ -238,7 +237,7 @@ export default {
238
237
  start,
239
238
  end,
240
239
  }) {
241
- const scroll = scrollTop(window);
240
+ const scroll = document.scrollingElement.scrollTop;
242
241
  const dir = prevScroll <= scroll ? 'down' : 'up';
243
242
 
244
243
  return {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createEvent,
3
- getCssVar,
3
+ css,
4
4
  isNumeric,
5
5
  isString,
6
6
  on,
@@ -19,7 +19,7 @@ export default {
19
19
  },
20
20
 
21
21
  connected() {
22
- const media = toMedia(this.media);
22
+ const media = toMedia(this.media, this.$el);
23
23
  this.matchMedia = true;
24
24
  if (media) {
25
25
  this.mediaObj = window.matchMedia(media);
@@ -40,11 +40,10 @@ export default {
40
40
  },
41
41
  };
42
42
 
43
- function toMedia(value) {
43
+ function toMedia(value, element) {
44
44
  if (isString(value)) {
45
45
  if (startsWith(value, '@')) {
46
- const name = `breakpoint-${value.substr(1)}`;
47
- value = toFloat(getCssVar(name));
46
+ value = toFloat(css(element, `--uk-breakpoint-${value.substr(1)}`));
48
47
  } else if (isNaN(value)) {
49
48
  return value;
50
49
  }
@@ -9,6 +9,7 @@ import {
9
9
  includes,
10
10
  isFocusable,
11
11
  last,
12
+ noop,
12
13
  on,
13
14
  once,
14
15
  parent,
@@ -134,8 +135,8 @@ export default {
134
135
  );
135
136
 
136
137
  if (this.overlay) {
137
- once(this.$el, 'hide', preventOverscroll(this.$el));
138
- once(this.$el, 'hide', preventBackgroundScroll());
138
+ once(this.$el, 'hidden', preventOverscroll(this.$el));
139
+ once(this.$el, 'hidden', preventBackgroundScroll());
139
140
  }
140
141
 
141
142
  if (this.stack) {
@@ -217,10 +218,6 @@ export default {
217
218
  active.splice(active.indexOf(this), 1);
218
219
  }
219
220
 
220
- if (!active.length) {
221
- css(document.body, 'overflowY', '');
222
- }
223
-
224
221
  css(this.$el, 'zIndex', '');
225
222
 
226
223
  if (!active.some((modal) => modal.clsPage === this.clsPage)) {
@@ -337,7 +334,12 @@ export function preventOverscroll(el) {
337
334
  return () => events.forEach((fn) => fn());
338
335
  }
339
336
 
337
+ let prevented;
340
338
  export function preventBackgroundScroll() {
339
+ if (prevented) {
340
+ return noop;
341
+ }
342
+ prevented = true;
341
343
  const { body, documentElement } = document;
342
344
  css(body, {
343
345
  overflowY: width(window) > documentElement.clientWidth ? 'scroll' : '',
@@ -345,6 +347,7 @@ export function preventBackgroundScroll() {
345
347
  });
346
348
  css(documentElement, 'overflowY', 'hidden');
347
349
  return () => {
350
+ prevented = false;
348
351
  css(documentElement, 'overflowY', '');
349
352
  css(body, { overflowY: '', touchAction: '' });
350
353
  };
@@ -2,10 +2,10 @@ import {
2
2
  css,
3
3
  dimensions,
4
4
  flipPosition,
5
- getCssVar,
6
5
  includes,
7
6
  isRtl,
8
7
  positionAt,
8
+ scrollParents,
9
9
  toPx,
10
10
  } from 'uikit-util';
11
11
 
@@ -14,12 +14,16 @@ export default {
14
14
  pos: String,
15
15
  offset: null,
16
16
  flip: Boolean,
17
+ shift: Boolean,
18
+ inset: Boolean,
17
19
  },
18
20
 
19
21
  data: {
20
22
  pos: `bottom-${isRtl ? 'right' : 'left'}`,
21
- flip: true,
22
23
  offset: false,
24
+ flip: true,
25
+ shift: true,
26
+ inset: false,
23
27
  },
24
28
 
25
29
  connected() {
@@ -33,7 +37,7 @@ export default {
33
37
  let offset = [this.getPositionOffset(element), this.getShiftOffset(element)];
34
38
 
35
39
  const attach = {
36
- element: [flipPosition(this.dir), this.align],
40
+ element: [this.inset ? this.dir : flipPosition(this.dir), this.align],
37
41
  target: [this.dir, this.align],
38
42
  };
39
43
 
@@ -44,6 +48,9 @@ export default {
44
48
  offset = offset.reverse();
45
49
  }
46
50
 
51
+ const [scrollElement] = scrollParents(element, /auto|scroll/);
52
+ const { scrollTop, scrollLeft } = scrollElement;
53
+
47
54
  // Ensure none positioned element does not generate scrollbars
48
55
  const elDim = dimensions(element);
49
56
  css(element, { top: -elDim.height, left: -elDim.width });
@@ -53,32 +60,39 @@ export default {
53
60
  offset,
54
61
  boundary,
55
62
  flip: this.flip,
63
+ shift: this.shift,
56
64
  viewportOffset: this.getViewportOffset(element),
57
65
  });
66
+
67
+ // Restore scroll position
68
+ scrollElement.scrollTop = scrollTop;
69
+ scrollElement.scrollLeft = scrollLeft;
58
70
  },
59
71
 
60
72
  getPositionOffset(element) {
61
73
  return (
62
74
  toPx(
63
- this.offset === false ? getCssVar('position-offset', element) : this.offset,
75
+ this.offset === false ? css(element, '--uk-position-offset') : this.offset,
64
76
  this.axis === 'x' ? 'width' : 'height',
65
77
  element
66
- ) * (includes(['left', 'top'], this.dir) ? -1 : 1)
78
+ ) *
79
+ (includes(['left', 'top'], this.dir) ? -1 : 1) *
80
+ (this.inset ? -1 : 1)
67
81
  );
68
82
  },
69
83
 
70
84
  getShiftOffset(element) {
71
- return includes(['center', 'justify', 'stretch'], this.align)
85
+ return this.align === 'center'
72
86
  ? 0
73
87
  : toPx(
74
- getCssVar('position-shift-offset', element),
88
+ css(element, '--uk-position-shift-offset'),
75
89
  this.axis === 'y' ? 'width' : 'height',
76
90
  element
77
91
  ) * (includes(['left', 'top'], this.align) ? 1 : -1);
78
92
  },
79
93
 
80
94
  getViewportOffset(element) {
81
- return toPx(getCssVar('position-viewport-offset', element));
95
+ return toPx(css(element, '--uk-position-viewport-offset'));
82
96
  },
83
97
  },
84
98
  };
@@ -5,16 +5,18 @@ import {
5
5
  includes,
6
6
  isRtl,
7
7
  isTouch,
8
+ noop,
8
9
  off,
9
10
  on,
10
- pointerCancel,
11
- pointerDown,
12
- pointerMove,
13
- pointerUp,
14
11
  selInput,
15
12
  trigger,
16
13
  } from 'uikit-util';
17
14
 
15
+ const pointerOptions = { passive: false, capture: true };
16
+ const pointerDown = 'touchstart mousedown';
17
+ const pointerMove = 'touchmove mousemove';
18
+ const pointerUp = 'touchend touchcancel mouseup click input';
19
+
18
20
  export default {
19
21
  props: {
20
22
  draggable: Boolean,
@@ -69,6 +71,16 @@ export default {
69
71
  e.preventDefault();
70
72
  },
71
73
  },
74
+
75
+ {
76
+ // iOS workaround for slider stopping if swiping fast
77
+ name: `${pointerMove} ${pointerUp}`,
78
+ el() {
79
+ return this.list;
80
+ },
81
+ handler: noop,
82
+ ...pointerOptions,
83
+ },
72
84
  ],
73
85
 
74
86
  methods: {
@@ -89,10 +101,10 @@ export default {
89
101
  this.prevIndex = this.index;
90
102
  }
91
103
 
92
- on(document, pointerMove, this.move, { passive: false });
104
+ on(document, pointerMove, this.move, pointerOptions);
93
105
 
94
106
  // 'input' event is triggered by video controls
95
- on(document, `${pointerUp} ${pointerCancel} input`, this.end, true);
107
+ on(document, pointerUp, this.end, pointerOptions);
96
108
 
97
109
  css(this.list, 'userSelect', 'none');
98
110
  },
@@ -172,8 +184,8 @@ export default {
172
184
  },
173
185
 
174
186
  end() {
175
- off(document, pointerMove, this.move, { passive: false });
176
- off(document, `${pointerUp} ${pointerCancel} input`, this.end, true);
187
+ off(document, pointerMove, this.move, pointerOptions);
188
+ off(document, pointerUp, this.end, pointerOptions);
177
189
 
178
190
  if (this.dragging) {
179
191
  this.dragging = null;