{"id":9,"date":"2026-02-11T08:58:40","date_gmt":"2026-02-11T08:58:40","guid":{"rendered":"http:\/\/scenographie-rennes.fr\/?page_id=9"},"modified":"2026-07-28T07:32:48","modified_gmt":"2026-07-28T07:32:48","slug":"scenographie-evenementielle-rennes","status":"publish","type":"page","link":"https:\/\/scenographie-rennes.fr\/","title":{"rendered":"Sc\u00e9nographie &#8211; \u00c9v\u00e9nementielle Rennes"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"9\" class=\"elementor elementor-9\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5396ea3 e-con-full e-flex e-con e-parent\" data-id=\"5396ea3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-92b4a39 elementor-widget elementor-widget-html\" data-id=\"92b4a39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n<title>Sc\u00e9nographie Rennes | Stands, \u00e9v\u00e9nements, retail et expositions<\/title>\n<meta name=\"description\" content=\"Agence de sc\u00e9nographie \u00e0 Rennes et en Bretagne : conception de stands, d\u00e9cors \u00e9v\u00e9nementiels, pop-up stores, expositions et espaces de marque, de la cr\u00e9ation \u00e0 l'installation.\">\n<link rel=\"canonical\" href=\"https:\/\/scenographie-rennes.fr\/\">\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"ProfessionalService\",\n  \"name\": \"Sc\u00e9nographie Rennes\",\n  \"description\": \"Agence de sc\u00e9nographie \u00e0 Rennes et en Bretagne : stands, pop-up stores, expositions, \u00e9v\u00e9nements de marque et d\u00e9cors, de la conception \u00e0 l'installation.\",\n  \"url\": \"https:\/\/scenographie-rennes.fr\/\",\n  \"telephone\": \"+33-2-99-66-36-60\",\n  \"address\": { \"@type\": \"PostalAddress\", \"addressLocality\": \"Rennes\", \"postalCode\": \"35000\", \"addressRegion\": \"Bretagne\", \"addressCountry\": \"FR\" },\n  \"areaServed\": [\"Rennes\", \"Ille-et-Vilaine\", \"Bretagne\", \"Saint-Malo\", \"Vannes\", \"Nantes\", \"Grand Ouest\"],\n  \"foundingDate\": \"2011\"\n}\n<\/script>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Intervenez-vous pour des projets de sc\u00e9nographie \u00e0 Rennes ?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Oui. Sc\u00e9nographie Rennes accompagne les marques, agences, institutions et lieux pour des stands, pop-up stores, expositions, lancements de produits et \u00e9v\u00e9nements \u00e0 Rennes, en Bretagne et dans le Grand Ouest.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Quels types de lieux couvrez-vous \u00e0 Rennes et en Bretagne ?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Nous concevons des sc\u00e9nographies pour salons professionnels, centres commerciaux, galeries, lieux culturels, sites patrimoniaux, espaces \u00e9v\u00e9nementiels, si\u00e8ges d'entreprise, festivals et boutiques \u00e9ph\u00e9m\u00e8res.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Pouvez-vous g\u00e9rer la fabrication et l'installation sur site ?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Oui. L'accompagnement peut couvrir la direction artistique, les plans techniques, la fabrication, la coordination et l'installation sur site.\"\n      }\n    }\n  ]\n}\n<\/script>\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;700;800;900&family=JetBrains+Mono:wght@400;500&family=Playfair+Display:wght@400;500&display=swap\" rel=\"stylesheet\">\n\n<style>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   VARIABLES\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n:root {\n  --c-bg-dark:    #242424;\n  --c-bg-light:   #D2D2D2;\n  --c-text-dark:  #E5E5E5;\n  --c-text-light: #242424;\n  --c-text-muted-dark:  rgba(229,229,229,0.6);\n  --c-text-muted-light: rgba(24,24,24,0.6);\n  --c-grid-dark:  rgba(255,255,255,0.08);\n  --c-grid-light: rgba(0,0,0,0.10);\n  --c-marker-dark:  rgba(255,255,255,0.25);\n  --c-marker-light: rgba(0,0,0,0.30);\n  --c-accent-yellow: #D5FF00;\n\n  --f-display:  'Inter', system-ui, sans-serif;\n  --f-mono:     'JetBrains Mono', ui-monospace, monospace;\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \u00c9CHELLE TYPOGRAPHIQUE (DA stricte) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     7 niveaux. Toute taille de texte du site doit utiliser un de ces tokens.\n     Ne jamais \u00e9crire un font-size en dur ailleurs. *\/\n  --fs-mono:     11px;                         \/* eyebrows, labels, nums [ 01 ], CTA mono *\/\n  --fs-mono-sm:  10px;                         \/* micro-labels (coords header, m\u00e9ta) *\/\n  --fs-body:     15px;                         \/* paragraphes courants *\/\n  --fs-body-lg:  clamp(18px, 1.6vw, 22px);     \/* chap\u00f4, accroches \u00e9ditoriales *\/\n  --fs-list:     clamp(15px, 1.25vw, 18px);    \/* lignes de liste expertise *\/\n  --fs-h3:       clamp(20px, 1.9vw, 28px);     \/* sous-titres, noms de projets, lignes actives *\/\n  --fs-h2:       clamp(32px, 5vw, 56px);       \/* titres de section secondaires (sculpter, etc.) *\/\n  --fs-display:  clamp(56px, 9vw, 130px);      \/* gros titres de section (CARNET, IMMERSION) *\/\n  --fs-mega:     clamp(80px, 13vw, 200px);     \/* hero, compteur g\u00e9ant *\/\n\n  --header-h:   58px;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   RESET + ANTI-BLOCAGE SCROLL\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\nhtml.sf-active {\n  overflow-x: hidden !important;\n  overflow-y: scroll !important;\n  height: auto !important;\n  max-height: none !important;\n  position: static !important;\n  width: 100% !important;\n  scroll-behavior: auto !important;\n}\nhtml.sf-active body {\n  overflow-x: hidden !important;\n  overflow-y: visible !important;\n  height: auto !important;\n  min-height: 100vh !important;\n  max-height: none !important;\n  position: static !important;\n  width: 100% !important;\n  margin: 0 !important;\n}\n\nhtml, body {\n  background: var(--c-bg-dark);\n  color: var(--c-text-dark);\n  font-family: var(--f-display);\n  font-weight: 400;\n  width: 100%;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\nimg, video, canvas, svg { display: block; max-width: 100%; }\na { color: inherit; text-decoration: none; }\nbutton { background: none; border: none; cursor: pointer; color: inherit; font-family: inherit; padding: 0; }\n\n@media (prefers-reduced-motion: reduce) {\n  *, *::before, *::after {\n    animation-duration: 0.01ms !important;\n    transition-duration: 0.01ms !important;\n  }\n  \/* Exception : le marquee de logos est une animation douce continue,\n     on la garde mais ralentie pour rester confortable *\/\n  .sf-logos-track {\n    animation-duration: 90s !important;\n    -webkit-animation-duration: 90s !important;\n  }\n}\n\n#sf-wrapper {\n  position: relative;\n  width: 100%;\n  height: auto !important;\n  min-height: 100vh;\n  max-height: none !important;\n  overflow: visible !important;\n  background: var(--c-bg-dark);\n  display: block;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SYST\u00c8ME REVEAL GLOBAL (fade-up via IntersectionObserver)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-reveal {\n  opacity: 0;\n  transform: translateY(48px);\n  transition:\n    opacity 1.1s cubic-bezier(0.16, 1, 0.3, 1),\n    transform 1.1s cubic-bezier(0.16, 1, 0.3, 1);\n  will-change: opacity, transform;\n}\n.sf-reveal.is-revealed {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n\/* Variante : reveal en split-line pour les titres (chaque ligne masqu\u00e9e par overflow) *\/\n.sf-reveal-line {\n  display: block;\n  overflow: hidden;\n}\n.sf-reveal-line > span {\n  display: block;\n  transform: translateY(110%);\n  transition: transform 1.2s cubic-bezier(0.16, 1, 0.3, 1);\n  will-change: transform;\n}\n.sf-reveal-line.is-revealed > span {\n  transform: translateY(0);\n}\n\n\/* Pas d'animation pour reduce-motion *\/\n@media (prefers-reduced-motion: reduce) {\n  .sf-reveal, .sf-reveal-line > span {\n    opacity: 1 !important;\n    transform: none !important;\n    transition: none !important;\n  }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CURSEUR CUSTOM (lignes h+v + markers de targeting aux coins)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-cursor {\n  position: fixed;\n  top: 0; left: 0;\n  width: 100vw; height: 100vh;\n  pointer-events: none;\n  z-index: 9000;\n  opacity: 0;\n  transition: opacity 0.3s ease;\n}\n.sf-cursor.is-active { opacity: 1; }\n\n\/* Lignes traversantes h + v *\/\n.sf-cursor-h {\n  position: absolute;\n  left: 0; right: 0;\n  top: 0;\n  height: 1px;\n  background: rgba(0, 0, 0, 0.18);\n  transform: translate3d(0, 0, 0);\n  will-change: transform;\n}\n.sf-cursor-v {\n  position: absolute;\n  top: 0; bottom: 0;\n  left: 0;\n  width: 1px;\n  background: rgba(0, 0, 0, 0.18);\n  transform: translate3d(0, 0, 0);\n  will-change: transform;\n}\n\n\/* Sur sections data-section-color=\"dark\", lignes claires *\/\nbody.is-dark-section .sf-cursor-h,\nbody.is-dark-section .sf-cursor-v {\n  background: rgba(255, 255, 255, 0.18);\n}\n\n\/* Markers \"+\" aux coins de l'\u00e9l\u00e9ment hovered *\/\n.sf-cursor-marker {\n  position: fixed;\n  top: 0; left: 0;\n  width: 12px; height: 12px;\n  background:\n    linear-gradient(currentColor, currentColor) center center \/ 12px 1px no-repeat,\n    linear-gradient(currentColor, currentColor) center center \/ 1px 12px no-repeat;\n  color: rgba(0, 0, 0, 0.7);\n  opacity: 0;\n  transform: translate3d(0, 0, 0) scale(0.6);\n  transition: opacity 0.25s ease, transform 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n  will-change: transform, opacity;\n}\nbody.is-dark-section .sf-cursor-marker {\n  color: rgba(255, 255, 255, 0.8);\n}\n.sf-cursor.is-targeting .sf-cursor-marker {\n  opacity: 1;\n  transform: translate3d(var(--mx, 0), var(--my, 0), 0) scale(1);\n}\n\n\/* Mobile \/ touch : pas de cursor custom *\/\n@media (hover: none), (pointer: coarse) {\n  .sf-cursor { display: none !important; }\n}\n\n\/* Classe utilitaire .sf-target = \u00e9l\u00e9ment qui active les markers au hover *\/\n.sf-target { cursor: pointer; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   GRID BLUEPRINT (lignes fines + crosshairs)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-grid {\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  z-index: 1;\n}\n.sf-grid-line {\n  position: absolute;\n  background: currentColor;\n  opacity: 0.08;\n}\n.sf-grid-line--v { top: 0; bottom: 0; width: 1px; }\n.sf-grid-line--h { left: 0; right: 0; height: 1px; }\n\n.sf-cross {\n  position: absolute;\n  width: 14px;\n  height: 14px;\n  pointer-events: none;\n  opacity: 0.4;\n  z-index: 2;\n}\n.sf-cross::before, .sf-cross::after {\n  content: \"\"; position: absolute; background: currentColor;\n}\n.sf-cross::before {\n  left: 0; right: 0; top: 50%;\n  height: 1px; transform: translateY(-50%);\n}\n.sf-cross::after {\n  top: 0; bottom: 0; left: 50%;\n  width: 1px; transform: translateX(-50%);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   HEADER\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-header {\n  position: fixed;\n  top: 0; left: 0; right: 0;\n  height: var(--header-h);\n  z-index: 10000;\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr 1fr;\n  align-items: center;\n  padding: 0 24px;\n  gap: 16px;\n  pointer-events: none;\n  \/* Position de d\u00e9part : en BAS du hero *\/\n  transform: translateY(calc(100vh - var(--header-h) - 24px));\n  transition: transform 0.7s cubic-bezier(0.65, 0, 0.35, 1), color 0.3s;\n  will-change: transform;\n}\n.sf-header > * { pointer-events: auto; }\n\n.sf-header.is-top { transform: translateY(0); }\n\n\/* Quand le menu est ouvert : forcer le header en haut + au-dessus du menu *\/\nbody.is-menu-open .sf-header {\n  transform: translateY(0) !important;\n  z-index: 10001 !important;\n}\n\n.sf-header[data-section=\"dark\"] { color: var(--c-text-dark); }\n.sf-header[data-section=\"light\"] { color: var(--c-text-light); }\n\n.sf-logo {\n  font-family: var(--f-display);\n  font-weight: 800;\n  font-size: var(--fs-body);\n  letter-spacing: 0.02em;\n  white-space: nowrap;\n}\n\n\/* Description centr\u00e9e dans le header *\/\n.sf-header-meta {\n  grid-column: 2 \/ 4;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 12px;\n  text-align: center;\n  transition: opacity 0.4s, visibility 0.4s;\n}\n.sf-meta-icon {\n  width: 28px; height: 28px;\n  border: 1px solid currentColor;\n  border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.sf-meta-icon svg {\n  width: 12px; height: 12px;\n  stroke: currentColor; fill: none;\n  stroke-width: 1.5;\n}\n.sf-meta-desc {\n  font-family: var(--f-display);\n  font-size: var(--fs-mono);\n  line-height: 1.45;\n  max-width: 380px;\n  color: currentColor;\n}\n\n\/* Cache la meta quand le header monte au top *\/\n.sf-header.is-top .sf-header-meta {\n  opacity: 0;\n  visibility: hidden;\n  pointer-events: none;\n}\n\n\/* Coords + actions : sur la m\u00eame ligne que le bas (pas dans la grid centr\u00e9e) *\/\n.sf-header-end {\n  grid-column: 4;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 16px;\n}\n.sf-coords {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.05em;\n  white-space: nowrap;\n  display: flex; gap: 6px;\n  opacity: 0.85;\n}\n.sf-coords-val {\n  display: inline-block;\n  min-width: 28px;\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n\n.sf-lang {\n  display: flex; gap: 6px; align-items: center;\n}\n.sf-flag {\n  width: 24px; height: 24px;\n  border-radius: 50%; overflow: hidden;\n  cursor: pointer; padding: 0;\n  border: 1px solid currentColor;\n  opacity: 0.4;\n  transition: opacity 0.3s, transform 0.3s;\n  background: transparent;\n}\n.sf-flag svg { width: 100%; height: 100%; display: block; }\n.sf-flag:hover { opacity: 0.7; }\n.sf-flag.active { opacity: 1; }\n\n.sf-menu-btn {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.10em;\n  padding: 9px 14px;\n  background: #000;\n  color: #fff;\n  border: 1px solid #000;\n  cursor: pointer;\n  white-space: nowrap;\n  transition: background 0.3s, color 0.3s, border-color 0.3s, transform 0.3s;\n}\n.sf-menu-btn:hover { background: #fff; color: #000; transform: scale(1.02); }\n\n.sf-header[data-section=\"light\"] .sf-menu-btn {\n  background: var(--c-text-light);\n  color: var(--c-bg-light);\n  border-color: var(--c-text-light);\n}\n.sf-header[data-section=\"light\"] .sf-menu-btn:hover {\n  background: var(--c-bg-light);\n  color: var(--c-text-light);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   1. HERO \u2014 fond noir, titre \u00e9norme, pin 200%\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-hero-wrap {\n  position: relative;\n  height: 200vh; \/* ScrollTrigger pin pendant 200% *\/\n  background: var(--c-bg-dark);\n  z-index: 1;\n}\n\n.sf-hero {\n  position: sticky;\n  top: 0;\n  height: 100vh;\n  background: var(--c-bg-dark);\n  color: var(--c-text-dark);\n  overflow: hidden;\n}\n\n\/* Lignes blueprint hero *\/\n.sf-hero-grid::before,\n.sf-hero-grid::after {\n  content: \"\"; position: absolute;\n  background: var(--c-grid-dark);\n  pointer-events: none; z-index: 1;\n}\n.sf-hero-grid::before {\n  top: 0; bottom: 0;\n  left: 50%;\n  width: 1px;\n}\n.sf-hero-grid::after {\n  left: 0; right: 0;\n  bottom: 95px;\n  height: 1px;\n}\n\n.sf-hero-cross {\n  position: absolute; bottom: 88px;\n  width: 14px; height: 14px;\n  z-index: 2; pointer-events: none;\n  color: var(--c-text-dark);\n  opacity: 0.4;\n}\n.sf-hero-cross::before, .sf-hero-cross::after {\n  content: \"\"; position: absolute; background: currentColor;\n}\n.sf-hero-cross::before {\n  left: 0; right: 0; top: 50%;\n  height: 1px; transform: translateY(-50%);\n}\n.sf-hero-cross::after {\n  top: 0; bottom: 0; left: 50%;\n  width: 1px; transform: translateX(-50%);\n}\n.sf-hero-cross--l { left: 30%; }\n.sf-hero-cross--r { right: 30%; }\n\n\/* Titre \u00e9norme *\/\n.sf-hero-title {\n  position: absolute;\n  top: 0;\n  left: 24px;\n  right: 24px;\n  margin: 0;\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: var(--fs-mega);\n  line-height: 0.86;\n  letter-spacing: -0.05em;\n  text-transform: uppercase;\n  color: var(--c-text-dark);\n  white-space: nowrap;\n  z-index: 3;\n  pointer-events: none;\n  will-change: transform, opacity;\n}\n.sf-hero-line { display: block; overflow: hidden; }\n.sf-hero-line > span { display: inline-block; }\n\n\n\/* Lien CTA bas (sans bordure box, juste underline) *\/\n.sf-cta-link {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  margin-top: 28px;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono-sm);\n  font-weight: 500;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  color: var(--c-text-light);\n  text-decoration: none;\n  padding-bottom: 4px;\n  border-bottom: 1px solid currentColor;\n  transition: opacity 0.3s ease;\n}\n.sf-cta-link:hover { opacity: 0.7; }\n.sf-cta-link-arrow { transition: transform 0.3s ease; }\n.sf-cta-link:hover .sf-cta-link-arrow { transform: translateX(6px); }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   3. SECTION IMMERSION (2 colonnes : vid\u00e9o+caption \/ titre+texte+CTA)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-immersion {\n  position: relative;\n  background: var(--c-bg-dark);\n  color: var(--c-text-dark);\n  padding: 18vh 5vw 16vh;\n  z-index: 2;\n  overflow: hidden; \/* contient le bleed gauche de l'image *\/\n}\n.sf-immersion::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  opacity: 0.7;\n  background:\n    linear-gradient(to right, transparent calc(50% - 1px), rgba(255,255,255,0.08) calc(50% - 1px), rgba(255,255,255,0.08) 50%, transparent 50%),\n    linear-gradient(to bottom, transparent calc(64% - 1px), rgba(255,255,255,0.08) calc(64% - 1px), rgba(255,255,255,0.08) 64%, transparent 64%);\n}\n\n.sf-immersion-grid {\n  position: relative;\n  z-index: 2;\n  display: grid;\n  grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);\n  gap: clamp(36px, 7vw, 120px);\n  align-items: center;\n}\n\n\/* Colonne gauche : image (bleed gauche + crop droit) + caption align\u00e9e au flow *\/\n.sf-immersion-media-col {\n  display: flex;\n  flex-direction: column;\n  gap: 18px;\n  order: 2;\n}\n\n.sf-immersion-media {\n  width: calc(100% + 5vw);\n  margin-left: 0;\n  transform: translateX(5vw);\n  aspect-ratio: 1.18 \/ 1;\n  position: relative;\n  overflow: hidden;\n  background: transparent;\n  border-left: 1px solid rgba(255,255,255,0.18);\n  -webkit-mask-image: none;\n          mask-image: none;\n}\n\n.sf-immersion-media video,\n.sf-immersion-media img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  object-position: center center;\n}\n\n\/* \u2500\u2500 Slide reveal \"from left\" sur l'image immersion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-immersion-media img {\n  opacity: 0;\n  transform: translateX(-12%);\n  transition: opacity 0.5s ease-out,\n              transform 1.4s cubic-bezier(0.77, 0, 0.18, 1);\n  will-change: transform, opacity;\n}\n.sf-immersion-media img.is-image-revealed {\n  opacity: 1;\n  transform: translateX(0);\n}\n\n.sf-immersion-caption {\n  font-family: var(--f-display);\n  font-size: var(--fs-body);\n  line-height: 1.55;\n  letter-spacing: 0;\n  color: rgba(229,229,229,0.72);\n  max-width: 460px;\n  margin: 0;\n  margin-left: 0;\n  opacity: 1;\n}\n\n\/* Colonne droite : titre + texte + CTA *\/\n.sf-immersion-content {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 28px;\n  order: 1;\n  max-width: 520px;\n}\n\n.sf-immersion-title {\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: var(--fs-display);\n  letter-spacing: -0.04em;\n  line-height: 0.92;\n  text-transform: uppercase;\n  color: var(--c-text-dark);\n  margin: 0;\n}\n.sf-immersion-title-line { display: block; overflow: hidden; }\n.sf-immersion-title-line > span { display: inline-block; will-change: transform; }\n\n.sf-immersion-text {\n  max-width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n\n.sf-immersion-p {\n  font-size: var(--fs-body);\n  line-height: 1.55;\n  color: rgba(229,229,229,0.78);\n  margin: 0;\n}\n.sf-immersion .sf-cta-link {\n  color: var(--c-text-dark);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   5. SECTION CAPABILITIES (intro 2p + divider + grid 3 cols)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-cap {\n  position: relative;\n  background: #C8C8C8;\n  color: var(--c-text-light);\n  padding: 16vh 5vw 22vh;\n  z-index: 2;\n}\n\n\/* Intro \u00e9ditoriale : eyebrow + chap\u00f4 large + texte de soutien d\u00e9cal\u00e9 *\/\n.sf-cap-intro {\n  display: grid;\n  grid-template-columns: minmax(0, 0.72fr) minmax(0, 1.28fr);\n  column-gap: 6vw;\n  row-gap: 28px;\n  align-items: start;\n  margin-bottom: 64px;\n  border-top: 1px solid rgba(0,0,0,0.18);\n  padding-top: 48px;\n}\n\n\/* Eyebrow mono \u2014 occupe la 1re ligne, colonne gauche *\/\n.sf-cap-eyebrow {\n  grid-column: 1 \/ 2;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  color: var(--c-text-muted-light);\n  margin: 0 0 4px;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n.sf-cap-eyebrow::before {\n  content: \"\";\n  width: 28px;\n  height: 1px;\n  background: var(--c-text-light);\n  display: inline-block;\n}\n\n\/* Chap\u00f4 : grande phrase d'accroche (id\u00e9e forte) *\/\n.sf-cap-lead {\n  grid-column: 2 \/ 3;\n  font-family: var(--f-display);\n  font-size: clamp(24px, 3vw, 42px);\n  font-weight: 500;\n  line-height: 1.12;\n  letter-spacing: -0.025em;\n  color: var(--c-text-light);\n  margin: 0;\n  text-wrap: balance;\n}\n\n\/* Texte de soutien : m\u00eame langage typo que le chap\u00f4, juste plus discret *\/\n.sf-cap-support {\n  grid-column: 2 \/ 3;\n  grid-row: 2 \/ 3;\n  font-family: var(--f-display);\n  font-size: var(--fs-body-lg);\n  font-weight: 500;\n  line-height: 1.45;\n  letter-spacing: -0.01em;\n  color: var(--c-text-muted-light);\n  margin: 0;\n  max-width: 42ch;\n}\n\n\/* Divider horizontal fin *\/\n.sf-cap-divider {\n  height: 1px;\n  background: rgba(0, 0, 0, 0.15);\n  width: 100%;\n  margin-bottom: 64px;\n  transform-origin: left center;\n  transform: scaleX(0);\n  will-change: transform;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 LAYOUT IMMERSIF : image pleine largeur \u00b7 texte l\u00e9ger pos\u00e9 dessus \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-cap-grid {\n  position: relative;\n  \/* full-bleed : d\u00e9borde jusqu'aux deux bords de l'\u00e9cran *\/\n  width: calc(100% + 10vw);\n  margin-left: -5vw;\n  margin-right: -5vw;\n  height: clamp(560px, 88vh, 1000px);\n  overflow: hidden;\n  background: #1a1a1a;\n}\n\n\/* \u2500\u2500 L'IMAGE occupe tout le cadre \u2500\u2500 *\/\n.sf-cap-stage {\n  position: absolute;\n  inset: 0;\n  z-index: 0;\n}\n.sf-cap-image {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  background: #1a1a1a;\n}\n.sf-cap-image-item {\n  position: absolute;\n  inset: 0;\n  width: 100%; height: 100%;\n  object-fit: cover;\n  object-position: center;\n  opacity: 0;\n  z-index: 0;\n  clip-path: inset(0 0 0 100%);\n  transform: scale(1.06);\n  transition:\n    clip-path 1.05s cubic-bezier(0.76, 0, 0.18, 1),\n    transform 1.6s cubic-bezier(0.76, 0, 0.18, 1),\n    opacity 0.01s linear;\n  pointer-events: none;\n  image-rendering: -webkit-optimize-contrast;\n  backface-visibility: hidden;\n}\n.sf-cap-image-item.is-animating { will-change: clip-path, transform; }\n.sf-cap-image-item.is-current {\n  opacity: 1;\n  z-index: 2;\n  clip-path: inset(0 0 0 0%);\n  transform: scale(1);\n}\n.sf-cap-image-item.is-leaving {\n  opacity: 1;\n  z-index: 1;\n  clip-path: inset(0 0 0 0%);\n  transform: scale(1.04);\n  transition:\n    transform 1.6s cubic-bezier(0.76, 0, 0.18, 1),\n    opacity 0.5s ease 0.55s;\n}\n.sf-cap-image-item[data-cap-key=\"cap1\"] { object-position: 50% 55%; }\n.sf-cap-image-item[data-cap-key=\"cap2\"] { object-position: 50% 45%; }\n.sf-cap-image-item[data-cap-key=\"cap3\"] { object-position: 50% 50%; }\n.sf-cap-image-item[data-cap-key=\"cap4\"] { object-position: 50% 50%; }\n.sf-cap-image-item[data-cap-key=\"cap5\"] { object-position: 50% 42%; }\n.sf-cap-image-item[data-cap-key=\"cap6\"] { object-position: 55% 52%; }\n\n\/* Voile d\u00e9grad\u00e9 bas + l\u00e9ger c\u00f4t\u00e9 gauche : lisibilit\u00e9 du texte SANS bloc opaque *\/\n.sf-cap-stage::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 3;\n  pointer-events: none;\n  background:\n    linear-gradient(to top, rgba(15,15,15,0.78) 0%, rgba(15,15,15,0.30) 32%, rgba(15,15,15,0) 60%),\n    linear-gradient(to right, rgba(15,15,15,0.42) 0%, rgba(15,15,15,0) 42%);\n}\n\n\/* Compteur g\u00e9ant : pos\u00e9 en haut-droite, \u00e9l\u00e9ment de composition *\/\n.sf-cap-counter {\n  position: absolute;\n  top: 4%;\n  right: 4%;\n  z-index: 4;\n  font-family: var(--f-display);\n  font-weight: 800;\n  font-size: var(--fs-mega);\n  line-height: 0.8;\n  letter-spacing: -0.05em;\n  color: #fff;\n  opacity: 0.14;\n  pointer-events: none;\n  user-select: none;\n}\n.sf-cap-counter sup {\n  font-size: 0.20em;\n  vertical-align: super;\n  font-family: var(--f-mono);\n  font-weight: 500;\n  letter-spacing: 0;\n  opacity: 0.8;\n}\n\n\/* \u2500\u2500 TEXTE pos\u00e9 sur l'image : align\u00e9 en bas-gauche, aucun fond \u2500\u2500 *\/\n.sf-cap-panel {\n  position: absolute;\n  z-index: 5;\n  left: 5vw;\n  right: 5vw;\n  bottom: clamp(36px, 5vh, 64px);\n  display: flex;\n  flex-direction: column;\n}\n\n\/* En-t\u00eate EXPERTISE \/ 06 *\/\n.sf-cap-title-col {\n  display: flex;\n  align-items: baseline;\n  gap: 10px;\n  margin-bottom: 18px;\n  padding-bottom: 16px;\n  border-bottom: 1px solid rgba(255,255,255,0.22);\n}\n.sf-cap-title {\n  font-family: var(--f-mono);\n  font-weight: 500;\n  font-size: var(--fs-mono);\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  margin: 0;\n  color: #fff;\n}\n.sf-cap-title-total {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  letter-spacing: 0.12em;\n  color: rgba(255,255,255,0.55);\n}\n\n\/* Liste : rang\u00e9e horizontale l\u00e9g\u00e8re pos\u00e9e sur l'image *\/\n.sf-cap-list {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  gap: 0;\n}\n\n.sf-cap-line {\n  position: relative;\n  display: flex;\n  align-items: baseline;\n  gap: 10px;\n  padding: 14px 28px 14px 0;\n  margin-right: 28px;\n  cursor: pointer;\n  opacity: 0;\n  transform: translateY(15px);\n  transition:\n    opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1),\n    transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.sf-cap-line.is-revealed { opacity: 1; transform: translateY(0); }\n\n\/* Num\u00e9ro mono *\/\n.sf-cap-line-num {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono-sm);\n  font-weight: 500;\n  letter-spacing: 0.10em;\n  color: rgba(255,255,255,0.55);\n  white-space: nowrap;\n  transition: color 0.4s ease;\n}\n\n\/* Intitul\u00e9 blanc avec ombre douce pour lisibilit\u00e9 *\/\n.sf-cap-line-name {\n  font-family: var(--f-display);\n  font-size: var(--fs-list);\n  font-weight: 500;\n  line-height: 1.25;\n  letter-spacing: -0.005em;\n  color: rgba(255,255,255,0.66);\n  text-shadow: 0 1px 18px rgba(0,0,0,0.4);\n  transition: color 0.4s ease;\n}\n\n\/* Le fil de contexte n'a plus sa place en mode horizontal compact \u2192 masqu\u00e9 *\/\n.sf-cap-line-meta { display: none; }\n\n\/* Ligne active : intitul\u00e9 pleinement blanc + num\u00e9ro lime + soulignement lime *\/\n.sf-cap-line.is-active .sf-cap-line-name {\n  color: #fff;\n  font-weight: 600;\n}\n.sf-cap-line.is-active .sf-cap-line-num {\n  color: var(--c-accent-yellow);\n}\n.sf-cap-line::after {\n  content: \"\";\n  position: absolute;\n  left: 0; bottom: 6px;\n  height: 2px;\n  width: calc(100% - 28px);\n  background: var(--c-accent-yellow);\n  transform: scaleX(0);\n  transform-origin: left center;\n  transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.sf-cap-line.is-active::after { transform: scaleX(1); }\n\n\/* CTA \"D\u00c9MARRER UN PROJET\" : pos\u00e9 en haut-droite du panneau texte *\/\n.sf-cap-cta {\n  position: absolute;\n  right: 0;\n  bottom: 100%;\n  margin-bottom: 28px;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.12em;\n  text-transform: uppercase;\n  color: #fff;\n  text-decoration: none;\n  display: inline-flex;\n  align-items: center;\n  gap: 12px;\n  padding: 13px 22px;\n  border: 1px solid rgba(255,255,255,0.45);\n  transition: background 0.3s ease, color 0.3s ease, gap 0.3s ease, border-color 0.3s ease;\n}\n.sf-cap-cta:hover {\n  background: var(--c-accent-yellow);\n  border-color: var(--c-accent-yellow);\n  color: var(--c-text-light);\n  gap: 18px;\n}\n.sf-cap-cta-arrow {\n  font-size: var(--fs-body);\n  display: inline-block;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   7. CARROUSEL LOGOS\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/* Wrapper qui englobe trust-band + marquee, fond gris clair pour pas voir le body noir *\/\n.sf-transition-wrap {\n  background-color: #D2D2D2 !important;\n  background: #D2D2D2 !important;\n  padding-top: 80px;\n  padding-bottom: 0;\n  width: 100%;\n  position: relative;\n  z-index: 5;\n  isolation: isolate;\n}\n\n\/* Bande \"label\" avec bordures top+bottom *\/\n.sf-trust-band {\n  background-color: #D2D2D2 !important;\n  background: #D2D2D2 !important;\n  border-top: 1px solid rgba(0, 0, 0, 0.18);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.18);\n  padding: 22px 32px;\n  position: relative;\n  width: 100%;\n}\n.sf-trust-band-inner {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.sf-trust-band-label {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.18em;\n  color: #242424;\n  text-transform: uppercase;\n}\n\n.sf-logos {\n  background-color: #D2D2D2 !important;\n  background: #D2D2D2 !important;\n  color: #242424;\n  padding: 22px 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.18);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.18);\n  overflow: hidden;\n  position: relative;\n  z-index: 5;\n  isolation: isolate;\n  width: 100%;\n  \/* Safari : force un nouveau stacking context pour l'overflow *\/\n  -webkit-transform: translateZ(0);\n          transform: translateZ(0);\n}\n.sf-logos-track {\n  display: flex; align-items: center; gap: 64px;\n  width: max-content;\n  \/* GPU layer \u2014 critique pour Safari iOS *\/\n  -webkit-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\n  will-change: transform;\n  \/* Prefixes webkit pour vieux Safari *\/\n  -webkit-animation: sf-logos-roll 50s linear infinite;\n          animation: sf-logos-roll 50s linear infinite;\n}\n\/* Pause au hover \u2014 desktop uniquement (touch n'a pas hover) *\/\n@media (hover: hover) {\n  .sf-logos:hover .sf-logos-track {\n    -webkit-animation-play-state: paused;\n            animation-play-state: paused;\n  }\n}\n.sf-logos-item { height: 80px; flex-shrink: 0; display: flex; align-items: center; min-width: 120px; justify-content: center; }\n.sf-logos-item img {\n  height: 100%; width: auto; max-width: 160px;\n  object-fit: contain;\n  opacity: 1;\n}\n@-webkit-keyframes sf-logos-roll {\n  from { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); }\n  to   { -webkit-transform: translate3d(-50%, 0, 0); transform: translate3d(-50%, 0, 0); }\n}\n@keyframes sf-logos-roll {\n  from { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); }\n  to   { -webkit-transform: translate3d(-50%, 0, 0); transform: translate3d(-50%, 0, 0); }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   OVERLAY MENU (transition pixelated tiles + bitmap reveal)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-menu-overlay {\n  position: fixed;\n  inset: 0;\n  z-index: 8500; \/* sous le header (9999) *\/\n  pointer-events: none;\n  visibility: hidden;\n  transition: visibility 0s linear 0.8s; \/* delay pour laisser closeMenu finir *\/\n}\n.sf-menu-overlay.is-open {\n  visibility: visible;\n  pointer-events: auto;\n  transition: visibility 0s linear 0s;\n}\n\n\/* Grille de tiles noires qui \"mangent\" la page (rideau pixelis\u00e9) *\/\n.sf-menu-tiles {\n  position: absolute;\n  inset: 0;\n  display: grid;\n  grid-template-columns: repeat(8, 1fr);\n  grid-template-rows: repeat(6, 1fr);\n  z-index: 1;\n  pointer-events: none;\n}\n.sf-menu-tile {\n  background: var(--c-bg-dark);\n  transform: scale(0);\n  transform-origin: center;\n  will-change: transform;\n}\n\n\/* Liens du menu \u2014 align\u00e9s \u00e0 droite, \u00e9normes, au-dessus des tiles *\/\n.sf-menu-nav {\n  position: absolute;\n  bottom: 5vh;\n  right: 5vw;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n  gap: 0;\n  z-index: 2;\n}\n.sf-menu-link {\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: var(--fs-display);\n  line-height: 0.95;\n  letter-spacing: -0.04em;\n  color: var(--c-text-dark);\n  text-decoration: none;\n  display: inline-block;\n  \/* \u00c9tat initial : cach\u00e9 + d\u00e9plac\u00e9 pour animation d'entr\u00e9e *\/\n  opacity: 0;\n  transform: translateX(120px) skewX(-6deg);\n  pointer-events: none;\n  transition: color 0.3s ease, transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), font-style 0.3s ease;\n  position: relative;\n}\n.sf-menu-overlay.is-open .sf-menu-link {\n  pointer-events: auto;\n}\n\n\/* Hover : couleur jaune fluo + italic + slide l\u00e9ger *\/\n.sf-menu-link:hover {\n  color: #D5FF00;\n  font-style: italic;\n  transform: translateX(-12px) skewX(0deg);\n}\n\n\/* Underline qui slide au hover *\/\n.sf-menu-link::after {\n  content: '';\n  position: absolute;\n  left: 0;\n  bottom: 0.08em;\n  width: 0;\n  height: 4px;\n  background: #D5FF00;\n  transition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.sf-menu-link:hover::after {\n  width: 100%;\n}\n\n\/* Filters bitmap distincts par lien (pour stagger) *\/\n.sf-menu-link--1 { filter: url(#sf-bitmap-menu-1); }\n.sf-menu-link--2 { filter: url(#sf-bitmap-menu-2); }\n.sf-menu-link--3 { filter: url(#sf-bitmap-menu-3); }\n.sf-menu-link--4 { filter: url(#sf-bitmap-menu-4); }\n.sf-menu-link--5 { filter: url(#sf-bitmap-menu-5); }\n\n\/* Aside : adresse \/ tel \/ email en bas-gauche *\/\n.sf-menu-aside {\n  position: absolute;\n  left: 5vw;\n  bottom: 5vh;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  letter-spacing: 0.1em;\n  text-transform: uppercase;\n  color: var(--c-text-dark);\n  opacity: 0;\n  transform: translateY(20px);\n  transition: opacity 0.5s ease 0.5s, transform 0.5s ease 0.5s;\n  z-index: 2;\n}\n.sf-menu-overlay.is-open .sf-menu-aside {\n  opacity: 1;\n  transform: translateY(0);\n}\n.sf-menu-aside-label {\n  opacity: 0.55;\n  font-size: var(--fs-mono-sm);\n  letter-spacing: 0.14em;\n}\n.sf-menu-aside-content {\n  font-style: normal;\n  line-height: 1.7;\n}\n.sf-menu-aside-content a {\n  color: inherit;\n  text-decoration: none;\n  transition: opacity 0.3s ease;\n}\n.sf-menu-aside-content a:hover { opacity: 0.55; }\n\n\/* Bouton MENU \u2192 CLOSE en jaune fluo quand le menu est ouvert\n   Override agressif de tous les autres \u00e9tats (hover, data-section) *\/\n.sf-menu-btn.is-active,\n.sf-menu-btn.is-active:hover,\n.sf-header[data-section=\"light\"] .sf-menu-btn.is-active,\n.sf-header[data-section=\"light\"] .sf-menu-btn.is-active:hover {\n  background: #D5FF00 !important;\n  color: #000 !important;\n  border-color: #D5FF00 !important;\n  transform: none !important;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   LOADER\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-loader {\n  position: fixed; inset: 0;\n  background: var(--c-bg-dark);\n  z-index: 99999;\n  display: flex; align-items: center; justify-content: center;\n  transition: opacity 0.6s, visibility 0.6s;\n}\n.sf-loader.hidden { opacity: 0; visibility: hidden; pointer-events: none; }\n.sf-loader-inner {\n  display: flex; align-items: center; gap: 12px;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  letter-spacing: 0.1em;\n  color: var(--c-text-dark);\n}\n.sf-loader-pct {\n  font-variant-numeric: tabular-nums;\n  display: inline-block; min-width: 36px;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   8. SECTION CARNET \u2014 bento grid asym\u00e9trique, texte en overlay\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-projects {\n  position: relative;\n  background: #E0E0E0;\n  color: var(--c-text-light);\n  z-index: 2;\n  padding: 14vh 5vw 16vh;\n  overflow: hidden;\n}\n.sf-projects::before {\n  content: \"GRAND OUEST\";\n  position: absolute;\n  top: 4vh;\n  left: -0.08em;\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: clamp(84px, 17vw, 260px);\n  line-height: 0.78;\n  letter-spacing: -0.07em;\n  color: rgba(0,0,0,0.045);\n  pointer-events: none;\n  white-space: nowrap;\n}\n\n\/* \u2500\u2500 Header (label + titre) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-header {\n  position: relative;\n  z-index: 2;\n  display: grid;\n  grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);\n  gap: clamp(24px, 5vw, 80px);\n  align-items: end;\n  margin-bottom: 56px;\n  border-top: 1px solid rgba(0,0,0,0.18);\n  padding-top: 42px;\n}\n.sf-projects-label {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  color: var(--c-text-light);\n  opacity: 0.5;\n}\n.sf-projects-title {\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: var(--fs-display);\n  line-height: 0.86;\n  letter-spacing: -0.04em;\n  text-transform: uppercase;\n  color: var(--c-text-light);\n  margin: 0;\n  text-align: right;\n}\n\n\/* \u2500\u2500 BENTO GRID : 6 colonnes, rang\u00e9es asym\u00e9triques \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-grid {\n  position: relative;\n  z-index: 2;\n  display: grid;\n  grid-template-columns: repeat(6, 1fr);\n  gap: 16px;\n}\n\n\/* \u2500\u2500 Card projet \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-item {\n  position: relative;\n  display: block;\n  overflow: hidden;\n  text-decoration: none;\n  color: inherit;\n  cursor: pointer;\n  background: #1a1a1a;\n  aspect-ratio: 1 \/ 1;            \/* d\u00e9faut carr\u00e9 *\/\n  \/* reveal *\/\n  opacity: 0;\n  transform: translateY(28px);\n  transition:\n    opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1),\n    transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.sf-projects-item::after {\n  content: \"\";\n  position: absolute;\n  left: 18px;\n  right: 18px;\n  bottom: 18px;\n  height: 2px;\n  background: var(--c-accent-yellow);\n  transform: scaleX(0);\n  transform-origin: left center;\n  transition: transform 0.45s cubic-bezier(0.16, 1, 0.3, 1);\n  z-index: 3;\n}\n.sf-projects-item:hover::after,\n.sf-projects-item:focus-visible::after {\n  transform: scaleX(1);\n}\n.sf-projects-item.is-revealed { opacity: 1; transform: translateY(0); }\n.sf-projects-item:focus-visible {\n  outline: 2px solid var(--c-accent-yellow);\n  outline-offset: 4px;\n}\n\n\/* \u2605 Spans bento : grande (hero) = 4 col \/ paysage \u00b7 moyenne = 2 col \u00b7 tiers = 2 col *\/\n.sf-projects-item.is-hero {\n  grid-column: span 4;\n  aspect-ratio: 16 \/ 10;\n}\n.sf-projects-item.is-side {\n  grid-column: span 2;\n  aspect-ratio: auto;            \/* s'\u00e9tire sur la hauteur du hero voisin *\/\n  height: 100%;\n  align-self: stretch;\n}\n.sf-projects-item.is-third {\n  grid-column: span 2;\n  aspect-ratio: 4 \/ 3;\n}\n\n\/* \u2500\u2500 Image (couvre la card, scale au hover) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-img-w {\n  position: absolute;\n  inset: 0;\n  overflow: hidden;\n}\n.sf-projects-img-track {\n  position: absolute;\n  inset: 0;\n}\n.sf-projects-img-track img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  transition: transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.sf-projects-item:hover .sf-projects-img-track img {\n  transform: scale(1.05);\n}\n\n\/* Voile d\u00e9grad\u00e9 bas pour lisibilit\u00e9 du texte overlay *\/\n.sf-projects-item::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 1;\n  pointer-events: none;\n  background: linear-gradient(to top,\n    rgba(10,10,10,0.72) 0%,\n    rgba(10,10,10,0.30) 28%,\n    rgba(10,10,10,0) 52%);\n  transition: opacity 0.5s ease;\n}\n\n\/* \u2500\u2500 TEXTE OVERLAY : eyebrow cat\u00e9gorie + titre projet, bas-gauche \u2500\u2500 *\/\n.sf-projects-overlay {\n  position: absolute;\n  left: 0; right: 0; bottom: 0;\n  z-index: 2;\n  padding: clamp(18px, 1.6vw, 30px);\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n.sf-projects-eyebrow {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono-sm);\n  font-weight: 500;\n  letter-spacing: 0.16em;\n  text-transform: uppercase;\n  color: rgba(255,255,255,0.7);\n}\n.sf-projects-name {\n  font-family: var(--f-display);\n  font-weight: 600;\n  font-size: var(--fs-h3);\n  line-height: 1.1;\n  letter-spacing: -0.01em;\n  color: #fff;\n  text-shadow: 0 1px 16px rgba(0,0,0,0.35);\n}\n.sf-projects-item.is-hero .sf-projects-name { font-size: clamp(26px, 3vw, 38px); }\n\n\/* Filet lime qui se dessine au hover sous le titre *\/\n.sf-projects-name-line {\n  display: block;\n  height: 2px;\n  width: 38px;\n  margin-top: 12px;\n  background: var(--c-accent-yellow);\n  transform: scaleX(0);\n  transform-origin: left center;\n  transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.sf-projects-item:hover .sf-projects-name-line { transform: scaleX(1); }\n\n\/* Fl\u00e8che VOIR au hover, coin haut-droit *\/\n.sf-projects-arrow {\n  position: absolute;\n  top: clamp(16px, 1.4vw, 26px);\n  right: clamp(16px, 1.4vw, 26px);\n  z-index: 2;\n  width: 42px; height: 42px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid rgba(255,255,255,0.4);\n  border-radius: 0;\n  color: #fff;\n  font-size: var(--fs-body);\n  opacity: 0;\n  transform: translate(-6px, 6px);\n  transition: opacity 0.4s ease, transform 0.5s cubic-bezier(0.16,1,0.3,1), background 0.3s ease, color 0.3s ease;\n}\n.sf-projects-item:hover .sf-projects-arrow {\n  opacity: 1;\n  transform: translate(0, 0);\n  background: var(--c-accent-yellow);\n  border-color: var(--c-accent-yellow);\n  color: var(--c-text-light);\n}\n\n\/* \u2500\u2500 Citation \u00e9ditoriale (carte texte dans la grille) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-callout {\n  grid-column: span 2;\n  display: flex;\n  align-items: center;\n  padding: clamp(24px, 2vw, 40px);\n}\n.sf-projects-callout-text {\n  font-family: var(--f-display);\n  font-size: var(--fs-body-lg);\n  font-weight: 500;\n  line-height: 1.3;\n  letter-spacing: -0.005em;\n  color: var(--c-text-light);\n  margin: 0;\n}\n.sf-projects-callout-text em {\n  font-style: italic;\n  font-weight: 400;\n  opacity: 0.55;\n}\n\n\/* \u2500\u2500 CTA outro : centr\u00e9 sous la grille \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-outro {\n  display: flex;\n  justify-content: center;\n  margin-top: 64px;\n}\n\n\/* \u2500\u2500 CTA outro \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-projects-cta {\n  display: inline-flex;\n  align-items: center;\n  gap: 14px;\n  padding: 16px 28px;\n  position: relative;\n  border: 1px solid rgba(0, 0, 0, 0.4);\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.16em;\n  text-transform: uppercase;\n  color: var(--c-text-light);\n  text-decoration: none;\n  cursor: pointer;\n  transition: background 0.3s ease, color 0.3s ease, border-color 0.3s ease;\n  white-space: nowrap;\n}\n.sf-projects-cta:hover {\n  background: var(--c-text-light);\n  color: var(--c-bg-light);\n  border-color: var(--c-text-light);\n}\n.sf-projects-cta-arrow {\n  display: inline-block;\n  transition: transform 0.3s ease;\n}\n.sf-projects-cta:hover .sf-projects-cta-arrow { transform: translateX(6px); }\n\n\/* Croix dans les 4 angles : cach\u00e9es par d\u00e9faut, apparaissent au hover *\/\n.sf-projects-cta-corner {\n  position: absolute;\n  width: 12px;\n  height: 12px;\n  pointer-events: none;\n  opacity: 0;\n  transform: scale(0.6);\n  \/* couleur de base = teinte du bouton, devient claire \u00e0 l'inversion du hover *\/\n  color: var(--c-text-light);\n  transition: opacity 0.3s ease, transform 0.3s cubic-bezier(0.65, 0, 0.35, 1), color 0.3s ease;\n}\n.sf-projects-cta-corner::before,\n.sf-projects-cta-corner::after {\n  content: \"\";\n  position: absolute;\n  background: currentColor;\n}\n.sf-projects-cta-corner::before {\n  left: 0; right: 0; top: 50%;\n  height: 1px; transform: translateY(-50%);\n}\n.sf-projects-cta-corner::after {\n  top: 0; bottom: 0; left: 50%;\n  width: 1px; transform: translateX(-50%);\n}\n\/* Placement pile dans les angles (centre de la croix sur le coin) *\/\n.sf-projects-cta-corner--tl { top: -6px;    left: -6px;  }\n.sf-projects-cta-corner--tr { top: -6px;    right: -6px; }\n.sf-projects-cta-corner--bl { bottom: -6px; left: -6px;  }\n.sf-projects-cta-corner--br { bottom: -6px; right: -6px; }\n\/* Hover : r\u00e9v\u00e9lation + suit l'inversion de couleur du bouton *\/\n.sf-projects-cta:hover .sf-projects-cta-corner {\n  opacity: 0.6;\n  transform: scale(1);\n  color: var(--c-bg-light);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   8.5 SECTION LOCALE RENNES \u2014 contenu SEO \u00e9ditorial, m\u00eame DA\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-local {\n  position: relative;\n  background: #D2D2D2 !important;\n  color: var(--c-text-light) !important;\n  z-index: 2;\n  padding: 12vh 5vw 16vh;\n  overflow: hidden;\n}\n.sf-local::before {\n  content: \"RENNES\";\n  position: absolute;\n  right: -0.08em;\n  top: -0.18em;\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: clamp(120px, 26vw, 420px);\n  line-height: 0.8;\n  letter-spacing: -0.06em;\n  color: rgba(0,0,0,0.045);\n  pointer-events: none;\n}\n.sf-local-inner {\n  position: relative;\n  z-index: 2;\n  display: grid;\n  grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);\n  gap: clamp(40px, 6vw, 96px);\n  align-items: start;\n  border-top: 1px solid rgba(0,0,0,0.18);\n  padding-top: clamp(40px, 6vw, 78px);\n}\n.sf-local-kicker {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  opacity: 0.5;\n  margin: 0 0 24px;\n}\n.sf-local-title {\n  font-family: var(--f-display);\n  font-weight: 900;\n  font-size: var(--fs-h2);\n  line-height: 0.95;\n  letter-spacing: -0.04em;\n  text-transform: uppercase;\n  max-width: 560px;\n  margin: 0;\n  color: #000 !important;\n}\n.sf-local-copy {\n  display: grid;\n  gap: 24px;\n}\n.sf-local-copy p {\n  font-size: var(--fs-body-lg);\n  line-height: 1.45;\n  color: rgba(24,24,24,0.78) !important;\n  margin: 0;\n}\n.sf-local-grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 1px;\n  background: rgba(0,0,0,0.16);\n  margin-top: 22px;\n}\n.sf-local-item {\n  background: #D2D2D2 !important;\n  color: var(--c-text-light) !important;\n  padding: clamp(20px, 2vw, 30px);\n  min-height: 150px;\n}\n.sf-local-item-num {\n  display: block;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono-sm);\n  letter-spacing: 0.14em;\n  opacity: 0.45;\n  margin-bottom: 18px;\n}\n.sf-local-item h3 {\n  font-size: var(--fs-h3);\n  line-height: 1.05;\n  letter-spacing: -0.02em;\n  margin: 0 0 12px;\n  color: #000 !important;\n}\n.sf-local-mark {\n  background-color: var(--c-accent-yellow, #D5FF00);\n  color: #000;\n  box-decoration-break: clone;\n  -webkit-box-decoration-break: clone;\n  padding: 0.02em 0.04em;\n}\n.sf-local-item p {\n  font-size: var(--fs-body);\n  line-height: 1.5;\n  color: rgba(24,24,24,0.68) !important;\n  margin: 0;\n}\n.sf-rennes-terrain {\n  position: relative;\n  z-index: 2;\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 1px;\n  margin: clamp(50px, 6vw, 86px) 0 0;\n  background: rgba(0,0,0,0.18);\n}\n.sf-rennes-terrain-item {\n  background: #242424;\n  color: var(--c-text-dark);\n  min-height: 210px;\n  padding: clamp(22px, 2.8vw, 38px);\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n.sf-rennes-terrain-label {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono-sm);\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  color: var(--c-accent-yellow);\n}\n.sf-rennes-terrain-title {\n  font-size: clamp(24px, 3vw, 42px);\n  font-weight: 900;\n  line-height: 0.95;\n  letter-spacing: -0.04em;\n  text-transform: uppercase;\n  margin-top: 34px;\n}\n.sf-rennes-terrain-text {\n  font-size: var(--fs-body);\n  line-height: 1.55;\n  color: rgba(229,229,229,0.68);\n  max-width: 34ch;\n  margin-top: 18px;\n}\n.sf-local-faq {\n  position: relative;\n  z-index: 2;\n  margin-top: clamp(48px, 6vw, 82px);\n  border-top: 1px solid rgba(0,0,0,0.18);\n}\n.sf-local-faq-row {\n  display: grid;\n  grid-template-columns: 0.8fr 1.2fr;\n  gap: clamp(24px, 5vw, 72px);\n  padding: 26px 0;\n  border-bottom: 1px solid rgba(0,0,0,0.18);\n}\n.sf-local-faq-row h3 {\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  font-weight: 500;\n  letter-spacing: 0.12em;\n  text-transform: uppercase;\n  margin: 0;\n}\n.sf-local-faq-row p {\n  font-size: var(--fs-body);\n  line-height: 1.6;\n  color: rgba(24,24,24,0.7) !important;\n  margin: 0;\n}\n\n\n\/* Force tous les H3 de la section locale en blanc *\/\n.sf-local h3,\n.sf-local .sf-local-item h3,\n.sf-local .sf-rennes-terrain-title,\n.sf-local .sf-local-faq-row h3 {\n  color: #fff !important;\n}\n\n\n\/* H3 des cartes locales et de la FAQ : noir, malgr\u00e9 le for\u00e7age blanc global *\/\n.sf-local .sf-local-grid h3,\n.sf-local .sf-local-faq h3 {\n  color: #000 !important;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   9. SECTION DUAL-CTA \u2014 CONCEVOIR \/ EXPLORER \u00b7 REBIRTH\n   Composition \u00e9ditoriale asym\u00e9trique : plan filaire en haut-gauche,\n   rendu 3D en bas-droite, textes plac\u00e9s dans les zones de respiration.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-dualcta {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  \/* La composition source est construite en 16:9. Sur les \u00e9crans tr\u00e8s\n     larges mais peu hauts, 100vh \u00e9crasait toute la sc\u00e8ne et faisait\n     remonter le rendu 3D sous le bloc CONCEVOIR. La hauteur d\u00e9pend\n     d\u00e9sormais de la largeur, avec 100svh comme minimum. *\/\n  height: clamp(860px, 56.25vw, 1080px);\n  min-height: 100svh;\n  overflow: hidden;\n  background: var(--c-bg-light);\n  color: var(--c-text-light);\n  isolation: isolate;\n}\n\n.sf-dualcta-stage {\n  position: relative;\n  width: 100%;\n  max-width: 1920px;\n  height: 100%;\n  min-height: 100%;\n  margin: 0 auto;\n  overflow: hidden;\n}\n\n\/* \u2500\u2500 Visuels principaux \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-dualcta-visual {\n  position: absolute;\n  margin: 0;\n  pointer-events: none;\n  user-select: none;\n  -webkit-user-select: none;\n}\n\n.sf-dualcta-visual img {\n  display: block;\n  width: 100%;\n  height: auto;\n  max-width: none;\n  object-fit: contain;\n}\n\n\/* Plan filaire : masse graphique dominante du quart haut-gauche *\/\n.sf-dualcta-visual--plan {\n  z-index: 1;\n  top: 2.5%;\n  left: -7.5%;\n  width: 55%;\n}\n\n\/* Rendu 3D : ancr\u00e9 dans le bas et d\u00e9bordant l\u00e9g\u00e8rement \u00e0 droite *\/\n.sf-dualcta-visual--render {\n  z-index: 2;\n  right: -13%;\n  bottom: -8%;\n  width: 88%;\n}\n\n\/* \u2500\u2500 Gimmicks fluo \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-dualcta-gimmick {\n  position: absolute;\n  z-index: 3;\n  margin: 0;\n  pointer-events: none;\n  user-select: none;\n  -webkit-user-select: none;\n}\n\n.sf-dualcta-gimmick img {\n  display: block;\n  width: 100%;\n  height: auto;\n  max-width: none;\n}\n\n.sf-dualcta-gimmick--left {\n  left: 5.5%;\n  bottom: 12.5%;\n  width: clamp(150px, 13.5vw, 240px);\n}\n\n.sf-dualcta-gimmick--right {\n  top: 9.5%;\n  right: 5.8%;\n  width: clamp(82px, 6vw, 115px);\n}\n\n\/* \u2500\u2500 Zones \u00e9ditoriales \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sf-dualcta-content {\n  position: absolute;\n  inset: 0;\n  z-index: 4;\n  pointer-events: none;\n}\n\n.sf-dualcta-col {\n  position: absolute;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: min(21vw, 360px);\n  min-width: 300px;\n  text-align: left;\n  pointer-events: auto;\n}\n\n\/* CONCEVOIR \u2014 en haut \u00e0 droite *\/\n.sf-dualcta-col--conceive {\n  top: 10.5%;\n  right: 13.5%;\n}\n\n\/* EXPLORER \u2014 en bas \u00e0 gauche *\/\n.sf-dualcta-col--explore {\n  left: 11.2%;\n  bottom: 10.5%;\n}\n\n.sf-dualcta-headline {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 0;\n  margin: 0 0 clamp(14px, 1.35vw, 24px);\n}\n\n.sf-dualcta-eyebrow {\n  position: relative;\n  z-index: 2;\n  margin: 0 0 -0.12em;\n  font-family: 'Playfair Display', Georgia, 'Times New Roman', serif;\n  font-size: clamp(38px, 3.6vw, 70px);\n  font-weight: 400;\n  font-style: normal;\n  line-height: 0.96;\n  letter-spacing: -0.035em;\n  text-transform: none;\n  color: var(--c-text-light);\n}\n\n.sf-dualcta-title {\n  position: relative;\n  z-index: 1;\n  margin: 0;\n  font-family: var(--f-display);\n  font-size: clamp(42px, 3.35vw, 68px);\n  font-weight: 900;\n  line-height: 0.84;\n  letter-spacing: -0.06em;\n  text-transform: uppercase;\n  color: var(--c-text-light);\n}\n\n.sf-dualcta-desc {\n  max-width: 34ch;\n  margin: 0 0 clamp(18px, 1.5vw, 26px);\n  font-family: var(--f-display);\n  font-size: clamp(14px, 1.08vw, 19px);\n  font-weight: 400;\n  line-height: 1.48;\n  letter-spacing: -0.005em;\n  color: rgba(36,36,36,0.52);\n}\n\n.sf-dualcta-btn {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  align-self: flex-start;\n  gap: 12px;\n  margin: 0;\n  padding: 0 0 7px;\n  border: 0;\n  border-bottom: 1px solid rgba(36,36,36,0.78);\n  background: transparent;\n  color: var(--c-text-light);\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono-sm);\n  font-weight: 500;\n  line-height: 1.2;\n  letter-spacing: 0.17em;\n  text-transform: uppercase;\n  text-decoration: none;\n  white-space: nowrap;\n  transition: opacity 0.3s ease, gap 0.35s cubic-bezier(0.16,1,0.3,1);\n}\n\n.sf-dualcta-btn::after {\n  content: none;\n}\n\n.sf-dualcta-btn svg {\n  display: block;\n  width: 15px;\n  height: 15px;\n  flex: 0 0 auto;\n  transition: transform 0.35s cubic-bezier(0.16,1,0.3,1);\n}\n\n.sf-dualcta-btn:hover,\n.sf-dualcta-btn:focus-visible {\n  gap: 17px;\n  opacity: 0.62;\n}\n\n.sf-dualcta-btn:hover svg,\n.sf-dualcta-btn:focus-visible svg {\n  transform: translate(3px, -3px);\n}\n\n.sf-dualcta-btn:focus-visible {\n  outline: 1px solid currentColor;\n  outline-offset: 7px;\n}\n\n\/* \u2500\u2500 Tablette \/ petit desktop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media (max-width: 1200px) and (min-width: 769px) {\n  .sf-dualcta,\n  .sf-dualcta-stage {\n    min-height: 790px;\n  }\n\n  .sf-dualcta-visual--plan {\n    top: 4%;\n    left: -10%;\n    width: 58%;\n  }\n\n  .sf-dualcta-visual--render {\n    right: -7%;\n    bottom: 2.5%;\n    width: 74%;\n  }\n\n  .sf-dualcta-col {\n    width: min(31vw, 360px);\n    min-width: 270px;\n  }\n\n  .sf-dualcta-col--conceive {\n    top: 10%;\n    right: 8%;\n  }\n\n  .sf-dualcta-col--explore {\n    left: 7%;\n    bottom: 9%;\n  }\n\n  .sf-dualcta-gimmick--left {\n    left: 3.5%;\n    bottom: 11%;\n  }\n\n  .sf-dualcta-gimmick--right {\n    top: 8%;\n    right: 5%;\n  }\n\n  .sf-dualcta-eyebrow {\n    font-size: clamp(34px, 4.2vw, 54px);\n  }\n\n  .sf-dualcta-title {\n    font-size: clamp(42px, 5vw, 66px);\n  }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   9.5 MANIFESTE \u2014 bloc \u00e9ditorial centr\u00e9, bg dynamique au scroll\n   Le bg s'assombrit puis s'\u00e9claircit pendant le scroll. Le texte se\n   r\u00e9v\u00e8le mot par mot via stagger ScrollTrigger. Pas de fluo : \n   contraste purement typographique (italic serif vs sans heavy).\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-manifeste {\n  position: relative;\n  background-color: var(--c-bg-light);  \/* initial \u2014 anim\u00e9 par JS *\/\n  color: var(--c-text-light);            \/* initial \u2014 anim\u00e9 par JS *\/\n  padding: clamp(80px, 14vh, 180px) clamp(24px, 6vw, 96px);\n  overflow: hidden;\n  z-index: 2;\n  min-height: 90vh;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n\/* Lignes topographiques tr\u00e8s subtiles \u2014 couleur suit le text color *\/\n.sf-manifeste-bg {\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  z-index: 0;\n  opacity: 0.08;\n}\n.sf-manifeste-bg svg {\n  width: 100%;\n  height: 100%;\n  display: block;\n}\n.sf-manifeste-bg svg g { stroke: currentColor; }\n\n.sf-manifeste-inner {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  max-width: 920px;\n  margin: 0 auto;\n  text-align: center;\n}\n\n.sf-manifeste-eyebrow {\n  display: inline-block;\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  text-transform: uppercase;\n  letter-spacing: 0.16em;\n  color: currentColor;\n  opacity: 0.55;\n  margin-bottom: clamp(32px, 4vw, 56px);\n}\n\n.sf-manifeste-headline {\n  font-family: var(--f-display);\n  font-weight: 800;\n  font-size: var(--fs-h2);\n  line-height: 1.18;\n  letter-spacing: -0.018em;\n  margin: 0;\n  color: currentColor;\n  text-transform: none;          \/* casse mixte pour ton plus \u00e9ditorial\/po\u00e9tique *\/\n  \/* Hidden tant que le splitWords n'a pas tourn\u00e9 \u2014 \u00e9vite le FOUC *\/\n  visibility: hidden;\n}\n.sf-manifeste-headline.is-ready { visibility: visible; }\n\n\/* Mots accent : Playfair italic \u2014 contraste typo, pas de couleur *\/\n.sf-manifeste-accent {\n  font-family: 'Playfair Display', Georgia, serif;\n  font-weight: 500;\n  font-style: italic;\n  letter-spacing: 0;\n  color: currentColor;\n  font-size: 1.08em;             \/* l\u00e9ger uplift pour ressort visuel *\/\n}\n\n\/* Mot SC\u00c9NOGRAPHIE : effet de s\u00e9lection texte (highlight lime) *\/\n.sf-manifeste-mark {\n  background-color: var(--c-accent-yellow, #D5FF00);\n  color: #000;\n  box-decoration-break: clone;\n  -webkit-box-decoration-break: clone;\n  padding: 0.02em 0.04em;\n}\n\n\/* Mots wrapp\u00e9s par splitWords pour la r\u00e9v\u00e9lation au scroll *\/\n.sf-manifeste-word {\n  display: inline-block;\n  will-change: opacity, transform;\n}\n\n.sf-manifeste-link {\n  display: inline-flex;\n  align-items: center;\n  gap: 12px;\n  margin-top: clamp(40px, 5vw, 72px);\n  font-family: var(--f-mono);\n  font-size: var(--fs-mono);\n  text-transform: uppercase;\n  letter-spacing: 0.14em;\n  color: currentColor;\n  text-decoration: none;\n  padding-bottom: 6px;\n  border-bottom: 1px solid currentColor;\n  transition: opacity 0.3s ease;\n}\n.sf-manifeste-link:hover { opacity: 0.55; }\n.sf-manifeste-link svg {\n  width: 16px;\n  height: 16px;\n  transition: transform 0.35s cubic-bezier(0.65, 0, 0.35, 1);\n}\n.sf-manifeste-link:hover svg { transform: translateX(5px); }\n\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   RESPONSIVE \u2014 TABLETTE (\u2264 1024px)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media (max-width: 1024px) {\n  .sf-header-meta { display: none; }\n  .sf-coords { font-size: var(--fs-mono-sm); }\n\n  .sf-hero-title { letter-spacing: -0.05em; }\n\n  .sf-immersion { padding: 100px 24px; }\n  .sf-immersion-grid { gap: 60px; }\n\n  .sf-cap { padding: 80px 24px; }\n  \/* Image immersive : hauteur r\u00e9duite, texte reste pos\u00e9 dessus *\/\n  .sf-cap-grid {\n    height: clamp(520px, 72vh, 760px);\n  }\n\n  \/* CARNET bento tablette : hero pleine largeur, paires c\u00f4te \u00e0 c\u00f4te *\/\n  .sf-projects { padding: 90px 24px 120px; }\n  .sf-projects-grid { grid-template-columns: repeat(4, 1fr); gap: 14px; }\n  .sf-projects-item.is-hero  { grid-column: span 4; aspect-ratio: 16 \/ 9; }\n  .sf-projects-item.is-side  { grid-column: span 4; aspect-ratio: 16 \/ 9; }\n  .sf-projects-item.is-third { grid-column: span 2; aspect-ratio: 4 \/ 3; }\n  .sf-projects-callout { grid-column: span 4; }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   RESPONSIVE \u2014 MOBILE (\u2264 768px)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media (max-width: 768px) {\n\n  \/* \u2500\u2500 HEADER mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-header {\n    grid-template-columns: 1fr auto auto;\n    gap: 8px;\n    padding: 0 14px;\n    height: 50px;\n    transform: translateY(0) !important;\n  }\n  .sf-header-meta, .sf-coords { display: none; }\n  .sf-header-end { grid-column: auto; gap: 8px; }\n  .sf-logo { font-size: var(--fs-mono); letter-spacing: 0.06em; }\n  .sf-lang-flag { width: 18px; height: 14px; }\n  .sf-menu-btn {\n    padding: 8px 14px;\n    font-size: var(--fs-mono-sm);\n    letter-spacing: 0.1em;\n  }\n\n  \/* \u2500\u2500 HERO mobile (refonte mobile-first) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-hero-wrap { height: auto; }\n  .sf-hero {\n    position: relative;\n    height: auto;\n    min-height: 64svh;\n    padding: 36px 16px 28px;\n    display: flex;\n    flex-direction: column;\n    gap: 36px;\n  }\n  .sf-hero-cross { display: none; }\n  .sf-hero-grid::before, .sf-hero-grid::after { display: none; }\n\n  .sf-hero-title {\n    position: relative;\n    top: 0; left: 0; right: 0;\n    padding: 76px 0 0;\n    font-size: clamp(2rem, 10.5vw, 5rem);\n    line-height: 0.92;\n    letter-spacing: -0.05em;\n    white-space: normal;\n    margin: 0;\n  }\n  \/* Force no-wrap sur les spans pour ne pas casser le reveal-line overflow:hidden *\/\n  .sf-hero-title .sf-hero-line .sf-reveal-line > span,\n  .sf-hero-title .sf-reveal-line > span,\n  .sf-hero-line > span {\n    white-space: nowrap;\n  }\n  \/* SUR MOBILE : d\u00e9sactiver le reveal-line sur HERO (le bitmap blur fait d\u00e9j\u00e0 l'effet) *\/\n  \/* Si l'IntersectionObserver ne fire pas, les spans restent \u00e0 translateY(110%) = invisibles *\/\n  .sf-hero-title .sf-reveal-line {\n    overflow: visible !important;\n  }\n  .sf-hero-title .sf-reveal-line > span,\n  .sf-hero-title .sf-reveal-line.is-revealed > span {\n    transform: translateY(0) !important;\n    transition: none !important;\n    opacity: 1 !important;\n  }\n\n  \/* Bloc mobile-only : tagline + scroll indicator en bas du HERO *\/\n  .sf-hero-mobile-extra {\n    display: flex !important;\n    flex-direction: column;\n    gap: 28px;\n  }\n  .sf-hero-tagline {\n    font-family: var(--f-display);\n    font-size: var(--fs-body);\n    line-height: 1.5;\n    color: var(--c-text-dark);\n    opacity: 0.62;\n    margin: 0;\n    max-width: 100%;\n  }\n  .sf-hero-scroll-indicator {\n    display: flex;\n    align-items: center;\n    gap: 14px;\n    font-family: var(--f-mono);\n    font-size: var(--fs-mono-sm);\n    letter-spacing: 0.18em;\n    color: var(--c-text-dark);\n    opacity: 0.55;\n    text-transform: uppercase;\n  }\n  .sf-hero-scroll-line {\n    display: block;\n    width: 64px;\n    height: 1px;\n    background: currentColor;\n    position: relative;\n    overflow: hidden;\n  }\n  .sf-hero-scroll-line::after {\n    content: '';\n    position: absolute;\n    top: 0; left: -100%;\n    width: 30%; height: 100%;\n    background: var(--c-text-dark);\n    animation: sf-scroll-pulse 2s ease-in-out infinite;\n  }\n  @keyframes sf-scroll-pulse {\n    0%   { left: -30%; }\n    100% { left: 100%; }\n  }\n\n  \/* \u2500\u2500 TRANSITION wrap (bande trust + marquee logos) mobile \u2500\u2500\u2500\u2500 *\/\n  .sf-transition-wrap > div[style*=\"height:80px\"] { height: 40px !important; }\n  .sf-transition-wrap > div[style*=\"height:32px\"] { height: 16px !important; }\n  .sf-trust-band { padding: 16px 16px; }\n  .sf-trust-band-label {\n    font-size: var(--fs-mono-sm);\n    letter-spacing: 0.12em;\n    text-align: center;\n    line-height: 1.4;\n  }\n\n  .sf-logos { padding: 14px 0; }\n  .sf-logos-track { gap: 20px; }\n  .sf-logos-item { height: 48px; min-width: 76px; }\n  .sf-logos-item img { max-width: 110px; }\n\n  \/* \u2500\u2500 IMMERSION mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-immersion { padding: 64px 16px; overflow: visible; }\n\n  \/* MANIFESTE mobile *\/\n  .sf-manifeste {\n    padding: 72px 22px;\n    min-height: 70vh;\n  }\n  .sf-manifeste-eyebrow { margin-bottom: 24px; font-size: var(--fs-mono-sm); }\n  .sf-manifeste-headline {\n    line-height: 1.22;\n    letter-spacing: -0.012em;\n  }\n  .sf-manifeste-accent { font-size: 1.05em; }\n  .sf-manifeste-link { margin-top: 32px; font-size: var(--fs-mono); }\n\n  .sf-immersion-grid { grid-template-columns: 1fr; gap: 28px; align-items: stretch; }\n  .sf-immersion-content { gap: 24px; }\n  .sf-immersion-title {\n    line-height: 0.92;\n    letter-spacing: -0.04em;\n  }\n  .sf-immersion-text { max-width: 100%; gap: 14px; }\n  .sf-immersion-p { font-size: var(--fs-body); line-height: 1.6; }\n  .sf-immersion-caption { display: none; }\n  \/* Image en mobile : touche le bord GAUCHE de l'\u00e9cran (bleed), marge \u00e0 droite *\/\n  .sf-immersion-media-col { gap: 14px; }\n  .sf-immersion-media {\n    width: calc(100% + 16px);\n    margin-left: -16px;\n    transform: none;\n    aspect-ratio: 16 \/ 11;\n    -webkit-mask-image: none;\n            mask-image: none;\n  }\n  .sf-immersion-media img {\n    object-fit: cover;\n    object-position: center center;\n  }\n\n  \/* \u2500\u2500 EXPERTISE mobile : on quitte l'overlay immersif \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     L'image et le texte s'empilent proprement (overlay = illisible sur petit \u00e9cran) *\/\n  .sf-cap { padding: 60px 16px; }\n  .sf-cap-intro { grid-template-columns: 1fr; column-gap: 0; row-gap: 18px; margin-bottom: 36px; }\n  .sf-cap-eyebrow { grid-column: 1; }\n  .sf-cap-lead { grid-column: 1; }\n  .sf-cap-support { grid-column: 1; grid-row: auto; max-width: 100%; }\n  .sf-cap-divider { margin-bottom: 32px; }\n\n  \/* La grille redevient un flux vertical : image PUIS texte *\/\n  .sf-cap-grid {\n    display: block;\n    width: calc(100% + 32px);\n    margin-left: -16px;\n    margin-right: -16px;\n    height: auto;\n    overflow: visible;\n    background: transparent;\n  }\n\n  \/* Image : bloc en haut, hauteur raisonnable, plus en absolute *\/\n  .sf-cap-stage {\n    position: relative;\n    inset: auto;\n    width: 100%;\n    height: clamp(280px, 56vw, 420px);\n  }\n  .sf-cap-image { position: absolute; inset: 0; }\n  \/* Voile plus l\u00e9ger : le texte n'est plus dessus, juste un fond pour le compteur *\/\n  .sf-cap-stage::after {\n    background: linear-gradient(to top, rgba(15,15,15,0.35) 0%, rgba(15,15,15,0) 45%);\n  }\n  .sf-cap-counter { top: auto; bottom: 4%; right: 5%; opacity: 0.18; }\n\n  \/* Panneau texte : en flux SOUS l'image, sur fond clair de section *\/\n  .sf-cap-panel {\n    position: static;\n    left: auto; right: auto; bottom: auto;\n    padding: 28px 16px 0;\n  }\n  .sf-cap-title-col {\n    margin-bottom: 4px;\n    padding-bottom: 16px;\n    border-bottom-color: rgba(0,0,0,0.15);\n  }\n  .sf-cap-title { font-size: var(--fs-mono); color: var(--c-text-light); }\n  .sf-cap-title-total { display: none; }\n\n  \/* Liste verticale, texte sombre lisible sur fond clair *\/\n  .sf-cap-list { flex-direction: column; gap: 0; }\n  .sf-cap-line {\n    margin-right: 0;\n    padding: 16px 0;\n    width: 100%;\n    border-bottom: 1px solid rgba(0,0,0,0.12);\n  }\n  .sf-cap-line-name {\n    color: var(--c-text-muted-light);\n    text-shadow: none;\n  }\n  .sf-cap-line.is-active .sf-cap-line-name { color: var(--c-text-light); }\n  .sf-cap-line-num { font-size: var(--fs-mono-sm); color: var(--c-text-muted-light); }\n  .sf-cap-line.is-active .sf-cap-line-num { color: var(--c-text-light); }\n  .sf-cap-line::after { width: 100%; bottom: -1px; }\n\n  \/* CTA : bouton sombre pleine largeur sous la liste *\/\n  .sf-cap-cta {\n    position: static;\n    margin-top: 24px;\n    margin-bottom: 0;\n    justify-content: center;\n    width: 100%;\n    color: var(--c-text-light);\n    border: 1px solid rgba(0,0,0,0.4);\n    padding: 15px 22px;\n  }\n  .sf-cap-cta:hover { background: var(--c-text-light); color: var(--c-bg-light); border-color: var(--c-text-light); }\n\n  \/* \u2500\u2500 CARNET mobile : bento simplifi\u00e9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-projects { padding: 60px 16px 80px; }\n  .sf-projects-header {\n    grid-template-columns: 1fr;\n    margin-bottom: 32px;\n    gap: 12px;\n    padding-top: 28px;\n  }\n  .sf-projects-title { text-align: left; }\n  \/* 2 colonnes : hero et side pleine largeur, tiers en demi *\/\n  \/* 1 colonne sur mobile : chaque projet pleine largeur, aucun trou possible *\/\n  .sf-projects-grid { grid-template-columns: 1fr; gap: 12px; }\n  .sf-projects-item.is-hero,\n  .sf-projects-item.is-side,\n  .sf-projects-item.is-third { grid-column: 1 \/ -1; aspect-ratio: 16 \/ 11; }\n  .sf-projects-callout { grid-column: 1 \/ -1; }\n  \/* Overlay toujours visible au tap (pas de hover) *\/\n  .sf-projects-arrow { display: none; }\n  .sf-projects-name-line { transform: scaleX(1); }\n  .sf-projects-outro { margin-top: 40px; }\n  .sf-projects-cta { padding: 14px 22px; font-size: var(--fs-mono-sm); }\n\n  .sf-local {\n    padding: 56px 16px 76px;\n  }\n  .sf-local-inner {\n    grid-template-columns: 1fr;\n    gap: 28px;\n    padding-top: 36px;\n  }\n  .sf-local-title {\n    max-width: 100%;\n  }\n  .sf-local-copy {\n    gap: 18px;\n  }\n  .sf-local-copy p {\n    font-size: var(--fs-body);\n    line-height: 1.6;\n  }\n  .sf-local-grid {\n    grid-template-columns: 1fr;\n    margin-top: 16px;\n  }\n  .sf-local-item {\n    min-height: 0;\n    padding: 22px 0;\n  }\n  .sf-rennes-terrain {\n    grid-template-columns: 1fr;\n    margin-top: 34px;\n  }\n  .sf-rennes-terrain-item {\n    min-height: 170px;\n  }\n  .sf-rennes-terrain-title {\n    font-size: clamp(28px, 11vw, 44px);\n  }\n  .sf-local-faq {\n    margin-top: 42px;\n  }\n  .sf-local-faq-row {\n    grid-template-columns: 1fr;\n    gap: 12px;\n    padding: 22px 0;\n  }\n\n  \/* \u2500\u2500 MENU OVERLAY mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-menu-tiles { grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(8, 1fr); }\n  .sf-menu-nav {\n    bottom: 14vh;\n    right: 6vw;\n    gap: 4px;\n  }\n  .sf-menu-link {\n    font-size: clamp(40px, 13vw, 64px);\n    letter-spacing: -0.03em;\n  }\n  .sf-menu-aside {\n    position: absolute;\n    left: 6vw;\n    bottom: 5vh;\n    font-size: var(--fs-mono);\n    line-height: 1.7;\n  }\n\n  \/* \u2500\u2500 REVEAL ajustements mobile (animations plus rapides) \u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-reveal {\n    transform: translateY(36px);\n    transition: opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1), transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);\n  }\n\n  \/* \u2500\u2500 DUAL-CTA mobile : composition \u00e9ditoriale empil\u00e9e \u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .sf-dualcta,\n  .sf-dualcta-stage {\n    height: auto;\n    min-height: 0;\n  }\n\n  .sf-dualcta {\n    padding: 68px 0 64px;\n    overflow: hidden;\n  }\n\n  .sf-dualcta-stage {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr);\n    grid-template-areas:\n      \"conceive\"\n      \"plan\"\n      \"explore\"\n      \"render\";\n    row-gap: 32px;\n    padding: 0 16px;\n    overflow: visible;\n  }\n\n  .sf-dualcta-content {\n    display: contents;\n  }\n\n  .sf-dualcta-col {\n    position: relative;\n    z-index: 4;\n    inset: auto;\n    width: 100%;\n    min-width: 0;\n    max-width: 100%;\n  }\n\n  .sf-dualcta-col--conceive {\n    grid-area: conceive;\n    padding-right: 62px;\n  }\n\n  .sf-dualcta-col--explore {\n    grid-area: explore;\n    padding-left: 16px;\n  }\n\n  .sf-dualcta-visual {\n    position: relative;\n    inset: auto;\n    width: auto;\n  }\n\n  .sf-dualcta-visual--render {\n    grid-area: render;\n    width: calc(100% + 28vw);\n    margin-left: 2vw;\n    margin-right: -30vw;\n  }\n\n  .sf-dualcta-visual--plan {\n    grid-area: plan;\n    width: calc(100% + 24vw);\n    margin-left: -29vw;\n    margin-right: 5vw;\n    margin-top: -4px;\n  }\n\n  .sf-dualcta-gimmick--right {\n    top: 58px;\n    right: 14px;\n    width: 66px;\n  }\n\n  .sf-dualcta-gimmick--left {\n    top: 53%;\n    left: -16px;\n    bottom: auto;\n    width: 80px;\n  }\n\n  .sf-dualcta-headline {\n    margin-bottom: 14px;\n  }\n\n  .sf-dualcta-eyebrow {\n    font-size: clamp(30px, 9vw, 44px);\n    margin-bottom: -0.1em;\n  }\n\n  .sf-dualcta-title {\n    font-size: clamp(39px, 11.8vw, 58px);\n    line-height: 0.86;\n  }\n\n  .sf-dualcta-desc {\n    max-width: 34ch;\n    margin-bottom: 20px;\n    font-size: 14px;\n    line-height: 1.5;\n    color: rgba(36,36,36,0.58);\n  }\n\n  .sf-dualcta-btn {\n    font-size: 9px;\n    letter-spacing: 0.14em;\n  }\n\n  .sf-dualcta-btn svg {\n    width: 14px;\n    height: 14px;\n  }\n\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   RESPONSIVE \u2014 TR\u00c8S PETIT MOBILE (\u2264 480px)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media (max-width: 480px) {\n  .sf-header { padding: 0 12px; height: 46px; }\n  .sf-logo { font-size: var(--fs-mono-sm); }\n  .sf-menu-btn { padding: 7px 12px; font-size: var(--fs-mono-sm); }\n  .sf-lang-flag { width: 16px; height: 12px; }\n\n  .sf-hero { padding: 32px 14px 24px; min-height: 60svh; gap: 28px; }\n  .sf-hero-title { padding: 64px 0 0; }\n  .sf-hero-tagline { font-size: var(--fs-mono); }\n  .sf-hero-scroll-indicator { font-size: var(--fs-mono-sm); }\n\n  .sf-cta-btn { padding: 10px 18px; font-size: var(--fs-mono-sm); }\n  .sf-cta-link { font-size: var(--fs-mono-sm); }\n\n  .sf-trust-band { padding: 14px 14px; }\n  .sf-trust-band-label {\n    font-size: var(--fs-mono-sm);\n    letter-spacing: 0.1em;\n  }\n\n  .sf-logos { padding: 12px 0; }\n  .sf-logos-track { gap: 16px; }\n  .sf-logos-item { height: 40px; min-width: 64px; }\n  .sf-logos-item img { max-width: 92px; }\n\n  .sf-immersion { padding: 52px 14px; }\n  .sf-immersion-media { width: calc(100% + 14px); margin-left: -14px; }\n  .sf-immersion-grid { gap: 24px; }\n  .sf-immersion-content { gap: 20px; }\n  .sf-immersion-p { font-size: var(--fs-body); line-height: 1.6; }\n\n  .sf-cap { padding: 50px 14px; }\n  .sf-cap-support { font-size: var(--fs-body-lg); }\n  .sf-cap-line { padding: 18px 0 16px; }\n  .sf-cap-line-num { font-size: var(--fs-mono-sm); }\n  .sf-cap-cta { font-size: var(--fs-mono-sm); }\n\n  .sf-menu-link { font-size: clamp(34px, 14vw, 56px); }\n  .sf-menu-aside { font-size: var(--fs-mono-sm); }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   UTILS : visibilit\u00e9 conditionnelle desktop \/ mobile\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.sf-mobile-only { display: none; }\n.sf-desktop-only { display: block; }\n@media (max-width: 768px) {\n  .sf-mobile-only { display: block; }\n  .sf-desktop-only { display: none !important; }\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   2. SECTION SCULPTER L'ESPACE \u2014 R\u00c9V\u00c9LATION CIN\u00c9MATIQUE AU SCROLL\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   La vid\u00e9o joue en autoplay loop (fluide 100%). Le scroll pilote :\n   \u2022 un clip-path qui s'ouvre (la vid\u00e9o se \"d\u00e9voile\")\n   \u2022 un l\u00e9ger scale\/parallaxe (profondeur)\n   \u2022 la r\u00e9v\u00e9lation du texte \u00e9ditorial\n   Aucun scrub de currentTime \u2192 aucune saccade possible.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n.sfsv {\n  --sfsv-veil: 0.42;          \/* R\u00c9GLAGE : intensit\u00e9 du voile sombre 0 \u2192 1 *\/\n  --sfsv-lime: #D5FF00;\n  --sfsv-bg:   #242424;\n  --sfsv-text: #F4F4F4;\n  position: relative;\n  width: 100%;\n  background: var(--sfsv-bg);\n  z-index: 2;\n  height: 250vh;             \/* R\u00c9GLAGE : dur\u00e9e du pin (inject\u00e9 en JS) *\/\n}\n\n.sfsv-pin {\n  position: relative;\n  top: 0;\n  width: 100%;\n  height: 100vh;\n  overflow: hidden;\n  background: var(--sfsv-bg);\n}\n\n\/* Cadre qui porte le clip-path (s'ouvre au scroll) *\/\n.sfsv-frame {\n  position: absolute;\n  inset: 0;\n  z-index: 1;\n  overflow: hidden;\n  \/* Image pleine par d\u00e9faut (plus de r\u00e9v\u00e9lation clip-path) *\/\n  clip-path: inset(0 0 0 0);\n  -webkit-clip-path: inset(0 0 0 0);\n}\n\n.sfsv-video {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  object-position: center;\n  background: var(--sfsv-bg);\n  pointer-events: none;\n  \/* Scale pilot\u00e9 au scroll (parallaxe douce) *\/\n  transform: scale(var(--sfsv-scale, 1.12));\n  will-change: transform;\n}\n\n.sfsv-veil {\n  position: absolute;\n  inset: 0;\n  z-index: 2;\n  pointer-events: none;\n  background:\n    linear-gradient(180deg,\n      rgba(0,0,0,0.50) 0%,\n      rgba(0,0,0,0.12) 30%,\n      rgba(0,0,0,0.22) 68%,\n      rgba(0,0,0,0.70) 100%);\n  opacity: var(--sfsv-veil);\n}\n\n.sfsv-content {\n  position: absolute;\n  inset: 0;\n  z-index: 3;\n  padding: 13vh 5vw 8vh 5vw;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  pointer-events: none;\n  color: var(--sfsv-text);\n}\n.sfsv-content a { pointer-events: auto; }\n\n.sfsv-top {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-start;\n  gap: 4vw;\n}\n\n.sfsv-label {\n  font-family: var(--f-mono, 'JetBrains Mono', monospace);\n  font-size: var(--fs-mono-sm, 12px);\n  font-weight: 500;\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  color: var(--sfsv-lime);\n  margin: 0 0 18px 0;\n}\n\n.sfsv-title {\n  font-family: var(--f-display, 'Inter', sans-serif);\n  font-weight: 900;\n  font-size: var(--fs-display, clamp(48px, 9vw, 132px));\n  line-height: 0.92;\n  letter-spacing: -0.04em;\n  text-transform: uppercase;\n  color: var(--sfsv-text);\n  margin: 0;\n}\n.sfsv-title .sfsv-line { display: block; overflow: hidden; }\n.sfsv-title .sfsv-line > span { display: inline-block; will-change: transform; }\n\n.sfsv-cta-btn {\n  display: inline-flex;\n  align-items: center;\n  gap: 14px;\n  padding: 14px 26px;\n  margin-top: 16px;\n  font-family: var(--f-mono, 'JetBrains Mono', monospace);\n  font-size: var(--fs-mono, 13px);\n  font-weight: 500;\n  letter-spacing: 0.12em;\n  text-transform: uppercase;\n  color: #000;\n  text-decoration: none;\n  border: 1px solid var(--sfsv-lime);\n  background: var(--sfsv-lime);\n  white-space: nowrap;\n  transition: background .3s ease, color .3s ease, border-color .3s ease;\n}\n.sfsv-cta-btn:hover { background: transparent; color: var(--sfsv-lime); border-color: var(--sfsv-lime); }\n.sfsv-cta-btn .sfsv-arrow { transition: transform .3s ease; }\n.sfsv-cta-btn:hover .sfsv-arrow { transform: translateX(6px); }\n\n.sfsv-bottom { max-width: 420px; }\n.sfsv-p {\n  font-size: var(--fs-body, 16px);\n  line-height: 1.55;\n  color: var(--sfsv-text);\n  margin: 0 0 16px 0;\n  opacity: 0.92;\n}\n.sfsv-p:last-of-type { margin-bottom: 0; }\n\n.sfsv-cta-link {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  margin-top: 26px;\n  font-family: var(--f-mono, 'JetBrains Mono', monospace);\n  font-size: var(--fs-mono-sm, 12px);\n  font-weight: 500;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  color: var(--sfsv-text);\n  text-decoration: none;\n  padding-bottom: 4px;\n  border-bottom: 1px solid currentColor;\n  transition: opacity .3s ease;\n}\n.sfsv-cta-link:hover { opacity: 0.65; }\n.sfsv-cta-link .sfsv-arrow { transition: transform .3s ease; }\n.sfsv-cta-link:hover .sfsv-arrow { transform: translateX(6px); }\n\n\/* Reveal initial du texte (avant entr\u00e9e en scroll) *\/\n.sfsv-reveal { opacity: 0; transform: translateY(26px); }\n.sfsv-line > span { transform: translateY(110%); }\n\n\/* Barre de progression du scrub *\/\n.sfsv-progress {\n  position: absolute;\n  left: 5vw; right: 5vw; bottom: 4vh;\n  z-index: 4; height: 2px;\n  background: rgba(255,255,255,0.18);\n  pointer-events: none;\n}\n.sfsv-progress-bar {\n  position: absolute; left: 0; top: 0; bottom: 0;\n  width: 0%; background: var(--sfsv-lime);\n  will-change: width;\n}\n\n\/* Indice \"scrollez pour avancer\" *\/\n.sfsv-hint {\n  position: absolute;\n  left: 50%; bottom: 7vh;\n  transform: translateX(-50%);\n  z-index: 4;\n  display: flex; flex-direction: column; align-items: center; gap: 8px;\n  font-family: var(--f-mono, 'JetBrains Mono', monospace);\n  font-size: var(--fs-mono-sm, 11px);\n  letter-spacing: 0.2em; text-transform: uppercase;\n  color: rgba(244,244,244,0.7);\n  pointer-events: none;\n}\n.sfsv-hint-arrow { animation: sfsv-bob 1.8s ease-in-out infinite; font-size: 14px; }\n@keyframes sfsv-bob { 0%,100% { transform: translateY(0); opacity: .6; } 50% { transform: translateY(6px); opacity: 1; } }\n\n\/* TABLETTE *\/\n@media (max-width: 1024px) {\n  .sfsv-content { padding: 12vh 6vw 7vh 6vw; }\n  .sfsv-top { flex-direction: column; align-items: flex-start; gap: 24px; }\n  .sfsv-bottom { max-width: 100%; }\n}\n\n\/* MOBILE : pas de pin, vid\u00e9o plein \u00e9cran, contenu centr\u00e9 *\/\n@media (max-width: 768px) {\n  .sfsv { height: auto !important; }\n  \/* \u2500\u2500 SCULPTER MOBILE D\u00c9DI\u00c9 (.sf-sculpter-m) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Vid\u00e9o plein \u00e9cran + veil + contenu vertical centr\u00e9.\n     Plus de clip-path diagonal (illisible mobile), plus de pin.\n     Effet \"qui remonte sur la hero\" via margin-top n\u00e9gatif + border-radius top. *\/\n  .sf-sculpter-m {\n    position: relative;\n    width: 100%;\n    height: 100vh;\n    min-height: 100vh;\n    overflow: hidden;\n    background: #000;\n    color: #fff;\n    margin-top: -36px;\n    border-top-left-radius: 28px;\n    border-top-right-radius: 28px;\n    z-index: 3;\n  }\n  .sf-sculpter-m-video {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    z-index: 1;\n    border-top-left-radius: inherit;\n    border-top-right-radius: inherit;\n  }\n  .sf-sculpter-m-veil {\n    position: absolute;\n    inset: 0;\n    background: linear-gradient(180deg,\n      rgba(0,0,0,0.55) 0%,\n      rgba(0,0,0,0.45) 35%,\n      rgba(0,0,0,0.75) 100%);\n    z-index: 2;\n    border-top-left-radius: inherit;\n    border-top-right-radius: inherit;\n  }\n  .sf-sculpter-m-content {\n    position: relative;\n    z-index: 3;\n    height: 100%;\n    padding: 90px 20px 36px;\n    display: flex;\n    flex-direction: column;\n    justify-content: flex-end;\n    gap: 24px;\n  }\n  .sf-sculpter-m-label {\n    display: inline-block;\n    font-family: var(--f-mono);\n    font-size: var(--fs-mono-sm);\n    font-weight: 500;\n    letter-spacing: 0.18em;\n    color: #fff;\n    opacity: 0.7;\n    text-transform: uppercase;\n    align-self: flex-start;\n  }\n  .sf-sculpter-m-title {\n    font-family: var(--f-display);\n    font-weight: 900;\n    line-height: 0.92;\n    letter-spacing: -0.05em;\n    color: #fff;\n    margin: 0;\n    text-transform: uppercase;\n  }\n  .sf-sculpter-m-title .sf-reveal-line {\n    display: block;\n    overflow: hidden;\n  }\n  .sf-sculpter-m-title .sf-reveal-line > span {\n    display: block;\n    white-space: nowrap;\n  }\n  .sf-sculpter-m-p {\n    font-family: var(--f-display);\n    font-size: var(--fs-body);\n    line-height: 1.55;\n    color: #fff;\n    opacity: 0.88;\n    margin: 0;\n    max-width: 100%;\n  }\n  .sf-sculpter-m-cta {\n    align-self: flex-start;\n    display: inline-flex;\n    align-items: center;\n    gap: 10px;\n    background: transparent;\n    border: 1px solid rgba(255,255,255,0.7);\n    padding: 13px 22px;\n    font-family: var(--f-mono);\n    font-size: var(--fs-mono-sm);\n    font-weight: 500;\n    letter-spacing: 0.14em;\n    color: #fff;\n    text-decoration: none;\n    text-transform: uppercase;\n    transition: background 0.3s ease, color 0.3s ease, border-color 0.3s ease;\n    margin-top: 4px;\n  }\n  .sf-sculpter-m-cta:active {\n    background: #D5FF00;\n    color: #000;\n    border-color: #D5FF00;\n  }\n\n  .sfsv-pin { position: relative; height: 100svh; }\n  .sfsv-frame { clip-path: none !important; -webkit-clip-path: none !important; }\n  .sfsv-video { transform: none !important; }\n  .sfsv-content { justify-content: center; align-items: flex-start; gap: 22px; padding: 0 7vw; }\n  .sfsv-top { flex-direction: column; }\n  .sfsv-progress, .sfsv-hint { display: none; }\n}\n\n\/* REDUCED-MOTION : poster fig\u00e9, pas d'anim *\/\n@media (prefers-reduced-motion: reduce) {\n  .sfsv { height: auto !important; }\n  .sfsv-pin { position: relative; height: 100svh; }\n  .sfsv-frame { clip-path: none !important; -webkit-clip-path: none !important; }\n  .sfsv-video { transform: none !important; }\n  .sfsv-content { justify-content: center; gap: 22px; }\n  .sfsv-reveal { opacity: 1; transform: none; }\n  .sfsv-line > span { transform: none; }\n  .sfsv-progress, .sfsv-hint { display: none; }\n}\n\n\n<\/style>\n<\/head>\n<body>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     CURSEUR CUSTOM (lignes h+v traversantes + 4 markers de targeting)\n     Cherry-picked Dialect-style : guide visuel permanent + \u00e9tat hover\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"sf-cursor\" aria-hidden=\"true\">\n  <div class=\"sf-cursor-h\"><\/div>\n  <div class=\"sf-cursor-v\"><\/div>\n  <div class=\"sf-cursor-marker sf-cursor-marker--tl\"><\/div>\n  <div class=\"sf-cursor-marker sf-cursor-marker--tr\"><\/div>\n  <div class=\"sf-cursor-marker sf-cursor-marker--bl\"><\/div>\n  <div class=\"sf-cursor-marker sf-cursor-marker--br\"><\/div>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     SVG DEFS \u2014 Filter \"bitmap reveal\" (pixelated glyph \u2192 vector text)\n     Combine feGaussianBlur (flou) + feColorMatrix (seuil 1-bit alpha)\n     pour cr\u00e9er un effet pixel art quand stdDeviation est \u00e9lev\u00e9.\n     Animation : stdDeviation 14 \u2192 0 sur 1.6s = effet bitmap-to-vector.\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<svg class=\"sf-svg-defs\" aria-hidden=\"true\" focusable=\"false\"\n     style=\"position:absolute;width:0;height:0;overflow:hidden;pointer-events:none\">\n  <defs>\n    <filter id=\"sf-bitmap-reveal\"\n            color-interpolation-filters=\"sRGB\"\n            x=\"-10%\" y=\"-10%\" width=\"120%\" height=\"120%\">\n      <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"0\" \/>\n      <feColorMatrix mode=\"matrix\"\n        values=\"1 0 0 0 0\n                0 1 0 0 0\n                0 0 1 0 0\n                0 0 0 28 -13\" \/>\n    <\/filter>\n    <!-- Filters d\u00e9di\u00e9s au menu overlay (un par lien pour stagger animation) -->\n    <filter id=\"sf-bitmap-menu-1\" color-interpolation-filters=\"sRGB\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n      <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"22\" \/>\n      <feColorMatrix mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 28 -13\" \/>\n    <\/filter>\n    <filter id=\"sf-bitmap-menu-2\" color-interpolation-filters=\"sRGB\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n      <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"22\" \/>\n      <feColorMatrix mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 28 -13\" \/>\n    <\/filter>\n    <filter id=\"sf-bitmap-menu-3\" color-interpolation-filters=\"sRGB\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n      <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"22\" \/>\n      <feColorMatrix mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 28 -13\" \/>\n    <\/filter>\n    <filter id=\"sf-bitmap-menu-4\" color-interpolation-filters=\"sRGB\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n      <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"22\" \/>\n      <feColorMatrix mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 28 -13\" \/>\n    <\/filter>\n    <filter id=\"sf-bitmap-menu-5\" color-interpolation-filters=\"sRGB\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n      <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"22\" \/>\n      <feColorMatrix mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 28 -13\" \/>\n    <\/filter>\n  <\/defs>\n<\/svg>\n\n<!-- LOADER -->\n<div class=\"sf-loader\" aria-hidden=\"true\">\n  <div class=\"sf-loader-inner\">\n    <span>[ LOADING<\/span>\n    <span class=\"sf-loader-pct\">000<\/span>\n    <span>% ]<\/span>\n  <\/div>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     OVERLAY MENU (bitmap reveal au clic sur [MENU])\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"sf-menu-overlay\" id=\"sf-menu-overlay\" aria-hidden=\"true\">\n  <!-- Grille de tiles noires : \"rideau pixelis\u00e9\" qui mange la page -->\n  <div class=\"sf-menu-tiles\" id=\"sf-menu-tiles\" aria-hidden=\"true\"><\/div>\n\n  <nav class=\"sf-menu-nav\" aria-label=\"Navigation principale\">\n    <a href=\"https:\/\/scenographie-rennes.fr\/\" class=\"sf-menu-link sf-menu-link--1 sf-target\" data-key=\"menuHome\">Accueil<\/a>\n    <a href=\"https:\/\/scenographie-france.fr\/agence-scenographie-evenementielle\/\" class=\"sf-menu-link sf-menu-link--2 sf-target\" data-key=\"menuStudio\" target=\"_blank\" rel=\"noopener\">Le Studio<\/a>\n    <a href=\"https:\/\/scenographie-france.fr\/manifeste\/\" class=\"sf-menu-link sf-menu-link--3 sf-target\" data-key=\"menuManifeste\" target=\"_blank\" rel=\"noopener\">Manifeste<\/a>\n    <a href=\"https:\/\/scenographie-france.fr\/projets\/\" class=\"sf-menu-link sf-menu-link--4 sf-target\" data-key=\"menuProjets\" target=\"_blank\" rel=\"noopener\">Projets<\/a>\n    <a href=\"https:\/\/scenographie-france.fr\/contact-agence-scenographie\/\" class=\"sf-menu-link sf-menu-link--5 sf-target\" data-key=\"menuContact\" target=\"_blank\" rel=\"noopener\">Contact<\/a>\n  <\/nav>\n\n  <div class=\"sf-menu-aside\">\n    <span class=\"sf-menu-aside-label\">[ TROUVEZ-NOUS ]<\/span>\n    <address class=\"sf-menu-aside-content\">\n      RENNES \u2014 BRETAGNE<br>\n      <a href=\"tel:+33299663660\" class=\"sf-target\">+33 2 99 66 36 60<\/a><br>\n      <a href=\"mailto:hello@scenographie-france.fr\" class=\"sf-target\">hello@scenographie-france.fr<\/a>\n    <\/address>\n  <\/div>\n<\/div>\n\n<div id=\"sf-wrapper\">\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       1. HERO \u2014 pin 200%\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"sf-hero-wrap\">\n    <section class=\"sf-hero sf-hero-grid\" data-section-color=\"dark\">\n\n      <!-- Crosshairs -->\n      <div class=\"sf-hero-cross sf-hero-cross--l\" aria-hidden=\"true\"><\/div>\n      <div class=\"sf-hero-cross sf-hero-cross--r\" aria-hidden=\"true\"><\/div>\n\n      <!-- Titre \u00e9norme avec lignes splitt\u00e9es pour reveal -->\n      <h1 class=\"sf-hero-title\" id=\"sf-hero-title\">\n        <span class=\"sf-hero-line sf-reveal-line\"><span data-key=\"hero1\">SC\u00c9NOGRAPHIE<\/span><\/span>\n        <span class=\"sf-hero-line sf-reveal-line\" data-reveal-delay=\"120\"><span data-key=\"hero2\">RENNES<\/span><\/span>\n      <\/h1>\n\n      <!-- Bloc mobile-only : tagline \u00e9ditoriale + indicateur de scroll -->\n      <div class=\"sf-hero-mobile-extra sf-mobile-only\" aria-hidden=\"true\">\n        <p class=\"sf-hero-tagline sf-reveal\" data-reveal-delay=\"400\" data-key=\"heroDesc\">\n          Sc\u00e9nographie \u00e0 Rennes et en Bretagne \u2014 conception de stands, d\u00e9cors \u00e9v\u00e9nementiels, pop-up stores, expositions et espaces de marque.\n        <\/p>\n        <div class=\"sf-hero-scroll-indicator sf-reveal\" data-reveal-delay=\"700\">\n          <span class=\"sf-hero-scroll-label\">SCROLL<\/span>\n          <span class=\"sf-hero-scroll-line\"><\/span>\n        <\/div>\n      <\/div>\n\n\n    <\/section>\n  <\/div>\n\n\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       2. SECTION SCULPTER L'ESPACE \u2014 R\u00c9V\u00c9LATION CIN\u00c9MATIQUE\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sfsv sf-desktop-only\" data-pin-vh=\"250\" data-section-color=\"dark\" aria-label=\"Sculpter l'espace\">\n    <!-- R\u00c9GLAGE data-pin-vh : dur\u00e9e du pin en vh (250 = la section reste\n         bloqu\u00e9e pendant ~1,5 \u00e9cran de scroll le temps que la vid\u00e9o d\u00e9file).\n         Plus c'est grand, plus le scrub est lent et fluide. -->\n    <div class=\"sfsv-pin\">\n\n      <!-- Cadre : porte le clip-path qui s'ouvre au scroll -->\n      <div class=\"sfsv-frame\">\n        <!-- \u26a0\ufe0f VID\u00c9O : pilot\u00e9e par le scroll (pas d'autoplay sur desktop).\n             muted + playsinline obligatoires. poster = 1\u00e8re image + fallback. -->\n        <video class=\"sfsv-video\"\n               id=\"sfsv-video\"\n               muted playsinline\n               preload=\"auto\"\n          <source src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/06\/Task-100900678-1-1-1.mp4\" type=\"video\/mp4\">\n        <\/video>\n      <\/div>\n\n      <div class=\"sfsv-veil\" aria-hidden=\"true\"><\/div>\n\n      <!-- \u2500\u2500 CONTENU \u00c9DITORIAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n      <div class=\"sfsv-content\">\n\n        <div class=\"sfsv-top\">\n          <div>\n            <p class=\"sfsv-label sfsv-reveal\">[ DU BRIEF AU MONTAGE ]<\/p>\n            <h2 class=\"sfsv-title\">\n              <span class=\"sfsv-line\"><span>CONCEVOIR<\/span><\/span>\n              <span class=\"sfsv-line\"><span>SUR SITE<\/span><\/span>\n            <\/h2>\n          <\/div>\n\n          <a href=\"https:\/\/scenographie-france.fr\/projets\/\" class=\"sfsv-cta-btn sf-target sfsv-reveal\" target=\"_blank\" rel=\"noopener\">\n            TOUS LES PROJETS\n            <span class=\"sfsv-arrow\">\u27f6<\/span>\n          <\/a>\n        <\/div>\n\n        <div class=\"sfsv-bottom\">\n          <p class=\"sfsv-p sfsv-reveal\">\n            Nous concevons chaque projet en tenant compte du lieu d\u00e8s le d\u00e9part : acc\u00e8s, temps de montage, circulation du public, s\u00e9curit\u00e9, d\u00e9montage et niveau de finition attendu.\n          <\/p>\n          <a href=\"https:\/\/scenographie-france.fr\/projets\/\" class=\"sfsv-cta-link sf-target sfsv-reveal\" target=\"_blank\" rel=\"noopener\">\n            TOUS LES PROJETS\n            <span class=\"sfsv-arrow\">\u27f6<\/span>\n          <\/a>\n        <\/div>\n\n      <\/div>\n\n      <!-- Barre de progression du scrub (optionnelle) -->\n      <div class=\"sfsv-progress\" aria-hidden=\"true\">\n        <div class=\"sfsv-progress-bar\" id=\"sfsv-bar\"><\/div>\n      <\/div>\n\n      <!-- Indice \"scrollez pour avancer\" (optionnel) -->\n      <div class=\"sfsv-hint\" aria-hidden=\"true\">\n        <span>SCROLLEZ POUR D\u00c9COUVRIR<\/span>\n        <span class=\"sfsv-hint-arrow\">\u2193<\/span>\n      <\/div>\n\n    <\/div>\n  <\/section>\n\n  <!-- \u2550\u2550\u2550 VERSION MOBILE ORIGINALE (vid\u00e9o plein \u00e9cran, no pin) \u2550\u2550\u2550 -->\n  <section class=\"sf-sculpter-m sf-mobile-only\" data-section-color=\"dark\">\n\n    <!-- Vid\u00e9o plein \u00e9cran en background -->\n    <video class=\"sf-sculpter-m-video\"\n           autoplay muted loop playsinline preload=\"metadata\"\n           src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/video-sceno-background-mobile-.mp4\"><\/video>\n\n    <!-- Veil sombre par-dessus la vid\u00e9o pour lisibilit\u00e9 du texte -->\n    <div class=\"sf-sculpter-m-veil\" aria-hidden=\"true\"><\/div>\n\n    <!-- Contenu vertical -->\n    <div class=\"sf-sculpter-m-content\">\n      <span class=\"sf-sculpter-m-label sf-reveal\" data-key=\"sculpterMLabel\">[ DU BRIEF AU MONTAGE ]<\/span>\n\n      <h2 class=\"sf-sculpter-m-title\">\n        <span class=\"sf-reveal-line\"><span data-key=\"hl1a\">CONCEVOIR<\/span><\/span>\n        <span class=\"sf-reveal-line\" data-reveal-delay=\"100\"><span data-key=\"hl1b\">SUR SITE<\/span><\/span>\n      <\/h2>\n\n      <p class=\"sf-sculpter-m-p sf-reveal\" data-key=\"sculpterP1\" data-reveal-delay=\"300\">\n        Nous concevons chaque projet en tenant compte du lieu d\u00e8s le d\u00e9part : acc\u00e8s, temps de montage, circulation du public, s\u00e9curit\u00e9, d\u00e9montage et niveau de finition attendu.\n      <\/p>\n\n      <a href=\"https:\/\/scenographie-france.fr\/projets\/\" class=\"sf-sculpter-m-cta sf-target sf-reveal\" data-reveal-delay=\"500\" target=\"_blank\" rel=\"noopener\">\n        <span data-key=\"allProjects\">TOUS LES PROJETS<\/span>\n        <span class=\"sf-cta-btn-arrow\">\u27f6<\/span>\n      <\/a>\n    <\/div>\n  <\/section>\n\n\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       TRANSITION : CARROUSEL LOGOS INFINI\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n  <div class=\"sf-transition-wrap\" style=\"background:#D2D2D2;background-color:#D2D2D2;\">\n\n    <!-- Spacer 80px gris clair AVANT la bande trust -->\n    <div style=\"height:80px;background:#D2D2D2;background-color:#D2D2D2;width:100%;\"><\/div>\n\n    <!-- Bande label avec bordures top+bottom -->\n    <div class=\"sf-trust-band\" aria-hidden=\"true\">\n      <div class=\"sf-trust-band-inner\">\n        <span class=\"sf-trust-band-label sf-reveal\" data-key=\"trustLabel\">[ STANDS \u00b7 \u00c9V\u00c9NEMENTS \u00b7 EXPOSITIONS \u00b7 RETAIL \/ 2011 \u2014 2026 ]<\/span>\n      <\/div>\n    <\/div>\n\n    <!-- Spacer explicite gris clair entre bande trust et marquee -->\n    <div style=\"height:32px;background:#D2D2D2;background-color:#D2D2D2;width:100%;\"><\/div>\n\n    <section class=\"sf-logos\" data-section-color=\"light\" aria-label=\"Clients\" style=\"background:#D2D2D2;background-color:#D2D2D2;\">\n    <div class=\"sf-logos-track\">\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/westfield-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Westfield\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/stade-rennais-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Stade Rennais\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/sojasun-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Sojasun\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/renault-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Renault\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/leclerc-logo-noir-fond-transparent-scenographie-france.png\" alt=\"E.Leclerc\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/les-vieilles-charrues-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Vieilles Charrues\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/mitsubishi-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Mitsubishi\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/maisons-du-monde-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Maisons du Monde\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/groupe-roullier-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Groupe Roullier\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/groupama-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Groupama\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/fiat-logo-noir-fond-transparent-scenographie-france.png\" alt=\"FIAT\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/credit-mutuel-arkea-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Cr\u00e9dit Mutuel Ark\u00e9a\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/bnp-paribas-logo-noir-fond-transparent-scenographie-france.png\" alt=\"BNP Paribas\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/peugeot-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Peugeot\" loading=\"eager\"><\/div>\n      <!-- DUP pour boucle infinie -->\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/westfield-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/stade-rennais-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/sojasun-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/renault-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/leclerc-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/les-vieilles-charrues-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/mitsubishi-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/maisons-du-monde-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/groupe-roullier-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/groupama-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/fiat-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/credit-mutuel-arkea-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/bnp-paribas-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n      <div class=\"sf-logos-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/peugeot-logo-noir-fond-transparent-scenographie-france.png\" alt=\"\" loading=\"eager\"><\/div>\n    <\/div>\n  <\/section>\n  <\/div>\n  <!-- \/sf-transition-wrap -->\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       3. SECTION IMMERSION (2 colonnes : vid\u00e9o+caption \/ titre+texte+CTA)\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sf-immersion\" data-section-color=\"dark\">\n    <div class=\"sf-immersion-grid\">\n\n      <!-- Colonne gauche : image PNG transparente (reveal pixel par pixel) + caption -->\n      <div class=\"sf-immersion-media-col\">\n        <div class=\"sf-immersion-media\" id=\"sf-immersion-media\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/SCENOGRAPHIE-SOTHEBYS-HOME-2-scaled.png\"\n               alt=\"Sc\u00e9nographie Sotheby's \u2014 r\u00e9alisation Sc\u00e9nographie Rennes\"\n               decoding=\"async\">\n        <\/div>\n        <p class=\"sf-immersion-caption sf-reveal\" data-key=\"immersionCaption\" data-reveal-delay=\"200\">\n          Des sc\u00e9nographies con\u00e7ues pour des lieux tr\u00e8s diff\u00e9rents : salons professionnels, centres commerciaux, lancements de produits, expositions, festivals, si\u00e8ges d'entreprise et espaces culturels.\n        <\/p>\n      <\/div>\n\n      <!-- Colonne droite : titre + texte + CTA -->\n      <div class=\"sf-immersion-content\">\n        <h2 class=\"sf-immersion-title\">\n          <span class=\"sf-immersion-title-line sf-reveal-line\"><span data-key=\"immersionTitle\">R\u00c9ALISATION<\/span><\/span>\n        <\/h2>\n\n        <div class=\"sf-immersion-text\">\n          <p class=\"sf-immersion-p sf-reveal\" data-key=\"imm1\" data-reveal-delay=\"200\">\n            Notre travail couvre la direction artistique, les plans, le choix des mat\u00e9riaux, la fabrication, la coordination des prestataires et l'installation sur site.\n          <\/p>\n          <p class=\"sf-immersion-p sf-reveal\" data-key=\"imm2\" data-reveal-delay=\"350\">\n            Pour un stand, un lancement, une exposition ou un d\u00e9cor \u00e9v\u00e9nementiel, nous cherchons le bon \u00e9quilibre entre impact visuel, contraintes techniques, budget et d\u00e9lai.\n          <\/p>\n        <\/div>\n\n        <a href=\"https:\/\/scenographie-france.fr\/projets\/\" class=\"sf-cta-link sf-target sf-reveal\" data-reveal-delay=\"500\" target=\"_blank\" rel=\"noopener\">\n          <span data-key=\"allProjects\">TOUS LES PROJETS<\/span>\n          <span class=\"sf-cta-link-arrow\">\u27f6<\/span>\n        <\/a>\n      <\/div>\n\n    <\/div>\n  <\/section>\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       3. MANIFESTE \u2014 bloc \u00e9ditorial typo Lando-style\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sf-manifeste\" id=\"sf-manifeste\" data-section-color=\"light\">\n\n    <!-- Fond : lignes topographiques tr\u00e8s subtiles fa\u00e7on Lando -->\n    <div class=\"sf-manifeste-bg\" aria-hidden=\"true\">\n      <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1728 800\" preserveAspectRatio=\"xMidYMid slice\">\n        <g fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n          <path d=\"M-50,140 Q380,90 760,170 T1500,150 Q1650,140 1800,180\"\/>\n          <path d=\"M-50,260 Q400,210 820,290 T1560,270 Q1700,260 1800,300\"\/>\n          <path d=\"M-50,420 Q360,370 780,460 T1520,420 Q1660,410 1800,440\"\/>\n          <path d=\"M-50,560 Q420,520 820,610 T1560,570 Q1700,560 1800,590\"\/>\n          <path d=\"M-50,700 Q400,650 800,740 T1540,700 Q1690,690 1800,720\"\/>\n        <\/g>\n      <\/svg>\n    <\/div>\n\n    <div class=\"sf-manifeste-inner\">\n      <div class=\"sf-manifeste-eyebrow\">\n        <span data-key=\"manifesteEyebrow\">[ Signature locale ]<\/span>\n      <\/div>\n\n      <h2 class=\"sf-manifeste-headline\" data-key=\"manifesteHeadline\">\u00c0 Rennes, nous concevons des espaces pour des marques, des institutions et des lieux qui ont besoin d'\u00eatre vus, compris et retenus. Un stand, un d\u00e9cor ou une exposition doit guider un <em class=\"sf-manifeste-accent\">public<\/em>, clarifier un <em class=\"sf-manifeste-accent\">message<\/em> et donner envie de s'arr\u00eater. <span class=\"sf-manifeste-mark\">Sc\u00e9nographie<\/span> Rennes transforme une id\u00e9e en espace pr\u00eat \u00e0 \u00eatre produit.<\/h2>\n\n      <a href=\"https:\/\/scenographie-france.fr\/manifeste\/\" class=\"sf-manifeste-link sf-target\" target=\"_blank\" rel=\"noopener\">\n        <span data-key=\"manifesteLink\">Lire le manifeste complet<\/span>\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n          <path d=\"M5 12h14M13 5l7 7-7 7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\/>\n        <\/svg>\n      <\/a>\n    <\/div>\n\n  <\/section>\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       5. SECTION CAPABILITIES + accord\u00e9on\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sf-cap\" id=\"sf-cap\" data-section-color=\"light\">\n<!-- Intro \u00e9ditoriale : eyebrow + chap\u00f4 punch + texte de soutien -->\n    <div class=\"sf-cap-intro\">\n      <p class=\"sf-cap-eyebrow sf-reveal\" data-reveal-delay=\"0\">[ M\u00c9THODE DE TRAVAIL ]<\/p>\n      <p class=\"sf-cap-lead sf-reveal\" data-key=\"capIntro1\" data-reveal-delay=\"120\">\n        Avant de dessiner, nous clarifions le besoin : objectif de l'\u00e9v\u00e9nement, public attendu, surface disponible, contraintes du lieu, budget, d\u00e9lais et niveau de finition.\n      <\/p>\n      <p class=\"sf-cap-support sf-reveal\" data-key=\"capIntro2\" data-reveal-delay=\"240\">\n        Ensuite, nous construisons une r\u00e9ponse exploitable : intention cr\u00e9ative, parcours visiteurs, volumes, mat\u00e9riaux, signal\u00e9tique, plans techniques, fabrication et pose.\n      <\/p>\n    <\/div>\n\n    <!-- Diviseur horizontal -->\n    <div class=\"sf-cap-divider\"><\/div>\n\n    <!-- Image PLEINE LARGEUR \u00b7 texte l\u00e9ger pos\u00e9 dessus (immersif) -->\n    <div class=\"sf-cap-grid\">\n\n      <!-- FOND : image full-bleed + compteur -->\n      <div class=\"sf-cap-stage\" id=\"sf-cap-stage\">\n        <div class=\"sf-cap-image\" id=\"sf-cap-image\">\n          <!-- Images expertise synchronis\u00e9es avec les 6 entr\u00e9es ci-dessous -->\n          <img class=\"sf-cap-image-item is-current\" data-cap-key=\"cap1\"\n               src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/06\/convivio-home.png\"\n               alt=\"\u00c9v\u00e9nements de marque \u00e0 Rennes\" decoding=\"async\">\n          <img class=\"sf-cap-image-item\" data-cap-key=\"cap2\"\n               src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/06\/june-store-rennes.png\"\n               alt=\"Pop-up stores & retail \u00e0 Rennes\" loading=\"lazy\" decoding=\"async\">\n          <img class=\"sf-cap-image-item\" data-cap-key=\"cap3\"\n               src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/06\/rebirth-home.png\"\n               alt=\"Stands de salon sur mesure\" loading=\"lazy\" decoding=\"async\">\n          <img class=\"sf-cap-image-item\" data-cap-key=\"cap4\"\n               src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/CA.webp\"\n               alt=\"Mapping vid\u00e9o \u00e9v\u00e9nementiel et projection immersive \u00e0 Rennes\" loading=\"lazy\" decoding=\"async\">\n          <img class=\"sf-cap-image-item\" data-cap-key=\"cap5\"\n               src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/06\/marine-home.png\"\n               alt=\"Expositions, galeries & culture\" loading=\"lazy\" decoding=\"async\">\n          <img class=\"sf-cap-image-item\" data-cap-key=\"cap6\"\n               src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/06\/alpinea390.png\"\n               alt=\"Activations immersives en Bretagne\" loading=\"lazy\" decoding=\"async\">\n        <\/div>\n        <div class=\"sf-cap-counter\" id=\"sf-cap-counter\" aria-hidden=\"true\">01<sup>\/06<\/sup><\/div>\n      <\/div>\n\n      <!-- OVERLAY : texte l\u00e9ger pos\u00e9 sur l'image, aucun fond -->\n      <div class=\"sf-cap-panel\">\n\n        <a href=\"https:\/\/scenographie-france.fr\/contact-agence-scenographie\/\" class=\"sf-cap-cta sf-target sf-reveal\" data-reveal-delay=\"500\" target=\"_blank\" rel=\"noopener\">\n          <span data-key=\"startProject\">D\u00c9MARRER UN PROJET<\/span>\n          <span class=\"sf-cap-cta-arrow\">\u27f6<\/span>\n        <\/a>\n        <div class=\"sf-cap-list\" id=\"sf-cap-list\">\n\n          <div class=\"sf-cap-line is-active\" data-cap-target=\"cap1\" data-reveal-delay=\"0\">\n            <span class=\"sf-cap-line-num\">01<\/span>\n            <span class=\"sf-cap-line-name\" data-key=\"cap1\">\u00c9v\u00e9nements de marque \u00e0 Rennes<\/span>\n            <span class=\"sf-cap-line-meta\">Lancements, conventions, inaugurations, soir\u00e9es d'entreprise<\/span>\n          <\/div>\n          <div class=\"sf-cap-line\" data-cap-target=\"cap2\" data-reveal-delay=\"80\">\n            <span class=\"sf-cap-line-num\">02<\/span>\n            <span class=\"sf-cap-line-name\" data-key=\"cap2\">Pop-up stores & retail rennais<\/span>\n            <span class=\"sf-cap-line-meta\">Corners, vitrines, boutiques temporaires, centres commerciaux<\/span>\n          <\/div>\n          <div class=\"sf-cap-line\" data-cap-target=\"cap3\" data-reveal-delay=\"160\">\n            <span class=\"sf-cap-line-num\">03<\/span>\n            <span class=\"sf-cap-line-name\" data-key=\"cap3\">Stands de salon sur mesure<\/span>\n            <span class=\"sf-cap-line-meta\">Foires, salons professionnels, stands image, stands modulaires<\/span>\n          <\/div>\n          <div class=\"sf-cap-line\" data-cap-target=\"cap4\" data-reveal-delay=\"240\">\n            <span class=\"sf-cap-line-num\">04<\/span>\n            <span class=\"sf-cap-line-name\" data-key=\"cap4\">Mapping vid\u00e9o \u00e9v\u00e9nementiel<\/span>\n            <span class=\"sf-cap-line-meta\">Projection immersive sur fa\u00e7ades, stands, sc\u00e8nes et volumes<\/span>\n          <\/div>\n          <div class=\"sf-cap-line\" data-cap-target=\"cap5\" data-reveal-delay=\"320\">\n            <span class=\"sf-cap-line-num\">05<\/span>\n            <span class=\"sf-cap-line-name\" data-key=\"cap5\">Expositions, galeries & culture<\/span>\n            <span class=\"sf-cap-line-meta\">Mus\u00e9es, galeries, lieux patrimoniaux, parcours de visite<\/span>\n          <\/div>\n          <div class=\"sf-cap-line\" data-cap-target=\"cap6\" data-reveal-delay=\"400\">\n            <span class=\"sf-cap-line-num\">06<\/span>\n            <span class=\"sf-cap-line-name\" data-key=\"cap6\">Activations immersives en Bretagne<\/span>\n            <span class=\"sf-cap-line-meta\">Installations, espaces photo, dispositifs immersifs, animations<\/span>\n          <\/div>\n\n        <\/div>\n\n      <\/div>\n\n    <\/div>\n  <\/section>\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       6. SECTION CARNET \u2014 scroll horizontal pinn\u00e9, projets \u00e9ditoriaux\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sf-projects\" id=\"sf-projects\" data-section-color=\"light\">\n\n    <div class=\"sf-projects-header\">\n      <span class=\"sf-projects-label\" data-key=\"projectsLabel\">[ CARNET \/ 2011 \u2014 2026 ]<\/span>\n      <h2 class=\"sf-projects-title\"><span data-key=\"projectsTitle\">CARNET<\/span><\/h2>\n    <\/div>\n\n    <div class=\"sf-projects-grid\">\n\n      <!-- Rang\u00e9e 1 : hero MATRA (4 col) + ID\u00c9NA (2 col, full height) -->\n      <a class=\"sf-projects-item is-hero\" href=\"https:\/\/scenographie-france.fr\/conception-de-stand-retromobile-matra\" data-project-slug=\"matra-retromobile\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/12\/1738682231255.jpeg\" alt=\"Matra \u2014 Stand R\u00e9tromobile\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">Stand sur mesure \u2014 2025<\/span>\n          <span class=\"sf-projects-name\">Matra R\u00e9tromobile<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n      <a class=\"sf-projects-item is-side\" href=\"https:\/\/scenographie-france.fr\/evenement-ydeo\/\" data-project-slug=\"idena-30-ans\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/Ydeoland-MR-009-scaled.webp\" alt=\"YDEO 30 ans Anniversaire\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">Anniversaire d'entreprise<\/span>\n          <span class=\"sf-projects-name\">YDEO 30 ans<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n\n      <!-- Rang\u00e9e 2 : 3 tiers \u00e9gaux -->\n      <a class=\"sf-projects-item is-third\" href=\"https:\/\/scenographie-france.fr\/scenographie-evenementielle-convivio\/\" data-project-slug=\"convivio\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/convivio-evenementielle.webp\" alt=\"Convivio \u2014 Sc\u00e9nographie \u00e9v\u00e9nementielle\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">D\u00e9cor \u00e9v\u00e9nementiel<\/span>\n          <span class=\"sf-projects-name\">Convivio<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n      <a class=\"sf-projects-item is-third\" href=\"https:\/\/scenographie-france.fr\/scenographie-evenementielle-aeroport\" data-project-slug=\"aeroport-rennes\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/macro-aeroport-1.webp\" alt=\"A\u00e9roport de Rennes \u2014 Sc\u00e9nographie \u00e9v\u00e9nementielle\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">Sc\u00e9nographie d'exposition<\/span>\n          <span class=\"sf-projects-name\">A\u00e9roport Rennes<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n      <a class=\"sf-projects-item is-third\" href=\"https:\/\/scenographie-france.fr\/solution-retail-ephemere-centre-commercial\/\" data-project-slug=\"retail-ephemere\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/popup-store-scenographie.webp\" alt=\"Solution Retail \u00c9ph\u00e9m\u00e8re \u2014 Centre commercial\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">Pop-up store<\/span>\n          <span class=\"sf-projects-name\">Solution retail \u00e9ph\u00e9m\u00e8re<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n\n      <!-- Rang\u00e9e 3 : ALMA (2 col) + hero ALPINE (4 col) -->\n      <a class=\"sf-projects-item is-side\" href=\"https:\/\/scenographie-france.fr\/scenographie-vernissage\" data-project-slug=\"alma-louvre\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/alma-lelouvre-rennes.webp\" alt=\"Alma \u00d7 Le Louvre \u2014 Vernissage\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">Activation de marque<\/span>\n          <span class=\"sf-projects-name\">Alma \u00d7 Le Louvre<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n      <a class=\"sf-projects-item is-hero\" href=\"https:\/\/scenographie-france.fr\/scenographie-revelation-automobile-a110\" data-project-slug=\"alpine-a110\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/alpine-photo-detail.png\" alt=\"Alpine A110 \u2014 R\u00e9v\u00e9lation automobile\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">R\u00e9v\u00e9lation automobile \u2014 2026<\/span>\n          <span class=\"sf-projects-name\">Alpine A110<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n\n      <!-- Rang\u00e9e 4 : 3 tiers \u00e9gaux -->\n      <a class=\"sf-projects-item is-third\" href=\"https:\/\/scenographie-france.fr\/scenographie-centre-commercial-rennes\" data-project-slug=\"route-du-rhum\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/evenement-route-du-rhum-rennes-pinault.webp\" alt=\"Route du Rhum \u2014 Centre commercial Rennes\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">Activation de marque<\/span>\n          <span class=\"sf-projects-name\">Route du Rhum<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n      <a class=\"sf-projects-item is-third\" href=\"https:\/\/scenographie-france.fr\/evenement-sur-chantier\" data-project-slug=\"siege-samsic\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/samsic-siege.webp\" alt=\"Si\u00e8ge Samsic \u2014 \u00c9v\u00e9nement sur chantier\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">\u00c9v\u00e9nement sur chantier<\/span>\n          <span class=\"sf-projects-name\">Si\u00e8ge Samsic<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n      <a class=\"sf-projects-item is-third\" href=\"https:\/\/scenographie-france.fr\/scenographie-festival-decor-festival\" data-project-slug=\"vieilles-charrues-24\" target=\"_blank\" rel=\"noopener\">\n        <div class=\"sf-projects-img-w\"><div class=\"sf-projects-img-track\">\n          <img src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/12\/4q_fWyW8.jpeg\" alt=\"Vieilles Charrues 2024 \u2014 Sc\u00e9nographie festival\" loading=\"lazy\" decoding=\"async\">\n        <\/div><\/div>\n        <span class=\"sf-projects-arrow\" aria-hidden=\"true\">\u27f6<\/span>\n        <div class=\"sf-projects-overlay\">\n          <span class=\"sf-projects-eyebrow\">D\u00e9cor de festival \u2014 2024<\/span>\n          <span class=\"sf-projects-name\">Vieilles Charrues '24<\/span>\n          <span class=\"sf-projects-name-line\"><\/span>\n        <\/div>\n      <\/a>\n\n    <\/div>\n\n    <div class=\"sf-projects-outro\">\n      <a href=\"\/projets\/\" class=\"sf-projects-cta sf-target\">\n        <span class=\"sf-projects-cta-corner sf-projects-cta-corner--tl\"><\/span>\n        <span class=\"sf-projects-cta-corner sf-projects-cta-corner--tr\"><\/span>\n        <span class=\"sf-projects-cta-corner sf-projects-cta-corner--bl\"><\/span>\n        <span class=\"sf-projects-cta-corner sf-projects-cta-corner--br\"><\/span>\n        <span data-key=\"projectsCta\">VOIR TOUS LES PROJETS<\/span>\n        <span class=\"sf-projects-cta-arrow\">\u27f6<\/span>\n      <\/a>\n    <\/div>\n\n  <\/section>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       SECTION LOCALE \u2014 SC\u00c9NOGRAPHIE \u00c0 RENNES\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sf-local\" id=\"sf-local\" data-section-color=\"light\">\n    <div class=\"sf-local-inner\">\n      <div class=\"sf-local-head\">\n        <p class=\"sf-local-kicker sf-reveal\" data-key=\"localKicker\">[ RENNES \/ BRETAGNE ]<\/p>\n        <h2 class=\"sf-local-title sf-reveal\" data-key=\"localTitle\" data-reveal-delay=\"120\">Agence de sc\u00e9nographie \u00e0 Rennes pour stands, \u00e9v\u00e9nements et expositions<\/h2>\n      <\/div>\n\n      <div class=\"sf-local-copy\">\n        <p class=\"sf-reveal\" data-key=\"localP1\" data-reveal-delay=\"180\">\n          Nous accompagnons les entreprises, agences, institutions et lieux culturels dans la conception de leurs espaces. <span class=\"sf-local-mark\">Stand de salon, lancement de produit, pop-up store, exposition, convention ou d\u00e9cor \u00e9v\u00e9nementiel<\/span> : chaque projet est pens\u00e9 pour \u00eatre clair, visible et r\u00e9alisable.\n        <\/p>\n        <p class=\"sf-reveal\" data-key=\"localP2\" data-reveal-delay=\"260\">\n          Nous partons du lieu et des contraintes concr\u00e8tes : surface, acc\u00e8s livraison, accroches, normes de s\u00e9curit\u00e9, temps de montage, circulation du public et d\u00e9montage. L'objectif est simple : <span class=\"sf-local-mark\">cr\u00e9er un espace qui sert votre message et fonctionne le jour J.<\/span>\n        <\/p>\n\n        <div class=\"sf-local-grid\">\n          <div class=\"sf-local-item sf-reveal\" data-reveal-delay=\"80\">\n            <span class=\"sf-local-item-num\">01<\/span>\n            <h3 data-key=\"localCard1Title\">Salons & stands<\/h3>\n            <p data-key=\"localCard1Text\">Conception de stands sur mesure pour salons professionnels, foires, congr\u00e8s, rendez-vous B2B et lancements de produits.<\/p>\n          <\/div>\n          <div class=\"sf-local-item sf-reveal\" data-reveal-delay=\"160\">\n            <span class=\"sf-local-item-num\">02<\/span>\n            <h3 data-key=\"localCard2Title\">Retail \u00e9ph\u00e9m\u00e8re<\/h3>\n            <p data-key=\"localCard2Text\">Cr\u00e9ation de pop-up stores, corners, vitrines, animations commerciales et espaces de marque en centre commercial ou boutique temporaire.<\/p>\n          <\/div>\n          <div class=\"sf-local-item sf-reveal\" data-reveal-delay=\"240\">\n            <span class=\"sf-local-item-num\">03<\/span>\n            <h3 data-key=\"localCard3Title\">\u00c9v\u00e9nements de marque<\/h3>\n            <p data-key=\"localCard3Text\">D\u00e9cors, entr\u00e9es, photocalls, signal\u00e9tique, espaces d'accueil et parcours invit\u00e9s pour conventions, inaugurations et soir\u00e9es de marque.<\/p>\n          <\/div>\n          <div class=\"sf-local-item sf-reveal\" data-reveal-delay=\"320\">\n            <span class=\"sf-local-item-num\">04<\/span>\n            <h3 data-key=\"localCard4Title\">Expositions & culture<\/h3>\n            <p data-key=\"localCard4Text\">Sc\u00e9nographie d'exposition, parcours de visite, soclage, signal\u00e9tique et installations pour galeries, institutions et lieux culturels.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"sf-rennes-terrain\" aria-label=\"Rep\u00e8res de sc\u00e9nographie \u00e0 Rennes\">\n      <div class=\"sf-rennes-terrain-item sf-reveal\">\n        <span class=\"sf-rennes-terrain-label\">Rennes centre<\/span>\n        <div>\n          <h3 class=\"sf-rennes-terrain-title\">Acc\u00e8s<br>& montage<\/h3>\n          <p class=\"sf-rennes-terrain-text\">Nous anticipons les livraisons, les horaires d'installation, les contraintes de s\u00e9curit\u00e9 et les conditions de d\u00e9montage.<\/p>\n        <\/div>\n      <\/div>\n      <div class=\"sf-rennes-terrain-item sf-reveal\" data-reveal-delay=\"120\">\n        <span class=\"sf-rennes-terrain-label\">Bretagne<\/span>\n        <div>\n          <h3 class=\"sf-rennes-terrain-title\">Publics<br>& parcours<\/h3>\n          <p class=\"sf-rennes-terrain-text\">Nous dessinons des espaces lisibles : o\u00f9 entrer, o\u00f9 regarder, o\u00f9 circuler, o\u00f9 s'arr\u00eater, o\u00f9 prendre une photo.<\/p>\n        <\/div>\n      <\/div>\n      <div class=\"sf-rennes-terrain-item sf-reveal\" data-reveal-delay=\"240\">\n        <span class=\"sf-rennes-terrain-label\">Grand Ouest<\/span>\n        <div>\n          <h3 class=\"sf-rennes-terrain-title\">Fabrication<br>& pose<\/h3>\n          <p class=\"sf-rennes-terrain-text\">Nous pr\u00e9parons les plans, les mat\u00e9riaux, les finitions, la fabrication, la logistique et l'installation sur site.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"sf-local-faq\">\n      <div class=\"sf-local-faq-row sf-reveal\">\n        <h3 data-key=\"localFaq1Q\">Intervention \u00e0 Rennes<\/h3>\n        <p data-key=\"localFaq1A\">Nous intervenons \u00e0 Rennes, en Ille-et-Vilaine, en Bretagne et dans le Grand Ouest pour des salons, centres commerciaux, lieux culturels, si\u00e8ges d'entreprise, festivals et espaces \u00e9v\u00e9nementiels.<\/p>\n      <\/div>\n      <div class=\"sf-local-faq-row sf-reveal\" data-reveal-delay=\"100\">\n        <h3 data-key=\"localFaq2Q\">Fabrication & pose<\/h3>\n        <p data-key=\"localFaq2A\">Nous pouvons prendre en charge la direction artistique, les plans techniques, la fabrication, la coordination des prestataires, la pose et le d\u00e9montage.<\/p>\n      <\/div>\n      <div class=\"sf-local-faq-row sf-reveal\" data-reveal-delay=\"200\">\n        <h3 data-key=\"localFaq3Q\">D\u00e9lais projet<\/h3>\n        <p data-key=\"localFaq3A\">Pour un stand, un pop-up store, une exposition ou un d\u00e9cor \u00e9v\u00e9nementiel, nous cadrons rapidement le besoin afin de proposer une solution adapt\u00e9e au d\u00e9lai et au budget.<\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       SECTION DUAL-CTA \u2014 CONCEVOIR \/ EXPLORER \u00b7 REBIRTH\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"sf-dualcta\" id=\"sf-dualcta\" data-section-color=\"light\">\n    <div class=\"sf-dualcta-stage\">\n\n      <!-- Plan graphique filaire \u2014 haut gauche -->\n      <figure class=\"sf-dualcta-visual sf-dualcta-visual--plan\" aria-hidden=\"true\">\n        <img\n          src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/Plan-Graphique-Rebirth.png\"\n          alt=\"\"\n          loading=\"lazy\"\n          decoding=\"async\">\n      <\/figure>\n\n      <!-- Rendu 3D Rebirth \u2014 bas droite -->\n      <figure class=\"sf-dualcta-visual sf-dualcta-visual--render\" aria-hidden=\"true\">\n        <img\n          src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/3D-Sans-Rebirth-RL-scaled.png\"\n          alt=\"\"\n          loading=\"lazy\"\n          decoding=\"async\">\n      <\/figure>\n\n      <!-- Rep\u00e8res graphiques fluo -->\n      <figure class=\"sf-dualcta-gimmick sf-dualcta-gimmick--left\" aria-hidden=\"true\">\n        <img\n          src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/Gimmic_Fluo.png\"\n          alt=\"\"\n          loading=\"lazy\"\n          decoding=\"async\">\n      <\/figure>\n\n      <figure class=\"sf-dualcta-gimmick sf-dualcta-gimmick--right\" aria-hidden=\"true\">\n        <img\n          src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/07\/Gimmic_Fluo.png\"\n          alt=\"\"\n          loading=\"lazy\"\n          decoding=\"async\">\n      <\/figure>\n\n      <div class=\"sf-dualcta-content\">\n\n        <!-- CONCEVOIR \u2014 haut droite -->\n        <div class=\"sf-dualcta-col sf-dualcta-col--conceive sf-reveal\">\n          <div class=\"sf-dualcta-headline\">\n            <span class=\"sf-dualcta-eyebrow\" data-key=\"dualctaLeftEyebrow\">Le projet<\/span>\n            <h2 class=\"sf-dualcta-title\" data-key=\"dualctaLeftTitle\">CONCEVOIR<\/h2>\n          <\/div>\n\n          <p class=\"sf-dualcta-desc\" data-key=\"dualctaLeftDesc\">Un projet en t\u00eate ? Parlons-en. Brief, direction artistique, chiffrage \u2014 on vous r\u00e9pond vite et concr\u00e8tement.<\/p>\n\n          <a href=\"https:\/\/scenographie-france.fr\/contact-agence-scenographie\/\" class=\"sf-dualcta-btn sf-target\" aria-label=\"Concevoir un projet\" target=\"_blank\" rel=\"noopener\">\n            <span data-key=\"startProject\">D\u00c9MARRER UN PROJET<\/span>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" aria-hidden=\"true\">\n              <path d=\"M6 18L18 6\"\/>\n              <path d=\"M9 6h9v9\"\/>\n            <\/svg>\n          <\/a>\n        <\/div>\n\n        <!-- EXPLORER \u2014 bas gauche -->\n        <div class=\"sf-dualcta-col sf-dualcta-col--explore sf-reveal\">\n          <div class=\"sf-dualcta-headline\">\n            <span class=\"sf-dualcta-eyebrow\" data-key=\"dualctaRightEyebrow\">Les projets<\/span>\n            <h2 class=\"sf-dualcta-title\" data-key=\"dualctaRightTitle\">EXPLORER<\/h2>\n          <\/div>\n\n          <p class=\"sf-dualcta-desc\" data-key=\"dualctaRightDesc\">Plus de 1 200 projets livr\u00e9s depuis 2011. Stands, pop-up stores, expositions \u2014 la preuve par l'exemple.<\/p>\n\n          <a href=\"https:\/\/scenographie-france.fr\/projets\/\" class=\"sf-dualcta-btn sf-target\" aria-label=\"Voir tous les projets\" target=\"_blank\" rel=\"noopener\">\n            <span data-key=\"allProjects\">TOUS LES PROJETS<\/span>\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" aria-hidden=\"true\">\n              <path d=\"M6 18L18 6\"\/>\n              <path d=\"M9 6h9v9\"\/>\n            <\/svg>\n          <\/a>\n        <\/div>\n\n      <\/div>\n    <\/div>\n  <\/section>\n\n\n\n\n\n<\/div>\n\n\n<!-- GSAP + ScrollTrigger via CDN -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.5\/gsap.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.5\/ScrollTrigger.min.js\"><\/script>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', () => {\n\n  const isElementorEditor = document.body.classList.contains('elementor-editor-active');\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ 0. FIX SCROLL \u2014 anti-Elementor \/ anti-Blocksy\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  const html = document.documentElement;\n  html.classList.add('sf-active');\n\n  let fixingScroll = false;\n  function aggressiveScrollFix() {\n    if (fixingScroll) return;\n    fixingScroll = true;\n    html.style.setProperty('overflow-x', 'hidden', 'important');\n    html.style.setProperty('overflow-y', 'scroll', 'important');\n    html.style.setProperty('height', 'auto', 'important');\n    html.style.setProperty('max-height', 'none', 'important');\n    document.body.style.setProperty('overflow-x', 'hidden', 'important');\n    document.body.style.setProperty('overflow-y', 'visible', 'important');\n    document.body.style.setProperty('height', 'auto', 'important');\n    document.body.style.setProperty('max-height', 'none', 'important');\n    document.body.style.setProperty('min-height', '100vh', 'important');\n    document.body.style.setProperty('position', 'static', 'important');\n    setTimeout(() => { fixingScroll = false; }, 50);\n  }\n\n  \/\/ D\u00e9tecte le footer dans le DOM et remonte jusqu'\u00e0 son anc\u00eatre direct de <body>\n  function findFooterBodyChild() {\n    const candidates = [\n      document.getElementById('sf-footer-root'),\n      document.querySelector('[data-elementor-type=\"footer\"]'),\n      document.querySelector('.elementor-location-footer'),\n      document.querySelector('footer.elementor-section'),\n      document.querySelector('body > footer'),\n      document.querySelector('footer')\n    ].filter(Boolean);\n\n    for (const el of candidates) {\n      let node = el;\n      while (node && node.parentElement !== document.body) {\n        node = node.parentElement;\n      }\n      if (node && node.parentElement === document.body) return node;\n    }\n    return null;\n  }\n\n  function escapeElementorChain() {\n    const wrapper = document.getElementById('sf-wrapper');\n    const loaderEl = document.querySelector('.sf-loader');\n    if (!wrapper) return;\n    let p = wrapper.parentElement;\n    let depth = 0;\n    while (p && p !== document.body && depth < 30) {\n      p.style.setProperty('overflow', 'visible', 'important');\n      p.style.setProperty('height', 'auto', 'important');\n      p.style.setProperty('max-height', 'none', 'important');\n      p.style.setProperty('min-height', '0', 'important');\n      p.style.setProperty('position', 'static', 'important');\n      p.style.setProperty('transform', 'none', 'important');\n      p = p.parentElement;\n      depth++;\n    }\n    \/\/ FIX MOBILE : toujours v\u00e9rifier position relative au footer.\n    const footerBodyChild = findFooterBodyChild();\n    if (footerBodyChild) {\n      const isInBody = wrapper.parentElement === document.body;\n      const isBeforeFooter = isInBody &&\n        (wrapper.compareDocumentPosition(footerBodyChild) & Node.DOCUMENT_POSITION_FOLLOWING);\n      if (!isInBody || !isBeforeFooter) {\n        document.body.insertBefore(wrapper, footerBodyChild);\n      }\n    } else if (wrapper.parentElement !== document.body) {\n      document.body.appendChild(wrapper);\n    }\n    if (loaderEl && loaderEl.parentElement !== document.body) {\n      document.body.appendChild(loaderEl);\n    }\n  }\n\n  aggressiveScrollFix();\n  escapeElementorChain();\n  [50, 200, 500, 1000, 2000, 3500, 5000].forEach(d => setTimeout(() => {\n    aggressiveScrollFix();\n    escapeElementorChain();\n  }, d));\n\n  let bodyChildTimeout = null;\n  const bodyChildObserver = new MutationObserver(() => {\n    if (bodyChildTimeout) clearTimeout(bodyChildTimeout);\n    bodyChildTimeout = setTimeout(() => {\n      escapeElementorChain();\n    }, 80);\n  });\n  bodyChildObserver.observe(document.body, { childList: true, subtree: false });\n\n  window.addEventListener('load', () => {\n    aggressiveScrollFix();\n    escapeElementorChain();\n    if (window.ScrollTrigger) ScrollTrigger.refresh();\n  });\n  window.addEventListener('resize', () => {\n    aggressiveScrollFix();\n    if (window.ScrollTrigger) ScrollTrigger.refresh();\n  });\n\n  const scrollGuard = new MutationObserver(() => {\n    if (fixingScroll) return;\n    aggressiveScrollFix();\n  });\n  scrollGuard.observe(html, { attributes: true, attributeFilter: ['style', 'class'] });\n  scrollGuard.observe(document.body, { attributes: true, attributeFilter: ['style', 'class'] });\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ FIX WHEEL \u2014 bypass scripts tiers qui interceptent la molette\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  function forceWheelScroll(e) {\n    if (e.ctrlKey) return;\n    let target = e.target;\n    while (target && target !== document.body) {\n      const cs = getComputedStyle(target);\n      if ((cs.overflowY === 'auto' || cs.overflowY === 'scroll')\n          && target.scrollHeight > target.clientHeight + 5) return;\n      target = target.parentElement;\n    }\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    window.scrollBy({ top: e.deltaY, left: 0, behavior: 'auto' });\n  }\n  document.addEventListener('wheel', forceWheelScroll, { capture: true, passive: false });\n\n  document.addEventListener('keydown', e => {\n    if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.isContentEditable) return;\n    const map = {\n      'PageDown': window.innerHeight * 0.9,\n      'PageUp':   -window.innerHeight * 0.9,\n      'ArrowDown': 60, 'ArrowUp': -60,\n      ' ':         window.innerHeight * 0.9,\n      'End':       document.body.scrollHeight,\n      'Home':     -document.body.scrollHeight\n    };\n    if (map[e.key] !== undefined) {\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      window.scrollBy({ top: map[e.key], behavior: 'auto' });\n    }\n  }, { capture: true });\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ GUARD \u2014 header widget Elementor\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  const sfHeaderAlreadyInit = !!window.sfHeaderReady;\n\n  if (!sfHeaderAlreadyInit) {\n    \/\/ \u2500\u2500\u2500 LOADER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const loader = document.querySelector('.sf-loader');\n    const loaderPct = document.querySelector('.sf-loader-pct');\n    if (loader && !isElementorEditor) {\n      let val = 0;\n      const interval = setInterval(() => {\n        val += Math.random() * 8;\n        if (val >= 100) val = 100;\n        if (loaderPct) loaderPct.textContent = Math.floor(val).toString().padStart(3, '0');\n        if (val === 100) { clearInterval(interval); setTimeout(() => loader.classList.add('hidden'), 350); }\n      }, 30);\n    } else if (loader) { loader.classList.add('hidden'); }\n\n    \/\/ \u2500\u2500\u2500 CURSEUR CUSTOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const coordX = document.getElementById('sf-x');\n    const coordY = document.getElementById('sf-y');\n    function pad(n) { return Math.round(n).toString().padStart(3, '0'); }\n    const sfCursor = document.querySelector('.sf-cursor');\n    const cursorH = document.querySelector('.sf-cursor-h');\n    const cursorV = document.querySelector('.sf-cursor-v');\n    const markerTL = document.querySelector('.sf-cursor-marker--tl');\n    const markerTR = document.querySelector('.sf-cursor-marker--tr');\n    const markerBL = document.querySelector('.sf-cursor-marker--bl');\n    const markerBR = document.querySelector('.sf-cursor-marker--br');\n    const isTouch = window.matchMedia('(hover: none), (pointer: coarse)').matches;\n    if (isTouch && sfCursor) sfCursor.remove();\n    let cursorActivated = false;\n    document.addEventListener('mousemove', e => {\n      if (coordX) coordX.textContent = pad(e.clientX);\n      if (coordY) coordY.textContent = pad(e.clientY);\n      if (!isTouch && sfCursor) {\n        if (!cursorActivated) { sfCursor.classList.add('is-active'); cursorActivated = true; }\n        if (cursorH) cursorH.style.transform = `translate3d(0, ${e.clientY}px, 0)`;\n        if (cursorV) cursorV.style.transform = `translate3d(${e.clientX}px, 0, 0)`;\n      }\n    });\n    function positionMarker(marker, x, y) {\n      if (!marker) return;\n      marker.style.setProperty('--mx', `${x - 6}px`);\n      marker.style.setProperty('--my', `${y - 6}px`);\n    }\n    function attachTargeting() {\n      if (isTouch || !sfCursor) return;\n      document.querySelectorAll('.sf-target').forEach(t => {\n        t.addEventListener('mouseenter', () => {\n          const r = t.getBoundingClientRect();\n          const o = 6;\n          positionMarker(markerTL, r.left - o, r.top - o);\n          positionMarker(markerTR, r.right + o, r.top - o);\n          positionMarker(markerBL, r.left - o, r.bottom + o);\n          positionMarker(markerBR, r.right + o, r.bottom + o);\n          sfCursor.classList.add('is-targeting');\n        });\n        t.addEventListener('mouseleave', () => sfCursor.classList.remove('is-targeting'));\n      });\n    }\n    attachTargeting();\n    window.addEventListener('load', attachTargeting);\n\n    \/\/ \u2500\u2500\u2500 HEADER COULEURS + POSITION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const header = document.querySelector('.sf-header');\n    const colorSections = document.querySelectorAll('[data-section-color]');\n    function updateHeaderColor() {\n      if (!header) return;\n      const isTop = header.classList.contains('is-top');\n      const probeY = isTop ? 30 : (window.innerHeight - 50);\n      let currentColor = 'dark';\n      colorSections.forEach(s => {\n        const r = s.getBoundingClientRect();\n        if (r.top <= probeY && r.bottom >= probeY) currentColor = s.getAttribute('data-section-color') || 'dark';\n      });\n      header.setAttribute('data-section', currentColor);\n    }\n    function updateHeaderPosition() {\n      if (!header) return;\n      if (window.innerWidth <= 768) return;\n      const threshold = window.innerHeight * 0.85;\n      if (window.scrollY >= threshold) header.classList.add('is-top');\n      else header.classList.remove('is-top');\n    }\n    let ticking = false;\n    function onScroll() {\n      if (!ticking) {\n        requestAnimationFrame(() => { updateHeaderPosition(); updateHeaderColor(); ticking = false; });\n        ticking = true;\n      }\n    }\n    window.addEventListener('scroll', onScroll, { passive: true });\n    updateHeaderPosition();\n    updateHeaderColor();\n\n    \/\/ \u2500\u2500\u2500 CURSOR THEME (dark\/light selon section) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    function updateCursorTheme() {\n      const heroBottom = document.querySelector('.sf-hero')?.getBoundingClientRect().bottom || 0;\n      document.body.classList.toggle('is-dark-section', heroBottom > 100);\n    }\n    window.addEventListener('scroll', updateCursorTheme, { passive: true });\n    updateCursorTheme();\n\n    \/\/ \u2500\u2500\u2500 OVERLAY MENU \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const menuBtn = document.getElementById('sf-menu-btn');\n    const menuOverlay = document.getElementById('sf-menu-overlay');\n    const tilesContainer = document.getElementById('sf-menu-tiles');\n    const menuFilters = [1, 2, 3, 4, 5].map(n =>\n      document.querySelector(`#sf-bitmap-menu-${n} feGaussianBlur`)\n    );\n    let isMenuOpen = false;\n    if (tilesContainer) {\n      const isMobileMenu = window.matchMedia('(max-width: 768px)').matches;\n      const cols = isMobileMenu ? 4 : 8;\n      const rows = isMobileMenu ? 8 : 6;\n      for (let i = 0; i < cols * rows; i++) {\n        const tile = document.createElement('div');\n        tile.className = 'sf-menu-tile';\n        tilesContainer.appendChild(tile);\n      }\n    }\n    function openMenu() {\n      if (!menuOverlay) return;\n      isMenuOpen = true;\n      menuOverlay.classList.add('is-open');\n      document.body.classList.add('is-menu-open');\n      if (menuBtn) { menuBtn.textContent = '[ CLOSE ]'; menuBtn.classList.add('is-active'); }\n      menuFilters.forEach(f => f && f.setAttribute('stdDeviation', '22'));\n      gsap.killTweensOf(['.sf-menu-tile', '.sf-menu-link']);\n      gsap.set('.sf-menu-tile', { scale: 0 });\n      gsap.to('.sf-menu-tile', { scale: 1, duration: 0.5, stagger: { amount: 0.6, from: 'random' }, ease: 'power2.out' });\n      const links = document.querySelectorAll('.sf-menu-link');\n      gsap.set(links, { opacity: 0, x: 120, skewX: -6 });\n      gsap.to(links, { opacity: 1, x: 0, skewX: 0, duration: 1.0, delay: 0.5, stagger: 0.12, ease: 'expo.out' });\n      menuFilters.forEach((f, i) => { if (!f) return; gsap.killTweensOf(f); gsap.to(f, { attr: { stdDeviation: 0 }, duration: 1.2, delay: 0.5 + i * 0.12, ease: 'power3.out' }); });\n    }\n    function closeMenu() {\n      if (!menuOverlay) return;\n      isMenuOpen = false;\n      if (menuBtn) { menuBtn.textContent = '[ MENU ]'; menuBtn.classList.remove('is-active'); }\n      menuFilters.forEach(f => { if (!f) return; gsap.killTweensOf(f); f.setAttribute('stdDeviation', '22'); });\n      gsap.killTweensOf(['.sf-menu-tile', '.sf-menu-link']);\n      const links = document.querySelectorAll('.sf-menu-link');\n      gsap.to(links, { opacity: 0, x: 60, skewX: -4, duration: 0.3, stagger: 0.04, ease: 'power2.in' });\n      gsap.to('.sf-menu-tile', { scale: 0, duration: 0.4, delay: 0.15, stagger: { amount: 0.4, from: 'random' }, ease: 'power2.in',\n        onComplete: () => { menuOverlay.classList.remove('is-open'); document.body.classList.remove('is-menu-open'); gsap.set(links, { opacity: 0, x: 120, skewX: -6 }); }\n      });\n    }\n    if (menuBtn) menuBtn.addEventListener('click', () => isMenuOpen ? closeMenu() : openMenu());\n    document.querySelectorAll('.sf-menu-link').forEach(link => link.addEventListener('click', () => setTimeout(closeMenu, 100)));\n    document.addEventListener('keydown', e => { if (e.key === 'Escape' && isMenuOpen) closeMenu(); });\n\n  } \/\/ end !sfHeaderAlreadyInit\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ GSAP + ScrollTrigger animations (sp\u00e9cifiques \u00e0 la home)\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  if (window.gsap && window.ScrollTrigger) {\n    gsap.registerPlugin(ScrollTrigger);\n\n    const isMobile = window.innerWidth <= 768;\n    const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    if (!reduceMotion && !isMobile) {\n      const sfBitmapBlur = document.querySelector('#sf-bitmap-reveal feGaussianBlur');\n      if (sfBitmapBlur) {\n        const initialBlur = 14;\n        sfBitmapBlur.setAttribute('stdDeviation', initialBlur);\n        gsap.set('.sf-hero-title', {\n          filter: 'url(#sf-bitmap-reveal)',\n          scale: 1.015\n        });\n\n        const titleRevealTl = gsap.timeline({ delay: 0.5 });\n        titleRevealTl\n          .to(sfBitmapBlur, {\n            attr: { stdDeviation: 0 },\n            duration: 1.6,\n            ease: 'power3.out'\n          }, 0)\n          .to('.sf-hero-title', {\n            scale: 1,\n            duration: 1.6,\n            ease: 'power3.out'\n          }, 0)\n          .add(() => {\n            const titleEl = document.querySelector('.sf-hero-title');\n            if (titleEl) titleEl.style.filter = 'none';\n          });\n      }\n    }\n    if (!reduceMotion && !isMobile) {\n\n      const heroTl = gsap.timeline({\n        scrollTrigger: {\n          trigger: '.sf-hero-wrap',\n          start: 'top top',\n          end: '+=200%',\n          scrub: 1,\n          pin: '.sf-hero',\n          pinSpacing: false,\n          anticipatePin: 1\n        }\n      });\n\n      heroTl\n        .to('.sf-hero-title', {\n          yPercent: -25,\n          scale: 0.95,\n          opacity: 0.7,\n          ease: 'none'\n        }, 0);\n      const capStage = document.getElementById('sf-cap-stage');\n      if (capStage) {\n        \/\/ Reveal en fondu pur (pas de glissement sur l'image full-bleed)\n        gsap.fromTo(capStage,\n          { autoAlpha: 0 },\n          {\n            autoAlpha: 1,\n            ease: 'power2.out', duration: 1.2,\n            scrollTrigger: { trigger: '.sf-cap-grid', start: 'top 80%', once: true }\n          }\n        );\n      }\n\n      \/\/ CARNET bento : reveal en cascade des cards au scroll\n      const projectCards = document.querySelectorAll('.sf-projects-item');\n      if (projectCards.length) {\n        ScrollTrigger.batch(projectCards, {\n          start: 'top 88%',\n          once: true,\n          onEnter: (batch) => {\n            gsap.to(batch, {\n              opacity: 1, y: 0,\n              duration: 0.9,\n              ease: 'power3.out',\n              stagger: 0.08,\n              overwrite: true\n            });\n          }\n        });\n      }\n\n      ScrollTrigger.refresh();\n\n    } else {\n      gsap.set('.sf-hero-line > span', { yPercent: 0 });\n      gsap.set('.sf-immersion-title-line > span', { yPercent: 0 });\n      gsap.set('.sf-cap-line', { opacity: 1, y: 0 });\n      gsap.set('.sf-cap-image', { clipPath: 'none' });\n      gsap.set('.sf-immersion-media', { clipPath: 'none' });\n      gsap.set('.sf-cap-divider', { scaleX: 1 });\n      gsap.set('.sf-cta-btn, .sf-immersion-p, .sf-immersion-caption, .sf-cta-link, .sf-cap-eyebrow, .sf-cap-lead, .sf-cap-support, .sf-cap-title, .sf-cap-cta', { opacity: 1, y: 0 });\n\n      const projectCards = document.querySelectorAll('.sf-projects-item');\n      if (projectCards.length) {\n        const cardObs = new IntersectionObserver((entries, o) => {\n          entries.forEach(entry => {\n            if (entry.isIntersecting) {\n              entry.target.classList.add('is-revealed');\n              o.unobserve(entry.target);\n            }\n          });\n        }, { threshold: 0.15 });\n        projectCards.forEach(c => cardObs.observe(c));\n      }\n    }\n  }\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ EXPERTISE \u2014 changement d'image (ind\u00e9pendant de GSAP, marche partout)\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  function initCapInteraction() {\n    const capLines = document.querySelectorAll('.sf-cap-line');\n    if (!capLines.length) return;\n    const capImageItems = document.querySelectorAll('.sf-cap-image-item');\n    const capCounter = document.getElementById('sf-cap-counter');\n    const capTargetNum = { cap1: '01', cap2: '02', cap3: '03', cap4: '04', cap5: '05', cap6: '06' };\n    let capCurrentKey = 'cap1';\n    let capLeaveTimer = null;\n    const setActiveCap = (target) => {\n      if (target === capCurrentKey) return;\n      capLines.forEach(l => {\n        l.classList.toggle('is-active', l.dataset.capTarget === target);\n      });\n      capImageItems.forEach(img => {\n        const key = img.dataset.capKey;\n        if (key === target) {\n          img.classList.remove('is-leaving');\n          img.classList.add('is-current', 'is-animating');\n        } else if (key === capCurrentKey) {\n          img.classList.remove('is-current');\n          img.classList.add('is-leaving', 'is-animating');\n        } else {\n          img.classList.remove('is-current', 'is-leaving', 'is-animating');\n        }\n      });\n      clearTimeout(capLeaveTimer);\n      const leavingKey = capCurrentKey;\n      capLeaveTimer = setTimeout(() => {\n        capImageItems.forEach(img => {\n          if (img.dataset.capKey === leavingKey) img.classList.remove('is-leaving');\n          img.classList.remove('is-animating');\n        });\n      }, 1700);\n      capCurrentKey = target;\n      if (capCounter && capTargetNum[target]) {\n        capCounter.innerHTML = capTargetNum[target] + '<sup>\/06<\/sup>';\n      }\n    };\n    \/\/ Desktop : survol. Tactile : clic. On attache les DEUX pour couvrir\n    \/\/ les hybrides (laptop tactile) \u2014 setActiveCap ignore les doublons.\n    const isTouch = window.matchMedia('(hover: none), (pointer: coarse)').matches;\n    capLines.forEach(line => {\n      line.addEventListener('click', () => setActiveCap(line.dataset.capTarget));\n      if (!isTouch) {\n        line.addEventListener('mouseenter', () => setActiveCap(line.dataset.capTarget));\n      }\n    });\n  }\n  initCapInteraction();\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ SYST\u00c8ME REVEAL BULLETPROOF (IntersectionObserver + CSS)\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  function initRevealSystem() {\n    const prefersReduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    if (prefersReduce) {\n      document.querySelectorAll('.sf-reveal, .sf-reveal-line, .sf-cap-line, .sf-projects-item').forEach(el => {\n        el.classList.add('is-revealed');\n      });\n      return;\n    }\n\n    const revealEls = document.querySelectorAll('.sf-reveal, .sf-reveal-line, .sf-cap-line');\n    if (!revealEls.length) return;\n\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          const el = entry.target;\n          const delay = parseInt(el.dataset.revealDelay || '0', 10);\n          if (delay > 0) {\n            setTimeout(() => el.classList.add('is-revealed'), delay);\n          } else {\n            el.classList.add('is-revealed');\n          }\n          observer.unobserve(el);\n        }\n      });\n    }, {\n      threshold: 0.12,\n      rootMargin: '0px 0px -8% 0px'\n    });\n\n    revealEls.forEach(el => observer.observe(el));\n  }\n  initRevealSystem();\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ IMAGE REVEAL \u2014 image IMMERSION\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  function initImmersionImageReveal() {\n    const img = document.querySelector('.sf-immersion-media img');\n    if (!img) return;\n\n    const prefersReduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    if (prefersReduce) {\n      img.classList.add('is-image-revealed');\n      return;\n    }\n\n    const obs = new IntersectionObserver((entries, o) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          entry.target.classList.add('is-image-revealed');\n          o.unobserve(entry.target);\n        }\n      });\n    }, { threshold: 0.15, rootMargin: '0px 0px -5% 0px' });\n    obs.observe(img);\n\n    setTimeout(() => {\n      if (!img.classList.contains('is-image-revealed')) {\n        img.classList.add('is-image-revealed');\n      }\n    }, 8000);\n  }\n  initImmersionImageReveal();\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ i18n FR \/ EN\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  const STORE_KEY = 'sf-lang';\n  const translations = {\n    fr: {\n      hero1: \"SC\u00c9NOGRAPHIE\",\n      hero2: \"RENNES\",\n      heroDesc: \"Sc\u00e9nographie \u00e0 Rennes et en Bretagne \u2014 conception de stands, d\u00e9cors \u00e9v\u00e9nementiels, pop-up stores, expositions et espaces de marque.\",\n      hl1a: \"CONCEVOIR\",\n      hl1b: \"SUR SITE\",\n      sculpterP1: \"Nous concevons chaque projet en tenant compte du lieu d\u00e8s le d\u00e9part : acc\u00e8s, temps de montage, circulation du public, s\u00e9curit\u00e9, d\u00e9montage et niveau de finition attendu.\",\n      sculpterP2: \"Du brief au montage, nous cadrons la cr\u00e9ation, les plans, la fabrication, la logistique et l'installation pour obtenir un r\u00e9sultat propre le jour J.\",\n      allProjects: \"TOUS LES PROJETS\",\n      immersionTitle: \"R\u00c9ALISATION\",\n      imm1: \"Notre travail couvre la direction artistique, les plans, le choix des mat\u00e9riaux, la fabrication, la coordination des prestataires et l'installation sur site.\",\n      imm2: \"Pour un stand, un lancement, une exposition ou un d\u00e9cor \u00e9v\u00e9nementiel, nous cherchons le bon \u00e9quilibre entre impact visuel, contraintes techniques, budget et d\u00e9lai.\",\n      immersionCaption: \"Des sc\u00e9nographies con\u00e7ues pour des lieux tr\u00e8s diff\u00e9rents : salons professionnels, centres commerciaux, lancements de produits, expositions, festivals, si\u00e8ges d'entreprise et espaces culturels.\",\n      capIntro1: \"Avant de dessiner, nous clarifions le besoin : objectif de l'\u00e9v\u00e9nement, public attendu, surface disponible, contraintes du lieu, budget, d\u00e9lais et niveau de finition.\",\n      capIntro2: \"Ensuite, nous construisons une r\u00e9ponse exploitable : intention cr\u00e9ative, parcours visiteurs, volumes, mat\u00e9riaux, signal\u00e9tique, plans techniques, fabrication et pose.\",\n      capTitle: \"EXPERTISE\",\n      cap1: \"\u00c9v\u00e9nements de marque \u00e0 Rennes\",\n      cap2: \"Pop-up stores & retail rennais\",\n      cap3: \"Stands de salon sur mesure\",\n      cap4: \"Mapping vid\u00e9o \u00e9v\u00e9nementiel\",\n      cap5: \"Expositions, galeries & culture\",\n      cap6: \"Activations immersives en Bretagne\",\n      startProject: \"D\u00c9MARRER UN PROJET\",\n      projectsLabel: \"[ CARNET \/ 2011 \u2014 2026 ]\",\n      projectsTitle: \"CARNET\",\n      projectsCallout1: \"Plus qu'une <em>sc\u00e9nographie<\/em>, un <em>r\u00e9cit<\/em> physique.\",\n      projectsCallout2: \"<em>Quatorze ann\u00e9es<\/em> \u00e0 transformer des espaces en <em>exp\u00e9riences<\/em>.\",\n      projectsCta: \"VOIR TOUS LES PROJETS\",\n      seeProject: \"VOIR PROJET\",\n      dualctaLeftEyebrow: \"Le projet\",\n      dualctaLeftTitle: \"CONCEVOIR\",\n      dualctaLeftDesc: \"Un projet en t\u00eate ? Parlons-en. Brief, direction artistique, chiffrage ; on vous r\u00e9pond vite et concr\u00e8tement.\",\n      dualctaRightEyebrow: \"Les projets\",\n      dualctaRightTitle: \"EXPLORER\",\n      dualctaRightDesc: \"Plus de 1 200 projets livr\u00e9s depuis 2011. Stands, pop-up stores, expositions ; la preuve par l'exemple.\",\n      trustLabel: \"[ STANDS \u00b7 \u00c9V\u00c9NEMENTS \u00b7 EXPOSITIONS \u00b7 RETAIL \/ 2011 \u2014 2026 ]\",\n      sculpterMLabel: \"[ DU BRIEF AU MONTAGE ]\",\n      menuHome: \"Accueil\",\n      menuStudio: \"Le Studio\",\n      menuManifeste: \"Manifeste\",\n      menuProjets: \"Projets\",\n      menuContact: \"Contact\",\n      localKicker: \"[ RENNES \/ BRETAGNE ]\",\n      localTitle: \"Agence de sc\u00e9nographie \u00e0 Rennes pour stands, \u00e9v\u00e9nements et expositions\",\n      localP1: \"Nous accompagnons les entreprises, agences, institutions et lieux culturels dans la conception de leurs espaces. <span class=\\\"sf-local-mark\\\">Stand de salon, lancement de produit, pop-up store, exposition, convention ou d\u00e9cor \u00e9v\u00e9nementiel<\/span> : chaque projet est pens\u00e9 pour \u00eatre clair, visible et r\u00e9alisable.\",\n      localP2: \"Nous partons du lieu et des contraintes concr\u00e8tes : surface, acc\u00e8s livraison, accroches, normes de s\u00e9curit\u00e9, temps de montage, circulation du public et d\u00e9montage. L'objectif est simple : <span class=\\\"sf-local-mark\\\">cr\u00e9er un espace qui sert votre message et fonctionne le jour J.<\/span>\",\n      localCard1Title: \"Salons & stands\",\n      localCard1Text: \"Conception de stands sur mesure pour salons professionnels, foires, congr\u00e8s, rendez-vous B2B et lancements de produits.\",\n      localCard2Title: \"Retail \u00e9ph\u00e9m\u00e8re\",\n      localCard2Text: \"Cr\u00e9ation de pop-up stores, corners, vitrines, animations commerciales et espaces de marque en centre commercial ou boutique temporaire.\",\n      localCard3Title: \"\u00c9v\u00e9nements de marque\",\n      localCard3Text: \"D\u00e9cors, entr\u00e9es, photocalls, signal\u00e9tique, espaces d'accueil et parcours invit\u00e9s pour conventions, inaugurations et soir\u00e9es de marque.\",\n      localCard4Title: \"Expositions & culture\",\n      localCard4Text: \"Sc\u00e9nographie d'exposition, parcours de visite, soclage, signal\u00e9tique et installations pour galeries, institutions et lieux culturels.\",\n      localFaq1Q: \"Intervention \u00e0 Rennes\",\n      localFaq1A: \"Nous intervenons \u00e0 Rennes, en Ille-et-Vilaine, en Bretagne et dans le Grand Ouest pour des salons, centres commerciaux, lieux culturels, si\u00e8ges d'entreprise, festivals et espaces \u00e9v\u00e9nementiels.\",\n      localFaq2Q: \"Fabrication & pose\",\n      localFaq2A: \"Nous pouvons prendre en charge la direction artistique, les plans techniques, la fabrication, la coordination des prestataires, la pose et le d\u00e9montage.\",\n      localFaq3Q: \"D\u00e9lais projet\",\n      localFaq3A: \"Pour un stand, un pop-up store, une exposition ou un d\u00e9cor \u00e9v\u00e9nementiel, nous cadrons rapidement le besoin afin de proposer une solution adapt\u00e9e au d\u00e9lai et au budget.\",\n      manifesteEyebrow: \"[ Signature locale ]\",\n      manifesteHeadline: \"\u00c0 Rennes, nous concevons des espaces pour des marques, des institutions et des lieux qui ont besoin d'\u00eatre vus, compris et retenus. Un stand, un d\u00e9cor ou une exposition doit guider un <em class=\\\"sf-manifeste-accent\\\">public<\/em>, clarifier un <em class=\\\"sf-manifeste-accent\\\">message<\/em> et donner envie de s'arr\u00eater. <span class=\\\"sf-manifeste-mark\\\">Sc\u00e9nographie<\/span> Rennes transforme une id\u00e9e en espace pr\u00eat \u00e0 \u00eatre produit.\",\n      manifesteLink: \"Lire le manifeste complet\"\n    },\n    en: {\n      hero1: \"SCENOGRAPHY\",\n      hero2: \"RENNES\",\n      heroDesc: \"Scenography in Rennes and Brittany \u2014 stand design, event sets, pop-up stores, exhibitions and brand spaces.\",\n      hl1a: \"DESIGN\",\n      hl1b: \"ON SITE\",\n      sculpterP1: \"We design each project with the venue in mind from the start: access, build time, visitor flow, safety, dismantling and expected finish level.\",\n      sculpterP2: \"From brief to installation, we frame the creative direction, drawings, fabrication, logistics and install to deliver a clean result on opening day.\",\n      allProjects: \"ALL PROJECTS\",\n      immersionTitle: \"DELIVERY\",\n      imm1: \"Our work covers art direction, drawings, material choices, fabrication, supplier coordination and on-site installation.\",\n      imm2: \"For a stand, launch, exhibition or event set, we balance visual impact, technical constraints, budget and timing.\",\n      immersionCaption: \"Scenography designed for many kinds of venues: trade shows, shopping centers, product launches, exhibitions, festivals, headquarters and cultural spaces.\",\n      capIntro1: \"Before designing, we clarify the need: event objective, expected audience, available surface, venue constraints, budget, timing and finish level.\",\n      capIntro2: \"Then we build a usable response: creative direction, visitor journey, volumes, materials, wayfinding, technical drawings, fabrication and installation.\",\n      capTitle: \"EXPERTISE\",\n      cap1: \"Brand events in Rennes\",\n      cap2: \"Pop-up stores & Rennes retail\",\n      cap3: \"Custom trade show stands\",\n      cap4: \"Video mapping for events\",\n      cap5: \"Exhibitions, galleries & culture\",\n      cap6: \"Immersive activations in Brittany\",\n      startProject: \"START A PROJECT\",\n      projectsLabel: \"[ NOTEBOOK \/ 2011 \u2014 2026 ]\",\n      projectsTitle: \"NOTEBOOK\",\n      projectsCallout1: \"More than <em>scenography<\/em>, a physical <em>narrative<\/em>.\",\n      projectsCallout2: \"<em>Fourteen years<\/em> turning spaces into <em>experiences<\/em>.\",\n      projectsCta: \"VIEW ALL PROJECTS\",\n      seeProject: \"VIEW PROJECT\",\n      dualctaLeftEyebrow: \"The project\",\n      dualctaLeftTitle: \"DESIGN\",\n      dualctaLeftDesc: \"Got a project in mind? Let's talk. Brief, art direction, quote ; a fast, concrete reply.\",\n      dualctaRightEyebrow: \"The projects\",\n      dualctaRightTitle: \"EXPLORE\",\n      dualctaRightDesc: \"Over 1,200 projects delivered since 2011. Stands, pop-up stores, exhibitions ; see for yourself.\",\n      trustLabel: \"[ RENNES \u00b7 BRITTANY \u00b7 WESTERN FRANCE REFERENCES \/ 2011 \u2014 2026 ]\",\n      sculpterMLabel: \"[ BRIEF TO INSTALL ]\",\n      menuHome: \"Home\",\n      menuStudio: \"The Studio\",\n      menuManifeste: \"Manifesto\",\n      menuProjets: \"Work\",\n      menuContact: \"Contact\",\n      localKicker: \"[ RENNES \/ BRETAGNE ]\",\n      localTitle: \"Scenography agency in Rennes for stands, events and exhibitions\",\n      localP1: \"We support companies, agencies, institutions and cultural venues in the design of their spaces. Trade show stand, product launch, pop-up store, exhibition, convention or event set: each project is designed to be clear, visible and buildable.\",\n      localP2: \"We start from the venue and its practical constraints: surface, delivery access, rigging, safety rules, build time, visitor circulation and dismantling. The goal is simple: create a space that serves your message and works on opening day.\",\n      localCard1Title: \"Trade shows & stands\",\n      localCard1Text: \"Custom stand design for professional fairs, trade shows, congresses, B2B meetings and product launches.\",\n      localCard2Title: \"Temporary retail\",\n      localCard2Text: \"Pop-up stores, corners, windows, commercial activations and brand spaces in shopping centers or temporary retail spaces.\",\n      localCard3Title: \"Brand events\",\n      localCard3Text: \"Sets, entrances, photocalls, wayfinding, welcome areas and guest journeys for conventions, openings and brand events.\",\n      localCard4Title: \"Exhibitions & culture\",\n      localCard4Text: \"Exhibition scenography, visitor routes, plinths, wayfinding and installations for galleries, institutions and cultural venues.\",\n      localFaq1Q: \"Rennes projects\",\n      localFaq1A: \"We work in Rennes, Ille-et-Vilaine, Brittany and western France for trade shows, shopping centers, cultural venues, company headquarters, festivals and event spaces.\",\n      localFaq2Q: \"Fabrication & install\",\n      localFaq2A: \"Art direction, technical drawings, fabrication, coordination and on-site installation can be managed as one chain to protect schedule, budget and final result.\",\n      localFaq3Q: \"Project timing\",\n      localFaq3A: \"For a stand, pop-up or event set, we quickly frame the ambition, venue constraints and production priorities to propose a realistic response.\",\n      manifesteEyebrow: \"[ Local signature ]\",\n      manifesteHeadline: \"In Rennes, we design spaces for brands, institutions and venues that need to be seen, understood and remembered. A stand, set or exhibition must guide an <em class=\\\"sf-manifeste-accent\\\">audience<\/em>, clarify a <em class=\\\"sf-manifeste-accent\\\">message<\/em> and make people stop. <span class=\\\"sf-manifeste-mark\\\">Sc\u00e9nographie<\/span> Rennes turns an idea into a space ready to be produced.\",\n      manifesteLink: \"Read the full manifesto\"\n    }\n  };\n\n  let currentLang = 'fr';\n  try {\n    const saved = localStorage.getItem(STORE_KEY);\n    if (saved === 'fr' || saved === 'en') currentLang = saved;\n  } catch(e){}\n\n  window.sfSetLang = function setLang(lang) {\n    currentLang = lang;\n    document.documentElement.setAttribute('lang', lang);\n    try { localStorage.setItem(STORE_KEY, lang); } catch(e){}\n    document.querySelectorAll('.sf-flag').forEach(f => f.classList.remove('active'));\n    const active = document.getElementById('lang-' + lang);\n    if (active) active.classList.add('active');\n    document.querySelectorAll('[data-key]').forEach(el => {\n      const v = translations[lang] && translations[lang][el.getAttribute('data-key')];\n      if (v !== undefined) el.innerHTML = v;\n    });\n    if (typeof setupManifeste === 'function') setupManifeste();\n    if (window.ScrollTrigger) ScrollTrigger.refresh();\n  };\n\n  document.addEventListener('click', e => {\n    const flag = e.target.closest('.sf-flag');\n    if (!flag) return;\n    window.sfSetLang(flag.id === 'lang-en' ? 'en' : 'fr');\n  });\n\n  window.sfSetLang(currentLang);\n\n});\n\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  \/\/ MANIFESTE \u2014 split words + scroll-driven bg\/text\/reveal\n  \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  function splitManifesteWords(element) {\n    const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);\n    const textNodes = [];\n    let node;\n    while ((node = walker.nextNode())) textNodes.push(node);\n    textNodes.forEach(tn => {\n      const text = tn.textContent;\n      if (!text.trim()) return;\n      const frag = document.createDocumentFragment();\n      const parts = text.split(\/(\\s+)\/);\n      parts.forEach(part => {\n        if (!part) return;\n        if (\/\\s+\/.test(part)) {\n          frag.appendChild(document.createTextNode(part));\n        } else {\n          const span = document.createElement('span');\n          span.className = 'sf-manifeste-word';\n          span.textContent = part;\n          frag.appendChild(span);\n        }\n      });\n      tn.parentNode.replaceChild(frag, tn);\n    });\n  }\n\n  let manifesteScrollTriggers = [];\n  function setupManifeste() {\n    const section = document.querySelector('.sf-manifeste');\n    const headline = document.querySelector('.sf-manifeste-headline');\n    if (!section || !headline) return;\n\n    manifesteScrollTriggers.forEach(st => st.kill());\n    manifesteScrollTriggers = [];\n\n    splitManifesteWords(headline);\n    gsap.set('.sf-manifeste-word', { opacity: 0.1, y: 8 });\n    headline.classList.add('is-ready');\n\n    const bgTl = gsap.timeline({\n      scrollTrigger: {\n        trigger: section,\n        start: 'top bottom',\n        end: 'bottom top',\n        scrub: 1.2,\n        onUpdate: (self) => {\n          const p = self.progress;\n          const isDark = p > 0.22 && p < 0.78;\n          section.dataset.sectionColor = isDark ? 'dark' : 'light';\n        }\n      }\n    });\n    bgTl\n      .to(section, { backgroundColor: '#1a1a1a', color: '#E5E5E5', ease: 'none', duration: 1 })\n      .to(section, { backgroundColor: '#D2D2D2', color: '#242424', ease: 'none', duration: 1 });\n    if (bgTl.scrollTrigger) manifesteScrollTriggers.push(bgTl.scrollTrigger);\n\n    const wordTween = gsap.fromTo('.sf-manifeste-word',\n      { opacity: 0.1, y: 8 },\n      {\n        opacity: 1,\n        y: 0,\n        stagger: 0.025,\n        ease: 'power2.out',\n        scrollTrigger: {\n          trigger: section,\n          start: 'top 78%',\n          end: 'center 45%',\n          scrub: 1\n        }\n      }\n    );\n    if (wordTween.scrollTrigger) manifesteScrollTriggers.push(wordTween.scrollTrigger);\n  }\n\n  if (window.gsap && window.ScrollTrigger) {\n    setupManifeste();\n  } else {\n    window.addEventListener('load', setupManifeste);\n  }\n\n<\/script>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     SCRIPT SCULPTER \u2014 SCRUB VID\u00c9O PILOT\u00c9 AU SCROLL (timeline)\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Au scroll : la section se bloque (pin), currentTime de la vid\u00e9o suit\n     la progression 0 \u2192 100 %. Quand la vid\u00e9o est finie, le scroll reprend.\n     Optimisations anti-saccade : pr\u00e9chargement blob + interpolation rAF.\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<script>\n(function () {\n  'use strict';\n  if (window.__sfsvInit) return;\n  window.__sfsvInit = true;\n\n  function init() {\n    var section = document.querySelector('.sfsv');\n    if (!section) return;\n    var video = section.querySelector('#sfsv-video');\n    var frame = section.querySelector('.sfsv-frame');\n    var bar   = section.querySelector('#sfsv-bar');\n    if (!video || !frame) return;\n\n    var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    var mobile = window.matchMedia('(max-width: 768px)').matches;\n\n    \/\/ Sur mobile, la section desktop .sfsv est masqu\u00e9e (sf-desktop-only) et\n    \/\/ c'est la section originale .sf-sculpter-m qui prend le relais.\n    if (mobile) return;\n\n    \/\/ Reveal du texte \u00e9ditorial\n    function revealText() {\n      section.querySelectorAll('.sfsv-reveal').forEach(function (el, i) {\n        el.style.transition = 'opacity .9s cubic-bezier(.22,1,.36,1) ' + (i*0.08) + 's, transform .9s cubic-bezier(.22,1,.36,1) ' + (i*0.08) + 's';\n        el.style.opacity = '1';\n        el.style.transform = 'translateY(0)';\n      });\n      section.querySelectorAll('.sfsv-line > span').forEach(function (s, i) {\n        s.style.transition = 'transform 1s cubic-bezier(.22,1,.36,1) ' + (i*0.1) + 's';\n        s.style.transform = 'translateY(0)';\n      });\n    }\n\n    \/\/ \u2500\u2500 MOBILE \/ REDUCED-MOTION : pas de scrub (mauvais sur mobile).\n    \/\/    Vid\u00e9o en lecture loop classique + texte r\u00e9v\u00e9l\u00e9 \u00e0 l'entr\u00e9e. \u2500\u2500\n    if (mobile || reduce || !(window.gsap && window.ScrollTrigger)) {\n      frame.style.clipPath = 'none'; frame.style.webkitClipPath = 'none';\n      video.style.transform = 'none';\n      if (reduce) { video.pause(); }\n      else { video.muted = true; video.loop = true; var p = video.play(); if (p && p.catch) p.catch(function(){}); }\n      var io = new IntersectionObserver(function (e, o) {\n        e.forEach(function (en) { if (en.isIntersecting) { revealText(); o.disconnect(); } });\n      }, { threshold: 0.25 });\n      io.observe(section);\n      return;\n    }\n\n    \/\/ \u2500\u2500 DESKTOP\/TABLETTE : SCRUB pilot\u00e9 par le scroll \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    gsap.registerPlugin(ScrollTrigger);\n\n    \/\/ La vid\u00e9o ne joue PAS toute seule : c'est le scroll qui la fait avancer.\n    video.muted = true;\n    video.loop = false;\n    video.autoplay = false;\n    video.pause();\n\n    \/\/ Astuce anti-saccade : on pr\u00e9charge la vid\u00e9o en blob (d\u00e9codage local\n    \/\/ plus r\u00e9actif au seek que le streaming progressif r\u00e9seau).\n    function preloadBlob() {\n      var src = video.querySelector('source');\n      if (!src) return;\n      fetch(src.src)\n        .then(function (r) { return r.blob(); })\n        .then(function (b) {\n          var url = URL.createObjectURL(b);\n          video.src = url;       \/\/ remplace par la source locale\n          video.load();\n        })\n        .catch(function () { \/* si CORS bloque, on garde la source r\u00e9seau *\/ });\n    }\n    preloadBlob();\n\n    var duration = 0;\n    var targetTime = 0;\n    var rafId = null;\n\n    function onReady() {\n      duration = video.duration || 0;\n      ScrollTrigger.refresh();\n    }\n    if (video.readyState >= 1 && video.duration) onReady();\n    video.addEventListener('loadedmetadata', onReady);\n    video.addEventListener('durationchange', onReady);\n\n    \/\/ Boucle d'interpolation : rapproche currentTime de la cible en douceur.\n    \/\/ (assignation directe = saccad\u00e9 ; lissage = beaucoup plus fluide)\n    function smooth() {\n      if (duration) {\n        var cur = video.currentTime;\n        var diff = targetTime - cur;\n        if (Math.abs(diff) > 0.005) {\n          \/\/ pas de lissage : 0.25 = r\u00e9actif mais fluide\n          var next = cur + diff * 0.25;\n          \/\/ garde-fou bornes\n          if (next < 0) next = 0;\n          if (next > duration) next = duration;\n          try { video.currentTime = next; } catch (e) {}\n        }\n      }\n      rafId = requestAnimationFrame(smooth);\n    }\n    rafId = requestAnimationFrame(smooth);\n\n    \/\/ R\u00c9GLAGE : dur\u00e9e du pin. Plus c'est grand, plus le scrub est lent.\n    var pinVh = parseInt(section.getAttribute('data-pin-vh'), 10) || 250;\n    section.style.height = pinVh + 'vh';\n\n    \/\/ Ouverture clip-path + scale sur le tout d\u00e9but (effet d'entr\u00e9e),\n    \/\/ puis la vid\u00e9o scrub sur le reste.\n    function setEnter(p) { \/\/ clip-path d'entr\u00e9e d\u00e9sactiv\u00e9 : image pleine direct\n      frame.style.clipPath = 'inset(0 0 0 0)';\n      frame.style.webkitClipPath = 'inset(0 0 0 0)';\n      video.style.transform = 'scale(1)';\n    }\n    setEnter(1);\n\n    ScrollTrigger.create({\n      trigger: section,\n      start: 'top top',\n      end: 'bottom bottom',\n      pin: '.sfsv-pin',\n      pinSpacing: false,\n      scrub: true,\n      onUpdate: function (self) {\n        var prog = self.progress;\n        \/\/ Plus d'entr\u00e9e clip-path : la vid\u00e9o scrub sur toute la dur\u00e9e du pin.\n        if (duration) {\n          targetTime = prog * duration;\n          if (bar) bar.style.width = (prog * 100) + '%';\n        }\n      }\n    });\n\n    ScrollTrigger.create({ trigger: section, start: 'top 70%', once: true, onEnter: revealText });\n    ScrollTrigger.refresh();\n\n    window.addEventListener('beforeunload', function () { if (rafId) cancelAnimationFrame(rafId); });\n  }\n\n  function boot() {\n    var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    var mobile = window.matchMedia('(max-width: 768px)').matches;\n    if (reduce || mobile) { init(); return; }\n    var t = 0;\n    (function wait() {\n      if (window.gsap && window.ScrollTrigger) { init(); return; }\n      if (t++ > 40) { init(); return; }\n      setTimeout(wait, 50);\n    })();\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\n  else boot();\n})();\n<\/script>\n\n\n\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-755c76d elementor-widget elementor-widget-html\" data-id=\"755c76d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\n  <title>Footer \u2014 Sc\u00e9nographie France v3.7 r\u00e9seaux contact<\/title>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n  <style>\n\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    html, body { background: #D2D2D2; }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       SC\u00c9NOGRAPHIE FRANCE \u2014 FOOTER v3.4\n       \u25b8 v3.4 : trait fluo top retir\u00e9 \u00b7 statement anim\u00e9 au scroll \u00b7\n         marquee pilot\u00e9 en JS (rAF) = immunis\u00e9 aux resets CSS tiers\n       \u25b8 ID #sf-footer-root = bouclier CSS sp\u00e9cificit\u00e9 (1,0,0)\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n    #sf-footer-root {\n      --sf-lime: #D5FF00;\n      --sf-dark: #1a1a1a;\n      --sf-bg:   #D2D2D2;\n      --sf-px:   clamp(28px, 5.5vw, 88px);\n\n      display: block !important;\n      width: 100% !important;\n      background: #D2D2D2 !important;\n      padding: 0 clamp(8px, 1.2vw, 16px) !important;\n      position: relative !important;\n      margin: 0 !important;\n      float: none !important;\n      contain: layout style;\n      font-family: 'Inter', sans-serif !important;\n      font-size: 16px !important;\n      line-height: 1.5 !important;\n      -webkit-font-smoothing: antialiased;\n      box-shadow: none !important;\n      border: none !important;\n      transform: none !important;\n      opacity: 1 !important;\n      visibility: visible !important;\n    }\n\n    #sf-footer-root *,\n    #sf-footer-root *::before,\n    #sf-footer-root *::after { box-sizing: border-box; }\n\n    \/* RESET liens *\/\n    #sf-footer-root a,\n    #sf-footer-root a:link,\n    #sf-footer-root a:visited {\n      text-decoration: none !important;\n      border: none !important;\n      outline: none !important;\n      box-shadow: none !important;\n      background: transparent !important;\n      -webkit-tap-highlight-color: transparent !important;\n    }\n    #sf-footer-root a:focus,\n    #sf-footer-root a:focus-visible {\n      outline: none !important;\n      box-shadow: none !important;\n    }\n\n    \/* RESET images *\/\n    #sf-footer-root img {\n      display: inline-block !important;\n      vertical-align: middle !important;\n      border: none !important;\n      outline: none !important;\n      box-shadow: none !important;\n      border-radius: 0 !important;\n      max-width: none !important;\n      width: auto !important;\n    }\n\n    \/* RESET headings *\/\n    #sf-footer-root h1, #sf-footer-root h2,\n    #sf-footer-root h3, #sf-footer-root h4 {\n      margin: 0 !important; padding: 0 !important;\n      border: none !important; background: transparent !important;\n    }\n\n    \/* RESET p, ul, li *\/\n    #sf-footer-root p  { margin: 0 !important; padding: 0 !important; }\n    #sf-footer-root ul, #sf-footer-root ol, #sf-footer-root li {\n      list-style: none !important; margin: 0 !important; padding: 0 !important;\n    }\n\n    \/* RESET div *\/\n    #sf-footer-root div {\n      margin: 0; padding: 0; border: none;\n      background: transparent; float: none;\n    }\n\n    \/* \u2500\u2500 CARD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-card {\n      background: #1a1a1a !important;\n      border-radius: 0 0 22px 22px !important;\n      position: relative !important;\n      overflow: hidden !important;\n    }\n\n    \/* \u2500\u2500 v3.4 : BORDURE LAT\u00c9RALE \/ BAS NEUTRE (trait fluo top retir\u00e9) \u2500\u2500\n       On garde une bordure tr\u00e8s discr\u00e8te sur les c\u00f4t\u00e9s + bas pour\n       d\u00e9limiter la carte sombre sur fond gris, mais SANS lime ni glow.\n       Le haut reste totalement libre (encoche propre sans surlignage). *\/\n    #sf-footer-root .sf-card-border {\n      position: absolute !important; inset: 0 !important;\n      pointer-events: none !important; z-index: 20 !important;\n      border-radius: 0 0 22px 22px !important;\n      box-shadow:\n        inset  1px 0 0 rgba(229,229,229,.06),\n        inset -1px 0 0 rgba(229,229,229,.06),\n        inset 0 -1px 0 rgba(229,229,229,.06) !important;\n    }\n    \/* ::after (ancien halo lime interne) neutralis\u00e9 *\/\n    #sf-footer-root .sf-card-border::after {\n      content: none !important;\n    }\n\n    \/* \u2500\u2500 TOPO \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-topo {\n      position: absolute !important; inset: 0 !important;\n      pointer-events: none !important; opacity: .05 !important;\n      z-index: 1 !important;\n      background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='900' height='700'%3E%3Cg fill='none' stroke='%23D5FF00' stroke-width='1'%3E%3Cellipse cx='450' cy='350' rx='420' ry='320'\/%3E%3Cellipse cx='450' cy='350' rx='350' ry='260'\/%3E%3Cellipse cx='450' cy='350' rx='280' ry='200'\/%3E%3Cellipse cx='450' cy='350' rx='210' ry='140'\/%3E%3Cellipse cx='450' cy='350' rx='140' ry='80'\/%3E%3Cellipse cx='150' cy='140' rx='130' ry='100'\/%3E%3Cellipse cx='150' cy='140' rx='80' ry='60'\/%3E%3Cellipse cx='750' cy='560' rx='160' ry='120'\/%3E%3Cellipse cx='750' cy='560' rx='100' ry='70'\/%3E%3C\/g%3E%3C\/svg%3E\") !important;\n      background-size: 900px 700px !important;\n    }\n\n    \/* \u2500\u2500 SVG ENCOCHES (v3.4 : trait lime + glow retir\u00e9s) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-top-svg {\n      position: absolute !important;\n      top: 0 !important; left: 0 !important; right: 0 !important;\n      width: 100% !important; height: 60px !important;\n      pointer-events: none !important; z-index: 10 !important;\n      display: block !important;\n      padding: 0 !important; margin: 0 !important;\n      background: transparent !important;\n    }\n    #sf-footer-root .sf-top-svg-mobile {\n      position: absolute !important;\n      top: 0 !important; left: 0 !important; right: 0 !important;\n      width: 100% !important; height: 48px !important;\n      pointer-events: none !important; z-index: 10 !important;\n      display: none !important;\n      padding: 0 !important; margin: 0 !important;\n      background: transparent !important;\n    }\n\n    \/* \u2500\u2500 INNER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-inner {\n      position: relative !important; z-index: 2 !important;\n      padding-top: 76px !important;\n    }\n\n    \/* \u2500\u2500 NAV \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-nav {\n      display: flex !important;\n      justify-content: space-between !important;\n      align-items: flex-start !important;\n      padding: 0 var(--sf-px) !important;\n      gap: 40px !important;\n    }\n    #sf-footer-root .sf-col {\n      display: flex !important; flex-direction: column !important;\n    }\n    #sf-footer-root .sf-eyebrow {\n      font-family: 'JetBrains Mono', monospace !important;\n      font-size: 9px !important; letter-spacing: .26em !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.38) !important;\n      margin-bottom: 16px !important; line-height: 1 !important;\n    }\n\n    #sf-footer-root .sf-nav-link {\n      font-family: 'Inter', sans-serif !important;\n      font-weight: 900 !important;\n      font-size: clamp(20px, 2.4vw, 32px) !important;\n      letter-spacing: -.025em !important; line-height: 1.06 !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.9) !important;\n      display: block !important; margin-bottom: 2px !important;\n      transition: color 0.2s ease !important;\n    }\n    #sf-footer-root .sf-nav-link:hover,\n    #sf-footer-root .sf-nav-link:focus {\n      color: #D5FF00 !important;\n      text-decoration: none !important; background: transparent !important;\n      box-shadow: none !important; transform: none !important;\n    }\n\n    #sf-footer-root .sf-nav-link-accent {\n      font-size: clamp(12px, 1.1vw, 16px) !important;\n      font-weight: 700 !important; color: #D5FF00 !important;\n      margin-top: 12px !important; letter-spacing: -.01em !important;\n      transition: color 0.2s ease !important;\n    }\n    #sf-footer-root .sf-nav-link-accent:hover,\n    #sf-footer-root .sf-nav-link-accent:focus {\n      color: rgba(229,229,229,.9) !important;\n      background: transparent !important; box-shadow: none !important;\n      transform: none !important;\n    }\n\n    #sf-footer-root .sf-col-right { text-align: right !important; }\n\n    \/* \u2500\u2500 COL R\u00c9SEAUX (3e colonne d\u00e9di\u00e9e, ic\u00f4nes SVG) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-social-row {\n      display: flex !important;\n      gap: 12px !important;\n      margin-top: 2px !important;\n    }\n    #sf-footer-root .sf-social-link {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 42px !important;\n      height: 42px !important;\n      border: 1px solid rgba(229,229,229,.18) !important;\n      border-radius: 999px !important;\n      color: rgba(229,229,229,.82) !important;\n      transition: color 0.22s ease, border-color 0.22s ease, background 0.22s ease !important;\n    }\n    #sf-footer-root .sf-social-link svg {\n      width: 22px !important;\n      height: 22px !important;\n      display: block !important;\n    }\n    #sf-footer-root .sf-social-link:hover,\n    #sf-footer-root .sf-social-link:focus {\n      color: #1a1a1a !important;\n      background: #D5FF00 !important;\n      border-color: #D5FF00 !important;\n      box-shadow: none !important;\n      transform: none !important;\n    }\n\n    #sf-footer-root .sf-contact-link {\n      font-family: 'Inter', sans-serif !important;\n      font-weight: 500 !important;\n      font-size: clamp(14px, 1.5vw, 22px) !important;\n      letter-spacing: -.015em !important; line-height: 1.3 !important;\n      color: rgba(229,229,229,.88) !important;\n      display: block !important;\n      transition: color 0.2s ease !important;\n    }\n    #sf-footer-root .sf-contact-link + .sf-contact-link { margin-top: 6px !important; }\n    #sf-footer-root .sf-contact-link:hover,\n    #sf-footer-root .sf-contact-link:focus {\n      color: #D5FF00 !important;\n      text-decoration: none !important; background: transparent !important;\n      box-shadow: none !important; transform: none !important;\n    }\n\n    #sf-footer-root .sf-contact-meta {\n      font-family: 'JetBrains Mono', monospace !important;\n      font-size: 10px !important; letter-spacing: .16em !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.3) !important;\n      margin-top: 16px !important; line-height: 2 !important;\n    }\n\n    \/* \u2500\u2500 STATEMENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-statement {\n      text-align: center !important;\n      padding: clamp(40px,6vw,80px) var(--sf-px) clamp(28px,4vw,56px) !important;\n    }\n    #sf-footer-root .sf-statement h2 {\n      font-family: 'Inter', sans-serif !important;\n      font-weight: 900 !important;\n      font-size: clamp(36px, 6vw, 82px) !important;\n      line-height: 1.04 !important; letter-spacing: -.045em !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.92) !important;\n    }\n    #sf-footer-root .sf-statement h2 em {\n      font-style: normal !important;\n      font-family: 'Inter', sans-serif !important;\n      font-weight: 900 !important;\n      text-transform: uppercase !important;\n      background: #D5FF00 !important;\n      color: #1a1a1a !important;\n      padding: 0.02em 0.06em !important;\n      -webkit-box-decoration-break: clone !important;\n              box-decoration-break: clone !important;\n    }\n\n    \/* \u2500\u2500 v3.5 : ANIMATION STATEMENT \u2014 reveal au scroll + shiny sweep \u2500\u2500\n       \u00c9tape 1 (reveal)  : chaque mot monte depuis le bas (mask overflow).\n       \u00c9tape 2 (shiny)   : une fois r\u00e9v\u00e9l\u00e9, un d\u00e9grad\u00e9 clair balaie le\n       texte en boucle (adapt\u00e9 du composant \"animated-shiny-text\" en CSS\n       pur \u2014 pas de React\/framer-motion dans un bloc Elementor).\n       Le sweep est en couleur (gris clair \u2192 blanc \u2192 gris clair) et ne\n       touche PAS le <em> soulign\u00e9 lime, qui garde son traitement. *\/\n    #sf-footer-root .sf-word {\n      display: inline-block !important;\n      overflow: hidden !important;\n      vertical-align: top !important;\n    }\n    \/* Les mots surlign\u00e9s ne doivent pas couper le fond lime (padding) *\/\n    #sf-footer-root .sf-word--em {\n      overflow: visible !important;\n    }\n    #sf-footer-root .sf-word > span {\n      display: inline-block !important;\n      transform: translateY(115%) rotate(2deg);\n      opacity: 0;\n      transition:\n        transform 1s cubic-bezier(0.16, 1, 0.3, 1),\n        opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1);\n      transition-delay: var(--sf-word-delay, 0ms);\n      will-change: transform, opacity;\n    }\n    #sf-footer-root .sf-statement.is-revealed .sf-word > span {\n      transform: translateY(0) rotate(0deg);\n      opacity: 1;\n    }\n\n    \/* SHINY SWEEP : activ\u00e9 seulement apr\u00e8s le reveal complet (classe\n       .is-shiny ajout\u00e9e par JS apr\u00e8s la fin du dernier mot).\n       On l'applique sur les mots NON-em. Technique : background-clip\n       text + d\u00e9grad\u00e9 anim\u00e9 en background-position. *\/\n    #sf-footer-root .sf-statement.is-shiny .sf-word:not(.sf-word--em) > span {\n      background: none !important;\n      -webkit-background-clip: border-box !important;\n              background-clip: border-box !important;\n      -webkit-text-fill-color: rgba(229,229,229,.92) !important;\n      color: rgba(229,229,229,.92) !important;\n      -webkit-animation: none !important;\n              animation: none !important;\n    }\n    @-webkit-keyframes sf-shiny-sweep {\n      0%   { background-position: 180% 0; }\n      100% { background-position: -80% 0; }\n    }\n    @keyframes sf-shiny-sweep {\n      0%   { background-position: 180% 0; }\n      100% { background-position: -80% 0; }\n    }\n\n    \/* em : SURLIGNAGE lime FIXE \u2014 fond lime continu derri\u00e8re les mots,\n       texte fonc\u00e9. Highlight toujours visible (pas d'animation de trace).\n       Le padding + margin n\u00e9gatif compense pour que le fond \"d\u00e9borde\"\n       proprement comme un vrai surligneur, et reste continu entre les mots. *\/\n    #sf-footer-root .sf-word--em > span {\n      position: relative !important;\n      background: #D5FF00 !important;\n      color: #1a1a1a !important;\n      padding: 0.02em 0.06em !important;\n      -webkit-box-decoration-break: clone !important;\n              box-decoration-break: clone !important;\n    }\n    \/* Le shiny sweep ne doit jamais toucher l'em (d\u00e9j\u00e0 exclu via :not),\n       on s'assure aussi que la couleur fonc\u00e9e prime sur tout reveal. *\/\n    #sf-footer-root .sf-statement.is-revealed .sf-word--em > span,\n    #sf-footer-root .sf-statement.is-shiny .sf-word--em > span {\n      color: #1a1a1a !important;\n      -webkit-text-fill-color: #1a1a1a !important;\n    }\n\n    \/* \u2500\u2500 MARQUEE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n       v3.5 : DOUBLE S\u00c9CURIT\u00c9.\n       Moteur principal = animation CSS (keyframe au nom unique\n       sf-marquee-roll-v35 pour z\u00e9ro collision avec la home).\n       Secours = JS rAF qui ne d\u00e9marre QUE si le CSS ne tourne pas\n       (d\u00e9tect\u00e9 via getComputedStyle). Voir le <script> en bas. *\/\n    #sf-footer-root .sf-marquee-zone {\n      border-top: 1px solid rgba(229,229,229,.1) !important;\n      border-bottom: 1px solid rgba(213,255,0,.18) !important;\n      overflow: hidden !important;\n      padding: 28px 0 36px !important;\n      -webkit-transform: translateZ(0) !important;\n              transform: translateZ(0) !important;\n      isolation: isolate !important;\n    }\n    #sf-footer-root .sf-marquee-track {\n      display: flex !important;\n      width: max-content !important;\n      -webkit-backface-visibility: hidden !important;\n              backface-visibility: hidden !important;\n      will-change: transform !important;\n      -webkit-animation: sf-marquee-roll-v35 38s linear infinite !important;\n              animation: sf-marquee-roll-v35 38s linear infinite !important;\n    }\n    \/* Pause au survol (desktop) *\/\n    #sf-footer-root .sf-marquee-track:hover {\n      -webkit-animation-play-state: paused !important;\n              animation-play-state: paused !important;\n    }\n    \/* Quand le JS de secours prend la main, il ajoute .sf-js-driven\n       qui coupe l'anim CSS pour \u00e9viter le double mouvement. *\/\n    #sf-footer-root .sf-marquee-track.sf-js-driven {\n      -webkit-animation: none !important;\n              animation: none !important;\n    }\n    @-webkit-keyframes sf-marquee-roll-v35 {\n      from { -webkit-transform: translate3d(0,0,0);    transform: translate3d(0,0,0); }\n      to   { -webkit-transform: translate3d(-50%,0,0); transform: translate3d(-50%,0,0); }\n    }\n    @keyframes sf-marquee-roll-v35 {\n      from { -webkit-transform: translate3d(0,0,0);    transform: translate3d(0,0,0); }\n      to   { -webkit-transform: translate3d(-50%,0,0); transform: translate3d(-50%,0,0); }\n    }\n    #sf-footer-root .sf-marquee-item {\n      display: flex !important; align-items: center !important;\n      padding: 0 64px !important; height: 96px !important;\n      flex-shrink: 0 !important;\n    }\n    #sf-footer-root .sf-marquee-item img {\n      height: 76px !important; width: auto !important;\n      max-width: none !important;\n      opacity: .5 !important;\n      filter: invert(1) brightness(.85) !important;\n      transition: opacity 0.3s ease !important;\n      border-radius: 0 !important;\n      box-shadow: none !important;\n      transform: none !important;\n    }\n    #sf-footer-root .sf-marquee-item:hover img {\n      opacity: .9 !important;\n      transform: none !important;\n      box-shadow: none !important;\n      border-radius: 0 !important;\n    }\n\n    \/* \u2500\u2500 LEGAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n    #sf-footer-root .sf-legal {\n      background: #161616 !important;\n      border-radius: 0 0 22px 22px !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: space-between !important;\n      padding: 22px var(--sf-px) 24px !important;\n      gap: 24px !important;\n      flex-wrap: wrap !important;\n      position: relative !important;\n      z-index: 2 !important;\n    }\n    #sf-footer-root .sf-legal-left {\n      font-family: 'JetBrains Mono', monospace !important;\n      font-size: 10px !important; letter-spacing: .18em !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.38) !important;\n    }\n    #sf-footer-root .sf-legal-left strong {\n      color: rgba(229,229,229,.6) !important; font-weight: 500 !important;\n    }\n    #sf-footer-root .sf-legal-right {\n      display: flex !important; gap: 28px !important; align-items: center !important;\n    }\n    #sf-footer-root .sf-legal-right a {\n      font-family: 'JetBrains Mono', monospace !important;\n      font-size: 10px !important; letter-spacing: .18em !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.38) !important;\n      transition: color 0.2s ease !important;\n    }\n    #sf-footer-root .sf-legal-right a:hover,\n    #sf-footer-root .sf-legal-right a:focus {\n      color: #D5FF00 !important;\n      text-decoration: none !important; background: transparent !important;\n      box-shadow: none !important; transform: none !important;\n    }\n    #sf-footer-root .sf-legal-byesteban {\n      color: rgba(213,255,0,.5) !important;\n      border-left: 1px solid rgba(213,255,0,.15) !important;\n      padding-left: 28px !important;\n    }\n    #sf-footer-root .sf-legal-byesteban:hover,\n    #sf-footer-root .sf-legal-byesteban:focus {\n      color: #D5FF00 !important;\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       \u2500\u2500 MOBILE \u2264 768px \u2500\u2500\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @media (max-width: 768px) {\n\n      \/* Garde anti-d\u00e9bordement horizontal (highlight lime + marquee) *\/\n      #sf-footer-root,\n      #sf-footer-root .sf-card,\n      #sf-footer-root .sf-inner {\n        overflow-x: clip !important;\n      }\n\n      #sf-footer-root .sf-card {\n        border-radius: 0 0 18px 18px !important;\n      }\n      #sf-footer-root .sf-card-border {\n        border-radius: 0 0 18px 18px !important;\n      }\n\n      #sf-footer-root .sf-top-svg        { display: none !important; }\n      #sf-footer-root .sf-top-svg-mobile { display: block !important; }\n\n      #sf-footer-root .sf-inner {\n        padding-top: 60px !important;\n      }\n\n      #sf-footer-root .sf-nav {\n        flex-direction: column !important;\n        gap: 48px !important;\n        padding: 0 28px !important;\n      }\n      #sf-footer-root .sf-col-right {\n        text-align: left !important;\n      }\n      #sf-footer-root .sf-social-link {\n        width: 48px !important;\n        height: 48px !important;\n      }\n      #sf-footer-root .sf-social-row {\n        gap: 14px !important;\n      }\n      #sf-footer-root .sf-eyebrow[style] {\n        text-align: left !important;\n      }\n      #sf-footer-root .sf-eyebrow {\n        font-size: 10px !important;\n        letter-spacing: .24em !important;\n        margin-bottom: 20px !important;\n      }\n\n      #sf-footer-root .sf-nav-link {\n        font-size: 30px !important;\n        line-height: 1.12 !important;\n        letter-spacing: -.03em !important;\n        margin-bottom: 2px !important;\n        padding: 4px 0 !important;\n      }\n\n      #sf-footer-root .sf-nav-link-accent {\n        display: inline-flex !important;\n        align-items: center !important;\n        justify-content: center !important;\n        font-family: 'JetBrains Mono', monospace !important;\n        font-size: 11px !important;\n        font-weight: 500 !important;\n        letter-spacing: .14em !important;\n        text-transform: uppercase !important;\n        color: #D5FF00 !important;\n        margin-top: 28px !important;\n        padding: 13px 22px !important;\n        border: 1px solid rgba(213,255,0,.55) !important;\n        border-radius: 999px !important;\n        align-self: flex-start !important;\n        background: transparent !important;\n        transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease !important;\n      }\n      #sf-footer-root .sf-nav-link-accent:hover,\n      #sf-footer-root .sf-nav-link-accent:focus,\n      #sf-footer-root .sf-nav-link-accent:active {\n        background: #D5FF00 !important;\n        color: #1a1a1a !important;\n        border-color: #D5FF00 !important;\n      }\n\n      #sf-footer-root .sf-contact-link {\n        font-size: 18px !important;\n        line-height: 1.45 !important;\n        padding: 3px 0 !important;\n      }\n      #sf-footer-root .sf-contact-link + .sf-contact-link {\n        margin-top: 4px !important;\n      }\n      #sf-footer-root .sf-contact-meta {\n        font-size: 10px !important;\n        line-height: 1.85 !important;\n        margin-top: 22px !important;\n      }\n\n      #sf-footer-root .sf-statement {\n        text-align: left !important;\n        padding: 48px 28px 36px !important;\n      }\n      #sf-footer-root .sf-statement h2 {\n        font-size: clamp(30px, 9vw, 48px) !important;\n        line-height: 1 !important;\n        letter-spacing: -.035em !important;\n      }\n      #sf-footer-root .sf-statement h2 br {\n        display: none !important;\n      }\n      #sf-footer-root .sf-word--em > span {\n        padding: 0.02em 0.05em !important;\n      }\n\n      #sf-footer-root .sf-marquee-zone {\n        padding: 22px 0 28px !important;\n      }\n      #sf-footer-root .sf-marquee-item {\n        padding: 0 36px !important;\n        height: 64px !important;\n      }\n      #sf-footer-root .sf-marquee-item img {\n        height: 44px !important;\n        opacity: .55 !important;\n      }\n\n      #sf-footer-root .sf-legal {\n        flex-direction: column !important;\n        align-items: flex-start !important;\n        gap: 14px !important;\n        padding: 22px 28px 26px !important;\n        border-radius: 0 0 18px 18px !important;\n      }\n      #sf-footer-root .sf-legal-left,\n      #sf-footer-root .sf-legal-right a {\n        font-size: 10.5px !important;\n        letter-spacing: .14em !important;\n      }\n      #sf-footer-root .sf-legal-right a {\n        padding: 4px 0 !important;\n      }\n      #sf-footer-root .sf-legal-right {\n        flex-direction: column !important;\n        align-items: flex-start !important;\n        gap: 4px !important;\n        width: 100% !important;\n      }\n      #sf-footer-root .sf-legal-byesteban {\n        border-left: none !important;\n        padding-left: 0 !important;\n      }\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       \u2500\u2500 PETIT MOBILE \u2264 380px \u2500\u2500\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @media (max-width: 380px) {\n      #sf-footer-root .sf-nav {\n        padding: 0 22px !important;\n        gap: 40px !important;\n      }\n      #sf-footer-root .sf-nav-link {\n        font-size: 28px !important;\n      }\n      #sf-footer-root .sf-contact-link {\n        font-size: 16px !important;\n      }\n      #sf-footer-root .sf-statement {\n        padding: 40px 22px 32px !important;\n      }\n      #sf-footer-root .sf-statement h2 {\n        font-size: clamp(26px, 8vw, 38px) !important;\n      }\n      #sf-footer-root .sf-marquee-item {\n        padding: 0 28px !important;\n        height: 56px !important;\n      }\n      #sf-footer-root .sf-marquee-item img {\n        height: 38px !important;\n      }\n      #sf-footer-root .sf-legal {\n        padding: 20px 22px 24px !important;\n      }\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       \u2500\u2500 REDUCED MOTION : statement r\u00e9v\u00e9l\u00e9 direct (marquee g\u00e9r\u00e9 en JS) \u2500\u2500\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @media (prefers-reduced-motion: reduce) {\n      #sf-footer-root .sf-word > span {\n        transform: none !important;\n        opacity: 1 !important;\n        transition: none !important;\n      }\n      #sf-footer-root .sf-statement.is-shiny .sf-word:not(.sf-word--em) > span {\n        -webkit-animation: none !important;\n                animation: none !important;\n        background: none !important;\n        -webkit-text-fill-color: rgba(229,229,229,.92) !important;\n                color: rgba(229,229,229,.92) !important;\n      }\n      #sf-footer-root .sf-marquee-track {\n        -webkit-animation: none !important;\n                animation: none !important;\n      }\n      #sf-footer-root *,\n      #sf-footer-root *::before,\n      #sf-footer-root *::after {\n        transition-duration: 0.01ms !important;\n      }\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       \u2500\u2500 TOUCH : feedback :active \u2500\u2500\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @media (hover: none) {\n      #sf-footer-root .sf-nav-link:active {\n        color: #D5FF00 !important;\n      }\n      #sf-footer-root .sf-contact-link:active {\n        color: #D5FF00 !important;\n      }\n      #sf-footer-root .sf-legal-right a:active {\n        color: #D5FF00 !important;\n      }\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       \u2500\u2500 iOS SAFE AREA \u2500\u2500\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @supports (padding: max(0px)) {\n      @media (max-width: 768px) {\n        #sf-footer-root .sf-legal {\n          padding-bottom: max(26px, env(safe-area-inset-bottom)) !important;\n        }\n      }\n    }\n\n    \/*\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    FOOTER TOUJOURS EN BAS \u2014 CSS GLOBAL \u00e0 ajouter dans Elementor\n    (Personnaliser > CSS additionnel OU WP Code plugin)\n\n    body {\n      display: flex !important;\n      flex-direction: column !important;\n      min-height: 100vh !important;\n    }\n    .site, .elementor-location-single,\n    .elementor-template-canvas, #page {\n      flex: 1 !important;\n    }\n    #sf-footer-root {\n      margin-top: auto !important;\n    }\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    *\/\n\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       MOBILE COMPACT OVERRIDE \u2014 v3.5\n       Objectif : mobile plus court, full #1A1A1A, desktop intact.\n       Tous les styles ci-dessous sont limit\u00e9s au mobile.\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @media (max-width: 768px) {\n      html,\n      body {\n        overflow-x: hidden !important;\n      }\n\n      #sf-footer-root {\n        --sf-px: 20px;\n        background: #1a1a1a !important;\n        padding: 0 !important;\n        margin: 0 !important;\n        width: 100vw !important;\n        max-width: 100vw !important;\n      }\n\n      #sf-footer-root .sf-card {\n        border-radius: 0 !important;\n        background: #1a1a1a !important;\n      }\n\n      #sf-footer-root .sf-card-border {\n        border-radius: 0 !important;\n        box-shadow: inset 0 -1px 0 rgba(229,229,229,.06) !important;\n      }\n\n      \/* Suppression totale de l'encoche mobile pour \u00e9viter toute zone #D2D2D2 *\/\n      #sf-footer-root .sf-top-svg,\n      #sf-footer-root .sf-top-svg-mobile {\n        display: none !important;\n      }\n\n      #sf-footer-root .sf-topo {\n        opacity: .035 !important;\n        background-size: 620px 480px !important;\n      }\n\n      #sf-footer-root .sf-inner {\n        padding-top: 28px !important;\n      }\n\n      #sf-footer-root .sf-nav {\n        flex-direction: column !important;\n        gap: 24px !important;\n        padding: 0 20px !important;\n      }\n\n      #sf-footer-root .sf-col {\n        width: 100% !important;\n      }\n\n      #sf-footer-root .sf-col-right {\n        text-align: left !important;\n      }\n\n      #sf-footer-root .sf-eyebrow,\n      #sf-footer-root .sf-eyebrow[style] {\n        text-align: left !important;\n        font-size: 8px !important;\n        letter-spacing: .20em !important;\n        margin-bottom: 10px !important;\n        line-height: 1 !important;\n      }\n\n      #sf-footer-root .sf-nav-link {\n        font-size: clamp(21px, 6.6vw, 25px) !important;\n        line-height: 1.02 !important;\n        letter-spacing: -.035em !important;\n        margin-bottom: 0 !important;\n        padding: 1px 0 !important;\n      }\n\n      #sf-footer-root .sf-nav-link-accent {\n        margin-top: 14px !important;\n        padding: 9px 15px !important;\n        font-size: 9px !important;\n        letter-spacing: .12em !important;\n        min-height: 0 !important;\n      }\n\n      #sf-footer-root .sf-social-row {\n        gap: 9px !important;\n        margin-top: 0 !important;\n      }\n\n      #sf-footer-root .sf-social-link {\n        width: 36px !important;\n        height: 36px !important;\n      }\n\n      #sf-footer-root .sf-social-link svg {\n        width: 18px !important;\n        height: 18px !important;\n      }\n\n      #sf-footer-root .sf-contact-link {\n        font-size: 15px !important;\n        line-height: 1.32 !important;\n        padding: 1px 0 !important;\n      }\n\n      #sf-footer-root .sf-contact-link + .sf-contact-link {\n        margin-top: 2px !important;\n      }\n\n      #sf-footer-root .sf-contact-meta {\n        font-size: 8px !important;\n        letter-spacing: .13em !important;\n        line-height: 1.55 !important;\n        margin-top: 10px !important;\n      }\n\n      #sf-footer-root .sf-statement {\n        text-align: left !important;\n        padding: 28px 20px 22px !important;\n      }\n\n      #sf-footer-root .sf-statement h2 {\n        font-size: clamp(24px, 7.4vw, 34px) !important;\n        line-height: .98 !important;\n        letter-spacing: -.04em !important;\n      }\n\n      #sf-footer-root .sf-statement h2 br {\n        display: none !important;\n      }\n\n      #sf-footer-root .sf-word--em > span {\n        padding: 0.01em 0.05em !important;\n      }\n\n      #sf-footer-root .sf-marquee-zone {\n        padding: 12px 0 15px !important;\n        border-top: 1px solid rgba(229,229,229,.08) !important;\n        border-bottom: 1px solid rgba(213,255,0,.12) !important;\n      }\n\n      #sf-footer-root .sf-marquee-item {\n        padding: 0 22px !important;\n        height: 42px !important;\n      }\n\n      #sf-footer-root .sf-marquee-item img {\n        height: 30px !important;\n        opacity: .5 !important;\n      }\n\n      #sf-footer-root .sf-legal {\n        flex-direction: column !important;\n        align-items: flex-start !important;\n        gap: 8px !important;\n        padding: 15px 20px 17px !important;\n        border-radius: 0 !important;\n        background: #161616 !important;\n      }\n\n      #sf-footer-root .sf-legal-left,\n      #sf-footer-root .sf-legal-right a {\n        font-size: 8px !important;\n        letter-spacing: .12em !important;\n        line-height: 1.35 !important;\n      }\n\n      #sf-footer-root .sf-legal-right {\n        flex-direction: column !important;\n        align-items: flex-start !important;\n        gap: 2px !important;\n        width: 100% !important;\n      }\n\n      #sf-footer-root .sf-legal-right a {\n        padding: 2px 0 !important;\n      }\n\n      #sf-footer-root .sf-legal-byesteban {\n        border-left: none !important;\n        padding-left: 0 !important;\n      }\n    }\n\n    @media (max-width: 380px) {\n      #sf-footer-root {\n        --sf-px: 16px;\n      }\n\n      #sf-footer-root .sf-inner {\n        padding-top: 24px !important;\n      }\n\n      #sf-footer-root .sf-nav {\n        padding: 0 16px !important;\n        gap: 22px !important;\n      }\n\n      #sf-footer-root .sf-nav-link {\n        font-size: clamp(20px, 6.4vw, 23px) !important;\n      }\n\n      #sf-footer-root .sf-nav-link-accent {\n        margin-top: 12px !important;\n        padding: 8px 13px !important;\n        font-size: 8px !important;\n      }\n\n      #sf-footer-root .sf-social-link {\n        width: 34px !important;\n        height: 34px !important;\n      }\n\n      #sf-footer-root .sf-contact-link {\n        font-size: 14px !important;\n      }\n\n      #sf-footer-root .sf-contact-meta {\n        font-size: 7.5px !important;\n        line-height: 1.5 !important;\n      }\n\n      #sf-footer-root .sf-statement {\n        padding: 24px 16px 18px !important;\n      }\n\n      #sf-footer-root .sf-statement h2 {\n        font-size: clamp(22px, 7.2vw, 30px) !important;\n      }\n\n      #sf-footer-root .sf-marquee-zone {\n        padding: 10px 0 13px !important;\n      }\n\n      #sf-footer-root .sf-marquee-item {\n        padding: 0 18px !important;\n        height: 36px !important;\n      }\n\n      #sf-footer-root .sf-marquee-item img {\n        height: 26px !important;\n      }\n\n      #sf-footer-root .sf-legal {\n        padding: 14px 16px 16px !important;\n      }\n    }\n\n    @supports (padding: max(0px)) {\n      @media (max-width: 768px) {\n        #sf-footer-root .sf-legal {\n          padding-bottom: max(17px, env(safe-area-inset-bottom)) !important;\n        }\n      }\n\n      @media (max-width: 380px) {\n        #sf-footer-root .sf-legal {\n          padding-bottom: max(16px, env(safe-area-inset-bottom)) !important;\n        }\n      }\n    }\n\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       MOBILE v3.6 \u2014 organisation resserr\u00e9e + encoche conserv\u00e9e\n       Desktop inchang\u00e9 : uniquement @media max-width 768px.\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    @media (max-width: 768px) {\n      html,\n      body {\n        background: #1a1a1a !important;\n        overflow-x: hidden !important;\n      }\n\n      #sf-footer-root {\n        --sf-px: 18px;\n        width: 100% !important;\n        max-width: 100% !important;\n        padding: 0 !important;\n        background: #1a1a1a !important;\n      }\n\n      #sf-footer-root .sf-card {\n        border-radius: 0 !important;\n        background: #1a1a1a !important;\n      }\n\n      #sf-footer-root .sf-card-border {\n        border-radius: 0 !important;\n        box-shadow: inset 0 -1px 0 rgba(229,229,229,.055) !important;\n      }\n\n      \/* On garde l'encoche visuelle mobile, mais sans longs bords gris. *\/\n      #sf-footer-root .sf-top-svg {\n        display: none !important;\n      }\n\n      #sf-footer-root .sf-top-svg-mobile {\n        display: block !important;\n        height: 46px !important;\n        top: 0 !important;\n        left: 0 !important;\n        right: 0 !important;\n        width: 100% !important;\n      }\n\n      #sf-footer-root .sf-topo {\n        opacity: .028 !important;\n        background-size: 560px 430px !important;\n      }\n\n      #sf-footer-root .sf-inner {\n        padding-top: 42px !important;\n      }\n\n      \/* Organisation mobile : pages en 2 colonnes, contact + r\u00e9seaux c\u00f4te \u00e0 c\u00f4te. *\/\n      #sf-footer-root .sf-nav {\n        display: grid !important;\n        grid-template-columns: minmax(0, 1fr) auto !important;\n        grid-template-areas:\n          \"pages pages\"\n          \"contact social\" !important;\n        gap: 20px 18px !important;\n        padding: 0 18px !important;\n        align-items: start !important;\n      }\n\n      #sf-footer-root .sf-nav > .sf-col:first-child {\n        grid-area: pages !important;\n        width: 100% !important;\n        display: grid !important;\n        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;\n        column-gap: 18px !important;\n        row-gap: 0 !important;\n      }\n\n      #sf-footer-root .sf-nav > .sf-col:first-child .sf-eyebrow {\n        grid-column: 1 \/ -1 !important;\n      }\n\n      #sf-footer-root .sf-col-social {\n        grid-area: social !important;\n        width: auto !important;\n        min-width: 84px !important;\n        align-items: flex-end !important;\n      }\n\n      #sf-footer-root .sf-col-right {\n        grid-area: contact !important;\n        width: auto !important;\n        min-width: 0 !important;\n        text-align: left !important;\n      }\n\n      #sf-footer-root .sf-eyebrow,\n      #sf-footer-root .sf-eyebrow[style] {\n        text-align: left !important;\n        font-size: 7.5px !important;\n        line-height: 1 !important;\n        letter-spacing: .18em !important;\n        margin-bottom: 9px !important;\n      }\n\n      #sf-footer-root .sf-col-social .sf-eyebrow {\n        text-align: right !important;\n      }\n\n      #sf-footer-root .sf-nav-link {\n        font-size: clamp(18px, 5.45vw, 22px) !important;\n        line-height: 1.02 !important;\n        letter-spacing: -.035em !important;\n        padding: 1px 0 !important;\n        margin: 0 !important;\n      }\n\n      #sf-footer-root .sf-nav-link-accent {\n        grid-column: 1 \/ -1 !important;\n        justify-self: start !important;\n        margin-top: 11px !important;\n        padding: 8px 13px !important;\n        font-size: 8px !important;\n        line-height: 1 !important;\n        letter-spacing: .12em !important;\n      }\n\n      #sf-footer-root .sf-social-row {\n        justify-content: flex-end !important;\n        gap: 8px !important;\n      }\n\n      #sf-footer-root .sf-social-link {\n        width: 33px !important;\n        height: 33px !important;\n      }\n\n      #sf-footer-root .sf-social-link svg {\n        width: 16px !important;\n        height: 16px !important;\n      }\n\n      #sf-footer-root .sf-contact-link {\n        font-size: clamp(13px, 3.65vw, 15px) !important;\n        line-height: 1.25 !important;\n        padding: 0 !important;\n        margin: 0 !important;\n        overflow-wrap: anywhere !important;\n      }\n\n      #sf-footer-root .sf-contact-link + .sf-contact-link {\n        margin-top: 3px !important;\n      }\n\n      #sf-footer-root .sf-contact-meta {\n        font-size: 7.5px !important;\n        line-height: 1.45 !important;\n        letter-spacing: .11em !important;\n        margin-top: 8px !important;\n      }\n\n      #sf-footer-root .sf-statement {\n        padding: 24px 18px 18px !important;\n        text-align: left !important;\n      }\n\n      #sf-footer-root .sf-statement h2 {\n        font-size: clamp(22px, 6.8vw, 31px) !important;\n        line-height: .98 !important;\n        letter-spacing: -.042em !important;\n      }\n\n      #sf-footer-root .sf-statement h2 br {\n        display: none !important;\n      }\n\n      #sf-footer-root .sf-word--em > span {\n        padding: 0.01em 0.045em !important;\n      }\n\n      #sf-footer-root .sf-marquee-zone {\n        padding: 10px 0 12px !important;\n        border-top: 1px solid rgba(229,229,229,.07) !important;\n        border-bottom: 1px solid rgba(213,255,0,.10) !important;\n      }\n\n      #sf-footer-root .sf-marquee-item {\n        height: 36px !important;\n        padding: 0 19px !important;\n      }\n\n      #sf-footer-root .sf-marquee-item img {\n        height: 26px !important;\n        opacity: .5 !important;\n      }\n\n      \/* L\u00e9gal : 2 lignes max \u2014 copyright sur 1 ligne, liens sur 1 ligne. *\/\n      #sf-footer-root .sf-legal {\n        display: grid !important;\n        grid-template-columns: 1fr !important;\n        gap: 6px !important;\n        padding: 12px 18px 14px !important;\n        border-radius: 0 !important;\n        background: #151515 !important;\n      }\n\n      #sf-footer-root .sf-legal-left {\n        font-family: 'Inter', sans-serif !important;\n        font-size: 9.5px !important;\n        line-height: 1.2 !important;\n        letter-spacing: -.01em !important;\n        text-transform: none !important;\n        white-space: nowrap !important;\n        color: rgba(229,229,229,.48) !important;\n      }\n\n      #sf-footer-root .sf-legal-left strong {\n        font-weight: 600 !important;\n        color: rgba(229,229,229,.66) !important;\n      }\n\n      #sf-footer-root .sf-legal-right {\n        display: flex !important;\n        flex-direction: row !important;\n        align-items: center !important;\n        justify-content: flex-start !important;\n        flex-wrap: nowrap !important;\n        gap: 12px !important;\n        width: 100% !important;\n        min-width: 0 !important;\n      }\n\n      #sf-footer-root .sf-legal-right a {\n        position: relative !important;\n        padding: 0 !important;\n        font-size: 0 !important;\n        line-height: 1 !important;\n        letter-spacing: 0 !important;\n        text-transform: none !important;\n        white-space: nowrap !important;\n        color: rgba(229,229,229,.42) !important;\n      }\n\n      #sf-footer-root .sf-legal-right a::before {\n        content: attr(data-mobile-label) !important;\n        font-family: 'Inter', sans-serif !important;\n        font-size: 9px !important;\n        line-height: 1.1 !important;\n        letter-spacing: 0 !important;\n      }\n\n      #sf-footer-root .sf-legal-byesteban {\n        border-left: 1px solid rgba(213,255,0,.18) !important;\n        padding-left: 12px !important;\n        color: rgba(213,255,0,.58) !important;\n      }\n    }\n\n    @media (max-width: 380px) {\n      #sf-footer-root .sf-nav {\n        grid-template-columns: minmax(0, 1fr) auto !important;\n        gap: 18px 14px !important;\n        padding: 0 15px !important;\n      }\n\n      #sf-footer-root .sf-nav > .sf-col:first-child {\n        column-gap: 14px !important;\n      }\n\n      #sf-footer-root .sf-nav-link {\n        font-size: clamp(17px, 5.25vw, 20px) !important;\n      }\n\n      #sf-footer-root .sf-nav-link-accent {\n        margin-top: 9px !important;\n        padding: 7px 11px !important;\n        font-size: 7.5px !important;\n      }\n\n      #sf-footer-root .sf-social-link {\n        width: 31px !important;\n        height: 31px !important;\n      }\n\n      #sf-footer-root .sf-contact-link {\n        font-size: 12.5px !important;\n      }\n\n      #sf-footer-root .sf-statement {\n        padding: 22px 15px 16px !important;\n      }\n\n      #sf-footer-root .sf-statement h2 {\n        font-size: clamp(21px, 6.6vw, 28px) !important;\n      }\n\n      #sf-footer-root .sf-marquee-item {\n        height: 34px !important;\n        padding: 0 17px !important;\n      }\n\n      #sf-footer-root .sf-marquee-item img {\n        height: 24px !important;\n      }\n\n      #sf-footer-root .sf-legal {\n        padding: 11px 15px 13px !important;\n      }\n\n      #sf-footer-root .sf-legal-left {\n        font-size: 8.5px !important;\n      }\n\n      #sf-footer-root .sf-legal-right {\n        gap: 9px !important;\n      }\n\n      #sf-footer-root .sf-legal-right a::before {\n        font-size: 8.2px !important;\n      }\n\n      #sf-footer-root .sf-legal-byesteban {\n        padding-left: 9px !important;\n      }\n    }\n\n    @supports (padding: max(0px)) {\n      @media (max-width: 768px) {\n        #sf-footer-root .sf-legal {\n          padding-bottom: max(14px, env(safe-area-inset-bottom)) !important;\n        }\n      }\n    }\n\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       v3.7 \u2014 R\u00e9seaux int\u00e9gr\u00e9s dans la colonne contact\n       Objectif : plus de colonne r\u00e9seaux s\u00e9par\u00e9e ; les ic\u00f4nes passent\n       dans la colonne tout \u00e0 droite, sous les horaires \/ zone contact.\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    #sf-footer-root .sf-col-right .sf-social-block {\n      display: flex !important;\n      flex-direction: column !important;\n      align-items: flex-end !important;\n      margin-top: 18px !important;\n    }\n\n    #sf-footer-root .sf-contact-social-label {\n      font-family: 'JetBrains Mono', monospace !important;\n      font-size: 9px !important;\n      letter-spacing: .22em !important;\n      text-transform: uppercase !important;\n      color: rgba(229,229,229,.32) !important;\n      margin: 0 0 10px !important;\n      line-height: 1 !important;\n      text-align: right !important;\n    }\n\n    #sf-footer-root .sf-col-right .sf-social-row {\n      justify-content: flex-end !important;\n      margin-top: 0 !important;\n    }\n\n    @media (max-width: 768px) {\n      #sf-footer-root .sf-nav {\n        grid-template-columns: 1fr !important;\n        grid-template-areas:\n          \"pages\"\n          \"contact\" !important;\n      }\n\n      #sf-footer-root .sf-col-right {\n        grid-area: contact !important;\n        width: 100% !important;\n      }\n\n      #sf-footer-root .sf-col-right .sf-social-block {\n        align-items: flex-start !important;\n        margin-top: 11px !important;\n      }\n\n      #sf-footer-root .sf-contact-social-label {\n        text-align: left !important;\n        font-size: 7.5px !important;\n        letter-spacing: .18em !important;\n        margin-bottom: 8px !important;\n      }\n\n      #sf-footer-root .sf-col-right .sf-social-row {\n        justify-content: flex-start !important;\n        gap: 8px !important;\n      }\n    }\n\n  <\/style>\n\n\n<!--\n==========================================================================\n  MODULE D'APPEL \u2014 v6 \u00ab disque \u00e9ditorial \u00bb\n  \u25b8 Forme ronde\/capsule fluide (ni carr\u00e9 ni rectangle)\n  \u25b8 Disque lime (ancre, tap target) + pilule verre d\u00e9poli (dark + blur)\n  \u25b8 Typo : INTER uniquement (z\u00e9ro mono), graisse 600, casse naturelle\n  \u25b8 MOBILE : \u00ab Appeler \u00bb + disque, 1 tap = appel direct\n  \u25b8 DESKTOP : le num\u00e9ro se d\u00e9ploie au hover\n  \u25b8 Pr\u00e9fixe CSS : sn-call-   |   Footer Elementor   |   +33 2 99 66 36 60\n==========================================================================\n-->\n<style>\n.sn-call{\n  --lime:#D5FF00;\n  --dark:#242424;\n  --darker:#1a1a1a;\n  --t:#E5E5E5;\n  --sans:'Inter', system-ui, -apple-system, sans-serif;\n  --ease:cubic-bezier(.16,1,.3,1);\n  --disc:52px;\n\n  position:fixed;\n  z-index:9998;\n  bottom:max(18px, env(safe-area-inset-bottom, 18px));\n  right:max(18px, env(safe-area-inset-right, 18px));\n  font-family:var(--sans);\n\n  opacity:0;\n  transform:translateY(16px);\n  transition:opacity .55s var(--ease), transform .55s var(--ease);\n}\n.sn-call.is-visible{ opacity:1; transform:translateY(0); }\n@media(min-width:720px){\n  .sn-call{\n    --disc:58px;\n    bottom:max(30px, env(safe-area-inset-bottom, 30px));\n    right:max(30px, env(safe-area-inset-right, 30px));\n  }\n}\n\n\/* ============ PILULE (verre d\u00e9poli) + DISQUE ============ *\/\n.sn-call-pill{\n  display:inline-flex;\n  align-items:center;\n  gap:0;\n  height:var(--disc);\n  padding-left:20px;\n  border-radius:999px;                         \/* capsule pleinement arrondie *\/\n  background:rgba(26,26,26,.86);\n  -webkit-backdrop-filter:blur(10px) saturate(1.2);\n          backdrop-filter:blur(10px) saturate(1.2);\n  box-shadow:\n    0 1px 0 rgba(255,255,255,.04) inset,\n    0 6px 20px rgba(36,36,36,.22),\n    0 18px 44px rgba(36,36,36,.18);\n  text-decoration:none;\n  -webkit-tap-highlight-color:transparent;\n  transition:box-shadow .4s var(--ease), background .4s var(--ease);\n}\n\n\/* Label \u00ab Appeler \u00bb \u2014 Inter, toujours visible *\/\n.sn-call-word{\n  font-size:14px;\n  font-weight:600;\n  letter-spacing:.005em;\n  color:var(--lime);\n  white-space:nowrap;\n  line-height:1;\n}\n@media(min-width:720px){ .sn-call-word{ font-size:15px; } }\n\n\/* Num\u00e9ro \u2014 d\u00e9ploy\u00e9 au hover desktop *\/\n.sn-call-num{\n  display:inline-block;\n  font-size:15px;\n  font-weight:600;\n  letter-spacing:.01em;\n  color:var(--t);\n  white-space:nowrap;\n  line-height:1;\n  max-width:0;\n  opacity:0;\n  overflow:clip;\n  transform:translateX(-6px);\n  transition:max-width .5s var(--ease), opacity .35s var(--ease), transform .45s var(--ease), margin .5s var(--ease);\n}\n.sn-call-sep{\n  width:1px; height:18px;\n  background:rgba(213,255,0,.3);\n  margin:0 0 0 14px;\n  max-width:0; opacity:0; overflow:clip;\n  transition:max-width .5s var(--ease), opacity .35s var(--ease), margin .5s var(--ease);\n}\n\n\/* Disque lime \u00e0 droite *\/\n.sn-call-disc{\n  position:relative;\n  flex:0 0 var(--disc);\n  width:var(--disc); height:var(--disc);\n  margin-left:16px;\n  border-radius:50%;\n  background:var(--lime);\n  display:inline-flex; align-items:center; justify-content:center;\n  transition:transform .4s var(--ease);\n}\n.sn-call-disc svg{ width:21px; height:21px; fill:var(--dark); transition:transform .45s var(--ease); }\n\n\/* Anneau qui pulse (rond, raccord disque) *\/\n.sn-call-disc::after{\n  content:\"\";\n  position:absolute; inset:0;\n  border-radius:50%;\n  border:2px solid var(--lime);\n  opacity:.5;\n  pointer-events:none;\n  animation:sn-call-pulse 2.6s var(--ease) infinite;\n}\n@keyframes sn-call-pulse{\n  0%{ transform:scale(1); opacity:.5; }\n  65%,100%{ transform:scale(1.45); opacity:0; }\n}\n\/* Micro-oscillation du combin\u00e9 *\/\n@keyframes sn-call-ring{\n  0%,88%,100%{transform:rotate(0)} 89%{transform:rotate(-10deg)} 91%{transform:rotate(8deg)}\n  93%{transform:rotate(-5deg)} 95%{transform:rotate(3deg)}\n}\n.sn-call.is-visible .sn-call-disc svg{ animation:sn-call-ring 6.5s ease-in-out infinite; }\n\n\/* ============ HOVER DESKTOP : d\u00e9ploiement du num\u00e9ro ============ *\/\n@media(min-width:720px) and (hover:hover){\n  .sn-call-pill:hover{ background:rgba(20,20,20,.92); box-shadow:0 8px 26px rgba(36,36,36,.28),0 22px 56px rgba(36,36,36,.22); }\n  .sn-call-pill:hover .sn-call-sep{ max-width:1px; opacity:1; margin:0 14px; }\n  .sn-call-pill:hover .sn-call-num{ max-width:220px; opacity:1; transform:translateX(0); }\n  .sn-call-pill:hover .sn-call-disc{ transform:scale(1.05); }\n  .sn-call-pill:hover .sn-call-disc::after{ animation:none; opacity:0; }\n}\n\n\/* Feedback tap *\/\n.sn-call-pill:active{ background:rgba(20,20,20,.95); }\n.sn-call-pill:active .sn-call-disc{ transform:scale(.94); }\n\n.sn-call-pill:focus-visible{ outline:2px solid var(--lime); outline-offset:4px; }\n\n@media(prefers-reduced-motion:reduce){\n  .sn-call, .sn-call *{ animation:none !important; transition:opacity .2s linear, background .2s linear !important; }\n}\n<\/style>\n\n<\/head>\n<body>\n\n\n<div id=\"sf-footer-root\">\n<footer>\n  <div class=\"sf-card\">\n\n    <div class=\"sf-card-border\"><\/div>\n\n    <!-- ENCOCHE HAUT DESKTOP (v3.4 : sans trait lime ni glow) -->\n    <svg class=\"sf-top-svg\" viewBox=\"0 0 1440 60\" preserveAspectRatio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <path d=\"M0,0 L480,0 C540,0 575,0 605,26 C625,44 650,52 720,52 C790,52 815,44 835,26 C865,0 900,0 960,0 L1440,0 L1440,60 L0,60 Z\" fill=\"#1a1a1a\"\/>\n      <path d=\"M480,0 C540,0 575,0 605,26 C625,44 650,52 720,52 C790,52 815,44 835,26 C865,0 900,0 960,0 Z\" fill=\"#D2D2D2\"\/>\n    <\/svg>\n\n    <!-- ENCOCHE HAUT MOBILE (v3.6 : forme conserv\u00e9e, plus propre et plus compacte) -->\n    <svg class=\"sf-top-svg-mobile\" viewBox=\"0 0 390 46\" preserveAspectRatio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n      <path d=\"M0,0 L92,0 C118,0 136,2 151,20 C164,36 178,42 195,42 C212,42 226,36 239,20 C254,2 272,0 298,0 L390,0 L390,46 L0,46 Z\" fill=\"#1a1a1a\"\/>\n      <path d=\"M92,0 C118,0 136,2 151,20 C164,36 178,42 195,42 C212,42 226,36 239,20 C254,2 272,0 298,0 Z\" fill=\"#D2D2D2\"\/>\n    <\/svg>\n\n    <div class=\"sf-topo\"><\/div>\n\n    <div class=\"sf-inner\">\n      <div class=\"sf-nav\">\n        <div class=\"sf-col\">\n          <p class=\"sf-eyebrow\">Pages<\/p>\n          <a href=\"\/\" class=\"sf-nav-link\">Accueil<\/a>\n          <a href=\"\/studio-de-scenographie\" class=\"sf-nav-link\">Le Studio<\/a>\n          <a href=\"\/projets\" class=\"sf-nav-link\">Projets<\/a>\n          <a href=\"\/blog\" class=\"sf-nav-link\">Blog<\/a>\n          <a href=\"\/agence-de-scenographie\/\" class=\"sf-nav-link\">Manifeste<\/a>\n          <a href=\"\/contact\" class=\"sf-nav-link\">Contact<\/a>\n          <a href=\"\/contact\" class=\"sf-nav-link sf-nav-link-accent\">Brief projet \u2192<\/a>\n        <\/div>\n        <div class=\"sf-col sf-col-right\">\n          <p class=\"sf-eyebrow\" style=\"text-align:right;\">Contact direct<\/p>\n          <a href=\"mailto:hello@scenographie-france.fr\" class=\"sf-contact-link\">hello@scenographie-france.fr<\/a>\n          <a href=\"tel:+33299663660\" class=\"sf-contact-link\">+33 2 99 66 36 60<\/a>\n          <p class=\"sf-contact-meta\">\n            Lun \u2013 Ven \u00b7 9h \u2013 18h<br>\n            Rennes \u00b7 France enti\u00e8re \u00b7 Europe\n          <\/p>\n          <div class=\"sf-social-block\" aria-label=\"R\u00e9seaux sociaux Sc\u00e9nographie France\">\n            <p class=\"sf-contact-social-label\">R\u00e9seaux<\/p>\n            <div class=\"sf-social-row\">\n              <a href=\"https:\/\/www.instagram.com\/scenographie_france\/\" class=\"sf-social-link\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Instagram Sc\u00e9nographie France\">\n                <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                  <rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" rx=\"5.2\" stroke=\"currentColor\" stroke-width=\"1.6\"\/>\n                  <circle cx=\"12\" cy=\"12\" r=\"4.4\" stroke=\"currentColor\" stroke-width=\"1.6\"\/>\n                  <circle cx=\"17.6\" cy=\"6.4\" r=\"1.25\" fill=\"currentColor\"\/>\n                <\/svg>\n              <\/a>\n              <a href=\"https:\/\/www.linkedin.com\/company\/atelier-sans-chagrin\/posts\/?feedView=all\" class=\"sf-social-link\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"LinkedIn Sc\u00e9nographie France\">\n                <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                  <rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.6\"\/>\n                  <path d=\"M7 10.2v6.3M7 7.4v.02\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\"\/>\n                  <path d=\"M11 16.5v-3.6c0-1.3.9-2.4 2.3-2.4 1.3 0 2.2 1 2.2 2.4v3.6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\/>\n                  <path d=\"M11 16.5v-5.9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\/>\n                <\/svg>\n              <\/a>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- STATEMENT : data-animate-statement \u2192 wrapp\u00e9\/anim\u00e9 par le JS -->\n      <div class=\"sf-statement\" id=\"sf-statement\">\n        <h2 data-animate-statement>Concevoir des <br>espaces <em>qui marquent.<\/em><\/h2>\n      <\/div>\n    <\/div>\n\n    <!-- MARQUEE (d\u00e9filement pilot\u00e9 en JS rAF) -->\n    <div class=\"sf-marquee-zone\">\n      <div class=\"sf-marquee-track\" id=\"sf-marquee-track\">\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/westfield-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Westfield\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/renault-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Renault\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/leclerc-logo-noir-fond-transparent-scenographie-france.png\" alt=\"E.Leclerc\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/stade-rennais-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Stade Rennais\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/bnp-paribas-logo-noir-fond-transparent-scenographie-france.png\" alt=\"BNP Paribas\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/groupama-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Groupama\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/mitsubishi-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Mitsubishi\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/maisons-du-monde-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Maisons du Monde\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/peugeot-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Peugeot\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/credit-mutuel-arkea-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Cr\u00e9dit Mutuel\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/groupe-roullier-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Roullier\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/fiat-logo-noir-fond-transparent-scenographie-france.png\" alt=\"FIAT\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2026\/05\/les-vieilles-charrues-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Vieilles Charrues\"><\/div>\n        <div class=\"sf-marquee-item\"><img decoding=\"async\" src=\"https:\/\/scenographie-france.fr\/wp-content\/uploads\/2025\/09\/sojasun-logo-noir-fond-transparent-scenographie-france.png\" alt=\"Sojasun\"><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- LEGAL -->\n    <div class=\"sf-legal\">\n      <p class=\"sf-legal-left\"><strong>\u00a9 2026 Sc\u00e9nographie France.<\/strong> Tous droits r\u00e9serv\u00e9s<\/p>\n      <div class=\"sf-legal-right\">\n        <a href=\"\/politique-de-confidentialite\/\" data-mobile-label=\"Confidentialit\u00e9\">Politique de confidentialit\u00e9<\/a>\n        <a href=\"\/mentions-legales\/\" data-mobile-label=\"Mentions l\u00e9gales\">Mentions l\u00e9gales<\/a>\n        <a href=\"https:\/\/www.linkedin.com\/in\/esteban-niochet-b65985258\/\" class=\"sf-legal-byesteban\" data-mobile-label=\"ByEsteban\" target=\"_blank\" rel=\"noopener\">Site ByEsteban<\/a>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/footer>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     DONN\u00c9ES STRUCTUR\u00c9ES (JSON-LD) \u2014 pr\u00e9sentes sur toutes les pages\n     via le footer. Type ProfessionalService : agence bas\u00e9e \u00e0 Rennes\n     mais intervenant sur la France enti\u00e8re (areaServed = Country).\n     knowsAbout = domaines d'expertise \u2192 lus par Google + LLMs.\n     sameAs = profils sociaux officiels.\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"ProfessionalService\",\n  \"@id\": \"https:\/\/scenographie-france.fr\/#organization\",\n  \"name\": \"Sc\u00e9nographie France\",\n  \"alternateName\": \"Atelier Sans Chagrin\",\n  \"description\": \"Agence de sc\u00e9nographie \u00e9v\u00e9nementielle. Plus de 1 200 projets livr\u00e9s depuis 2011 : stands sur mesure, pop-up stores, d\u00e9cors \u00e9v\u00e9nementiels, sc\u00e9nographie d'exposition et activations de marque. Bas\u00e9e \u00e0 Rennes, intervention sur toute la France.\",\n  \"url\": \"https:\/\/scenographie-france.fr\/\",\n  \"telephone\": \"+33-2-99-66-36-60\",\n  \"email\": \"hello@scenographie-france.fr\",\n  \"foundingDate\": \"2011\",\n  \"slogan\": \"Concevoir des espaces qui marquent.\",\n  \"address\": {\n    \"@type\": \"PostalAddress\",\n    \"addressLocality\": \"Rennes\",\n    \"postalCode\": \"35000\",\n    \"addressRegion\": \"Bretagne\",\n    \"addressCountry\": \"FR\"\n  },\n  \"areaServed\": {\n    \"@type\": \"Country\",\n    \"name\": \"France\"\n  },\n  \"knowsAbout\": [\n    \"Sc\u00e9nographie \u00e9v\u00e9nementielle\",\n    \"Stands sur mesure et modulaires\",\n    \"Pop-up stores et boutiques \u00e9ph\u00e9m\u00e8res\",\n    \"D\u00e9cors \u00e9v\u00e9nementiels et soir\u00e9es d'entreprise\",\n    \"Sc\u00e9nographie d'exposition et culturelle\",\n    \"Activations de marque et installations immersives\"\n  ],\n  \"openingHoursSpecification\": {\n    \"@type\": \"OpeningHoursSpecification\",\n    \"dayOfWeek\": [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\"],\n    \"opens\": \"09:00\",\n    \"closes\": \"18:00\"\n  },\n  \"sameAs\": [\n    \"https:\/\/www.instagram.com\/scenographie_france\/\",\n    \"https:\/\/www.linkedin.com\/company\/atelier-sans-chagrin\/\"\n  ]\n}\n<\/script>\n\n<script>\n(function () {\n  'use strict';\n\n  function boot() {\n    var root = document.getElementById('sf-footer-root');\n    if (!root) { return setTimeout(boot, 150); }\n\n    var prefersReduce = window.matchMedia &&\n      window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       1. STATEMENT \u2014 split mots + reveal au scroll + shiny apr\u00e8s\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    function splitStatement() {\n      var h2 = root.querySelector('[data-animate-statement]');\n      if (!h2 || h2.dataset.sfSplit === '1') return null;\n      h2.dataset.sfSplit = '1';\n\n      var wordIndex = 0;\n      var firstEmIndex = -1;\n\n      function wrapTextNode(textNode, isEm) {\n        var text = textNode.textContent;\n        var frag = document.createDocumentFragment();\n        var parts = text.split(\/(\\s+)\/);\n        parts.forEach(function (part) {\n          if (part === '') return;\n          if (\/^\\s+$\/.test(part)) {\n            frag.appendChild(document.createTextNode(part));\n          } else {\n            var word = document.createElement('span');\n            word.className = 'sf-word' + (isEm ? ' sf-word--em' : '');\n            var inner = document.createElement('span');\n            inner.textContent = part;\n            inner.style.setProperty('--sf-word-delay', (wordIndex * 80) + 'ms');\n            if (isEm && firstEmIndex === -1) firstEmIndex = wordIndex;\n            word.appendChild(inner);\n            frag.appendChild(word);\n            wordIndex++;\n          }\n        });\n        textNode.parentNode.replaceChild(frag, textNode);\n      }\n\n      var children = Array.prototype.slice.call(h2.childNodes);\n      children.forEach(function (node) {\n        if (node.nodeType === 3) {\n          wrapTextNode(node, false);\n        } else if (node.nodeName === 'EM') {\n          var emChildren = Array.prototype.slice.call(node.childNodes);\n          emChildren.forEach(function (en) {\n            if (en.nodeType === 3) wrapTextNode(en, true);\n          });\n        }\n      });\n\n      \/\/ Le trait lime se trace juste apr\u00e8s que le 1er mot em soit mont\u00e9\n      var underlineDelay = (firstEmIndex >= 0 ? firstEmIndex : wordIndex) * 80 + 450;\n      root.querySelectorAll('.sf-word--em > span').forEach(function (s) {\n        s.style.setProperty('--sf-underline-delay', underlineDelay + 'ms');\n      });\n\n      h2.dataset.sfWordCount = wordIndex;\n      return root.querySelector('.sf-statement');\n    }\n\n    function initStatementReveal() {\n      var statement = splitStatement();\n      if (!statement) return;\n\n      var h2 = statement.querySelector('[data-animate-statement]');\n      var wordCount = h2 ? parseInt(h2.dataset.sfWordCount || '0', 10) : 0;\n      \/\/ d\u00e9lai total reveal = dernier mot (80ms*n) + dur\u00e9e transition (~1s)\n      var revealDoneMs = wordCount * 80 + 1100;\n\n      function reveal() {\n        statement.classList.add('is-revealed');\n        statement.classList.add('is-underlined');\n        if (!prefersReduce) {\n          \/\/ active le shiny sweep une fois tous les mots mont\u00e9s\n          setTimeout(function () {\n            statement.classList.add('is-shiny');\n          }, revealDoneMs);\n        }\n      }\n\n      if (prefersReduce || !('IntersectionObserver' in window)) {\n        statement.classList.add('is-revealed');\n        statement.classList.add('is-underlined');\n        return;\n      }\n\n      var obs = new IntersectionObserver(function (entries) {\n        entries.forEach(function (entry) {\n          if (entry.isIntersecting) {\n            reveal();\n            obs.unobserve(entry.target);\n          }\n        });\n      }, { threshold: 0.3, rootMargin: '0px 0px -8% 0px' });\n\n      obs.observe(statement);\n\n      setTimeout(function () {\n        if (!statement.classList.contains('is-revealed')) reveal();\n      }, 6000);\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       2. MARQUEE \u2014 CSS principal + JS de secours (auto-d\u00e9tection)\n       \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    function initMarquee() {\n      var track = document.getElementById('sf-marquee-track');\n      if (!track) return;\n      if (prefersReduce) {\n        track.style.animation = 'none';\n        return;\n      }\n      if (track.dataset.sfMarqueeInit === '1') return;\n      track.dataset.sfMarqueeInit = '1';\n\n      \/\/ Le HTML contient 1 set. L'anim CSS translate de -50% \u2192 il faut\n      \/\/ DEUX sets identiques pour une boucle seamless. On duplique ici.\n      var singleSet = track.innerHTML;\n      track.innerHTML = singleSet + singleSet;\n\n      \/\/ \u2500\u2500 D\u00e9tection : est-ce que l'animation CSS tourne vraiment ? \u2500\u2500\n      \/\/ On lit la transform \u00e0 deux instants ; si elle bouge, le CSS g\u00e8re.\n      \/\/ Sinon (Elementor a tu\u00e9 le keyframe), on bascule en JS rAF.\n      var SPEED = 55; \/\/ px\/seconde pour le mode secours\n      var offset = 0;\n      var lastTime = null;\n      var running = true;\n      var halfWidth = 0;\n      var jsMode = false;\n\n      function startJsFallback() {\n        if (jsMode) return;\n        jsMode = true;\n        track.classList.add('sf-js-driven'); \/\/ coupe l'anim CSS\n\n        halfWidth = track.scrollWidth \/ 2; \/\/ largeur d'UN set (track = 2 sets)\n        if (halfWidth === 0) { setTimeout(startJsFallback, 200); jsMode = false; track.classList.remove('sf-js-driven'); return; }\n\n        track.addEventListener('mouseenter', function () { running = false; });\n        track.addEventListener('mouseleave', function () { running = true; });\n\n        function tick(now) {\n          if (!running) { lastTime = now; requestAnimationFrame(tick); return; }\n          if (lastTime === null) lastTime = now;\n          var dt = (now - lastTime) \/ 1000;\n          lastTime = now;\n          offset -= SPEED * dt;\n          if (-offset >= halfWidth) offset += halfWidth;\n          track.style.transform = 'translate3d(' + offset + 'px,0,0)';\n          requestAnimationFrame(tick);\n        }\n        requestAnimationFrame(tick);\n      }\n\n      \/\/ V\u00e9rifie apr\u00e8s un court d\u00e9lai si le CSS a boug\u00e9 le track\n      function verifyCss() {\n        var t1 = getComputedStyle(track).transform;\n        setTimeout(function () {\n          var t2 = getComputedStyle(track).transform;\n          \/\/ 'none' = pas d'anim appliqu\u00e9e ; identique = anim fig\u00e9e\/tu\u00e9e\n          if (t1 === 'none' || t1 === t2) {\n            startJsFallback();\n          }\n        }, 350);\n      }\n\n      \/\/ Attendre le chargement des images (sinon scrollWidth instable)\n      var imgs = track.querySelectorAll('img');\n      var pending = imgs.length;\n      function afterImgs() {\n        \/\/ relance proprement l'anim CSS depuis le d\u00e9but maintenant que\n        \/\/ les largeurs sont stables, puis v\u00e9rifie\n        track.style.webkitAnimation = 'none';\n        track.style.animation = 'none';\n        \/\/ reflow\n        void track.offsetWidth;\n        track.style.webkitAnimation = '';\n        track.style.animation = '';\n        verifyCss();\n      }\n      if (pending === 0) {\n        afterImgs();\n      } else {\n        var done = 0, triggered = false;\n        function maybe() {\n          done++;\n          if (!triggered && done >= pending) { triggered = true; afterImgs(); }\n        }\n        imgs.forEach(function (img) {\n          if (img.complete) maybe();\n          else { img.addEventListener('load', maybe); img.addEventListener('error', maybe); }\n        });\n        setTimeout(function () { if (!triggered) { triggered = true; afterImgs(); } }, 2500);\n      }\n    }\n\n    initStatementReveal();\n    initMarquee();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot);\n  } else {\n    boot();\n  }\n  \/\/ filet ultime : si le footer est inject\u00e9 tardivement par Elementor\n  window.addEventListener('load', function () {\n    var t = document.getElementById('sf-marquee-track');\n    if (t && t.dataset.sfMarqueeInit !== '1') boot();\n  });\n})();\n<\/script>\n\n\n\n<div class=\"sn-call\">\n  <a class=\"sn-call-pill\" href=\"tel:+33299663660\" aria-label=\"Appeler Sc\u00e9nographie France au 02 99 66 36 60\">\n    <span class=\"sn-call-word\">Appeler<\/span>\n    <span class=\"sn-call-sep\" aria-hidden=\"true\"><\/span>\n    <span class=\"sn-call-num\" aria-hidden=\"true\">+33&nbsp;2&nbsp;99&nbsp;66&nbsp;36&nbsp;60<\/span>\n    <span class=\"sn-call-disc\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n        <path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.28-.28.67-.36 1.02-.25 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1C10.07 21 3 13.93 3 5c0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"\/>\n      <\/svg>\n    <\/span>\n  <\/a>\n<\/div>\n\n<script>\n(function(){\n  var root = document.querySelector('.sn-call');\n  if (!root) return;\n  setTimeout(function(){ root.classList.add('is-visible'); }, 800);\n\n  var footer = document.getElementById('sf-footer-root');\n  if (footer && 'IntersectionObserver' in window){\n    var io = new IntersectionObserver(function(entries){\n      entries.forEach(function(en){\n        if (en.isIntersecting && en.intersectionRatio > 0.25) root.classList.remove('is-visible');\n        else root.classList.add('is-visible');\n      });\n    }, { threshold:[0, 0.25, 0.5] });\n    io.observe(footer);\n  }\n})();\n<\/script>\n\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Sc\u00e9nographie Rennes | Stands, \u00e9v\u00e9nements, retail et expositions [ LOADING 000 % ] Accueil Le Studio Manifeste Projets Contact [ TROUVEZ-NOUS ] RENNES \u2014 BRETAGNE +33 2 99 66 36 60 hello@scenographie-france.fr SC\u00c9NOGRAPHIE RENNES Sc\u00e9nographie \u00e0 Rennes et en Bretagne \u2014 conception de stands, d\u00e9cors \u00e9v\u00e9nementiels, pop-up stores, expositions et espaces de marque. SCROLL span [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-9","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/pages\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":67,"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions"}],"predecessor-version":[{"id":104,"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions\/104"}],"wp:attachment":[{"href":"https:\/\/scenographie-rennes.fr\/index.php\/wp-json\/wp\/v2\/media?parent=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}