Skip to content
Snippets Groups Projects
table_of_contents.sass 5.99 KiB
Newer Older
alexisben's avatar
alexisben committed
@mixin offcanvas-toc
alexisben's avatar
alexisben committed
    --toc-transition-duration: 0.35s
Arnaud Levy's avatar
Arnaud Levy committed
    background: $toc-background-color
alexisben's avatar
alexisben committed
    position: fixed
    top: 0
    right: 0
    bottom: 0
alexisben's avatar
alexisben committed
    margin-top: 0
alexisben's avatar
alexisben committed
    z-index: $zindex-toc-offcanvas
alexisben's avatar
alexisben committed
    width: calc(#{columns(4)} + var(--grid-gutter) * 2)
alexisben's avatar
alexisben committed
    transform: translateX(100%)
alexisben's avatar
alexisben committed
    transition: var(--toc-transition-duration) transform ease-in-out
    @include media-breakpoint-down(desktop)
        width: calc(100% - var(--grid-gutter))
alexisben's avatar
alexisben committed
    &.is-opened
        transform: translateX(0)
alexisben's avatar
alexisben committed
    &[aria-hidden="true"]
alexisben's avatar
alexisben committed
        display: none
alexisben's avatar
alexisben committed
    .toc-content
        display: flex
        flex-direction: column
        height: 100%
    .toc-title
alexisben's avatar
alexisben committed
        border-bottom: 1px solid var(--color-border)
alexisben's avatar
alexisben committed
        font-size: $toc-title-font-size
        padding: $spacing-2 $spacing-3
        @include media-breakpoint-up(desktop)
alexisben's avatar
alexisben committed
            font-size: $toc-title-font-size-desktop
            padding: $header-nav-padding-y var(--grid-gutter) calc(#{$header-nav-padding-y} + 1px)
            padding: calc((var(--header-height)) / 2 - #{$body-size}) var(--grid-gutter)
alexisben's avatar
alexisben committed
            padding-top: 0
            padding-bottom: 0
            line-height: calc(var(--header-height) - 1px)
alexisben's avatar
alexisben committed
    .toc
        flex: 1
        display: flex
        flex-direction: column
        overflow-y: auto
        max-height: 100%
alexisben's avatar
alexisben committed
        > ol
alexisben's avatar
alexisben committed
            flex: 1
            @include media-breakpoint-up(desktop)
                padding: $spacing-3 var(--grid-gutter)
alexisben's avatar
alexisben committed
            > li:first-child
alexisben's avatar
alexisben committed
                margin-top: 0
alexisben's avatar
alexisben committed
    button
        @include button-reset
        @include icon-block(close-line, after)
alexisben's avatar
alexisben committed
            margin-right: -14px
            font-size: 1.5em
alexisben's avatar
alexisben committed
        align-items: center
alexisben's avatar
alexisben committed
        border-top: 1px solid var(--color-border)
alexisben's avatar
alexisben committed
        display: flex
        justify-content: space-between
alexisben's avatar
alexisben committed
        line-height: $body-line-height
        @include media-breakpoint-up(desktop)
alexisben's avatar
alexisben committed
            border-top: 0
            position: absolute
alexisben's avatar
alexisben committed
            padding-right: 0
alexisben's avatar
alexisben committed
            top: 0
            padding-top: 0
            padding-bottom: 0
            line-height: var(--header-height)
            right: var(--grid-gutter)
alexisben's avatar
alexisben committed
            &::after
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
.toc-cta
    display: flex
Olivia206's avatar
Olivia206 committed
    position: relative
alexisben's avatar
alexisben committed
    @include in-page-with-sidebar
        display: none
    @include media-breakpoint-up(desktop)
alexisben's avatar
alexisben committed
        @include container
alexisben's avatar
alexisben committed
        background: var(--color-background)
alexisben's avatar
alexisben committed
        justify-content: end
alexisben's avatar
alexisben committed
        position: sticky
        text-align: right
alexisben's avatar
alexisben committed
        top: calc(var(--header-height) * -1)
alexisben's avatar
alexisben committed
        transition: top $toc-sticky-transition
        z-index: $zindex-toc-cta
        html:not(.is-scrolling-down) &
alexisben's avatar
alexisben committed
            top: var(--header-height)
alexisben's avatar
alexisben committed
        body.offcanvas-toc &
            display: flex
    @include media-breakpoint-down(desktop)
alexisben's avatar
alexisben committed
        border-top: 1px solid var(--color-border)
alexisben's avatar
alexisben committed
        position: fixed
        bottom: 0
Arnaud Levy's avatar
Arnaud Levy committed
        background: $toc-background-color
alexisben's avatar
alexisben committed
        left: 0
        width: 100%
alexisben's avatar
alexisben committed
        padding: 0 var(--grid-gutter)
alexisben's avatar
alexisben committed
        z-index: $zindex-toc-cta
    button
        @include link-icon(menu-3-line)
alexisben's avatar
alexisben committed
        border: 0
        line-height: inherit
alexisben's avatar
alexisben committed
        cursor: pointer
alexisben's avatar
alexisben committed
        padding: 0
alexisben's avatar
alexisben committed
        span
            @include meta
Arnaud Levy's avatar
Arnaud Levy committed
            color: $toc-color
alexisben's avatar
alexisben committed
            text-overflow: ellipsis
            overflow: hidden
            @include media-breakpoint-down(desktop)
                flex: 1
alexisben's avatar
alexisben committed
        &::after
Arnaud Levy's avatar
Arnaud Levy committed
            color: $toc-color
alexisben's avatar
alexisben committed
            margin-right: $icon-toc-margin-right
        @include media-breakpoint-down(desktop)
alexisben's avatar
alexisben committed
            display: flex
            justify-content: space-between
            align-items: center
alexisben's avatar
alexisben committed
            width: 100%
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
.toc-container
alexisben's avatar
alexisben committed
    // in full width page or under md breakpoint (mobile)
alexisben's avatar
alexisben committed
    @include in-page-without-sidebar
alexisben's avatar
alexisben committed
        @include offcanvas-toc
    @include media-breakpoint-down(desktop)
alexisben's avatar
alexisben committed
        @include offcanvas-toc
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
    // Only desktop and in page with sidebar
alexisben's avatar
alexisben committed
    @include in-page-with-sidebar
alexisben's avatar
alexisben committed
        margin-left: grid-external-space()
alexisben's avatar
alexisben committed
        pointer-events: none
        top: 0
        left: 0
        margin-top: 0
        height: 100%
        position: absolute
alexisben's avatar
alexisben committed
        width: columns(4)
alexisben's avatar
alexisben committed
        z-index: $zindex-toc
alexisben's avatar
alexisben committed
        .toc-content
            overflow-y: auto
            max-height: calc(100vh - var(--header-height))
alexisben's avatar
alexisben committed
            pointer-events: auto
alexisben's avatar
alexisben committed
            html.is-scrolling-down &
                max-height: calc(100vh - #{$spacing-3})
alexisben's avatar
alexisben committed
        .toc-title
alexisben's avatar
alexisben committed
            color: var(--color-text-alt)
alexisben's avatar
alexisben committed
        button
            display: none
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
    // Program tweak : use offcanvas
    // TODO : find a better way to cancel sidebar props
    body.offcanvas-toc &
        @include offcanvas-toc
        margin-left: 0
        pointer-events: inherit
        left: auto
        .toc-content
            position: relative
alexisben's avatar
alexisben committed
            top: 0 !important
alexisben's avatar
alexisben committed
            max-height: none
            padding-bottom: 0
            margin-top: 0
            margin-bottom: 0
alexisben's avatar
alexisben committed
            html.is-scrolling-down &
                max-height: none
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
.toc-title, .toc-cta, .toc-container button
alexisben's avatar
alexisben committed
    font-family: $toc-title-font-family
alexisben's avatar
alexisben committed
    font-size: $toc-title-font-size
Arnaud Levy's avatar
Arnaud Levy committed
    color: $toc-color
    @include media-breakpoint-up(desktop)
alexisben's avatar
alexisben committed
        font-size: $toc-title-font-size-desktop
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
.toc
alexisben's avatar
alexisben committed
    font-family: $toc-font-family
    line-height: $toc-line-height
    @include media-breakpoint-up(desktop)
alexisben's avatar
alexisben committed
        font-size: $toc-font-size-desktop
alexisben's avatar
alexisben committed
    ol
        @include list-reset
        align-items: flex-start
alexisben's avatar
alexisben committed
        display: flex
alexisben's avatar
alexisben committed
        flex-direction: column
alexisben's avatar
alexisben committed
        margin: 0
Olivia206's avatar
Olivia206 committed
        li
alexisben's avatar
alexisben committed
            margin-top: 1rem
alexisben's avatar
alexisben committed
            a
alexisben's avatar
alexisben committed
                color: $toc-color
alexisben's avatar
alexisben committed
                display: block
alexisben's avatar
alexisben committed
                @extend %underline-on-hover
alexisben's avatar
alexisben committed
        .active
            color: $toc-active-color
            pointer-events: none
alexisben's avatar
alexisben committed
        ol
alexisben's avatar
alexisben committed
            padding-left: 0
            li a
                @include icon(corner-down-right-line)
alexisben's avatar
alexisben committed
                &::before
alexisben's avatar
alexisben committed
                    margin-right: 6px