Subversion Repositories web.active

Rev

Blame | Last modification | View Log | Download

// Name:            Subnav
// Description:     Component to create a sub navigation
//
// Component:       `uk-subnav`
//
// Modifiers:       `uk-subnav-divider`
//                  `uk-subnav-pill`
//
// States:          `uk-active`
//                  `uk-first-column`
//
// ========================================================================


// Variables
// ========================================================================

@subnav-margin-horizontal:                      20px;

@subnav-item-color:                             @global-muted-color;
@subnav-item-hover-color:                       @global-color;
@subnav-item-hover-text-decoration:             none;
@subnav-item-active-color:                      @global-emphasis-color;

@subnav-divider-margin-horizontal:              @subnav-margin-horizontal;
@subnav-divider-border-height:                  1.5em;
@subnav-divider-border-width:                   @global-border-width;
@subnav-divider-border:                         @global-border;

@subnav-pill-item-padding-vertical:             5px;
@subnav-pill-item-padding-horizontal:           10px;
@subnav-pill-item-background:                   transparent;
@subnav-pill-item-color:                        @subnav-item-color;
@subnav-pill-item-hover-background:             @global-muted-background;
@subnav-pill-item-hover-color:                  @global-color;
@subnav-pill-item-onclick-background:           @subnav-pill-item-hover-background;
@subnav-pill-item-onclick-color:                @subnav-pill-item-hover-color;
@subnav-pill-item-active-background:            @global-primary-background;
@subnav-pill-item-active-color:                 @global-inverse-color;

@subnav-item-disabled-color:                    @global-muted-color;


/* ========================================================================
   Component: Subnav
 ========================================================================== */

/*
 * 1. Allow items to wrap into the next line
 * 2. Gutter
 * 3. Reset list
 */

.uk-subnav {
    display: flex;
    /* 1 */
    flex-wrap: wrap;
    /* 2 */
    margin-left: -@subnav-margin-horizontal;
    /* 3 */
    padding: 0;
    list-style: none;
    .hook-subnav;
}

/*
 * 1. Space is allocated solely based on content dimensions: 0 0 auto
 * 2. Gutter
 * 3. Create position context for dropdowns
 */

.uk-subnav > * {
    /* 1 */
    flex: none;
    /* 2 */
    padding-left: @subnav-margin-horizontal;
    /* 3 */
    position: relative;
}


/* Items
 ========================================================================== */

/*
 * Items must target `a` elements to exclude other elements (e.g. dropdowns)
 * Using `:first-child` instead of `a` to support `span` elements for text
 * 1. Prevent gap if child element is `inline-block`, e.g. an icon
 * 2. Style
 */

.uk-subnav > * > :first-child {
    /* 1 */
    display: block;
    /* 2 */
    color: @subnav-item-color;
    .hook-subnav-item;
}

/* Hover + Focus */
.uk-subnav > * > a:hover,
.uk-subnav > * > a:focus {
    color: @subnav-item-hover-color;
    text-decoration: @subnav-item-hover-text-decoration;
    outline: none;
    .hook-subnav-item-hover;
}

/* Active */
.uk-subnav > .uk-active > a {
    color: @subnav-item-active-color;
    .hook-subnav-item-active;
}


/* Divider modifier
 ========================================================================== */

/*
 * Set gutter 
 */

.uk-subnav-divider { margin-left: -((@subnav-divider-margin-horizontal * 2) + @subnav-divider-border-width); }

/*
 * Align items and divider vertically
 */

.uk-subnav-divider > * {
    display: flex;
    align-items: center;
}

/*
 * Divider
 * 1. `nth-child` makes it also work without JS if it's only one row
 */

.uk-subnav-divider > ::before {
    content: "";
    height: @subnav-divider-border-height;
    margin-left: (@subnav-divider-margin-horizontal - @subnav-margin-horizontal);
    margin-right: @subnav-divider-margin-horizontal;
    border-left: @subnav-divider-border-width solid transparent;
}

/* 1 */
.uk-subnav-divider > :nth-child(n+2):not(.uk-first-column)::before {
    border-left-color: @subnav-divider-border;
    .hook-subnav-divider;
}


/* Pill modifier
 ========================================================================== */

.uk-subnav-pill > * > :first-child {
    padding: @subnav-pill-item-padding-vertical @subnav-pill-item-padding-horizontal;
    background: @subnav-pill-item-background;
    color: @subnav-pill-item-color;
    .hook-subnav-pill-item;
}

/* Hover + Focus */
.uk-subnav-pill > * > a:hover,
.uk-subnav-pill > * > a:focus {
    background-color: @subnav-pill-item-hover-background;
    color: @subnav-pill-item-hover-color;
    .hook-subnav-pill-item-hover;
}

/* OnClick */
.uk-subnav-pill > * > a:active {
    background-color: @subnav-pill-item-onclick-background;
    color: @subnav-pill-item-onclick-color;
    .hook-subnav-pill-item-onclick;
}

/* Active */
.uk-subnav-pill > .uk-active > a {
    background-color: @subnav-pill-item-active-background;
    color: @subnav-pill-item-active-color;
    .hook-subnav-pill-item-active;
}


/* Disabled
 * The same for all style modifiers
 ========================================================================== */

.uk-subnav > .uk-disabled > a {
    color: @subnav-item-disabled-color;
    .hook-subnav-item-disabled;
}


// Hooks
// ========================================================================

.hook-subnav-misc;

.hook-subnav() {}
.hook-subnav-item() {}
.hook-subnav-item-hover() {}
.hook-subnav-item-active() {}
.hook-subnav-divider() {}
.hook-subnav-pill-item() {}
.hook-subnav-pill-item-hover() {}
.hook-subnav-pill-item-onclick() {}
.hook-subnav-pill-item-active() {}
.hook-subnav-item-disabled() {}
.hook-subnav-misc() {}


// Inverse
// ========================================================================

@inverse-subnav-item-color:                    @inverse-global-muted-color;
@inverse-subnav-item-hover-color:              @inverse-global-color;
@inverse-subnav-item-active-color:             @inverse-global-emphasis-color;
@inverse-subnav-divider-border:                @inverse-global-border;
@inverse-subnav-pill-item-background:          transparent;
@inverse-subnav-pill-item-color:               @inverse-global-muted-color;
@inverse-subnav-pill-item-hover-background:    @inverse-global-muted-background;
@inverse-subnav-pill-item-hover-color:         @inverse-global-color;
@inverse-subnav-pill-item-onclick-background:  @inverse-subnav-pill-item-hover-background;
@inverse-subnav-pill-item-onclick-color:       @inverse-subnav-pill-item-hover-color;
@inverse-subnav-pill-item-active-background:   @inverse-global-primary-background;
@inverse-subnav-pill-item-active-color:        @inverse-global-inverse-color;
@inverse-subnav-item-disabled-color:           @inverse-global-muted-color;

.hook-inverse() {

    .uk-subnav > * > :first-child {
        color: @inverse-subnav-item-color;
        .hook-inverse-subnav-item;
    }

    .uk-subnav > * > a:hover,
    .uk-subnav > * > a:focus {
        color: @inverse-subnav-item-hover-color;
        .hook-inverse-subnav-item-hover;
    }

    .uk-subnav > .uk-active > a {
        color: @inverse-subnav-item-active-color;
        .hook-inverse-subnav-item-active;
    }

    //
    // Divider
    //

    .uk-subnav-divider > :nth-child(n+2):not(.uk-first-column)::before {
        border-left-color: @inverse-subnav-divider-border;
        .hook-inverse-subnav-divider;
    }

    //
    // Pill
    //

    .uk-subnav-pill > * > :first-child {
        background-color: @inverse-subnav-pill-item-background;
        color: @inverse-subnav-pill-item-color;
        .hook-inverse-subnav-pill-item;
    }

    .uk-subnav-pill > * > a:hover,
    .uk-subnav-pill > * > a:focus {
        background-color: @inverse-subnav-pill-item-hover-background;
        color: @inverse-subnav-pill-item-hover-color;
        .hook-inverse-subnav-pill-item-hover;
    }

    .uk-subnav-pill > * > a:active {
        background-color: @inverse-subnav-pill-item-onclick-background;
        color: @inverse-subnav-pill-item-onclick-color;
        .hook-inverse-subnav-pill-item-onclick;
    }

    .uk-subnav-pill > .uk-active > a {
        background-color: @inverse-subnav-pill-item-active-background;
        color: @inverse-subnav-pill-item-active-color;
        .hook-inverse-subnav-pill-item-active;
    }

    //
    // Disabled
    //

    .uk-subnav > .uk-disabled > a {
        color: @inverse-subnav-item-disabled-color;
        .hook-inverse-subnav-item-disabled;
    }

}

.hook-inverse-subnav-item() {}
.hook-inverse-subnav-item-hover() {}
.hook-inverse-subnav-item-active() {}
.hook-inverse-subnav-divider() {}
.hook-inverse-subnav-pill-item() {}
.hook-inverse-subnav-pill-item-hover() {}
.hook-inverse-subnav-pill-item-onclick() {}
.hook-inverse-subnav-pill-item-active() {}
.hook-inverse-subnav-item-disabled() {}