Skip to content
Snippets Groups Projects
_utils.sass 5.28 KiB
Newer Older
alexisben's avatar
alexisben committed
// TODO : ranger

alexisben's avatar
alexisben committed
@function px2rem($size)
    $remSize: $size / 16
    @return #{$remSize}rem

@function pxr2rem($size)
    $remSize: $size / 16 / 2
    @return #{$remSize}rem

@mixin in-page-with-aside
alexisben's avatar
alexisben committed
    body:not(.full-width) aside ~ .blocks &
alexisben's avatar
alexisben committed
        @content

@mixin in-page-without-aside
    main > .blocks &,
alexisben's avatar
alexisben committed
    // main > .blocks &,
alexisben's avatar
alexisben committed
    body.full-width &,
alexisben's avatar
alexisben committed
        @content

Olivia206's avatar
Olivia206 committed
@mixin link($color: $link-color)
    color: $color
    text-decoration-color: rgba($color, 0.3)
alexisben's avatar
alexisben committed
    text-decoration-line: underline
    text-decoration-thickness: 1px
    text-underline-offset: 3px
    transition: text-decoration-color .3s ease
    &:hover
Olivia206's avatar
Olivia206 committed
        text-decoration-color: rgba($color, 1)
alexisben's avatar
alexisben committed
        text-decoration-thickness: 1px

@mixin hover-translate-icon($pseudo: after, $distance: 10)
    &::#{$pseudo}
        transition: transform 0.55s $arrow-ease-transition
        transform: translateX(0)
    &:hover
        &::#{$pseudo}
            transform: translateX(#{px2rem($distance)})

@mixin sticky($offset-y: false)
alexisben's avatar
alexisben committed
    position: sticky
alexisben's avatar
alexisben committed
    top: 0
alexisben's avatar
alexisben committed
    @if $header-sticky-enabled
        transition: top $header-sticky-transition
alexisben's avatar
alexisben committed
        html:not(.is-scrolling-down) &
            @if $offset-y
                top: calc(var(--header-height) + #{$offset-y})
            @else 
                top: var(--header-height)
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
// NEW UTILS
alexisben's avatar
alexisben committed
@mixin icon($icon-name: '', $pseudo-element: before, $font-size: px2rem(10))
alexisben's avatar
alexisben committed
    &::#{$pseudo-element}
sebousan's avatar
sebousan committed
        content: map-get($icons, $icon-name)
alexisben's avatar
alexisben committed
        display: inline-block
        font-family: 'Icon'
alexisben's avatar
alexisben committed
        font-size: $font-size
alexisben's avatar
alexisben committed
        font-style: normal
        font-variant: normal
        font-weight: normal
        line-height: 1
        speak: never
        text-transform: none
        vertical-align: middle
alexisben's avatar
alexisben committed
        @content // TODO : important de documenter ça
alexisben's avatar
alexisben committed

@mixin container
sebousan's avatar
sebousan committed
    margin-left: auto
    margin-right: auto
alexisben's avatar
alexisben committed
    max-width: $grid-max-width
alexisben's avatar
alexisben committed
    padding-left: $grid-gutter-sm
    padding-right: $grid-gutter-sm
alexisben's avatar
alexisben committed
    width: 100%
alexisben's avatar
alexisben committed
    @include media-breakpoint-up(md)
        padding-left: $grid-gutter
        padding-right: $grid-gutter
alexisben's avatar
alexisben committed

@mixin grid($cols: 12, $breakpoint: false, $gap-y: $grid-gutter)
alexisben's avatar
alexisben committed
    @if $breakpoint
        @include media-breakpoint-up($breakpoint)
            display: grid
alexisben's avatar
alexisben committed
            grid-gap: $gap-y $grid-gutter
alexisben's avatar
alexisben committed
            grid-template-columns: repeat($cols, 1fr)
sebousan's avatar
sebousan committed
    @else
alexisben's avatar
alexisben committed
        display: grid
alexisben's avatar
alexisben committed
        grid-gap: $gap-y $grid-gutter
alexisben's avatar
alexisben committed
        grid-template-columns: repeat($cols, 1fr)
alexisben's avatar
alexisben committed

alexisben's avatar
alexisben committed
@function col($nb, $base: 12)
    $nb: $nb/$base * 12
    $nbCol: calc( (100% + #{$grid-gutter}) / 12 * #{$nb} )
    @return #{$nbCol}

alexisben's avatar
alexisben committed
@mixin stretched-link($pseudo-element: after)
    &::#{$pseudo-element}
        bottom: 0
sebousan's avatar
sebousan committed
        content: ''
alexisben's avatar
alexisben committed
        left: 0
sebousan's avatar
sebousan committed
        position: absolute
        right: 0
        top: 0
alexisben's avatar
alexisben committed
        z-index: $zindex-stretched-link

sebousan's avatar
sebousan committed
@mixin aspect-ratio($width, $height, $selector: 'iframe', $background: false)
    @if $background
alexisben's avatar
alexisben committed
        aspect-ratio: #{$width}/#{$height}
sebousan's avatar
sebousan committed
        background: $background
    #{$selector}
alexisben's avatar
alexisben committed
        aspect-ratio: #{$width}/#{$height}
sebousan's avatar
sebousan committed
        display: block
        width: 100%
    @supports not (aspect-ratio: 1)
        position: relative
        &::before
            content: ''
            padding-top: ($height / $width) * 100%
            width: 100%
        #{$selector}
            bottom: 0
            left: 0
            position: absolute
            right: 0
            top: 0
alexisben's avatar
alexisben committed
@mixin article($background: null)
sebousan's avatar
sebousan committed
    position: relative
    display: flex
    flex-direction: column
    .media
        @include aspect-ratio(2, 1, 'img', $background)
        margin-bottom: $spacing1
        order: -1
        overflow: hidden
alexisben's avatar
alexisben committed
        img
            object-fit: cover
sebousan's avatar
sebousan committed
    .title
alexisben's avatar
alexisben committed
        font-size: $article-title-size
sebousan's avatar
sebousan committed
        margin-bottom: px2rem(5)
Olivia206's avatar
Olivia206 committed
        @include media-breakpoint-up(md)
alexisben's avatar
alexisben committed
            font-size: $article-title-size-md
sebousan's avatar
sebousan committed
    a
        @include stretched-link
    p
        margin-bottom: 0
        margin-top: 0

alexisben's avatar
alexisben committed
@mixin visually-hidden
    clip: rect(0,0,0,0) !important
    border: 0 !important
    height: 1px !important
    margin: -1px !important
    overflow: hidden !important
    padding: 0 !important
    position: absolute !important
    white-space: nowrap !important
    width: 1px !important
Olivia206's avatar
Olivia206 committed
@mixin button-reset
sebousan's avatar
sebousan committed
    appearance: none
Olivia206's avatar
Olivia206 committed
    background: transparent
    border: none
sebousan's avatar
sebousan committed
    border-radius: none
Olivia206's avatar
Olivia206 committed
    cursor: pointer
sebousan's avatar
sebousan committed
    user-select: none
    &:active,
Olivia206's avatar
Olivia206 committed
    &:focus
Olivia206's avatar
Olivia206 committed
        box-shadow: 0 0 0 0.25rem rgba($main-color, 0.25)
alexisben's avatar
alexisben committed
        // TODO : vérifier si l'outline 0 est vraiment nécessaire
        // outline: 0
alexisben's avatar
alexisben committed

@mixin list-reset
    list-style: none
    padding-left: 0
    margin-bottom: 0
sebousan's avatar
sebousan committed
    margin-top: 0
alexisben's avatar
alexisben committed

@mixin inset($top: 0, $right: $top, $bottom: $top, $left: $top)
    inset: $top $right $bottom $left
    // polyfill for inset
    @supports not (inset: $top)
        bottom: $bottom
        left: $left
        right: $right
sebousan's avatar
sebousan committed
        top: $top

@function color-contrast($color, $amount)
    @if lightness($color) > 50%
        $amount: $amount * -1
alexisben's avatar
alexisben committed
    @return scale-color($color, $lightness: $amount)

@mixin button-icon($icon: false)
    @include button-reset
    line-height: $line-height-base
    border: 1px solid $hero-color
    padding: $spacing0 $spacing1
    white-space: nowrap
    @if $icon
        @include icon($icon, after)
            font-size: px2rem(20) 
Olivia206's avatar
Olivia206 committed
            margin-left: px2rem(10)