uikit 3.14.2-dev.404bdcedf → 3.14.2-dev.447aa311a

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 (89) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/css/uikit-core-rtl.css +85 -24
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +85 -24
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +88 -23
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +88 -23
  9. package/dist/css/uikit.min.css +1 -1
  10. package/dist/js/components/countdown.js +1 -1
  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 +101 -22
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +101 -22
  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 +17 -2
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +1 -1
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +1 -1
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +1 -1
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +1 -1
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +1 -1
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +135 -44
  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 +222 -110
  37. package/dist/js/uikit-core.min.js +1 -1
  38. package/dist/js/uikit-icons.js +1 -1
  39. package/dist/js/uikit-icons.min.js +1 -1
  40. package/dist/js/uikit.js +238 -111
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +1 -1
  43. package/src/js/components/parallax.js +16 -1
  44. package/src/js/core/accordion.js +3 -3
  45. package/src/js/core/alert.js +1 -1
  46. package/src/js/core/drop.js +40 -20
  47. package/src/js/core/height-viewport.js +14 -9
  48. package/src/js/core/navbar.js +19 -18
  49. package/src/js/core/toggle.js +5 -8
  50. package/src/js/mixin/position.js +44 -23
  51. package/src/js/mixin/togglable.js +105 -24
  52. package/src/js/util/animation.js +1 -0
  53. package/src/js/util/viewport.js +2 -5
  54. package/src/less/components/drop.less +19 -5
  55. package/src/less/components/dropdown.less +21 -5
  56. package/src/less/components/margin.less +13 -14
  57. package/src/less/components/modal.less +19 -4
  58. package/src/less/components/nav.less +1 -1
  59. package/src/less/components/navbar.less +46 -19
  60. package/src/less/components/offcanvas.less +21 -21
  61. package/src/less/components/position.less +1 -1
  62. package/src/less/components/sticky.less +7 -0
  63. package/src/less/components/utility.less +1 -2
  64. package/src/less/theme/dropdown.less +11 -0
  65. package/src/less/theme/navbar.less +7 -0
  66. package/src/scss/components/drop.scss +19 -5
  67. package/src/scss/components/dropdown.scss +21 -5
  68. package/src/scss/components/margin.scss +13 -14
  69. package/src/scss/components/modal.scss +19 -4
  70. package/src/scss/components/nav.scss +1 -1
  71. package/src/scss/components/navbar.scss +35 -8
  72. package/src/scss/components/offcanvas.scss +21 -21
  73. package/src/scss/components/position.scss +1 -1
  74. package/src/scss/components/sticky.scss +7 -0
  75. package/src/scss/components/utility.scss +1 -2
  76. package/src/scss/mixins-theme.scss +8 -0
  77. package/src/scss/mixins.scss +2 -0
  78. package/src/scss/theme/dropdown.scss +8 -0
  79. package/src/scss/theme/navbar.scss +4 -0
  80. package/src/scss/variables-theme.scss +23 -10
  81. package/src/scss/variables.scss +22 -11
  82. package/tests/drop.html +145 -2
  83. package/tests/dropdown.html +228 -13
  84. package/tests/height-viewport.html +62 -0
  85. package/tests/navbar.html +321 -14
  86. package/tests/offcanvas.html +8 -8
  87. package/tests/sticky-navbar.html +132 -0
  88. package/tests/sticky-parallax.html +2 -1
  89. package/tests/sticky.html +5 -4
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "uikit",
3
3
  "title": "UIkit",
4
4
  "description": "UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.",
5
- "version": "3.14.2-dev.404bdcedf",
5
+ "version": "3.14.2-dev.447aa311a",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -73,8 +73,23 @@ export default {
73
73
  },
74
74
  };
75
75
 
76
+ /*
77
+ * Inspired by https://gist.github.com/gre/1650294?permalink_comment_id=3477425#gistcomment-3477425
78
+ *
79
+ * linear: 0
80
+ * easeInSine: 0.5
81
+ * easeOutSine: -0.5
82
+ * easeInQuad: 1
83
+ * easeOutQuad: -1
84
+ * easeInCubic: 2
85
+ * easeOutCubic: -2
86
+ * easeInQuart: 3
87
+ * easeOutQuart: -3
88
+ * easeInQuint: 4
89
+ * easeOutQuint: -4
90
+ */
76
91
  function ease(percent, easing) {
77
- return easing >= 0 ? Math.pow(percent, easing + 1) : 1 - Math.pow(1 - percent, -easing + 1);
92
+ return easing >= 0 ? Math.pow(percent, easing + 1) : 1 - Math.pow(1 - percent, 1 - easing);
78
93
  }
79
94
 
80
95
  // SVG elements do not inherit from HTMLElement
@@ -1,6 +1,6 @@
1
1
  import Class from '../mixin/class';
2
2
  import Lazyload from '../mixin/lazyload';
3
- import { default as Togglable, toggleHeight } from '../mixin/togglable';
3
+ import { slide, default as Togglable } from '../mixin/togglable';
4
4
  import {
5
5
  $,
6
6
  $$,
@@ -34,7 +34,7 @@ export default {
34
34
  data: {
35
35
  targets: '> *',
36
36
  active: false,
37
- animation: [true],
37
+ animation: ['slide'],
38
38
  collapsible: true,
39
39
  multiple: false,
40
40
  clsOpen: 'uk-open',
@@ -144,7 +144,7 @@ export default {
144
144
  }
145
145
 
146
146
  hide(content, false);
147
- await toggleHeight(this)(el._wrapper, show);
147
+ await slide(this)(el._wrapper, show);
148
148
  hide(content, !show);
149
149
 
150
150
  delete el._wrapper;
@@ -11,7 +11,7 @@ export default {
11
11
  },
12
12
 
13
13
  data: {
14
- animation: [true],
14
+ animation: ['slide'],
15
15
  selClose: '.uk-alert-close',
16
16
  duration: 150,
17
17
  hideProps: { opacity: 0, ...Togglable.data.hideProps },
@@ -8,7 +8,6 @@ import {
8
8
  apply,
9
9
  attr,
10
10
  css,
11
- getCssVar,
12
11
  hasClass,
13
12
  includes,
14
13
  isTouch,
@@ -16,6 +15,7 @@ import {
16
15
  MouseTracker,
17
16
  observeResize,
18
17
  offset,
18
+ offsetViewport,
19
19
  on,
20
20
  once,
21
21
  parent,
@@ -28,7 +28,6 @@ import {
28
28
  removeClass,
29
29
  scrollParents,
30
30
  toggleClass,
31
- toPx,
32
31
  within,
33
32
  } from 'uikit-util';
34
33
 
@@ -48,6 +47,7 @@ export default {
48
47
  delayHide: Number,
49
48
  display: String,
50
49
  clsDrop: String,
50
+ animateOut: Boolean,
51
51
  },
52
52
 
53
53
  data: {
@@ -62,6 +62,7 @@ export default {
62
62
  animation: ['uk-animation-fade'],
63
63
  cls: 'uk-open',
64
64
  container: false,
65
+ animateOut: false,
65
66
  },
66
67
 
67
68
  created() {
@@ -249,7 +250,7 @@ export default {
249
250
  }
250
251
  }),
251
252
 
252
- ...(this.display === 'static'
253
+ ...(this.display === 'static' && this.align !== 'stretch'
253
254
  ? []
254
255
  : (() => {
255
256
  const handler = () => this.$emit();
@@ -310,7 +311,7 @@ export default {
310
311
  methods: {
311
312
  show(target = this.target, delay = true) {
312
313
  if (this.isToggled() && target && this.target && target !== this.target) {
313
- this.hide(false);
314
+ this.hide(false, false);
314
315
  }
315
316
 
316
317
  this.target = target;
@@ -330,7 +331,7 @@ export default {
330
331
  let prev;
331
332
  while (active && prev !== active && !within(this.$el, active.$el)) {
332
333
  prev = active;
333
- active.hide(false);
334
+ active.hide(false, false);
334
335
  }
335
336
  }
336
337
 
@@ -344,8 +345,8 @@ export default {
344
345
  );
345
346
  },
346
347
 
347
- hide(delay = true) {
348
- const hide = () => this.toggleElement(this.$el, false, false);
348
+ hide(delay = true, animate = true) {
349
+ const hide = () => this.toggleElement(this.$el, false, this.animateOut && animate);
349
350
 
350
351
  this.clearTimers();
351
352
 
@@ -377,40 +378,59 @@ export default {
377
378
  position() {
378
379
  removeClass(this.$el, `${this.clsDrop}-stack`);
379
380
  toggleClass(this.$el, `${this.clsDrop}-boundary`, this.boundaryAlign);
381
+ toggleClass(this.$el, `${this.clsDrop}-stretch`, this.align === 'stretch');
380
382
 
381
383
  const boundary = query(this.boundary, this.$el);
382
- const scrollParentOffset = offset(
383
- scrollParents(boundary && this.boundaryAlign ? boundary : this.$el)[0]
384
+ const target = boundary && this.boundaryAlign ? boundary : this.target;
385
+ const [scrollParent] = scrollParents(
386
+ boundary && this.boundaryAlign ? boundary : this.$el
384
387
  );
388
+ const scrollParentOffset = offset(scrollParent);
385
389
  const boundaryOffset = boundary ? offset(boundary) : scrollParentOffset;
390
+ const viewportOffset = this.getViewportOffset(this.$el);
386
391
 
387
392
  css(this.$el, 'maxWidth', '');
388
- const maxWidth =
389
- scrollParentOffset.width -
390
- 2 * toPx(getCssVar('position-viewport-offset', this.$el));
393
+ const maxWidth = scrollParentOffset.width - 2 * viewportOffset;
391
394
 
392
- if (this.pos[1] === 'justify') {
395
+ if (this.align === 'justify') {
393
396
  const prop = this.axis === 'y' ? 'width' : 'height';
394
397
  css(
395
398
  this.$el,
396
399
  prop,
397
400
  Math.min(
398
401
  (boundary ? boundaryOffset : offset(this.target))[prop],
399
- scrollParentOffset[prop] -
400
- 2 * toPx(getCssVar('position-viewport-offset', this.$el))
402
+ scrollParentOffset[prop] - 2 * viewportOffset
401
403
  )
402
404
  );
405
+ } else if (this.align === 'stretch') {
406
+ this.flip = this.axis === 'y' ? 'x' : 'y';
407
+ this.display = 'static';
408
+
409
+ const viewport = offsetViewport(scrollParent);
410
+ const targetDim = offset(target);
411
+ const elOffset = Math.abs(this.getPositionOffset(this.$el)) + viewportOffset;
412
+
413
+ css(this.$el, {
414
+ width:
415
+ this.axis === 'y'
416
+ ? viewport.width
417
+ : (this.dir === 'left'
418
+ ? targetDim.left - viewport.left
419
+ : viewport.right - targetDim.right) - elOffset,
420
+ height:
421
+ this.axis === 'x'
422
+ ? viewport.height
423
+ : (this.dir === 'top'
424
+ ? targetDim.top - viewport.top
425
+ : viewport.bottom - targetDim.bottom) - elOffset,
426
+ });
403
427
  } else if (this.$el.offsetWidth > maxWidth) {
404
428
  addClass(this.$el, `${this.clsDrop}-stack`);
405
429
  }
406
430
 
407
431
  css(this.$el, 'maxWidth', maxWidth);
408
432
 
409
- this.positionAt(
410
- this.$el,
411
- boundary && this.boundaryAlign ? boundary : this.target,
412
- boundary
413
- );
433
+ this.positionAt(this.$el, target, boundary);
414
434
  },
415
435
  },
416
436
  };
@@ -4,12 +4,13 @@ import {
4
4
  css,
5
5
  dimensions,
6
6
  endsWith,
7
- height,
8
7
  isNumeric,
9
8
  isString,
10
9
  isVisible,
11
- offset,
10
+ offsetPosition,
11
+ offsetViewport,
12
12
  query,
13
+ scrollParents,
13
14
  toFloat,
14
15
  } from 'uikit-util';
15
16
 
@@ -32,7 +33,7 @@ export default {
32
33
 
33
34
  resizeTargets() {
34
35
  // check for offsetTop change
35
- return [this.$el, document.documentElement];
36
+ return [this.$el, ...scrollParents(this.$el, /auto|scroll/)];
36
37
  },
37
38
 
38
39
  update: {
@@ -44,21 +45,25 @@ export default {
44
45
  let minHeight = '';
45
46
  const box = boxModelAdjust(this.$el, 'height', 'content-box');
46
47
 
48
+ const [scrollElement] = scrollParents(this.$el, /auto|scroll/);
49
+ const { height: viewportHeight } = offsetViewport(scrollElement);
50
+
47
51
  if (this.expand) {
48
52
  minHeight = Math.max(
49
- height(window) -
50
- (dimensions(document.documentElement).height -
51
- dimensions(this.$el).height) -
53
+ viewportHeight -
54
+ (dimensions(scrollElement).height - dimensions(this.$el).height) -
52
55
  box,
53
56
  0
54
57
  );
55
58
  } else {
56
59
  // on mobile devices (iOS and Android) window.innerHeight !== 100vh
57
- minHeight = 'calc(100vh';
60
+ minHeight = `calc(${
61
+ document.scrollingElement === scrollElement ? '100vh' : `${viewportHeight}px`
62
+ }`;
58
63
 
59
64
  if (this.offsetTop) {
60
- const { top } = offset(this.$el);
61
- minHeight += top > 0 && top < height(window) / 2 ? ` - ${top}px` : '';
65
+ const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
66
+ minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : '';
62
67
  }
63
68
 
64
69
  if (this.offsetBottom === true) {
@@ -13,9 +13,9 @@ import {
13
13
  height,
14
14
  includes,
15
15
  isRtl,
16
- isVisible,
17
16
  matches,
18
17
  noop,
18
+ observeResize,
19
19
  offset,
20
20
  once,
21
21
  parent,
@@ -285,8 +285,8 @@ export default {
285
285
  return this.dropbar;
286
286
  },
287
287
 
288
- handler(_, { $el }) {
289
- if (!hasClass($el, this.clsDrop)) {
288
+ handler(_, { $el, align }) {
289
+ if (!hasClass($el, this.clsDrop) || align === 'stretch') {
290
290
  return;
291
291
  }
292
292
 
@@ -309,19 +309,19 @@ export default {
309
309
  return this.dropbar;
310
310
  },
311
311
 
312
- handler(_, { $el, pos: [dir] = [] }) {
313
- if (!hasClass($el, this.clsDrop)) {
312
+ handler(_, { $el, align }) {
313
+ if (!hasClass($el, this.clsDrop) || align === 'stretch') {
314
314
  return;
315
315
  }
316
316
 
317
- if (dir === 'bottom') {
317
+ this._observer = observeResize($el, () =>
318
318
  this.transitionTo(
319
319
  offset($el).bottom -
320
320
  offset(this.dropbar).top +
321
321
  toFloat(css($el, 'marginBottom')),
322
322
  $el
323
- );
324
- }
323
+ )
324
+ );
325
325
  },
326
326
  },
327
327
 
@@ -360,11 +360,13 @@ export default {
360
360
  return this.dropbar;
361
361
  },
362
362
 
363
- handler(_, { $el }) {
364
- if (!hasClass($el, this.clsDrop)) {
363
+ handler(_, { $el, align }) {
364
+ if (!hasClass($el, this.clsDrop) || align === 'stretch') {
365
365
  return;
366
366
  }
367
367
 
368
+ this._observer.disconnect();
369
+
368
370
  const active = this.getActive();
369
371
 
370
372
  if (!active || active?.$el === $el) {
@@ -381,28 +383,27 @@ export default {
381
383
 
382
384
  transitionTo(newHeight, el) {
383
385
  const { dropbar } = this;
384
- const oldHeight = isVisible(dropbar) ? height(dropbar) : 0;
386
+ const oldHeight = height(dropbar);
385
387
 
386
388
  el = oldHeight < newHeight && el;
387
389
 
388
- css(el, 'clip', `rect(0,${el.offsetWidth}px,${oldHeight}px,0)`);
390
+ css(el, 'clipPath', `polygon(0 0,100% 0,100% ${oldHeight}px,0 ${oldHeight}px)`);
389
391
 
390
392
  height(dropbar, oldHeight);
391
393
 
392
394
  Transition.cancel([el, dropbar]);
393
- return Promise.all([
395
+ Promise.all([
394
396
  Transition.start(dropbar, { height: newHeight }, this.duration),
395
397
  Transition.start(
396
398
  el,
397
- { clip: `rect(0,${el.offsetWidth}px,${newHeight}px,0)` },
399
+ {
400
+ clipPath: `polygon(0 0,100% 0,100% ${newHeight}px,0 ${newHeight}px)`,
401
+ },
398
402
  this.duration
399
403
  ),
400
404
  ])
401
405
  .catch(noop)
402
- .then(() => {
403
- css(el, { clip: '' });
404
- this.$update(dropbar);
405
- });
406
+ .then(() => css(el, { clipPath: '' }));
406
407
  },
407
408
 
408
409
  getDropdown(el) {
@@ -77,6 +77,8 @@ export default {
77
77
  },
78
78
 
79
79
  handler(e) {
80
+ this._preventClick = null;
81
+
80
82
  if (!isTouch(e) || this._showState) {
81
83
  return;
82
84
  }
@@ -163,6 +165,7 @@ export default {
163
165
  handler(e) {
164
166
  let link;
165
167
  if (
168
+ this._preventClick ||
166
169
  closest(e.target, 'a[href="#"], a[href=""]') ||
167
170
  ((link = closest(e.target, 'a[href]')) &&
168
171
  (attr(this.$el, 'aria-expanded') !== 'true' ||
@@ -171,15 +174,9 @@ export default {
171
174
  e.preventDefault();
172
175
  }
173
176
 
174
- if (this._preventClick) {
175
- return (this._preventClick = null);
176
- }
177
-
178
- if (!includes(this.mode, 'click')) {
179
- return;
177
+ if (!this._preventClick && includes(this.mode, 'click')) {
178
+ this.toggle();
180
179
  }
181
-
182
- this.toggle();
183
180
  },
184
181
  },
185
182
 
@@ -1,4 +1,13 @@
1
- import { flipPosition, getCssVar, includes, isRtl, positionAt, toPx } from 'uikit-util';
1
+ import {
2
+ css,
3
+ dimensions,
4
+ flipPosition,
5
+ getCssVar,
6
+ includes,
7
+ isRtl,
8
+ positionAt,
9
+ toPx,
10
+ } from 'uikit-util';
2
11
 
3
12
  export default {
4
13
  props: {
@@ -15,33 +24,17 @@ export default {
15
24
 
16
25
  connected() {
17
26
  this.pos = this.$props.pos.split('-').concat('center').slice(0, 2);
18
- this.axis = includes(['top', 'bottom'], this.pos[0]) ? 'y' : 'x';
27
+ [this.dir, this.align] = this.pos;
28
+ this.axis = includes(['top', 'bottom'], this.dir) ? 'y' : 'x';
19
29
  },
20
30
 
21
31
  methods: {
22
32
  positionAt(element, target, boundary) {
23
- const [dir, align] = this.pos;
24
-
25
- const mainAxisOffset =
26
- toPx(
27
- this.offset === false ? getCssVar('position-offset', element) : this.offset,
28
- this.axis === 'x' ? 'width' : 'height',
29
- element
30
- ) * (includes(['left', 'top'], dir) ? -1 : 1);
31
-
32
- const crossAxisOffset = includes(['center', 'justify'], align)
33
- ? 0
34
- : toPx(
35
- getCssVar('position-shift-offset', element),
36
- this.axis === 'y' ? 'width' : 'height',
37
- element
38
- ) * (includes(['left', 'top'], align) ? 1 : -1);
39
-
40
- let offset = [mainAxisOffset, crossAxisOffset];
33
+ let offset = [this.getPositionOffset(element), this.getShiftOffset(element)];
41
34
 
42
35
  const attach = {
43
- element: [flipPosition(dir), align],
44
- target: [dir, align],
36
+ element: [flipPosition(this.dir), this.align],
37
+ target: [this.dir, this.align],
45
38
  };
46
39
 
47
40
  if (this.axis === 'y') {
@@ -51,13 +44,41 @@ export default {
51
44
  offset = offset.reverse();
52
45
  }
53
46
 
47
+ // Ensure none positioned element does not generate scrollbars
48
+ const elDim = dimensions(element);
49
+ css(element, { top: -elDim.height, left: -elDim.width });
50
+
54
51
  positionAt(element, target, {
55
52
  attach,
56
53
  offset,
57
54
  boundary,
58
55
  flip: this.flip,
59
- viewportOffset: toPx(getCssVar('position-viewport-offset', element)),
56
+ viewportOffset: this.getViewportOffset(element),
60
57
  });
61
58
  },
59
+
60
+ getPositionOffset(element) {
61
+ return (
62
+ toPx(
63
+ this.offset === false ? getCssVar('position-offset', element) : this.offset,
64
+ this.axis === 'x' ? 'width' : 'height',
65
+ element
66
+ ) * (includes(['left', 'top'], this.dir) ? -1 : 1)
67
+ );
68
+ },
69
+
70
+ getShiftOffset(element) {
71
+ return includes(['center', 'justify', 'stretch'], this.align)
72
+ ? 0
73
+ : toPx(
74
+ getCssVar('position-shift-offset', element),
75
+ this.axis === 'y' ? 'width' : 'height',
76
+ element
77
+ ) * (includes(['left', 'top'], this.align) ? 1 : -1);
78
+ },
79
+
80
+ getViewportOffset(element) {
81
+ return toPx(getCssVar('position-viewport-offset', element));
82
+ },
62
83
  },
63
84
  };