// Name:            Off-canvas
// Description:     Component to create an off-canvas sidebar
//
// Component:       `uk-offcanvas`
//
// Sub-objects:     `uk-offcanvas-bar`
//                  `uk-offcanvas-container`
//                  `uk-offcanvas-content`
//                  `uk-offcanvas-page`
//
// Adopted:         `uk-offcanvas-close`
//
// Modifiers:       `uk-offcanvas-flip`
//                  `uk-offcanvas-bar-animation`
//                  `uk-offcanvas-reveal`
//                  `uk-offcanvas-overlay`
//                  `uk-offcanvas-content-animation`
//
// States:          `uk-open`
//
// ========================================================================


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

@offcanvas-z-index:                             @global-z-index;

@offcanvas-bar-width:                           270px;
@offcanvas-bar-padding-vertical:                @global-margin;
@offcanvas-bar-padding-horizontal:              @global-margin;
@offcanvas-bar-background:                      @global-secondary-background;
@offcanvas-bar-color-mode:                      light;

@offcanvas-bar-width-m:                         350px;
@offcanvas-bar-padding-vertical-m:              @global-medium-gutter;
@offcanvas-bar-padding-horizontal-m:            @global-medium-gutter;

@offcanvas-close-position:                      20px;
@offcanvas-close-padding:                       5px;

@offcanvas-overlay-background:                  rgba(0,0,0,0.1);


/* ========================================================================
   Component: Off-canvas
 ========================================================================== */

/*
 * 1. Hide by default
 * 2. Set position
 */

.uk-offcanvas {
    /* 1 */
    display: none;
    /* 2 */
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    z-index: @offcanvas-z-index;
}

/*
 * Flip modifier
 */

.uk-offcanvas-flip .uk-offcanvas {
    right: 0;
    left: auto;
}


/* Bar
 ========================================================================== */

/*
 * 1. Set position
 * 2. Size and style
 * 3. Allow scrolling
 * 4. Transform
 */

.uk-offcanvas-bar {
    /* 1 */
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    /* 2 */
    box-sizing: border-box;
    width: @offcanvas-bar-width;
    padding: @offcanvas-bar-padding-vertical @offcanvas-bar-padding-horizontal;
    background: @offcanvas-bar-background;
    /* 3 */
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    /* 4 */
    transform: translateX(-100%);
    .hook-offcanvas-bar;
}

/* Tablet landscape and bigger */
@media (min-width: @breakpoint-medium) {

    .uk-offcanvas-bar {
        width: @offcanvas-bar-width-m;
        padding: @offcanvas-bar-padding-vertical-m @offcanvas-bar-padding-horizontal-m;
    }

}

// Color Mode
.uk-offcanvas-bar:extend(.uk-light all) when (@offcanvas-bar-color-mode = light) {}
.uk-offcanvas-bar:extend(.uk-dark all) when (@offcanvas-bar-color-mode = dark) {}

/* Flip modifier */
.uk-offcanvas-flip .uk-offcanvas-bar {
    left: auto;
    right: 0;
    transform: translateX(100%);
}

/*
 * Open
 */

.uk-open > .uk-offcanvas-bar { transform: translateX(0); }

/*
 * Slide Animation (Used in slide and push mode)
 */

.uk-offcanvas-bar-animation { transition: transform 0.3s ease-out; }

/*
 * Reveal Animation
 * 1. Set position
 * 2. Clip the bar
 * 3. Animation
 * 4. Reset transform
 */

.uk-offcanvas-reveal {
    /* 1 */
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    /* 2 */
    width: 0;
    overflow: hidden;
    /* 3 */
    transition: width 0.3s ease-out;
}

.uk-offcanvas-reveal .uk-offcanvas-bar {
    /* 4 */
    transform: translateX(0);
}

.uk-open > .uk-offcanvas-reveal { width: @offcanvas-bar-width; }

/* Tablet landscape and bigger */
@media (min-width: @breakpoint-medium) {

    .uk-open > .uk-offcanvas-reveal { width: @offcanvas-bar-width-m; }

}

/*
 * Flip modifier
 */

.uk-offcanvas-flip .uk-offcanvas-reveal {
    right: 0;
    left: auto;
}


/* Close
 * Adopts `uk-close`
 ========================================================================== */

.uk-offcanvas-close {
    position: absolute;
    z-index: @offcanvas-z-index;
    top: @offcanvas-close-position;
    right: @offcanvas-close-position;
    padding: @offcanvas-close-padding;
    .hook-offcanvas-close;
}


/* Overlay
 ========================================================================== */

/*
 * Overlay the whole page. Needed for the `::before`
 * 1. Using `100vw` so no modification is needed when off-canvas is flipped
 * 2. Allow for closing with swipe gesture on devices with pointer events.
 */

.uk-offcanvas-overlay {
    /* 1 */
    width: 100vw;
    /* 2 */
    touch-action: none;
}

/*
 * 1. Mask the whole page
 * 2. Fade-in transition
 */

.uk-offcanvas-overlay::before {
    /* 1 */
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: @offcanvas-overlay-background;
    /* 2 */
    opacity: 0;
    transition: opacity 0.15s linear;
    .hook-offcanvas-overlay;
}

.uk-offcanvas-overlay.uk-open::before { opacity: 1; }


/* Container
 ========================================================================== */

/*
 * Prevent horizontal scrollbar when the content is slide-out
 * Has to be on the `html` element too to make it work on the `body`
 */

.uk-offcanvas-page,
.uk-offcanvas-container { overflow-x: hidden; }

/*
 * Prevent all scrollbars if overlay is used
 */

.uk-offcanvas-container-overlay { overflow: hidden; }


/* Content
 ========================================================================== */

/*
 * Prepare slide-out animation (Used in reveal and push mode)
 * Using `position: left` instead of `transform` because position `fixed` elements like sticky navbars
 * lose their fixed state and behaves like `absolute` within a transformed container
 * Note: JS sets a fixed width and height so the page can slide-out without shrinking
 * 1. Smooth scrolling
 */

.uk-offcanvas-container .uk-offcanvas-content {
    position: relative;
    left: 0;
    transition: left 0.3s ease-out;
    /* 1 */
    -webkit-overflow-scrolling: touch;
}

/* Disable scrolling if overlay mode */
.uk-offcanvas-overlay .uk-offcanvas-content { overflow-y: hidden; }

/*
 * Activate slide-out animation
 */

:not(.uk-offcanvas-flip) > .uk-offcanvas-content-animation { left: @offcanvas-bar-width; }

.uk-offcanvas-flip > .uk-offcanvas-content-animation { left: -@offcanvas-bar-width; }

/* Tablet landscape and bigger */
@media (min-width: @breakpoint-medium) {

    :not(.uk-offcanvas-flip) > .uk-offcanvas-content-animation { left: @offcanvas-bar-width-m; }

    .uk-offcanvas-flip > .uk-offcanvas-content-animation { left: -@offcanvas-bar-width-m; }

}


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

.hook-offcanvas-misc;

.hook-offcanvas-bar() {}
.hook-offcanvas-close() {}
.hook-offcanvas-overlay() {}
.hook-offcanvas-misc() {}
