@atlassian/aui
Version:
Atlassian User Interface library
434 lines (368 loc) • 11.9 kB
text/less
@import (reference) './imports/global';
@import (reference) './imports/mixins/focus';
/*! AUI Navigation */
/* Nav defaults - put very little here!
-------------------- */
.aui-nav,
.aui-nav > li {
list-style: none;
margin: 0;
padding: 0;
}
/* Horizontal, breadcrumbs and pagination are all horizontal */
.aui-nav-breadcrumbs:after,
.aui-nav-pagination:after,
.aui-nav-horizontal:after,
.aui-navgroup-horizontal .aui-nav:after,
.aui-navgroup-horizontal .aui-navgroup-inner:after {
clear: both;
content: " ";
display: table;
}
.aui-nav-breadcrumbs > li,
.aui-nav-pagination > li {
float: left;
& > a:focus {
#aui.with-focus-ring();
border-radius: 2px;
}
}
/* Navigation headings
-------------------- */
.aui-nav-heading {
#aui.typography.h100(@aui-nav-heading-text-color);
line-height: unit(20 / @aui-nav-heading-text-font-size);
padding: 0 @aui-nav-link-spacing-horizontal; // to match the nav-item layout.
& > strong {
font-size: inherit;
font-weight: inherit;
line-height: inherit;
}
}
/* Breadcrumb navigation
-------------------- */
.aui-nav-breadcrumbs > li {
padding: 0 @aui-grid 0 0;
}
.aui-nav-breadcrumbs > li + li:before {
color: var(--aui-border-strong);
content: "/";
padding-right: @aui-grid;
}
/* Pagination
-------------------- */
.aui-nav-pagination {
margin: @aui-grid 0 0 0;
}
.aui-nav-pagination > li {
padding: 0;
}
/* Need padding on the A elements for big click areas.
Set equal left/right to help align the inline dialog on truncation. */
.aui-nav-pagination > li > a {
padding: @aui-grid @aui-grid 0 @aui-grid;
}
/* Don't set top/bottom as that throws non-linked items out of whack. */
.aui-nav-pagination > li.aui-nav-selected,
.aui-nav-pagination > li.aui-nav-truncation {
padding-left: @aui-grid;
padding-right: @aui-grid;
}
.aui-nav-pagination .aui-nav-truncation > a {
padding-left: 0;
padding-right: 0;
}
/* Remove whitespace from first and last child */
.aui-nav-pagination > li:first-child > a,
.aui-nav-pagination > li.aui-nav-truncation:first-child,
.aui-nav-pagination > li.aui-nav-selected:first-child {
padding-left: 0;
}
.aui-nav-pagination > li:last-child > a,
.aui-nav-pagination > li.aui-nav-truncation:last-child,
.aui-nav-pagination > li.aui-nav-selected:last-child {
padding-right: 0;
}
.aui-nav-pagination a[aria-disabled="true"],
.aui-nav-pagination a[aria-disabled="true"]:link,
.aui-nav-pagination a[aria-disabled="true"]:visited,
.aui-nav-pagination a[aria-disabled="true"]:focus,
.aui-nav-pagination a[aria-disabled="true"]:hover,
.aui-nav-pagination a[aria-disabled="true"]:active {
color: @aui-nav-pagination-active-text-color;
text-decoration: none;
}
.aui-nav-pagination > li.aui-nav-selected {
color: @aui-nav-pagination-text-color;
font-weight: @aui-font-weight-semibold;
}
/* Vertical Navigation
-------------------- */
/** by AUI-5164:
* The following CSS has been adjusted to allow generic content as a direct ancestor of the nav list
* basic styling (default and active state) is applied to the list element itself
* interactive styling (hover, active, focus) is applied to the assumed interactive element (<a>)
* thanks to this - we can fill in the nav list with non-interactive elements without generating visual glitches.
*/
.aui-navgroup-vertical .aui-nav > li,
.aui-nav-vertical > li {
#aui-nav.item-base();
overflow-wrap: break-word;
#aui-nav.item-style(normal, true);
& > a {
#aui-nav.item-base();
#aui-nav.item-base-inner-link();
#aui-nav.item-style(normal);
&:hover {
#aui-nav.item-style(hover);
}
&:active {
#aui-nav.item-style(active);
}
&:focus {
#aui.with-focus-ring();
text-decoration: none;
}
}
}
.aui-navgroup-vertical .aui-nav .aui-nav-selected,
.aui-nav-vertical .aui-nav .aui-nav-selected {
#aui-nav.item-style(selected);
}
.aui-navgroup-vertical .aui-nav,
.aui-navgroup-vertical .aui-nav-heading {
margin: 0;
}
.aui-navgroup-vertical .aui-nav + .aui-nav {
// If a sequential group does not have a heading, add a divider between them.
margin-top: @aui-grid;
padding-top: @aui-grid;
border-top: 1px solid @aui-nav-group-divider-color;
}
.aui-navgroup-vertical .aui-nav + .aui-nav-heading {
// If a sequential group *does* have a heading, don't add a divider, but space it out a little bit more.
margin-top: @aui-grid * 2;
}
.aui-navgroup-vertical .aui-nav:first-child,
.aui-navgroup-vertical .aui-navgroup-inner > .aui-nav-heading:first-child,
.aui-navgroup-vertical .aui-navgroup-primary > .aui-nav-heading:first-child {
margin-top: 0;
padding-top: 0;
}
/* nested vertical navigation menus
----------------------------------- */
.aui-navgroup-vertical .aui-nav {
// the sub-menu styles
.aui-nav {
margin-top: 0;
padding: 0 0 0 @aui-nav-subtree-toggle-icon-size;
> li {
position: relative;
}
}
// the twixi and submenu expansion/collapsing styles
> li[aria-expanded] {
position: relative;
.aui-nav-heading {
padding-left: 0;
}
.aui-nav-subtree-toggle {
// All of these calculations exist because of two problems with the markup pattern:
// (1) the subtree toggle sits outside and to the left of the aui-nav-item
// (2) the nested list sits inside the <li> adjacent to the sutree toggle and nav item.
// these both mean that using flexbox is... inadvisable.
@box-size: (@aui-nav-link-effective-height); // note: it is assumed, but not guaranteed, that the .aui-nav-item will be the same height.
-webkit-appearance: none;
background: transparent;
border: 0;
border-radius: @aui-border-radius-smallish;
box-sizing: border-box;
color: @aui-nav-subtree-toggle-icon-color;
left: 0;
margin: 0;
position: absolute;
padding: ((@aui-nav-subtree-toggle-icon-size - @aui-icon-size-small) / 2);
top: ((@box-size - @aui-nav-subtree-toggle-icon-size) / 2);
width: @aui-nav-subtree-toggle-icon-size;
outline-radius: @aui-border-radius-smallish;
z-index: 1; // because it needs to sit "above" the link it's for.
> .aui-icon {
display: block;
margin: 0 auto;
}
+ .aui-nav-item {
padding-left: @aui-nav-subtree-toggle-icon-size + @aui-nav-link-spacing-horizontal;
}
}
li {
position: relative;
}
&[aria-expanded="false"] {
> * {
display: none;
}
> .aui-nav-subtree-toggle,
> .aui-nav-item {
display: inherit;
}
}
}
}
/* RHS actions dropdown
------------------------ */
.aui-navgroup-vertical .aui-nav .aui-nav-item-actions {
@actions-glyph-size: unit(@aui-icon-size-small * 0.75, px);
@actions-button-size: @aui-icon-size-small;
@aui-nav-item-actions-top-offset: ((@aui-nav-link-effective-height - @actions-button-size) / 2);
@aui-nav-item-actions-left-offset: 4px;
@aui-nav-item-actions-border-radius: 2px; // because it's a tiny button. 3px would probably work, though.
#aui-buttons.aui-subtle-button-style(normal);
border-radius: @aui-nav-item-actions-border-radius;
display: block;
height: @actions-button-size;
margin: 0;
overflow: hidden;
padding: 0;
position: absolute;
right: (@aui-grid / 2);
text-indent: -999em;
top: @aui-nav-item-actions-top-offset;
width: @actions-button-size;
&::after {
#aui.aui-dropdown2-trigger-chevron-icon(@actions-glyph-size, @actions-button-size);
content: @aui-glyph-more-actions;
}
&:hover,
&:focus {
#aui-buttons.aui-button-style(hover);
}
&:active {
#aui-buttons.aui-button-style(active);
&:after {
border-top-color: @aui-text-color;
}
}
&.active {
#aui-buttons.aui-button-style(selected);
}
~ .aui-nav-item-label {
margin-right: (@aui-grid * 1.5);
}
}
/* Horizontal Navigation
-------------------- */
.aui-nav-horizontal,
.aui-navgroup-horizontal .aui-nav {
display: flex;
flex-direction: row;
> li a {
padding-right: @aui-grid;
}
}
/* Horizontal Navgroup
-------------------- */
.aui-navgroup-horizontal {
#aui.horizontal-tab-indicator(@aui-tabs-tab-border-color, auto, 0);
// The base styles
margin: 0;
padding: 0;
.aui-navgroup-inner {
padding: 0 @aui-grid;
}
// Use flexbox to arrange all the innards of horizontal nav.
// The wrapping is a bit different to floated items, but hopefully in a good way.
.aui-navgroup-inner,
.aui-navgroup-primary,
.aui-navgroup-secondary,
.aui-nav {
display: flex;
flex-wrap: wrap;
}
.aui-navgroup-inner {
justify-content: space-between;
}
.aui-navgroup-primary {
flex-grow: 1;
order: 0;
}
.aui-navgroup-secondary {
order: 1;
}
/* Nav in a Navbar */
.aui-nav {
> li > a,
> li > span:not(.assistive) {
display: block;
margin: 0;
padding: (@aui-grid - 1) @aui-grid;
position: relative;
&,
&:link,
&:visited {
color: @aui-tabs-tab-text-color;
text-decoration: none;
}
&:focus,
&:hover {
color: @aui-tabs-tab-hover-text-color;
}
&:focus {
#aui.with-focus-ring();
border-radius: 2px;
z-index: 1;
}
}
> .aui-nav-selected > a,
> .aui-nav-selected > span:not(.assistive) {
#aui.horizontal-tab-indicator(@aui-tabs-tab-active-border-color, 1);
font-weight: @aui-font-weight-medium;
&,
&:link,
&:visited,
&.active {
color: @aui-tabs-tab-active-text-color;
}
}
}
/* Horizontal navgroup + Dropdown2 integration. Note: ADG prohibits dropdowns in vertical nav. */
.aui-dropdown2-trigger::after {
#aui.aui-dropdown2-trigger-chevron-icon();
}
/* Breadcrumbs in navbar */
.aui-nav-breadcrumbs > li,
.aui-nav-breadcrumbs > li:before {
padding: 0;
}
.aui-nav-breadcrumbs > li a {
display: inline-block;
}
/* Bulletproofing - headings shouldn't be here but will at least not look heinously broken. */
.aui-nav-heading {
padding: @aui-grid @aui-grid 0 @aui-grid; /* 0 bottom required to unfuck IE9 */
}
}
.aui-nav-actions-list {
font-size: 0;
list-style: none;
margin: @aui-nav-actions-list-margin-top 0 0 0;
padding: 0;
&:first-child {
margin-top: 0;
}
> li {
display: inline-block;
font-size: @aui-nav-actions-list-item-font-size;
margin-bottom: @aui-nav-actions-list-item-margin-bottom;
+ li::before {
content: "";
border-radius: @aui-nav-actions-list-divider-size;
width: @aui-nav-actions-list-divider-size;
height: @aui-nav-actions-list-divider-size;
background-color: @aui-nav-actions-list-divider-color;
display: inline-block;
vertical-align: middle;
margin-left: @aui-nav-actions-list-divider-spacing;
margin-right: @aui-nav-actions-list-divider-spacing;
}
}
}