diff --git a/assets/sass/_theme/_configuration.sass b/assets/sass/_theme/_configuration.sass
index 5f6d13b4ea1aa0b90941ddd9fe2d2895d88742f9..a05621189c41592d9d370f8efc78e7404738e5d0 100644
--- a/assets/sass/_theme/_configuration.sass
+++ b/assets/sass/_theme/_configuration.sass
@@ -10,13 +10,15 @@ $body-color: $color-text !default
 $body-background-color: $color-background !default
 $link-color: $color-text !default
 
-// Grid
-$grid-gutter: px2rem(64) !default
-$grid-max-width: px2rem(1980) !default
-$grid-gutter-sm: px2rem(44) !default
+// Grid System 
+$grid-gutter: pxToRem(24) !default
+$grid-gutter-lg: pxToRem(48) !default
+$grid-gutter-xxl: pxToRem(64) !default
+$grid-max-width: pxToRem(1980) !default
 
 // Spacing
 $space-unit: 4 !default
+
 $spacing0: space(3) !default
 $spacing1: space(6) !default
 $spacing2: space(12) !default
@@ -24,6 +26,7 @@ $spacing3: space(16) !default
 $spacing4: space(32) !default
 $spacing5: space(64) !default
 
+
 // TYPOGRAPHY
 
 // Fonts family
@@ -35,61 +38,61 @@ $heading-font-weight: normal !default
 
 // h1
 $h1-font-family: $heading-font-family !default
-$h1-size-desktop: px2rem(60) !default
-$h1-size: px2rem(30) !default
+$h1-size-desktop: pxToRem(60) !default
+$h1-size: pxToRem(30) !default
 $h1-line-height: 120% !default
 $h1-weight: bold !default
 $h1-text-transform: none !default
 
 // h2
 $h2-font-family: $heading-font-family !default
-$h2-size-desktop: px2rem(40) !default
-$h2-size: px2rem(24) !default
+$h2-size-desktop: pxToRem(40) !default
+$h2-size: pxToRem(24) !default
 $h2-line-height: 120% !default
 $h2-weight: $heading-font-weight !default
 $h2-text-transform: none !default
 
 // h3
 $h3-font-family: $heading-font-family !default
-$h3-size-desktop: px2rem(28) !default
-$h3-size: px2rem(20) !default
+$h3-size-desktop: pxToRem(28) !default
+$h3-size: pxToRem(20) !default
 $h3-line-height: 130% !default
 $h3-weight: bold !default
 $h3-text-transform: none !default
 
 // h4
 $h4-font-family: $heading-font-family !default
-$h4-size-desktop: px2rem(22) !default
-$h4-size: px2rem(16) !default
+$h4-size-desktop: pxToRem(22) !default
+$h4-size: pxToRem(16) !default
 $h4-line-height: 130% !default
 $h4-weight: bold !default
 $h4-text-transform: none !default
 
 // h5 or Section
 $h5-font-family: $heading-font-family !default
-$h5-size-desktop: px2rem(24) !default
-$h5-size: px2rem(20) !default
+$h5-size-desktop: pxToRem(24) !default
+$h5-size: pxToRem(20) !default
 $h5-line-height: 130% !default
 $h5-weight: $heading-font-weight !default
 $h5-text-transform: uppercase !default
 
 // h6 or Tab
 $h6-font-family: $heading-font-family !default
-$h6-size-desktop: px2rem(20) !default
-$h6-size: px2rem(14) !default
+$h6-size-desktop: pxToRem(20) !default
+$h6-size: pxToRem(14) !default
 $h6-line-height: 130% !default
 $h6-weight: $heading-font-weight !default
 $h6-text-transform: uppercase !default
 
 // Lead
 $lead-font-family: $heading-font-family !default
-$lead-size-desktop: px2rem(60) !default
-$lead-size: px2rem(24) !default
+$lead-size-desktop: pxToRem(60) !default
+$lead-size: pxToRem(24) !default
 $lead-line-height: 120% !default
 $lead-weight: $heading-font-weight !default
 
 $lead-sidebar-font-family: $lead-font-family !default
-$lead-sidebar-size-desktop: px2rem(32) !default
+$lead-sidebar-size-desktop: pxToRem(32) !default
 $lead-sidebar-line-height: $lead-line-height !default
 $lead-sidebar-weight: $lead-weight !default
 
@@ -100,37 +103,37 @@ $lead-hero-line-height: $lead-sidebar-line-height !default
 $lead-hero-weight: $lead-sidebar-weight !default
 
 // Body
-$body-size-desktop: px2rem(22) !default
-$body-size: px2rem(18) !default
+$body-size-desktop: pxToRem(22) !default
+$body-size: pxToRem(18) !default
 $body-line-height: 160% !default
 $body-weight: normal !default
 
 // Small
 $small-font-family: $body-font-family !default
-$small-size-desktop: px2rem(18) !default
-$small-size: px2rem(14) !default
+$small-size-desktop: pxToRem(18) !default
+$small-size: pxToRem(14) !default
 $small-line-height: 130% !default
 $small-weight: normal !default
 
 // Signature
 $signature-font-family: $heading-font-family !default
-$signature-size-desktop: px2rem(22) !default
-$signature-size: px2rem(18) !default
+$signature-size-desktop: pxToRem(22) !default
+$signature-size: pxToRem(18) !default
 $signature-line-height: 130% !default
 $signature-weight: $heading-font-weight !default
 
 // Meta
 $meta-font-family: $heading-font-family !default
-$meta-size-desktop: px2rem(16) !default
-$meta-size: px2rem(14) !default
+$meta-size-desktop: pxToRem(16) !default
+$meta-size: pxToRem(14) !default
 $meta-line-height: 150% !default
 $meta-weight: $heading-font-weight !default
 
 // Quotes
 $quote-font-family: $body-font-family !default
-$quote-size-desktop-short: px2rem(60) !default
-$quote-size-desktop-long: px2rem(40) !default
-$quote-size: px2rem(24) !default
+$quote-size-desktop-short: pxToRem(60) !default
+$quote-size-desktop-long: pxToRem(40) !default
+$quote-size: pxToRem(24) !default
 $quote-line-height: 120% !default
 $quote-weight: normal !default
 $quote-style: italic !default
@@ -142,13 +145,13 @@ $link-transition: text-decoration-color .3s ease !default
 $link-unhover-decoration-color-alpha: 0.3 !default
 
 // Buttons
-$btn-font-size-desktop: px2rem(18) !default // TODO
-$btn-font-size: px2rem(14) !default
+$btn-font-size-desktop: pxToRem(18) !default // TODO
+$btn-font-size: pxToRem(14) !default
 $btn-padding-x-desktop: $spacing1 !default
-$btn-padding-y-desktop: px2rem(15) !default
+$btn-padding-y-desktop: pxToRem(15) !default
 $btn-padding-x: $spacing1 !default
 $btn-padding-y: $spacing0 !default
-$btn-border-radius: px2rem(4) !default
+$btn-border-radius: pxToRem(4) !default
 $btn-border: 1px solid $color-text !default
 $btn-hover-background: $color-background-alt !default
 
@@ -189,8 +192,8 @@ $header-sticky-background: $color-background !default
 $header-sticky-dropdown-background: $header-sticky-background !default
 $header-sticky-color: $header-color !default
 $header-sticky-transition: $header-transition !default
-$header-nav-padding-y: px2rem(20) !default
-$header-nav-padding-y-desktop: px2rem(30) !default
+$header-nav-padding-y: pxToRem(20) !default
+$header-nav-padding-y-desktop: pxToRem(30) !default
 $header-logo-height: 32px !default
 $header-logo-height-desktop: $header-logo-height !default
 $header-height: 87px !default
@@ -207,7 +210,7 @@ $footer-background-color: $color-background-alt !default
 $footer-logo-height: $header-logo-height !default
 $footer-logo-height-desktop: $footer-logo-height !default
 $footer-icons-enabled: true !default
-$footer-icons-size: px2rem(32) !default
+$footer-icons-size: pxToRem(32) !default
 $footer-text-hidden: false !default
 $dropdown-i18n-background-color: $color-background !default
 $dropdown-i18n-color: $color-text !default
@@ -366,20 +369,20 @@ $block-key_figures-number-font-family: $heading-font-family !default
 $block-key_figures-unit-font-weight: normal !default
 $block-key_figures-number-font-weight: bold !default
 
-$block-key_figures-font-size: px2rem(16) !default
-$block-key_figures-number-font-size: px2rem(32) !default
+$block-key_figures-font-size: pxToRem(16) !default
+$block-key_figures-number-font-size: pxToRem(32) !default
 
-$block-key_figures-font-size-desktop: px2rem(18) !default
-$block-key_figures-number-font-size-desktop: px2rem(40) !default
+$block-key_figures-font-size-desktop: pxToRem(18) !default
+$block-key_figures-number-font-size-desktop: pxToRem(40) !default
 
-$block-key_figures-font-size-lg: px2rem(20) !default
-$block-key_figures-number-font-size-lg: px2rem(50) !default
+$block-key_figures-font-size-lg: pxToRem(20) !default
+$block-key_figures-number-font-size-lg: pxToRem(50) !default
 
 $block-key_figures-font-size-xl: $block-key_figures-font-size-lg !default
-$block-key_figures-number-font-size-xl: px2rem(60) !default
+$block-key_figures-number-font-size-xl: pxToRem(60) !default
 
 $block-key_figures-font-size-xxl: $block-key_figures-font-size-xl !default
-$block-key_figures-number-font-size-xxl: px2rem(80) !default
+$block-key_figures-number-font-size-xxl: pxToRem(80) !default
 
 // Block gallery
 $block-gallery-carousel-background: $color-background-alt !default
@@ -393,11 +396,8 @@ $block-image-max-height-without-sidebar: none !default
 $block-video-background: $color-background-alt !default
 
 // Sections
-$article-media-background: color-contrast($color-background, 3%) !default
 $article-media-aspect-ratio: 2 !default
 
-$post-media-background: $article-media-background !default
-$post-categories-color: color-contrast($color-text, 20%) !default
 $post-time-color: $color-text-alt !default
 // Si layout posts grid (ne concerne pas les blocks posts)
 $posts-grid-columns: $block-posts-grid-columns !default
@@ -423,4 +423,4 @@ $icon-burger-margin-right: -12px
 $icon-close-margin-right: -12px
 $icon-toc-margin-right: -14px
 $icon-arrow-previous-margin-left: -22px // cf. testimonial
-$icon-social-margin-right: -14px
\ No newline at end of file
+$icon-social-margin-right: -14px
diff --git a/assets/sass/_theme/_utils.sass b/assets/sass/_theme/_utils.sass
index 0e9fd77345bf757f181cbf8f230ad8f80780306c..0cc7245e2b45e7b22df87f7b716b13b557cf16a0 100644
--- a/assets/sass/_theme/_utils.sass
+++ b/assets/sass/_theme/_utils.sass
@@ -1,474 +1,10 @@
-@function pxToRem($size)
-    $remSize: $size / 16
-    @return #{$remSize}rem
-
-@function px2rem($size)
-    @return pxToRem($size)
-
-$space-unit: 4 !default
-@function space($spaces: 1)
-    @return #{$spaces * $space-unit / 16}rem
-
-@mixin in-page-with-sidebar
-    @include media-breakpoint-up(desktop)
-        body:not(.full-width) &
-            @content
-
-@mixin in-page-without-sidebar
-    @include media-breakpoint-up(desktop)
-        main > .blocks &,
-        body.full-width &,
-            @content
-
-// Use this mixin to override with-aside or without-aside rules
-@mixin in-page-with-or-without-sidebar
-    @include media-breakpoint-up(desktop)
-        body:not(.full-width) &,
-        main > .blocks &,
-        body.full-width &,
-            @content
-
-// Aliases
-@mixin full-page
-    @include in-page-without-sidebar
-        @content
-
-@mixin not-full-page
-    @include in-page-with-sidebar
-        @content
-
-@mixin in-page-program
-    .programs__section &
-        @content
-
-@function half($size)
-    @return calc(#{$size} / 2)
-
-@mixin link($color: $link-color, $unhover_decorated: true)
-    color: $color
-    text-decoration-line: underline
-    text-decoration-thickness: $link-underline-thickness
-    text-underline-offset: $link-underline-offset
-    transition: $link-transition
-    @if $unhover_decorated
-        text-decoration-color: rgba($color, $link-unhover-decoration-color-alpha)
-    @else 
-        text-decoration-color: transparent
-    &:hover
-        text-decoration-color: rgba($color, 1)
-        text-decoration-thickness: $link-underline-thickness
-
-@mixin link-hovered-underline-only
-    &:not(:hover)
-        text-decoration: transparent
-
-@mixin hover-translate-icon($pseudo: after, $distance: 10)
-    &::#{$pseudo}
-        display: inline-block
-        transition: transform 0.55s $arrow-ease-transition
-        transform: translateX(0)
-    &:hover
-        &::#{$pseudo}
-            transform: translateX(#{px2rem($distance)})
-
-@mixin sticky($offset-y: 0)
-    position: sticky
-    top: $offset-y
-    @if $header-sticky-enabled
-        transition: top $header-sticky-transition
-        html:not(.is-scrolling-down) &
-            top: calc(var(--header-height) + #{$offset-y})
-
-// NEW UTILS
-@mixin icon($icon-name: '', $pseudo-element: before, $non-breaking: false)
-    &::#{$pseudo-element}
-        content: map-get($icons, $icon-name)
-        display: inline-block
-        font-family: 'Icon'
-        font-style: normal
-        font-variant: normal
-        font-weight: normal
-        line-height: 1
-        speak: never
-        text-transform: none
-        vertical-align: middle
-        @if $non-breaking
-            content: " #{map-get($icons, $icon-name)}"
-            display: inline
-        @content // TODO : important de documenter ça
-
-@mixin icon-block($icon-name: '', $pseudo-element: before, $non-breaking: false)
-    @include icon($icon-name, $pseudo-element, $non-breaking)
-        font-size: 44px
-        display: inline
-        @content
-
-@mixin container
-    margin-left: auto
-    margin-right: auto
-    max-width: $grid-max-width
-    padding-left: half($grid-gutter-sm)
-    padding-right: half($grid-gutter-sm)
-    width: 100%
-    @include media-breakpoint-up(desktop)
-        padding-left: $grid-gutter
-        padding-right: $grid-gutter
-
-@mixin grid($cols: 12, $breakpoint: false, $gap-y: $grid-gutter, $gap-x: $grid-gutter)
-    word-break: break-word
-    @if $breakpoint
-        @include media-breakpoint-up($breakpoint)
-            display: grid
-            grid-gap: $gap-y $gap-x
-            grid-template-columns: repeat($cols, 1fr)
-    @else
-        display: grid
-        grid-gap: $gap-y $gap-x
-        grid-template-columns: repeat($cols, 1fr)
-    @include media-breakpoint-down(desktop)
-        grid-gap: $grid-gutter-sm
-
-// This must be used for content inside columns
-@function col($quantity, $base: 12)
-    $quantity-on-base: $quantity / $base * 12
-    $width: calc( (100% + #{$grid-gutter}) / 12 * #{$quantity-on-base} - #{$grid-gutter} )
-    @return #{$width}
-
-// This must be used for offset, outside columns
-@function offset($quantity, $base: 12)
-    $quantity-on-base: $quantity / $base * 12
-    $width: calc( (100% + #{$grid-gutter}) / 12 * #{$quantity-on-base} )
-    @return #{$width}
-
-// This must be used for offset, inside columns
-@function col-offset($quantity, $base: 12)
-    $quantity-on-base: $quantity / $base * 12
-    $width: calc( (100% + #{$grid-gutter}) / 12 * #{$quantity-on-base} + #{$grid-gutter})
-    @return #{$width}
-
-@function col-outside-container($quantity, $base: 12)
-    $responsive-grid-width: Min(100vw, (#{$grid-max-width}))
-    @return calc((#{$responsive-grid-width} + #{$grid-gutter} * 2) / #{$base} * #{$quantity} - #{$grid-gutter} * 2)
-
-@function container-margin-x
-    @return Max(#{$grid-gutter}, calc(50vw - #{$grid-max-width} / 2 + #{$grid-gutter}))
-
-@mixin container-margin-left
-    margin-left: container-margin-x()
-
-@mixin container-margin-right
-    margin-right: container-margin-x()
-
-@mixin stretched-link($pseudo-element: after)
-    &::#{$pseudo-element}
-        bottom: 0
-        content: ''
-        left: 0
-        position: absolute
-        right: 0
-        top: 0
-        z-index: $zindex-stretched-link
-
-@mixin aspect-ratio($ratio, $selector: 'iframe', $background: false)
-    @if $background
-        aspect-ratio: #{$ratio}
-        background: $background
-    #{$selector}
-        aspect-ratio: #{$ratio}
-        display: block
-        width: 100%
-
-@mixin handle-svg-fit
-    picture.is-svg
-        img
-            object-fit: contain
-
-@mixin article($background: null)
-    position: relative
-    display: flex
-    flex-direction: column
-    .media
-        @include handle-svg-fit
-        margin-bottom: $spacing1
-        order: -1
-        overflow: hidden
-        img
-            display: block
-            object-fit: cover
-            @if $article-media-aspect-ratio
-                aspect-ratio: $article-media-aspect-ratio
-    h2, h3, [itemprop=headline]
-        @include h3
-        a
-            display: block
-            @include stretched-link
-            text-decoration: none
-    p + time
-            margin-top: $spacing0
-    time
-        @include meta
-        color: $color-text-alt
-        display: block
-
-@mixin post-time-author-flex
-    .post-meta
-        display: flex
-        flex-wrap: wrap
-    .post-author p::before
-        content: ' • '
-
-
-@mixin list-section
-    @include list-reset
-    > li
-        border-bottom: 1px solid $color-border
-        padding-bottom: $spacing1
-        padding-top: $spacing1
-        position: relative
-        > .title
-            @include h2
-            transition: color 0.55s
-            @include media-breakpoint-down(desktop)
-                @include icon(arrow-right, after, true)
-                    bottom: $spacing0
-                    position: absolute
-                    right: 0
-            @include media-breakpoint-up(desktop)
-                @include arrow-right-hover
-                display: block
-                &::after
-                    transform: translateX(0)
-                    position: relative
-                &:hover
-                    &::after
-                        transform: translateX($spacing0)
-        a
-            text-decoration: none
-            &:hover
-                color: $color-accent
-
-        @include media-breakpoint-down(desktop)
-            a:nth-child(2)
-                margin-top: calc(#{$spacing0} / 2)
-            a, p
-                display: block
-        @include media-breakpoint-up(desktop)
-            align-items: baseline
-            display: flex
-            justify-content: space-between
-            
-
-@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
-
-@mixin button-reset
-    appearance: none
-    background: transparent
-    border: none
-    border-radius: 0
-    cursor: pointer
-    user-select: none
-    &:active,
-    &:focus
-        box-shadow: inset 0 0 0 0.25rem rgba($color-text, 0.25)
-        // TODO : vérifier si l'outline 0 est vraiment nécessaire
-        // outline: 0
-
-@mixin list-reset
-    list-style: none
-    padding-left: 0
-    margin-bottom: 0
-    margin-top: 0
-
-@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
-        top: $top
-
-@function color-contrast($color, $amount)
-    @if lightness($color) > 50%
-        $amount: $amount * -1
-    @return scale-color($color, $lightness: $amount)
-
-@mixin button-icon($icon: false)
-    @include button-reset
-    line-height: $body-line-height
-    border: 1px solid $hero-color
-    padding: half($spacing0) $spacing1
-    white-space: nowrap
-    @if $icon
-        @include icon-block($icon, after)
-
-@mixin text-underline
-    text-decoration-color: $color-border
-    text-decoration-line: underline
-    text-decoration-thickness: 1px
-    text-underline-offset: 3px
-    text-decoration-line: underline
-
-@mixin arrow-right-hover
-    position: relative
-    display: flex
-    justify-content: space-between
-    align-items: center
-    @include icon(arrow, after)
-        opacity: 0
-        transform: translateX(-20px)
-        transition: 0.55s $arrow-ease-transition
-        position: absolute
-        right: 0
-    &:hover
-        &:after
-            opacity: 1
-            transform: translateX(0)
-
-@mixin top-flex
-    @include in-page-without-sidebar
-        align-items: baseline
-        display: flex
-        .block-title
-            width: col(4)
-            &:not(.hidden) + .description
-                margin-left: $grid-gutter
-        .description
-            margin-top: 0
-            width: col(8)
-
-@mixin collapsed-figcaption
-    figcaption
-        @include meta
-        color: $color-text-alt
-        position: absolute
-        display: block
-        left: 0
-        right: 0
-        text-align: right
-        z-index: 10
-        &::before
-            @include meta
-            content: '©'
-            position: absolute
-            right: 0
-            top: 0
-            background: $hero-background-color
-            text-align: center
-            padding: half($spacing0)
-            display: block
-        .credit-content
-            @include meta
-            background: $hero-background-color
-            display: none
-            padding: half($spacing0)
-            padding-right: $spacing1
-        a
-            color: inherit
-            text-decoration-color: inherit
-        &:focus
-            .credit-content
-                display: block
-        @include media-breakpoint-up(desktop)
-            &:before
-                padding-right: 0
-        @include media-breakpoint-down(desktop)
-            position: relative
-            background: $color-background
-            &::before
-                background: transparent
-            .credit-content
-                display: block
-                background: transparent
-                position: relative
-
-    &:hover
-        figcaption .credit-content
-            display: block
-
-@mixin dropdown-i18n
-    position: relative
-    .dropdown-menu
-        margin-top: $header-nav-padding-y
-        padding-left: $spacing1
-        padding-bottom: $spacing0
-        padding-top: $spacing0
-        padding-right: $spacing1
-        right: 0
-    li a
-        padding-bottom: half($spacing0)
-        padding-top: half($spacing0)
-        display: block
-        &.is-checked
-            display: flex
-            justify-content: space-between
-            align-items: center
-            gap: $spacing2
-            text-decoration: none !important
-            @include icon(caret, after)
-                transform: rotate(-14deg) skewX(-30deg)
-
-// https://gist.github.com/jonathantneal/d0460e5c2d5d7f9bc5e6
-@function str-replace($string, $search, $replace: "")
-	$index: str-index($string, $search)
-	@if $index
-		@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
-	@return $string
-    
-@mixin font-face($name, $path, $weight: 400, $style: normal, $exts: (eot woff2 woff ttf svg))
-  $src: null
-
-  $extmods: (eot:"?", svg:"#" + str-replace($name," ","_"))
-  $formats: (otf: "opentype", ttf: "truetype")
-
-  @each $ext in $exts
-    $extmod: if(map-has-key($extmods, $ext), $ext + map-get($extmods, $ext), $ext)
-    $format: if(map-has-key($formats, $ext), map-get($formats, $ext), $ext)
-    $src: append($src, url(quote("/assets/fonts/" + $path + "." + $extmod)) format(quote($format)), comma,)
-
-  @font-face
-    font-family: quote($name)
-    font-style: $style
-    font-weight: $weight
-    font-display: swap
-    src: $src
-
-@mixin sidebar($side: start)
-    @include media-breakpoint-down(desktop)
-        padding: 0 half($grid-gutter-sm)
-        margin-bottom: $spacing3
-    @include media-breakpoint-up(desktop)
-        @if $side == start
-            @include container-margin-left
-            left: 0
-        @else
-            @include container-margin-right
-            right: 0
-        margin-top: 0
-        top: 0
-        height: 100%
-        position: absolute
-        width: col-outside-container(4)
-        & > div
-            @include sticky($spacing1)
-        .toc-container
-            border-top: 1px solid $color-border
-            padding-top: $spacing1
-            position: static
-            margin-left: 0
-
-// Old browsers support
-
-@mixin browser-under-safari-16
-    @media not all and (min-resolution:.001dpcm) 
-            @supports (-webkit-appearance:none) and (display:flow-root)
-                @content
\ No newline at end of file
+@import utils/fonts
+@import utils/grid
+@import utils/icons
+@import utils/links
+@import utils/media
+@import utils/normalize
+@import utils/sidebar
+@import utils/sizes
+
+@import utils/shame
diff --git a/assets/sass/_theme/_variables.sass b/assets/sass/_theme/_variables.sass
new file mode 100644
index 0000000000000000000000000000000000000000..ac0f8878e8d57e67a89d214f0415943124eb414e
--- /dev/null
+++ b/assets/sass/_theme/_variables.sass
@@ -0,0 +1,24 @@
+\:root
+  // Largeur maximum de la grille définie dans _configuration.sass
+  --grid-max-width: #{$grid-max-width}
+
+  // Largeur de la grille
+  // Elle inclut les gouttières extérieures
+  // Si la largeur de l'écran est inférieure à 1980px, on prend la largeur totale.
+  // La grille n'est jamais plus grande que 1980px
+  --grid-width: Min(var(--grid-max-width), 100vw)
+
+  // Largeur d'une colonne
+  // On soustrait à la largeur de la grille les 13 gouttières (les 2 extérieures et les 11 intérieures), puis on divise par 12
+  --column-width: calc( (var(--grid-width) - var(--grid-gutter) * 13) / 12)
+
+  // Taille de la gouttière
+  // Les largeurs des gouttières en fonction des breakpoints sont définies dans _configuration.sass
+  --grid-gutter: #{$grid-gutter}
+  --grid-gutter-negative: #{-$grid-gutter}
+  @include media-breakpoint-up(lg)
+    --grid-gutter: #{$grid-gutter-lg}
+    --grid-gutter-negative: #{-$grid-gutter-lg}
+  @include media-breakpoint-up(xxl)
+    --grid-gutter: #{$grid-gutter-xxl}
+    --grid-gutter-negative: #{-$grid-gutter-xxl}
diff --git a/assets/sass/_theme/blocks/base.sass b/assets/sass/_theme/blocks/base.sass
index 0adf48cef3fa0d87d9645aeae2ab83934847f5d5..a72a85a8bd6d6e21c4126a0688a95da7b0445b18 100644
--- a/assets/sass/_theme/blocks/base.sass
+++ b/assets/sass/_theme/blocks/base.sass
@@ -17,7 +17,7 @@
             margin-top: $spacing4
     @include in-page-without-sidebar
         h2
-            width: col(8)
+            width: columns(8)
 
 // Specific
 $backgrounded_blocks: ".block-call_to_action, .block-chapter--accent_background, .block-chapter--alt_background, .block-timeline--horizontal, .block-pages--cards"
diff --git a/assets/sass/_theme/blocks/call_to_action.sass b/assets/sass/_theme/blocks/call_to_action.sass
index 2d7fab7c6992e13a1166ae233a9bb2089889cd68..7e87b19fd439b89c0ef44edd04e598aed670f9ad 100644
--- a/assets/sass/_theme/blocks/call_to_action.sass
+++ b/assets/sass/_theme/blocks/call_to_action.sass
@@ -62,7 +62,7 @@
                     &:last-child
                         margin-bottom: 0
         .call_to_action--with-image
-            padding-top: half($grid-gutter-sm)
+            padding-top: var(--grid-gutter)
             display: flex
             flex-direction: column
             > *
@@ -80,7 +80,7 @@
             > div
                 // TODO : simplifier l'application d'une couleur de fond sur le CTA avec sidebar et sans sidebar
                 background-color: var(--cta-background-color)
-                padding: $grid-gutter col(1, 8)
+                padding: var(--grid-gutter) columns(1)
                 width: 100%
                 position: relative
                 &::after
@@ -91,27 +91,28 @@
                     top: 0
                     bottom: 0
                     left: 100%
-                    width: Max(#{$grid-gutter}, calc(50vw - #{half($grid-max-width)} + #{$grid-gutter}))
+                    // Calcul de la largeur nécessaire pour remplir l'espace droit entre le container et le bord droit de la fenêtre
+                    width: grid-external-space()
             &--with-image
                 picture
                     order: 1
-                    padding-left: col(1, 8)
-                    padding-right: offset(4, 8)
+                    padding-left: columns(1)
+                    padding-right: offset(4)
                     position: relative
                     z-index: 2
                     img
-                        margin-bottom: calc(-#{$grid-gutter} + -#{$spacing1})
+                        margin-bottom: calc(var(--grid-gutter-negative) + -#{$spacing1})
                 > div
-                    padding-top: calc(#{$grid-gutter} + #{$spacing3})
+                    padding-top: calc(var(--grid-gutter) * 2 + #{$spacing1})
 
     @include in-page-without-sidebar
         background-color: var(--cta-background-color)
         padding-top: 0
         padding-bottom: 0
         .block-content
-            padding: $spacing4 $grid-gutter
-            margin-left: -$grid-gutter
-            margin-right: -$grid-gutter
+            padding: $spacing4 var(--grid-gutter)
+            margin-left: var(--grid-gutter-negative)
+            margin-right: var(--grid-gutter-negative)
         .call_to_action--with-image
             @include grid
             > div
diff --git a/assets/sass/_theme/blocks/chapter.sass b/assets/sass/_theme/blocks/chapter.sass
index e5c0f3a3767e84344f5eba3195c3b20e0548bf38..991e0134ad935cf45e5b399beef029557869922b 100644
--- a/assets/sass/_theme/blocks/chapter.sass
+++ b/assets/sass/_theme/blocks/chapter.sass
@@ -31,56 +31,57 @@
             a
                 @include link($block-chapter-layout-accent-color)
 
-    &--alt_background, &--accent_background
+    &--alt_background, 
+    &--accent_background
         margin-bottom: 0
-        + .block-chapter--alt_background, + .block-chapter--accent_background
+        + .block-chapter--alt_background, 
+        + .block-chapter--accent_background
             margin-top: 0
 
     @include media-breakpoint-down(desktop)
-        &--alt_background, &--accent_background
-            padding-top: $grid-gutter
-            padding-bottom: $grid-gutter
-
-        &--with-image
-            &.block-chapter--alt_background, &.block-chapter--accent_background
-                padding-top: half($grid-gutter-sm)
+        &--alt_background,
+        &--accent_background
+            padding-top: var(--grid-gutter)
+            padding-bottom: var(--grid-gutter)
 
     @include in-page-with-sidebar
         figure
-            max-width: col(6, 8)
+            max-width: columns(6)
             &.image-portrait,
             &.image-square
-                max-width: col(4, 8)
-        &--alt_background, &--accent_background
+                max-width: columns(4)
+        &--alt_background,
+        &--accent_background
             background: none
             padding-bottom: 0
             padding-top: 0
             .chapter .text
-                padding: $grid-gutter
+                padding: var(--grid-gutter)
             figure
                 margin-bottom: 0
                 figcaption
-                    padding-left: $grid-gutter
-
+                    padding-left: var(--grid-gutter)
         &--alt_background
             .chapter
                 background: $block-chapter-layout-alt-background
         &--accent_background
             .chapter
                 background: $block-chapter-layout-accent-background
+
     @include in-page-without-sidebar
-        &--alt_background, &--accent_background
-            padding-top: $grid-gutter
-            padding-bottom: $grid-gutter
+        &--alt_background, 
+        &--accent_background
+            padding-top: var(--grid-gutter)
+            padding-bottom: var(--grid-gutter)
             margin-bottom: 0
         .chapter
             flex-direction: row
+            justify-content: space-between
             .text
                 order: 0
-                width: col(7)
+                width: columns(7)
             figure
-                width: col(4)
-                margin-left: col-offset(1)
+                width: columns(4)
                 margin-bottom: 0
                 text-align: right
                 img
diff --git a/assets/sass/_theme/blocks/contact.sass b/assets/sass/_theme/blocks/contact.sass
index be14a1d894192873ea9c494d5fc8827fec3a18fc..5c66c9c44768da4e0396d60f9486f9bf9d0d3118 100644
--- a/assets/sass/_theme/blocks/contact.sass
+++ b/assets/sass/_theme/blocks/contact.sass
@@ -47,7 +47,7 @@
     time + time
         @include icon(arrow-right, before)
             display: inline-block
-            padding: 0 px2rem(7) 0 px2rem(3)
+            padding: 0 pxToRem(7) 0 pxToRem(3)
 
     @include in-page-without-sidebar
         .top
@@ -56,9 +56,9 @@
             display: flex
             margin-top: 0
             address
-                width: col(4)
+                width: columns(4)
                 margin-top: 0
             ul
                 margin-top: 0
-                width: col(8)
-                margin-left: $grid-gutter
\ No newline at end of file
+                width: columns(8)
+                margin-left: var(--grid-gutter)
\ No newline at end of file
diff --git a/assets/sass/_theme/blocks/datatable.sass b/assets/sass/_theme/blocks/datatable.sass
index e3eb5c243aa22ac9c4cc5aa6daa7c52244ca8cb2..f78c8467cdd427330534b032389d4cf066efc8fa 100644
--- a/assets/sass/_theme/blocks/datatable.sass
+++ b/assets/sass/_theme/blocks/datatable.sass
@@ -6,4 +6,4 @@
     @include media-breakpoint-up(desktop)
         .top
             p
-                width: col(8)
+                width: columns(8)
diff --git a/assets/sass/_theme/blocks/definitions.sass b/assets/sass/_theme/blocks/definitions.sass
index ff72015af4391988e8d0e72ea05d975246255ca2..c223c229634674574071af2882ad337d83e11ea9 100644
--- a/assets/sass/_theme/blocks/definitions.sass
+++ b/assets/sass/_theme/blocks/definitions.sass
@@ -36,6 +36,6 @@
         .definitions
             details
                 p
-                    padding-left: col(4)
-                    margin-left: $grid-gutter
+                    padding-left: columns(4)
+                    margin-left: var(--grid-gutter)
 
diff --git a/assets/sass/_theme/blocks/features.sass b/assets/sass/_theme/blocks/features.sass
index b225b1b586cafe45a591b72154af8ab8fba7924d..52b9a2dc838308e339102931e60f37a64c09a706 100644
--- a/assets/sass/_theme/blocks/features.sass
+++ b/assets/sass/_theme/blocks/features.sass
@@ -22,13 +22,13 @@
         li
             flex-direction: row
             figure
-                width: calc(#{col(2, 8)} + #{half($grid-gutter)})
+                width: calc(#{columns(2)} + #{half(var(--grid-gutter))})
                 flex-shrink: 0
-                margin-right: half($grid-gutter)
+                margin-right: half(var(--grid-gutter))
 
     @include in-page-without-sidebar
         .top
-            width: col(8)
+            width: columns(8)
         ul
             @include list-reset
             @include grid(3, desktop)
diff --git a/assets/sass/_theme/blocks/files.sass b/assets/sass/_theme/blocks/files.sass
index f890850fd3f325ead5e1f66abe9cdb3f12002193..0e67ef0082fd027e6608f43bb039151b98de7504 100644
--- a/assets/sass/_theme/blocks/files.sass
+++ b/assets/sass/_theme/blocks/files.sass
@@ -13,11 +13,11 @@
                 border: 1px solid $color-border
                 display: flex
                 flex-shrink: 0
-                height: px2rem(60)
+                height: pxToRem(60)
                 justify-content: center
                 margin-right: $spacing0
                 transition: background 0.3s ease, border 0.3s ease
-                width: px2rem(60)
+                width: pxToRem(60)
             &:hover
                 &::before
                     background-color: $color-text
@@ -41,8 +41,8 @@
 
     @include in-page-with-sidebar
         .files
-            @include grid(2, desktop, half($grid-gutter))
+            @include grid(2, desktop, half(var(--grid-gutter)))
 
     @include in-page-without-sidebar
         .files
-            @include grid(3, desktop, half($grid-gutter))
+            @include grid(3, desktop, half(var(--grid-gutter)))
diff --git a/assets/sass/_theme/blocks/gallery.sass b/assets/sass/_theme/blocks/gallery.sass
index 609e87c3552240b2c451940e187cc179d2b39877..fcfe8f48c6d14853e12d20c9de0045e888f46575 100644
--- a/assets/sass/_theme/blocks/gallery.sass
+++ b/assets/sass/_theme/blocks/gallery.sass
@@ -30,40 +30,30 @@
 
     &--grid
         .gallery
-            align-items: baseline
             @include in-page-with-sidebar
-                @include grid(3, desktop, half($grid-gutter), half($grid-gutter))
+                @include flexbox-grid(2)
             @include in-page-without-sidebar
-                @include grid(4, desktop)
+                @include flexbox-grid(4)
             @include media-breakpoint-down(desktop)
-                @include grid(2)
-                grid-gap: half($grid-gutter-sm) !important
+                @include flexbox-grid(2)
             &--with-text
                 @include in-page-without-sidebar
-                    @include grid(4, desktop, $spacing0)
+                    @include flexbox-grid(4)
                 figure
-                    display: grid
-                    grid-template-columns: subgrid
+                    display: flex
+                    flex-direction: column
                     gap: space(3)
-                    figcaption
-                        &::after
-                            content: ' '
     &--carousel
         overflow: hidden
         position: relative
         z-index: 0
         @include in-page-without-sidebar
             background: $block-gallery-carousel-background
-            padding-bottom: $grid-gutter
-            padding-top: $grid-gutter
+            padding-bottom: var(--grid-gutter)
+            padding-top: var(--grid-gutter)
         .block-gallery + &,
         .block-pages--cards + &
             margin-top: 0
-        .container
-            .top
-                padding-right: half($grid-gutter-sm)
-                @include media-breakpoint-up(desktop)
-                    padding-right: half($grid-gutter)
         .splide
             display: flex
             flex-direction: column
@@ -73,7 +63,7 @@
                         opacity: 0.1
             &__track
                 overflow: visible
-                margin-right: half(-$grid-gutter-sm)
+                margin-right: half(var(--grid-gutter-negative))
                 @include in-page-with-sidebar
                     .splide__slide
                         transition: opacity  .3s ease
@@ -83,13 +73,13 @@
                         &.is-active
                             opacity: 1
                 @include media-breakpoint-up(desktop)
-                    margin-right: half(-$grid-gutter)
+                    margin-right: half(var(--grid-gutter-negative))
             &__slide
                 flex-shrink: initial
                 &:last-child
                     padding-right: 20%
             figure
-                margin-right: half($grid-gutter)
+                margin-right: half(var(--grid-gutter))
                 @include media-breakpoint-down(desktop)
                     display: flex
                     flex-direction: column
@@ -100,7 +90,7 @@
                         max-height: $block-gallery-carousel-max-height
                         width: auto
                         height: auto
-                        max-width: calc(100vw - #{$grid-gutter-sm} * 2)
+                        max-width: calc(100vw - #{var(--grid-gutter)} * 2)
                         @include media-breakpoint-up(desktop)
                             height: $block-gallery-carousel-max-height
                             width: auto
@@ -111,7 +101,7 @@
                         margin-top: space(2)
 
             &__arrows
-                margin-left: px2rem(-18)
+                margin-left: pxToRem(-18)
                 order: 2
                 @media (min-height: 800px)
                     padding-top: space(10)
@@ -132,10 +122,10 @@
         @include in-page-without-sidebar
             .splide
                 figure
-                    margin-left: $grid-gutter
-                    margin-right: half(-$grid-gutter)
+                    margin-left: var(--grid-gutter)
+                    margin-right: half(var(--grid-gutter-negative))
                 &__slide
                     &:first-child
-                        margin-left: $grid-gutter
+                        margin-left: var(--grid-gutter)
                 &__track
-                    margin-left: -$grid-gutter
\ No newline at end of file
+                    margin-left: var(--grid-gutter-negative)
\ No newline at end of file
diff --git a/assets/sass/_theme/blocks/image.sass b/assets/sass/_theme/blocks/image.sass
index 926546d7722e4d1c75efd20b72747fd535d9e3ce..9990ec4281e2b829888feea7e3c30a7f2295a19a 100644
--- a/assets/sass/_theme/blocks/image.sass
+++ b/assets/sass/_theme/blocks/image.sass
@@ -15,13 +15,13 @@
                 @include meta
     picture
         display: block
-        margin-left: half(-$grid-gutter-sm)
-        margin-right: half(-$grid-gutter-sm)
+        margin-left: var(--grid-gutter-negative)
+        margin-right: var(--grid-gutter-negative)
 
     @include in-page-with-sidebar
         picture
             margin-left: 0
-            margin-right: -$grid-gutter
+            margin-right: var(--grid-gutter-negative)
         img
             max-height: $block-image-max-height-with-sidebar
             width: auto
@@ -38,27 +38,27 @@
                 position: relative
                 .top
                     position: absolute
-                    width: col(5)
+                    width: columns(5)
             figure
                 display: flex
                 align-items: flex-end
                 > a 
-                    width: col(7)
-                    margin-left: half($grid-gutter)
+                    width: columns(7)
+                    margin-left: half(var(--grid-gutter))
                     display: block
                     order: 2
                 picture
                     margin-left: 0
-                    margin-right: -$grid-gutter
+                    margin-right: var(--grid-gutter-negative)
                 figcaption
-                    width: calc(#{col(5)} + #{$grid-gutter} / 2)
+                    width: calc(#{columns(5)} + var(--grid-gutter) / 2)
                     order: 1
                     display: block
                     text-align: right
         &.image-landscape
             picture
-                margin-left: -$grid-gutter
-                margin-right: -$grid-gutter
+                margin-left: var(--grid-gutter-negative)
+                margin-right: var(--grid-gutter-negative)
                 @media screen and (min-width: $grid-max-width)
                     margin-left: 0
                     margin-right: 0
@@ -67,7 +67,7 @@
                 justify-content: space-between
                 align-items: baseline
                 p
-                    max-width: col(8)
+                    max-width: columns(8)
                 *
                     flex: 1 1
                 .credit
diff --git a/assets/sass/_theme/blocks/organizations.sass b/assets/sass/_theme/blocks/organizations.sass
index 65dec22e92c5078680cd5d1b8a3c1160c86493ad..2622200e6fae885450393397c2936885b50d989a 100644
--- a/assets/sass/_theme/blocks/organizations.sass
+++ b/assets/sass/_theme/blocks/organizations.sass
@@ -38,11 +38,11 @@
             @include grid(2, md)
             @include grid(3, lg)
             @include grid(4, xl)
-            grid-column-gap: half($grid-gutter)
+            grid-column-gap: half(var(--grid-gutter))
 
     @include in-page-without-sidebar
         .top .description
-            max-width: col(8)
+            max-width: columns(8)
         .map
-            margin-left: -$grid-gutter
-            margin-right: -$grid-gutter
+            margin-left: var(--grid-gutter-negative)
+            margin-right: var(--grid-gutter-negative)
diff --git a/assets/sass/_theme/blocks/pages.sass b/assets/sass/_theme/blocks/pages.sass
index 74ec85e673490317a52fe47b3521bfc13d7811db..aab5a5fb0348f4c93e1080d0ef459f422abc21bd 100644
--- a/assets/sass/_theme/blocks/pages.sass
+++ b/assets/sass/_theme/blocks/pages.sass
@@ -58,14 +58,14 @@
             .grid
                 @include grid(2, desktop)
                 @include in-page-with-sidebar
-                    grid-column-gap: half($grid-gutter) !important
+                    grid-column-gap: half(var(--grid-gutter)) !important
                 @include in-page-without-sidebar
                     @include grid(3, desktop)
 
     &--cards
         background-color: $block-pages-card-background
-        padding-bottom: $grid-gutter
-        padding-top: $grid-gutter
+        padding-bottom: var(--grid-gutter)
+        padding-top: var(--grid-gutter)
         *:not(.heading) + &
             margin-top: 0
         .blocks &:last-of-type
@@ -75,7 +75,7 @@
         .cards
             @include grid(2, desktop)
             @include in-page-with-sidebar
-                grid-gap: half($grid-gutter) !important
+                grid-gap: half(var(--grid-gutter)) !important
             @include in-page-without-sidebar
                 @include grid(3, desktop)
         // TODO: move this //
@@ -156,9 +156,9 @@
         @include media-breakpoint-up(desktop)
             ul:not(.title-only)
                 li + li
-                    margin-top: $grid-gutter
+                    margin-top: var(--grid-gutter)
                 article
-                    gap: $grid-gutter
+                    gap: var(--grid-gutter)
                     flex-direction: row
                     .media
                         flex-shrink: 0
@@ -172,17 +172,17 @@
                 ul.title-only
                     @include grid(2, desktop)
                     grid-row-gap: $spacing0 !important
-                    grid-column-gap: half($grid-gutter) !important
+                    grid-column-gap: half(var(--grid-gutter)) !important
                     li
                         margin-top: 0
                         a
                             @include meta
                 article
-                    gap: half($grid-gutter)
+                    gap: half(var(--grid-gutter))
                     .media
-                        width: calc(#{col(2, 8)} + #{half($grid-gutter)})
+                        width: calc(#{columns(2)} + #{half(var(--grid-gutter))})
                     .page-content
-                        width: col(6, 8)
+                        width: columns(6)
 
         @include in-page-without-sidebar
             .block-title
@@ -194,9 +194,9 @@
                         @include h2
             article
                 .media
-                    width: col(4)
+                    width: columns(2)
                 .page-content
-                    width: col(8)
+                    width: columns(4)
             &:not(.with-description)
                 ul.title-only
                     @include grid(4, desktop, space(2))
@@ -210,7 +210,7 @@
             &.with-description
                 .block-content
                     @include grid(12, desktop, $spacing2)
-                    row-gap: half($grid-gutter)
+                    row-gap: half(var(--grid-gutter))
                     .top
                         align-items: initial
                         grid-column: 1 / 8
@@ -247,7 +247,7 @@
                 aspect-ratio: unset
         @include media-breakpoint-up(desktop)
             article
-                width: col(4, 8)
+                width: columns(4)
                 &:not(:first-child)
                     margin-top: -5%
                 &:nth-child(even)
@@ -263,11 +263,11 @@
                 .description
                     @include body-text
             .grid
-                width: col(10)
+                width: columns(10)
                 margin-left: auto
                 margin-right: auto
                 article
-                    width: col(4, 10)
+                    width: columns(4)
     &--large
         .top
             @include top-flex
@@ -279,7 +279,7 @@
                 @include icon(arrow, after, true)
                 @include hover-translate-icon(after)
             &:hover .more:after
-                transform: translateX(#{px2rem(10)})
+                transform: translateX(#{pxToRem(10)})
             &-title a    
                 @include stretched-link
             .media
@@ -288,7 +288,7 @@
         @include media-breakpoint-up(desktop)
             .page
                 flex-direction: row
-                gap: $grid-gutter
+                gap: var(--grid-gutter)
 
         @include in-page-with-sidebar
             .page
@@ -309,6 +309,6 @@
                     @include lead
                     margin-bottom: space(4)
                 &-content
-                    width: col(5)
+                    width: columns(5)
                 .media 
-                    width: col(6)
+                    width: columns(6)
diff --git a/assets/sass/_theme/blocks/persons.sass b/assets/sass/_theme/blocks/persons.sass
index f207f5f00be30093d58fd6eb360cfdd9df247895..16a79536ee9c2b8ee74eeacc738186c9ba3f4933 100644
--- a/assets/sass/_theme/blocks/persons.sass
+++ b/assets/sass/_theme/blocks/persons.sass
@@ -4,7 +4,7 @@
     gap: $spacing1
     .avatar
         margin-right: 0
-        width: col(4)
+        width: columns(4)
     .description
         margin-top: $spacing1
         text-align: left
@@ -21,7 +21,7 @@
                 @include grid(2)
                 article
                     .avatar
-                        width: col(1.5, 4)
+                        width: columns(1.5)
                     .description
                         margin-top: $spacing0
         article
@@ -29,10 +29,10 @@
             gap: $spacing1
             @include media-breakpoint-up(md)
                 .avatar
-                    width: col(2, 8)
+                    width: columns(2)
     @include in-page-without-sidebar
         .top .description
-            max-width: col(8)
+            max-width: columns(8)
         &.block-with-long-text
             .persons
                 @include grid(2)
diff --git a/assets/sass/_theme/blocks/posts.sass b/assets/sass/_theme/blocks/posts.sass
index b8446feb0a92620c17d581cc84bfecc9cdb3a797..5b2d959cf486b548dcad6abc47944bdc3819c4ee 100644
--- a/assets/sass/_theme/blocks/posts.sass
+++ b/assets/sass/_theme/blocks/posts.sass
@@ -26,7 +26,7 @@
                 margin-top: $spacing3
         @include in-page-with-sidebar
             .grid
-                @include grid(2, desktop, $grid-gutter, half($grid-gutter))
+                @include grid(2, desktop, var(--grid-gutter), half(var(--grid-gutter)))
         @include in-page-without-sidebar
             .grid
                 @include grid($block-posts-grid-columns)
@@ -60,7 +60,7 @@
             .large
                 .post
                     flex-direction: row
-                    gap: half($grid-gutter)
+                    gap: half(var(--grid-gutter))
                     + .post
                         margin-top: $spacing2
                     p[itemprop="articleBody"]
@@ -100,15 +100,15 @@
                     @include media-breakpoint-up(xl)
                         .media,
                         .post-content
-                            width: calc(#{col(4, 8)} + #{half($grid-gutter)})
+                            width: calc(#{columns(4)} + #{half(var(--grid-gutter))})
         @include in-page-without-sidebar
             .large
                 .post
-                    gap: $grid-gutter
+                    gap: var(--grid-gutter)
                     .media
-                        width: col(6)
+                        width: columns(6)
                     .post-content
-                        width: col(5)
+                        width: columns(5)
                 p[itemprop="articleBody"]
                     margin-top: calc(#{$spacing1} + #{$spacing0})
     &--list
@@ -151,21 +151,21 @@
                 + article
                     margin-top: $spacing1
                 .media
-                    width: calc(#{col(2, 8)} + #{half($grid-gutter)})
+                    width: calc(#{columns(2)} + #{half(var(--grid-gutter))})
                 .post-content
-                    width: col(6, 8)
-                    margin-left: half($grid-gutter)
+                    width: columns(6)
+                    margin-left: half(var(--grid-gutter))
 
         @include in-page-without-sidebar
             article
                 border-bottom: 1px solid $color-border
-                gap: $grid-gutter
+                gap: var(--grid-gutter)
                 padding-bottom: $spacing3
                 position: relative
                 .media
-                    width: col(3)
+                    width: columns(3)
                 .post-content
-                    width: col(6)
+                    width: columns(6)
                 + article
                     margin-top: $spacing3
                 .post-meta
@@ -215,11 +215,11 @@
                 .post
                     flex-direction: row
                     .media
-                        width: calc(#{col(3, 8)} + #{half($grid-gutter)})
+                        width: calc(#{columns(3)} + #{half(var(--grid-gutter))})
                         margin-bottom: 0
                     .post-content
-                        width: col(5, 8)
-                        margin-left: half($grid-gutter)
+                        width: columns(5)
+                        margin-left: half(var(--grid-gutter))
             .list
                 article
                     @include grid(8, desktop, 0, 0)
@@ -277,14 +277,14 @@
 
         @include in-page-with-sidebar
             .post
-                width: col(4,8)
+                width: columns(4)
 
         @include in-page-without-sidebar
-            width: col(10)
+            width: columns(10)
             margin-left: auto
             margin-right: auto
             .post
-                width: col(4, 10)
+                width: columns(4)
 
 // Move this part to blocks/categories when categories block is ready
 .block-posts
diff --git a/assets/sass/_theme/blocks/testimonials.sass b/assets/sass/_theme/blocks/testimonials.sass
index 338da01140524b2eae8277d0e7fa6c5559f939cf..738dfff3af7f61ed79e63f81ad0759a9e98b22b0 100644
--- a/assets/sass/_theme/blocks/testimonials.sass
+++ b/assets/sass/_theme/blocks/testimonials.sass
@@ -8,7 +8,7 @@
             font-style: $block-testimonials-style
             color: $block-testimonials-color
             @include media-breakpoint-up(desktop)
-                font-size: px2rem(30) // TODO : on peut peut-être la sortir avec du RFS ?
+                font-size: pxToRem(30) // TODO : on peut peut-être la sortir avec du RFS ?
             @include media-breakpoint-up(xl)
                 font-size: $block-testimonials-xl-font-size
                 line-height: $block-testimonials-xl-line-height
@@ -28,12 +28,10 @@
             display: block
     .avatar
         flex-shrink: 0
-        width: calc(#{col(1, 8)} + #{$grid-gutter} / 2)
-        min-width: px2rem(80)
+        width: col(1)
+        min-width: pxToRem(80)
         margin-right: $spacing0
         margin-bottom: 0
-        @include media-breakpoint-up(desktop)
-            margin-right: calc(#{$grid-gutter} / 2)
 
     .splide
         .splide__slider
@@ -97,8 +95,7 @@
             margin-right: offset(1)
         figure
             padding-right: offset(3)
-            // TODO: explain this, add min height equal with 2 cols width to avoid overflow on square picture
-            min-height: calc(#{col-outside-container(2)} + #{half($grid-gutter)})
+            min-height: columns(2)
             &.with-picture
                 padding-right: offset(1)
                 padding-left: offset(3)
@@ -108,16 +105,7 @@
                     margin-top: $spacing0
                     .avatar
                         position: absolute
-                        left: col(1)
+                        left: columns(1)
                         top: 0
-                        margin-left: $grid-gutter
-                        width: col(2)
-
-        // TODO : en discuter en créa
-        // figure
-        //     display: flex
-        //     figcaption
-        //         order: -1
-        //         display: block
-        //         .avatar
-        //             margin-bottom: $spacing1
\ No newline at end of file
+                        margin-left: var(--grid-gutter)
+                        width: columns(2)
diff --git a/assets/sass/_theme/blocks/timeline.sass b/assets/sass/_theme/blocks/timeline.sass
index 0c527962608f6bc0773634cca4986fda06e248cd..377b4ced5b0990181db03efdaa98bfe551a2d7eb 100644
--- a/assets/sass/_theme/blocks/timeline.sass
+++ b/assets/sass/_theme/blocks/timeline.sass
@@ -11,7 +11,7 @@
                 border-radius: 50%
                 content: ""
                 height: 9px
-                left: half(-$grid-gutter)
+                left: half(var(--grid-gutter-negative))
                 margin-top: 0.5em
                 position: absolute
                 width: 9px
@@ -20,7 +20,7 @@
                 background: $color-text
                 bottom: -0.5em
                 content: ""
-                left: half(-$grid-gutter)
+                left: half(var(--grid-gutter-negative))
                 position: absolute
                 top: 0.5em
                 width: 1px
@@ -35,7 +35,7 @@
 
         @include media-breakpoint-down(desktop)
             .timeline-event
-                padding-left: half($grid-gutter-sm)
+                padding-left: half(var(--grid-gutter))
                 &::after, &::before
                     left: 0
 
@@ -45,28 +45,28 @@
             .timeline-event
                 display: flex
                 &::before, &::after
-                    left: col(3)
-                    margin-left: half($grid-gutter)
+                    left: columns(3)
+                    margin-left: half(var(--grid-gutter))
                 &::before
                     transform: translateX(-4px)
                 .title
-                    width: col(3)
+                    width: columns(3)
                     text-align: right
                     + p
                         margin-top: 0
                 p
-                    padding-left: $grid-gutter
-                    width: col(7)
+                    padding-left: var(--grid-gutter)
+                    width: columns(7)
                     &:first-child
-                        margin-left: col(3)
+                        margin-left: columns(3)
 
     &--horizontal
         --min-title-height: 0px
         background: $block-timeline-horizontal-background
         color: $block-timeline-horizontal-color
         overflow: hidden
-        padding-bottom: $grid-gutter
-        padding-top: $grid-gutter
+        padding-bottom: var(--grid-gutter)
+        padding-top: var(--grid-gutter)
         &::before
             display: none
         .timeline
@@ -77,7 +77,7 @@
             
         .timeline-arrows
             display: flex
-            padding-left: half($grid-gutter)
+            padding-left: half(var(--grid-gutter))
             > button
                 @include button-reset
                 background: none
@@ -93,8 +93,8 @@
                     cursor: default
                     opacity: 0.3
         .timeline-events
-            margin-left: half(-$grid-gutter)
-            margin-right: half(-$grid-gutter)
+            margin-left: half(var(--grid-gutter-negative))
+            margin-right: half(var(--grid-gutter-negative))
             // TODO : fixer le px gap en desktop entre chaque event
             ol
                 display: flex
@@ -106,7 +106,7 @@
                 width: 100%
         .timeline-event
             flex: none
-            padding: 0 half($grid-gutter)
+            padding: 0 half(var(--grid-gutter))
             scroll-snap-align: start
             transition: 0.3s opacity
             width: 50%
@@ -123,7 +123,7 @@
                 margin-bottom: $spacing1
                 opacity: 1
                 overflow: visible
-                width: calc(100% + #{half($grid-gutter)})
+                width: calc(100% + #{half(var(--grid-gutter))})
                 &::before
                     background: $block-timeline-horizontal-color
                     border-radius: 50%
@@ -143,7 +143,7 @@
         @include media-breakpoint-up(desktop)
             .timeline-event
                 .line
-                    width: calc(100% + #{$grid-gutter})
+                    width: calc(100% + var(--grid-gutter))
 
         @include media-breakpoint-down(desktop)
             .timeline-events
diff --git a/assets/sass/_theme/blocks/video.sass b/assets/sass/_theme/blocks/video.sass
index c946610acb2e3829ce1d81b3781c6e69e04a2d15..c8ab19c98de9a1ca5a14d90aef6e8c30a1c8c115 100644
--- a/assets/sass/_theme/blocks/video.sass
+++ b/assets/sass/_theme/blocks/video.sass
@@ -42,10 +42,10 @@
                 width: $spacing4
                 z-index: 3
                 &::before
-                    font-size: px2rem(100)
+                    font-size: pxToRem(100)
                     transition: color .3s ease
                     vertical-align: middle
-                    padding-left: px2rem(5)
+                    padding-left: pxToRem(5)
                 &:hover
                     background-color: white
                     &::before
@@ -54,8 +54,8 @@
                     height: $spacing3
                     width: $spacing3
                     &::before
-                        font-size: px2rem(40)
-                        padding-left: px2rem(3)
+                        font-size: pxToRem(40)
+                        padding-left: pxToRem(3)
         iframe
             background: black
         + p
@@ -63,8 +63,8 @@
 
     @include media-breakpoint-down(desktop)
         .video
-            margin-left: half(-$grid-gutter-sm)
-            margin-right: half(-$grid-gutter-sm)
+            margin-left: var(--grid-gutter-negative)
+            margin-right: var(--grid-gutter-negative)
 
     @include in-page-without-sidebar
         background: $block-video-background
diff --git a/assets/sass/_theme/design-system/a11y.sass b/assets/sass/_theme/design-system/a11y.sass
index 9fbce2042a73076d5f2a81bd005b4de4fb9546e5..e2409cd80672cab76e5d54567c94f640a121cae7 100644
--- a/assets/sass/_theme/design-system/a11y.sass
+++ b/assets/sass/_theme/design-system/a11y.sass
@@ -9,7 +9,7 @@
         @include list-reset
     li
         display: inline-block
-        margin-right: px2rem(5)
+        margin-right: pxToRem(5)
     &:focus-within
         background: white
         transform: translateY(0)
diff --git a/assets/sass/_theme/design-system/button.sass b/assets/sass/_theme/design-system/button.sass
index 60adbd146ac638d4dc53465255c6a469611d198c..6e07e46c8b27430640b1a2c9c90b4503ebff1999 100644
--- a/assets/sass/_theme/design-system/button.sass
+++ b/assets/sass/_theme/design-system/button.sass
@@ -6,7 +6,7 @@
     display: flex
     padding: 0
     @include media-breakpoint-up(desktop)
-        width: col(2,1)
+        width: columns(2)
     &:first-child
         margin-bottom: $spacing0
     &::before 
diff --git a/assets/sass/_theme/design-system/footer.sass b/assets/sass/_theme/design-system/footer.sass
index 15836bae5b05bca34395f543eb3dc3b7d11712b3..2ff15b9de6951beac4989e2f0ef0c8787c26a688 100644
--- a/assets/sass/_theme/design-system/footer.sass
+++ b/assets/sass/_theme/design-system/footer.sass
@@ -64,7 +64,7 @@ footer#document-footer
                     margin-left: $spacing0
             button[aria-expanded="true"],
             .dropdown-menu
-                outline: px2rem(10) solid $dropdown-i18n-background-color
+                outline: pxToRem(10) solid $dropdown-i18n-background-color
                 min-width: $spacing4
             .dropdown-menu
                 @include meta
@@ -73,7 +73,7 @@ footer#document-footer
                     color: $dropdown-i18n-color
                 @include media-breakpoint-up(desktop)
                     left: 0
-                    margin-top: px2rem(17)
+                    margin-top: pxToRem(17)
                     max-height: calc(100vh - var(--header-height))
                     padding: 0
                     position: absolute
diff --git a/assets/sass/_theme/design-system/hero.sass b/assets/sass/_theme/design-system/hero.sass
index 1cd7c5d3eaa3bf4b370051c5a0f06692cdf60586..bd42c27964806e8fbbd2de460d92d73d6d2e9a11 100644
--- a/assets/sass/_theme/design-system/hero.sass
+++ b/assets/sass/_theme/design-system/hero.sass
@@ -42,10 +42,10 @@
             margin-top: $spacing3
     @include media-breakpoint-down(desktop)
         .breadcrumb-nav
-            margin-left: half(-$grid-gutter-sm)
-            margin-right: half(-$grid-gutter-sm)
+            margin-left: half(var(--grid-gutter-negative))
+            margin-right: half(var(--grid-gutter-negative))
             > ol
-                padding: 0 half($grid-gutter-sm)
+                padding: 0 half(var(--grid-gutter))
         &--with-image
             padding-bottom: 0
             .content
@@ -54,8 +54,8 @@
         &--image-landscape
             .content
                 figure
-                    margin-left: half(-$grid-gutter-sm)
-                    margin-right: half(-$grid-gutter-sm)
+                    margin-left: half(var(--grid-gutter-negative))
+                    margin-right: half(var(--grid-gutter-negative))
         &--image-portrait, &--image-square
             .container
                 display: flex
@@ -67,28 +67,28 @@
     @include media-breakpoint-up(desktop)
         .content
             > h1, > hgroup
-                width: col(9)
+                width: columns(9)
         &--with-image
             .content
                 display: flex
                 justify-content: space-between
                 > h1, > hgroup
-                    width: col(7)
+                    width: columns(7)
                 figure
-                    width: col(5)
+                    width: columns(5)
 
         &--image-portrait, &--image-square
             .breadcrumb-nav
-                width: calc(#{col(9)} + #{half($grid-gutter)})
+                width: calc(#{columns(9)} + #{half(var(--grid-gutter))})
                 -webkit-mask-image: linear-gradient(to right, black 0%, black 90%, transparent 100%)
                 mask-image: linear-gradient(to right, black 0%, black 90%, transparent 100%)
                 .breadcrumb
                     padding-right: 50px
             .content
                 > h1, > hgroup
-                    width: col(8)
+                    width: columns(8)
                 figure
-                    width: col(3)
+                    width: columns(3)
     + .breadcrumb-container
         margin-top: 0
 
diff --git a/assets/sass/_theme/design-system/image.sass b/assets/sass/_theme/design-system/image.sass
index 0c2124cab50981e0552697c70b34243ee3db0557..f510bb241e3ba862ade8702d4ba44926d03a2e8a 100644
--- a/assets/sass/_theme/design-system/image.sass
+++ b/assets/sass/_theme/design-system/image.sass
@@ -13,7 +13,7 @@ img
         height: auto
         width: 100%
     figcaption
-        margin-top: px2rem(10)
+        margin-top: pxToRem(10)
         text-align: right
         &,
         p
diff --git a/assets/sass/_theme/design-system/layout.sass b/assets/sass/_theme/design-system/layout.sass
index 722758b5ebd320c54d5acb33b0f57e69f6d2628a..11c1213c6542e01078270879520275b4b9a8ffa8 100644
--- a/assets/sass/_theme/design-system/layout.sass
+++ b/assets/sass/_theme/design-system/layout.sass
@@ -10,8 +10,6 @@
     --spacing3: #{$spacing3}
     --spacing4: #{$spacing4}
     --spacing5: #{$spacing5}
-    --grid-gutter: #{$grid-gutter}
-    --grid-gutter-sm: #{$grid-gutter-sm}
     --grid-max-width: #{$grid-max-width}
     --header-height: #{$header-height}
     --header-menu-max-height: calc(100vh - var(--header-height) - #{$spacing4})
@@ -78,8 +76,8 @@ details
         position: relative
         cursor: pointer
         @include icon(caret, after)
-            margin-left: px2rem(10)
-            line-height: px2rem(22)
+            margin-left: pxToRem(10)
+            line-height: pxToRem(22)
             transition: transform 0.25s
         &::marker
             content: none
@@ -114,7 +112,7 @@ details
         overflow-y: auto
         @include media-breakpoint-up(desktop)
             padding: $spacing3
-            width: col(8)
+            width: columns(8)
         .modal-header
             margin-bottom: $spacing0
             button
diff --git a/assets/sass/_theme/design-system/nav.sass b/assets/sass/_theme/design-system/nav.sass
index 5abd9de7ead9e47a04770d020c990ea56bfbcf53..d452a23f26590744be84f3dc1d80dadfe6159a28 100644
--- a/assets/sass/_theme/design-system/nav.sass
+++ b/assets/sass/_theme/design-system/nav.sass
@@ -34,7 +34,7 @@
         //     text-decoration-color: transparent
         &[aria-expanded]
             @include icon(caret, after)
-                margin-left: px2rem(5)
+                margin-left: pxToRem(5)
                 transition: transform 0.15s
             &[aria-expanded="true"]
                 &::after
@@ -120,11 +120,11 @@
                         .container
                             align-items: baseline
                             display: flex
-                            gap: $grid-gutter
+                            gap: var(--grid-gutter)
                         .dropdown-menu-title
-                            width: col(5)
+                            width: columns(5)
                         .nav-level-2
-                            width: col(7)
+                            width: columns(7)
                             li
                                 margin-bottom: $spacing0
             @else
@@ -216,7 +216,7 @@
     a
         text-decoration: none
         padding: $spacing0
-        font-size: px2rem(24)
+        font-size: pxToRem(24)
         &:hover
             opacity: 0.7
         &::after
diff --git a/assets/sass/_theme/design-system/pagination.sass b/assets/sass/_theme/design-system/pagination.sass
index 1c00405cb47904fdf4987318c33ba690e2fcda45..0ba8584ca2e8ed182d19ed618abc168bf84f3fb7 100644
--- a/assets/sass/_theme/design-system/pagination.sass
+++ b/assets/sass/_theme/design-system/pagination.sass
@@ -67,12 +67,12 @@
         .previous
             span
                 @include icon(arrow-left, before)
-                    margin-right: px2rem(5)
+                    margin-right: pxToRem(5)
         .next
             text-align: right
             span
                 @include icon(arrow-right, after)
-                    margin-left: px2rem(5)
+                    margin-left: pxToRem(5)
 
     @include media-breakpoint-up(desktop)
         ul
diff --git a/assets/sass/_theme/design-system/search.sass b/assets/sass/_theme/design-system/search.sass
index 8560a31ddb04fba2f7ac6e64ab354528406a01bb..79ad5577ae4bb400b16f396e2c3044e8970f9f39 100644
--- a/assets/sass/_theme/design-system/search.sass
+++ b/assets/sass/_theme/design-system/search.sass
@@ -24,7 +24,7 @@
     &.toggle-icon::after
         font-size: $h3-size
         @include media-breakpoint-up(desktop)
-            margin-top: px2rem(5)
+            margin-top: pxToRem(5)
     span,
     &::after
         display: inline
@@ -45,7 +45,7 @@
         display: inline-flex
         justify-content: center
         margin-left: $spacing0
-        width: px2rem(15)
+        width: pxToRem(15)
     @include media-breakpoint-down(desktop)
         right: $spacing1
         top: half($spacing0)
@@ -87,7 +87,7 @@
             @include icon(search-inline, after)
             &::after
                 color: transparentize($color-text-alt, .4)
-                padding-right: px2rem(2)
+                padding-right: pxToRem(2)
                 position: fixed
                 pointer-events: none
                 transform: translate(-6px,20%)
@@ -153,13 +153,13 @@
         @include media-breakpoint-up(desktop)
             &__form
                 position: relative
-                width: col(8)
+                width: columns(8)
                 &::after
-                    left: calc(#{col(8)} - #{space(8)})
+                    left: calc(#{columns(8)} - #{space(8)})
                     top: space(9)
             &__search-input,
             &__message
-                width: calc(#{col(8,12)} - #{space(21.5)})
+                width: calc(#{columns(8)} - #{space(21.5)})
             &__results-area
                 padding-top: space(26)
         @include media-breakpoint-down(desktop)
@@ -173,7 +173,7 @@
 
 .menu .nav-level-1 > li .pagefind-ui__toggle:not(.toggle-icon)::after
     margin-left: 0
-    margin-top: px2rem(2)
+    margin-top: pxToRem(2)
 
 .pagefind-fixed
     align-items: center
@@ -193,8 +193,8 @@
             padding-right: 0
             justify-content: center
         &.toggle-icon
-            min-height: px2rem(37)
-            width: px2rem(50)
+            min-height: pxToRem(37)
+            width: pxToRem(50)
             &:hover,
             &:focus
                 width: calc(#{$spacing3} * 3)
@@ -206,7 +206,7 @@
         &.in-page-with-toc
             background: $color-background
             border-top: 1px solid #eee
-            bottom: px2rem(44)
+            bottom: pxToRem(44)
             
 footer#document-footer .footer-search
     .pagefind-footer
@@ -215,7 +215,7 @@ footer#document-footer .footer-search
         &.toggle-icon
             transform: translateX(-35%)
         &::after
-            margin-top: px2rem(3)
+            margin-top: pxToRem(3)
     #search
         margin-top: 0
         a
diff --git a/assets/sass/_theme/design-system/table.sass b/assets/sass/_theme/design-system/table.sass
index f4fdd19732c0a98188b0b53709510ea65eb9a777..b5c22e4b53ec892361228abaaaffd8f9dc51f887 100644
--- a/assets/sass/_theme/design-system/table.sass
+++ b/assets/sass/_theme/design-system/table.sass
@@ -38,12 +38,12 @@ table
 
 .table-responsive
     overflow-x: auto
-    margin-left: half(-$grid-gutter-sm)
-    margin-right: half(-$grid-gutter-sm)
-    padding-left: half($grid-gutter-sm)
-    padding-right: half($grid-gutter-sm)
+    margin-left: half(var(--grid-gutter-negative))
+    margin-right: half(var(--grid-gutter-negative))
+    padding-left: half(var(--grid-gutter))
+    padding-right: half(var(--grid-gutter))
     @include media-breakpoint-up(desktop)
-        margin-left: half(-$grid-gutter)
-        margin-right: half(-$grid-gutter)
-        padding-left: half($grid-gutter)
-        padding-right: half($grid-gutter)
\ No newline at end of file
+        margin-left: half(var(--grid-gutter-negative))
+        margin-right: half(var(--grid-gutter-negative))
+        padding-left: half(var(--grid-gutter))
+        padding-right: half(var(--grid-gutter))
\ No newline at end of file
diff --git a/assets/sass/_theme/design-system/table_of_contents.sass b/assets/sass/_theme/design-system/table_of_contents.sass
index 0e7d1746f0da1b9d126bbdf61f39efd66dd8bb08..d45816a3849f90ef404e38065c87c35439cb4fe2 100644
--- a/assets/sass/_theme/design-system/table_of_contents.sass
+++ b/assets/sass/_theme/design-system/table_of_contents.sass
@@ -7,11 +7,11 @@
     bottom: 0
     margin-top: 0
     z-index: $zindex-toc
-    width: calc(#{col-outside-container(4)} + #{$grid-gutter} * 2)
+    width: calc(#{columns(4)} + var(--grid-gutter) * 2)
     transform: translateX(100%)
     transition: var(--toc-transition-duration) transform ease-in-out
     @include media-breakpoint-down(desktop)
-        width: calc(100% - #{$grid-gutter})
+        width: calc(100% - var(--grid-gutter))
     &.is-opened
         transform: translateX(0)
     &[aria-hidden="true"]
@@ -26,8 +26,8 @@
         padding: $spacing0 $spacing1
         @include media-breakpoint-up(desktop)
             font-size: $toc-title-font-size-desktop
-            padding: $header-nav-padding-y $grid-gutter calc(#{$header-nav-padding-y} + 1px)
-            padding: calc((var(--header-height)) / 2 - #{$body-size}) $grid-gutter
+            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)
             padding-top: 0
             padding-bottom: 0
             line-height: calc(var(--header-height) - 1px)
@@ -41,7 +41,7 @@
             flex: 1
             padding: $spacing1
             @include media-breakpoint-up(desktop)
-                padding: $spacing1 $grid-gutter
+                padding: $spacing1 var(--grid-gutter)
             > li:first-child
                 margin-top: 0
     button
@@ -62,7 +62,7 @@
             padding-top: 0
             padding-bottom: 0
             line-height: var(--header-height)
-            right: $grid-gutter
+            right: var(--grid-gutter)
             &::after
                 margin-left: $spacing0
 
@@ -92,7 +92,7 @@
         background: $toc-background-color
         left: 0
         width: 100%
-        padding: 0 half($grid-gutter-sm)
+        padding: 0 var(--grid-gutter)
         z-index: $zindex-toc-cta
     button
         @include button-icon(toc)
@@ -123,14 +123,14 @@
 
     // Only desktop and in page with sidebar
     @include in-page-with-sidebar
-        @include container-margin-left
+        margin-left: grid-external-space()
         pointer-events: none
         top: 0
         left: 0
         margin-top: 0
         height: 100%
         position: absolute
-        width: col-outside-container(4)
+        width: columns(4)
         .toc-content
             overflow-y: auto
             max-height: calc(100vh - var(--header-height))
diff --git a/assets/sass/_theme/design-system/top.sass b/assets/sass/_theme/design-system/top.sass
index 574e1cc322c663e41f3b9500fa430d617a03cfc0..d1605f7c4b7a051336cdf6295100450d6475d31a 100644
--- a/assets/sass/_theme/design-system/top.sass
+++ b/assets/sass/_theme/design-system/top.sass
@@ -12,10 +12,10 @@
     //     a
     //         @include stretched-link
     // div
-    //     margin-top: px2rem(5)
+    //     margin-top: pxToRem(5)
     //     p
     //         @include media-breakpoint-up(lg)
-    //             width: col(8)
+    //             width: columns(8)
     .link
         @extend .link-more
 
diff --git a/assets/sass/_theme/design-system/typography.sass b/assets/sass/_theme/design-system/typography.sass
index b17ab94d5ff712e724ce143ec28460cbebc2f062..4006b7a6bc7ec6905af377663687fe3b0d8e824d 100644
--- a/assets/sass/_theme/design-system/typography.sass
+++ b/assets/sass/_theme/design-system/typography.sass
@@ -204,7 +204,7 @@ small, .small
     @include media-breakpoint-up(desktop)
         font-size: $quote-size-desktop-long
     cite
-        font-size: px2rem(18)
+        font-size: pxToRem(18)
         font-style: normal
 
 blockquote, .blockquote
@@ -286,8 +286,8 @@ a,
     @include link
     @include icon(arrow, before)
     &::before
-        font-size: px2rem(10)
-        margin-right: px2rem(5)
+        font-size: pxToRem(10)
+        margin-right: pxToRem(5)
 
 dd
     margin-bottom: 0.5rem
@@ -305,7 +305,7 @@ abbr, abbr[title]
 sub,
 sup
     font-size: 60%
-    margin-left: px2rem(2)
+    margin-left: pxToRem(2)
 
 [data-click-to-copy]
     cursor: pointer
@@ -342,5 +342,5 @@ sup
     .btn-#{$name}
         @include icon($name)
         &::before
-            margin-inline-end: px2rem(5)
+            margin-inline-end: pxToRem(5)
 
diff --git a/assets/sass/_theme/hugo-osuny.sass b/assets/sass/_theme/hugo-osuny.sass
index 216dc1a36961d8272f38687b9b0b7dc3b4df5d6a..0126f13d8e07dc0b163eda8622545927abce05b0 100644
--- a/assets/sass/_theme/hugo-osuny.sass
+++ b/assets/sass/_theme/hugo-osuny.sass
@@ -6,6 +6,8 @@
 @import "dependencies/normalize"
 @import "dependencies/bootstrap-breakpoints"
 
+@import "variables"
+
 // Keep on top
 @import "design-system/typography"
 
diff --git a/assets/sass/_theme/sections/diplomas.sass b/assets/sass/_theme/sections/diplomas.sass
index 67b54c24234bc8aa2bbce2dfe42e097f5550707a..b7acf19005bf4a84e58575612fc2f0c2f2e5f4c5 100644
--- a/assets/sass/_theme/sections/diplomas.sass
+++ b/assets/sass/_theme/sections/diplomas.sass
@@ -68,7 +68,7 @@ ul.diplomas
                 @include media-breakpoint-up(desktop)
                     display: flex
                     > p
-                        width: col(6)
+                        width: columns(6)
             .title
                 @include h4
 
@@ -87,8 +87,8 @@ ul.diplomas
         position: absolute
         z-index: 2
         @include media-breakpoint-down(desktop)
-            right: half(-$grid-gutter-sm)
-            left: half(-$grid-gutter-sm)
+            right: var(--grid-gutter-negative)
+            left: var(--grid-gutter-negative)
         &,
         a
             color: black
@@ -116,7 +116,7 @@ ul.diplomas
     .container
         @include media-breakpoint-down(sm)
             .buttons > *
-                width: col(8)
+                width: columns(8)
         @include media-breakpoint-down(md)
             .buttons
                 display: flex
@@ -124,7 +124,7 @@ ul.diplomas
                 flex-wrap: wrap
                 > *
                     min-width: 150px
-                    width: col(7)
+                    width: columns(7)
         @include media-breakpoint-up(md)
             @include grid(2, md)
             align-items: flex-end
@@ -136,7 +136,7 @@ ul.diplomas
                 justify-content: flex-end
                 > *
                     min-width: 200px
-                    width: col(2, 6)
+                    width: columns(2)
             
     .essential
         color: $header-color
diff --git a/assets/sass/_theme/sections/events.sass b/assets/sass/_theme/sections/events.sass
index c9031b2575d14e8486eeac12d061c7950c1e8168..befe67ec91a6a27ed8199205cad2d24d687e2907 100644
--- a/assets/sass/_theme/sections/events.sass
+++ b/assets/sass/_theme/sections/events.sass
@@ -124,10 +124,10 @@
                     flex-direction: row
                     gap: $spacing1
                     .media
-                        width: col(4)
+                        width: columns(4)
                     &-content
                         order: 1
-                        width: col(8)
+                        width: columns(8)
             @include media-breakpoint-down(md)
                 .media
                     max-width: 33%
@@ -139,15 +139,15 @@
                     grid-column: 10 / 13
             @include media-breakpoint-up(desktop)
                 flex-direction: row
-                gap: $grid-gutter
+                gap: var(--grid-gutter)
                 align-items: start
                 &-content
-                    width: col(10)
+                    width: columns(10)
                     > hgroup, > .event-title
                         margin-bottom: $spacing0
                 .media
                     order: 2
-                    width: col(2)
+                    width: columns(2)
             @include in-page-without-sidebar
                 &-dates
                     margin-top: 0
@@ -219,9 +219,9 @@
             display: flex
             flex-direction: row
             position: relative
-            grid-gap: $grid-gutter
+            grid-gap: var(--grid-gutter)
             + .event 
-                margin-top: $grid-gutter
+                margin-top: var(--grid-gutter)
             &-content
                 a 
                     @include stretched-link
@@ -245,7 +245,7 @@
                     width: 100%
             @include media-breakpoint-up(desktop)
                 .media
-                    width: col(4, 8)
+                    width: columns(4)
                 &-dates
                     @include h3
                     margin-bottom: $spacing2
@@ -257,8 +257,8 @@
                 flex-direction: column
                 grid-gap: 0
                 .media
-                    margin-left: calc(-#{$grid-gutter-sm} /2)
-                    margin-right: calc(-#{$grid-gutter-sm} /2)
+                    margin-left: var(--grid-gutter-negative)
+                    margin-right: var(--grid-gutter-negative)
                     aspect-ratio: 1
                     img 
                         margin-bottom: $spacing0
@@ -267,5 +267,5 @@
                 &-dates
                     @include h3
                 &:not(.event--with-image)
-                    width: col(5)
+                    width: columns(5)
                     margin-left: offset(4)
diff --git a/assets/sass/_theme/sections/organizations.sass b/assets/sass/_theme/sections/organizations.sass
index 0254ddae6be16b2eb3dec191ec167507c36b7d03..00e17d08d7a62571a44f1aee3d194547bf51bd91 100644
--- a/assets/sass/_theme/sections/organizations.sass
+++ b/assets/sass/_theme/sections/organizations.sass
@@ -86,8 +86,8 @@
             > .container
                 display: flex
                 justify-content: space-between
-                gap: $grid-gutter
+                gap: var(--grid-gutter)
             [itemprop="articleBody"]
-                width: col(8)
+                width: columns(8)
             .logo
-                width: col(3)
+                width: columns(3)
diff --git a/assets/sass/_theme/sections/papers.sass b/assets/sass/_theme/sections/papers.sass
index 9cbed0822fb597044d65044c06b3127522c2a7bc..d1b26a8d658032f68678dc4938155833b996bacb 100644
--- a/assets/sass/_theme/sections/papers.sass
+++ b/assets/sass/_theme/sections/papers.sass
@@ -66,7 +66,7 @@
                 height: unset
                 @include sticky(-1px)
             .media
-                width: col(2, 4)
+                width: columns(2)
     .document-content
         min-height: 100vh
         .content
diff --git a/assets/sass/_theme/sections/persons.sass b/assets/sass/_theme/sections/persons.sass
index 2548a808aefbc1b64dffb45156713f68325d6413..aa44dfa887f886215eb06da84ec884474c17c74e 100644
--- a/assets/sass/_theme/sections/persons.sass
+++ b/assets/sass/_theme/sections/persons.sass
@@ -10,7 +10,7 @@
                     transform: translateX($spacing0)
     // TODO : voir comment gérer les marges comme pour les blocs (pb footer)
     section
-        padding-bottom:  $grid-gutter
+        padding-bottom:  var(--grid-gutter)
     ol.programs
         li
             justify-content: flex-start
@@ -110,10 +110,10 @@ ol.persons--list
             align-items: baseline
             display: flex
             [itemprop="name"]
-                width: col(5)
+                width: columns(5)
             [itemprop="jobTitle"]
-                width: col(6)
-                margin-left: $grid-gutter
+                width: columns(6)
+                margin-left: var(--grid-gutter)
         @include media-breakpoint-down(desktop)
             &::after
                 position: absolute
@@ -170,7 +170,7 @@ ol.persons--list
             padding-bottom: 0
             margin-bottom: $spacing4
             .avatar
-                width: col(6)
+                width: columns(6)
                 margin-top: $spacing1
                 margin-left: auto
                 transform: translateY(100px)
@@ -188,10 +188,10 @@ ol.persons--list
                 margin-top: 0
                 h1
                     margin-bottom: 0
-                    width: col(8)
+                    width: columns(8)
                 .avatar
                     margin-bottom: 0
-                    width: col(3)
+                    width: columns(3)
     .roles
         a
             @include small
diff --git a/assets/sass/_theme/sections/posts.sass b/assets/sass/_theme/sections/posts.sass
index f355c79af5cdb92d0fe489d8299a564425aee078..1f7813586eae4b6a6fbb0647b716e92cbb917df0 100644
--- a/assets/sass/_theme/sections/posts.sass
+++ b/assets/sass/_theme/sections/posts.sass
@@ -1,5 +1,5 @@
 .post
-    @include article($post-media-background)
+    @include article
     time
         color: $post-time-color
         display: inline-block
@@ -66,7 +66,7 @@
                 .post-content
                     [itemprop=headline],
                     > p
-                        max-width: col(6, 9)
+                        max-width: columns(6)
     .posts--grid
         @include grid(1)
         @include grid(2, desktop)
diff --git a/assets/sass/_theme/sections/programs.sass b/assets/sass/_theme/sections/programs.sass
index 392ce211fd2e3be0f19a24b9b03ac8e0fc2f6136..bd30567a4a6930cef3894e1ef1709c8c4b2a5aa1 100644
--- a/assets/sass/_theme/sections/programs.sass
+++ b/assets/sass/_theme/sections/programs.sass
@@ -57,7 +57,7 @@ ol.programs
                 font-size: $program-share-font-size-desktop
         .dropdown-menu
             background: $hero-color
-            border-radius: px2rem(4)
+            border-radius: pxToRem(4)
             bottom: 0
             padding: 0
             position: absolute
@@ -81,7 +81,7 @@ ol.programs
             align-items: center
             justify-content: space-between
             width: 100%
-            border-radius: px2rem(4)
+            border-radius: pxToRem(4)
         a[download]
             @include button-icon(download)
             text-decoration: none
@@ -109,8 +109,8 @@ ol.programs
                     @include h3
                 @include media-breakpoint-down(desktop)
                     padding-top: $spacing3
-                    margin-left: half(-$grid-gutter-sm)
-                    margin-right: half(-$grid-gutter-sm)
+                    margin-left: var(--grid-gutter-negative)
+                    margin-right: var(--grid-gutter-negative)
 
                 @include media-breakpoint-up(desktop)
                     .container
diff --git a/assets/sass/_theme/sections/publications.sass b/assets/sass/_theme/sections/publications.sass
index 71d210d52e18688d94cb81f918afa0f5193dc1fc..4ed9c74dbb5942a8c902cce82d267da2261cd5a9 100644
--- a/assets/sass/_theme/sections/publications.sass
+++ b/assets/sass/_theme/sections/publications.sass
@@ -52,7 +52,7 @@
             a + p
                 margin-top: $spacing1
             a::before
-                margin-top: px2rem(-6)
+                margin-top: pxToRem(-6)
         .publication-title
             @include h4
         .publication-authors
@@ -98,7 +98,7 @@
             @include grid(2, desktop)
             @include grid(4, xxl)
             @include media-breakpoint-up(xxl)
-                grid-gap: $spacing0 $grid-gutter
+                grid-gap: $spacing0 var(--grid-gutter)
             @include media-breakpoint-down(xxl)
                 grid-gap: $spacing0
             > a
diff --git a/assets/sass/_theme/sections/volumes.sass b/assets/sass/_theme/sections/volumes.sass
index 7aac22fbbff105b8a8197b167872cc18c12d693d..a3c9c6aeda692dec13166ce448308c9bb8671962 100644
--- a/assets/sass/_theme/sections/volumes.sass
+++ b/assets/sass/_theme/sections/volumes.sass
@@ -48,7 +48,7 @@
                 .paper-volume
                     padding-left: $spacing1
             .paper-actions
-                gap: $grid-gutter
+                gap: var(--grid-gutter)
                 margin-top: $spacing0
                 a, button
                     width: unset
\ No newline at end of file
diff --git a/assets/sass/_theme/utils/fonts.sass b/assets/sass/_theme/utils/fonts.sass
new file mode 100644
index 0000000000000000000000000000000000000000..e6d6815e19878e41ddee6ea273bf9771da250378
--- /dev/null
+++ b/assets/sass/_theme/utils/fonts.sass
@@ -0,0 +1,23 @@
+// https://gist.github.com/jonathantneal/d0460e5c2d5d7f9bc5e6
+@function str-replace($string, $search, $replace: "")
+    $index: str-index($string, $search)
+    @if $index
+        @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
+    @return $string
+
+@mixin font-face($name, $path, $weight: 400, $style: normal, $exts: (eot woff2 woff ttf svg))
+    $src: null
+    $extmods: (eot:"?", svg:"#" + str-replace($name," ","_"))
+    $formats: (otf: "opentype", ttf: "truetype")
+
+    @each $ext in $exts
+        $extmod: if(map-has-key($extmods, $ext), $ext + map-get($extmods, $ext), $ext)
+        $format: if(map-has-key($formats, $ext), map-get($formats, $ext), $ext)
+        $src: append($src, url(quote("/assets/fonts/" + $path + "." + $extmod)) format(quote($format)), comma,)
+
+    @font-face
+        font-family: quote($name)
+        font-style: $style
+        font-weight: $weight
+        font-display: swap
+        src: $src
diff --git a/assets/sass/_theme/utils/grid.sass b/assets/sass/_theme/utils/grid.sass
new file mode 100644
index 0000000000000000000000000000000000000000..3461e11d20cc14b03444b01591cc735de2badfc6
--- /dev/null
+++ b/assets/sass/_theme/utils/grid.sass
@@ -0,0 +1,39 @@
+@mixin container
+    margin-left: auto
+    margin-right: auto
+    padding-left: var(--grid-gutter)
+    padding-right: var(--grid-gutter)
+    width: var(--grid-width)
+
+// This must be used for content inside columns
+@function columns($quantity)
+    $width: calc( (var(--column-width) * #{$quantity}) + var(--grid-gutter) * ( #{$quantity} - 1 ))
+    @return #{$width}
+
+@mixin grid($cols: 12, $breakpoint: false, $gap-y: var(--grid-gutter), $gap-x: var(--grid-gutter))
+    word-break: break-word
+    @if $breakpoint
+        @include media-breakpoint-up($breakpoint)
+            display: grid
+            grid-gap: $gap-y $gap-x
+            grid-template-columns: repeat($cols, 1fr)
+    @else
+        display: grid
+        grid-gap: $gap-y $gap-x
+        grid-template-columns: repeat($cols, 1fr)
+
+@mixin flexbox-grid($cols: 12, $gap-y: var(--grid-gutter), $gap-x: $gap-y)
+    display: flex
+    flex-wrap: wrap
+    gap: $gap-y $gap-x
+    > *
+        flex: 0 0 calc(#{100 / $cols}% - #{$gap-x} * #{($cols - 1) / $cols} )
+
+// This must be used for offset, outside columns
+@function offset($quantity)
+    $width: calc( #{columns($quantity)} + var(--grid-gutter) )
+    @return #{$width}
+
+// Cette fonction calcule l'espace disponible entre la grille et le bord de l'écran
+@function grid-external-space
+    @return Max(var(--grid-gutter), calc((100vw - var(--grid-width)) / 2 + var(--grid-gutter)))
diff --git a/assets/sass/_theme/utils/icons.sass b/assets/sass/_theme/utils/icons.sass
new file mode 100644
index 0000000000000000000000000000000000000000..15cf5f4f7739199c0b78fdff9c0bee4f81643860
--- /dev/null
+++ b/assets/sass/_theme/utils/icons.sass
@@ -0,0 +1,58 @@
+
+@mixin hover-translate-icon($pseudo: after, $distance: 10)
+    &::#{$pseudo}
+        display: inline-block
+        transition: transform 0.55s $arrow-ease-transition
+        transform: translateX(0)
+    &:hover
+        &::#{$pseudo}
+            transform: translateX(#{pxToRem($distance)})
+
+@mixin icon($icon-name: '', $pseudo-element: before, $non-breaking: false)
+    &::#{$pseudo-element}
+        content: map-get($icons, $icon-name)
+        display: inline-block
+        font-family: 'Icon'
+        font-style: normal
+        font-variant: normal
+        font-weight: normal
+        line-height: 1
+        speak: never
+        text-transform: none
+        vertical-align: middle
+        @if $non-breaking
+            content: " #{map-get($icons, $icon-name)}"
+            display: inline
+        @content // TODO : important de documenter ça
+
+@mixin icon-block($icon-name: '', $pseudo-element: before, $non-breaking: false)
+    @include icon($icon-name, $pseudo-element, $non-breaking)
+        font-size: 44px
+        display: inline
+        @content
+
+@mixin button-icon($icon: false)
+    @include button-reset
+    line-height: $body-line-height
+    border: 1px solid $hero-color
+    padding: half($spacing0) $spacing1
+    white-space: nowrap
+    @if $icon
+        @include icon-block($icon, after)
+
+
+@mixin arrow-right-hover
+    position: relative
+    display: flex
+    justify-content: space-between
+    align-items: center
+    @include icon(arrow, after)
+        opacity: 0
+        transform: translateX(-20px)
+        transition: 0.55s $arrow-ease-transition
+        position: absolute
+        right: 0
+    &:hover
+        &:after
+            opacity: 1
+            transform: translateX(0)
\ No newline at end of file
diff --git a/assets/sass/_theme/utils/links.sass b/assets/sass/_theme/utils/links.sass
new file mode 100644
index 0000000000000000000000000000000000000000..7866e937f8a5f5299e2b5c041a0adcf72464e60f
--- /dev/null
+++ b/assets/sass/_theme/utils/links.sass
@@ -0,0 +1,27 @@
+@mixin link($color: $link-color, $unhover_decorated: true)
+    color: $color
+    text-decoration-line: underline
+    text-decoration-thickness: $link-underline-thickness
+    text-underline-offset: $link-underline-offset
+    transition: $link-transition
+    @if $unhover_decorated
+        text-decoration-color: rgba($color, $link-unhover-decoration-color-alpha)
+    @else 
+        text-decoration-color: transparent
+    &:hover
+        text-decoration-color: rgba($color, 1)
+        text-decoration-thickness: $link-underline-thickness
+
+@mixin link-hovered-underline-only
+    &:not(:hover)
+        text-decoration: transparent
+
+@mixin stretched-link($pseudo-element: after)
+    &::#{$pseudo-element}
+        bottom: 0
+        content: ''
+        left: 0
+        position: absolute
+        right: 0
+        top: 0
+        z-index: $zindex-stretched-link
\ No newline at end of file
diff --git a/assets/sass/_theme/utils/media.sass b/assets/sass/_theme/utils/media.sass
new file mode 100644
index 0000000000000000000000000000000000000000..8be361e9b59617051600a66be23c64fa98bae133
--- /dev/null
+++ b/assets/sass/_theme/utils/media.sass
@@ -0,0 +1,14 @@
+
+@mixin aspect-ratio($ratio, $selector: 'iframe', $background: false)
+    @if $background
+        aspect-ratio: #{$ratio}
+        background: $background
+    #{$selector}
+        aspect-ratio: #{$ratio}
+        display: block
+        width: 100%
+
+@mixin handle-svg-fit
+    picture.is-svg
+        img
+            object-fit: contain
\ No newline at end of file
diff --git a/assets/sass/_theme/utils/normalize.sass b/assets/sass/_theme/utils/normalize.sass
new file mode 100644
index 0000000000000000000000000000000000000000..89263f3c7feb2d559f9f2908510e98ab7ec12deb
--- /dev/null
+++ b/assets/sass/_theme/utils/normalize.sass
@@ -0,0 +1,32 @@
+@mixin button-reset
+    appearance: none
+    background: transparent
+    border: none
+    border-radius: 0
+    cursor: pointer
+    user-select: none
+    &:active,
+    &:focus
+        box-shadow: inset 0 0 0 0.25rem rgba($color-text, 0.25)
+        // TODO : vérifier si l'outline 0 est vraiment nécessaire
+        // outline: 0
+
+@mixin list-reset
+    list-style: none
+    padding-left: 0
+    margin-bottom: 0
+    margin-top: 0
+
+@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
+        top: $top
+
+@mixin browser-under-safari-16
+    @media not all and (min-resolution:.001dpcm) 
+            @supports (-webkit-appearance:none) and (display:flow-root)
+                @content
\ No newline at end of file
diff --git a/assets/sass/_theme/utils/shame.sass b/assets/sass/_theme/utils/shame.sass
new file mode 100644
index 0000000000000000000000000000000000000000..000cae154e53ffeab89f4896d5afa8cd6ecbc6d5
--- /dev/null
+++ b/assets/sass/_theme/utils/shame.sass
@@ -0,0 +1,175 @@
+
+@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
+
+@mixin post-time-author-flex
+    .post-meta
+        display: flex
+        flex-wrap: wrap
+    .post-author p::before
+        content: ' • '
+
+// TODO: transformer en class %article
+@mixin article
+    position: relative
+    display: flex
+    flex-direction: column
+    .media
+        @include handle-svg-fit
+        margin-bottom: $spacing1
+        order: -1
+        overflow: hidden
+        img
+            display: block
+            object-fit: cover
+            @if $article-media-aspect-ratio
+                aspect-ratio: $article-media-aspect-ratio
+    h2, h3, [itemprop=headline]
+        @include h3
+        a
+            display: block
+            @include stretched-link
+            text-decoration: none
+    p + time
+            margin-top: $spacing0
+    time
+        @include meta
+        color: $color-text-alt
+        display: block
+
+@mixin list-section
+    @include list-reset
+    > li
+        border-bottom: 1px solid $color-border
+        padding-bottom: $spacing1
+        padding-top: $spacing1
+        position: relative
+        > .title
+            @include h2
+            transition: color 0.55s
+            @include media-breakpoint-down(desktop)
+                @include icon(arrow-right, after, true)
+                    bottom: $spacing0
+                    position: absolute
+                    right: 0
+            @include media-breakpoint-up(desktop)
+                @include arrow-right-hover
+                display: block
+                &::after
+                    transform: translateX(0)
+                    position: relative
+                &:hover
+                    &::after
+                        transform: translateX($spacing0)
+        a
+            text-decoration: none
+            &:hover
+                color: $color-accent
+
+        @include media-breakpoint-down(desktop)
+            a:nth-child(2)
+                margin-top: calc(#{$spacing0} / 2)
+            a, p
+                display: block
+        @include media-breakpoint-up(desktop)
+            align-items: baseline
+            display: flex
+            justify-content: space-between
+
+@mixin text-underline
+    text-decoration-color: $color-border
+    text-decoration-line: underline
+    text-decoration-thickness: 1px
+    text-underline-offset: 3px
+    text-decoration-line: underline
+
+
+@mixin top-flex
+    @include in-page-without-sidebar
+        align-items: baseline
+        display: flex
+        .block-title
+            width: columns(4)
+            &:not(.hidden) + .description
+                margin-left: var(--grid-gutter)
+        .description
+            margin-top: 0
+            width: columns(8)
+
+@mixin collapsed-figcaption
+    figcaption
+        @include meta
+        color: $color-text-alt
+        position: absolute
+        display: block
+        left: 0
+        right: 0
+        text-align: right
+        z-index: 10
+        &::before
+            @include meta
+            content: '©'
+            position: absolute
+            right: 0
+            top: 0
+            background: $hero-background-color
+            text-align: center
+            padding: half($spacing0)
+            display: block
+        .credit-content
+            @include meta
+            background: $hero-background-color
+            display: none
+            padding: half($spacing0)
+            padding-right: $spacing1
+        a
+            color: inherit
+            text-decoration-color: inherit
+        &:focus
+            .credit-content
+                display: block
+        @include media-breakpoint-up(desktop)
+            &:before
+                padding-right: 0
+        @include media-breakpoint-down(desktop)
+            position: relative
+            background: $color-background
+            &::before
+                background: transparent
+            .credit-content
+                display: block
+                background: transparent
+                position: relative
+    &:hover
+        figcaption .credit-content
+            display: block
+
+@mixin dropdown-i18n
+    position: relative
+    .dropdown-menu
+        margin-top: $header-nav-padding-y
+        padding-left: $spacing1
+        padding-bottom: $spacing0
+        padding-top: $spacing0
+        padding-right: $spacing1
+        right: 0
+    li a
+        padding-bottom: half($spacing0)
+        padding-top: half($spacing0)
+        display: block
+        &.is-checked
+            display: flex
+            justify-content: space-between
+            align-items: center
+            gap: $spacing2
+            text-decoration: none !important
+            @include icon(caret, after)
+                transform: rotate(-14deg) skewX(-30deg)
\ No newline at end of file
diff --git a/assets/sass/_theme/utils/sidebar.sass b/assets/sass/_theme/utils/sidebar.sass
new file mode 100644
index 0000000000000000000000000000000000000000..0c1e3178b3345b8ab0fdbe2751c0e7409bde7e1a
--- /dev/null
+++ b/assets/sass/_theme/utils/sidebar.sass
@@ -0,0 +1,65 @@
+@mixin in-page-with-sidebar
+    @include media-breakpoint-up(desktop)
+        body:not(.full-width) &
+            @content
+
+@mixin in-page-without-sidebar
+    @include media-breakpoint-up(desktop)
+        main > .blocks &,
+        body.full-width &,
+            @content
+
+// Use this mixin to override with-aside or without-aside rules
+@mixin in-page-with-or-without-sidebar
+    @include media-breakpoint-up(desktop)
+        body:not(.full-width) &,
+        main > .blocks &,
+        body.full-width &,
+            @content
+
+// Aliases
+@mixin full-page
+    @include in-page-without-sidebar
+        @content
+
+@mixin not-full-page
+    @include in-page-with-sidebar
+        @content
+
+// Section Program
+@mixin in-page-program
+    .programs__section &
+        @content
+
+@mixin sticky($offset-y: 0)
+    position: sticky
+    top: $offset-y
+    @if $header-sticky-enabled
+        transition: top $header-sticky-transition
+        html:not(.is-scrolling-down) &
+            top: calc(var(--header-height) + #{$offset-y})
+
+
+@mixin sidebar($side: start)
+    @include media-breakpoint-down(desktop)
+        padding: 0 half(var(--grid-gutter))
+        margin-bottom: $spacing3
+    @include media-breakpoint-up(desktop)
+        @if $side == start
+            margin-left: grid-external-space()
+            left: 0
+        @else
+            margin-right: grid-external-space()
+            right: 0
+        margin-top: 0
+        top: 0
+        height: 100%
+        position: absolute
+        width: columns(4)
+        & > div
+            @include sticky($spacing1)
+        .toc-container
+            border-top: 1px solid $color-border
+            padding-top: $spacing1
+            position: static
+            margin-left: 0
diff --git a/assets/sass/_theme/utils/sizes.sass b/assets/sass/_theme/utils/sizes.sass
new file mode 100644
index 0000000000000000000000000000000000000000..5669f7a7b63054dba144157367a081ebdd1ef7f0
--- /dev/null
+++ b/assets/sass/_theme/utils/sizes.sass
@@ -0,0 +1,10 @@
+$space-unit: 4 !default
+@function space($spaces: 1)
+    @return #{$spaces * $space-unit / 16}rem
+
+@function pxToRem($size)
+    $remSize: $size / 16
+    @return #{$remSize}rem
+
+@function half($size)
+    @return calc(#{$size} / 2)
\ No newline at end of file
diff --git a/layouts/partials/blocks/templates/gallery/grid.html b/layouts/partials/blocks/templates/gallery/grid.html
index 999cb8cd75e9bb1060b6ca1ff6158e7866e2e962..07c7d1a2a1d16a96891d4560985a905b8c5bd1f2 100644
--- a/layouts/partials/blocks/templates/gallery/grid.html
+++ b/layouts/partials/blocks/templates/gallery/grid.html
@@ -13,13 +13,13 @@
           {{ if not site.Params.image_sizes.design_system.lightbox.disabled }}
             {{ $lightbox_text := false }}
             {{ if and .text .credit }}
-              {{ $lightbox_text = delimit (slice .text .credit) " / " }}
-            {{ else }}
+              {{ $lightbox_text = delimit (slice .text .credit) " | " }}
+            {{ else if or .text .credit }}
               {{ $lightbox_text = or .text .credit }}
             {{ end }}
             <a  class="glightbox"
                 role="button"
-                data-glightbox="type: image;{{ if $lightbox_text }}description: {{ partial "PrepareHTML" $lightbox_text }}{{ end }}"
+                data-glightbox="type: image; {{ if $lightbox_text }}description: {{ partial "PrepareText" $lightbox_text }}{{ end }}"
                 href="{{ partial "GetLightboxUrl" (dict "id" .id) }}"
                 title="{{- i18n "commons.lightbox.link.title" -}}"
                 aria-label="{{- i18n "commons.lightbox.link.title" -}}">
diff --git a/layouts/partials/footer/debug.html b/layouts/partials/footer/debug.html
index fb2fa584fa76cbd6ef6d3f389a1d8cf826751aa5..e5a77b291f027180d4f8864f6d00d833217d68aa 100644
--- a/layouts/partials/footer/debug.html
+++ b/layouts/partials/footer/debug.html
@@ -190,6 +190,9 @@
     if (e.ctrlKey && e.key === 'i') {
       showImageDimension();
     }
+    if (e.ctrlKey && e.key === 'p') {
+      openInProd();
+    }
   });
 
   window.addEventListener('pointermove', e => {
@@ -264,4 +267,9 @@
 
     return (widthRatio + heightRatio) / 2;
   }
+
+  function openInProd() {
+    console.log('{{ .Site.BaseURL }}')
+  }
+
 </script>
\ No newline at end of file
diff --git a/layouts/partials/papers/document-nav.html b/layouts/partials/papers/document-nav.html
index 49b04d431ee141a35109827d2a0609dcd6fb99eb..1b9f6d5693fee74d700b593d0303e628433bfc90 100644
--- a/layouts/partials/papers/document-nav.html
+++ b/layouts/partials/papers/document-nav.html
@@ -16,7 +16,7 @@
                       "desktop"  "408x485"
                     ) -}}
             {{- else if site.Params.default_image.url -}}
-              {{- partial "commons/image-default.html" (dict "class" "img-fluid") -}}
+              {{- partial "commons/image-default.html" -}}
             {{- end -}}
           </div>
         </a>
diff --git a/layouts/partials/papers/sidebar.html b/layouts/partials/papers/sidebar.html
index c00aa0a4b33d633968cddeabdb6f28f52ce8dc4d..0c17ae332d1be1df0693db637bfd208484d4c17f 100644
--- a/layouts/partials/papers/sidebar.html
+++ b/layouts/partials/papers/sidebar.html
@@ -18,7 +18,7 @@
                           "desktop"  "408x485"
                         ) -}}
                 {{- else if site.Params.default_image.url -}}
-                  {{- partial "commons/image-default.html" (dict "class" "img-fluid") -}}
+                  {{- partial "commons/image-default.html" -}}
                 {{- end -}}
               </div>
             </a>
diff --git a/layouts/partials/persons/hero-single.html b/layouts/partials/persons/hero-single.html
index 928702e8ea481a7391e49d791dc7f3feff260616..36f55307da4b0b3f4f9aee8f62402b909ef4066a 100644
--- a/layouts/partials/persons/hero-single.html
+++ b/layouts/partials/persons/hero-single.html
@@ -25,7 +25,6 @@
           {{ partial "commons/image.html"
               (dict
                 "image"    .Params.image
-                "class"    "img-fluid"
                 "sizes"    site.Params.image_sizes.sections.persons.hero_single
               )}}
         </div>
diff --git a/layouts/partials/volumes/volume.html b/layouts/partials/volumes/volume.html
index d6a49058743ad40ca2f50c958cdeea92bd14ef4c..285f8e63d390d830230255db949f9053f644e80f 100644
--- a/layouts/partials/volumes/volume.html
+++ b/layouts/partials/volumes/volume.html
@@ -12,7 +12,7 @@
               "sizes"    site.Params.image_sizes.sections.volumes.item
             ) -}}
     {{- else if site.Params.default_image.url -}}
-      {{- partial "commons/image-default.html" (dict "class" "img-fluid") -}}
+      {{- partial "commons/image-default.html" -}}
     {{- end -}}
   </div>
 </article>