flipper-ui 0.12.2 → 0.13.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/docs/ui/README.md +21 -3
  3. data/docs/ui/images/configured-ui.png +0 -0
  4. data/docs/ui/images/environment-banner.png +0 -0
  5. data/docs/ui/images/feature.png +0 -0
  6. data/docs/ui/images/features.png +0 -0
  7. data/lib/flipper/ui/assets/javascripts/application.coffee +3 -0
  8. data/lib/flipper/ui/assets/stylesheets/.DS_Store +0 -0
  9. data/lib/flipper/ui/assets/stylesheets/application.scss +9 -48
  10. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss +51 -0
  11. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss +47 -0
  12. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss +38 -0
  13. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss +166 -0
  14. data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +78 -95
  15. data/lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss +270 -0
  16. data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +122 -200
  17. data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +12 -14
  18. data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +15 -28
  19. data/lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss +297 -0
  20. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss +131 -0
  21. data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +210 -455
  22. data/lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss +86 -0
  23. data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +29 -61
  24. data/lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss +42 -0
  25. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss +159 -0
  26. data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +8 -42
  27. data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +64 -73
  28. data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +3 -56
  29. data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +21 -18
  30. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss +168 -0
  31. data/lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss +118 -0
  32. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +203 -554
  33. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +58 -69
  34. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss +183 -0
  35. data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +71 -54
  36. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss +33 -0
  37. data/lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss +482 -0
  38. data/lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss +19 -0
  39. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +109 -163
  40. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +97 -84
  41. data/lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss +36 -0
  42. data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +66 -239
  43. data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +14 -55
  44. data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +726 -698
  45. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss +32 -0
  46. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss +12 -0
  47. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss +42 -0
  48. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss +13 -0
  49. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +14 -4
  50. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss +12 -0
  51. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +25 -8
  52. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +5 -0
  53. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +123 -0
  54. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +89 -32
  55. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss +65 -0
  56. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +3 -18
  57. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss +11 -0
  58. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +115 -66
  59. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +14 -27
  60. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +52 -66
  61. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +37 -107
  62. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss +39 -0
  63. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +18 -15
  64. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +10 -20
  65. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss +7 -0
  66. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +3 -3
  67. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +10 -0
  68. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +10 -11
  69. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss +17 -0
  70. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +1 -1
  71. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +35 -0
  72. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +1 -5
  73. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +16 -14
  74. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +7 -4
  75. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss +9 -0
  76. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/{_text-overflow.scss → _text-truncate.scss} +2 -2
  77. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss +9 -0
  78. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss +7 -0
  79. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss +8 -0
  80. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss +19 -0
  81. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss +59 -0
  82. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss +3 -0
  83. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss +38 -0
  84. data/lib/flipper/ui/assets/stylesheets/bootstrap/{_responsive-embed.scss → utilities/_embed.scss} +26 -9
  85. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss +46 -0
  86. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss +9 -0
  87. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss +36 -0
  88. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +11 -0
  89. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss +12 -0
  90. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss +51 -0
  91. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss +52 -0
  92. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss +11 -0
  93. data/lib/flipper/ui/configuration.rb +24 -0
  94. data/lib/flipper/ui/decorators/feature.rb +3 -3
  95. data/lib/flipper/ui/public/css/application.css +6237 -2339
  96. data/lib/flipper/ui/public/js/application.js +3 -2
  97. data/lib/flipper/ui/views/add_actor.erb +7 -9
  98. data/lib/flipper/ui/views/add_feature.erb +8 -10
  99. data/lib/flipper/ui/views/add_group.erb +7 -9
  100. data/lib/flipper/ui/views/feature.erb +181 -141
  101. data/lib/flipper/ui/views/feature_creation_disabled.erb +1 -1
  102. data/lib/flipper/ui/views/feature_removal_disabled.erb +1 -1
  103. data/lib/flipper/ui/views/features.erb +12 -15
  104. data/lib/flipper/ui/views/layout.erb +25 -15
  105. data/lib/flipper/version.rb +1 -1
  106. data/spec/flipper/ui/actions/actors_gate_spec.rb +2 -1
  107. data/spec/flipper/ui/actions/add_feature_spec.rb +2 -1
  108. data/spec/flipper/ui/actions/groups_gate_spec.rb +2 -1
  109. data/spec/flipper/ui/configuration_spec.rb +27 -0
  110. data/spec/flipper/ui_spec.rb +24 -0
  111. metadata +58 -64
  112. data/lib/flipper/ui/assets/stylesheets/_bootstrap-compass.scss +0 -9
  113. data/lib/flipper/ui/assets/stylesheets/_bootstrap-mincer.scss +0 -19
  114. data/lib/flipper/ui/assets/stylesheets/_bootstrap-sprockets.scss +0 -9
  115. data/lib/flipper/ui/assets/stylesheets/_bootstrap.scss +0 -50
  116. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alerts.scss +0 -73
  117. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badges.scss +0 -68
  118. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumbs.scss +0 -26
  119. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-groups.scss +0 -243
  120. data/lib/flipper/ui/assets/stylesheets/bootstrap/_component-animations.scss +0 -37
  121. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdowns.scss +0 -214
  122. data/lib/flipper/ui/assets/stylesheets/bootstrap/_glyphicons.scss +0 -305
  123. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-groups.scss +0 -166
  124. data/lib/flipper/ui/assets/stylesheets/bootstrap/_labels.scss +0 -66
  125. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modals.scss +0 -150
  126. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navs.scss +0 -242
  127. data/lib/flipper/ui/assets/stylesheets/bootstrap/_normalize.scss +0 -427
  128. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pager.scss +0 -54
  129. data/lib/flipper/ui/assets/stylesheets/bootstrap/_panels.scss +0 -265
  130. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popovers.scss +0 -135
  131. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress-bars.scss +0 -87
  132. data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-utilities.scss +0 -177
  133. data/lib/flipper/ui/assets/stylesheets/bootstrap/_scaffolding.scss +0 -162
  134. data/lib/flipper/ui/assets/stylesheets/bootstrap/_theme.scss +0 -273
  135. data/lib/flipper/ui/assets/stylesheets/bootstrap/_thumbnails.scss +0 -38
  136. data/lib/flipper/ui/assets/stylesheets/bootstrap/_wells.scss +0 -29
  137. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alerts.scss +0 -14
  138. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_center-block.scss +0 -7
  139. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hide-text.scss +0 -21
  140. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_labels.scss +0 -12
  141. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +0 -9
  142. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_opacity.scss +0 -8
  143. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_panels.scss +0 -24
  144. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +0 -10
  145. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +0 -8
  146. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +0 -21
  147. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +0 -9
  148. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +0 -222
  149. data/lib/flipper/ui/public/css/primer.css +0 -1
  150. data/lib/flipper/ui/public/css/primer/primer.css +0 -1933
  151. data/lib/flipper/ui/public/css/scss/primer.css +0 -1933
  152. data/lib/flipper/ui/public/js/bootstrap-sprockets.js +0 -12
  153. data/lib/flipper/ui/public/js/bootstrap.js +0 -2317
  154. data/lib/flipper/ui/public/js/bootstrap.min.js +0 -7
  155. data/lib/flipper/ui/public/js/bootstrap/affix.js +0 -162
  156. data/lib/flipper/ui/public/js/bootstrap/alert.js +0 -94
  157. data/lib/flipper/ui/public/js/bootstrap/button.js +0 -116
  158. data/lib/flipper/ui/public/js/bootstrap/carousel.js +0 -237
  159. data/lib/flipper/ui/public/js/bootstrap/collapse.js +0 -211
  160. data/lib/flipper/ui/public/js/bootstrap/dropdown.js +0 -161
  161. data/lib/flipper/ui/public/js/bootstrap/modal.js +0 -339
  162. data/lib/flipper/ui/public/js/bootstrap/popover.js +0 -108
  163. data/lib/flipper/ui/public/js/bootstrap/scrollspy.js +0 -172
  164. data/lib/flipper/ui/public/js/bootstrap/tab.js +0 -153
  165. data/lib/flipper/ui/public/js/bootstrap/tooltip.js +0 -476
  166. data/lib/flipper/ui/public/js/bootstrap/transition.js +0 -59
@@ -0,0 +1,118 @@
1
+ // Base class
2
+ //
3
+ // Kickstart any navigation component with a set of style resets. Works with
4
+ // `<nav>`s or `<ul>`s.
5
+
6
+ .nav {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ padding-left: 0;
10
+ margin-bottom: 0;
11
+ list-style: none;
12
+ }
13
+
14
+ .nav-link {
15
+ display: block;
16
+ padding: $nav-link-padding-y $nav-link-padding-x;
17
+
18
+ @include hover-focus {
19
+ text-decoration: none;
20
+ }
21
+
22
+ // Disabled state lightens text
23
+ &.disabled {
24
+ color: $nav-link-disabled-color;
25
+ }
26
+ }
27
+
28
+ //
29
+ // Tabs
30
+ //
31
+
32
+ .nav-tabs {
33
+ border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
34
+
35
+ .nav-item {
36
+ margin-bottom: -$nav-tabs-border-width;
37
+ }
38
+
39
+ .nav-link {
40
+ border: $nav-tabs-border-width solid transparent;
41
+ @include border-top-radius($nav-tabs-border-radius);
42
+
43
+ @include hover-focus {
44
+ border-color: $nav-tabs-link-hover-border-color;
45
+ }
46
+
47
+ &.disabled {
48
+ color: $nav-link-disabled-color;
49
+ background-color: transparent;
50
+ border-color: transparent;
51
+ }
52
+ }
53
+
54
+ .nav-link.active,
55
+ .nav-item.show .nav-link {
56
+ color: $nav-tabs-link-active-color;
57
+ background-color: $nav-tabs-link-active-bg;
58
+ border-color: $nav-tabs-link-active-border-color;
59
+ }
60
+
61
+ .dropdown-menu {
62
+ // Make dropdown border overlap tab border
63
+ margin-top: -$nav-tabs-border-width;
64
+ // Remove the top rounded corners here since there is a hard edge above the menu
65
+ @include border-top-radius(0);
66
+ }
67
+ }
68
+
69
+
70
+ //
71
+ // Pills
72
+ //
73
+
74
+ .nav-pills {
75
+ .nav-link {
76
+ @include border-radius($nav-pills-border-radius);
77
+ }
78
+
79
+ .nav-link.active,
80
+ .show > .nav-link {
81
+ color: $nav-pills-link-active-color;
82
+ background-color: $nav-pills-link-active-bg;
83
+ }
84
+ }
85
+
86
+
87
+ //
88
+ // Justified variants
89
+ //
90
+
91
+ .nav-fill {
92
+ .nav-item {
93
+ flex: 1 1 auto;
94
+ text-align: center;
95
+ }
96
+ }
97
+
98
+ .nav-justified {
99
+ .nav-item {
100
+ flex-basis: 0;
101
+ flex-grow: 1;
102
+ text-align: center;
103
+ }
104
+ }
105
+
106
+
107
+ // Tabbable tabs
108
+ //
109
+ // Hide tabbable panes to start, show them when `.active`
110
+
111
+ .tab-content {
112
+ > .tab-pane {
113
+ display: none;
114
+ }
115
+ > .active {
116
+ display: block;
117
+ }
118
+ }
@@ -1,661 +1,310 @@
1
+ // Contents
1
2
  //
2
- // Navbars
3
- // --------------------------------------------------
3
+ // Navbar
4
+ // Navbar brand
5
+ // Navbar nav
6
+ // Navbar text
7
+ // Navbar divider
8
+ // Responsive navbar
9
+ // Navbar position
10
+ // Navbar themes
4
11
 
5
12
 
6
- // Wrapper and base class
13
+ // Navbar
7
14
  //
8
15
  // Provide a static navbar from which we expand to create full-width, fixed, and
9
16
  // other navbar variations.
10
17
 
11
18
  .navbar {
12
19
  position: relative;
13
- min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
14
- margin-bottom: $navbar-margin-bottom;
15
- border: 1px solid transparent;
16
-
17
- // Prevent floats from breaking the navbar
18
- @include clearfix;
19
-
20
- @media (min-width: $grid-float-breakpoint) {
21
- border-radius: $navbar-border-radius;
20
+ display: flex;
21
+ flex-wrap: wrap; // allow us to do the line break for collapsing content
22
+ align-items: center;
23
+ justify-content: space-between; // space out brand from logo
24
+ padding: $navbar-padding-y $navbar-padding-x;
25
+
26
+ // Because flex properties aren't inherited, we need to redeclare these first
27
+ // few properities so that content nested within behave properly.
28
+ > .container,
29
+ > .container-fluid {
30
+ display: flex;
31
+ flex-wrap: wrap;
32
+ align-items: center;
33
+ justify-content: space-between;
22
34
  }
23
35
  }
24
36
 
25
37
 
26
- // Navbar heading
38
+ // Navbar brand
27
39
  //
28
- // Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
29
- // styling of responsive aspects.
30
-
31
- .navbar-header {
32
- @include clearfix;
40
+ // Used for brand, project, or site names.
33
41
 
34
- @media (min-width: $grid-float-breakpoint) {
35
- float: left;
42
+ .navbar-brand {
43
+ display: inline-block;
44
+ padding-top: $navbar-brand-padding-y;
45
+ padding-bottom: $navbar-brand-padding-y;
46
+ margin-right: $navbar-padding-x;
47
+ font-size: $navbar-brand-font-size;
48
+ line-height: inherit;
49
+ white-space: nowrap;
50
+
51
+ @include hover-focus {
52
+ text-decoration: none;
36
53
  }
37
54
  }
38
55
 
39
56
 
40
- // Navbar collapse (body)
41
- //
42
- // Group your navbar content into this for easy collapsing and expanding across
43
- // various device sizes. By default, this content is collapsed when <768px, but
44
- // will expand past that for a horizontal display.
57
+ // Navbar nav
45
58
  //
46
- // To start (on mobile devices) the navbar links, forms, and buttons are stacked
47
- // vertically and include a `max-height` to overflow in case you have too much
48
- // content for the user's viewport.
59
+ // Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
49
60
 
50
- .navbar-collapse {
51
- overflow-x: visible;
52
- padding-right: $navbar-padding-horizontal;
53
- padding-left: $navbar-padding-horizontal;
54
- border-top: 1px solid transparent;
55
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
56
- @include clearfix;
57
- -webkit-overflow-scrolling: touch;
58
-
59
- &.in {
60
- overflow-y: auto;
61
- }
62
-
63
- @media (min-width: $grid-float-breakpoint) {
64
- width: auto;
65
- border-top: 0;
66
- box-shadow: none;
67
-
68
- &.collapse {
69
- display: block !important;
70
- height: auto !important;
71
- padding-bottom: 0; // Override default setting
72
- overflow: visible !important;
73
- }
74
-
75
- &.in {
76
- overflow-y: visible;
77
- }
61
+ .navbar-nav {
62
+ display: flex;
63
+ flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
64
+ padding-left: 0;
65
+ margin-bottom: 0;
66
+ list-style: none;
78
67
 
79
- // Undo the collapse side padding for navbars with containers to ensure
80
- // alignment of right-aligned contents.
81
- .navbar-fixed-top &,
82
- .navbar-static-top &,
83
- .navbar-fixed-bottom & {
84
- padding-left: 0;
85
- padding-right: 0;
86
- }
68
+ .nav-link {
69
+ padding-right: 0;
70
+ padding-left: 0;
87
71
  }
88
- }
89
-
90
- .navbar-fixed-top,
91
- .navbar-fixed-bottom {
92
- .navbar-collapse {
93
- max-height: $navbar-collapse-max-height;
94
72
 
95
- @media (max-device-width: $screen-xs-min) and (orientation: landscape) {
96
- max-height: 200px;
97
- }
73
+ .dropdown-menu {
74
+ position: static;
75
+ float: none;
98
76
  }
99
77
  }
100
78
 
101
79
 
102
- // Both navbar header and collapse
80
+ // Navbar text
103
81
  //
104
- // When a container is present, change the behavior of the header and collapse.
105
-
106
- .container,
107
- .container-fluid {
108
- > .navbar-header,
109
- > .navbar-collapse {
110
- margin-right: -$navbar-padding-horizontal;
111
- margin-left: -$navbar-padding-horizontal;
112
-
113
- @media (min-width: $grid-float-breakpoint) {
114
- margin-right: 0;
115
- margin-left: 0;
116
- }
117
- }
82
+ //
83
+
84
+ .navbar-text {
85
+ display: inline-block;
86
+ padding-top: $nav-link-padding-y;
87
+ padding-bottom: $nav-link-padding-y;
118
88
  }
119
89
 
120
90
 
91
+ // Responsive navbar
121
92
  //
122
- // Navbar alignment options
123
- //
124
- // Display the navbar across the entirety of the page or fixed it to the top or
125
- // bottom of the page.
126
-
127
- // Static top (unfixed, but 100% wide) navbar
128
- .navbar-static-top {
129
- z-index: $zindex-navbar;
130
- border-width: 0 0 1px;
93
+ // Custom styles for responsive collapsing and toggling of navbar contents.
94
+ // Powered by the collapse Bootstrap JavaScript plugin.
131
95
 
132
- @media (min-width: $grid-float-breakpoint) {
133
- border-radius: 0;
134
- }
135
- }
136
-
137
- // Fix the top/bottom navbars when screen real estate supports it
138
- .navbar-fixed-top,
139
- .navbar-fixed-bottom {
140
- position: fixed;
141
- right: 0;
142
- left: 0;
143
- z-index: $zindex-navbar-fixed;
144
-
145
- // Undo the rounded corners
146
- @media (min-width: $grid-float-breakpoint) {
147
- border-radius: 0;
148
- }
149
- }
150
- .navbar-fixed-top {
151
- top: 0;
152
- border-width: 0 0 1px;
153
- }
154
- .navbar-fixed-bottom {
155
- bottom: 0;
156
- margin-bottom: 0; // override .navbar defaults
157
- border-width: 1px 0 0;
96
+ // When collapsed, prevent the toggleable navbar contents from appearing in
97
+ // the default flexbox row orienation. Requires the use of `flex-wrap: wrap`
98
+ // on the `.navbar` parent.
99
+ .navbar-collapse {
100
+ flex-basis: 100%;
101
+ flex-grow: 1;
102
+ // For always expanded or extra full navbars, ensure content aligns itself
103
+ // properly vertically. Can be easily overridden with flex utilities.
104
+ align-items: center;
158
105
  }
159
106
 
107
+ // Button for toggling the navbar when in its collapsed state
108
+ .navbar-toggler {
109
+ padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
110
+ font-size: $navbar-toggler-font-size;
111
+ line-height: 1;
112
+ background-color: transparent; // remove default button style
113
+ border: $border-width solid transparent; // remove default button style
114
+ @include border-radius($navbar-toggler-border-radius);
160
115
 
161
- // Brand/project name
162
-
163
- .navbar-brand {
164
- float: left;
165
- padding: $navbar-padding-vertical $navbar-padding-horizontal;
166
- font-size: $font-size-large;
167
- line-height: $line-height-computed;
168
- height: $navbar-height;
169
-
170
- &:hover,
171
- &:focus {
116
+ @include hover-focus {
172
117
  text-decoration: none;
173
118
  }
174
119
 
175
- > img {
176
- display: block;
177
- }
178
-
179
- @media (min-width: $grid-float-breakpoint) {
180
- .navbar > .container &,
181
- .navbar > .container-fluid & {
182
- margin-left: -$navbar-padding-horizontal;
183
- }
120
+ // Opinionated: add "hand" cursor to non-disabled .navbar-toggler elements
121
+ &:not(:disabled):not(.disabled) {
122
+ cursor: pointer;
184
123
  }
185
124
  }
186
125
 
187
-
188
- // Navbar toggle
189
- //
190
- // Custom button for toggling the `.navbar-collapse`, powered by the collapse
191
- // JavaScript plugin.
192
-
193
- .navbar-toggle {
194
- position: relative;
195
- float: right;
196
- margin-right: $navbar-padding-horizontal;
197
- padding: 9px 10px;
198
- @include navbar-vertical-align(34px);
199
- background-color: transparent;
200
- background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
201
- border: 1px solid transparent;
202
- border-radius: $border-radius-base;
203
-
204
- // We remove the `outline` here, but later compensate by attaching `:hover`
205
- // styles to `:focus`.
206
- &:focus {
207
- outline: 0;
208
- }
209
-
210
- // Bars
211
- .icon-bar {
212
- display: block;
213
- width: 22px;
214
- height: 2px;
215
- border-radius: 1px;
216
- }
217
- .icon-bar + .icon-bar {
218
- margin-top: 4px;
219
- }
220
-
221
- @media (min-width: $grid-float-breakpoint) {
222
- display: none;
223
- }
126
+ // Keep as a separate element so folks can easily override it with another icon
127
+ // or image file as needed.
128
+ .navbar-toggler-icon {
129
+ display: inline-block;
130
+ width: 1.5em;
131
+ height: 1.5em;
132
+ vertical-align: middle;
133
+ content: "";
134
+ background: no-repeat center center;
135
+ background-size: 100% 100%;
224
136
  }
225
137
 
226
-
227
- // Navbar nav links
228
- //
229
- // Builds on top of the `.nav` components with its own modifier class to make
230
- // the nav the full height of the horizontal nav (above 768px).
231
-
232
- .navbar-nav {
233
- margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
234
-
235
- > li > a {
236
- padding-top: 10px;
237
- padding-bottom: 10px;
238
- line-height: $line-height-computed;
239
- }
240
-
241
- @media (max-width: $grid-float-breakpoint-max) {
242
- // Dropdowns get custom display when collapsed
243
- .open .dropdown-menu {
244
- position: static;
245
- float: none;
246
- width: auto;
247
- margin-top: 0;
248
- background-color: transparent;
249
- border: 0;
250
- box-shadow: none;
251
- > li > a,
252
- .dropdown-header {
253
- padding: 5px 15px 5px 25px;
254
- }
255
- > li > a {
256
- line-height: $line-height-computed;
257
- &:hover,
258
- &:focus {
259
- background-image: none;
138
+ // Generate series of `.navbar-expand-*` responsive classes for configuring
139
+ // where your navbar collapses.
140
+ .navbar-expand {
141
+ @each $breakpoint in map-keys($grid-breakpoints) {
142
+ $next: breakpoint-next($breakpoint, $grid-breakpoints);
143
+ $infix: breakpoint-infix($next, $grid-breakpoints);
144
+
145
+ &#{$infix} {
146
+ @include media-breakpoint-down($breakpoint) {
147
+ > .container,
148
+ > .container-fluid {
149
+ padding-right: 0;
150
+ padding-left: 0;
260
151
  }
261
152
  }
262
- }
263
- }
264
-
265
- // Uncollapse the nav
266
- @media (min-width: $grid-float-breakpoint) {
267
- float: left;
268
- margin: 0;
269
-
270
- > li {
271
- float: left;
272
- > a {
273
- padding-top: $navbar-padding-vertical;
274
- padding-bottom: $navbar-padding-vertical;
275
- }
276
- }
277
- }
278
- }
279
-
280
-
281
- // Navbar form
282
- //
283
- // Extension of the `.form-inline` with some extra flavor for optimum display in
284
- // our navbars.
285
-
286
- .navbar-form {
287
- margin-left: -$navbar-padding-horizontal;
288
- margin-right: -$navbar-padding-horizontal;
289
- padding: 10px $navbar-padding-horizontal;
290
- border-top: 1px solid transparent;
291
- border-bottom: 1px solid transparent;
292
- $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
293
- @include box-shadow($shadow);
294
-
295
- // Mixin behavior for optimum display
296
- @include form-inline;
297
-
298
- .form-group {
299
- @media (max-width: $grid-float-breakpoint-max) {
300
- margin-bottom: 5px;
301
-
302
- &:last-child {
303
- margin-bottom: 0;
304
- }
305
- }
306
- }
307
-
308
- // Vertically center in expanded, horizontal navbar
309
- @include navbar-vertical-align($input-height-base);
310
-
311
- // Undo 100% width for pull classes
312
- @media (min-width: $grid-float-breakpoint) {
313
- width: auto;
314
- border: 0;
315
- margin-left: 0;
316
- margin-right: 0;
317
- padding-top: 0;
318
- padding-bottom: 0;
319
- @include box-shadow(none);
320
- }
321
- }
322
-
323
-
324
- // Dropdown menus
325
-
326
- // Menu position and menu carets
327
- .navbar-nav > li > .dropdown-menu {
328
- margin-top: 0;
329
- @include border-top-radius(0);
330
- }
331
- // Menu position and menu caret support for dropups via extra dropup class
332
- .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
333
- margin-bottom: 0;
334
- @include border-top-radius($navbar-border-radius);
335
- @include border-bottom-radius(0);
336
- }
337
-
338
-
339
- // Buttons in navbars
340
- //
341
- // Vertically center a button within a navbar (when *not* in a form).
342
153
 
343
- .navbar-btn {
344
- @include navbar-vertical-align($input-height-base);
154
+ @include media-breakpoint-up($next) {
155
+ flex-flow: row nowrap;
156
+ justify-content: flex-start;
345
157
 
346
- &.btn-sm {
347
- @include navbar-vertical-align($input-height-small);
348
- }
349
- &.btn-xs {
350
- @include navbar-vertical-align(22);
351
- }
352
- }
158
+ .navbar-nav {
159
+ flex-direction: row;
353
160
 
161
+ .dropdown-menu {
162
+ position: absolute;
163
+ }
354
164
 
355
- // Text in navbars
356
- //
357
- // Add a class to make any element properly align itself vertically within the navbars.
165
+ .dropdown-menu-right {
166
+ right: 0;
167
+ left: auto; // Reset the default from `.dropdown-menu`
168
+ }
358
169
 
359
- .navbar-text {
360
- @include navbar-vertical-align($line-height-computed);
170
+ .nav-link {
171
+ padding-right: $navbar-nav-link-padding-x;
172
+ padding-left: $navbar-nav-link-padding-x;
173
+ }
174
+ }
361
175
 
362
- @media (min-width: $grid-float-breakpoint) {
363
- float: left;
364
- margin-left: $navbar-padding-horizontal;
365
- margin-right: $navbar-padding-horizontal;
366
- }
367
- }
176
+ // For nesting containers, have to redeclare for alignment purposes
177
+ > .container,
178
+ > .container-fluid {
179
+ flex-wrap: nowrap;
180
+ }
368
181
 
182
+ .navbar-collapse {
183
+ display: flex !important; // stylelint-disable-line declaration-no-important
369
184
 
370
- // Component alignment
371
- //
372
- // Repurpose the pull utilities as their own navbar utilities to avoid specificity
373
- // issues with parents and chaining. Only do this when the navbar is uncollapsed
374
- // though so that navbar contents properly stack and align in mobile.
375
- //
376
- // Declared after the navbar components to ensure more specificity on the margins.
185
+ // Changes flex-bases to auto because of an IE10 bug
186
+ flex-basis: auto;
187
+ }
377
188
 
378
- @media (min-width: $grid-float-breakpoint) {
379
- .navbar-left {
380
- float: left !important;
381
- }
382
- .navbar-right {
383
- float: right !important;
384
- margin-right: -$navbar-padding-horizontal;
189
+ .navbar-toggler {
190
+ display: none;
191
+ }
385
192
 
386
- ~ .navbar-right {
387
- margin-right: 0;
193
+ .dropup {
194
+ .dropdown-menu {
195
+ top: auto;
196
+ bottom: 100%;
197
+ }
198
+ }
199
+ }
388
200
  }
389
201
  }
390
202
  }
391
203
 
392
204
 
393
- // Alternate navbars
394
- // --------------------------------------------------
395
-
396
- // Default navbar
397
- .navbar-default {
398
- background-color: $navbar-default-bg;
399
- border-color: $navbar-default-border;
205
+ // Navbar themes
206
+ //
207
+ // Styles for switching between navbars with light or dark background.
400
208
 
209
+ // Dark links against a light background
210
+ .navbar-light {
401
211
  .navbar-brand {
402
- color: $navbar-default-brand-color;
403
- &:hover,
404
- &:focus {
405
- color: $navbar-default-brand-hover-color;
406
- background-color: $navbar-default-brand-hover-bg;
407
- }
408
- }
212
+ color: $navbar-light-active-color;
409
213
 
410
- .navbar-text {
411
- color: $navbar-default-color;
214
+ @include hover-focus {
215
+ color: $navbar-light-active-color;
216
+ }
412
217
  }
413
218
 
414
219
  .navbar-nav {
415
- > li > a {
416
- color: $navbar-default-link-color;
220
+ .nav-link {
221
+ color: $navbar-light-color;
417
222
 
418
- &:hover,
419
- &:focus {
420
- color: $navbar-default-link-hover-color;
421
- background-color: $navbar-default-link-hover-bg;
422
- }
423
- }
424
- > .active > a {
425
- &,
426
- &:hover,
427
- &:focus {
428
- color: $navbar-default-link-active-color;
429
- background-color: $navbar-default-link-active-bg;
223
+ @include hover-focus {
224
+ color: $navbar-light-hover-color;
430
225
  }
431
- }
432
- > .disabled > a {
433
- &,
434
- &:hover,
435
- &:focus {
436
- color: $navbar-default-link-disabled-color;
437
- background-color: $navbar-default-link-disabled-bg;
226
+
227
+ &.disabled {
228
+ color: $navbar-light-disabled-color;
438
229
  }
439
230
  }
440
- }
441
231
 
442
- .navbar-toggle {
443
- border-color: $navbar-default-toggle-border-color;
444
- &:hover,
445
- &:focus {
446
- background-color: $navbar-default-toggle-hover-bg;
447
- }
448
- .icon-bar {
449
- background-color: $navbar-default-toggle-icon-bar-bg;
232
+ .show > .nav-link,
233
+ .active > .nav-link,
234
+ .nav-link.show,
235
+ .nav-link.active {
236
+ color: $navbar-light-active-color;
450
237
  }
451
238
  }
452
239
 
453
- .navbar-collapse,
454
- .navbar-form {
455
- border-color: $navbar-default-border;
240
+ .navbar-toggler {
241
+ color: $navbar-light-color;
242
+ border-color: $navbar-light-toggler-border-color;
456
243
  }
457
244
 
458
- // Dropdown menu items
459
- .navbar-nav {
460
- // Remove background color from open dropdown
461
- > .open > a {
462
- &,
463
- &:hover,
464
- &:focus {
465
- background-color: $navbar-default-link-active-bg;
466
- color: $navbar-default-link-active-color;
467
- }
468
- }
469
-
470
- @media (max-width: $grid-float-breakpoint-max) {
471
- // Dropdowns get custom display when collapsed
472
- .open .dropdown-menu {
473
- > li > a {
474
- color: $navbar-default-link-color;
475
- &:hover,
476
- &:focus {
477
- color: $navbar-default-link-hover-color;
478
- background-color: $navbar-default-link-hover-bg;
479
- }
480
- }
481
- > .active > a {
482
- &,
483
- &:hover,
484
- &:focus {
485
- color: $navbar-default-link-active-color;
486
- background-color: $navbar-default-link-active-bg;
487
- }
488
- }
489
- > .disabled > a {
490
- &,
491
- &:hover,
492
- &:focus {
493
- color: $navbar-default-link-disabled-color;
494
- background-color: $navbar-default-link-disabled-bg;
495
- }
496
- }
497
- }
498
- }
245
+ .navbar-toggler-icon {
246
+ background-image: $navbar-light-toggler-icon-bg;
499
247
  }
500
248
 
249
+ .navbar-text {
250
+ color: $navbar-light-color;
251
+ a {
252
+ color: $navbar-light-active-color;
501
253
 
502
- // Links in navbars
503
- //
504
- // Add a class to ensure links outside the navbar nav are colored correctly.
505
-
506
- .navbar-link {
507
- color: $navbar-default-link-color;
508
- &:hover {
509
- color: $navbar-default-link-hover-color;
510
- }
511
- }
512
-
513
- .btn-link {
514
- color: $navbar-default-link-color;
515
- &:hover,
516
- &:focus {
517
- color: $navbar-default-link-hover-color;
518
- }
519
- &[disabled],
520
- fieldset[disabled] & {
521
- &:hover,
522
- &:focus {
523
- color: $navbar-default-link-disabled-color;
254
+ @include hover-focus {
255
+ color: $navbar-light-active-color;
524
256
  }
525
257
  }
526
258
  }
527
259
  }
528
260
 
529
- // Inverse navbar
530
-
531
- .navbar-inverse {
532
- background-color: $navbar-inverse-bg;
533
- border-color: $navbar-inverse-border;
534
-
261
+ // White links against a dark background
262
+ .navbar-dark {
535
263
  .navbar-brand {
536
- color: $navbar-inverse-brand-color;
537
- &:hover,
538
- &:focus {
539
- color: $navbar-inverse-brand-hover-color;
540
- background-color: $navbar-inverse-brand-hover-bg;
541
- }
542
- }
264
+ color: $navbar-dark-active-color;
543
265
 
544
- .navbar-text {
545
- color: $navbar-inverse-color;
266
+ @include hover-focus {
267
+ color: $navbar-dark-active-color;
268
+ }
546
269
  }
547
270
 
548
271
  .navbar-nav {
549
- > li > a {
550
- color: $navbar-inverse-link-color;
272
+ .nav-link {
273
+ color: $navbar-dark-color;
551
274
 
552
- &:hover,
553
- &:focus {
554
- color: $navbar-inverse-link-hover-color;
555
- background-color: $navbar-inverse-link-hover-bg;
556
- }
557
- }
558
- > .active > a {
559
- &,
560
- &:hover,
561
- &:focus {
562
- color: $navbar-inverse-link-active-color;
563
- background-color: $navbar-inverse-link-active-bg;
275
+ @include hover-focus {
276
+ color: $navbar-dark-hover-color;
564
277
  }
565
- }
566
- > .disabled > a {
567
- &,
568
- &:hover,
569
- &:focus {
570
- color: $navbar-inverse-link-disabled-color;
571
- background-color: $navbar-inverse-link-disabled-bg;
278
+
279
+ &.disabled {
280
+ color: $navbar-dark-disabled-color;
572
281
  }
573
282
  }
574
- }
575
283
 
576
- // Darken the responsive nav toggle
577
- .navbar-toggle {
578
- border-color: $navbar-inverse-toggle-border-color;
579
- &:hover,
580
- &:focus {
581
- background-color: $navbar-inverse-toggle-hover-bg;
582
- }
583
- .icon-bar {
584
- background-color: $navbar-inverse-toggle-icon-bar-bg;
284
+ .show > .nav-link,
285
+ .active > .nav-link,
286
+ .nav-link.show,
287
+ .nav-link.active {
288
+ color: $navbar-dark-active-color;
585
289
  }
586
290
  }
587
291
 
588
- .navbar-collapse,
589
- .navbar-form {
590
- border-color: darken($navbar-inverse-bg, 7%);
292
+ .navbar-toggler {
293
+ color: $navbar-dark-color;
294
+ border-color: $navbar-dark-toggler-border-color;
591
295
  }
592
296
 
593
- // Dropdowns
594
- .navbar-nav {
595
- > .open > a {
596
- &,
597
- &:hover,
598
- &:focus {
599
- background-color: $navbar-inverse-link-active-bg;
600
- color: $navbar-inverse-link-active-color;
601
- }
602
- }
603
-
604
- @media (max-width: $grid-float-breakpoint-max) {
605
- // Dropdowns get custom display
606
- .open .dropdown-menu {
607
- > .dropdown-header {
608
- border-color: $navbar-inverse-border;
609
- }
610
- .divider {
611
- background-color: $navbar-inverse-border;
612
- }
613
- > li > a {
614
- color: $navbar-inverse-link-color;
615
- &:hover,
616
- &:focus {
617
- color: $navbar-inverse-link-hover-color;
618
- background-color: $navbar-inverse-link-hover-bg;
619
- }
620
- }
621
- > .active > a {
622
- &,
623
- &:hover,
624
- &:focus {
625
- color: $navbar-inverse-link-active-color;
626
- background-color: $navbar-inverse-link-active-bg;
627
- }
628
- }
629
- > .disabled > a {
630
- &,
631
- &:hover,
632
- &:focus {
633
- color: $navbar-inverse-link-disabled-color;
634
- background-color: $navbar-inverse-link-disabled-bg;
635
- }
636
- }
637
- }
638
- }
297
+ .navbar-toggler-icon {
298
+ background-image: $navbar-dark-toggler-icon-bg;
639
299
  }
640
300
 
641
- .navbar-link {
642
- color: $navbar-inverse-link-color;
643
- &:hover {
644
- color: $navbar-inverse-link-hover-color;
645
- }
646
- }
301
+ .navbar-text {
302
+ color: $navbar-dark-color;
303
+ a {
304
+ color: $navbar-dark-active-color;
647
305
 
648
- .btn-link {
649
- color: $navbar-inverse-link-color;
650
- &:hover,
651
- &:focus {
652
- color: $navbar-inverse-link-hover-color;
653
- }
654
- &[disabled],
655
- fieldset[disabled] & {
656
- &:hover,
657
- &:focus {
658
- color: $navbar-inverse-link-disabled-color;
306
+ @include hover-focus {
307
+ color: $navbar-dark-active-color;
659
308
  }
660
309
  }
661
310
  }