UNPKG

16.6 kBSCSSView Raw
1// Name: Navbar
2// Description: Component to create horizontal navigation bars
3//
4// Component: `uk-navbar`
5//
6// Sub-objects: `uk-navbar-container`
7// `uk-navbar-left`
8// `uk-navbar-right`
9// `uk-navbar-center`
10// `uk-navbar-center-left`
11// `uk-navbar-center-right`
12// `uk-navbar-nav`
13// `uk-navbar-item`
14// `uk-navbar-toggle`
15// `uk-navbar-subtitle`
16// `uk-navbar-dropbar`
17//
18// Adopted: `uk-navbar-dropdown` + Modifiers
19// `uk-navbar-dropdown-nav`
20// `uk-navbar-dropdown-grid`
21// `uk-navbar-toggle-icon`
22//
23// Modifiers: `uk-navbar-primary`
24// `uk-navbar-transparent`
25// `uk-navbar-sticky`
26// `uk-navbar-dropdown-stack`
27//
28// States: `uk-active`
29// `uk-parent`
30// `uk-open`
31//
32//
33// ========================================================================
34
35
36// Variables
37// ========================================================================
38
39$navbar-background: $global-muted-background !default;
40$navbar-color-mode: none !default;
41
42$navbar-nav-item-height: 80px !default;
43$navbar-nav-item-padding-horizontal: 15px !default;
44$navbar-nav-item-color: $global-muted-color !default;
45$navbar-nav-item-font-size: $global-font-size !default;
46$navbar-nav-item-font-family: $global-font-family !default;
47$navbar-nav-item-hover-color: $global-color !default;
48$navbar-nav-item-onclick-color: $global-emphasis-color !default;
49$navbar-nav-item-active-color: $global-emphasis-color !default;
50
51$navbar-item-color: $global-color !default;
52
53$navbar-toggle-color: $global-muted-color !default;
54$navbar-toggle-hover-color: $global-color !default;
55
56$navbar-subtitle-font-size: $global-small-font-size !default;
57
58$navbar-dropdown-z-index: $global-z-index + 20 !default;
59$navbar-dropdown-width: 200px !default;
60$navbar-dropdown-margin: 0 !default;
61$navbar-dropdown-padding: 15px !default;
62$navbar-dropdown-background: $global-muted-background !default;
63$navbar-dropdown-color: $global-color !default;
64$navbar-dropdown-grid-gutter-horizontal: $global-gutter !default;
65$navbar-dropdown-grid-gutter-vertical: $navbar-dropdown-grid-gutter-horizontal !default;
66
67$navbar-dropdown-dropbar-margin-top: 0 !default;
68$navbar-dropdown-dropbar-margin-bottom: $navbar-dropdown-dropbar-margin-top !default;
69
70$navbar-dropdown-nav-item-color: $global-muted-color !default;
71$navbar-dropdown-nav-item-hover-color: $global-color !default;
72$navbar-dropdown-nav-item-active-color: $global-emphasis-color !default;
73$navbar-dropdown-nav-header-color: $global-emphasis-color !default;
74$navbar-dropdown-nav-divider-border-width: $global-border-width !default;
75$navbar-dropdown-nav-divider-border: $global-border !default;
76$navbar-dropdown-nav-sublist-item-color: $global-muted-color !default;
77$navbar-dropdown-nav-sublist-item-hover-color: $global-color !default;
78$navbar-dropdown-nav-sublist-item-active-color: $global-emphasis-color !default;
79
80$navbar-dropbar-background: $navbar-dropdown-background !default;
81$navbar-dropbar-z-index: $global-z-index - 20 !default;
82
83
84/* ========================================================================
85 Component: Navbar
86 ========================================================================== */
87
88/*
89 * 1. Create position context to center navbar group
90 */
91
92.uk-navbar {
93 display: flex;
94 /* 1 */
95 position: relative;
96 @if(mixin-exists(hook-navbar)) {@include hook-navbar();}
97}
98
99
100/* Container
101 ========================================================================== */
102
103.uk-navbar-container:not(.uk-navbar-transparent) {
104 background: $navbar-background;
105 @if(mixin-exists(hook-navbar-container)) {@include hook-navbar-container();}
106}
107
108// Color Mode
109@if ( $navbar-color-mode == light ) { .uk-navbar-container:not(.uk-navbar-transparent) { @extend .uk-light !optional;} }
110@if ( $navbar-color-mode == dark ) { .uk-navbar-container:not(.uk-navbar-transparent) { @extend .uk-dark !optional;} }
111
112/*
113 * Remove pseudo elements created by micro clearfix as precaution (if Container component is used)
114 */
115
116.uk-navbar-container > ::before,
117.uk-navbar-container > ::after { display: none !important; }
118
119
120/* Groups
121 ========================================================================== */
122
123/*
124 * 1. Align navs and items vertically if they have a different height
125 * 2. Note: IE 11 requires an extra `div` which affects the center selector
126 */
127
128.uk-navbar-left,
129.uk-navbar-right,
130// 2. [class*='uk-navbar-center'],
131.uk-navbar-center,
132.uk-navbar-center-left > *,
133.uk-navbar-center-right > * {
134 display: flex;
135 /* 1 */
136 align-items: center;
137}
138
139/*
140 * Horizontal alignment
141 * 1. Create position context for centered navbar with sub groups (left/right)
142 * 2. Fix text wrapping if content is larger than 50% of the container.
143 * 3. Needed for dropdowns because a new position context is created
144 * `z-index` must be smaller than off-canvas
145 * 4. Align sub groups for centered navbar
146 */
147
148.uk-navbar-right { margin-left: auto; }
149
150.uk-navbar-center:only-child {
151 margin-left: auto;
152 margin-right: auto;
153 /* 1 */
154 position: relative;
155}
156
157.uk-navbar-center:not(:only-child) {
158 position: absolute;
159 top: 50%;
160 left: 50%;
161 transform: translate(-50%,-50%);
162 /* 2 */
163 width: max-content;
164 box-sizing: border-box;
165 /* 3 */
166 z-index: $global-z-index - 10;
167}
168
169/* 4 */
170.uk-navbar-center-left,
171.uk-navbar-center-right {
172 position: absolute;
173 top: 0;
174}
175
176.uk-navbar-center-left { right: 100%; }
177.uk-navbar-center-right { left: 100%; }
178
179[class*='uk-navbar-center-'] {
180 width: max-content;
181 box-sizing: border-box;
182}
183
184
185/* Nav
186 ========================================================================== */
187
188/*
189 * 1. Reset list
190 */
191
192.uk-navbar-nav {
193 display: flex;
194 /* 1 */
195 margin: 0;
196 padding: 0;
197 list-style: none;
198}
199
200/*
201 * Allow items to wrap into the next line
202 * Only not `absolute` positioned groups
203 */
204
205.uk-navbar-left,
206.uk-navbar-right,
207.uk-navbar-center:only-child { flex-wrap: wrap; }
208
209/*
210 * Items
211 * 1. Center content vertically and horizontally
212 * 2. Dimensions
213 * 3. Style
214 * 4. Required for `a`
215 */
216
217.uk-navbar-nav > li > a, // Nav item
218.uk-navbar-item, // Content item
219.uk-navbar-toggle { // Clickable item
220 /* 1 */
221 display: flex;
222 justify-content: center;
223 align-items: center;
224 /* 2 */
225 box-sizing: border-box;
226 min-height: $navbar-nav-item-height;
227 padding: 0 $navbar-nav-item-padding-horizontal;
228 /* 3 */
229 font-size: $navbar-nav-item-font-size;
230 font-family: $navbar-nav-item-font-family;
231 /* 4 */
232 text-decoration: none;
233}
234
235/*
236 * Nav items
237 */
238
239.uk-navbar-nav > li > a {
240 color: $navbar-nav-item-color;
241 @if(mixin-exists(hook-navbar-nav-item)) {@include hook-navbar-nav-item();}
242}
243
244/*
245 * Hover
246 * Apply hover style also to focus state and if dropdown is opened
247 */
248
249.uk-navbar-nav > li:hover > a,
250.uk-navbar-nav > li > a:focus,
251.uk-navbar-nav > li > a.uk-open {
252 color: $navbar-nav-item-hover-color;
253 outline: none;
254 @if(mixin-exists(hook-navbar-nav-item-hover)) {@include hook-navbar-nav-item-hover();}
255}
256
257/* OnClick */
258.uk-navbar-nav > li > a:active {
259 color: $navbar-nav-item-onclick-color;
260 @if(mixin-exists(hook-navbar-nav-item-onclick)) {@include hook-navbar-nav-item-onclick();}
261}
262
263/* Active */
264.uk-navbar-nav > li.uk-active > a {
265 color: $navbar-nav-item-active-color;
266 @if(mixin-exists(hook-navbar-nav-item-active)) {@include hook-navbar-nav-item-active();}
267}
268
269
270/* Item
271 ========================================================================== */
272
273.uk-navbar-item {
274 color: $navbar-item-color;
275 @if(mixin-exists(hook-navbar-item)) {@include hook-navbar-item();}
276}
277
278
279/* Toggle
280 ========================================================================== */
281
282.uk-navbar-toggle {
283 color: $navbar-toggle-color;
284 @if(mixin-exists(hook-navbar-toggle)) {@include hook-navbar-toggle();}
285}
286
287.uk-navbar-toggle:hover,
288.uk-navbar-toggle:focus,
289.uk-navbar-toggle.uk-open {
290 color: $navbar-toggle-hover-color;
291 outline: none;
292 text-decoration: none;
293 @if(mixin-exists(hook-navbar-toggle-hover)) {@include hook-navbar-toggle-hover();}
294}
295
296/*
297 * Icon
298 * Adopts `uk-icon`
299 */
300
301.uk-navbar-toggle-icon {
302 @if(mixin-exists(hook-navbar-toggle-icon)) {@include hook-navbar-toggle-icon();}
303}
304
305/* Hover + Focus */
306:hover > .uk-navbar-toggle-icon,
307:focus > .uk-navbar-toggle-icon {
308 @if(mixin-exists(hook-navbar-toggle-icon-hover)) {@include hook-navbar-toggle-icon-hover();}
309}
310
311
312/* Subtitle
313 ========================================================================== */
314
315.uk-navbar-subtitle {
316 font-size: $navbar-subtitle-font-size;
317 @if(mixin-exists(hook-navbar-subtitle)) {@include hook-navbar-subtitle();}
318}
319
320
321/* Style modifiers
322 ========================================================================== */
323
324.uk-navbar-primary {
325 @if(mixin-exists(hook-navbar-primary)) {@include hook-navbar-primary();}
326}
327
328.uk-navbar-transparent {
329 @if(mixin-exists(hook-navbar-transparent)) {@include hook-navbar-transparent();}
330}
331
332.uk-navbar-sticky {
333 @if(mixin-exists(hook-navbar-sticky)) {@include hook-navbar-sticky();}
334}
335
336
337/* Dropdown
338 ========================================================================== */
339
340/*
341 * Adopts `uk-dropdown`
342 * 1. Hide by default
343 * 2. Set position
344 * 3. Set a default width
345 * 4. Style
346 */
347
348.uk-navbar-dropdown {
349 /* 1 */
350 display: none;
351 /* 2 */
352 position: absolute;
353 z-index: $navbar-dropdown-z-index;
354 /* 3 */
355 box-sizing: border-box;
356 width: $navbar-dropdown-width;
357 /* 4 */
358 padding: $navbar-dropdown-padding;
359 background: $navbar-dropdown-background;
360 color: $navbar-dropdown-color;
361 @if(mixin-exists(hook-navbar-dropdown)) {@include hook-navbar-dropdown();}
362}
363
364/* Show */
365.uk-navbar-dropdown.uk-open { display: block; }
366
367/*
368 * Direction / Alignment modifiers
369 */
370
371/* Direction */
372[class*='uk-navbar-dropdown-top'] { margin-top: (-$navbar-dropdown-margin); }
373[class*='uk-navbar-dropdown-bottom'] { margin-top: $navbar-dropdown-margin; }
374[class*='uk-navbar-dropdown-left'] { margin-left: (-$navbar-dropdown-margin); }
375[class*='uk-navbar-dropdown-right'] { margin-left: $navbar-dropdown-margin; }
376
377/*
378 * Grid
379 * Adopts `uk-grid`
380 */
381
382/* Gutter Horizontal */
383.uk-navbar-dropdown-grid { margin-left: (-$navbar-dropdown-grid-gutter-horizontal); }
384.uk-navbar-dropdown-grid > * { padding-left: $navbar-dropdown-grid-gutter-horizontal; }
385
386/* Gutter Vertical */
387.uk-navbar-dropdown-grid > .uk-grid-margin { margin-top: $navbar-dropdown-grid-gutter-vertical; }
388
389/* Stack */
390.uk-navbar-dropdown-stack .uk-navbar-dropdown-grid > * { width: 100% !important; }
391
392/*
393 * Width modifier
394 */
395
396.uk-navbar-dropdown-width-2:not(.uk-navbar-dropdown-stack) { width: ($navbar-dropdown-width * 2); }
397.uk-navbar-dropdown-width-3:not(.uk-navbar-dropdown-stack) { width: ($navbar-dropdown-width * 3); }
398.uk-navbar-dropdown-width-4:not(.uk-navbar-dropdown-stack) { width: ($navbar-dropdown-width * 4); }
399.uk-navbar-dropdown-width-5:not(.uk-navbar-dropdown-stack) { width: ($navbar-dropdown-width * 5); }
400
401/*
402 * Dropbar modifier
403 */
404
405.uk-navbar-dropdown-dropbar {
406 margin-top: $navbar-dropdown-dropbar-margin-top;
407 margin-bottom: $navbar-dropdown-dropbar-margin-bottom;
408 @if(mixin-exists(hook-navbar-dropdown-dropbar)) {@include hook-navbar-dropdown-dropbar();}
409}
410
411
412/* Dropdown Nav
413 * Adopts `uk-nav`
414 ========================================================================== */
415
416.uk-navbar-dropdown-nav {
417 @if(mixin-exists(hook-navbar-dropdown-nav)) {@include hook-navbar-dropdown-nav();}
418}
419
420/*
421 * Items
422 */
423
424.uk-navbar-dropdown-nav > li > a {
425 color: $navbar-dropdown-nav-item-color;
426 @if(mixin-exists(hook-navbar-dropdown-nav-item)) {@include hook-navbar-dropdown-nav-item();}
427}
428
429/* Hover + Focus */
430.uk-navbar-dropdown-nav > li > a:hover,
431.uk-navbar-dropdown-nav > li > a:focus {
432 color: $navbar-dropdown-nav-item-hover-color;
433 @if(mixin-exists(hook-navbar-dropdown-nav-item-hover)) {@include hook-navbar-dropdown-nav-item-hover();}
434}
435
436/* Active */
437.uk-navbar-dropdown-nav > li.uk-active > a {
438 color: $navbar-dropdown-nav-item-active-color;
439 @if(mixin-exists(hook-navbar-dropdown-nav-item-active)) {@include hook-navbar-dropdown-nav-item-active();}
440}
441
442/*
443 * Header
444 */
445
446.uk-navbar-dropdown-nav .uk-nav-header {
447 color: $navbar-dropdown-nav-header-color;
448 @if(mixin-exists(hook-navbar-dropdown-nav-header)) {@include hook-navbar-dropdown-nav-header();}
449}
450
451/*
452 * Divider
453 */
454
455.uk-navbar-dropdown-nav .uk-nav-divider {
456 border-top: $navbar-dropdown-nav-divider-border-width solid $navbar-dropdown-nav-divider-border;
457 @if(mixin-exists(hook-navbar-dropdown-nav-divider)) {@include hook-navbar-dropdown-nav-divider();}
458}
459
460/*
461 * Sublists
462 */
463
464.uk-navbar-dropdown-nav .uk-nav-sub a { color: $navbar-dropdown-nav-sublist-item-color; }
465
466.uk-navbar-dropdown-nav .uk-nav-sub a:hover,
467.uk-navbar-dropdown-nav .uk-nav-sub a:focus { color: $navbar-dropdown-nav-sublist-item-hover-color; }
468
469.uk-navbar-dropdown-nav .uk-nav-sub li.uk-active > a { color: $navbar-dropdown-nav-sublist-item-active-color; }
470
471
472/* Dropbar
473 ========================================================================== */
474
475.uk-navbar-dropbar {
476 background: $navbar-dropbar-background;
477 @if(mixin-exists(hook-navbar-dropbar)) {@include hook-navbar-dropbar();}
478}
479
480/*
481 * Slide modifier
482 */
483
484.uk-navbar-dropbar-slide {
485 position: absolute;
486 z-index: $navbar-dropbar-z-index;
487 left: 0;
488 right: 0;
489 @if(mixin-exists(hook-navbar-dropbar-slide)) {@include hook-navbar-dropbar-slide();}
490}
491
492
493// Hooks
494// ========================================================================
495
496@if(mixin-exists(hook-navbar-misc)) {@include hook-navbar-misc();}
497
498// @mixin hook-navbar(){}
499// @mixin hook-navbar-container(){}
500// @mixin hook-navbar-nav-item(){}
501// @mixin hook-navbar-nav-item-hover(){}
502// @mixin hook-navbar-nav-item-onclick(){}
503// @mixin hook-navbar-nav-item-active(){}
504// @mixin hook-navbar-item(){}
505// @mixin hook-navbar-toggle(){}
506// @mixin hook-navbar-toggle-hover(){}
507// @mixin hook-navbar-toggle-icon(){}
508// @mixin hook-navbar-toggle-icon-hover(){}
509// @mixin hook-navbar-subtitle(){}
510// @mixin hook-navbar-primary(){}
511// @mixin hook-navbar-transparent(){}
512// @mixin hook-navbar-sticky(){}
513// @mixin hook-navbar-dropdown(){}
514// @mixin hook-navbar-dropdown-dropbar(){}
515// @mixin hook-navbar-dropdown-nav(){}
516// @mixin hook-navbar-dropdown-nav-item(){}
517// @mixin hook-navbar-dropdown-nav-item-hover(){}
518// @mixin hook-navbar-dropdown-nav-item-active(){}
519// @mixin hook-navbar-dropdown-nav-header(){}
520// @mixin hook-navbar-dropdown-nav-divider(){}
521// @mixin hook-navbar-dropbar(){}
522// @mixin hook-navbar-dropbar-slide(){}
523// @mixin hook-navbar-misc(){}
524
525
526// Inverse
527// ========================================================================
528
529$inverse-navbar-nav-item-color: $inverse-global-muted-color !default;
530$inverse-navbar-nav-item-hover-color: $inverse-global-color !default;
531$inverse-navbar-nav-item-onclick-color: $inverse-global-emphasis-color !default;
532$inverse-navbar-nav-item-active-color: $inverse-global-emphasis-color !default;
533$inverse-navbar-item-color: $inverse-global-color !default;
534$inverse-navbar-toggle-color: $inverse-global-muted-color !default;
535$inverse-navbar-toggle-hover-color: $inverse-global-color !default;
536
537
538
539// @mixin hook-inverse-navbar-nav-item(){}
540// @mixin hook-inverse-navbar-nav-item-hover(){}
541// @mixin hook-inverse-navbar-nav-item-onclick(){}
542// @mixin hook-inverse-navbar-nav-item-active(){}
543// @mixin hook-inverse-navbar-item(){}
544// @mixin hook-inverse-navbar-toggle(){}
545// @mixin hook-inverse-navbar-toggle-hover(){}