@font-face {
    font-family: "Inter Display";
    src: url("/polices/display-black.woff") format("woff");
    font-weight: 900;
    font-display: swap;
}

@font-face {
    font-family: "Inter Texte";
    src: url("/polices/texte.woff") format("woff");
    font-weight: 400;
    font-display: swap;
}

@font-face {
    font-family: "Inter Texte";
    src: url("/polices/texte-gras.woff") format("woff");
    font-weight: 600;
    font-display: swap;
}

:root {
    --papier: #e8edef;
    --blanc: #f8fafb;
    --encre: #15233b;
    --doux: #34445c;
    --gris: #56657a;
    --trait: #c6d0d7;
    --route: #b4316c;
    --route-pale: #f3dbe6;
    --ciel: #2c62c4;
    --vert: #1f8a5b;
    --rouge: #c2412d;
    --nuit: #15233b;
    --barre: rgb(232 237 239 / 0.86);
    --champ: #fff;
    --sur-route: #fff;
    --titre: "Inter Display", "Segoe UI", system-ui, sans-serif;
    --texte: "Inter Texte", "Segoe UI", system-ui, -apple-system, Roboto, Arial, sans-serif;
    color-scheme: light;
}

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
        --papier: #0e1624;
        --blanc: #152034;
        --encre: #e8edf4;
        --doux: #bac6d6;
        --gris: #8e9cb2;
        --trait: #273650;
        --route: #e65d95;
        --route-pale: #3b1d33;
        --ciel: #5d8ff0;
        --vert: #4cc38a;
        --rouge: #f07a63;
        --nuit: #080f1b;
        --barre: rgb(14 22 36 / 0.86);
        --champ: #0f192a;
        --sur-route: #1b0a14;
        color-scheme: dark;
    }
}

:root[data-theme="dark"] {
    --papier: #0e1624;
    --blanc: #152034;
    --encre: #e8edf4;
    --doux: #bac6d6;
    --gris: #8e9cb2;
    --trait: #273650;
    --route: #e65d95;
    --route-pale: #3b1d33;
    --ciel: #5d8ff0;
    --vert: #4cc38a;
    --rouge: #f07a63;
    --nuit: #080f1b;
    --barre: rgb(14 22 36 / 0.86);
    --champ: #0f192a;
    --sur-route: #1b0a14;
    color-scheme: dark;
}

*,
*::before,
*::after {
    box-sizing: border-box;
}

html {
    scroll-behavior: smooth;
    -webkit-text-size-adjust: 100%;
}

body {
    margin: 0;
    background: var(--papier);
    color: var(--encre);
    font: 400 1rem/1.6 var(--texte);
    font-feature-settings: "cv11", "ss01";
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

main {
    flex: 1;
}

a {
    color: var(--encre);
    text-decoration-color: var(--route);
    text-decoration-thickness: 1.5px;
    text-underline-offset: 0.22em;
}

a:hover {
    color: var(--route);
}

:focus-visible {
    outline: 2px solid var(--route);
    outline-offset: 3px;
    border-radius: 3px;
}

h1,
h2,
h3,
p {
    margin: 0;
}

img {
    max-width: 100%;
}

.skip {
    position: absolute;
    left: 1rem;
    top: -3rem;
    z-index: 30;
    padding: 0.5rem 0.9rem;
    border-radius: 6px;
    background: var(--encre);
    color: var(--blanc);
}

.skip:focus {
    top: 1rem;
}

.wrap {
    width: min(100% - 2.5rem, 74rem);
    margin-inline: auto;
}

.muted {
    color: var(--gris);
}

.small {
    font-size: 0.875rem;
}

.top {
    position: sticky;
    top: 0;
    z-index: 20;
    border-bottom: 1px solid transparent;
    background: var(--barre);
    backdrop-filter: blur(10px);
}

.top-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    min-height: 4rem;
}

.brand {
    font-weight: 600;
    text-decoration: none;
    white-space: nowrap;
}

.top nav {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 0.15rem;
    overflow-x: auto;
    scrollbar-width: none;
}

.top nav a,
.top nav .lien {
    padding: 0.4rem 0.7rem;
    border-radius: 6px;
    color: var(--doux);
    font-size: 0.94rem;
    text-decoration: none;
    white-space: nowrap;
}

.top nav a:hover,
.top nav a.actif {
    color: var(--route);
}

.top nav a.nav-cv {
    margin-left: 0.5rem;
    border: 1.5px solid var(--encre);
    color: var(--encre);
    font-weight: 600;
}

.top nav a.nav-cv:hover {
    background: var(--encre);
    color: var(--blanc);
}

.top nav form {
    margin: 0;
}

.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 2.9rem;
    padding: 0 1.3rem;
    border: 1.5px solid transparent;
    border-radius: 6px;
    font: 600 0.98rem var(--texte);
    text-decoration: none;
    cursor: pointer;
}

.btn-main {
    background: var(--route);
    color: var(--sur-route);
}

.btn-main:hover {
    background: var(--encre);
    color: var(--papier);
}

.btn-line {
    border-color: var(--encre);
    color: var(--encre);
}

.btn-line:hover {
    background: var(--encre);
    color: var(--blanc);
}

.btn-clair {
    background: #f8fafb;
    color: #15233b;
}

.btn-clair:hover {
    background: #f3dbe6;
    color: #15233b;
}

.btn-contour {
    border-color: rgb(248 250 251 / 0.45);
    color: #f8fafb;
}

.btn-contour:hover {
    border-color: #f8fafb;
    color: #f8fafb;
}

.actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.7rem;
}

.hero {
    display: grid;
    grid-template-columns: auto minmax(0, 26rem);
    align-items: end;
    justify-content: space-between;
    gap: 2rem 3rem;
    padding: clamp(3rem, 10vh, 6.5rem) 0 clamp(2.5rem, 7vh, 4.5rem);
}

.hero h1 {
    font-family: var(--titre);
    font-size: clamp(4rem, 12.5vw, 10.5rem);
    font-weight: 900;
    line-height: 0.86;
    letter-spacing: -0.055em;
}

.hero-texte {
    display: grid;
    gap: 1.4rem;
    padding-bottom: 0.6rem;
}

.dispo {
    display: inline-flex;
    align-items: center;
    justify-self: start;
    gap: 0.6rem;
    padding: 0.35rem 0.85rem 0.35rem 0.7rem;
    border: 1px solid var(--trait);
    border-radius: 999px;
    background: var(--blanc);
    font-size: 0.88rem;
    font-weight: 600;
}

.point {
    width: 0.55rem;
    height: 0.55rem;
    border-radius: 50%;
    background: var(--vert);
    box-shadow: 0 0 0 3px rgb(31 138 91 / 0.2);
}

.intro {
    max-width: 58ch;
    color: var(--doux);
    font-size: 1.1rem;
    line-height: 1.6;
}

.titre-petit {
    margin-bottom: 2rem;
    font-size: 1rem;
    font-weight: 600;
}

.route-zone {
    padding: 2.5rem 0 3rem;
    border-block: 1px solid var(--trait);
    background-color: var(--blanc);
    background-image:
        linear-gradient(rgb(44 98 196 / 0.07) 1px, transparent 1px),
        linear-gradient(90deg, rgb(44 98 196 / 0.07) 1px, transparent 1px);
    background-size: 3rem 3rem;
    scroll-margin-top: 4rem;
}

.route {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    margin: 0;
    padding: 0;
    list-style: none;
}

.etape {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding-right: 1.25rem;
}

.etape::before {
    content: "";
    position: absolute;
    top: 1.05rem;
    left: 0;
    right: 0;
    height: 3px;
    background: var(--route);
    transform-origin: left;
}

.etape-cible::before,
.etape-futur::before,
.etape-actuel::before {
    background: repeating-linear-gradient(90deg, var(--route) 0 10px, transparent 10px 18px);
}

.etape-futur::before {
    right: 50%;
    opacity: 0.5;
}

@keyframes tracer {
    from {
        transform: scaleX(0);
    }
}

.repere {
    position: relative;
    z-index: 1;
    display: grid;
    place-items: center;
    width: 2.1rem;
    height: 2.1rem;
    margin-bottom: 0.9rem;
}

.repere::before {
    content: "";
    width: 0.9rem;
    height: 0.9rem;
    border: 3px solid var(--route);
    border-radius: 50%;
    background: var(--route);
}

.etape-cible .repere::before {
    width: 1rem;
    height: 1rem;
    border-radius: 2px;
    background: var(--blanc);
    transform: rotate(45deg);
}

.etape-futur .repere::before {
    background: var(--blanc);
    opacity: 0.6;
}

.etape-actuel .repere::before {
    display: none;
}

.etape-actuel .repere {
    border-radius: 50%;
    background: var(--route);
    box-shadow: 0 0 0 6px var(--route-pale);
}

.avion {
    width: 1.25rem;
    height: 1.25rem;
    fill: currentColor;
}

.etape-actuel .avion {
    fill: var(--sur-route);
}

.quand {
    color: var(--route);
    font-size: 0.85rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.etape strong {
    font-size: 1.05rem;
    line-height: 1.3;
}

.lieu {
    color: var(--gris);
    font-size: 0.9rem;
}

.detail {
    margin-top: 0.35rem;
    color: var(--doux);
    font-size: 0.88rem;
    line-height: 1.45;
}

.etape-futur strong,
.etape-futur .lieu {
    color: var(--gris);
}

.bloc {
    padding-top: clamp(3.5rem, 9vh, 5.5rem);
    scroll-margin-top: 3rem;
}

.bloc-tete {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem 2rem;
    margin-bottom: 2rem;
}

.bloc-tete h2 {
    font-family: var(--titre);
    font-size: clamp(2.2rem, 5vw, 3.4rem);
    font-weight: 900;
    line-height: 1;
    letter-spacing: -0.04em;
}

.bloc-tete a {
    font-weight: 600;
}

.lignes-projets {
    display: grid;
    border-top: 1px solid var(--trait);
}

.projet {
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    align-items: center;
    gap: 1.5rem 3rem;
    padding: 2rem 0;
    border-bottom: 1px solid var(--trait);
}

.projet-visuel {
    display: grid;
    place-items: center;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    border: 1px solid var(--trait);
    border-radius: 8px;
    background-color: var(--blanc);
    background-image:
        linear-gradient(rgb(44 98 196 / 0.08) 1px, transparent 1px),
        linear-gradient(90deg, rgb(44 98 196 / 0.08) 1px, transparent 1px);
    background-size: 1.5rem 1.5rem;
    text-decoration: none;
}

.projet-visuel img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    transition: transform 0.4s ease;
}

.projet:hover .projet-visuel img {
    transform: scale(1.03);
}

.initiale {
    color: var(--route);
    font: 900 clamp(4rem, 9vw, 7rem) / 1 var(--titre);
    letter-spacing: -0.05em;
}

.projet-texte {
    display: grid;
    justify-items: start;
    gap: 0.75rem;
}

.projet-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem 0.75rem;
    color: var(--gris);
    font-size: 0.9rem;
}

.projet h3 {
    font-family: var(--titre);
    font-size: clamp(1.6rem, 3vw, 2.1rem);
    font-weight: 900;
    line-height: 1.08;
    letter-spacing: -0.03em;
}

.projet h3 a {
    text-decoration: none;
}

.projet-resume {
    max-width: 60ch;
    color: var(--doux);
}

.projet-liens {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.5rem;
    margin-top: 0.25rem;
    font-weight: 600;
}

.tag {
    display: inline-block;
    padding: 0.15rem 0.55rem;
    border-radius: 4px;
    background: var(--encre);
    color: var(--blanc);
    font-size: 0.78rem;
    font-weight: 600;
}

.tag-bts {
    background: var(--ciel);
}

.tag-pro {
    background: var(--route);
}

.tag-vedette {
    border: 1px solid var(--trait);
    background: var(--blanc);
    color: var(--encre);
}

.chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

.chips li,
.chips span {
    padding: 0.2rem 0.6rem;
    border: 1px solid var(--trait);
    border-radius: 4px;
    background: var(--blanc);
    color: var(--doux);
    font-size: 0.84rem;
}

.chips .plus {
    border-style: dashed;
    background: none;
}

.chips a {
    text-decoration: none;
}

.competences-grille {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
    gap: 2.5rem 3rem;
}

.groupe h3 {
    margin-bottom: 0.9rem;
    padding-bottom: 0.5rem;
    border-bottom: 1.5px solid var(--encre);
    font-size: 1rem;
}

.groupe ul {
    display: grid;
    gap: 0.6rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

.groupe li {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 8.5rem;
    align-items: center;
    gap: 0.75rem;
}

.nom {
    font-size: 0.95rem;
}

.jauge {
    position: relative;
    height: 0.6rem;
    overflow: hidden;
    border-radius: 2px;
    background: var(--trait);
}

.jauge::after {
    content: "";
    position: absolute;
    inset: 0;
    background: repeating-linear-gradient(90deg, transparent 0 calc(10% - 2px), var(--papier) calc(10% - 2px) 10%);
}

.jauge i {
    display: block;
    height: 100%;
    background: var(--route);
}

.pourcent {
    color: var(--gris);
    font-size: 0.85rem;
    font-variant-numeric: tabular-nums;
    text-align: right;
}

.passions {
    display: grid;
    grid-column: 1 / -1;
    grid-template-columns: auto auto minmax(0, 1fr);
    align-items: center;
    gap: 0.5rem 1.25rem;
    padding: 1.25rem 1.5rem;
    border-radius: 8px;
    background: var(--nuit);
    color: #f8fafb;
}

.passions .avion {
    width: 1.75rem;
    height: 1.75rem;
    fill: #e65d95;
    transform: rotate(-30deg);
}

.passions h3 {
    font-size: 1.05rem;
}

.passions p {
    max-width: 70ch;
    color: #c9d3e2;
    font-size: 0.95rem;
}

.n0 { width: 0; }
.n5 { width: 5%; }
.n10 { width: 10%; }
.n15 { width: 15%; }
.n20 { width: 20%; }
.n25 { width: 25%; }
.n30 { width: 30%; }
.n35 { width: 35%; }
.n40 { width: 40%; }
.n45 { width: 45%; }
.n50 { width: 50%; }
.n55 { width: 55%; }
.n60 { width: 60%; }
.n65 { width: 65%; }
.n70 { width: 70%; }
.n75 { width: 75%; }
.n80 { width: 80%; }
.n85 { width: 85%; }
.n90 { width: 90%; }
.n95 { width: 95%; }
.n100 { width: 100%; }

.appel {
    margin-top: clamp(4rem, 10vh, 6.5rem);
    padding: clamp(3rem, 8vh, 4.5rem) 0;
    background: var(--nuit);
    color: #f8fafb;
    scroll-margin-top: 4rem;
}

.appel-inner {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: end;
    gap: 2rem 4rem;
}

.appel h2 {
    font-family: var(--titre);
    font-size: clamp(2.4rem, 6vw, 4.2rem);
    font-weight: 900;
    line-height: 0.95;
    letter-spacing: -0.045em;
}

.appel p {
    max-width: 44ch;
    margin-top: 1rem;
    color: #c9d3e2;
    font-size: 1.05rem;
}

.appel-actions {
    display: grid;
    justify-items: start;
    gap: 1.2rem;
}

.appel-mail {
    color: #f8fafb;
    font-size: clamp(1.15rem, 2.4vw, 1.6rem);
    font-weight: 600;
    text-decoration-color: var(--route);
    text-decoration-thickness: 2px;
    overflow-wrap: anywhere;
}

.appel-mail:hover {
    color: var(--route-pale);
}

.pied {
    background: var(--nuit);
    color: #9fb0c6;
    font-size: 0.88rem;
}

.pied-inner {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: 0.75rem 2rem;
    padding: 1.4rem 0 1.8rem;
}

main:has(> .appel:last-child) + .pied .pied-inner {
    border-top: 1px solid rgb(248 250 251 / 0.12);
}

.pied nav {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem 1.25rem;
}

.pied a {
    color: #c9d3e2;
    text-decoration: none;
}

.pied a:hover {
    color: #fff;
    text-decoration: underline;
}

main > .appel:last-child {
    margin-bottom: 0;
}

.page-projets,
.page-contact {
    padding: clamp(2.5rem, 8vh, 4.5rem) 0 clamp(3rem, 8vh, 5rem);
}

.page-tete h1,
.contact-intro h1 {
    font-family: var(--titre);
    font-size: clamp(3rem, 8vw, 5.5rem);
    font-weight: 900;
    line-height: 0.92;
    letter-spacing: -0.05em;
}

.page-tete .intro,
.contact-intro .intro {
    margin-top: 1.1rem;
}

.compteurs {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.5rem;
    margin-top: 1rem;
    color: var(--gris);
}

.compteurs strong {
    color: var(--encre);
}

.filtres {
    display: grid;
    gap: 0.8rem;
    margin: 2.25rem 0 0.5rem;
    padding-bottom: 1.75rem;
}

.filtres-categories,
.filtres-technos {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}

.filtres a {
    padding: 0.35rem 0.9rem;
    border: 1px solid var(--trait);
    border-radius: 999px;
    background: var(--blanc);
    color: var(--doux);
    font-size: 0.9rem;
    text-decoration: none;
}

.filtres-technos a {
    padding: 0.2rem 0.65rem;
    font-size: 0.82rem;
}

.filtres a span {
    color: var(--gris);
}

.filtres a:hover {
    border-color: var(--encre);
    color: var(--encre);
}

.filtres a[aria-current] {
    border-color: var(--encre);
    background: var(--encre);
    color: var(--blanc);
}

.filtres a[aria-current] span {
    color: inherit;
}

.page-contact {
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    align-items: start;
    gap: 2.5rem 4rem;
}

.coordonnees {
    display: grid;
    gap: 1rem;
    margin: 2rem 0 0;
    padding-top: 1.5rem;
    border-top: 1px solid var(--trait);
}

.coordonnees dt {
    color: var(--gris);
    font-size: 0.85rem;
}

.coordonnees dd {
    margin: 0.1rem 0 0;
    font-weight: 600;
    overflow-wrap: anywhere;
}

.formulaire {
    padding: clamp(1.25rem, 3vw, 2rem);
    border: 1px solid var(--trait);
    border-radius: 10px;
    background: var(--blanc);
}

.retour a {
    color: var(--gris);
    text-decoration: none;
}

.retour a:hover {
    color: var(--route);
}

.projet-bandeau {
    padding: clamp(2rem, 6vh, 3.5rem) 0 2.5rem;
    border-bottom: 1px solid var(--trait);
    background-color: var(--blanc);
    background-image:
        linear-gradient(rgb(44 98 196 / 0.06) 1px, transparent 1px),
        linear-gradient(90deg, rgb(44 98 196 / 0.06) 1px, transparent 1px);
    background-size: 3rem 3rem;
}

.projet-bandeau-inner {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1.5rem 2rem;
}

.projet-bandeau-inner > div {
    flex: 1 1 30rem;
}

.projet-bandeau h1 {
    margin-top: 1rem;
    font-family: var(--titre);
    font-size: clamp(2.6rem, 6vw, 4.4rem);
    font-weight: 900;
    line-height: 0.95;
    letter-spacing: -0.045em;
}

.projet-bandeau .intro {
    margin-top: 1rem;
}

.tags {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-top: 1.4rem;
}

.projet-corps {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 19rem;
    align-items: start;
    gap: 2.5rem 4rem;
    padding: 2.5rem 0 1rem;
}

.texte {
    max-width: 68ch;
    color: var(--doux);
    font-size: 1.05rem;
}

.texte h2 {
    margin: 2rem 0 0.7rem;
    padding-top: 1.5rem;
    border-top: 1px solid var(--trait);
    color: var(--encre);
    font-size: 1.35rem;
    letter-spacing: -0.01em;
}

.texte > h2:first-child,
.texte > .projet-image + h2 {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
}

.texte p + p,
.texte ul + p,
.texte p + ul {
    margin-top: 0.9rem;
}

.texte ul {
    padding-left: 1.2rem;
}

.texte li::marker {
    color: var(--route);
}

.projet-image {
    display: block;
    width: 100%;
    height: auto;
    max-height: 40rem;
    margin: 0 0 2rem;
    border: 1px solid var(--trait);
    border-radius: 10px;
    background: var(--blanc);
    object-fit: contain;
}

.tableau {
    overflow-x: auto;
    margin: 1rem 0;
    border: 1px solid var(--trait);
    border-radius: 8px;
    background: var(--blanc);
}

.tableau table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.95rem;
}

.tableau th,
.tableau td {
    padding: 0.65rem 0.9rem;
    border-bottom: 1px solid var(--trait);
    text-align: left;
}

.tableau th {
    color: var(--encre);
    font-size: 0.9rem;
}

.tableau tr:last-child td {
    border-bottom: 0;
}

.card {
    padding: clamp(1.25rem, 3vw, 1.75rem);
    border: 1px solid var(--trait);
    border-radius: 10px;
    background: var(--blanc);
}

.card > h2 {
    margin-bottom: 1.25rem;
    font-size: 1.3rem;
    letter-spacing: -0.01em;
}

.projet-infos {
    position: sticky;
    top: 5.5rem;
}

.projet-infos h2 {
    margin-bottom: 0.9rem;
    font-size: 1rem;
}

.projet-infos dl {
    display: grid;
    gap: 0.9rem;
    margin: 1.5rem 0 0;
    padding-top: 1.25rem;
    border-top: 1px solid var(--trait);
}

.projet-infos dl:first-child {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
}

.projet-infos dt {
    color: var(--gris);
    font-size: 0.85rem;
}

.projet-infos dd {
    margin: 0.1rem 0 0;
    font-weight: 600;
}

.pictogramme {
    display: none;
}

.statut-cours::before,
.statut-fini::before {
    content: "";
    display: inline-block;
    width: 0.5rem;
    height: 0.5rem;
    margin-right: 0.45rem;
    border-radius: 50%;
    background: #d79b1e;
}

.statut-fini::before {
    background: var(--vert);
}

.form {
    display: grid;
    gap: 1.1rem;
}

.field {
    display: grid;
    gap: 0.35rem;
}

.field-row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.1rem;
    align-items: end;
}

.field-row.trois {
    grid-template-columns: repeat(3, minmax(0, 1fr));
}

label {
    font-size: 0.92rem;
    font-weight: 600;
}

input[type="text"],
input[type="email"],
input[type="password"],
input[type="url"],
input[type="number"],
select,
textarea {
    width: 100%;
    padding: 0.7rem 0.85rem;
    border: 1px solid var(--trait);
    border-radius: 6px;
    background: var(--champ);
    color: var(--encre);
    font: inherit;
}

textarea {
    resize: vertical;
}

input:focus,
select:focus,
textarea:focus {
    border-color: var(--route);
    outline: none;
    box-shadow: 0 0 0 3px var(--route-pale);
}

input[type="file"] {
    color: var(--doux);
    font: inherit;
    font-size: 0.9rem;
}

[aria-invalid="true"] {
    border-color: var(--rouge);
}

.err {
    color: var(--rouge);
    font-size: 0.86rem;
}

.check {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    min-height: 2.9rem;
    font-weight: 500;
}

.form .btn {
    justify-self: start;
}

.form-bas {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem 1.25rem;
}

.form-bas p {
    flex: 1 1 16rem;
}

.piege {
    position: absolute;
    left: -10000px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

.notice {
    padding: 0.75rem 1rem;
    border-radius: 6px;
    font-size: 0.95rem;
}

.notice-ok {
    border: 1px solid rgb(31 138 91 / 0.35);
    background: rgb(31 138 91 / 0.1);
    color: var(--vert);
}

.notice-error {
    border: 1px solid rgb(194 65 45 / 0.35);
    background: rgb(194 65 45 / 0.08);
    color: var(--rouge);
}

.lien {
    padding: 0;
    border: 0;
    background: none;
    color: var(--doux);
    font: inherit;
    font-size: 0.92rem;
    text-decoration: underline;
    text-underline-offset: 0.2em;
    cursor: pointer;
}

.lien:hover {
    color: var(--route);
}

.lien-danger:hover {
    color: var(--rouge);
}

.admin {
    display: grid;
    gap: 1rem;
    padding: 2.5rem 0 3rem;
}

.admin-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
}

.admin-head h1 {
    font-family: var(--titre);
    font-size: 2.2rem;
    font-weight: 900;
    letter-spacing: -0.04em;
}

.table {
    overflow-x: auto;
}

table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.95rem;
}

th,
td {
    padding: 0.7rem 0.6rem;
    border-bottom: 1px solid var(--trait);
    text-align: left;
}

th {
    color: var(--gris);
    font-size: 0.85rem;
    font-weight: 600;
}

.actions-ligne {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem;
}

.actions-ligne form {
    margin: 0;
}

.badge {
    margin-left: 0.5rem;
    padding: 0.15rem 0.55rem;
    border-radius: 999px;
    background: var(--route);
    color: var(--sur-route);
    font-size: 0.8rem;
    vertical-align: middle;
}

.messages {
    display: grid;
    gap: 0.75rem;
}

.message {
    display: grid;
    gap: 0.5rem;
    padding: 1rem;
    border: 1px solid var(--trait);
    border-radius: 8px;
    background: var(--champ);
}

.message.non-lu {
    border-left: 3px solid var(--route);
}

.message header {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.4rem 1rem;
}

.message p {
    color: var(--doux);
    overflow-wrap: anywhere;
}

.message .sujet {
    color: var(--encre);
    font-weight: 600;
}

.reglages {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.75rem 2rem;
}

.reglage {
    display: grid;
    grid-template-columns: 9rem minmax(0, 1fr) 3rem;
    align-items: center;
    gap: 0.75rem;
}

.reglage label {
    display: grid;
}

.reglage.cache label {
    opacity: 0.5;
}

.reglage output {
    color: var(--doux);
    font-size: 0.85rem;
    font-variant-numeric: tabular-nums;
    text-align: right;
}

input[type="range"] {
    width: 100%;
    accent-color: var(--route);
}

.version-en {
    display: grid;
    gap: 1rem;
    padding: 1rem 1.1rem;
    border: 1px dashed var(--trait);
    border-radius: 8px;
}

.version-en summary {
    font-weight: 600;
    cursor: pointer;
}

.version-en[open] summary {
    margin-bottom: 0.25rem;
}

.langues {
    display: inline-flex;
    flex: none;
    margin-left: 0.25rem;
    padding: 3px;
    border: 1px solid var(--trait);
    border-radius: 999px;
    background: var(--blanc);
}

.langues a {
    padding: 0.28rem 0.6rem;
    border-radius: 999px;
    color: var(--gris);
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-decoration: none;
    transition: background-color 0.2s, color 0.2s;
}

.langues a:hover {
    color: var(--encre);
}

.langues a[aria-current] {
    background: var(--encre);
    color: var(--papier);
}

.ajout {
    margin-top: 1.5rem;
    padding-top: 1rem;
    border-top: 1px solid var(--trait);
}

.ajout summary {
    color: var(--doux);
    cursor: pointer;
}

.form.ligne {
    grid-template-columns: repeat(3, minmax(0, 1fr)) auto;
    align-items: end;
    margin-top: 1rem;
}

.supprimer-liste {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.5rem;
    margin: 1.25rem 0 0;
    padding: 0;
    list-style: none;
    font-size: 0.9rem;
}

.supprimer-liste li {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.supprimer-liste form {
    margin: 0;
}

.apercu {
    width: 16rem;
    border: 1px solid var(--trait);
    border-radius: 8px;
}

.plain {
    width: min(100% - 2.5rem, 44rem);
    margin: 0 auto;
    padding: clamp(2.5rem, 7vh, 5rem) 0 3rem;
}

.plain-narrow {
    width: min(100% - 2.5rem, 26rem);
}

.plain h1 {
    margin: 0 0 2rem;
    font-family: var(--titre);
    font-size: clamp(2.4rem, 6vw, 3.4rem);
    font-weight: 900;
    line-height: 1;
    letter-spacing: -0.045em;
}

.plain section {
    padding: 0 0 1.75rem;
}

.plain h2 {
    margin-bottom: 0.6rem;
    font-size: 1.15rem;
}

.plain p {
    color: var(--doux);
}

.plain p + p {
    margin-top: 0.6rem;
}

::selection {
    background: var(--route);
    color: var(--sur-route);
}

html {
    scrollbar-color: var(--trait) var(--papier);
}

.brand {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
}

.brand img {
    width: 1.75rem;
    height: 1.75rem;
    border-radius: 7px;
    transition: transform 0.3s ease;
}

.brand:hover img {
    transform: rotate(-8deg) scale(1.06);
}

.nav-sep {
    flex: none;
    width: 1px;
    height: 1.2rem;
    margin: 0 0.45rem;
    background: var(--trait);
}

.theme {
    display: grid;
    flex: none;
    place-items: center;
    width: 2.4rem;
    height: 2.4rem;
    margin-left: 0.25rem;
    padding: 0;
    border: 1px solid var(--trait);
    border-radius: 50%;
    background: var(--blanc);
    color: var(--encre);
    cursor: pointer;
    transition: transform 0.4s ease, border-color 0.2s;
}

.theme:hover {
    border-color: var(--route);
    transform: rotate(25deg);
}

.theme svg {
    width: 1.1rem;
    height: 1.1rem;
}

.theme-lune {
    fill: currentColor;
}

.theme-soleil {
    display: none;
    fill: currentColor;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
}

:root[data-theme="dark"] .theme-lune {
    display: none;
}

:root[data-theme="dark"] .theme-soleil {
    display: block;
}

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .theme-lune {
        display: none;
    }

    :root:not([data-theme="light"]) .theme-soleil {
        display: block;
    }
}

.haut {
    position: fixed;
    right: 1.25rem;
    bottom: 1.25rem;
    z-index: 15;
    display: grid;
    place-items: center;
    width: 3.25rem;
    height: 3.25rem;
    overflow: hidden;
    border-radius: 50%;
    border: 1px solid var(--trait);
    background: var(--nuit);
    color: #f8fafb;
    box-shadow: 0 10px 28px rgb(8 15 27 / 0.3);
    opacity: 0;
    pointer-events: none;
    transform: translateY(1rem) scale(0.9);
    transition: opacity 0.3s, transform 0.3s;
}

.haut::before {
    content: "";
    position: absolute;
    inset: 3px;
    border-radius: 50%;
    background:
        repeating-conic-gradient(from -1deg, rgb(248 250 251 / 0.35) 0 2deg, transparent 2deg 30deg),
        conic-gradient(var(--route) calc(var(--avance, 0) * 1turn), rgb(248 250 251 / 0.12) 0);
    -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
    mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
}

.haut.visible {
    opacity: 1;
    pointer-events: auto;
    transform: none;
}

.haut .avion {
    position: relative;
    width: 1.3rem;
    height: 1.3rem;
    fill: currentColor;
    transform: rotate(-90deg);
    transition: transform 0.3s ease;
}

.haut:hover {
    color: #f8fafb;
}

.haut:hover .avion {
    transform: rotate(-90deg) translateX(3px);
}

.haut.decolle .avion {
    animation: decoller 0.7s cubic-bezier(0.5, 0, 0.75, 0) forwards;
}

@keyframes decoller {
    to {
        opacity: 0;
        transform: rotate(-90deg) translateX(2.6rem) scale(0.7);
    }
}

.ligne-nom {
    display: block;
    overflow: hidden;
    padding-bottom: 0.14em;
    margin-bottom: -0.14em;
}

.ligne-nom > span {
    display: inline-block;
    animation: monter 0.9s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

.ligne-nom + .ligne-nom > span {
    animation-delay: 0.12s;
}

@keyframes monter {
    from {
        transform: translateY(105%);
    }
}

.hero-texte {
    animation: apparaitre 0.8s 0.35s ease-out both;
}

@keyframes apparaitre {
    from {
        opacity: 0;
        transform: translateY(0.6rem);
    }
}

.js .route-zone:not(.en-vol) .etape::before {
    transform: scaleX(0);
}

.js .route-zone:not(.en-vol) .repere,
.js .route-zone:not(.en-vol) .etape > :not(.repere) {
    opacity: 0;
}

.en-vol .etape {
    --pause: 0s;
}

.en-vol .etape:nth-child(2) {
    --pause: 0.4s;
}

.en-vol .etape:nth-child(3) {
    --pause: 0.8s;
}

.en-vol .etape:nth-child(4) {
    --pause: 1.2s;
}

.en-vol .etape:nth-child(5) {
    --pause: 1.6s;
}

.en-vol .etape::before {
    animation: tracer 0.5s var(--pause) ease-out both;
}

.en-vol .etape-actuel::before,
.en-vol .etape-cible::before,
.en-vol .etape-futur::before {
    animation: tracer 0.5s var(--pause) ease-out both, marcher 0.9s linear infinite;
}

@keyframes marcher {
    to {
        background-position: 18px 0;
    }
}

.en-vol .repere {
    animation: pop 0.45s var(--pause) cubic-bezier(0.3, 1.6, 0.5, 1) both;
}

@keyframes pop {
    from {
        opacity: 0;
        transform: scale(0.2);
    }
}

.en-vol .etape > :not(.repere) {
    animation: apparaitre 0.5s calc(var(--pause) + 0.15s) ease-out both;
}

.en-vol .etape-actuel .repere {
    animation: voler 1.5s cubic-bezier(0.5, 0, 0.25, 1) both;
}

@keyframes voler {
    from {
        transform: translate(var(--dx, 0), var(--dy, 0));
    }
}

.etape-actuel .repere::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 2px solid var(--route);
    opacity: 0;
}

.en-vol .etape-actuel .repere::after {
    animation: ping 2.4s 1.6s ease-out infinite;
}

@keyframes ping {
    0% {
        opacity: 0.7;
        transform: scale(1);
    }

    70%,
    100% {
        opacity: 0;
        transform: scale(2.3);
    }
}

.en-vol .etape-actuel .avion {
    animation: tanguer 3s 1.6s ease-in-out infinite;
}

@keyframes tanguer {
    50% {
        transform: rotate(-8deg) translateY(-1px);
    }
}

.en-vol .etape-cible .repere::before {
    animation: balise 2s 2s ease-in-out infinite;
}

@keyframes balise {
    50% {
        box-shadow: 0 0 0 6px var(--route-pale);
    }
}

.etape strong {
    transition: color 0.2s;
}

.etape:hover strong {
    color: var(--route);
}

.projet-visuel {
    position: relative;
}

.projet-visuel:not(:has(img))::before {
    content: "";
    position: absolute;
    left: 14%;
    right: 14%;
    top: 22%;
    height: 56%;
    border: 2px dashed var(--route);
    border-color: var(--route) transparent transparent;
    border-radius: 50% / 100% 100% 0 0;
    opacity: 0.35;
    transition: opacity 0.3s;
}

.projet-visuel:not(:has(img))::after {
    content: "";
    position: absolute;
    left: calc(14% - 5px);
    top: calc(78% - 5px);
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: var(--route);
    opacity: 0.5;
}

.initiale {
    position: relative;
    transition: transform 0.4s cubic-bezier(0.3, 1.4, 0.5, 1);
}

.projet:hover .initiale {
    transform: translateY(-6px) rotate(-4deg);
}

.projet:hover .projet-visuel::before {
    opacity: 0.7;
}

.projet h3 a {
    background: linear-gradient(var(--route), var(--route)) 0 100% / 0 2px no-repeat;
    transition: background-size 0.35s ease;
}

.projet:hover h3 a {
    background-size: 100% 2px;
}

.coordonnees-gps,
.heure {
    margin-left: 0.75rem;
    padding-left: 0.75rem;
    border-left: 1px solid rgb(248 250 251 / 0.18);
    font-variant-numeric: tabular-nums;
}

.page-cv {
    padding: clamp(2.5rem, 8vh, 4.5rem) 0 clamp(3rem, 8vh, 5rem);
}

.cv-tete {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1.5rem 2rem;
    margin-bottom: 2.5rem;
}

.cv-tete h1 {
    font-family: var(--titre);
    font-size: clamp(3rem, 8vw, 5.5rem);
    font-weight: 900;
    line-height: 0.92;
    letter-spacing: -0.05em;
}

.cv-tete .intro {
    margin-top: 1rem;
}

.cv-feuille {
    margin: 0 auto;
    width: min(100%, 54rem);
    padding: clamp(0.5rem, 2vw, 1rem);
    border: 1px solid var(--trait);
    border-radius: 12px;
    background: var(--blanc);
    box-shadow: 0 30px 60px -30px rgb(21 35 59 / 0.35);
}

.cv-feuille img {
    display: block;
    width: 100%;
    height: auto;
    border-radius: 6px;
    -webkit-user-drag: none;
    user-select: none;
}

@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }

    *,
    *::before,
    *::after {
        animation: none !important;
        transition: none !important;
    }
}

@media (max-width: 62rem) {
    .hero {
        grid-template-columns: minmax(0, 1fr);
    }

    .route {
        grid-template-columns: minmax(0, 1fr);
        gap: 0;
    }

    .etape {
        display: grid;
        grid-template-columns: 2.1rem minmax(0, 1fr);
        column-gap: 1rem;
        padding: 0 0 1.75rem;
    }

    .etape > :not(.repere) {
        grid-column: 2;
    }

    .repere {
        grid-row: 1 / span 4;
        margin: 0;
    }

    .etape::before {
        top: 1.05rem;
        bottom: -1.05rem;
        left: calc(1.05rem - 1.5px);
        right: auto;
        width: 3px;
        height: auto;
        transform-origin: top;
    }

    .etape-cible::before,
    .etape-actuel::before {
        background: repeating-linear-gradient(180deg, var(--route) 0 10px, transparent 10px 18px);
    }

    .etape-futur::before {
        display: none;
    }

    .projet,
    .page-contact,
    .appel-inner,
    .projet-corps {
        grid-template-columns: minmax(0, 1fr);
    }

    .projet-infos {
        position: static;
    }

    .passions {
        grid-template-columns: auto minmax(0, 1fr);
    }

    .passions p {
        grid-column: 1 / -1;
    }
}

@keyframes tracer-bas {
    from {
        transform: scaleY(0);
    }
}

@media (max-width: 44rem) {
    .field-row.trois,
    .reglages,
    .form.ligne,
    .field-row {
        grid-template-columns: minmax(0, 1fr);
    }

    .top nav a {
        padding: 0.4rem 0.45rem;
        font-size: 0.88rem;
    }

    .top nav .nav-ancre,
    .nav-sep {
        display: none;
    }

    .top-inner {
        gap: 0.4rem;
    }

    .top nav {
        gap: 0;
    }

    .top nav a.nav-cv {
        margin-left: 0.2rem;
    }

    .langues a {
        padding: 0.25rem 0.42rem;
    }

    .theme {
        width: 2.2rem;
        height: 2.2rem;
        margin-left: 0;
    }

    .brand span {
        display: none;
    }
}

@media (max-width: 62rem) {
    .js .route-zone:not(.en-vol) .etape::before {
        transform: scaleY(0);
    }

    .en-vol .etape::before {
        animation-name: tracer-bas;
    }

    .en-vol .etape-actuel::before,
    .en-vol .etape-cible::before {
        animation-name: tracer-bas, marcher-bas;
    }
}

@keyframes marcher-bas {
    to {
        background-position: 0 18px;
    }
}

@media (max-width: 24rem) {
    .top nav a {
        padding: 0.35rem 0.3rem;
        font-size: 0.82rem;
    }

    .langues a {
        padding: 0.22rem 0.36rem;
        font-size: 0.75rem;
    }
}
