uikit 3.14.4-dev.e3664d0d2 → 3.14.4-dev.e8873dd80

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 +39 -15
  2. package/build/util.js +1 -0
  3. package/dist/css/uikit-core-rtl.css +353 -96
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +353 -96
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +373 -101
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +373 -101
  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 +96 -139
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +96 -139
  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 +1 -1
  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 +1 -1
  30. package/dist/js/components/slideshow.min.js +1 -1
  31. package/dist/js/components/sortable.js +1 -1
  32. package/dist/js/components/sortable.min.js +1 -1
  33. package/dist/js/components/tooltip.js +100 -137
  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 +518 -454
  38. package/dist/js/uikit-core.min.js +17 -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 +524 -458
  42. package/dist/js/uikit.min.js +17 -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 +25 -3
  48. package/src/js/api/state.js +2 -2
  49. package/src/js/components/filter.js +5 -3
  50. package/src/js/core/accordion.js +9 -17
  51. package/src/js/core/alert.js +35 -14
  52. package/src/js/core/drop.js +110 -82
  53. package/src/js/core/height-viewport.js +6 -2
  54. package/src/js/core/icon.js +16 -0
  55. package/src/js/core/index.js +2 -0
  56. package/src/js/core/leader.js +2 -2
  57. package/src/js/core/navbar.js +44 -30
  58. package/src/js/core/scroll.js +37 -10
  59. package/src/js/core/toggle.js +3 -5
  60. package/src/js/mixin/media.js +4 -5
  61. package/src/js/mixin/modal.js +15 -12
  62. package/src/js/mixin/position.js +18 -11
  63. package/src/js/mixin/style.js +11 -0
  64. package/src/js/mixin/togglable.js +88 -133
  65. package/src/js/util/animation.js +4 -3
  66. package/src/js/util/class.js +3 -1
  67. package/src/js/util/filter.js +3 -7
  68. package/src/js/util/position.js +107 -107
  69. package/src/js/util/style.js +4 -13
  70. package/src/js/util/viewport.js +3 -5
  71. package/src/less/components/_import.less +1 -0
  72. package/src/less/components/drop.less +1 -18
  73. package/src/less/components/dropbar.less +115 -0
  74. package/src/less/components/dropdown.less +16 -16
  75. package/src/less/components/leader.less +1 -1
  76. package/src/less/components/nav.less +218 -59
  77. package/src/less/components/navbar.less +73 -27
  78. package/src/less/components/utility.less +10 -2
  79. package/src/less/theme/_import.less +1 -0
  80. package/src/less/theme/dropbar.less +44 -0
  81. package/src/less/theme/dropdown.less +0 -11
  82. package/src/less/theme/nav.less +45 -7
  83. package/src/less/theme/navbar.less +4 -10
  84. package/src/scss/components/_import.scss +1 -0
  85. package/src/scss/components/drop.scss +1 -18
  86. package/src/scss/components/dropbar.scss +115 -0
  87. package/src/scss/components/dropdown.scss +16 -16
  88. package/src/scss/components/leader.scss +1 -1
  89. package/src/scss/components/nav.scss +167 -47
  90. package/src/scss/components/navbar.scss +61 -27
  91. package/src/scss/components/utility.scss +8 -1
  92. package/src/scss/mixins-theme.scss +92 -24
  93. package/src/scss/mixins.scss +89 -17
  94. package/src/scss/theme/_import.scss +1 -0
  95. package/src/scss/theme/dropbar.scss +44 -0
  96. package/src/scss/theme/dropdown.scss +0 -8
  97. package/src/scss/theme/nav.scss +43 -7
  98. package/src/scss/theme/navbar.scss +4 -7
  99. package/src/scss/variables-theme.scss +61 -14
  100. package/src/scss/variables.scss +50 -11
  101. package/tests/accordion.html +2 -2
  102. package/tests/alert.html +2 -2
  103. package/tests/countdown.html +1 -1
  104. package/tests/drop.html +455 -375
  105. package/tests/dropbar.html +458 -0
  106. package/tests/dropdown.html +26 -401
  107. package/tests/filter.html +9 -12
  108. package/tests/form.html +1 -1
  109. package/tests/index.html +126 -107
  110. package/tests/js/index.js +1 -4
  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 +330 -233
  116. package/tests/offcanvas.html +17 -21
  117. package/tests/parallax.html +1 -1
  118. package/tests/position.html +18 -16
  119. package/tests/progress.html +9 -9
  120. package/tests/scroll.html +7 -10
  121. package/tests/search.html +6 -6
  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 +15 -15
  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,9 @@ export default {
36
37
  align: String,
37
38
  offset: Number,
38
39
  boundary: Boolean,
39
- boundaryAlign: Boolean,
40
+ target: Boolean,
41
+ targetX: Boolean,
42
+ targetY: Boolean,
40
43
  clsDrop: String,
41
44
  delayShow: Number,
42
45
  delayHide: Number,
@@ -53,9 +56,12 @@ export default {
53
56
  offset: undefined,
54
57
  delayShow: undefined,
55
58
  delayHide: undefined,
56
- boundaryAlign: undefined,
57
- flip: 'x',
59
+ flip: false,
60
+ shift: true,
58
61
  boundary: true,
62
+ target: false,
63
+ targetX: false,
64
+ targetY: false,
59
65
  dropbar: false,
60
66
  dropbarAnchor: false,
61
67
  duration: 200,
@@ -90,7 +96,7 @@ export default {
90
96
  },
91
97
 
92
98
  watch(dropbar) {
93
- addClass(dropbar, 'uk-navbar-dropbar');
99
+ addClass(dropbar, 'uk-dropbar', 'uk-dropbar-top', 'uk-navbar-dropbar');
94
100
  },
95
101
 
96
102
  immediate: true,
@@ -106,7 +112,7 @@ export default {
106
112
 
107
113
  if (this.dropContainer !== $el) {
108
114
  for (const el of $$(`.${clsDrop}`, this.dropContainer)) {
109
- const target = this.getDropdown(el)?.target;
115
+ const target = this.getDropdown(el)?.targetEl;
110
116
  if (!includes(dropdowns, el) && target && within(target, this.$el)) {
111
117
  dropdowns.push(el);
112
118
  }
@@ -124,7 +130,6 @@ export default {
124
130
  ...this.$props,
125
131
  boundary: this.boundary,
126
132
  pos: this.pos,
127
- offset: this.dropbar || this.offset,
128
133
  }
129
134
  );
130
135
  },
@@ -169,8 +174,8 @@ export default {
169
174
  if (
170
175
  active &&
171
176
  includes(active.mode, 'hover') &&
172
- active.target &&
173
- !within(active.target, current) &&
177
+ active.targetEl &&
178
+ !within(active.targetEl, current) &&
174
179
  !active.isDelaying
175
180
  ) {
176
181
  active.hide(false);
@@ -192,7 +197,7 @@ export default {
192
197
  if (keyCode === keyMap.DOWN && hasAttr(current, 'aria-expanded')) {
193
198
  e.preventDefault();
194
199
 
195
- if (!active || active.target !== current) {
200
+ if (!active || active.targetEl !== current) {
196
201
  current.click();
197
202
  once(this.dropContainer, 'show', ({ target }) =>
198
203
  focusFirstFocusableElement(target)
@@ -243,7 +248,7 @@ export default {
243
248
  }
244
249
 
245
250
  if (keyCode === keyMap.ESC) {
246
- active?.target?.focus();
251
+ active?.targetEl?.focus();
247
252
  }
248
253
 
249
254
  handleNavItemNavigation(e, this.toggles, active);
@@ -285,8 +290,8 @@ export default {
285
290
  return this.dropbar;
286
291
  },
287
292
 
288
- handler(_, { $el, align }) {
289
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
293
+ handler({ target }) {
294
+ if (!this.isDropbarDrop(target)) {
290
295
  return;
291
296
  }
292
297
 
@@ -294,7 +299,7 @@ export default {
294
299
  after(this.dropbarAnchor || this.$el, this.dropbar);
295
300
  }
296
301
 
297
- addClass($el, `${this.clsDrop}-dropbar`);
302
+ addClass(target, `${this.clsDrop}-dropbar`);
298
303
  },
299
304
  },
300
305
 
@@ -309,19 +314,24 @@ export default {
309
314
  return this.dropbar;
310
315
  },
311
316
 
312
- handler(_, { $el, align }) {
313
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
317
+ handler({ target }) {
318
+ if (!this.isDropbarDrop(target)) {
314
319
  return;
315
320
  }
316
321
 
317
- this._observer = observeResize($el, () =>
322
+ this._observer = observeResize(target, () => {
323
+ const targetOffsets = parents(target, `.${this.clsDrop}`)
324
+ .concat(target)
325
+ .map((el) => offset(el));
326
+ const minTop = Math.min(...targetOffsets.map(({ top }) => top));
327
+ const maxBottom = Math.max(...targetOffsets.map(({ bottom }) => bottom));
328
+ const dropbarOffset = offset(this.dropbar);
329
+ css(this.dropbar, 'top', this.dropbar.offsetTop - (dropbarOffset.top - minTop));
318
330
  this.transitionTo(
319
- offset($el).bottom -
320
- offset(this.dropbar).top +
321
- toFloat(css($el, 'marginBottom')),
322
- $el
323
- )
324
- );
331
+ maxBottom - minTop + toFloat(css(target, 'marginBottom')),
332
+ target
333
+ );
334
+ });
325
335
  },
326
336
  },
327
337
 
@@ -336,13 +346,13 @@ export default {
336
346
  return this.dropbar;
337
347
  },
338
348
 
339
- handler(e, { $el }) {
349
+ handler(e) {
340
350
  const active = this.getActive();
341
351
 
342
352
  if (
343
353
  matches(this.dropbar, ':hover') &&
344
- active?.$el === $el &&
345
- !this.toggles.some((el) => active.target !== el && matches(el, ':focus'))
354
+ active?.$el === e.target &&
355
+ !this.toggles.some((el) => active.targetEl !== el && matches(el, ':focus'))
346
356
  ) {
347
357
  e.preventDefault();
348
358
  }
@@ -360,8 +370,8 @@ export default {
360
370
  return this.dropbar;
361
371
  },
362
372
 
363
- handler(_, { $el, align }) {
364
- if (!hasClass($el, this.clsDrop) || align === 'stretch') {
373
+ handler({ target }) {
374
+ if (!this.isDropbarDrop(target)) {
365
375
  return;
366
376
  }
367
377
 
@@ -369,7 +379,7 @@ export default {
369
379
 
370
380
  const active = this.getActive();
371
381
 
372
- if (!active || active?.$el === $el) {
382
+ if (!active || active?.$el === target) {
373
383
  this.transitionTo(0);
374
384
  }
375
385
  },
@@ -378,7 +388,7 @@ export default {
378
388
 
379
389
  methods: {
380
390
  getActive() {
381
- return active && within(active.target, this.$el) && active;
391
+ return includes(this.dropdowns, active?.$el) && active;
382
392
  },
383
393
 
384
394
  transitionTo(newHeight, el) {
@@ -409,12 +419,16 @@ export default {
409
419
  getDropdown(el) {
410
420
  return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');
411
421
  },
422
+
423
+ isDropbarDrop(el) {
424
+ return this.getDropdown(el) && hasClass(el, this.clsDrop);
425
+ },
412
426
  },
413
427
  };
414
428
 
415
429
  function handleNavItemNavigation(e, toggles, active) {
416
430
  const { current, keyCode } = e;
417
- const target = active?.target || current;
431
+ const target = active?.targetEl || current;
418
432
  const i = toggles.indexOf(target);
419
433
 
420
434
  // 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));
@@ -181,7 +181,7 @@ export default {
181
181
  },
182
182
 
183
183
  {
184
- name: 'toggled',
184
+ name: 'hide show',
185
185
 
186
186
  self: true,
187
187
 
@@ -189,10 +189,8 @@ export default {
189
189
  return this.target;
190
190
  },
191
191
 
192
- handler(e, toggled) {
193
- if (e.target === this.target[0]) {
194
- this.updateAria(toggled);
195
- }
192
+ handler({ type }) {
193
+ this.updateAria(type === 'show');
196
194
  },
197
195
  },
198
196
 
@@ -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), { self: true });
139
+ once(this.$el, 'hidden', preventBackgroundScroll(), { self: true });
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,16 +334,22 @@ export function preventOverscroll(el) {
337
334
  return () => events.forEach((fn) => fn());
338
335
  }
339
336
 
337
+ let prevented;
340
338
  export function preventBackgroundScroll() {
341
- const { body, documentElement } = document;
342
- css(body, {
343
- overflowY: width(window) > documentElement.clientWidth ? 'scroll' : '',
339
+ if (prevented) {
340
+ return noop;
341
+ }
342
+ prevented = true;
343
+
344
+ const { scrollingElement } = document;
345
+ css(scrollingElement, {
346
+ overflowY: 'hidden',
344
347
  touchAction: 'none',
348
+ paddingRight: width(window) - scrollingElement.clientWidth,
345
349
  });
346
- css(documentElement, 'overflowY', 'hidden');
347
350
  return () => {
348
- css(documentElement, 'overflowY', '');
349
- css(body, { overflowY: '', touchAction: '' });
351
+ prevented = false;
352
+ css(scrollingElement, { overflowY: '', touchAction: '', paddingRight: '' });
350
353
  };
351
354
  }
352
355
 
@@ -2,7 +2,6 @@ import {
2
2
  css,
3
3
  dimensions,
4
4
  flipPosition,
5
- getCssVar,
6
5
  includes,
7
6
  isRtl,
8
7
  positionAt,
@@ -15,12 +14,16 @@ export default {
15
14
  pos: String,
16
15
  offset: null,
17
16
  flip: Boolean,
17
+ shift: Boolean,
18
+ inset: Boolean,
18
19
  },
19
20
 
20
21
  data: {
21
22
  pos: `bottom-${isRtl ? 'right' : 'left'}`,
22
- flip: true,
23
23
  offset: false,
24
+ flip: true,
25
+ shift: true,
26
+ inset: false,
24
27
  },
25
28
 
26
29
  connected() {
@@ -32,17 +35,19 @@ export default {
32
35
  methods: {
33
36
  positionAt(element, target, boundary) {
34
37
  let offset = [this.getPositionOffset(element), this.getShiftOffset(element)];
38
+ const placement = [this.flip && 'flip', this.shift && 'shift'];
35
39
 
36
40
  const attach = {
37
- element: [flipPosition(this.dir), this.align],
41
+ element: [this.inset ? this.dir : flipPosition(this.dir), this.align],
38
42
  target: [this.dir, this.align],
39
43
  };
40
44
 
41
45
  if (this.axis === 'y') {
42
46
  for (const prop in attach) {
43
- attach[prop] = attach[prop].reverse();
47
+ attach[prop].reverse();
44
48
  }
45
- offset = offset.reverse();
49
+ offset.reverse();
50
+ placement.reverse();
46
51
  }
47
52
 
48
53
  const [scrollElement] = scrollParents(element, /auto|scroll/);
@@ -56,7 +61,7 @@ export default {
56
61
  attach,
57
62
  offset,
58
63
  boundary,
59
- flip: this.flip,
64
+ placement,
60
65
  viewportOffset: this.getViewportOffset(element),
61
66
  });
62
67
 
@@ -68,25 +73,27 @@ export default {
68
73
  getPositionOffset(element) {
69
74
  return (
70
75
  toPx(
71
- this.offset === false ? getCssVar('position-offset', element) : this.offset,
76
+ this.offset === false ? css(element, '--uk-position-offset') : this.offset,
72
77
  this.axis === 'x' ? 'width' : 'height',
73
78
  element
74
- ) * (includes(['left', 'top'], this.dir) ? -1 : 1)
79
+ ) *
80
+ (includes(['left', 'top'], this.dir) ? -1 : 1) *
81
+ (this.inset ? -1 : 1)
75
82
  );
76
83
  },
77
84
 
78
85
  getShiftOffset(element) {
79
- return includes(['center', 'justify', 'stretch'], this.align)
86
+ return this.align === 'center'
80
87
  ? 0
81
88
  : toPx(
82
- getCssVar('position-shift-offset', element),
89
+ css(element, '--uk-position-shift-offset'),
83
90
  this.axis === 'y' ? 'width' : 'height',
84
91
  element
85
92
  ) * (includes(['left', 'top'], this.align) ? 1 : -1);
86
93
  },
87
94
 
88
95
  getViewportOffset(element) {
89
- return toPx(getCssVar('position-viewport-offset', element));
96
+ return toPx(css(element, '--uk-position-viewport-offset'));
90
97
  },
91
98
  },
92
99
  };
@@ -0,0 +1,11 @@
1
+ import { attr } from 'uikit-util';
2
+
3
+ export default {
4
+ beforeConnect() {
5
+ this._style = attr(this.$el, 'style');
6
+ },
7
+
8
+ disconnected() {
9
+ attr(this.$el, 'style', this._style);
10
+ },
11
+ };