uikit 3.14.4-dev.51a1b06ef → 3.14.4-dev.5e7e87ba7

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 (112) hide show
  1. package/CHANGELOG.md +27 -17
  2. package/build/util.js +1 -0
  3. package/dist/css/uikit-core-rtl.css +265 -59
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +265 -59
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +285 -63
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +285 -63
  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 +1 -1
  14. package/dist/js/components/filter.min.js +1 -1
  15. package/dist/js/components/lightbox-panel.js +69 -114
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +69 -114
  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 +1 -1
  22. package/dist/js/components/parallax.min.js +1 -1
  23. package/dist/js/components/slider-parallax.js +1 -1
  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 +1 -1
  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 +85 -131
  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 +297 -324
  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 +297 -324
  42. package/dist/js/uikit.min.js +14 -1
  43. package/package.json +1 -1
  44. package/src/images/components/navbar-toggle-icon.svg +22 -3
  45. package/src/js/api/state.js +1 -1
  46. package/src/js/core/accordion.js +9 -17
  47. package/src/js/core/alert.js +35 -14
  48. package/src/js/core/drop.js +90 -61
  49. package/src/js/core/navbar.js +28 -45
  50. package/src/js/mixin/position.js +18 -20
  51. package/src/js/mixin/togglable.js +80 -124
  52. package/src/js/util/animation.js +4 -3
  53. package/src/js/util/filter.js +3 -7
  54. package/src/js/util/position.js +42 -47
  55. package/src/js/util/viewport.js +1 -1
  56. package/src/less/components/_import.less +1 -0
  57. package/src/less/components/drop.less +1 -18
  58. package/src/less/components/dropbar.less +115 -0
  59. package/src/less/components/dropdown.less +6 -20
  60. package/src/less/components/nav.less +203 -19
  61. package/src/less/components/navbar.less +10 -51
  62. package/src/less/theme/_import.less +1 -0
  63. package/src/less/theme/dropbar.less +44 -0
  64. package/src/less/theme/dropdown.less +0 -11
  65. package/src/less/theme/nav.less +46 -0
  66. package/src/less/theme/navbar.less +1 -5
  67. package/src/scss/components/_import.scss +1 -0
  68. package/src/scss/components/drop.scss +1 -18
  69. package/src/scss/components/dropbar.scss +115 -0
  70. package/src/scss/components/dropdown.scss +6 -20
  71. package/src/scss/components/nav.scss +153 -19
  72. package/src/scss/components/navbar.scss +10 -51
  73. package/src/scss/mixins-theme.scss +76 -6
  74. package/src/scss/mixins.scss +73 -2
  75. package/src/scss/theme/_import.scss +1 -0
  76. package/src/scss/theme/dropbar.scss +44 -0
  77. package/src/scss/theme/dropdown.scss +0 -8
  78. package/src/scss/theme/nav.scss +44 -0
  79. package/src/scss/theme/navbar.scss +1 -5
  80. package/src/scss/variables-theme.scss +50 -9
  81. package/src/scss/variables.scss +39 -7
  82. package/tests/accordion.html +2 -2
  83. package/tests/alert.html +2 -2
  84. package/tests/countdown.html +1 -1
  85. package/tests/drop.html +444 -412
  86. package/tests/dropbar.html +456 -0
  87. package/tests/dropdown.html +8 -470
  88. package/tests/filter.html +9 -12
  89. package/tests/form.html +1 -1
  90. package/tests/index.html +123 -104
  91. package/tests/lightbox.html +5 -5
  92. package/tests/list.html +8 -8
  93. package/tests/modal.html +13 -13
  94. package/tests/nav.html +117 -8
  95. package/tests/navbar.html +75 -211
  96. package/tests/offcanvas.html +2 -6
  97. package/tests/parallax.html +1 -1
  98. package/tests/position.html +13 -24
  99. package/tests/progress.html +9 -9
  100. package/tests/scroll.html +7 -10
  101. package/tests/search.html +5 -5
  102. package/tests/slider.html +6 -5
  103. package/tests/slideshow.html +8 -8
  104. package/tests/sortable.html +6 -8
  105. package/tests/sticky-navbar.html +6 -6
  106. package/tests/sticky.html +8 -8
  107. package/tests/switcher.html +1 -1
  108. package/tests/tab.html +1 -1
  109. package/tests/table.html +7 -7
  110. package/tests/toggle.html +2 -2
  111. package/tests/tooltip.html +1 -1
  112. package/tests/upload.html +11 -11
@@ -3,7 +3,7 @@ import {
3
3
  addClass,
4
4
  Animation,
5
5
  css,
6
- fastdom,
6
+ dimensions,
7
7
  hasClass,
8
8
  includes,
9
9
  isBoolean,
@@ -11,13 +11,14 @@ import {
11
11
  isVisible,
12
12
  noop,
13
13
  removeClass,
14
- scrollParents,
15
14
  startsWith,
16
15
  toFloat,
17
16
  toggleClass,
18
17
  toNodes,
19
18
  Transition,
20
19
  trigger,
20
+ unwrap,
21
+ wrapInner,
21
22
  } from 'uikit-util';
22
23
 
23
24
  export default {
@@ -39,26 +40,6 @@ export default {
39
40
  transition: 'ease',
40
41
  clsEnter: 'uk-togglabe-enter',
41
42
  clsLeave: 'uk-togglabe-leave',
42
-
43
- initProps: {
44
- overflow: '',
45
- maxHeight: '',
46
- paddingTop: '',
47
- paddingBottom: '',
48
- marginTop: '',
49
- marginBottom: '',
50
- boxShadow: '',
51
- },
52
-
53
- hideProps: {
54
- overflow: 'hidden',
55
- maxHeight: 0,
56
- paddingTop: 0,
57
- paddingBottom: 0,
58
- marginTop: 0,
59
- marginBottom: 0,
60
- boxShadow: 'none',
61
- },
62
43
  },
63
44
 
64
45
  computed: {
@@ -67,7 +48,7 @@ export default {
67
48
  },
68
49
 
69
50
  hasTransition({ animation }) {
70
- return startsWith(animation[0], 'slide');
51
+ return ['slide', 'reveal'].some((transition) => startsWith(animation[0], transition));
71
52
  },
72
53
  },
73
54
 
@@ -160,122 +141,97 @@ function toggleInstant({ _toggle }) {
160
141
  };
161
142
  }
162
143
 
163
- function toggleTransition(cmp) {
164
- switch (cmp.animation[0]) {
165
- case 'slide-left':
166
- return slideHorizontal(cmp);
167
- case 'slide-right':
168
- return slideHorizontal(cmp, true);
169
- }
170
- return slide(cmp);
171
- }
144
+ export function toggleTransition(cmp) {
145
+ const [mode = 'reveal', startProp = 'top'] = cmp.animation[0]?.split('-') || [];
172
146
 
173
- export function slide({
174
- isToggled,
175
- duration,
176
- velocity,
177
- initProps,
178
- hideProps,
179
- transition,
180
- _toggle,
181
- }) {
182
- return (el, show) => {
183
- const inProgress = Transition.inProgress(el);
184
- const inner =
185
- !inProgress && el.hasChildNodes()
186
- ? toFloat(css(el.firstElementChild, 'marginTop')) +
187
- toFloat(css(el.lastElementChild, 'marginBottom'))
188
- : 0;
189
- const currentHeight = isVisible(el) ? toFloat(css(el, 'height')) + inner : 0;
147
+ const dirs = [
148
+ ['left', 'right'],
149
+ ['top', 'bottom'],
150
+ ];
151
+ const dir = dirs[includes(dirs[0], startProp) ? 0 : 1];
152
+ const end = dir[1] === startProp;
153
+ const props = ['width', 'height'];
154
+ const dimProp = props[dirs.indexOf(dir)];
155
+ const marginProp = `margin-${dir[0]}`;
156
+ const marginStartProp = `margin-${startProp}`;
190
157
 
191
- const props = inProgress ? css(el, Object.keys(initProps)) : show ? hideProps : initProps;
158
+ return async (el, show) => {
159
+ let { duration, velocity, transition, _toggle } = cmp;
192
160
 
193
- Transition.cancel(el);
161
+ let currentDim = dimensions(el)[dimProp];
162
+
163
+ const inProgress = Transition.inProgress(el);
164
+ await Transition.cancel(el);
194
165
 
195
- if (!isToggled(el)) {
166
+ if (show) {
196
167
  _toggle(el, true);
197
168
  }
198
169
 
199
- css(el, 'maxHeight', '');
200
-
201
- // Update child components first
202
- fastdom.flush();
203
-
204
- const endHeight = toFloat(css(el, 'height')) + inner;
205
- duration = velocity * endHeight + duration;
206
-
207
- css(el, { ...props, maxHeight: currentHeight });
208
-
209
- return (
210
- show
211
- ? Transition.start(
212
- el,
213
- { ...initProps, overflow: 'hidden', maxHeight: endHeight },
214
- duration * (1 - currentHeight / endHeight),
215
- transition
216
- )
217
- : Transition.start(
218
- el,
219
- hideProps,
220
- duration * (currentHeight / endHeight),
221
- transition
222
- ).then(() => _toggle(el, false))
223
- ).then(() => css(el, initProps));
224
- };
225
- }
226
-
227
- function slideHorizontal({ isToggled, duration, velocity, transition, _toggle }, right) {
228
- return (el, show) => {
229
- const visible = isVisible(el);
230
- const marginLeft = toFloat(css(el, 'marginLeft'));
231
-
232
- Transition.cancel(el);
170
+ const prevProps = Object.fromEntries(
171
+ ['padding', 'border', 'width', 'height', 'overflow', marginProp, marginStartProp].map(
172
+ (key) => [key, el.style[key]]
173
+ )
174
+ );
233
175
 
234
- const [scrollElement] = scrollParents(el.offsetParent);
235
- css(scrollElement, 'overflowX', 'hidden');
176
+ const dim = dimensions(el);
177
+ const currentMargin = toFloat(css(el, marginProp));
178
+ const marginStart = toFloat(css(el, marginStartProp));
179
+ const endDim = dim[dimProp] + marginStart;
236
180
 
237
- if (!isToggled(el)) {
238
- _toggle(el, true);
181
+ if (!inProgress && !show) {
182
+ currentDim += marginStart;
239
183
  }
240
184
 
241
- const width = toFloat(css(el, 'width'));
242
- duration = velocity * width + duration;
243
-
244
- const percent = visible ? ((width + marginLeft * (right ? -1 : 1)) / width) * 100 : 0;
185
+ const [wrapper] = wrapInner(el, '<div>');
186
+ css(wrapper, {
187
+ boxSizing: 'border-box',
188
+ height: dim.height,
189
+ width: dim.width,
190
+ ...css(el, [
191
+ 'padding',
192
+ 'borderTop',
193
+ 'borderRight',
194
+ 'borderBottom',
195
+ 'borderLeft',
196
+ 'borderImage',
197
+ marginStartProp,
198
+ ]),
199
+ });
245
200
 
246
201
  css(el, {
247
- clipPath: right
248
- ? `polygon(0 0,${percent}% 0,${percent}% 100%,0 100%)`
249
- : `polygon(${100 - percent}% 0,100% 0,100% 100%,${100 - percent}% 100%)`,
250
- marginLeft: (((100 - percent) * (right ? 1 : -1)) / 100) * width,
202
+ padding: 0,
203
+ border: 0,
204
+ [marginStartProp]: 0,
205
+ width: dim.width,
206
+ height: dim.height,
207
+ overflow: 'hidden',
208
+ [dimProp]: currentDim,
251
209
  });
252
210
 
253
- return (
254
- show
255
- ? Transition.start(
256
- el,
257
- {
258
- clipPath: `polygon(0 0,100% 0,100% 100%,0 100%)`,
259
- marginLeft: 0,
260
- },
261
- duration * (1 - percent / 100),
262
- transition
263
- )
264
- : Transition.start(
265
- el,
266
- {
267
- clipPath: right
268
- ? `polygon(0 0,0 0,0 100%,0 100%)`
269
- : `polygon(100% 0,100% 0,100% 100%,100% 100%)`,
270
- marginLeft: (right ? 1 : -1) * width,
271
- },
272
- duration * (percent / 100),
273
- transition
274
- ).then(() => _toggle(el, false))
275
- ).then(() => {
276
- css(scrollElement, 'overflowX', '');
277
- css(el, { clipPath: '', marginLeft: '' });
278
- });
211
+ const percent = currentDim / endDim;
212
+ duration = (velocity * endDim + duration) * (show ? 1 - percent : percent);
213
+ const endProps = { [dimProp]: show ? endDim : 0 };
214
+
215
+ if (end) {
216
+ css(el, marginProp, endDim - currentDim + currentMargin);
217
+ endProps[marginProp] = show ? currentMargin : endDim + currentMargin;
218
+ }
219
+
220
+ if (!end ^ (mode === 'reveal')) {
221
+ css(wrapper, marginProp, -endDim + currentDim);
222
+ Transition.start(wrapper, { [marginProp]: show ? 0 : -endDim }, duration, transition);
223
+ }
224
+
225
+ try {
226
+ await Transition.start(el, endProps, duration, transition);
227
+ } finally {
228
+ css(el, prevProps);
229
+ unwrap(wrapper.firstChild);
230
+
231
+ if (!show) {
232
+ _toggle(el, false);
233
+ }
234
+ }
279
235
  };
280
236
  }
281
237
 
@@ -50,13 +50,14 @@ export function transition(element, props, duration = 400, timing = 'linear') {
50
50
  export const Transition = {
51
51
  start: transition,
52
52
 
53
- stop(element) {
53
+ async stop(element) {
54
54
  trigger(element, 'transitionend');
55
- return Promise.resolve();
55
+ await Promise.resolve();
56
56
  },
57
57
 
58
- cancel(element) {
58
+ async cancel(element) {
59
59
  trigger(element, 'transitioncanceled');
60
+ await Promise.resolve();
60
61
  },
61
62
 
62
63
  inProgress(element) {
@@ -51,12 +51,8 @@ export function matches(element, selector) {
51
51
  }
52
52
 
53
53
  export function closest(element, selector) {
54
- if (startsWith(selector, '>')) {
55
- selector = selector.slice(1);
56
- }
57
-
58
54
  return isElement(element)
59
- ? element.closest(selector)
55
+ ? element.closest(startsWith(selector, '>') ? selector.slice(1) : selector)
60
56
  : toNodes(element)
61
57
  .map((element) => closest(element, selector))
62
58
  .filter(Boolean);
@@ -64,8 +60,8 @@ export function closest(element, selector) {
64
60
 
65
61
  export function within(element, selector) {
66
62
  return isString(selector)
67
- ? matches(element, selector) || !!closest(element, selector)
68
- : element === selector || toNode(selector).contains(toNode(element));
63
+ ? !!closest(element, selector)
64
+ : toNode(selector).contains(toNode(element));
69
65
  }
70
66
 
71
67
  export function parents(element, selector) {
@@ -1,5 +1,5 @@
1
1
  import { offset } from './dimensions';
2
- import { clamp, includes, ucfirst } from './lang';
2
+ import { clamp, isArray, ucfirst } from './lang';
3
3
  import { offsetViewport, scrollParents } from './viewport';
4
4
 
5
5
  const dirs = [
@@ -18,11 +18,11 @@ export function positionAt(element, target, options) {
18
18
  ...options,
19
19
  };
20
20
 
21
- const dim = options.flip
22
- ? attachToWithFlip(element, target, options)
23
- : attachTo(element, target, options);
21
+ if (!isArray(target)) {
22
+ target = [target, target];
23
+ }
24
24
 
25
- offset(element, dim);
25
+ offset(element, getPosition(element, target, options));
26
26
  }
27
27
 
28
28
  function attachTo(element, target, options) {
@@ -37,8 +37,11 @@ function attachTo(element, target, options) {
37
37
  };
38
38
 
39
39
  const position = offset(element);
40
- const targetOffset = offset(target);
40
+
41
41
  for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
42
+ const targetOffset =
43
+ attach.target[i] === attach.element[i] ? offsetViewport(target[i]) : offset(target[i]);
44
+
42
45
  position[start] = position[dir] =
43
46
  targetOffset[start] +
44
47
  moveBy(attach.target[i], end, targetOffset[prop]) -
@@ -53,60 +56,54 @@ function moveBy(start, end, dim) {
53
56
  return start === 'center' ? dim / 2 : start === end ? dim : 0;
54
57
  }
55
58
 
56
- function attachToWithFlip(element, target, options) {
59
+ function getPosition(element, target, options) {
57
60
  const position = attachTo(element, target, options);
58
- const targetDim = offset(target);
59
61
 
60
62
  let {
61
63
  flip,
64
+ shift,
62
65
  attach: { element: elAttach, target: targetAttach },
63
66
  offset: elOffset,
64
67
  boundary,
65
- viewport,
66
68
  viewportOffset,
67
69
  } = options;
68
70
 
69
- let viewports = scrollParents(element);
70
- if (boundary === target) {
71
- viewports = viewports.filter((viewport) => viewport !== boundary);
71
+ if (!flip && !shift) {
72
+ return position;
72
73
  }
73
- const [scrollElement] = viewports;
74
- viewports.push(viewport);
75
74
 
76
75
  const offsetPosition = { ...position };
77
76
  for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
78
- if (flip !== true && !includes(flip, dir)) {
79
- continue;
80
- }
77
+ let viewports = scrollParents(target[i]);
78
+ const [scrollElement] = viewports;
81
79
 
82
- const willFlip =
83
- !intersectLine(position, targetDim, i) && intersectLine(position, targetDim, 1 - i);
84
-
85
- viewport = getIntersectionArea(...viewports.filter(Boolean).map(offsetViewport));
80
+ let viewport = getIntersectionArea(...viewports.map(offsetViewport));
86
81
 
87
82
  if (viewportOffset) {
88
83
  viewport[start] += viewportOffset;
89
84
  viewport[end] -= viewportOffset;
90
85
  }
91
86
 
92
- if (boundary && !willFlip && position[prop] <= offset(boundary)[prop]) {
93
- viewport = getIntersectionArea(viewport, offset(boundary));
87
+ if (boundary) {
88
+ viewport = getIntersectionArea(viewport, offsetViewport(boundary));
94
89
  }
95
90
 
96
- const isInStartBoundary = position[start] >= viewport[start];
97
- const isInEndBoundary = position[end] <= viewport[end];
91
+ const isInStartViewport = position[start] >= viewport[start];
92
+ const isInEndViewport = position[end] <= viewport[end];
98
93
 
99
- if (isInStartBoundary && isInEndBoundary) {
94
+ if (isInStartViewport && isInEndViewport) {
100
95
  continue;
101
96
  }
102
97
 
103
- let offsetBy;
98
+ let offsetBy = 0;
99
+ const targetDim = offset(target[i]);
104
100
 
105
101
  // Flip
106
- if (willFlip) {
102
+ if (!intersectLine(position, targetDim, i) && intersectLine(position, targetDim, 1 - i)) {
107
103
  if (
108
- (elAttach[i] === end && isInStartBoundary) ||
109
- (elAttach[i] === start && isInEndBoundary)
104
+ !flip ||
105
+ (elAttach[i] === end && isInStartViewport) ||
106
+ (elAttach[i] === start && isInEndViewport)
110
107
  ) {
111
108
  continue;
112
109
  }
@@ -143,27 +140,25 @@ function attachToWithFlip(element, target, options) {
143
140
  return false;
144
141
  }
145
142
 
146
- if (flip === true || includes(flip, dirs[1 - i][1])) {
147
- const newPos = attachToWithFlip(element, target, {
148
- ...options,
149
- attach: {
150
- element: elAttach.map(flipDir).reverse(),
151
- target: targetAttach.map(flipDir).reverse(),
152
- },
153
- offset: elOffset.reverse(),
154
- flip: flip === true ? flip : [...flip, dirs[1 - i][1]],
155
- recursion: true,
156
- });
157
-
158
- if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
159
- return newPos;
160
- }
143
+ const newPos = getPosition(element, target, {
144
+ ...options,
145
+ attach: {
146
+ element: elAttach.map(flipDir).reverse(),
147
+ target: targetAttach.map(flipDir).reverse(),
148
+ },
149
+ offset: elOffset.reverse(),
150
+ recursion: true,
151
+ });
152
+
153
+ if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
154
+ return newPos;
161
155
  }
156
+
162
157
  continue;
163
158
  }
164
159
 
165
- // Move
166
- } else {
160
+ // Shift
161
+ } else if (shift) {
167
162
  offsetBy =
168
163
  clamp(
169
164
  clamp(position[start], viewport[start], viewport[end] - position[prop]),
@@ -150,7 +150,7 @@ export function offsetViewport(scrollElement) {
150
150
  // iOS 12 returns <body> as scrollingElement
151
151
  viewportElement = documentElement;
152
152
  } else {
153
- rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
153
+ rect[start] += toFloat(css(viewportElement, `border-${start}-width`));
154
154
  }
155
155
  rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`];
156
156
  rect[end] = rect[prop] + rect[start];
@@ -40,6 +40,7 @@
40
40
  @import "accordion.less";
41
41
  @import "drop.less"; // After: Card
42
42
  @import "dropdown.less"; // After: Card
43
+ @import "dropbar.less";
43
44
  @import "modal.less"; // After: Close
44
45
  @import "slideshow.less";
45
46
  @import "slider.less";
@@ -3,8 +3,7 @@
3
3
  //
4
4
  // Component: `uk-drop`
5
5
  //
6
- // Modifiers: `uk-drop-stretch`
7
- // `uk-drop-stack`
6
+ // Modifiers: `uk-drop-stack`
8
7
  // `uk-drop-grid`
9
8
  //
10
9
  // States: `uk-open`
@@ -50,22 +49,6 @@
50
49
  .uk-drop.uk-open { display: block; }
51
50
 
52
51
 
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
-
69
52
  /* Grid modifiers
70
53
  ========================================================================== */
71
54
 
@@ -0,0 +1,115 @@
1
+ // Name: Dropbar
2
+ // Description: Component to create dropbar menus
3
+ //
4
+ // Component: `uk-dropbar`
5
+ //
6
+ // ========================================================================
7
+
8
+
9
+ // Variables
10
+ // ========================================================================
11
+
12
+ @dropbar-margin: 0;
13
+ @dropbar-z-index: @global-z-index + 20;
14
+ @dropbar-padding-top: 15px;
15
+ @dropbar-padding-bottom: @dropbar-padding-top;
16
+ @dropbar-padding-horizontal: 15px;
17
+ @dropbar-padding-horizontal-s: @global-gutter;
18
+ @dropbar-padding-horizontal-m: @global-medium-gutter;
19
+ @dropbar-background: @global-muted-background;
20
+ @dropbar-color: @global-color;
21
+ @dropbar-color-mode: none;
22
+
23
+
24
+ /* ========================================================================
25
+ Component: Dropbar
26
+ ========================================================================== */
27
+
28
+ /*
29
+ * 1. Hide by default
30
+ * 2. Set position
31
+ * 3. Style
32
+ */
33
+
34
+ .uk-dropbar {
35
+ --uk-position-offset: @dropbar-margin;
36
+ --uk-position-shift-offset: 0;
37
+ --uk-position-viewport-offset: 0;
38
+ /* 1 */
39
+ display: none;
40
+ /* 2 */
41
+ position: absolute;
42
+ z-index: @dropbar-z-index;
43
+ /* 3 */
44
+ box-sizing: border-box;
45
+ padding: @dropbar-padding-top @dropbar-padding-horizontal @dropbar-padding-bottom @dropbar-padding-horizontal;
46
+ background: @dropbar-background;
47
+ color: @dropbar-color;
48
+ .hook-dropbar();
49
+ }
50
+
51
+ /* Show */
52
+ .uk-dropbar.uk-open { display: block; }
53
+
54
+ /*
55
+ * Remove margin from the last-child
56
+ */
57
+
58
+ .uk-dropbar > :last-child { margin-bottom: 0; }
59
+
60
+ /* Phone landscape and bigger */
61
+ @media (min-width: @breakpoint-small) {
62
+
63
+ .uk-dropbar {
64
+ padding-left: @dropbar-padding-horizontal-s;
65
+ padding-right: @dropbar-padding-horizontal-s;
66
+ }
67
+
68
+ }
69
+
70
+ /* Tablet landscape and bigger */
71
+ @media (min-width: @breakpoint-medium) {
72
+
73
+ .uk-dropbar {
74
+ padding-left: @dropbar-padding-horizontal-m;
75
+ padding-right: @dropbar-padding-horizontal-m;
76
+ }
77
+
78
+ }
79
+
80
+ // Color Mode
81
+ .uk-dropbar:extend(.uk-light all) when (@dropbar-color-mode = light) {}
82
+ .uk-dropbar:extend(.uk-dark all) when (@dropbar-color-mode = dark) {}
83
+
84
+
85
+ /* Direction modifier
86
+ ========================================================================== */
87
+
88
+ .uk-dropbar-top {
89
+ .hook-dropbar-top();
90
+ }
91
+
92
+ .uk-dropbar-bottom {
93
+ .hook-dropbar-bottom();
94
+ }
95
+
96
+ .uk-dropbar-left {
97
+ .hook-dropbar-left();
98
+ }
99
+
100
+ .uk-dropbar-right {
101
+ .hook-dropbar-right();
102
+ }
103
+
104
+
105
+ // Hooks
106
+ // ========================================================================
107
+
108
+ .hook-dropbar-misc();
109
+
110
+ .hook-dropbar() {}
111
+ .hook-dropbar-top() {}
112
+ .hook-dropbar-bottom() {}
113
+ .hook-dropbar-left() {}
114
+ .hook-dropbar-right() {}
115
+ .hook-dropbar-misc() {}