uikit 3.14.3 → 3.14.4-dev.10a07fe5a

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 (86) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/css/uikit-core-rtl.css +84 -29
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +84 -29
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +90 -44
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +90 -44
  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 +189 -26
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +189 -26
  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 +1 -1
  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 -34
  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 +801 -617
  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 +801 -617
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +1 -1
  43. package/src/js/core/accordion.js +3 -3
  44. package/src/js/core/alert.js +1 -1
  45. package/src/js/core/drop.js +47 -20
  46. package/src/js/core/height-viewport.js +14 -9
  47. package/src/js/core/navbar.js +11 -9
  48. package/src/js/core/offcanvas.js +1 -47
  49. package/src/js/core/switcher.js +1 -1
  50. package/src/js/mixin/modal.js +90 -4
  51. package/src/js/mixin/position.js +44 -13
  52. package/src/js/mixin/togglable.js +105 -24
  53. package/src/js/util/animation.js +1 -0
  54. package/src/js/util/viewport.js +21 -10
  55. package/src/less/components/drop.less +19 -5
  56. package/src/less/components/dropdown.less +21 -5
  57. package/src/less/components/margin.less +13 -14
  58. package/src/less/components/modal.less +19 -4
  59. package/src/less/components/nav.less +1 -1
  60. package/src/less/components/navbar.less +56 -25
  61. package/src/less/components/offcanvas.less +21 -21
  62. package/src/less/components/position.less +1 -1
  63. package/src/less/components/utility.less +0 -1
  64. package/src/less/theme/dropdown.less +11 -0
  65. package/src/less/theme/navbar.less +12 -12
  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 +45 -14
  72. package/src/scss/components/offcanvas.scss +21 -21
  73. package/src/scss/components/position.scss +1 -1
  74. package/src/scss/components/utility.scss +0 -1
  75. package/src/scss/mixins-theme.scss +8 -12
  76. package/src/scss/mixins.scss +2 -0
  77. package/src/scss/theme/dropdown.scss +8 -0
  78. package/src/scss/theme/navbar.scss +9 -0
  79. package/src/scss/variables-theme.scss +27 -11
  80. package/src/scss/variables.scss +25 -11
  81. package/tests/drop.html +151 -2
  82. package/tests/dropdown.html +228 -13
  83. package/tests/height-viewport.html +62 -0
  84. package/tests/navbar.html +325 -18
  85. package/tests/offcanvas.html +8 -8
  86. package/tests/sticky-navbar.html +132 -0
@@ -5,13 +5,15 @@ import {
5
5
  css,
6
6
  fastdom,
7
7
  hasClass,
8
- height,
9
8
  includes,
10
9
  isBoolean,
11
10
  isFunction,
12
11
  isVisible,
13
12
  noop,
13
+ offset,
14
14
  removeClass,
15
+ scrollParents,
16
+ startsWith,
15
17
  toFloat,
16
18
  toggleClass,
17
19
  toNodes,
@@ -41,7 +43,7 @@ export default {
41
43
 
42
44
  initProps: {
43
45
  overflow: '',
44
- height: '',
46
+ maxHeight: '',
45
47
  paddingTop: '',
46
48
  paddingBottom: '',
47
49
  marginTop: '',
@@ -51,7 +53,7 @@ export default {
51
53
 
52
54
  hideProps: {
53
55
  overflow: 'hidden',
54
- height: 0,
56
+ maxHeight: 0,
55
57
  paddingTop: 0,
56
58
  paddingBottom: 0,
57
59
  marginTop: 0,
@@ -66,7 +68,7 @@ export default {
66
68
  },
67
69
 
68
70
  hasTransition({ animation }) {
69
- return this.hasAnimation && animation[0] === true;
71
+ return startsWith(animation[0], 'slide');
70
72
  },
71
73
  },
72
74
 
@@ -81,18 +83,13 @@ export default {
81
83
  return Promise.reject();
82
84
  }
83
85
 
84
- if (!animate) {
85
- Animation.cancel(el);
86
- Transition.cancel(el);
87
- }
88
-
89
86
  const promise = (
90
87
  isFunction(animate)
91
88
  ? animate
92
89
  : animate === false || !this.hasAnimation
93
- ? this._toggle
90
+ ? toggleInstant(this)
94
91
  : this.hasTransition
95
- ? toggleHeight(this)
92
+ ? toggleTransition(this)
96
93
  : toggleAnimation(this)
97
94
  )(el, show);
98
95
 
@@ -156,7 +153,25 @@ export default {
156
153
  },
157
154
  };
158
155
 
159
- export function toggleHeight({
156
+ function toggleInstant({ _toggle }) {
157
+ return (el, show) => {
158
+ Animation.cancel(el);
159
+ Transition.cancel(el);
160
+ return _toggle(el, show);
161
+ };
162
+ }
163
+
164
+ function toggleTransition(cmp) {
165
+ switch (cmp.animation[0]) {
166
+ case 'slide-left':
167
+ return slideHorizontal(cmp);
168
+ case 'slide-right':
169
+ return slideHorizontal(cmp, true);
170
+ }
171
+ return slide(cmp);
172
+ }
173
+
174
+ export function slide({
160
175
  isToggled,
161
176
  duration,
162
177
  velocity,
@@ -167,11 +182,14 @@ export function toggleHeight({
167
182
  }) {
168
183
  return (el, show) => {
169
184
  const inProgress = Transition.inProgress(el);
170
- const inner = el.hasChildNodes()
171
- ? toFloat(css(el.firstElementChild, 'marginTop')) +
172
- toFloat(css(el.lastElementChild, 'marginBottom'))
173
- : 0;
174
- const currentHeight = isVisible(el) ? height(el) + (inProgress ? 0 : inner) : 0;
185
+ const inner =
186
+ !inProgress && el.hasChildNodes()
187
+ ? toFloat(css(el.firstElementChild, 'marginTop')) +
188
+ toFloat(css(el.lastElementChild, 'marginBottom'))
189
+ : 0;
190
+ const currentHeight = isVisible(el) ? toFloat(css(el, 'height')) + inner : 0;
191
+
192
+ const props = inProgress ? css(el, Object.keys(initProps)) : show ? hideProps : initProps;
175
193
 
176
194
  Transition.cancel(el);
177
195
 
@@ -179,34 +197,97 @@ export function toggleHeight({
179
197
  _toggle(el, true);
180
198
  }
181
199
 
182
- height(el, '');
200
+ css(el, 'maxHeight', '');
183
201
 
184
202
  // Update child components first
185
203
  fastdom.flush();
186
204
 
187
- const endHeight = height(el) + (inProgress ? 0 : inner);
188
- duration = velocity * el.offsetHeight + duration;
205
+ const endHeight = toFloat(css(el, 'height')) + inner;
206
+ duration = velocity * endHeight + duration;
189
207
 
190
- height(el, currentHeight);
208
+ css(el, { ...props, maxHeight: currentHeight });
191
209
 
192
210
  return (
193
211
  show
194
212
  ? Transition.start(
195
213
  el,
196
- { ...initProps, overflow: 'hidden', height: endHeight },
197
- Math.round(duration * (1 - currentHeight / endHeight)),
214
+ { ...initProps, overflow: 'hidden', maxHeight: endHeight },
215
+ duration * (1 - currentHeight / endHeight),
198
216
  transition
199
217
  )
200
218
  : Transition.start(
201
219
  el,
202
220
  hideProps,
203
- Math.round(duration * (currentHeight / endHeight)),
221
+ duration * (currentHeight / endHeight),
204
222
  transition
205
223
  ).then(() => _toggle(el, false))
206
224
  ).then(() => css(el, initProps));
207
225
  };
208
226
  }
209
227
 
228
+ function slideHorizontal({ isToggled, duration, velocity, transition, _toggle }, right) {
229
+ return (el, show) => {
230
+ const visible = isVisible(el);
231
+ const marginLeft = toFloat(css(el, 'marginLeft'));
232
+
233
+ Transition.cancel(el);
234
+
235
+ const [scrollElement] = scrollParents(el);
236
+ css(scrollElement, 'overflowX', 'hidden');
237
+
238
+ if (!isToggled(el)) {
239
+ _toggle(el, true);
240
+ }
241
+
242
+ const width = toFloat(css(el, 'width'));
243
+ duration = velocity * width + duration;
244
+
245
+ const percent = visible ? ((width + marginLeft * (right ? -1 : 1)) / width) * 100 : 0;
246
+ const offsetEl = offset(el);
247
+ const useClipPath = right
248
+ ? offsetEl.right < scrollElement.clientWidth
249
+ : Math.round(offsetEl.left) > 0;
250
+
251
+ css(el, {
252
+ clipPath: useClipPath
253
+ ? right
254
+ ? `polygon(0 0,${percent}% 0,${percent}% 100%,0 100%)`
255
+ : `polygon(${100 - percent}% 0,100% 0,100% 100%,${100 - percent}% 100%)`
256
+ : '',
257
+ marginLeft: (((100 - percent) * (right ? 1 : -1)) / 100) * width,
258
+ });
259
+
260
+ return (
261
+ show
262
+ ? Transition.start(
263
+ el,
264
+ {
265
+ clipPath: useClipPath ? `polygon(0 0,100% 0,100% 100%,0 100%)` : '',
266
+ marginLeft: 0,
267
+ },
268
+ duration * (1 - percent / 100),
269
+ transition
270
+ )
271
+ : Transition.start(
272
+ el,
273
+ {
274
+ clipPath: useClipPath
275
+ ? right
276
+ ? `polygon(0 0,0 0,0 100%,0 100%)`
277
+ : `polygon(100% 0,100% 0,100% 100%,100% 100%)`
278
+ : '',
279
+ marginLeft: (right ? 1 : -1) * width,
280
+ },
281
+ duration * (percent / 100),
282
+ transition
283
+ ).then(() => _toggle(el, false))
284
+ ).then(() => {
285
+ css(scrollElement, 'overflowX', '');
286
+ css(el, { clipPath: '', marginLeft: '' });
287
+ });
288
+ };
289
+ }
290
+
210
291
  function toggleAnimation(cmp) {
211
292
  return (el, show) => {
212
293
  Animation.cancel(el);
@@ -5,6 +5,7 @@ import { startsWith, toNodes } from './lang';
5
5
  import { addClass, hasClass, removeClass, removeClasses } from './class';
6
6
 
7
7
  export function transition(element, props, duration = 400, timing = 'linear') {
8
+ duration = Math.round(duration);
8
9
  return Promise.all(
9
10
  toNodes(element).map(
10
11
  (element) =>
@@ -128,7 +128,7 @@ export function scrolledOver(element, startOffset = 0, endOffset = 0) {
128
128
  return clamp((scrollTop - start) / (end - start));
129
129
  }
130
130
 
131
- export function scrollParents(element, overflowRe = /auto|scroll|hidden/, scrollable = false) {
131
+ export function scrollParents(element, overflowRe = /auto|scroll|hidden|clip/, scrollable = false) {
132
132
  const scrollEl = scrollingElement(element);
133
133
 
134
134
  let ancestors = parents(element).reverse();
@@ -151,18 +151,33 @@ export function scrollParents(element, overflowRe = /auto|scroll|hidden/, scroll
151
151
  }
152
152
 
153
153
  export function offsetViewport(scrollElement) {
154
- let viewportElement = getViewport(scrollElement);
154
+ const window = toWindow(scrollElement);
155
+ const {
156
+ document: { body, documentElement },
157
+ } = window;
158
+ let viewportElement =
159
+ scrollElement === scrollingElement(scrollElement) || scrollElement === body
160
+ ? window
161
+ : scrollElement;
162
+
163
+ const { visualViewport } = window;
164
+ if (isWindow(viewportElement) && visualViewport) {
165
+ let { height, width, scale, pageTop: top, pageLeft: left } = visualViewport;
166
+ height = Math.round(height * scale);
167
+ width = Math.round(width * scale);
168
+ return { height, width, top, left, bottom: top + height, right: left + width };
169
+ }
155
170
 
156
171
  let rect = offset(viewportElement);
157
172
  for (let [prop, dir, start, end] of [
158
173
  ['width', 'x', 'left', 'right'],
159
174
  ['height', 'y', 'top', 'bottom'],
160
175
  ]) {
161
- if (!isWindow(viewportElement)) {
162
- rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
163
- } else {
176
+ if (isWindow(viewportElement)) {
164
177
  // iOS 12 returns <body> as scrollingElement
165
- viewportElement = viewportElement.document.documentElement;
178
+ viewportElement = documentElement;
179
+ } else {
180
+ rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
166
181
  }
167
182
  rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`];
168
183
  rect[end] = rect[prop] + rect[start];
@@ -173,7 +188,3 @@ export function offsetViewport(scrollElement) {
173
188
  function scrollingElement(element) {
174
189
  return toWindow(element).document.scrollingElement;
175
190
  }
176
-
177
- function getViewport(scrollElement) {
178
- return scrollElement === scrollingElement(scrollElement) ? window : scrollElement;
179
- }
@@ -3,10 +3,7 @@
3
3
  //
4
4
  // Component: `uk-drop`
5
5
  //
6
- // Modifiers: `uk-drop-top-*`
7
- // `uk-drop-bottom-*`
8
- // `uk-drop-left-*`
9
- // `uk-drop-right-*`
6
+ // Modifiers: `uk-drop-stretch`
10
7
  // `uk-drop-stack`
11
8
  // `uk-drop-grid`
12
9
  //
@@ -22,6 +19,7 @@
22
19
 
23
20
  @drop-z-index: @global-z-index + 20;
24
21
  @drop-margin: @global-margin;
22
+ @drop-viewport-margin: 15px;
25
23
  @drop-width: 300px;
26
24
 
27
25
 
@@ -42,7 +40,7 @@
42
40
  position: absolute;
43
41
  z-index: @drop-z-index;
44
42
  --uk-position-offset: @drop-margin;
45
- --uk-position-viewport-offset: 10;
43
+ --uk-position-viewport-offset: @drop-viewport-margin;
46
44
  /* 3 */
47
45
  box-sizing: border-box;
48
46
  width: @drop-width;
@@ -52,6 +50,22 @@
52
50
  .uk-drop.uk-open { display: block; }
53
51
 
54
52
 
53
+ /* Stretch modifier
54
+ ========================================================================== */
55
+
56
+ /*
57
+ * 1. Allow scrolling
58
+ */
59
+
60
+ .uk-drop-stretch {
61
+ --uk-position-offset: 0;
62
+ --uk-position-viewport-offset: 0;
63
+ /* 1 */
64
+ overflow-y: auto;
65
+ -webkit-overflow-scrolling: touch;
66
+ }
67
+
68
+
55
69
  /* Grid modifiers
56
70
  ========================================================================== */
57
71
 
@@ -5,10 +5,7 @@
5
5
  //
6
6
  // Adopted: `uk-dropdown-nav`
7
7
  //
8
- // Modifiers: `uk-dropdown-top-*`
9
- // `uk-dropdown-bottom-*`
10
- // `uk-dropdown-left-*`
11
- // `uk-dropdown-right-*`
8
+ // Modifiers: `uk-dropdown-stretch`
12
9
  // `uk-dropdown-stack`
13
10
  // `uk-dropdown-grid`
14
11
  //
@@ -22,6 +19,7 @@
22
19
 
23
20
  @dropdown-z-index: @global-z-index + 20;
24
21
  @dropdown-margin: @global-small-margin;
22
+ @dropdown-viewport-margin: 15px;
25
23
  @dropdown-min-width: 200px;
26
24
  @dropdown-padding: 15px;
27
25
  @dropdown-background: @global-muted-background;
@@ -55,7 +53,7 @@
55
53
  position: absolute;
56
54
  z-index: @dropdown-z-index;
57
55
  --uk-position-offset: @dropdown-margin;
58
- --uk-position-viewport-offset: 10;
56
+ --uk-position-viewport-offset: @dropdown-viewport-margin;
59
57
  /* 3 */
60
58
  box-sizing: border-box;
61
59
  min-width: @dropdown-min-width;
@@ -71,6 +69,23 @@
71
69
  .uk-dropdown.uk-open { display: block; }
72
70
 
73
71
 
72
+ /* Stretch modifier
73
+ ========================================================================== */
74
+
75
+ /*
76
+ * 1. Allow scrolling
77
+ */
78
+
79
+ .uk-dropdown-stretch {
80
+ --uk-position-offset: 0;
81
+ --uk-position-viewport-offset: 0;
82
+ /* 1 */
83
+ overflow-y: auto;
84
+ -webkit-overflow-scrolling: touch;
85
+ .hook-dropdown-stretch();
86
+ }
87
+
88
+
74
89
  /* Nav
75
90
  * Adopts `uk-nav`
76
91
  ========================================================================== */
@@ -145,6 +160,7 @@
145
160
  .hook-dropdown-misc();
146
161
 
147
162
  .hook-dropdown() {}
163
+ .hook-dropdown-stretch() {}
148
164
  .hook-dropdown-nav() {}
149
165
  .hook-dropdown-nav-item() {}
150
166
  .hook-dropdown-nav-item-hover() {}
@@ -193,20 +193,20 @@
193
193
  /* Remove
194
194
  ========================================================================== */
195
195
 
196
- .uk-margin-remove { margin: 0 !important; }
197
- .uk-margin-remove-top { margin-top: 0 !important; }
198
- .uk-margin-remove-bottom { margin-bottom: 0 !important; }
199
- .uk-margin-remove-left { margin-left: 0 !important; }
200
- .uk-margin-remove-right { margin-right: 0 !important; }
201
-
202
- .uk-margin-remove-vertical {
203
- margin-top: 0 !important;
204
- margin-bottom: 0 !important;
205
- }
196
+ .uk-margin-remove { margin: 0 !important; }
197
+ .uk-margin-remove-top { margin-top: 0 !important; }
198
+ .uk-margin-remove-bottom { margin-bottom: 0 !important; }
199
+ .uk-margin-remove-left { margin-left: 0 !important; }
200
+ .uk-margin-remove-right { margin-right: 0 !important; }
201
+
202
+ .uk-margin-remove-vertical {
203
+ margin-top: 0 !important;
204
+ margin-bottom: 0 !important;
205
+ }
206
206
 
207
- .uk-margin-remove-adjacent + *,
208
- .uk-margin-remove-first-child > :first-child { margin-top: 0 !important; }
209
- .uk-margin-remove-last-child > :last-child { margin-bottom: 0 !important; }
207
+ .uk-margin-remove-adjacent + *,
208
+ .uk-margin-remove-first-child > :first-child { margin-top: 0 !important; }
209
+ .uk-margin-remove-last-child > :last-child { margin-bottom: 0 !important; }
210
210
 
211
211
  /* Phone landscape and bigger */
212
212
  @media (min-width: @breakpoint-small) {
@@ -241,7 +241,6 @@
241
241
  }
242
242
 
243
243
 
244
-
245
244
  // Hooks
246
245
  // ========================================================================
247
246
 
@@ -40,15 +40,21 @@
40
40
 
41
41
  @modal-container-width: 1200px;
42
42
 
43
- @modal-body-padding-horizontal: @global-gutter;
44
- @modal-body-padding-vertical: @global-gutter;
43
+ @modal-body-padding-horizontal: 20px;
44
+ @modal-body-padding-vertical: 20px;
45
+ @modal-body-padding-horizontal-s: @global-gutter;
46
+ @modal-body-padding-vertical-s: @global-gutter;
45
47
 
46
- @modal-header-padding-horizontal: @global-gutter;
48
+ @modal-header-padding-horizontal: 20px;
47
49
  @modal-header-padding-vertical: (@modal-header-padding-horizontal / 2);
50
+ @modal-header-padding-horizontal-s: @global-gutter;
51
+ @modal-header-padding-vertical-s: (@modal-header-padding-horizontal-s / 2);
48
52
  @modal-header-background: @global-muted-background;
49
53
 
50
- @modal-footer-padding-horizontal: @global-gutter;
54
+ @modal-footer-padding-horizontal: 20px;
51
55
  @modal-footer-padding-vertical: (@modal-footer-padding-horizontal / 2);
56
+ @modal-footer-padding-horizontal-s: @global-gutter;
57
+ @modal-footer-padding-vertical-s: (@modal-footer-padding-horizontal-s / 2);
52
58
  @modal-footer-background: @global-muted-background;
53
59
 
54
60
  @modal-title-font-size: @global-xlarge-font-size;
@@ -228,6 +234,15 @@
228
234
  .hook-modal-footer();
229
235
  }
230
236
 
237
+ /* Phone landscape and bigger */
238
+ @media (min-width: @breakpoint-small) {
239
+
240
+ .uk-modal-body { padding: @modal-body-padding-vertical-s @modal-body-padding-horizontal-s; }
241
+ .uk-modal-header { padding: @modal-header-padding-vertical-s @modal-header-padding-horizontal-s; }
242
+ .uk-modal-footer { padding: @modal-footer-padding-vertical-s @modal-footer-padding-horizontal-s; }
243
+
244
+ }
245
+
231
246
  /*
232
247
  * Remove margin from the last-child
233
248
  */
@@ -282,7 +282,7 @@ ul.uk-nav-sub {
282
282
  * Subtitle
283
283
  */
284
284
 
285
- .uk-nav-primary .uk-nav-subtitle {
285
+ .uk-nav-primary .uk-nav-subtitle {
286
286
  font-size: @nav-primary-subtitle-font-size;
287
287
  .hook-nav-primary-subtitle();
288
288
  }
@@ -37,8 +37,11 @@
37
37
  // ========================================================================
38
38
 
39
39
  @navbar-background: @global-muted-background;
40
+ @navbar-gap: 0px; // Must have a unit because of `calc`
40
41
  @navbar-color-mode: none;
41
42
 
43
+ @navbar-nav-gap: 0px; // Must have a unit because of `calc`
44
+
42
45
  @navbar-nav-item-height: 80px;
43
46
  @navbar-nav-item-padding-horizontal: 15px;
44
47
  @navbar-nav-item-color: @global-muted-color;
@@ -48,6 +51,7 @@
48
51
  @navbar-nav-item-onclick-color: @global-emphasis-color;
49
52
  @navbar-nav-item-active-color: @global-emphasis-color;
50
53
 
54
+ @navbar-item-padding-horizontal: @navbar-nav-item-padding-horizontal;
51
55
  @navbar-item-color: @global-color;
52
56
 
53
57
  @navbar-toggle-color: @global-muted-color;
@@ -56,11 +60,14 @@
56
60
  @navbar-subtitle-font-size: @global-small-font-size;
57
61
 
58
62
  @navbar-dropdown-z-index: @global-z-index + 20;
59
- @navbar-dropdown-margin: 0px;
63
+ @navbar-dropdown-margin: 0;
64
+ @navbar-dropdown-shift-margin: 0;
65
+ @navbar-dropdown-viewport-margin: 15px;
60
66
  @navbar-dropdown-width: 200px;
61
67
  @navbar-dropdown-padding: 15px;
62
68
  @navbar-dropdown-background: @global-muted-background;
63
69
  @navbar-dropdown-color: @global-color;
70
+ @navbar-dropdown-color-mode: none;
64
71
  @navbar-dropdown-grid-gutter-horizontal: @global-gutter;
65
72
  @navbar-dropdown-grid-gutter-vertical: @navbar-dropdown-grid-gutter-horizontal;
66
73
 
@@ -117,16 +124,13 @@
117
124
 
118
125
  /*
119
126
  * 1. Align navs and items vertically if they have a different height
120
- * 2. Note: IE 11 requires an extra `div` which affects the center selector
121
127
  */
122
128
 
123
129
  .uk-navbar-left,
124
130
  .uk-navbar-right,
125
- // 2. [class*='uk-navbar-center'],
126
- .uk-navbar-center,
127
- .uk-navbar-center-left > *,
128
- .uk-navbar-center-right > * {
131
+ [class*='uk-navbar-center'] {
129
132
  display: flex;
133
+ gap: @navbar-gap;
130
134
  /* 1 */
131
135
  align-items: center;
132
136
  }
@@ -168,8 +172,8 @@
168
172
  top: 0;
169
173
  }
170
174
 
171
- .uk-navbar-center-left { right: 100%; }
172
- .uk-navbar-center-right { left: 100%; }
175
+ .uk-navbar-center-left { right: ~'calc(100% + @{navbar-gap})'; }
176
+ .uk-navbar-center-right { left: ~'calc(100% + @{navbar-gap})'; }
173
177
 
174
178
  [class*='uk-navbar-center-'] {
175
179
  width: max-content;
@@ -186,6 +190,7 @@
186
190
 
187
191
  .uk-navbar-nav {
188
192
  display: flex;
193
+ gap: @navbar-nav-gap;
189
194
  /* 1 */
190
195
  margin: 0;
191
196
  padding: 0;
@@ -267,6 +272,7 @@
267
272
  ========================================================================== */
268
273
 
269
274
  .uk-navbar-item {
275
+ padding: 0 @navbar-item-padding-horizontal;
270
276
  color: @navbar-item-color;
271
277
  .hook-navbar-item();
272
278
  }
@@ -362,7 +368,8 @@
362
368
  position: absolute;
363
369
  z-index: @navbar-dropdown-z-index;
364
370
  --uk-position-offset: @navbar-dropdown-margin;
365
- --uk-position-viewport-offset: 10;
371
+ --uk-position-shift-offset: @navbar-dropdown-shift-margin;
372
+ --uk-position-viewport-offset: @navbar-dropdown-viewport-margin;
366
373
  /* 3 */
367
374
  box-sizing: border-box;
368
375
  width: @navbar-dropdown-width;
@@ -377,6 +384,10 @@
377
384
  /* Show */
378
385
  .uk-navbar-dropdown.uk-open { display: block; }
379
386
 
387
+
388
+ .uk-navbar-dropdown:extend(.uk-light all) when (@navbar-dropdown-color-mode = light) {}
389
+ .uk-navbar-dropdown:extend(.uk-dark all) when (@navbar-dropdown-color-mode = dark) {}
390
+
380
391
  /*
381
392
  * Grid
382
393
  * Adopts `uk-grid`
@@ -401,22 +412,41 @@
401
412
  .uk-navbar-dropdown-width-4:not(.uk-navbar-dropdown-stack) { width: (@navbar-dropdown-width * 4); }
402
413
  .uk-navbar-dropdown-width-5:not(.uk-navbar-dropdown-stack) { width: (@navbar-dropdown-width * 5); }
403
414
 
415
+ /*
416
+ * Stretch modifier
417
+ * 1. Allow scrolling
418
+ */
419
+
420
+ .uk-navbar-dropdown-stretch {
421
+ --uk-position-offset: 0;
422
+ --uk-position-shift-offset: 0;
423
+ --uk-position-viewport-offset: 0;
424
+ /* 1 */
425
+ overflow-y: auto;
426
+ -webkit-overflow-scrolling: touch;
427
+ .hook-navbar-dropdown-stretch();
428
+ }
429
+
404
430
  /*
405
431
  * Dropbar modifier
406
- * 1. Set position
407
- * 2. Bottom padding for dropbar
408
- * 3. Horizontal padding
432
+ * 1. Reset dropdown width to prevent to early shifting
433
+ * 2. Set position
434
+ * 3. Bottom padding for dropbar
435
+ * 4. Horizontal padding
409
436
  */
410
437
 
411
438
  .uk-navbar-dropdown-dropbar {
412
439
  /* 1 */
440
+ width: auto;
441
+ /* 2 */
413
442
  --uk-position-offset: @navbar-dropdown-dropbar-margin-top;
414
443
  --uk-position-viewport-offset: 0;
415
- /* 2 */
416
- margin-bottom: @navbar-dropdown-dropbar-margin-bottom;
417
444
  /* 3 */
445
+ margin-bottom: @navbar-dropdown-dropbar-margin-bottom;
446
+ /* 4 */
418
447
  padding-left: @navbar-dropdown-dropbar-padding-horizontal;
419
448
  padding-right: @navbar-dropdown-dropbar-padding-horizontal;
449
+ --uk-position-shift-offset: 0;
420
450
  .hook-navbar-dropdown-dropbar();
421
451
  }
422
452
 
@@ -513,24 +543,25 @@
513
543
  .hook-navbar-nav-item-onclick() {}
514
544
  .hook-navbar-nav-item-active() {}
515
545
  .hook-navbar-item() {}
516
- .hook-navbar-toggle(){}
517
- .hook-navbar-toggle-hover(){}
518
- .hook-navbar-toggle-icon(){}
519
- .hook-navbar-toggle-icon-hover(){}
546
+ .hook-navbar-toggle() {}
547
+ .hook-navbar-toggle-hover() {}
548
+ .hook-navbar-toggle-icon() {}
549
+ .hook-navbar-toggle-icon-hover() {}
520
550
  .hook-navbar-subtitle() {}
521
- .hook-navbar-primary(){}
522
- .hook-navbar-transparent(){}
523
- .hook-navbar-sticky(){}
524
- .hook-navbar-dropdown(){}
525
- .hook-navbar-dropdown-dropbar(){}
526
- .hook-navbar-dropdown-nav(){}
551
+ .hook-navbar-primary() {}
552
+ .hook-navbar-transparent() {}
553
+ .hook-navbar-sticky() {}
554
+ .hook-navbar-dropdown() {}
555
+ .hook-navbar-dropdown-stretch() {}
556
+ .hook-navbar-dropdown-dropbar() {}
557
+ .hook-navbar-dropdown-nav() {}
527
558
  .hook-navbar-dropdown-nav-item() {}
528
559
  .hook-navbar-dropdown-nav-item-hover() {}
529
560
  .hook-navbar-dropdown-nav-item-active() {}
530
561
  .hook-navbar-dropdown-nav-subtitle() {}
531
562
  .hook-navbar-dropdown-nav-header() {}
532
563
  .hook-navbar-dropdown-nav-divider() {}
533
- .hook-navbar-dropbar(){}
564
+ .hook-navbar-dropbar() {}
534
565
  .hook-navbar-misc() {}
535
566
 
536
567