/* OSDIGITALIS · site complet
   Système de design P1 « L'épure », élevé : noir, grands titres Space Grotesk très serrés,
   encre pour les réalisations, cadre teinté des captures, bande contact bleue, bandeau spectre.
   Sommaire : 1 jetons · 2 base · 3 boutons et liens · 4 en-tête · 5 pied · 6 composants partagés
   · 7 accueil · 8 mouvement · 9 adaptations. */

/* ===== Polices locales (variables, sous-ensemble latin) : aucune requête vers un service tiers. ===== */
@font-face { font-family: "Space Grotesk"; font-style: normal; font-weight: 300 700; font-display: swap; src: url("assets/fonts/space-grotesk-latin.woff2") format("woff2"); }
@font-face { font-family: "Inter"; font-style: normal; font-weight: 100 900; font-display: swap; src: url("assets/fonts/inter-latin.woff2") format("woff2"); }
@font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 100 800; font-display: swap; src: url("assets/fonts/jetbrains-mono-latin.woff2") format("woff2"); }

/* ===== 1. Jetons ===== */
:root {
  color-scheme: dark;
  --brand-green: #1EBA61;
  --brand-blue: #164CA9;
  --brand-teal: #17A7CE;
  --brand-amber: #F8B021;
  --brand-magenta: #AD258D;
  /* Couleurs des domaines de l'espace formation, tirées de la charte et ajustées par thème pour garder 3:1 au moins
     contre les fonds de tuile et de section (sombre : #0A0A0A et #14233B ; clair : #FFFFFF et #F4F6F9). */
  --fam-os: var(--brand-teal);
  --fam-prog: color-mix(in srgb, var(--brand-blue) 60%, #fff);
  --fam-devops: var(--brand-green);
  --fam-db: color-mix(in srgb, var(--brand-magenta) 75%, #fff);
  --logo-bg: #0A0A0A;
  --ico-linkedin: #5AA5F2;
  --ico-whatsapp: #25D366;
  --bg: #0A0A0A;
  --surface: #14233B;
  --surface-deep: #101B2C;
  --text: #F4F6F9;
  --muted: #B6C3D2;
  --line: #354359;
  --accent: #1EBA61;
  --accent-line: var(--accent);
  --accent-ink: #0A0A0A;
  --link: #92BFFF;
  --focus: #F8B021;
  --ghost: #5C6877;
  --off: #8C99AB;
  --bezel: #0A0A0A;
  --tile-bg: var(--surface);
  --tile-line: var(--line);
  /* Encre des initiales sur les pastilles à initiale des applications (voir « Logos d'applications »). */
  --on-fam: #0A0A0A;
  --frame-base: var(--bg);
  --display: "Space Grotesk", "Helvetica Neue", Arial, sans-serif;
  --body: "Inter", "Helvetica Neue", Arial, sans-serif;
  --mono: "JetBrains Mono", Consolas, "Courier New", monospace;
  --max-width: 1240px;
  --gutter: clamp(22px, 5vw, 72px);
  --col-gap: clamp(16px, 2vw, 32px);
  --hdr: 128px;
  --hdr-compact: 72px;
  --ease: cubic-bezier(.2, .7, .2, 1);
  --section-y: clamp(72px, 9vw, 144px);
  /* Rythme des sections serrées (zone de transition, section d'appoint) : 56 px sur mobile, 88 px au plus sur grand écran. */
  --section-y-tight: clamp(56px, 6vw, 88px);
  --fs-h2: clamp(25px, 3.2vw, 46px);
  --fs-h3: clamp(21px, 2vw, 30px);
  font-family: var(--body);
  font-synthesis: none;
}
:root[data-theme="light"] {
  --ico-linkedin: #0A66C2;
  --ico-whatsapp: #128C7E;
  color-scheme: light;
  --logo-bg: #FFFFFF;
  --bg: #F4F6F9;
  --surface: #FFFFFF;
  --surface-deep: #E6EAEF;
  --text: #14233B;
  --muted: #5B6B7B;
  --line: #C9D2DD;
  --accent-line: #0E8F45;
  --link: #164CA9;
  --focus: #164CA9;
  --ghost: #7D8B9C;
  --off: #627084;
  --bezel: #14233B;
  --tile-line: var(--ghost);
  --on-fam: #FFFFFF;
  --frame-base: var(--surface);
  --fam-os: color-mix(in srgb, var(--brand-teal) 80%, #000);
  --fam-prog: var(--brand-blue);
  --fam-devops: color-mix(in srgb, var(--brand-green) 75%, #000);
  --fam-db: var(--brand-magenta);
}
@media (max-width: 480px) {
  :root { --hdr: 112px; }
}

/* ===== 2. Base ===== */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; scroll-padding-top: calc(var(--hdr-compact) + 24px); -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
body { position: relative; margin: 0; background: var(--bg); color: var(--text); font-size: 16px; line-height: 1.6; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
[hidden] { display: none !important; }
::selection { background: var(--accent); color: var(--accent-ink); }
h1, h2, h3, h4, p, figure, dl, dd, blockquote { margin: 0; }
h1, h2, h3, h4 { font-family: var(--display); font-weight: 600; }
h1, h2, h3 { text-wrap: balance; }
p, li, dd { text-wrap: pretty; }
h1 { font-weight: 700; letter-spacing: -.05em; line-height: 1.06; }
h2 { font-size: var(--fs-h2); line-height: 1.12; letter-spacing: -.04em; }
h3 { font-size: var(--fs-h3); line-height: 1.18; letter-spacing: -.035em; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; cursor: pointer; }
a, button, summary { -webkit-tap-highlight-color: transparent; }
:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }
img, svg { display: block; max-width: 100%; }
img { height: auto; }
ul, ol { margin: 0; padding: 0; list-style: none; }
.container { width: min(var(--max-width), calc(100% - 2 * var(--gutter))); margin-inline: auto; }
.grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
.skip-link { position: fixed; top: 12px; left: 12px; z-index: 100; padding: 12px 18px; background: var(--text); color: var(--bg); font-weight: 500; transform: translateY(-200%); }
.skip-link:focus { transform: translateY(0); }
.scroll-sentinel { position: absolute; top: 0; left: 0; width: 1px; height: 140px; pointer-events: none; }
.mono { font-family: var(--mono); }
.lead { font-size: clamp(18px, 1.7vw, 22px); line-height: 1.65; max-width: 62ch; }
.section-label { margin-bottom: 20px; color: var(--muted); font-size: 13px; line-height: 1.4; }
.dot { display: inline-block; flex: 0 0 8px; width: 8px; height: 8px; border-radius: 50%; }
.dot--dev { background: var(--brand-blue); }
.dot--devops { background: var(--brand-green); }
.dot--formation { background: var(--brand-amber); }
.dot--magenta { background: var(--brand-magenta); }

/* ===== 3. Boutons et liens ===== */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 16px; min-height: 52px; padding: 14px 24px; border: 1px solid transparent; border-radius: 6px; background: none; font-family: var(--body); font-size: 15px; font-weight: 500; line-height: 1.25; text-align: center; transition: background-color .2s var(--ease), color .2s var(--ease), border-color .2s var(--ease), transform .1s var(--ease); }
.btn:active { transform: translateY(1px); }
.btn--primary { background: var(--accent); color: var(--accent-ink); }
.btn--primary:hover { background: var(--text); color: var(--bg); }
.btn--secondary { border-color: var(--line); }
.btn--secondary:hover { border-color: var(--accent); background: var(--surface); }
.btn--sm { min-height: 44px; padding: 10px 18px; font-size: 14px; }
.btn--block { display: flex; width: 100%; }
.btn svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
.btn > span[aria-hidden="true"] { font-size: 18px; line-height: 1; transition: transform .2s var(--ease); }
.text-link { display: inline-flex; align-items: center; gap: 12px; min-height: 44px; padding-block: 8px; font-size: 15px; font-weight: 500; }
.text-link > span[aria-hidden="true"] { font-size: 20px; line-height: 1; color: var(--link); transition: transform .2s var(--ease); }
/* Flèches : « → » page du site, « ↗ » lien externe, « ↓ » téléchargement. Le glissé suit le sens de la flèche,
   déduit de la destination du lien (aucune classe à ajouter). */
:is(.text-link, .btn):hover > span[aria-hidden="true"] { transform: translate(2px, -2px); }
:is(.text-link, .btn):not([href^="http"], [href^="mailto:"], [download]):hover > span[aria-hidden="true"] { transform: translateX(3px); }
:is(.text-link, .btn)[download]:hover > span[aria-hidden="true"] { transform: translateY(3px); }
.text-link:hover { text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.link-inline { color: var(--link); text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
.link-inline:hover { text-decoration-thickness: 2px; }

/* ===== 4. En-tête ===== */
.header-shell { --hdr-now: var(--hdr); position: relative; height: var(--hdr); }
.header-shell.is-compact { --hdr-now: var(--hdr-compact); }
.site-header { position: absolute; top: 0; left: 0; right: 0; z-index: 50; height: var(--hdr-now); background: var(--logo-bg); border-bottom: 1px solid var(--line); transition: height 240ms var(--ease); }
.js .site-header { position: fixed; }
.spectrum { position: absolute; top: 0; left: 0; right: 0; height: 3px; display: flex; overflow: hidden; pointer-events: none; }
.spectrum > span:not(.spectrum-cover) { flex: 1 1 0; }
.spectrum > span:nth-child(1) { background: var(--brand-green); }
.spectrum > span:nth-child(2) { background: var(--brand-blue); }
.spectrum > span:nth-child(3) { background: var(--brand-teal); }
.spectrum > span:nth-child(4) { background: var(--brand-amber); }
.spectrum > span:nth-child(5) { background: var(--brand-magenta); }
.spectrum-cover { position: absolute; inset: 0; background: var(--line); transform: scaleX(0); transform-origin: 100% 50%; will-change: transform; }
.header-bar { display: flex; align-items: center; justify-content: space-between; gap: 24px; height: 100%; }
/* Marque et actions de même largeur : la navigation reste au même endroit quand l'en-tête passe en compact. */
.header-bar > .brand, .header-bar > .header-actions { flex: 1 1 0; }
.brand { display: inline-flex; align-items: center; gap: 20px; flex-shrink: 0; }
.brand-logo { display: block; width: 96px; height: 96px; background: var(--logo-bg); }
.brand-face { display: none; width: auto; height: 40px; background: var(--logo-bg); }
.brand-name { font-family: var(--display); font-size: 18px; font-weight: 700; letter-spacing: -.02em; line-height: 1.25; }
.brand-name > span { display: block; margin-top: 4px; font-family: var(--body); font-size: 11px; font-weight: 400; letter-spacing: .02em; color: var(--muted); }
.header-shell.is-compact .brand-logo { display: none; }
.header-shell.is-compact .brand-face { display: block; }
.header-shell.is-compact .brand { gap: 12px; }
.header-shell.is-compact .brand-name > span { display: none; }
.main-nav { display: flex; align-items: center; gap: clamp(18px, 2.2vw, 34px); }
.nav-item { position: relative; }
.nav-link { position: relative; display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 2px; border: 0; background: none; color: var(--muted); font-family: var(--body); font-size: 14px; font-weight: 400; line-height: 1.2; transition: color .2s var(--ease); }
.nav-link:hover, .nav-link[aria-expanded="true"], .nav-link[aria-current="page"], .nav-link.is-current { color: var(--text); }
.nav-link[aria-current="page"]::after, .nav-link.is-current::after { content: ""; position: absolute; left: 2px; right: 2px; bottom: 6px; height: 2px; background: var(--accent-line); }
.nav-trigger svg { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; transition: transform .2s var(--ease); }
.nav-trigger[aria-expanded="true"] svg { transform: rotate(180deg); }
.expertises-panel { position: absolute; top: calc(100% + 14px); left: -20px; z-index: 60; width: min(440px, 80vw); padding: 10px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; }
.expertises-panel ul { display: grid; gap: 2px; }
.expertises-panel a { display: grid; grid-template-columns: 8px 1fr; column-gap: 16px; align-items: start; padding: 14px 16px; border-radius: 6px; }
.expertises-panel a:hover, .expertises-panel a[aria-current="page"] { background: var(--surface-deep); }
.expertises-panel .dot { margin-top: 8px; }
.panel-name { display: block; font-family: var(--display); font-size: 17px; font-weight: 600; letter-spacing: -.02em; line-height: 1.3; }
.panel-desc { display: block; margin-top: 2px; color: var(--muted); font-size: 14px; line-height: 1.5; }
.header-actions { display: flex; align-items: center; justify-content: flex-end; gap: 14px; }
.header-cta { border-color: var(--line); font-size: 13px; }
.header-cta:hover { border-color: var(--accent); }
.header-cta[aria-current="page"] { border-color: var(--accent-line); }
.theme-toggle { display: grid; place-items: center; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 50%; background: transparent; }
.theme-toggle:hover { background: var(--surface); }
.theme-toggle svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
.icon-moon, [data-theme="light"] .icon-sun { display: none; }
[data-theme="light"] .icon-moon { display: block; }
.menu-toggle { position: relative; display: none; place-items: center; width: 44px; height: 44px; padding: 0; background: transparent; border: 0; }
.menu-toggle span { position: absolute; left: 11px; top: calc(50% - .75px); display: block; width: 22px; height: 1.5px; background: var(--text); transition: transform .24s var(--ease); }
.menu-toggle span:first-child { transform: translateY(-4px); }
.menu-toggle span:last-child { transform: translateY(4px); }
.menu-toggle[aria-expanded="true"] span:first-child { transform: rotate(45deg); }
.menu-toggle[aria-expanded="true"] span:last-child { transform: rotate(-45deg); }
.menu-panel { position: fixed; inset: 0; z-index: 40; display: flex; flex-direction: column; overflow-y: auto; padding: calc(var(--hdr-now) + 24px) var(--gutter) 32px; background: var(--logo-bg); overscroll-behavior: contain; }
.menu-nav > a, .menu-nav > div > a:first-child { display: block; padding: 8px 0; font-family: var(--display); font-size: 32px; font-weight: 600; letter-spacing: -.04em; line-height: 1.2; }
.menu-sub { margin: 2px 0 14px; }
.menu-sub a { display: flex; align-items: center; gap: 14px; min-height: 56px; padding-block: 6px; color: var(--muted); }
.menu-sub .panel-name { color: var(--text); }
.menu-sub .panel-desc { font-size: 14px; }
.menu-sub a:hover, .menu-sub a[aria-current="page"] { color: var(--text); }
/* Page courante : filet vert à gauche, texte en pleine couleur. */
.menu-nav a[aria-current="page"] { padding-left: 14px; border-left: 2px solid var(--accent-line); color: var(--text); }
.menu-foot { margin-top: auto; padding-top: 32px; }
.menu-foot .btn { margin-bottom: 20px; }
.menu-foot a:not(.btn) { display: flex; align-items: center; gap: 10px; min-height: 44px; font-family: var(--mono); font-size: 14px; color: var(--muted); }
html.menu-open { overflow: hidden; }

/* ===== 5. Pied de page ===== */
.site-footer { background: var(--logo-bg); border-top: 1px solid var(--line); padding-block: clamp(56px, 7vw, 96px) 32px; }
.footer-main { display: grid; grid-template-columns: minmax(0, 1.3fr) repeat(3, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 48px; }
.footer-title { margin-bottom: 8px; color: var(--muted); font-family: var(--body); font-size: 13px; font-weight: 400; letter-spacing: 0; line-height: 1.4; }
.footer-links a { display: flex; align-items: center; gap: 10px; min-height: 44px; font-size: 15px; }
.footer-links a:hover { text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.footer-links .mono { font-family: var(--mono); font-size: 13px; }
.footer-bottom { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 32px; margin-top: clamp(40px, 5vw, 72px); padding-top: 24px; border-top: 1px solid var(--line); color: var(--muted); font-size: 13px; line-height: 1.6; }
.footer-bottom a { display: inline-flex; align-items: center; min-height: 44px; text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
.footer-bottom a:hover { color: var(--text); }

/* ===== 6. Composants partagés ===== */

/* Fil d'Ariane */
.breadcrumb { padding-top: 8px; }
.breadcrumb ol { display: flex; flex-wrap: wrap; align-items: center; }
.breadcrumb li { display: inline-flex; align-items: center; color: var(--muted); font-size: 13px; }
.breadcrumb li:not(:last-child)::after { content: "›"; margin-inline: 10px; color: var(--muted); }
.breadcrumb a { display: inline-flex; align-items: center; min-height: 44px; text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; text-decoration-color: var(--line); }
.breadcrumb a:hover { color: var(--text); text-decoration-color: currentColor; }
.breadcrumb [aria-current="page"] { color: var(--text); }

/* Héros de page (pages intérieures) */
.page-hero { padding-block: clamp(20px, 3vw, 40px) clamp(40px, 5vw, 72px); }
.page-hero-label { display: flex; align-items: center; gap: 12px; margin-bottom: 28px; color: var(--muted); font-size: 14px; line-height: 1.4; }
.page-hero-label .dot { width: 10px; height: 10px; flex-basis: 10px; }
.page-hero h1 { max-width: 22ch; font-size: clamp(32px, 4.4vw, 64px); letter-spacing: -.045em; line-height: 1.08; }
.page-hero h1.is-wide { max-width: 30ch; }
.page-hero .lead { margin-top: clamp(24px, 3vw, 40px); color: var(--text); }
.page-hero .lead + .lead { margin-top: 16px; color: var(--muted); }
.page-meta { display: flex; flex-wrap: wrap; gap: 20px clamp(28px, 4vw, 64px); margin-top: clamp(36px, 5vw, 64px); padding-top: 24px; border-top: 1px solid var(--line); }
.page-meta dt { color: var(--muted); font-size: 13px; line-height: 1.4; }
.page-meta dd { margin-top: 4px; font-family: var(--mono); font-size: 14px; line-height: 1.5; }
.page-meta dd.is-text { font-family: var(--body); }

/* Sections */
.section { padding-block: var(--section-y); }
.section--surface { background: var(--surface); border-top: 1px solid var(--line); --tile-bg: var(--bg); }
.section--deep { background: var(--surface-deep); }
.section--rule { border-top: 1px solid var(--line); }
.section-head { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 20px; align-items: end; margin-bottom: clamp(40px, 5vw, 72px); }
.section-head > :first-child { grid-column: 1 / span 7; }
.section-head > :last-child:not(:first-child) { grid-column: 9 / -1; color: var(--muted); font-size: 15px; line-height: 1.75; padding-bottom: 6px; }
.section-head .section-label { margin-bottom: 20px; }
.section-text { max-width: 58ch; color: var(--muted); font-size: 17px; line-height: 1.75; }
.section-text + .section-text { margin-top: 16px; }

/* Liste à filets : intitulé + phrase */
.rule-list { border-bottom: 1px solid var(--line); }
.rule-list > li { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 8px; padding-block: clamp(22px, 2.6vw, 34px); border-top: 1px solid var(--line); }
.rule-list h3, .rule-list .rule-title { grid-column: 1 / span 5; font-size: clamp(21px, 1.9vw, 26px); letter-spacing: -.03em; line-height: 1.25; }
.rule-list p { grid-column: 7 / -1; color: var(--muted); font-size: 16px; line-height: 1.7; }

/* Technologies, en mono */
.tech-list { display: flex; flex-wrap: wrap; gap: 8px 22px; font-family: var(--mono); font-size: 13px; line-height: 1.5; }
.tech-list li { display: flex; align-items: center; gap: 9px; }
.tech-list li::before { content: ""; flex: 0 0 4px; width: 4px; height: 4px; border-radius: 50%; background: var(--accent-line); }
.tech-list li:has(.tl)::before { content: none; }
.tl { flex: none; width: 17px; height: 17px; fill: currentColor; color: var(--text); opacity: .86; }
.stack-line { margin-top: 18px; color: var(--muted); }
.stack-line .tl { color: var(--muted); opacity: 1; }
.ico { flex: none; width: 18px; height: 18px; color: var(--muted); }
.ico--linkedin { color: var(--ico-linkedin); }
.ico--whatsapp { color: var(--ico-whatsapp); }
.btn .ico, .contact-band .ico { color: currentColor; }


/* Cadre teinté des captures : la couleur de l'application (--app, vert par défaut) en teinte douce sur le fond du thème (--frame-base),
   avec un liseré fin. Même fond pour la scène du téléphone (.case-stage, css/realisations.css).
   Une couleur par application : .app--sporthub (vert) et .app--pendula (ambre), posées sur le bloc qui contient les cadres. */
.app--sporthub { --app: var(--brand-green); }
.app--pendula { --app: var(--brand-amber); }
.frame, .case-stage { background: color-mix(in srgb, var(--app, var(--brand-green)) 17%, var(--frame-base)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--app, var(--brand-green)) 38%, transparent); }
.frame { display: block; margin: 0; padding: clamp(12px, 2.2vw, 28px); border-radius: 10px; }
.frame img { width: 100%; border-radius: 5px; }
.frame-caption { margin-top: 14px; color: var(--muted); font-size: 12px; line-height: 1.5; }

/* Logos d'applications, devant le nom du projet. SportHub et Pendula : logos reçus de Mohammed le 23/10 (dérivés webp, assets/img/logo-*.webp),
   posés tels quels, sans recoloration, ombre, contour ni déformation ; alt vide car le nom est écrit à côté.
   RentGo, Gestion des escales et Pipeline CI/CD : pastilles à initiale, à remplacer si des logos arrivent (pastille neutre, carré arrondi
   et initiale, aux couleurs de la charte). Le logo suit la taille du titre (em) et se pose sur la ligne.
   Pour remplacer une pastille : <img class="app-logo app-logo--nom" src="…" alt="" width="128" height="128"> à la place du <svg> ;
   si le logo n'est pas carré, régler sa largeur dans un modificateur (.app-logo--nom { width: …em }). */
.app-logo { display: inline-block; flex: none; width: .74em; height: .74em; margin-right: .26em; vertical-align: -.04em; fill: currentColor; }
img.app-logo { object-fit: contain; }
.app-logo--sporthub, .app-logo--pendula { width: .8em; height: .8em; vertical-align: -.07em; }
.app-logo--rentgo { color: var(--fam-db); }
.app-logo--escales { color: var(--fam-prog); }
.app-logo--cicd { color: var(--fam-devops); }
.app-logo text { fill: var(--on-fam); font-family: var(--display); font-size: 15px; font-weight: 700; text-anchor: middle; }
.app-logo--cicd text { font-size: 12.5px; letter-spacing: -.02em; }

/* Téléphone (plat, sans ombre) */
.phone { --phone-w: min(300px, calc((100svh - 150px) * .5654 + 20px)); width: var(--phone-w); max-width: 100%; margin: 0; border: 10px solid var(--bezel); border-radius: 38px; background: var(--bezel); outline: 1px solid var(--line); overflow: hidden; transform-origin: 50% 60%; }
.phone img { width: 100%; border-radius: 28px; }

/* Chaîne de mise en production (moment 5) */
.pipeline { --n: 4; --pipe-gap: clamp(24px, 3vw, 48px); }
.pipeline--3 { --n: 3; }
.pipeline--5 { --n: 5; }
.pipeline--6 { --n: 6; }
.phone--sm { --phone-w: min(220px, 70vw); }
.pipeline-steps { display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); column-gap: var(--pipe-gap); }
.pipeline-step { position: relative; padding-top: 48px; }
.pipeline-node { position: absolute; top: 0; left: 0; z-index: 1; display: grid; place-items: center; width: 14px; height: 14px; border: 2px solid var(--accent-line); border-radius: 50%; background: var(--accent-line); transition: background-color .3s var(--ease), border-color .3s var(--ease); }
.pipeline-node svg { width: 8px; height: 8px; fill: none; stroke: var(--accent-ink); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; transition: opacity .3s var(--ease); }
.pipeline-step:not(:last-child)::before, .pipeline-step:not(:last-child)::after { content: ""; position: absolute; top: 6px; left: 14px; width: calc(100% + var(--pipe-gap) - 14px); height: 2px; }
.pipeline-step:not(:last-child)::before { background: var(--line); }
.pipeline-step:not(:last-child)::after { background: var(--accent-line); transform: scaleX(var(--seg, 1)); transform-origin: 0 50%; }
.pipeline-title { font-size: clamp(19px, 1.7vw, 23px); letter-spacing: -.03em; line-height: 1.25; }
.pipeline-text { margin-top: 12px; color: var(--muted); font-size: 15px; line-height: 1.7; max-width: 34ch; }
.pipeline-tool { margin-top: 10px; font-family: var(--mono); font-size: 13px; color: var(--muted); }
.pipeline-caption { max-width: 62ch; margin-top: 40px; color: var(--muted); font-size: 15px; line-height: 1.7; }

/* Logos de technologies : un sprite (assets/img/tech-logos.svg, Devicon sous licence MIT, plus deux pictogrammes dessinés pour DevOps et NoSQL).
   Tracés monochromes : ils prennent la couleur courante, fixée par chaque composant (couleur de la famille, atténuée pour « Bientôt »).
   Les symboles sont alignés à gauche de leur boîte (preserveAspectRatio dans le sprite). */
.tech-logo { flex: none; width: var(--logo-size, 32px); height: var(--logo-size, 32px); fill: currentColor; }

/* Tuiles de thèmes (espace formation) */
.theme-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
.theme-tile { --tile: var(--brand-blue); position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 28px; min-height: 196px; padding: 20px 20px 18px; background: var(--tile-bg); border: 1px solid var(--tile-line); border-top: 3px solid var(--tile); border-radius: 6px; transition: border-color .2s var(--ease); }
.theme-tile--os { --tile: var(--fam-os); }
.theme-tile--prog { --tile: var(--fam-prog); }
.theme-tile--devops { --tile: var(--fam-devops); }
.theme-tile--db { --tile: var(--fam-db); }
.theme-tile .tech-logo { --logo-size: clamp(38px, 3.8vw, 52px); color: var(--tile); }
.theme-name { display: block; font-family: var(--display); font-size: 19px; font-weight: 600; letter-spacing: -.03em; line-height: 1.25; }
.theme-count { display: block; margin-top: 6px; color: var(--muted); font-family: var(--mono); font-size: 12px; line-height: 1.4; }
.theme-arrow { position: absolute; top: 14px; right: 16px; font-size: 20px; line-height: 1; color: var(--link); opacity: 0; transform: translateX(-6px); transition: opacity .2s var(--ease), transform .2s var(--ease); }
a.theme-tile:hover { border-color: var(--text); border-top-color: var(--tile); }
a.theme-tile:hover .theme-arrow, a.theme-tile:focus-visible .theme-arrow { opacity: 1; transform: none; }
.theme-tile.is-soon { color: var(--off); background: transparent; border-color: var(--line); border-top-color: var(--tile); }
.theme-tile.is-soon .theme-count { color: var(--off); }
.theme-tile.is-soon .tech-logo { color: inherit; }
/* Thème clair : le disponible est toujours la tuile la plus claire (surface blanche, bordure franche) ;
   « bientôt » reprend le fond de page, plus gris, et une bordure légère. */
:root[data-theme="light"] .section--surface { --tile-bg: var(--surface); }
:root[data-theme="light"] .theme-tile.is-soon { background: var(--bg); }

/* Aperçu : les thèmes ouverts, puis une seule tuile large pour tout ce qui arrive (accueil ; réutilisable ailleurs).
   .theme-grid--preview : trois colonnes ; .theme-grid-wide : la cellule qui occupe toute la largeur ;
   .theme-tile--soon-group : la tuile « bientôt » groupée, sans monogramme, texte seul. */
.theme-grid--preview { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.theme-grid-wide { grid-column: 1 / -1; }
.theme-tile--soon-group { --tile: var(--line); flex-direction: row; align-items: center; justify-content: flex-start; min-height: 0; padding: 22px 24px; }
.theme-tile--soon-group .theme-name { font-size: clamp(17px, 1.7vw, 20px); font-weight: 500; letter-spacing: -.02em; }

/* Bande contact bleue */
.contact-band { padding-block: clamp(64px, 8vw, 112px); background: var(--brand-blue); color: #FFFFFF; }
.contact-band-inner { display: flex; align-items: center; justify-content: space-between; gap: clamp(32px, 6vw, 80px); }
.contact-band .section-label { color: #FFFFFF; }
.contact-band h2 { max-width: 20ch; font-size: clamp(26px, 3.5vw, 50px); }
.contact-band p:not(.section-label) { max-width: 50ch; margin-top: 24px; font-size: 16px; line-height: 1.75; }
.contact-actions { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; flex-shrink: 0; }
.btn--contact { min-height: 60px; padding-inline: 28px; background: var(--brand-green); color: #0A0A0A; }
.btn--contact:hover { background: #FFFFFF; color: #14233B; }
.contact-actions .btn { margin-bottom: 14px; }
.contact-line { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; font-family: var(--mono); font-size: 14px; text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.contact-line:hover { text-decoration-thickness: 2px; }
.contact-band a:focus-visible { outline-color: #FFFFFF; }

/* Navigation précédent / suivant */
.pager { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); border-block: 1px solid var(--line); }
.pager-link { display: flex; flex-direction: column; gap: 6px; padding: clamp(24px, 3vw, 40px) 0; }
.pager-link + .pager-link { padding-left: clamp(24px, 3vw, 40px); border-left: 1px solid var(--line); }
.pager-link--next { align-items: flex-end; text-align: right; }
.pager-label { color: var(--muted); font-size: 13px; line-height: 1.4; }
.pager-title { display: inline-flex; align-items: center; gap: 14px; font-family: var(--display); font-size: clamp(22px, 2.4vw, 32px); font-weight: 600; letter-spacing: -.035em; line-height: 1.2; }
.pager-title span[aria-hidden="true"] { color: var(--link); font-size: .9em; transition: transform .2s var(--ease); }
a.pager-link:hover .pager-title { text-decoration: underline; text-underline-offset: 6px; text-decoration-thickness: 1px; }
a.pager-link--next:hover .pager-title span[aria-hidden="true"] { transform: translateX(3px); }
a.pager-link--prev:hover .pager-title span[aria-hidden="true"] { transform: translateX(-3px); }

/* Liste éditoriale de projets */
.project-list { border-bottom: 1px solid var(--line); }
.project-row { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 14px; align-items: start; padding-block: clamp(28px, 3.4vw, 44px); border-top: 1px solid var(--line); transition: border-color .2s var(--ease); }
.project-row:hover, .project-row:focus-within { border-top-color: var(--text); }
.project-row-main { grid-column: 1 / span 4; }
.project-row-text { grid-column: 5 / span 5; color: var(--muted); font-size: 16px; line-height: 1.75; }
.project-row-aside { grid-column: 10 / -1; display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
.project-category { margin-bottom: 8px; color: var(--muted); font-size: 13px; line-height: 1.4; }
.project-name { font-size: clamp(26px, 2.6vw, 36px); font-weight: 700; letter-spacing: -.04em; line-height: 1.12; }
.project-mention { color: var(--muted); font-size: 13px; line-height: 1.5; }
.project-row-aside > .text-link:first-child { margin-top: -8px; }

/* Texte courant (mentions légales, articles) */
.prose { max-width: 68ch; }
.prose > * + * { margin-top: 1.1em; }
.prose h2 { margin-top: 2.2em; font-size: clamp(26px, 2.6vw, 36px); }
.prose h3 { margin-top: 1.8em; font-size: clamp(20px, 2vw, 26px); }
.prose p, .prose li { color: var(--muted); font-size: 17px; line-height: 1.75; }
.prose ul { list-style: disc; padding-left: 1.3em; }
.prose ol { list-style: decimal; padding-left: 1.3em; }
.prose li + li { margin-top: .4em; }
.prose strong { color: var(--text); font-weight: 600; }
.prose a { color: var(--link); text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }

/* Colonnes à filet haut (publics, repères) */
.col-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 40px; }
.col-list--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.col-item { padding-top: 24px; border-top: 1px solid var(--line); }
.col-item h3 { font-size: clamp(22px, 2.2vw, 30px); letter-spacing: -.035em; line-height: 1.2; }
.col-item p { margin-top: 12px; color: var(--muted); font-size: 16px; line-height: 1.7; }

/* Lignes de contact entièrement cliquables */
.link-rows { border-bottom: 1px solid var(--line); }
.link-rows a { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); align-items: center; min-height: 72px; padding-block: 18px; border-top: 1px solid var(--line); }
.link-rows-label { grid-column: 1; display: flex; color: var(--muted); font-size: 14px; }
.link-rows-label .ico { width: 26px; height: 26px; }
.link-rows-value { grid-column: 2 / span 10; font-family: var(--mono); font-size: clamp(14px, 1.5vw, 18px); overflow-wrap: anywhere; }
.link-rows-arrow { grid-column: 12; justify-self: end; color: var(--link); font-size: 20px; line-height: 1; transition: transform .2s var(--ease); }
.link-rows a:hover .link-rows-value { text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.link-rows a:hover .link-rows-arrow { transform: translate(2px, -2px); }

/* ===== 7. Accueil ===== */

/* Masque des titres : le texte monte depuis une ligne de coupe */
.mask { display: block; overflow: hidden; padding: .1em .04em .16em; margin: -.1em -.04em -.16em; }
.mask-in { display: block; }

/* Héros */
.hero { padding-block: min(clamp(28px, 4vw, 56px), 5svh) 0; }
/* Le héros tient dans un écran de portable : les écarts et le titre sont aussi bornés par la hauteur de la fenêtre (svh). */
.hero-intro { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; margin-bottom: min(clamp(40px, 6vw, 88px), 8.5svh); }
.hero-name { font-size: 15px; font-weight: 500; line-height: 1.4; }
.hero-name span { display: block; margin-top: 4px; color: var(--muted); font-size: 14px; font-weight: 400; }
.hero-note { padding-left: 18px; border-left: 2px solid var(--brand-green); color: var(--muted); font-size: 14px; line-height: 1.65; }
.hero-note strong { color: var(--text); font-weight: 600; }
.hero-title { font-size: clamp(34px, min(5vw, 8.7svh), 76px); letter-spacing: -.05em; line-height: 1.06; }
.hero-main { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); align-items: center; padding-bottom: min(clamp(32px, 4vw, 56px), 5svh); }
.hero-copy { grid-column: 1 / span 7; }
.hero-visual { grid-column: 8 / -1; position: relative; padding-bottom: 7%; }
.hero-frame { padding: clamp(10px, 1.1vw, 16px); border-radius: 14px; }
.hero-frame img { width: 100%; height: auto; border-radius: 6px; }
.hero-phone { --phone-w: 100%; position: absolute; right: -2%; bottom: 0; width: 25%; border-width: 5px; border-radius: 20px; }
.hero-phone img { width: 100%; height: auto; border-radius: 15px; }
.hero-lead { margin-top: min(clamp(24px, 3vw, 40px), 3.6svh); }
.hero-description { max-width: 620px; font-size: clamp(18px, 1.55vw, 21px); line-height: 1.6; letter-spacing: -.02em; }
.hero-location { margin-top: 14px; color: var(--muted); font-size: 14px; }
.hero-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 28px; margin-top: min(clamp(24px, 3vw, 36px), 3.4svh); }
.hero-actions .text-link { justify-content: center; }
.hero-services { position: relative; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: clamp(24px, 3vw, 48px); margin-top: min(clamp(48px, 6vw, 96px), 5.5svh); }
.hero-services::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--line); transform-origin: 0 50%; }
.hero-services a { display: flex; align-items: flex-start; gap: 14px; min-height: 44px; padding-block: clamp(14px, 2.6svh, 26px); }
.hero-services .dot { flex-basis: 8px; margin-top: 7px; }
.service-text { display: block; min-width: 0; }
.service-name { display: block; font-size: 16px; font-weight: 500; line-height: 1.4; }
.service-desc { display: block; margin-top: 2px; color: var(--muted); font-size: 14px; line-height: 1.5; }
.hero-services a:hover .service-name { text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.service-arrow { margin-left: auto; color: var(--muted); font-size: 18px; line-height: 1.4; }

/* Réalisations */
.work { padding-block: var(--section-y-tight) var(--section-y); }
.work .section-head { margin-bottom: 0; }
.showcase { margin-top: clamp(72px, 9vw, 136px); }
.work .section-head + .showcase { margin-top: clamp(40px, 4.5vw, 64px); }
.showcase + .showcase { padding-top: clamp(56px, 7vw, 104px); border-top: 1px solid var(--line); }
.showcase-head { margin-bottom: clamp(28px, 3vw, 44px); }
.showcase-title { font-size: clamp(32px, 3.6vw, 52px); font-weight: 700; letter-spacing: -.03em; line-height: 1.04; }
.showcase-tagline { max-width: 20ch; margin-top: 20px; font-family: var(--display); font-size: clamp(22px, 2.2vw, 30px); font-weight: 500; letter-spacing: -.035em; line-height: 1.3; }
.showcase-text { max-width: 44ch; margin-top: 18px; color: var(--muted); font-size: 17px; line-height: 1.7; }
.showcase-links { display: flex; flex-wrap: wrap; gap: 0 32px; margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--line); }
.steps-stage { display: none; }
.step { padding-block: 32px; border-top: 1px solid var(--line); }
.step-index { display: block; margin-bottom: 16px; color: var(--muted); font-family: var(--mono); font-size: 12px; }
.step-figure { max-width: 760px; margin-bottom: 24px; }
.step-title { font-size: clamp(24px, 2.4vw, 34px); letter-spacing: -.04em; line-height: 1.15; }
.step-text { max-width: 46ch; margin-top: 12px; color: var(--muted); font-size: 17px; line-height: 1.65; }
.shot { position: absolute; inset: 0; width: 100%; height: 100%; border-radius: 0 !important; object-fit: cover; opacity: 0; transform: translateY(24px); z-index: 0; transition: opacity 450ms var(--ease), transform 0s linear 450ms; }
.shot.is-active { opacity: 1; transform: none; z-index: 1; transition: opacity 450ms var(--ease), transform 450ms var(--ease); }
.stage-shots { position: relative; aspect-ratio: 1600 / 902; overflow: hidden; border-radius: 5px; background: var(--surface-deep); }
.steps-count { display: flex; justify-content: flex-end; gap: 6px; margin-top: 18px; color: var(--muted); font-family: var(--mono); font-size: 13px; line-height: 1; }
.steps-count b { color: var(--text); font-weight: 500; }
.phone-layout { display: flex; flex-direction: column; }
.phone-copy { display: contents; }
.phone-copy > .showcase-head { order: 0; }
.phone-stage { order: 1; display: flex; flex-direction: column; align-items: center; margin-block: 8px 44px; }
.phone-stage .steps-count { justify-content: center; }
.phone-stage .phone { --phone-w: min(280px, 72vw); }
.phone-copy > .beats { order: 2; }
.phone-copy > .showcase-links { order: 3; }
.beat { padding-block: 28px; border-top: 1px solid var(--line); max-width: 26ch; font-family: var(--display); font-size: clamp(20px, 1.9vw, 28px); font-weight: 500; letter-spacing: -.025em; line-height: 1.25; }

/* Mobile : les quatre écrans de SportHub forment un rail horizontal (défilement tactile ou clavier, accroche à chaque écran).
   Le conteneur .steps-rail est la région défilante (rôle, nom, tabindex dans le HTML) ; il déborde jusqu'aux bords de l'écran. */
@media (max-width: 900px) {
  .steps-rail { margin-inline: calc(var(--gutter) * -1); padding-inline: var(--gutter); overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; scroll-padding-inline: var(--gutter); scrollbar-width: none; }
  .steps-rail::-webkit-scrollbar { display: none; }
  .steps-rail:focus-visible { outline-offset: -3px; }
  .steps { display: flex; gap: 16px; width: max-content; }
  .step { flex: 0 0 calc((100vw - 2 * var(--gutter)) * .86); max-width: 460px; padding-block: 0; border-top: 0; scroll-snap-align: start; }
  .step-figure { max-width: none; }
}

/* Sur ordinateur, la région n'a pas de rôle de défilement : elle ne génère pas de boîte (donc pas d'arrêt de tabulation
   ni d'anneau de focus autour de la colonne entière), et les étapes se placent comme avant. */
@media (min-width: 901px) {
  .steps-rail { display: contents; }
}

/* Sans épinglage (mouvement réduit ou sans JavaScript), au-dessus de 900 px : mêmes deux colonnes que la version animée.
   Le bloc « moment 3 et 4 » de la section 8 reprend la main quand l'épinglage est actif. */
@media (min-width: 901px) {
  .step { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); grid-template-rows: 1fr auto auto auto 1fr; column-gap: clamp(40px, 5vw, 80px); padding-block: clamp(32px, 4vw, 56px); }
  .step-index { grid-column: 1; grid-row: 2; }
  .step-title { grid-column: 1; grid-row: 3; }
  .step-text { grid-column: 1; grid-row: 4; }
  .step-figure { grid-column: 2; grid-row: 1 / -1; max-width: none; margin-bottom: 0; }
  .phone-layout { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); column-gap: clamp(40px, 6vw, 96px); align-items: center; }
  .phone-copy { display: block; grid-column: 2; grid-row: 1; }
  .phone-stage { grid-column: 1; grid-row: 1; margin-block: 0; }
  .phone-stage .phone { --phone-w: min(380px, calc((100svh - 190px) * .5654 + 20px)); }
}

/* Expertises : trois verbes (moment 6) */
.expertises { padding-block: var(--section-y); }
.expertises .section-head { margin-bottom: clamp(24px, 3vw, 48px); align-items: start; }
.verb-row { position: relative; padding-block: clamp(36px, 5vw, 72px); border-top: 1px solid var(--line); }
.verb-row:last-child { border-bottom: 1px solid var(--line); }
.verb { display: flex; align-items: baseline; gap: .06em; margin: 0; font-family: var(--display); font-size: clamp(32px, 4.4vw, 64px); font-weight: 700; letter-spacing: -.05em; line-height: 1; color: var(--text); }
.verb-dot { flex: 0 0 auto; width: .16em; height: .16em; border-radius: 50%; background: var(--brand-blue); }
.verb-row--devops .verb-dot { background: var(--brand-green); }
.verb-row--formation .verb-dot { background: var(--brand-amber); }
.verb-body { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 28px; margin-top: clamp(28px, 3.4vw, 48px); }
.verb-main { grid-column: 1 / span 6; }
.verb-side { grid-column: 8 / -1; display: flex; flex-direction: column; align-items: flex-start; gap: 18px; }
.row-name { display: flex; align-items: center; gap: 14px; font-size: clamp(22px, 2.2vw, 30px); letter-spacing: -.035em; line-height: 1.2; }
.row-name .dot { width: 10px; height: 10px; flex-basis: 10px; }
.row-text { max-width: 52ch; margin-top: 14px; color: var(--muted); font-size: 17px; line-height: 1.7; }
/* Rangée entièrement cliquable : le lien est étiré sur toute la rangée. L'anneau de focus passe de la ligne de texte à la rangée. */
.verb-row .text-link::after { content: ""; position: absolute; inset: 0; }
@supports selector(:has(*)) {
  .verb-row .text-link:focus-visible { outline: none; }
  .verb-row:has(.text-link:focus-visible) { outline: 2px solid var(--focus); outline-offset: 10px; }
}

/* Méthode */
.method { padding-block: var(--section-y); border-top: 1px solid var(--line); }
.method .pipeline { margin-top: clamp(8px, 2vw, 24px); }

/* Espace formation, aperçu */
.training { padding-block: var(--section-y); }
.training .theme-grid { margin-top: clamp(8px, 2vw, 16px); }
.training-foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 20px 40px; margin-top: 36px; }
.training-more { max-width: 62ch; color: var(--muted); font-size: 15px; line-height: 1.7; }
.training-centers { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 4px 40px; margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--line); }
.training-centers p { max-width: 62ch; color: var(--muted); font-size: 15px; line-height: 1.7; }

/* Centres de formation */
.centers { padding-block: var(--section-y-tight); }
.centers-inner { display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; align-items: center; column-gap: clamp(24px, 3.4vw, 48px); row-gap: 20px; padding-block: clamp(36px, 4.4vw, 60px); border-block: 1px solid var(--line); }
.centers-symbol { color: var(--link); }
.centers-symbol svg { width: 84px; height: 84px; }
.centers h2 { max-width: 20ch; font-size: clamp(28px, 3vw, 42px); }
.centers p:not(.section-label) { max-width: 58ch; margin-top: 16px; color: var(--muted); font-size: 16px; line-height: 1.75; }
.centers .section-label { margin-bottom: 14px; }

/* Votre interlocuteur */
.about-band { padding-block: var(--section-y); }
.about-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: clamp(40px, 5vw, 72px); }
.about-main { grid-column: 1 / span 7; }
.about-lead { font-family: var(--display); font-size: clamp(25px, 3.2vw, 46px); font-weight: 600; letter-spacing: -.04em; line-height: 1.12; }
.about-side { grid-column: 9 / -1; align-self: end; }
.about-side > p { color: var(--muted); font-size: 17px; line-height: 1.75; }
.stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--col-gap); margin-top: 36px; padding-top: 28px; border-top: 1px solid var(--line); }
.stat-num { display: block; font-family: var(--display); font-size: clamp(30px, 2.8vw, 40px); font-weight: 700; letter-spacing: -.045em; line-height: 1; white-space: nowrap; }
.stat-label { display: block; margin-top: 10px; color: var(--muted); font-size: 14px; line-height: 1.5; }
.about-side .text-link { margin-top: 24px; }

/* Autres projets (accueil) */
.other-projects { margin-top: clamp(56px, 7vw, 104px); padding-top: clamp(56px, 7vw, 104px); border-top: 1px solid var(--line); }
.other-head { display: flex; flex-wrap: wrap; align-items: end; justify-content: space-between; gap: 8px 32px; margin-bottom: clamp(24px, 3vw, 40px); }
.other-head h3 { font-size: clamp(22px, 2.6vw, 36px); letter-spacing: -.04em; }

/* Questions fréquentes de l'accueil */
.faq { padding-block: var(--section-y); border-top: 1px solid var(--line); }
.faq-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--col-gap); row-gap: 32px; }
.faq-grid > :first-child { grid-column: 1 / span 5; }
.faq-grid h2 { font-size: clamp(26px, 2.8vw, 40px); letter-spacing: -.035em; line-height: 1.12; }
.faq-list { grid-column: 7 / -1; border-bottom: 1px solid var(--line); }
.faq-item { border-top: 1px solid var(--line); }
.faq-item summary { display: flex; align-items: center; justify-content: space-between; gap: 20px; min-height: 64px; padding-block: 16px; cursor: pointer; list-style: none; }
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after { content: ""; flex: none; width: 9px; height: 9px; margin-right: 4px; border-right: 1.5px solid var(--muted); border-bottom: 1.5px solid var(--muted); transform: translateY(-2px) rotate(45deg); transition: transform .2s var(--ease); }
.faq-item[open] summary::after { transform: translateY(2px) rotate(-135deg); }
.faq-item summary:hover h3 { text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.faq-item h3 { font-size: clamp(16px, 1.3vw, 18px); font-weight: 500; letter-spacing: -.01em; line-height: 1.4; }
.faq-item p { max-width: 62ch; padding-bottom: 22px; color: var(--muted); font-size: 15px; line-height: 1.75; }

/* ===== 8. Mouvement ===== */
/* Sans JavaScript, tout est à sa place finale. La classe js (posée dans le head) active les états de départ,
   et seulement si le visiteur n'a pas demandé de mouvement réduit. */
@keyframes mask-rise { from { transform: translateY(108%); } }
@keyframes fade-rise { from { opacity: 0; transform: translateY(14px); } }
@keyframes trace { from { transform: scaleX(0); } }
@keyframes panel-in { from { opacity: 0; transform: translateY(-6px); } }

.pipeline { --pipe-bg: var(--bg); --pipe-row: 40px; }
.section--surface .pipeline { --pipe-bg: var(--surface); }
.section--deep .pipeline { --pipe-bg: var(--surface-deep); }

@media (prefers-reduced-motion: no-preference) {
  /* Moment 2 : l'ouverture */
  .mask-in { animation: mask-rise 650ms var(--ease) both; }
  .mask + .mask .mask-in { animation-delay: 90ms; }
  .hero-intro { animation: fade-rise 500ms var(--ease) both; }
  .hero-lead { animation: fade-rise 500ms var(--ease) 220ms both; }
  .hero-actions { animation: fade-rise 500ms var(--ease) 280ms both; }
  .hero-services a { animation: fade-rise 500ms var(--ease) 340ms both; }
  .hero-services::before { animation: trace 600ms var(--ease) 300ms both; }
  .expertises-panel:not([hidden]) { animation: panel-in 180ms var(--ease) both; }

  /* Moment 3 : SportHub, épinglé à partir de 901 px */
  @media (min-width: 901px) {
    .js .showcase-layout { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); column-gap: clamp(40px, 5vw, 80px); align-items: start; }
    .js .steps-stage { display: block; position: sticky; top: max(96px, calc(50svh - 250px)); }
    .js .step { display: flex; flex-direction: column; justify-content: flex-start; min-height: 50vh; padding-block: 0; border-top: 0; color: var(--off); transition: color 400ms var(--ease); }
    .js .step.is-active { color: var(--text); }
    .js .step .step-text { color: inherit; }
    .js .step-figure, .js .step-index { display: none; }
    .js .showcase-copy > .showcase-head { margin-bottom: clamp(16px, 3vw, 40px); }

    /* Moment 4 : Pendula, le téléphone qui se redresse */
    .js .phone-layout { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); column-gap: clamp(40px, 6vw, 96px); align-items: start; }
    .js .phone-copy { display: block; grid-column: 2; grid-row: 1; }
    .js .phone-stage { grid-column: 1; grid-row: 1; position: sticky; top: max(96px, calc(50svh - 340px)); margin-block: 0; }
    .js .phone-stage .phone { --phone-w: min(380px, calc((100svh - 190px) * .5654 + 20px)); }
    .js .beat { display: flex; align-items: center; min-height: 26vh; padding-block: 0; border-top: 0; color: var(--off); transition: color 400ms var(--ease); }
    .js .beat.is-lit { color: var(--text); }
  }
  @media (max-width: 900px) {
    .js .beat { color: var(--off); transition: color 400ms var(--ease); }
    .js .beat.is-lit { color: var(--text); }
  }
  .js .phone { will-change: transform; }

  /* Moment 5 : la chaîne passe au vert */
  .js .pipeline-step { --seg: 0; }
  .js .pipeline-step:not(.is-passed) .pipeline-node { background: var(--pipe-bg); border-color: var(--off); }
  .js .pipeline-step:not(.is-passed) .pipeline-node svg { opacity: 0; }

  /* Moment 6 : Construire. Déployer. Transmettre. */
  .js .verb { color: var(--ghost); transition: color 500ms var(--ease), transform 300ms var(--ease); }
  .js .verb-dot { opacity: 0; transform: scale(.4); transition: opacity 400ms var(--ease), transform 400ms var(--ease), scale 300ms var(--ease); }
  .js .verb.is-lit { color: var(--text); }
  .js .verb.is-lit .verb-dot { opacity: 1; transform: none; }

  /* Survols et focus : décalages courts (200 à 300 ms), uniquement quand le mouvement est permis.
     Les couleurs de survol (filets, soulignements) sont dans les sections 3 à 7 et restent actives en mouvement réduit. */
  .verb { transition: transform 300ms var(--ease); }
  .verb-dot { transition: scale 300ms var(--ease); }
  .project-name { transition: transform 200ms var(--ease); }
  .hero-services .dot, .service-arrow { transition: transform 200ms var(--ease); }
  .verb-row:has(.text-link:focus-visible) .verb { transform: translateX(10px); }
  .verb-row:has(.text-link:focus-visible) .verb-dot { scale: 1.3; }
  .project-row:focus-within .project-name { transform: translateX(6px); }
  .hero-services a:focus-visible .dot { transform: scale(1.4); }
  .hero-services a:focus-visible .service-arrow { transform: translateX(2px); }
  @media (hover: hover) {
    .verb-row:hover .verb { transform: translateX(10px); }
    .verb-row:hover .verb-dot { scale: 1.3; }
    .project-row:hover .project-name { transform: translateX(6px); }
    .hero-services a:hover .dot { transform: scale(1.4); }
    .hero-services a:hover .service-arrow { transform: translateX(2px); }
  }

  /* Révélation par niveaux (schéma emboîté de Pendula) : une seule fois, sans JavaScript tout est visible */
  .js [data-reveal-group] [data-reveal] { opacity: 0; transform: translateY(18px); transition: opacity 600ms var(--ease), transform 600ms var(--ease); transition-delay: calc(var(--i, 0) * 120ms); }
  .js [data-reveal-group].is-in [data-reveal] { opacity: 1; transform: none; }

  /* Transitions entre pages : fondu de 200 ms, l'en-tête ne bouge pas, les captures se prolongent */
  @view-transition { navigation: auto; }
  .site-header { view-transition-name: site-header; }
  ::view-transition-old(root), ::view-transition-new(root) { animation-duration: 200ms; animation-timing-function: cubic-bezier(.2, .7, .2, 1); }
  ::view-transition-group(site-header) { animation-duration: 0s; }
  ::view-transition-old(site-header) { display: none; }
  ::view-transition-new(site-header) { animation: none; }
  .vt-sporthub { view-transition-name: capture-sporthub; }
  .vt-pendula { view-transition-name: capture-pendula; }
  ::view-transition-group(capture-sporthub), ::view-transition-group(capture-pendula) { animation-duration: 450ms; animation-timing-function: cubic-bezier(.2, .7, .2, 1); }
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { transition: none !important; animation: none !important; }
}

/* ===== 9. Adaptations ===== */
@media (min-width: 901px) and (max-width: 1100px) {
  .brand-name { display: none; }
  .header-shell.is-compact .brand-name { display: block; font-size: 16px; }
  .main-nav { gap: 20px; }
  .header-actions { gap: 8px; }
  .header-cta { padding-inline: 14px; font-size: 12.5px; }
}
@media (max-width: 1100px) {
  .pipeline--dense .pipeline-steps { grid-template-columns: 1fr; row-gap: var(--pipe-row); }
  .pipeline--dense .pipeline-step { padding: 0 0 0 44px; }
  .pipeline--dense .pipeline-node { top: 4px; }
  .pipeline--dense .pipeline-step:not(:last-child)::before, .pipeline--dense .pipeline-step:not(:last-child)::after { top: 18px; left: 6px; width: 2px; height: calc(100% + var(--pipe-row) - 14px); }
  .pipeline--dense .pipeline-step:not(:last-child)::after { transform: scaleY(var(--seg, 1)); transform-origin: 50% 0; }
  .pipeline--dense .pipeline-text { max-width: 52ch; }
}
@media (max-width: 900px) {
  /* Mobile : le nom accompagne le logo (le logo seul est trop petit pour se lire), sans sous-titre. */
  .header-bar .brand { gap: 14px; }
  .header-bar .brand-logo { width: 88px; height: 88px; }
  .header-bar .brand-name { display: block; font-size: 16px; }
  .header-bar .brand-name > span { display: none; }
  .header-bar > .brand, .header-bar > .header-actions { flex: 0 1 auto; }
  .header-bar > .brand { flex-shrink: 1; min-width: 0; }
  .header-actions { gap: 4px; }
  .main-nav, .header-cta { display: none; }
  .menu-toggle:not([hidden]) { display: grid; }
  html:not(.js) .main-nav { display: flex; flex-wrap: wrap; width: 100%; order: 3; gap: 0 22px; }
  html:not(.js) .header-cta { display: inline-flex; }
  html:not(.js) .header-shell { height: auto; }
  html:not(.js) .site-header { position: relative; height: auto; }
  html:not(.js) .header-bar { flex-wrap: wrap; height: auto; padding-block: 12px; }
  .section-head > :first-child, .section-head > :last-child:not(:first-child) { grid-column: 1 / -1; }
  .rule-list h3, .rule-list .rule-title, .rule-list p { grid-column: 1 / -1; }
  .project-row-main, .project-row-text, .project-row-aside { grid-column: 1 / -1; }
  .project-row-aside > .text-link:first-child { margin-top: 0; }
  .hero-lead, .hero-actions { grid-column: 1 / -1; }
  .hero-actions { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px 28px; }
  .hero-services { grid-template-columns: 1fr; margin-top: 44px; }
  .hero-services a + a { border-top: 1px solid var(--line); }
  .hero-services a { padding-block: 14px; }
  .verb-main, .verb-side { grid-column: 1 / -1; }
  .about-main, .about-side { grid-column: 1 / -1; }
  .contact-band-inner { flex-direction: column; align-items: flex-start; }
  .centers-inner { grid-template-columns: 72px minmax(0, 1fr); }
  .centers-inner .btn { grid-column: 2; justify-self: start; }
  .centers-symbol svg { width: 64px; height: 64px; }
  .footer-main { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .footer-brand { grid-column: 1 / -1; }
  .pipeline-steps { grid-template-columns: 1fr; row-gap: var(--pipe-row); }
  .pipeline-step { padding: 0 0 0 44px; }
  .pipeline-node { top: 4px; }
  .pipeline-step:not(:last-child)::before, .pipeline-step:not(:last-child)::after { top: 18px; left: 6px; width: 2px; height: calc(100% + var(--pipe-row) - 14px); }
  .pipeline-step:not(:last-child)::after { transform: scaleY(var(--seg, 1)); transform-origin: 50% 0; }
  .pipeline-text { max-width: 52ch; }
  .frame { padding: clamp(12px, 3vw, 20px); }
}
@media (max-width: 760px) {
  .col-list, .col-list--2 { grid-template-columns: 1fr; }
  .link-rows a { grid-template-columns: 30px minmax(0, 1fr) 22px; column-gap: 14px; padding-block: 16px; }
  .link-rows-label { grid-column: 1; }
  .link-rows-label .ico { width: 24px; height: 24px; }
  .link-rows-value { grid-column: 2; }
  .link-rows-arrow { grid-column: 3; }
  .theme-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  .theme-tile { min-height: 168px; padding: 16px 16px 14px; }
  /* Aperçu sur mobile : une liste de rangées (monogramme, thème, flèche) plutôt que des tuiles carrées. */
  .theme-grid--preview { grid-template-columns: 1fr; }
  .theme-grid--preview .theme-tile:not(.theme-tile--soon-group) { flex-direction: row; align-items: center; justify-content: flex-start; gap: 20px; min-height: 0; padding: 18px 56px 18px 20px; }
  .theme-grid--preview .tech-logo { flex: 0 0 64px; width: 64px; height: 30px; }
  .theme-grid--preview .theme-arrow { top: 50%; right: 20px; translate: 0 -50%; opacity: 1; transform: none; }
  .theme-tile--soon-group { min-height: 0; padding: 18px 20px; }
  .page-meta { gap: 16px 32px; }
}
@media (max-width: 560px) {
  .footer-main { grid-template-columns: 1fr; }
  .pager { grid-template-columns: 1fr; }
  .pager-link + .pager-link { padding-left: 0; border-left: 0; border-top: 1px solid var(--line); }
  .pager-link--next { align-items: flex-start; text-align: left; }
}
@media (max-width: 359px) {
  /* 320 px : le logo passe à 76 px (reste au-dessus du seuil de 64 px du logo complet) pour que nom, thème et menu tiennent. */
  .header-bar { gap: 4px; }
  .header-bar .brand { gap: 10px; }
  .header-bar .brand-logo { width: 76px; height: 76px; }
  .header-actions { gap: 0; }
}
@media (max-width: 480px) {
  .site-footer .brand { gap: 14px; }
  .site-footer .brand-logo { width: 88px; height: 88px; }
  .site-footer .brand-name { display: none; }
  .header-bar { gap: 8px; }
  .hero-intro { flex-wrap: wrap; gap: 20px; }
  .hero-title { font-size: clamp(28px, 8.8vw, 34px); letter-spacing: -.035em; line-height: 1.1; }
  .hero-actions { flex-direction: column; align-items: stretch; gap: 4px; }
  .hero-actions .btn { width: 100%; }
  .hero-actions .text-link { justify-content: flex-start; }
  .page-hero h1 { font-size: clamp(28px, 8.4vw, 32px); letter-spacing: -.035em; line-height: 1.12; }
  .showcase-title { font-size: clamp(28px, 8vw, 32px); }
  .verb { font-size: clamp(30px, 9.4vw, 40px); }
  .stats { gap: 16px; }
  .stat-num { font-size: 30px; }
  .centers-inner { grid-template-columns: 1fr; }
  .centers-inner .btn { grid-column: 1; width: 100%; }
  .btn--contact { width: 100%; padding-inline: 18px; }
  .contact-actions { align-items: stretch; width: 100%; }
}

/* ===== Accueil : le visuel du premier écran n'apparaît que sur grand écran ; les questions passent en une colonne. ===== */
@media (max-width: 900px) {
  .hero-copy { grid-column: 1 / -1; }
  .hero-visual { display: none; }
  .faq-grid > :first-child, .faq-list { grid-column: 1 / -1; }
}
