_navbar.scss 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. @mixin navbar-vertical-nav {
  2. .navbar-collapse {
  3. flex-direction: column;
  4. [class^="container"] {
  5. flex-direction: column;
  6. align-items: stretch;
  7. padding: 0;
  8. }
  9. .navbar-nav {
  10. margin-left: 0;
  11. margin-right: 0;
  12. .nav-link {
  13. padding: 0.5rem calc(#{$container-padding-x} / 2);
  14. justify-content: flex-start;
  15. }
  16. }
  17. .dropdown-menu-columns {
  18. flex-direction: column;
  19. }
  20. .dropdown-menu {
  21. padding: 0;
  22. background: transparent;
  23. position: static;
  24. color: inherit;
  25. box-shadow: none;
  26. border: none;
  27. min-width: 0;
  28. margin: 0;
  29. .dropdown-item {
  30. min-width: 0;
  31. display: flex;
  32. width: auto;
  33. padding-left: add(calc(#{$container-padding-x} / 2), 1.75rem);
  34. color: inherit;
  35. &.disabled {
  36. color: var(--#{$prefix}disabled-color);
  37. pointer-events: none;
  38. background-color: transparent;
  39. }
  40. &.active,
  41. &:active {
  42. background: var(--#{$prefix}navbar-active-bg);
  43. }
  44. }
  45. .dropdown-menu .dropdown-item {
  46. padding-left: add(calc(#{$container-padding-x} / 2), 3.25rem);
  47. }
  48. .dropdown-menu .dropdown-menu .dropdown-item {
  49. padding-left: add(calc(#{$container-padding-x} / 2), 4.75rem);
  50. }
  51. }
  52. .dropdown-toggle:after {
  53. margin-left: auto;
  54. }
  55. .nav-item.active:after {
  56. border-bottom-width: 0;
  57. border-left-width: 3px;
  58. right: auto;
  59. top: 0;
  60. bottom: 0;
  61. }
  62. }
  63. }
  64. /**
  65. Navbar
  66. */
  67. .navbar {
  68. --#{$prefix}navbar-bg: var(--#{$prefix}bg-surface);
  69. --#{$prefix}navbar-border-width: #{$navbar-border-width};
  70. --#{$prefix}navbar-active-border-color: #{$navbar-active-border-color};
  71. --#{$prefix}navbar-active-bg: #{$navbar-light-active-bg};
  72. --#{$prefix}navbar-border-color: #{$navbar-border-color};
  73. --#{$prefix}navbar-hover-color: #{$navbar-hover-color};
  74. align-items: stretch;
  75. min-height: $navbar-height;
  76. box-shadow: inset 0 calc(-1 * var(--#{$prefix}navbar-border-width)) 0 0 var(--#{$prefix}navbar-border-color);
  77. background: var(--#{$prefix}navbar-bg);
  78. color: var(--#{$prefix}navbar-color);
  79. .navbar-collapse & {
  80. flex-grow: 1;
  81. }
  82. &.collapsing {
  83. min-height: 0;
  84. }
  85. .dropdown-menu {
  86. position: absolute;
  87. z-index: $zindex-fixed;
  88. }
  89. .navbar-nav {
  90. min-height: subtract($navbar-height, 2 * $navbar-padding-y);
  91. .nav-link {
  92. position: relative;
  93. min-width: 2.5rem;
  94. min-height: 2.5rem;
  95. justify-content: center;
  96. border-radius: var(--#{$prefix}border-radius);
  97. .badge {
  98. position: absolute;
  99. top: 0.375rem;
  100. right: 0.375rem;
  101. transform: translate(50%, -50%);
  102. }
  103. }
  104. }
  105. }
  106. .navbar-expand {
  107. @each $breakpoint in map-keys($grid-breakpoints) {
  108. $next: breakpoint-next($breakpoint, $grid-breakpoints);
  109. $infix: breakpoint-infix($next, $grid-breakpoints);
  110. &#{$infix} {
  111. @include media-breakpoint-down(breakpoint-next($breakpoint)) {
  112. @include navbar-vertical-nav;
  113. }
  114. @include media-breakpoint-up($next) {
  115. .navbar-collapse {
  116. width: auto;
  117. flex: 1 1 auto;
  118. }
  119. .nav-item.active {
  120. position: relative;
  121. .nav-link {
  122. color: var(--#{$prefix}navbar-active-color);
  123. }
  124. &:after {
  125. content: "";
  126. position: absolute;
  127. left: 0;
  128. right: 0;
  129. bottom: -0.25rem;
  130. border: 0 var(--#{$prefix}border-style) var(--#{$prefix}navbar-active-border-color);
  131. border-bottom-width: 2px;
  132. }
  133. }
  134. &.navbar-vertical {
  135. box-shadow: inset calc(-1 * var(--#{$prefix}navbar-border-width)) 0 0 0 var(--#{$prefix}navbar-border-color);
  136. &.navbar-right {
  137. box-shadow: inset calc(1 * var(--#{$prefix}navbar-border-width)) 0 0 0 var(--#{$prefix}navbar-border-color);
  138. }
  139. }
  140. &.navbar-vertical {
  141. ~ .navbar,
  142. ~ .page-wrapper {
  143. margin-left: $sidebar-width;
  144. }
  145. }
  146. &.navbar-vertical.navbar-right {
  147. ~ .navbar,
  148. ~ .page-wrapper {
  149. margin-left: 0;
  150. margin-right: $sidebar-width;
  151. }
  152. }
  153. }
  154. }
  155. }
  156. }
  157. /**
  158. Navbar brand
  159. */
  160. .navbar-brand {
  161. display: inline-flex;
  162. align-items: center;
  163. font-weight: $navbar-brand-font-weight;
  164. margin: 0;
  165. line-height: 1;
  166. gap: $spacer-2;
  167. }
  168. .navbar-brand-image {
  169. height: $navbar-brand-image-height;
  170. width: auto;
  171. }
  172. /**
  173. Navbar toggler
  174. */
  175. .navbar-toggler {
  176. border: 0;
  177. width: $navbar-brand-image-height;
  178. height: $navbar-brand-image-height;
  179. position: relative;
  180. display: flex;
  181. align-items: center;
  182. justify-content: center;
  183. }
  184. .navbar-toggler-icon {
  185. height: 2px;
  186. width: 1.25em;
  187. background: currentColor;
  188. border-radius: 10px;
  189. @include transition(
  190. top $navbar-toggler-animation-time $navbar-toggler-animation-time,
  191. bottom $navbar-toggler-animation-time $navbar-toggler-animation-time,
  192. transform $navbar-toggler-animation-time,
  193. opacity 0s $navbar-toggler-animation-time
  194. );
  195. position: relative;
  196. &:before,
  197. &:after {
  198. content: "";
  199. display: block;
  200. height: inherit;
  201. width: inherit;
  202. border-radius: inherit;
  203. background: inherit;
  204. position: absolute;
  205. left: 0;
  206. @include transition(inherit);
  207. }
  208. &:before {
  209. top: -0.45em;
  210. }
  211. &:after {
  212. bottom: -0.45em;
  213. }
  214. .navbar-toggler[aria-expanded="true"] & {
  215. transform: rotate(45deg);
  216. @include transition(top $transition-time, bottom $transition-time, transform $transition-time $transition-time, opacity 0s $transition-time);
  217. &:before {
  218. top: 0;
  219. transform: rotate(-90deg);
  220. }
  221. &:after {
  222. bottom: 0;
  223. opacity: 0;
  224. }
  225. }
  226. }
  227. /**
  228. Navbar transparent
  229. */
  230. .navbar-transparent {
  231. --#{$prefix}navbar-border-color: transparent !important;
  232. background: transparent !important;
  233. }
  234. /**
  235. Navbar nav
  236. */
  237. .navbar-nav {
  238. --#{$prefix}nav-link-hover-bg: #{color-transparent(var(--#{$prefix}nav-link-color), 0.04)};
  239. margin: 0;
  240. padding: 0;
  241. align-items: stretch;
  242. .nav-item {
  243. display: flex;
  244. flex-direction: column;
  245. justify-content: center;
  246. }
  247. }
  248. /**
  249. Navbar side
  250. */
  251. .navbar-side {
  252. margin: 0;
  253. display: flex;
  254. flex-direction: row;
  255. align-items: center;
  256. justify-content: space-around;
  257. }
  258. /**
  259. Navbar vertical
  260. */
  261. @if $enable-navbar-vertical {
  262. .navbar-vertical {
  263. &.navbar-expand {
  264. @each $breakpoint in map-keys($grid-breakpoints) {
  265. $next: breakpoint-next($breakpoint, $grid-breakpoints);
  266. $infix: breakpoint-infix($next, $grid-breakpoints);
  267. &#{$infix} {
  268. @include media-breakpoint-up($next) {
  269. width: $sidebar-width;
  270. position: fixed;
  271. top: 0;
  272. left: 0;
  273. bottom: 0;
  274. z-index: $zindex-fixed;
  275. align-items: flex-start;
  276. @include transition(transform $transition-time);
  277. overflow-y: scroll;
  278. padding: 0;
  279. &.navbar-right {
  280. left: auto;
  281. right: 0;
  282. }
  283. .navbar-brand {
  284. padding: (($navbar-height - $navbar-brand-image-height) * 0.5) 0;
  285. justify-content: center;
  286. }
  287. .navbar-collapse {
  288. align-items: stretch;
  289. }
  290. .navbar-nav {
  291. flex-direction: column;
  292. flex-grow: 1;
  293. min-height: auto;
  294. .nav-link {
  295. padding-top: 0.5rem;
  296. padding-bottom: 0.5rem;
  297. }
  298. }
  299. > [class^="container"] {
  300. flex-direction: column;
  301. align-items: stretch;
  302. min-height: 100%;
  303. justify-content: flex-start;
  304. padding: 0;
  305. }
  306. ~ .page {
  307. padding-left: $sidebar-width;
  308. [class^="container"] {
  309. padding-left: 1.5rem;
  310. padding-right: 1.5rem;
  311. }
  312. }
  313. &.navbar-right ~ .page {
  314. padding-left: 0;
  315. padding-right: $sidebar-width;
  316. }
  317. @include navbar-vertical-nav;
  318. }
  319. }
  320. }
  321. }
  322. }
  323. }
  324. .navbar-overlap {
  325. &:after {
  326. content: "";
  327. height: $navbar-overlap-height;
  328. position: absolute;
  329. top: 100%;
  330. left: 0;
  331. right: 0;
  332. background: inherit;
  333. z-index: -1;
  334. box-shadow: inherit;
  335. }
  336. }