{"id":23814269,"date":"2026-09-25T01:01:53","date_gmt":"2026-09-25T01:01:53","guid":{"rendered":"https:\/\/socialhackerslab.com\/?page_id=23814269"},"modified":"2026-10-05T08:39:31","modified_gmt":"2026-10-05T08:39:31","slug":"shl-v2","status":"publish","type":"page","link":"https:\/\/socialhackerslab.com\/en\/","title":{"rendered":"Social Hackers Lab"},"content":{"rendered":"[et_pb_section admin_label=\u00a0\u00bbsection\u00a0\u00bb]\n\t\t\t[et_pb_row admin_label=\u00a0\u00bbrow\u00a0\u00bb]\n\t\t\t\t[et_pb_column type=\u00a0\u00bb4_4&Prime;][et_pb_text admin_label=\u00a0\u00bbText\u00a0\u00bb]<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@300..800&family=Geist+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n\/* Autour de la page : le th\u00e8me s'efface (en-t\u00eate, titre, barre lat\u00e9rale, pied) *\/\r\nbody:has(#shl-accueil) { margin: 0 !important; padding: 0 !important; background: #fff !important; }\r\nbody :has(#shl-accueil) { all: unset !important; display: block !important; }\r\nbody :has(#shl-accueil)::before, body :has(#shl-accueil)::after { content: none !important; }\r\nbody :has(#shl-accueil) > :not(:has(#shl-accueil), #shl-accueil) { display: none !important; }\r\n\/* Dans la page : aucun style du th\u00e8me ne d\u00e9teint *\/\r\n#shl-accueil { all: initial; display: block; }\r\nbody #shl-accueil :where(div, section, header, footer, nav, main, article, aside, span, b, strong, em, i, small, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, figure, figcaption, blockquote, a, button, input, select, textarea, label, table, tr, th, td) { all: revert; box-sizing: border-box; }\r\n\/* Connect\u00e9, la barre d'admin de WordPress reste en haut : l'en-t\u00eate de la page se cale dessous *\/\r\nbody.admin-bar #shl-accueil .site-header { top: 32px; }\r\n@media (max-width: 782px) { body.admin-bar #shl-accueil .site-header { top: 46px; } }\r\n@media (max-width: 600px) { body.admin-bar #shl-accueil .site-header { top: 0; } }\r\n#shl-accueil { --bg: #fff;\r\n  --canvas: #fbfbf8;\r\n  --tint: #f7f8f5;\r\n  --sunk: #f2f4ef;\r\n  --ink: #173540;\r\n  --ink-2: #445f69;\r\n  --muted: #5f7276;\r\n  --soft: #6b8286;\r\n  --faint: #9aa9ab;\r\n  --line: #e6eae3;\r\n  --line-2: #eef1ec;\r\n  --accent: #1f4a4d;\r\n  --t1: #c86a5e; --t2: #b25f35; --t3: #bd9035; --t4: #8d9b4e; --t5: #55926f;\r\n  --t6: #6d9b93; --t7: #4b8296; --t8: #45508a; --t9: #8480be; --t10: #92557c;\r\n  --x1: #af564b; --x2: #ab5b32; --x3: #8c6c20; --x4: #6a7637; --x5: #437c5d;\r\n  --x6: #4f7871; --x7: #43778b; --x8: #45508a; --x9: #6e6aa8; --x10: #92557c;\r\n  --lv1: #b25f35; --lv2: #2a7fae; --lv3: #8d9b4e;\r\n  --spectrum: linear-gradient(90deg, var(--t1) 0 10%, var(--t2) 0 20%, var(--t3) 0 30%, var(--t4) 0 40%, var(--t5) 0 50%, var(--t6) 0 60%, var(--t7) 0 70%, var(--t8) 0 80%, var(--t9) 0 90%, var(--t10) 0);\r\n  --shadow-sm: 0 1px 2px rgba(14, 27, 46, .05), 0 8px 20px -10px rgba(14, 27, 46, .14);\r\n  --shadow: 0 1px 2px rgba(22, 38, 44, .04), 0 18px 40px -24px rgba(22, 38, 44, .28);\r\n  --r-md: 12px;\r\n  --r-lg: 16px;\r\n  --r-xl: 20px;\r\n  --ease: cubic-bezier(.16, 1, .3, 1);\r\n  --ease-io: cubic-bezier(.65, 0, .35, 1);\r\n  --font: 'Manrope', system-ui, -apple-system, 'Segoe UI', sans-serif;\r\n  --mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;\r\n  --gut: clamp(16px, 4vw, 40px); }\r\n#shl-accueil *, #shl-accueil *::before, #shl-accueil *::after { box-sizing: border-box; }\r\nhtml:has(#shl-accueil) { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: 88px; }\r\n#shl-accueil { margin: 0; background: var(--bg); color: var(--ink); font: 400 16px\/1.6 var(--font); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: clip; }\r\n#shl-accueil img, #shl-accueil svg, #shl-accueil canvas { display: block; max-width: 100%; }\r\n#shl-accueil a { color: inherit; text-decoration: none; }\r\n#shl-accueil button, #shl-accueil input, #shl-accueil select, #shl-accueil textarea { font: inherit; color: inherit; }\r\n#shl-accueil h1, #shl-accueil h2, #shl-accueil h3, #shl-accueil h4, #shl-accueil p, #shl-accueil ol, #shl-accueil ul, #shl-accueil dl, #shl-accueil dd, #shl-accueil figure, #shl-accueil blockquote { margin: 0; }\r\n#shl-accueil ol, #shl-accueil ul { padding: 0; list-style: none; }\r\n#shl-accueil :focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 6px; }\r\n#shl-accueil ::selection { background: rgba(31, 74, 77, .14); }\r\n#shl-accueil .wrap { width: min(1240px, 100% - 2 * var(--gut)); margin-inline: auto; }\r\n#shl-accueil .sprite { position: absolute; width: 0; height: 0; overflow: hidden; }\r\n#shl-accueil .skip { position: absolute; left: 16px; top: -60px; z-index: 100; padding: 10px 16px; border-radius: 999px; background: var(--ink); color: #fff; font-size: 14px; font-weight: 700; }\r\n#shl-accueil .skip:focus { top: 12px; }\r\n#shl-accueil .eyebrow, #shl-accueil .sec-index, #shl-accueil .map-key, #shl-accueil .partners p b, #shl-accueil .kinds p b, #shl-accueil .step-top, #shl-accueil .project .place, #shl-accueil .field .mono, #shl-accueil .bc-kicker, #shl-accueil .footer h4 { font-family: var(--mono); font-size: 11.5px; font-weight: 500; line-height: 1.3; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .intro { display: none; }\r\n#shl-accueil.js .intro { position: fixed; inset: 0; z-index: 200; display: block; background: #fff; animation: intro-safe .4s 4s forwards; transition: background-color .8s var(--ease) .1s; }\r\n#shl-accueil.js .intro.is-live { animation: none; }\r\n#shl-accueil .intro.is-out { background-color: rgba(255, 255, 255, 0); pointer-events: none; }\r\n#shl-accueil .intro canvas { position: absolute; inset: 0; width: 100%; height: 100%; transition: opacity .5s var(--ease); }\r\n#shl-accueil .intro.is-lost canvas { opacity: 0; }\r\n@keyframes intro-safe{to { opacity: 0; visibility: hidden; }}#shl-accueil.js.intro-hold .hero [data-reveal] { opacity: 0; transform: translateY(22px); filter: blur(8px); }\r\n#shl-accueil.js h1 { transition: opacity .9s var(--ease), filter .9s var(--ease); }\r\n#shl-accueil.js.intro-hold h1 { opacity: 0; filter: blur(6px); }\r\n@media (prefers-reduced-motion: reduce){#shl-accueil.js .intro { display: none; }\r\n}#shl-accueil.js [data-reveal] { opacity: 0; transform: translateY(22px); filter: blur(8px);\r\n  transition-property: opacity, transform, filter, translate, box-shadow, border-color, background-color;\r\n  transition-duration: .9s, 1.1s, .9s, .5s, .5s, .4s, .4s;\r\n  transition-timing-function: var(--ease);\r\n  transition-delay: calc(var(--d, 0) * 1ms), calc(var(--d, 0) * 1ms), calc(var(--d, 0) * 1ms), 0s, 0s, 0s, 0s; }\r\n#shl-accueil.js [data-reveal].is-in { opacity: 1; transform: none; filter: none; }\r\n#shl-accueil .btn { display: inline-flex; align-items: center; gap: 10px; height: 48px; padding: 0 24px; border: 1px solid transparent; border-radius: 999px; font-size: 15px; font-weight: 700; letter-spacing: -.005em; white-space: nowrap; cursor: pointer; transition: background-color .35s var(--ease), color .35s var(--ease), border-color .35s var(--ease), box-shadow .35s var(--ease); }\r\n#shl-accueil .btn .arr { transition: transform .45s var(--ease); }\r\n#shl-accueil .btn:hover .arr { transform: translateX(4px); }\r\n#shl-accueil .btn-primary { background: var(--ink); color: #fff; box-shadow: 0 1px 2px rgba(22, 38, 44, .14), 0 12px 24px -14px rgba(22, 38, 44, .6); }\r\n#shl-accueil .btn-primary:hover { background: var(--accent); }\r\n#shl-accueil .btn-ghost { background: #fff; color: var(--ink); border-color: var(--line); }\r\n#shl-accueil .btn-ghost:hover { border-color: #cdd6d0; box-shadow: var(--shadow-sm); }\r\n#shl-accueil .btn-ink { background: transparent; color: var(--ink); border-color: var(--ink); }\r\n#shl-accueil .btn-ink:hover { background: var(--ink); color: #fff; }\r\n#shl-accueil .site-header { position: sticky; top: 0; z-index: 50; background: rgba(255, 255, 255, .86); -webkit-backdrop-filter: saturate(1.4) blur(14px); backdrop-filter: saturate(1.4) blur(14px); border-bottom: 1px solid transparent; transition: border-color .3s, box-shadow .3s; }\r\n#shl-accueil .site-header.is-solid { border-bottom-color: var(--line); box-shadow: 0 10px 30px -24px rgba(22, 38, 44, .3); }\r\n#shl-accueil .header-row { display: flex; align-items: center; gap: 24px; height: 76px; }\r\n#shl-accueil .brand { --mh: 34px; display: flex; flex: none; }\r\n#shl-accueil .brand-mark { position: relative; flex: none; width: calc(var(--mh) * 2.697); height: var(--mh); overflow: hidden; }\r\n#shl-accueil .brand-mark img { position: absolute; left: calc(var(--mh) * -.462); top: calc(var(--mh) * -1.22); width: calc(var(--mh) * 3.636); height: auto; max-width: none; }\r\n#shl-accueil .main-nav { position: relative; display: flex; margin-inline: auto; }\r\n#shl-accueil .main-nav a { padding: 10px 12px 12px; font-size: 14.5px; font-weight: 600; letter-spacing: -.01em; color: var(--ink-2); transition: color .35s var(--ease); }\r\n#shl-accueil .main-nav a:hover { color: var(--ink); }\r\n#shl-accueil .main-nav a.is-current { color: var(--c); }\r\n#shl-accueil .nav-thumb { position: absolute; bottom: 3px; left: 0; width: 0; height: 2px; border-radius: 2px; background: var(--ink); opacity: 0; transition: transform .55s var(--ease), width .55s var(--ease), background-color .55s var(--ease), opacity .3s; }\r\n#shl-accueil .header-actions { display: flex; align-items: center; gap: 22px; flex: none; }\r\n#shl-accueil .header-actions .btn { height: 44px; padding: 0 20px; font-size: 14.5px; }\r\n#shl-accueil .menu-toggle { display: none; align-items: center; gap: 10px; height: 40px; margin-left: auto; padding: 0 16px; border: 1px solid var(--line); border-radius: 999px; background: #fff; font-size: 14px; font-weight: 600; cursor: pointer; }\r\n#shl-accueil .menu-toggle i { width: 16px; height: 10px; border-top: 1.5px solid; border-bottom: 1.5px solid; transition: transform .3s var(--ease); }\r\n#shl-accueil .is-open .menu-toggle i { transform: rotate(90deg); }\r\n#shl-accueil .mobile-nav { display: grid; padding: 8px var(--gut) 24px; border-top: 1px solid var(--line); background: #fff; }\r\n#shl-accueil .mobile-nav[hidden] { display: none; }\r\n#shl-accueil .mobile-nav a { padding: 13px 0; border-bottom: 1px solid var(--line-2); font-size: 16px; font-weight: 600; }\r\n#shl-accueil .mobile-nav .btn { justify-content: center; margin-top: 16px; padding: 0 22px; border-bottom: 0; }\r\n#shl-accueil .hero { position: relative; padding: clamp(36px, 6vh, 72px) 0 clamp(40px, 6vh, 72px); overflow: hidden; text-align: center; }\r\n#shl-accueil .eyebrow { display: inline-flex; align-items: center; gap: 12px; font-size: 12px; letter-spacing: .12em; }\r\n#shl-accueil .eyebrow::before { content: ''; width: 40px; height: 3px; border-radius: 2px; background: var(--spectrum); flex: none; }\r\n#shl-accueil h1 { margin-top: 22px; font-size: clamp(36px, 6.2vw, 90px); line-height: 1.04; font-weight: 600; letter-spacing: -.032em; }\r\n#shl-accueil h1 .line { display: block; overflow: hidden; padding-bottom: .08em; margin-bottom: -.08em; }\r\n#shl-accueil h1 .line > span { display: inline-block; text-wrap: balance; transition: transform 1.2s var(--ease) calc(var(--l, 0) * 110ms + 80ms); }\r\n#shl-accueil.js h1 .line > span { transform: translateY(108%); }\r\n#shl-accueil.js.is-loaded h1 .line > span { transform: none; }\r\n#shl-accueil .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }\r\n#shl-accueil .hero-stage { display: flex; flex-direction: column; padding-bottom: clamp(8px, 1.5vh, 16px); }\r\n#shl-accueil .hero-stage > .eyebrow { align-self: center; }\r\n#shl-accueil .hero-art { position: relative; margin-top: clamp(16px, 3vh, 36px); }\r\n#shl-accueil .hero-sky { position: relative; aspect-ratio: 5 \/ 1; max-height: 320px; margin-inline: -16px; }\r\n#shl-accueil .hero-sky canvas { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .hero-banks { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(12px, 2vw, 24px); margin-top: clamp(10px, 1.6vh, 18px); text-align: center; }\r\n#shl-accueil .hero-banks > span { margin-inline: auto; font-size: clamp(16px, 2.35vw, 34px); font-weight: 700; line-height: 1.12; letter-spacing: -.025em; text-wrap: balance; }\r\n#shl-accueil .hero-banks > span:nth-child(1) { margin-left: 0; text-align: left; }\r\n#shl-accueil .hero-banks > span:nth-child(3) { margin-right: 0; text-align: right; }\r\n#shl-accueil.js .hero-banks > span { opacity: 0; transform: translateY(8px); transition: opacity .9s var(--ease) calc(var(--i) * 180ms), transform .9s var(--ease) calc(var(--i) * 180ms); }\r\n#shl-accueil.js .is-ready .hero-banks > span { opacity: 1; transform: none; }\r\n#shl-accueil .hero-banks b { font-weight: inherit; color: var(--c); text-decoration-line: underline; text-decoration-thickness: .06em; text-decoration-color: transparent; text-underline-offset: .2em; transition: text-decoration-color .8s var(--ease); }\r\n#shl-accueil .hero-banks b.is-hot { text-decoration-color: var(--c); }\r\n#shl-accueil .hero-foot { display: flex; align-items: center; justify-content: space-between; gap: 20px 48px; margin-top: clamp(32px, 5vh, 52px); padding-top: 28px; border-top: 1px solid var(--line); text-align: left; }\r\n#shl-accueil .lede { max-width: 700px; font-size: clamp(16px, 1.2vw, 18px); line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .lede b { font-weight: 700; color: var(--ink); }\r\n#shl-accueil .hero-cta { display: flex; flex-wrap: wrap; gap: 12px; flex: none; }\r\n#shl-accueil .proof { padding: clamp(64px, 8vw, 104px) 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .proof-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px 24px; }\r\n#shl-accueil .proof-head h2 { font-size: clamp(24px, 2.4vw, 32px); font-weight: 800; letter-spacing: -.025em; }\r\n#shl-accueil .proof-head p { font-size: 15px; color: var(--muted); }\r\n#shl-accueil .figures { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 32px 40px; margin-top: 40px; }\r\n#shl-accueil .figures > div { position: relative; padding-top: 28px; border-top: 1px solid var(--line); }\r\n#shl-accueil .figures > div::before { content: ''; position: absolute; top: -1px; left: 0; width: 48px; height: 2px; background: var(--c); transform: scaleX(0); transform-origin: left; transition: transform 1.1s var(--ease) calc(var(--d, 0) * 1ms + 250ms); }\r\n#shl-accueil .figures > div.is-in::before { transform: none; }\r\n#shl-accueil .figures > div:nth-child(1) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .figures > div:nth-child(2) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .figures > div:nth-child(3) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .figures > div:nth-child(4) { --c: var(--t10); --cx: var(--x10); }\r\n#shl-accueil .figures dt { color: var(--cx); display: flex; align-items: baseline; gap: 6px; font-size: clamp(44px, 5vw, 68px); font-weight: 800; line-height: 1; letter-spacing: -.045em; font-variant-numeric: tabular-nums; }\r\n#shl-accueil .figures dt small { font-size: .38em; font-weight: 700; letter-spacing: -.01em; }\r\n#shl-accueil .figures dd { max-width: 260px; margin-top: 14px; font-size: 14.5px; line-height: 1.55; color: var(--ink-2); }\r\n#shl-accueil .hubs-note { margin-top: 36px; font-size: 14.5px; color: var(--ink-2); }\r\n#shl-accueil .hubs-note b { color: var(--ink); }\r\n#shl-accueil .partners, #shl-accueil .kinds { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 32px; align-items: center; margin-top: 48px; padding-top: 32px; border-top: 1px solid var(--line); }\r\n#shl-accueil .partners p, #shl-accueil .kinds p { font-size: 14px; line-height: 1.5; color: var(--muted); }\r\n#shl-accueil .partners p b, #shl-accueil .kinds p b { display: block; margin-bottom: 6px; color: var(--ink); }\r\n#shl-accueil .logos { --gap: 72px; display: flex; gap: var(--gap); padding-block: 6px; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); }\r\n#shl-accueil .logos-set { flex: none; display: flex; align-items: center; justify-content: space-around; gap: var(--gap); min-width: 100%; animation: logos-roll 40s linear infinite; }\r\n#shl-accueil .logos:hover .logos-set { animation-play-state: paused; }\r\n#shl-accueil .logos img { width: auto; height: var(--lh, 36px); transition: transform .45s var(--ease); }\r\n#shl-accueil .logos img.is-missing, #shl-accueil .pub-logo img.is-missing { display: none; }\r\n#shl-accueil .logos img:hover { transform: scale(1.06); }\r\n@keyframes logos-roll{to { transform: translateX(calc(-100% - var(--gap))); }}#shl-accueil .atlas { position: relative; overflow: hidden; background: var(--tint); border-top: 1px solid var(--line); scroll-margin-top: 76px; }\r\n#shl-accueil .atlas-over { display: grid; grid-template-columns: minmax(0, clamp(360px, 33vw, 420px)) minmax(0, 1fr); align-content: space-between; gap: 24px 0; min-height: clamp(540px, calc(100vh - 77px), 1160px); min-height: clamp(540px, calc(100svh - 77px), 1160px); padding: clamp(28px, 5.5vh, 88px) 0 clamp(24px, 4.5vh, 60px); pointer-events: none; }\r\n#shl-accueil .atlas-over > * { position: relative; z-index: 1; grid-column: 1; pointer-events: auto; }\r\n#shl-accueil .atlas-copy .sec-title { font-size: clamp(28px, min(2.8vw, 4.6vh), 42px); }\r\n#shl-accueil .atlas-copy .sec-copy { margin-top: clamp(12px, 2.2vh, 20px); font-size: clamp(15px, 2.2vh, 16px); line-height: 1.6; }\r\n#shl-accueil .atlas-over > .atlas-canvas { position: absolute; inset: 0; z-index: 0; -webkit-mask-image: linear-gradient(180deg, transparent, #000 28px, #000 calc(100% - 28px), transparent); mask-image: linear-gradient(180deg, transparent, #000 28px, #000 calc(100% - 28px), transparent); }\r\n#shl-accueil .atlas-canvas canvas { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .atlas-over > .map-key { position: absolute; right: max(var(--gut), calc((100% - 1240px) \/ 2)); bottom: clamp(24px, 4.5vh, 60px); display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px 22px; letter-spacing: .04em; text-transform: none; font-size: 12px; color: var(--ink-2); }\r\n#shl-accueil .map-key li { display: inline-flex; align-items: center; gap: 9px; }\r\n#shl-accueil .map-key i { flex: none; }\r\n#shl-accueil .k-hub { width: 11px; height: 11px; border-radius: 50%; background: radial-gradient(circle, var(--ink) 0 2.4px, #fff 2.9px); box-shadow: inset 0 0 0 1.8px var(--ink), 0 0 0 4px rgba(31, 74, 77, .14); }\r\n#shl-accueil .k-arc { width: 24px; height: 11px; border: 2px solid; border-color: var(--t7) var(--t1) transparent var(--accent); border-bottom: 0; border-radius: 12px 12px 0 0; }\r\n#shl-accueil .k-ctry { width: 10px; height: 10px; border-radius: 50%; background: radial-gradient(circle, var(--t1) 0 2px, #fff 2.5px); box-shadow: inset 0 0 0 1.6px var(--t1); }\r\n#shl-accueil .map-tip { position: absolute; top: 0; left: 0; z-index: 2; display: grid; gap: 1px; padding: 8px 12px; background: #fff; border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow-sm); white-space: nowrap; pointer-events: none; opacity: 0; translate: -50% calc(-100% - 14px); transition: opacity .25s; }\r\n#shl-accueil .map-tip.is-on { opacity: 1; }\r\n#shl-accueil .map-tip b { font-size: 14px; font-weight: 700; letter-spacing: -.01em; }\r\n#shl-accueil .map-tip span { font-size: 12.5px; color: var(--muted); }\r\n#shl-accueil .atlas-legend { display: flex; flex-direction: column; min-width: 0; }\r\n#shl-accueil .legend-list { margin-top: clamp(16px, 2.6vh, 26px); border-top: 1px solid var(--line); }\r\n#shl-accueil .pj { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 3px 16px; width: 100%; padding: 9px 8px; border: 0; border-bottom: 1px solid var(--line); background: none; font: inherit; text-align: left; color: var(--ink); cursor: pointer; transition: background-color .25s, box-shadow .25s; }\r\n#shl-accueil .pj:hover, #shl-accueil .pj:focus-visible { background: rgba(31, 74, 77, .05); }\r\n#shl-accueil .pj:focus-visible { outline-offset: -2px; }\r\n#shl-accueil .pj.is-on { background: rgba(31, 74, 77, .08); box-shadow: inset 3px 0 0 var(--ink); }\r\n#shl-accueil .pj-name { font-size: 14.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.01em; }\r\n#shl-accueil .pj-ctry { align-self: baseline; font-size: 13px; font-weight: 700; line-height: 1.4; text-align: right; }\r\n#shl-accueil .pj i { font-style: normal; color: var(--faint); }\r\n#shl-accueil.js .atlas-legend .legend-list { opacity: 0; transform: translateY(6px); transition: opacity .38s var(--ease), transform .38s var(--ease); }\r\n#shl-accueil.js .atlas-legend.is-ready .legend-list { opacity: 1; transform: none; }\r\n#shl-accueil .section { padding: clamp(80px, 11vw, 144px) 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .section.tint { background: var(--tint); }\r\n#shl-accueil .sec-head { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; max-width: 880px; margin-bottom: clamp(40px, 5vw, 60px); }\r\n#shl-accueil .sec-index { display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 600; letter-spacing: .12em; }\r\n#shl-accueil .sec-index, #shl-accueil .sec-index span, #shl-accueil .contact .eyebrow { color: var(--h, var(--muted)); }\r\n#shl-accueil .sec-index::before { content: ''; width: 40px; height: 3px; margin-right: 4px; border-radius: 2px; background: var(--spectrum); flex: none; transform: scaleX(.001); transform-origin: left; transition: transform 1.1s var(--ease) .2s; }\r\n#shl-accueil .is-in .sec-index::before, #shl-accueil .method .sec-index::before { transform: none; }\r\n#shl-accueil .sec-title { margin-top: 18px; font-size: clamp(30px, 3.6vw, 50px); line-height: 1.08; font-weight: 800; letter-spacing: -.032em; text-wrap: balance; }\r\n#shl-accueil .sec-title em, #shl-accueil .contact h2 em { font-style: normal; color: var(--h, var(--soft)); }\r\n#shl-accueil .sec-copy { max-width: 640px; font-size: 18px; line-height: 1.6; color: var(--ink-2); text-wrap: pretty; }\r\n#shl-accueil .sec-copy + .sec-copy { margin-top: 14px; }\r\n#shl-accueil .kinds li { padding: 8px 14px; border: 1px solid var(--line); border-radius: 999px; background: #fff; font-size: 13.5px; font-weight: 600; box-shadow: 0 1px 2px rgba(22, 38, 44, .04); }\r\n#shl-accueil .ident-head { margin-bottom: clamp(48px, 6vw, 80px); }\r\n#shl-accueil .ident-text { display: grid; gap: clamp(22px, 2.6vw, 32px); max-width: 1000px; margin-top: clamp(22px, 2.6vw, 30px); }\r\n#shl-accueil .ident-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px clamp(32px, 4vw, 56px); align-items: start; }\r\n#shl-accueil .ident-body .sec-copy { max-width: none; font-size: 17px; }\r\n#shl-accueil .ident-body .sec-copy + .sec-copy { margin-top: 0; }\r\n#shl-accueil .ident-lead { max-width: none; font-size: clamp(21px, 2vw, 27px); font-weight: 600; line-height: 1.42; letter-spacing: -.018em; color: var(--ink); text-wrap: pretty; }\r\n#shl-accueil .ident-text .sec-copy b { font-weight: 700; color: var(--ink); }\r\n#shl-accueil .bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .bc { --c: var(--accent); --cx: var(--accent); position: relative; display: flex; flex-direction: column; min-width: 0; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .04); }\r\n@supports (grid-template-rows: subgrid){#shl-accueil .bc { display: grid; grid-row: span 2; grid-template-rows: subgrid; row-gap: 0; }\r\n}#shl-accueil .bc-stage { position: relative; display: grid; place-items: center; min-height: 292px; margin: 10px 10px 0; padding: 22px 18px; overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .bc-stage::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); pointer-events: none; }\r\n#shl-accueil .bc-stage > * { position: relative; }\r\n#shl-accueil .bc-head { padding: 24px 28px 30px; }\r\n#shl-accueil .bc-kicker { color: var(--cx); display: flex; align-items: center; gap: 10px; }\r\n#shl-accueil .bc-kicker::before { content: ''; width: 18px; height: 3px; border-radius: 2px; background: var(--c); flex: none; }\r\n#shl-accueil .bc h3 { margin-top: 12px; font-size: 21px; font-weight: 700; line-height: 1.25; letter-spacing: -.02em; text-wrap: balance; }\r\n#shl-accueil .bc-head > p:last-child { margin-top: 12px; font-size: 15px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .sc-card { background: #fff; border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow-sm); }\r\n#shl-accueil .pil { display: grid; justify-items: center; width: min(100%, 320px); }\r\n#shl-accueil .pil-fig { position: relative; width: 100%; }\r\n#shl-accueil .pil-art { display: block; width: 100%; height: auto; overflow: visible; }\r\n#shl-accueil .pil-name { position: absolute; left: 0; right: 0; top: 21.33%; transform: translateY(-50%); font-size: 12.5px; font-weight: 600; line-height: 1; letter-spacing: -.005em; color: #fff; text-align: center; }\r\n#shl-accueil .pil-key { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); width: 100%; margin-top: 14px; font-size: 12px; font-weight: 600; line-height: 1.35; color: var(--muted); text-align: center; }\r\n#shl-accueil .pil-key .is-new { color: color-mix(in srgb, var(--k) 68%, var(--ink)); }\r\n#shl-accueil .pil-name, #shl-accueil .pil-key .is-new { transition: opacity .16s, filter .16s; }\r\n#shl-accueil .sc-pil:not(.is-b) .pil-name, #shl-accueil .sc-pil:not(.is-b) .pil-key .is-new { opacity: 0; filter: blur(4px); }\r\n#shl-accueil .sc-pil.is-b .pil-name, #shl-accueil .sc-pil.is-b .pil-key .is-new { transition: opacity .5s var(--ease) calc(var(--i, 0) * 90ms), filter .5s var(--ease) calc(var(--i, 0) * 90ms); }\r\n#shl-accueil .dos { display: grid; gap: 12px; width: min(100%, 330px); }\r\n#shl-accueil .dos-key { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 20px; font-size: 12px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .dos-key span { display: inline-flex; align-items: center; gap: 7px; color: color-mix(in srgb, var(--k) 70%, var(--ink)); }\r\n#shl-accueil .dos-key svg { flex: none; width: 10px; height: 15px; overflow: visible; fill: var(--k); }\r\n#shl-accueil .dos-art { display: block; width: 100%; height: auto; overflow: visible; }\r\n#shl-accueil .dos-slot { fill: none; stroke: #d5ddd8; stroke-dasharray: 3 3; }\r\n#shl-accueil .dos-brace { fill: none; stroke: #d5ddd8; }\r\n#shl-accueil .dos-brace.is-you { stroke: color-mix(in srgb, var(--c) 45%, #fff); }\r\n#shl-accueil .dos-paper { fill: #fff; stroke: #e0e6e0; }\r\n#shl-accueil .dos-lift { fill: #16262c; fill-opacity: .2; opacity: 0; }\r\n#shl-accueil .dos-title { fill: #d3dcd8; }\r\n#shl-accueil .dos-bed { fill: #edf1ed; }\r\n#shl-accueil .dos-fill.is-shl { fill: var(--faint); }\r\n#shl-accueil .dos-fill.is-you { fill: var(--c); }\r\n#shl-accueil .dos-ok circle { fill: var(--c); }\r\n#shl-accueil .dos-ok path { fill: none; stroke: #fff; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .dos-cur { stroke: #fff; stroke-width: 1.3; stroke-linejoin: round; }\r\n#shl-accueil .dos-cur.is-shl { fill: var(--soft); }\r\n#shl-accueil .dos-cur.is-you { fill: var(--c); }\r\n#shl-accueil .dos-ticks { display: grid; grid-template-columns: 1fr 2fr; margin-top: -4px; font-size: 12px; line-height: 1.35; color: var(--muted); text-align: center; }\r\n#shl-accueil .dos-ticks b { display: block; font-weight: 700; color: var(--ink-2); }\r\n#shl-accueil .dos-ticks .is-you, #shl-accueil .dos-ticks .is-you b { color: color-mix(in srgb, var(--c) 72%, var(--ink)); }\r\n#shl-accueil .sc-net { display: block; padding: 0; }\r\n#shl-accueil .bc-stage > .net-svg { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .net-band { fill: none; stroke: #f1f4f0; }\r\n#shl-accueil .net-line { fill: none; stroke: color-mix(in srgb, var(--c) 60%, #fff); stroke-width: 1.6; stroke-linecap: round; opacity: 0; }\r\n#shl-accueil .net-line.is-on { opacity: 1; }\r\n#shl-accueil .sc-net.is-fade .net-line { opacity: 0; transition: opacity .6s var(--ease); }\r\n#shl-accueil .net-dot { fill: var(--c); opacity: 0; filter: drop-shadow(0 0 3px var(--c)); }\r\n#shl-accueil .net-dot.is-on { opacity: 1; }\r\n#shl-accueil .bc-stage > .net-node { position: absolute; left: var(--x); top: var(--y); width: 44px; height: 44px; margin: -22px 0 0 -22px; padding: 4px; border-radius: 50%; background: #fff; box-shadow: 0 0 0 1px var(--line), 0 6px 14px -8px rgba(22, 38, 44, .35); transition: box-shadow .5s var(--ease); }\r\n#shl-accueil .net-node::after { content: ''; position: absolute; inset: 4px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(22, 38, 44, .1); }\r\n#shl-accueil .net-node svg { width: 36px; height: 36px; border-radius: 50%; filter: grayscale(1); opacity: .4; transition: filter .6s var(--ease), opacity .6s var(--ease); }\r\n#shl-accueil .net-node.is-on { box-shadow: 0 0 0 1.5px var(--c), 0 0 0 6px color-mix(in srgb, var(--c) 14%, transparent), 0 6px 14px -8px rgba(22, 38, 44, .35); }\r\n#shl-accueil .sc-net.is-live .net-node.is-on { animation: net-pop .55s var(--ease); }\r\n#shl-accueil .net-node.is-on svg { filter: none; opacity: 1; }\r\n#shl-accueil .net-node:nth-of-type(1) { --x: 16.6%; --y: 56%; }\r\n#shl-accueil .net-node:nth-of-type(2) { --x: 26.8%; --y: 32%; }\r\n#shl-accueil .net-node:nth-of-type(3) { --x: 41.7%; --y: 18.6%; }\r\n#shl-accueil .net-node:nth-of-type(4) { --x: 58.3%; --y: 18.6%; }\r\n#shl-accueil .net-node:nth-of-type(5) { --x: 73.2%; --y: 32%; }\r\n#shl-accueil .net-node:nth-of-type(6) { --x: 83.4%; --y: 56%; }\r\n#shl-accueil .net-node:nth-of-type(1) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .net-node:nth-of-type(2) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .net-node:nth-of-type(3) { --c: var(--t8); --cx: var(--x8); }\r\n#shl-accueil .net-node:nth-of-type(4) { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .net-node:nth-of-type(5) { --c: var(--t10); --cx: var(--x10); }\r\n#shl-accueil .net-node:nth-of-type(6) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .bc-stage > .net-core { position: absolute; left: var(--x, 50%); top: var(--y, 85%); transform: translate(-50%, -50%); padding: 9px 16px; border-radius: 999px; background: var(--ink); color: #fff; font-size: 13px; font-weight: 700; white-space: nowrap; box-shadow: 0 10px 22px -10px rgba(22, 38, 44, .6); }\r\n#shl-accueil .net-core::after { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; }\r\n#shl-accueil .net-core.is-ping::after { animation: net-ping .9s var(--ease) both; }\r\n#shl-accueil .bc-stage > .net-key { position: absolute; left: 16px; top: 14px; display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 12px; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .net-key span { display: inline-flex; align-items: center; gap: 7px; }\r\n#shl-accueil .net-key i, #shl-accueil .net-key svg { width: 14px; height: 14px; border-radius: 50%; }\r\n#shl-accueil .net-key i { box-shadow: inset 0 0 0 1.5px #cdd6d0; }\r\n@keyframes net-pop{45% { transform: scale(1.1); }}@keyframes net-ping{from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--c) 50%, transparent); } to { box-shadow: 0 0 0 14px transparent; }}#shl-accueil .terr { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 20px; }\r\n#shl-accueil .fields { display: flex; flex-direction: column; gap: 10px; }\r\n#shl-accueil .field { --c: var(--accent); --cx: var(--accent); position: relative; display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 0 18px; padding: 24px 26px 26px 22px; overflow: hidden; border: 1px solid var(--line); border-radius: var(--r-xl); transition: background-color .45s var(--ease), border-color .45s, box-shadow .45s var(--ease); }\r\n#shl-accueil .field:hover { background: rgba(255, 255, 255, .6); }\r\n#shl-accueil .field.is-on { background: #fff; border-color: #dfe5df; box-shadow: var(--shadow); }\r\n#shl-accueil .field-icon { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 12px; background: color-mix(in srgb, var(--c) 12%, #fff); color: var(--c); }\r\n#shl-accueil .field-icon svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .field .mono { margin-top: 3px; color: color-mix(in srgb, var(--c) 70%, #000); }\r\n#shl-accueil .field h3 { margin-top: 8px; font-size: 19px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; }\r\n#shl-accueil .field-btn { padding: 0; border: 0; background: none; font: inherit; letter-spacing: inherit; text-align: left; cursor: pointer; }\r\n#shl-accueil .field-btn::after { content: ''; position: absolute; inset: 0; border-radius: inherit; }\r\n#shl-accueil .field-btn:focus-visible { outline: none; }\r\n#shl-accueil .field:has(.field-btn:focus-visible) { outline: 2px solid var(--accent); outline-offset: 3px; }\r\n#shl-accueil .field h3 + p { margin-top: 10px; font-size: 15px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .field-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: var(--c); transform: scaleX(0); transform-origin: left; opacity: 0; transition: opacity .3s; }\r\n#shl-accueil .field.is-on .field-bar { opacity: 1; transform: none; }\r\n#shl-accueil .terr.is-auto .field.is-on .field-bar { animation: field-run 7s linear both; }\r\n#shl-accueil .terr.is-auto:hover .field.is-on .field-bar, #shl-accueil .terr.is-hold .field.is-on .field-bar { animation-play-state: paused; }\r\n@keyframes field-run{from { transform: scaleX(0); } to { transform: none; }}#shl-accueil .terr-map { display: flex; flex-direction: column; min-width: 0; margin: 0; overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: var(--shadow); }\r\n#shl-accueil .terr-head { display: flex; justify-content: space-between; gap: 12px; padding: 14px 20px; border-bottom: 1px solid var(--line-2); }\r\n#shl-accueil .terr-head b { font-weight: 500; color: var(--ink); }\r\n#shl-accueil .terr-stage { position: relative; flex: 1; min-height: 460px; }\r\n#shl-accueil .terr-stage canvas { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; }\r\n#shl-accueil .drom { position: absolute; left: 16px; top: 16px; bottom: 16px; display: grid; grid-template-rows: repeat(5, minmax(0, 1fr)); gap: 8px; width: clamp(92px, 8.4vw, 116px); }\r\n#shl-accueil .drom li { display: flex; align-items: flex-end; justify-content: center; padding-bottom: 7px; border: 1px solid var(--line-2); border-radius: 12px; background: var(--canvas); font: 500 11.5px\/1 var(--mono); color: var(--muted); transition: border-color .5s var(--ease), background-color .5s var(--ease), color .5s; }\r\n#shl-accueil .terr.is-dom .drom li { border-color: color-mix(in srgb, var(--t5) 40%, #fff); background: color-mix(in srgb, var(--t5) 6%, #fff); color: color-mix(in srgb, var(--t5) 70%, #000); }\r\n#shl-accueil .terr-key { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 14px 20px; border-top: 1px solid var(--line-2); font-size: 12.5px; font-weight: 600; color: var(--faint); }\r\n#shl-accueil .terr-key li { display: inline-flex; align-items: center; gap: 8px; transition: color .16s; }\r\n#shl-accueil .terr-key i { width: 9px; height: 9px; border-radius: 50%; background: #cfd8d3; transition: background-color .16s; }\r\n#shl-accueil .terr-key li.is-on { color: var(--kx); transition: color .38s var(--ease); }\r\n#shl-accueil .terr-key li.is-on i { background: var(--k); transition: background-color .38s var(--ease); }\r\n#shl-accueil .kinds ul { display: flex; flex-wrap: wrap; gap: 8px; }\r\n#shl-accueil .kinds li { color: var(--ink-2); }\r\n#shl-accueil .method { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: clamp(40px, 6vw, 96px); }\r\n#shl-accueil .method-sticky { position: sticky; top: 120px; }\r\n#shl-accueil .method .sec-copy { margin-top: 22px; }\r\n#shl-accueil .rail { position: relative; margin-top: 40px; padding-left: 28px; }\r\n#shl-accueil .rail-track { position: absolute; left: 5px; top: 18px; bottom: 18px; width: 2px; border-radius: 2px; background: var(--line); overflow: hidden; }\r\n#shl-accueil .rail-track span { position: absolute; inset: 0; background: linear-gradient(180deg, var(--t1), var(--t3), var(--t5), var(--t7), var(--t9)); transform: scaleY(0); transform-origin: top; }\r\n#shl-accueil .rail li { position: relative; }\r\n#shl-accueil .rail li:nth-child(1), #shl-accueil .step:nth-child(1) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .rail li:nth-child(2), #shl-accueil .step:nth-child(2) { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .rail li:nth-child(3), #shl-accueil .step:nth-child(3) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .rail li:nth-child(4), #shl-accueil .step:nth-child(4) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .rail li:nth-child(5), #shl-accueil .step:nth-child(5) { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .rail li::before { content: ''; position: absolute; left: -28px; top: 50%; width: 12px; height: 12px; margin-top: -6px; border: 2px solid var(--line); border-radius: 50%; background: #fff; transition: border-color .4s, background-color .4s, box-shadow .4s, transform .4s var(--ease); }\r\n#shl-accueil .rail li.is-past::before { border-color: var(--c); background: var(--c); }\r\n#shl-accueil .rail li.is-active::before { border-color: var(--c); transform: scale(1.2); box-shadow: 0 0 0 5px color-mix(in srgb, var(--c) 18%, transparent); }\r\n#shl-accueil .rail a { display: flex; align-items: baseline; gap: 14px; padding: 9px 0; font-size: 15px; font-weight: 600; color: var(--faint); transition: color .4s var(--ease); }\r\n#shl-accueil .rail a span { font: 500 12px\/1 var(--mono); }\r\n#shl-accueil .rail li.is-past a { color: var(--ink-2); }\r\n#shl-accueil .rail li.is-active a { color: var(--cx); }\r\n#shl-accueil .steps { display: grid; gap: 20px; }\r\n#shl-accueil .step { padding: 36px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); transition: opacity .5s var(--ease), box-shadow .5s var(--ease), border-color .5s; }\r\n#shl-accueil .method.is-live .step { opacity: .55; }\r\n#shl-accueil .method.is-live .step.is-active { opacity: 1; border-color: #dce2dc; box-shadow: var(--shadow); }\r\n#shl-accueil .step-top { color: var(--cx); display: flex; align-items: baseline; gap: 14px; }\r\n#shl-accueil .step-top .big { font: 800 44px\/1 var(--font); letter-spacing: -.04em; color: var(--c); }\r\n#shl-accueil .step-label { display: grid; gap: 9px; }\r\n#shl-accueil .step-bar { display: flex; gap: 5px; }\r\n#shl-accueil .step-bar i { position: relative; width: 18px; height: 4px; border-radius: 4px; background: var(--line); overflow: hidden; }\r\n#shl-accueil .step-bar i.now { width: 34px; }\r\n#shl-accueil .step-bar i::after { content: ''; position: absolute; inset: 0; border-radius: inherit; background: color-mix(in srgb, var(--c) 42%, #fff); transform: scaleX(0); transform-origin: left; transition: transform .8s var(--ease) calc(var(--k) * 90ms + .25s); }\r\n#shl-accueil .step-bar i.now::after { background: var(--c); }\r\n#shl-accueil .step-bar i:is(.done, .now)::after { transform: none; }\r\n#shl-accueil .step-bar i:nth-child(1) { --k: 0; }\r\n#shl-accueil .step-bar i:nth-child(2) { --k: 1; }\r\n#shl-accueil .step-bar i:nth-child(3) { --k: 2; }\r\n#shl-accueil .step-bar i:nth-child(4) { --k: 3; }\r\n#shl-accueil .step-bar i:nth-child(5) { --k: 4; }\r\n@media (min-width: 1061px){#shl-accueil .method.is-live .step:not(.is-active) .step-bar i::after { transform: scaleX(0); transition-duration: .4s; transition-delay: 0s; }\r\n}#shl-accueil .step h3 { margin-top: 22px; font-size: 24px; font-weight: 700; letter-spacing: -.02em; line-height: 1.25; }\r\n#shl-accueil .step h3 + p { max-width: 580px; margin-top: 12px; font-size: 15.5px; line-height: 1.7; color: var(--ink-2); }\r\n#shl-accueil .tools { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-top: 24px; }\r\n#shl-accueil .tools li { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 10px; font-size: 14px; font-weight: 600; }\r\n#shl-accueil .tools svg { flex: none; width: 16px; height: 16px; fill: none; stroke: var(--accent); stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .projects { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; }\r\n#shl-accueil .project { position: relative; display: flex; flex: 0 1 calc((100% - 40px) \/ 3); min-width: 0; flex-direction: column; padding: 28px; overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .project:nth-child(1) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .project:nth-child(2) { --c: var(--t6); --cx: var(--x6); }\r\n#shl-accueil .project:nth-child(3) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .project:nth-child(4) { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .project:nth-child(5) { --c: var(--t10); --cx: var(--x10); }\r\n#shl-accueil .project:nth-child(6) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .project:nth-child(7) { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .project:nth-child(8) { --c: var(--t8); --cx: var(--x8); }\r\n#shl-accueil .project:nth-child(9) { --c: var(--t2); --cx: var(--x2); }\r\n#shl-accueil .project:nth-child(10) { --c: var(--t4); --cx: var(--x4); }\r\n#shl-accueil .project:nth-child(11) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .project:nth-child(12) { --c: var(--t6); --cx: var(--x6); }\r\n#shl-accueil .project:nth-child(13) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .project:nth-child(14) { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .project::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--c); transform: scaleX(0); transform-origin: left; transition: transform .6s var(--ease); }\r\n#shl-accueil .project:hover::before { transform: none; }\r\n#shl-accueil .duo { position: relative; height: 164px; margin: -12px -12px 24px; overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .duo::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); }\r\n#shl-accueil .duo-arc { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }\r\n#shl-accueil .duo-arc path { fill: none; stroke-linecap: round; }\r\n#shl-accueil .duo-track { stroke: #cfd8d3; stroke-width: 1.5; stroke-dasharray: 0 5; }\r\n#shl-accueil .duo-line { stroke: var(--c); stroke-width: 2; stroke-dasharray: 1; stroke-dashoffset: 0; transition: stroke-dashoffset 1s var(--ease-io) var(--dl, 0s); }\r\n#shl-accueil .duo-spark { stroke: #fff; stroke-width: 3; stroke-dasharray: .05 1.2; stroke-dashoffset: .05; opacity: 0; filter: drop-shadow(0 0 2px var(--c)) drop-shadow(0 0 5px var(--c)); }\r\n#shl-accueil .duo.is-play .duo-spark { animation: duo-spark 4.2s var(--ease-io) calc(2.2s + var(--dl, 0s)) infinite; }\r\n#shl-accueil .duo-home, #shl-accueil .duo-node { position: absolute; left: var(--x, 25%); top: var(--y, 56%); transform: translate(-50%, -50%); }\r\n#shl-accueil .duo-home { left: max(76px, 23%); display: grid; place-items: center; width: 124px; height: 72px; background: #fff; border: 1px solid var(--line); border-radius: 18px; box-shadow: var(--shadow-sm); --iw: 100px; --ih: 44px; }\r\n#shl-accueil .duo-fit { --s: min(calc(var(--iw) \/ var(--bw)), calc(var(--ih) \/ var(--bh))); overflow: hidden; }\r\n#shl-accueil .duo .duo-fit > img { position: absolute; border-radius: 0; max-width: none; width: calc(var(--n, 500) * var(--s)); height: calc(var(--n, 500) * var(--s)); left: calc(50% - (var(--bx) + var(--bw) \/ 2) * var(--s)); top: calc(50% - (var(--by) + var(--bh) \/ 2) * var(--s)); }\r\n#shl-accueil .duo-home:not(.duo-fit) > img { width: auto; height: auto; max-width: var(--iw); max-height: var(--ih); border-radius: 0; }\r\n#shl-accueil .duo-name { padding: 8px; font-size: 13px; font-weight: 800; line-height: 1.15; letter-spacing: -.01em; text-align: center; color: color-mix(in srgb, var(--c) 72%, var(--ink)); }\r\n#shl-accueil .duo-node { width: 52px; height: 52px; padding: 4px; border-radius: 50%; background: #fff; box-shadow: 0 0 0 1.5px var(--c), 0 0 0 6px color-mix(in srgb, var(--c) 14%, transparent), 0 6px 14px -8px rgba(22, 38, 44, .35); transition: box-shadow .5s var(--ease) calc(.8s + var(--dl, 0s)); }\r\n#shl-accueil .duo-node > svg, #shl-accueil .duo-node > img { width: 100%; height: 100%; border-radius: 50%; transition: filter .6s var(--ease) calc(.8s + var(--dl, 0s)), opacity .6s var(--ease) calc(.8s + var(--dl, 0s)); }\r\n#shl-accueil .duo-node.is-sm { width: 40px; height: 40px; padding: 3px; }\r\n#shl-accueil .duo-node.is-tile { --iw: 84px; --ih: 30px; width: 104px; height: 48px; padding: 0; border-radius: 14px; }\r\n#shl-accueil .duo-badge { position: absolute; width: 20px; height: 20px; border-radius: 50%; box-shadow: 0 0 0 2px #fff; transform: translate(-50%, -50%); transition: opacity .4s var(--ease) calc(.9s + var(--dl, 0s)); }\r\n#shl-accueil .duo-hub { color: var(--accent); }\r\n#shl-accueil .duo-hub svg { fill: currentColor; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; }\r\n#shl-accueil .duo-seal { position: absolute; left: 12px; top: 12px; z-index: 2; display: inline-flex; align-items: center; gap: 7px; padding: 4px 10px 4px 4px; background: #fff; border: 1px solid var(--line); border-radius: 999px; box-shadow: var(--shadow-sm); font: 500 11.5px\/1 var(--mono); color: var(--ink); white-space: nowrap; transform-origin: left top; transition: opacity .38s var(--ease) 1.35s, transform .5s var(--ease) 1.35s; }\r\n#shl-accueil .duo-seal svg { width: 18px; height: 18px; border-radius: 50%; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-line { stroke-dashoffset: 1; transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-node { box-shadow: 0 0 0 1px var(--line), 0 6px 14px -8px rgba(22, 38, 44, .35); transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-node > svg, #shl-accueil.js .duo:not(.is-play) .duo-node > img { filter: grayscale(1); opacity: .45; transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-badge { opacity: 0; transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-seal { opacity: 0; transform: scale(.86); transition: none; }\r\n@keyframes duo-spark{0% { stroke-dashoffset: .05; opacity: 0; } 4% { opacity: 1; } 34% { stroke-dashoffset: -1; opacity: 1; } 38%, 100% { stroke-dashoffset: -1; opacity: 0; }}#shl-accueil .project .theme { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 700; color: color-mix(in srgb, var(--c) 72%, #000); }\r\n#shl-accueil .project .theme::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--c); }\r\n#shl-accueil .project .place { margin-top: 20px; }\r\n#shl-accueil .project h3 { margin-top: 8px; font-size: 20px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; }\r\n#shl-accueil .project h3 + p { flex: 1; margin-top: 12px; font-size: 14.5px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .quotes { display: grid; grid-template-columns: 1.3fr 1fr 1fr; gap: 20px; }\r\n#shl-accueil .quote { display: flex; flex-direction: column; padding: 32px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .quote:nth-child(1) { --c: var(--t2); --cx: var(--x2); }\r\n#shl-accueil .quote:nth-child(2) { --c: var(--t8); --cx: var(--x8); }\r\n#shl-accueil .quote:nth-child(3) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .quote.feature { position: relative; overflow: hidden; }\r\n#shl-accueil .quote.feature::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--spectrum); }\r\n#shl-accueil .quote .mark { height: 34px; font: 800 64px\/.9 var(--font); color: var(--c); }\r\n#shl-accueil .quote blockquote { flex: 1; margin-top: 14px; font-size: 15.5px; line-height: 1.7; color: var(--ink); }\r\n#shl-accueil .quote.feature blockquote { font-size: 20px; line-height: 1.5; font-weight: 600; letter-spacing: -.012em; }\r\n#shl-accueil .quote figcaption { display: flex; align-items: center; gap: 12px; margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--line-2); }\r\n#shl-accueil .quote .face { flex: none; width: 48px; height: 48px; border-radius: 50%; object-fit: cover; box-shadow: 0 0 0 2px #fff, 0 0 0 3px color-mix(in srgb, var(--c) 45%, #fff); }\r\n#shl-accueil .quote figcaption b { display: block; font-size: 14.5px; font-weight: 700; }\r\n#shl-accueil .quote .role { display: block; font-size: 13px; font-weight: 600; color: var(--cx); }\r\n#shl-accueil .trust { --lift: 0 0 0 1px rgba(22, 38, 44, .06), 0 1px 2px rgba(22, 38, 44, .05), 0 6px 12px -6px rgba(22, 38, 44, .12), 0 18px 32px -18px rgba(22, 38, 44, .2);\r\n  --lift-hi: 0 0 0 1px rgba(22, 38, 44, .07), 0 2px 4px rgba(22, 38, 44, .06), 0 14px 24px -10px rgba(22, 38, 44, .22), 0 34px 50px -24px rgba(22, 38, 44, .32);\r\n  --roll: cubic-bezier(.76, 0, .24, 1); }\r\n#shl-accueil .trust .sc-cap, #shl-accueil .trust .sc-count { position: absolute; top: 14px; z-index: 2; font-size: 12.5px; font-weight: 600; line-height: 1.3; transition: color .5s, opacity .4s var(--ease); }\r\n#shl-accueil .trust .sc-cap { left: 16px; display: flex; align-items: center; gap: 9px; color: var(--kx, var(--cx)); }\r\n#shl-accueil .trust .sc-cap i { position: relative; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--k, var(--c)); transition: background-color .5s; }\r\n#shl-accueil .trust .sc-cap i::after { content: ''; position: absolute; inset: -4px; border-radius: 50%; border: 1.5px solid var(--k, var(--c)); opacity: 0; animation: sc-ping 2.2s var(--ease) infinite; }\r\n#shl-accueil .trust .sc-cap span { transition: opacity .25s, filter .25s; }\r\n#shl-accueil .trust .sc-cap span.is-swap { opacity: 0; filter: blur(4px); }\r\n#shl-accueil .trust .sc-count { right: 16px; color: var(--muted); font-variant-numeric: tabular-nums; }\r\n#shl-accueil .trust .sc-timer { position: absolute; left: 0; bottom: 0; width: 1px; height: 1px; visibility: hidden; pointer-events: none; }\r\n#shl-accueil .trust .is-auto .sc-timer.is-run { animation: sc-run var(--hold, 3s) linear both; }\r\n#shl-accueil .trust .is-hold .sc-timer.is-run { animation-play-state: paused; }\r\n@media (hover: hover){#shl-accueil .trust .is-auto:hover .sc-timer.is-run { animation-play-state: paused; }\r\n}@keyframes sc-ping{0% { transform: scale(.4); opacity: .8; } 100% { transform: scale(1.9); opacity: 0; }}@keyframes sc-run{from { transform: scaleX(0); } to { transform: none; }}#shl-accueil .trust svg.ic { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .trust [data-k=\"pub\"] { --k: var(--t7); --kx: var(--x7); }\r\n#shl-accueil .trust [data-k=\"eu\"] { --k: var(--t8); --kx: var(--x8); }\r\n#shl-accueil .trust [data-k=\"pri\"] { --k: var(--t3); --kx: var(--x3); }\r\n@media (min-width: 1061px){#shl-accueil .trust { grid-template-columns: repeat(12, minmax(0, 1fr)); }\r\n#shl-accueil .trust > .bc:nth-child(1) { grid-column: span 7; }\r\n#shl-accueil .trust > .bc:nth-child(2) { grid-column: span 5; }\r\n#shl-accueil .trust > .bc-wide { display: grid; grid-column: 1 \/ -1; grid-row: auto; grid-template-rows: none; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); align-items: center; }\r\n#shl-accueil .bc-wide .bc-head { order: -1; padding: 32px 40px; }\r\n#shl-accueil .bc-wide .bc-stage { min-height: 250px; margin: 10px; }\r\n}#shl-accueil .sc-ros { padding: 20px 24px; container-type: inline-size; }\r\n#shl-accueil .ros { display: grid; grid-template-columns: minmax(0, 200px) minmax(0, 1fr); align-items: center; gap: 30px; width: 100%; }\r\n#shl-accueil .ros-side { display: grid; justify-items: start; min-width: 0; }\r\n#shl-accueil .ros-num [data-odo] { display: flex; }\r\n#shl-accueil .ros-num { display: flex; font-size: 76px; font-weight: 800; line-height: 1; letter-spacing: -.05em; color: var(--ink); }\r\n#shl-accueil .odo { position: relative; display: block; height: 1em; overflow: hidden; transition: width 2.4s cubic-bezier(.2, .9, .1, 1) var(--od, 0ms); -webkit-mask-image: linear-gradient(transparent, #000 22%, #000 78%, transparent); mask-image: linear-gradient(transparent, #000 22%, #000 78%, transparent); }\r\n#shl-accueil .odo > i { display: block; font-style: normal; visibility: hidden; }\r\n#shl-accueil .odo > span { position: absolute; left: 0; right: 0; top: 0; text-align: center; transition: transform 2.4s cubic-bezier(.2, .9, .1, 1) var(--od, 0ms); }\r\n#shl-accueil .odo > span > span { display: block; height: 1em; }\r\n#shl-accueil .ros-cap { max-width: 180px; margin-top: 12px; font-size: 14px; font-weight: 600; line-height: 1.35; color: var(--ink-2); }\r\n#shl-accueil .ros-roll { height: 264px; overflow: hidden; -webkit-mask-image: linear-gradient(transparent, #000 18%, #000 82%, transparent); mask-image: linear-gradient(transparent, #000 18%, #000 82%, transparent); }\r\n#shl-accueil .ros.is-loop .ros-track { animation: ros-up var(--dur, 64s) linear infinite; }\r\n@keyframes ros-up{to { transform: translateY(-50%); }}#shl-accueil .ros-list li { display: flex; align-items: center; gap: 14px; padding: 8px 2px; }\r\n#shl-accueil .ros-logo { position: relative; display: flex; align-items: center; justify-content: center; flex: none; width: 72px; height: 44px; border-radius: 11px; background: #fff; box-shadow: inset 0 0 0 1px var(--line); --iw: 60px; --ih: 32px; }\r\n#shl-accueil .ros-logo > img { width: auto; height: auto; max-width: var(--iw); max-height: var(--ih); }\r\n#shl-accueil .ros-logo.duo-fit > img { position: absolute; max-width: none; max-height: none; width: calc(500 * var(--s)); height: calc(500 * var(--s)); left: calc(50% - (var(--bx) + var(--bw) \/ 2) * var(--s)); top: calc(50% - (var(--by) + var(--bh) \/ 2) * var(--s)); }\r\n#shl-accueil .ros-tx { display: grid; gap: 1px; min-width: 0; }\r\n#shl-accueil .ros-tx b { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 2; font-size: 14.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.012em; color: var(--ink); text-wrap: balance; }\r\n#shl-accueil .ros-tx small { overflow: hidden; font-size: 12px; font-weight: 600; line-height: 1.45; color: var(--muted); white-space: nowrap; text-overflow: ellipsis; }\r\n#shl-accueil .ros-tx small em, #shl-accueil .ros-tx small i { font-style: normal; }\r\n#shl-accueil .ros-tx small em { color: var(--ink-2); }\r\n@container (max-width: 540px){#shl-accueil .ros { grid-template-columns: minmax(0, 1fr); gap: 14px; }\r\n#shl-accueil .ros-side { grid-template-columns: auto minmax(0, 1fr); align-items: end; column-gap: 14px; }\r\n#shl-accueil .ros-num { font-size: 56px; }\r\n#shl-accueil .ros-cap { margin: 0 0 4px; }\r\n#shl-accueil .ros-roll { height: 300px; }\r\n#shl-accueil .ros-logo { width: 60px; height: 40px; border-radius: 10px; --iw: 50px; --ih: 28px; }\r\n#shl-accueil .ros-tx small { white-space: normal; }\r\n}#shl-accueil .sc-anc { --hold: 2.8s; padding: 46px 18px 18px; container-type: inline-size; }\r\n#shl-accueil .sc-anc .anc-tag, #shl-accueil .sc-anc .anc-fam li, #shl-accueil .sc-anc .anc-core { cursor: pointer; }\r\n#shl-accueil .anc { position: relative; display: grid; grid-template-columns: 92px minmax(0, 1fr); align-items: center; gap: 30px; width: 100%; }\r\n#shl-accueil .anc > .anc-wires { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }\r\n#shl-accueil .anc-wire { fill: none; stroke: #d9e1db; stroke-width: 1.25; }\r\n#shl-accueil .anc-comet { fill: none; stroke: var(--k); stroke-width: 2.4; stroke-linecap: round; }\r\n#shl-accueil .anc-head { fill: #fff; stroke: var(--k); stroke-width: 2; opacity: 0; filter: drop-shadow(0 0 4px var(--k)); }\r\n#shl-accueil .anc-hub { position: relative; z-index: 1; display: grid; justify-items: center; gap: 10px; text-align: center; }\r\n#shl-accueil .anc-hub > b { font-size: 12px; font-weight: 700; line-height: 1.25; color: var(--ink); }\r\n#shl-accueil .anc-core { position: relative; display: grid; place-items: center; width: 72px; height: 72px; border-radius: 50%; background: #fff; box-shadow: var(--lift); }\r\n#shl-accueil .anc-core img { width: 54px; height: 54px; }\r\n#shl-accueil .anc-core::after { content: ''; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; }\r\n#shl-accueil .anc-core.is-beat::after { animation: anc-beat 1s var(--ease) both; }\r\n#shl-accueil .anc-core.is-beat { animation: anc-thump .6s var(--ease); }\r\n#shl-accueil .anc-rings { position: absolute; left: 50%; top: 36px; z-index: -1; }\r\n#shl-accueil .anc-rings i { position: absolute; left: calc(var(--r) * -1); top: calc(var(--r) * -1); width: calc(var(--r) * 2); height: calc(var(--r) * 2); border-radius: 50%; border: 1px solid #e6ebe6; }\r\n#shl-accueil .anc-rings i:nth-child(1) { --r: 52px; background: radial-gradient(closest-side, rgba(255, 255, 255, .9), rgba(255, 255, 255, 0)); }\r\n#shl-accueil .anc-rings i:nth-child(2) { --r: 78px; border-style: dashed; border-color: #dce3dd; animation: anc-spin 60s linear infinite; }\r\n#shl-accueil .anc-rings i:nth-child(3) { --r: 106px; border-color: #eef1ec; }\r\n#shl-accueil .anc-fams { position: relative; z-index: 1; display: grid; gap: 14px; }\r\n#shl-accueil .anc-fam { display: grid; grid-template-columns: 86px minmax(0, 1fr); align-items: center; gap: 26px; transition: opacity .6s var(--ease); }\r\n#shl-accueil .anc-tag { position: relative; justify-self: start; display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px 4px 4px; border-radius: 999px; background: #fff; box-shadow: var(--lift); font-size: 11.5px; font-weight: 700; line-height: 18px; color: var(--kx); white-space: nowrap; transition: background-color .5s var(--ease), color .5s var(--ease), box-shadow .5s var(--ease); }\r\n#shl-accueil .anc-tag i { display: grid; place-items: center; width: 20px; height: 20px; overflow: hidden; border-radius: 50%; background: color-mix(in srgb, var(--k) 15%, #fff); color: var(--k); transition: background-color .5s var(--ease), color .5s var(--ease); }\r\n#shl-accueil .anc-tag .ic { width: 11px; height: 11px; }\r\n#shl-accueil .anc-tag i.is-flag svg { width: 20px; height: 20px; }\r\n#shl-accueil .anc-fam ul { display: grid; gap: 6px; min-width: 0; }\r\n#shl-accueil .anc-fam li { display: flex; align-items: center; gap: 8px; min-width: 0; padding: 5px 10px 5px 7px; border-radius: 9px; background: #fff; box-shadow: var(--lift); font-size: 12px; font-weight: 600; line-height: 1.3; color: var(--ink); white-space: nowrap; transition: box-shadow .5s var(--ease), transform .5s var(--ease); }\r\n#shl-accueil .anc-logo { flex: none; display: grid; place-items: center; width: 38px; height: 18px; }\r\n#shl-accueil .anc-logo img { width: auto; height: auto; max-width: 100%; max-height: 100%; }\r\n#shl-accueil .anc-logo img.is-mark { width: 18px; height: 18px; max-width: none; object-fit: cover; object-position: left center; }\r\n#shl-accueil .anc-logo .is-flag { width: 21px; height: 14px; overflow: hidden; border-radius: 3px; box-shadow: 0 0 0 1px rgba(22, 38, 44, .1); }\r\n#shl-accueil .anc-fam li span { overflow: hidden; text-overflow: ellipsis; }\r\n#shl-accueil .anc-fam li.is-ping { box-shadow: 0 0 0 1.5px var(--k), 0 0 0 5px color-mix(in srgb, var(--k) 14%, transparent), 0 8px 16px -8px rgba(22, 38, 44, .25); }\r\n#shl-accueil .anc-fam.is-on .anc-tag { background: color-mix(in srgb, var(--k) 10%, #fff); box-shadow: 0 0 0 1.5px var(--k), 0 10px 20px -10px var(--k); }\r\n#shl-accueil .anc-fam.is-on .anc-tag i { background: var(--k); color: #fff; }\r\n#shl-accueil .sc-anc.has-focus .anc-fam:not(.is-on) { opacity: .5; }\r\n#shl-accueil .anc-hub, #shl-accueil .anc-tag, #shl-accueil .anc-fam li { transition-property: opacity, filter, transform, box-shadow, background-color, color; transition-duration: .7s; transition-timing-function: var(--ease); }\r\n#shl-accueil .anc-wire { transition: stroke-dashoffset 1s var(--ease-io) calc(.2s + var(--f, 0) * .16s); }\r\n#shl-accueil .anc-tag { transition-delay: calc(.55s + var(--f, 0) * .16s); }\r\n#shl-accueil .anc-fam li { transition-delay: calc(.85s + var(--f, 0) * .16s + var(--j, 0) * 60ms); }\r\n#shl-accueil .sc-anc.is-built .anc-tag, #shl-accueil .sc-anc.is-built .anc-fam li { transition-delay: 0s; }\r\n#shl-accueil .sc-anc.is-pre .anc-wire { stroke-dashoffset: calc(-1 * var(--L, 0px)); transition: none; }\r\n#shl-accueil .sc-anc.is-pre .anc-hub { opacity: 0; transform: scale(.9); filter: blur(4px); }\r\n#shl-accueil .sc-anc.is-pre .sc-count { opacity: 0; }\r\n#shl-accueil .sc-anc.is-pre .anc-tag, #shl-accueil .sc-anc.is-pre .anc-fam li { opacity: 0; transform: translateX(-6px); filter: blur(4px); transition-duration: 0s; }\r\n@keyframes anc-spin{to { transform: rotate(360deg); }}@keyframes anc-beat{from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--k, var(--t7)) 45%, transparent); } to { box-shadow: 0 0 0 26px transparent; }}@keyframes anc-thump{30% { transform: scale(1.06); }}@container (max-width: 430px){#shl-accueil .anc { grid-template-columns: 72px minmax(0, 1fr); gap: 22px; }\r\n#shl-accueil .anc-core { width: 60px; height: 60px; }\r\n#shl-accueil .anc-core img { width: 44px; height: 44px; }\r\n#shl-accueil .anc-rings { top: 30px; }\r\n#shl-accueil .anc-hub > b { font-size: 11px; }\r\n#shl-accueil .anc-fams { gap: 10px; }\r\n#shl-accueil .anc-fam { grid-template-columns: minmax(0, 1fr); gap: 6px; }\r\n#shl-accueil .anc-fam li { gap: 5px; font-size: 11.5px; padding: 5px 8px 5px 5px; }\r\n#shl-accueil .anc-logo { width: 26px; height: 16px; }\r\n#shl-accueil .anc-logo img.is-mark { width: 16px; height: 16px; }\r\n}#shl-accueil .sc-tra { --k: var(--t5); --kx: var(--x5); --hold: 1.1s; padding: 22px 26px; container-type: inline-size; }\r\n#shl-accueil .tra { position: relative; display: grid; gap: 12px; width: min(100%, 660px); --cw: 178px; }\r\n#shl-accueil .tra-glow { position: absolute; top: 18%; bottom: 18%; width: 34%; border-radius: 50%; filter: blur(36px); pointer-events: none; transition: opacity 1s var(--ease); }\r\n#shl-accueil .tra-glow.is-shl { left: 4%; background: #cfd9dd; opacity: calc(.7 - var(--p, 0) * .5); }\r\n#shl-accueil .tra-glow.is-you { right: 4%; background: var(--t5); opacity: calc(var(--p, 0) * .22); }\r\n#shl-accueil .tra-head, #shl-accueil .tra-row { display: grid; grid-template-columns: var(--cw) minmax(0, 1fr) var(--cw); align-items: center; }\r\n#shl-accueil .tra-head { margin-bottom: 4px; }\r\n#shl-accueil .tra-who { display: flex; align-items: center; gap: 10px; min-width: 0; transition: opacity .8s var(--ease); }\r\n#shl-accueil .tra-who p { min-width: 0; }\r\n#shl-accueil .tra-who p > b { display: block; font-size: 12.5px; font-weight: 700; line-height: 1.2; color: var(--ink); }\r\n#shl-accueil .tra-who small { display: grid; margin-top: 2px; font-size: 11.5px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .tra-who small span { grid-area: 1 \/ 1; transition: opacity .5s var(--ease), filter .5s var(--ease); }\r\n#shl-accueil .tra-who small span:last-child, #shl-accueil .sc-tra.is-done .tra-who small span:first-child { opacity: 0; filter: blur(3px); }\r\n#shl-accueil .sc-tra.is-done .tra-who small span:last-child { opacity: 1; filter: none; }\r\n#shl-accueil .tra-who.is-shl small { color: var(--muted); }\r\n#shl-accueil .tra-who.is-you small { color: var(--x5); }\r\n#shl-accueil .sc-tra.is-done .tra-who.is-shl { opacity: .5; }\r\n#shl-accueil .tra-av { position: relative; display: grid; place-items: center; flex: none; width: 36px; height: 36px; background: #fff; box-shadow: var(--lift); }\r\n#shl-accueil .tra-who.is-shl .tra-av { border-radius: 10px; }\r\n#shl-accueil .tra-who.is-shl .tra-av img { width: 30px; height: 30px; }\r\n#shl-accueil .tra-who.is-you .tra-av { border-radius: 50%; background: color-mix(in srgb, var(--t5) 14%, #fff); color: var(--x5); }\r\n#shl-accueil .tra-who.is-you .tra-av .ic { width: 17px; height: 17px; }\r\n#shl-accueil .tra-meter { display: grid; gap: 7px; padding: 0 24px; }\r\n#shl-accueil .tra-meter p { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }\r\n#shl-accueil .tra-meter p span { font: 500 10.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .tra-meter p b { font-size: 13px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); font-variant-numeric: tabular-nums; }\r\n#shl-accueil .tra-bar { display: block; height: 6px; overflow: hidden; border-radius: 3px; background: var(--sunk); box-shadow: inset 0 0 0 1px var(--line-2); }\r\n#shl-accueil .tra-bar i { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, color-mix(in srgb, var(--t5) 55%, #fff), var(--t5)); transform: scaleX(var(--p, 0)); transform-origin: left; transition: transform .9s var(--ease); }\r\n#shl-accueil .tra-rows { display: grid; gap: 6px; }\r\n#shl-accueil .tra-row { position: relative; height: 34px; }\r\n#shl-accueil .tra-slot { height: 100%; border: 1px dashed #d3dbd5; border-radius: 10px; }\r\n#shl-accueil .tra-lane { position: relative; height: 0; margin: 0 12px; border-top: 1.5px dashed #d8dfda; }\r\n#shl-accueil .tra-lane::after { content: ''; position: absolute; left: 0; right: 0; top: -1.5px; height: 1.5px; background: linear-gradient(90deg, #b9c6c9, var(--t5)); transform: scaleX(0); transform-origin: left; transition: transform 1s var(--roll); }\r\n#shl-accueil .tra-key { position: absolute; left: 0; top: 0; z-index: 1; width: var(--cw); height: 100%; transition: transform 1s var(--roll); }\r\n#shl-accueil .tra-row.is-moved .tra-key { transform: translateX(var(--dx, 0px)); }\r\n#shl-accueil .tra-row.is-moved .tra-lane::after { transform: scaleX(1); }\r\n#shl-accueil:not(.js) .tra-row.is-moved .tra-key { left: auto; right: 0; }\r\n#shl-accueil .tra-row.no-tr *, #shl-accueil .tra-row.no-tr *::after { transition: none !important; }\r\n#shl-accueil .tra-chip { position: relative; display: flex; align-items: center; gap: 9px; height: 100%; padding: 0 12px 0 5px; border-radius: 10px; background: #fff; box-shadow: var(--lift); font-size: 12.5px; font-weight: 700; line-height: 1; color: var(--ink); white-space: nowrap; transition: box-shadow .5s var(--ease); }\r\n#shl-accueil .tra-chip > i { display: grid; place-items: center; flex: none; width: 24px; height: 24px; border-radius: 7px; background: var(--sunk); color: var(--ink-2); transition: background-color .5s var(--ease), color .5s var(--ease); }\r\n#shl-accueil .tra-chip .ic { width: 13px; height: 13px; }\r\n#shl-accueil .tra-row.is-next .tra-chip { box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--t5) 45%, transparent), 0 1px 2px rgba(22, 38, 44, .05), 0 10px 20px -10px color-mix(in srgb, var(--t5) 55%, transparent); }\r\n#shl-accueil .tra-row.is-flying .tra-chip { animation: tra-hop 1s var(--roll); }\r\n#shl-accueil .tra-row.is-yours .tra-chip { box-shadow: 0 0 0 1px color-mix(in srgb, var(--t5) 30%, transparent), 0 1px 2px rgba(22, 38, 44, .05), 0 6px 12px -6px rgba(22, 38, 44, .12), 0 18px 32px -18px color-mix(in srgb, var(--t5) 45%, transparent); }\r\n#shl-accueil .tra-row.is-yours .tra-chip > i { background: color-mix(in srgb, var(--t5) 16%, #fff); color: var(--x5); }\r\n#shl-accueil .tra-ok { position: absolute; display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--t5); color: #fff; box-shadow: 0 0 0 2px #fff; transform: scale(0); transition: transform .45s cubic-bezier(.34, 1.56, .64, 1); }\r\n#shl-accueil .tra-ok .ic { width: 9px; height: 9px; stroke-width: 3.2; }\r\n#shl-accueil .tra-chip .tra-ok { right: -5px; top: -5px; }\r\n#shl-accueil .tra-row.is-yours .tra-ok, #shl-accueil .sc-tra.is-done .tra-av .tra-ok { transform: scale(1); }\r\n#shl-accueil .tra-av .tra-ok { right: -4px; bottom: -4px; }\r\n#shl-accueil .tra-note { --hold: 3.6s; position: relative; justify-self: center; display: inline-flex; align-items: center; gap: 8px; margin-top: 6px; padding: 6px 12px 6px 7px; border-radius: 999px; background: #fff; box-shadow: var(--lift); font-size: 12px; font-weight: 700; line-height: 1.3; color: var(--x5); text-align: left; opacity: 0; transform: translateY(6px); filter: blur(4px); transition: opacity .6s var(--ease), transform .6s var(--ease), filter .6s var(--ease); }\r\n#shl-accueil .tra-note i { display: grid; place-items: center; flex: none; width: 18px; height: 18px; border-radius: 50%; background: color-mix(in srgb, var(--t5) 16%, #fff); }\r\n#shl-accueil .tra-note .ic { width: 10px; height: 10px; stroke-width: 3; }\r\n#shl-accueil .sc-tra.is-done .tra-note { opacity: 1; transform: none; filter: none; }\r\n#shl-accueil .tra-rows, #shl-accueil .tra-meter { transition: opacity .45s var(--ease); }\r\n#shl-accueil .sc-tra.is-fade .tra-rows, #shl-accueil .sc-tra.is-fade .tra-meter, #shl-accueil .sc-tra.is-fade .tra-note { opacity: 0; }\r\n@keyframes tra-hop{45% { transform: translateY(-7px) scale(1.05) rotate(-1.2deg); box-shadow: var(--lift-hi); }}@container (max-width: 560px){#shl-accueil .tra-head { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); row-gap: 14px; }\r\n#shl-accueil .tra-head .tra-who.is-you { grid-column: 2; grid-row: 1; }\r\n#shl-accueil .tra-meter { grid-column: 1 \/ -1; padding: 0; }\r\n#shl-accueil .tra-row { grid-template-columns: minmax(0, 1fr) 28px minmax(0, 1fr); }\r\n#shl-accueil .tra-lane { margin: 0 6px; }\r\n#shl-accueil .tra-key { width: calc(50% - 14px); }\r\n}@container (max-width: 380px){#shl-accueil .tra-who { gap: 8px; }\r\n#shl-accueil .tra-av { width: 30px; height: 30px; }\r\n#shl-accueil .tra-who.is-shl .tra-av img { width: 25px; height: 25px; }\r\n#shl-accueil .tra-who p > b { font-size: 12px; }\r\n#shl-accueil .tra-chip { gap: 7px; padding-right: 8px; font-size: 12px; }\r\n#shl-accueil .tra-chip > i { width: 22px; height: 22px; }\r\n}#shl-accueil .studio { overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: var(--shadow); }\r\n#shl-accueil .studio-nav { position: relative; padding: 8px; background: var(--canvas); border-bottom: 1px solid var(--line); }\r\n#shl-accueil .studio-tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\r\n#shl-accueil .fmt-thumb { position: absolute; top: 0; left: 0; width: 0; height: 0; border-radius: 14px; background: #fff; box-shadow: 0 1px 2px rgba(14, 27, 46, .06), 0 10px 24px -12px rgba(14, 27, 46, .24); opacity: 0; transition: transform .6s var(--ease), width .6s var(--ease), height .6s var(--ease), opacity .3s; }\r\n#shl-accueil.js .fmt-thumb { opacity: 1; }\r\n#shl-accueil .fmt-tab { --c: var(--accent); --cx: var(--accent); position: relative; z-index: 1; display: flex; flex-direction: column; align-items: flex-start; padding: 14px 18px 17px; overflow: hidden; border: 0; border-radius: 14px; background: transparent; text-align: left; cursor: pointer; transition: background-color .3s; }\r\n#shl-accueil .fmt-tab:hover { background: rgba(255, 255, 255, .6); }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] { background: transparent; }\r\n#shl-accueil:not(.js) .fmt-tab[aria-selected=\"true\"] { background: #fff; }\r\n#shl-accueil .fmt-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; }\r\n#shl-accueil .fmt-n { font: 500 12px\/1 var(--mono); letter-spacing: .1em; color: var(--cx); }\r\n#shl-accueil .fmt-name { margin-top: 10px; font-size: 16px; font-weight: 700; letter-spacing: -.015em; line-height: 1.25; color: var(--ink-2); transition: color .4s; }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] .fmt-name { color: var(--ink); }\r\n#shl-accueil .fmt-meta { margin-top: 6px; font-size: 13px; line-height: 1.4; color: var(--muted); }\r\n#shl-accueil .scale { display: flex; gap: 3px; opacity: .45; transition: opacity .5s var(--ease); }\r\n#shl-accueil .scale i { width: 14px; height: 4px; border-radius: 2px; background: var(--line); }\r\n#shl-accueil .scale i.on { background: var(--c); }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] .scale { opacity: 1; }\r\n#shl-accueil .fmt-timer { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: var(--c); transform: scaleX(0); transform-origin: left; opacity: 0; transition: opacity .3s; }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] .fmt-timer { opacity: 1; transform: none; }\r\n#shl-accueil .studio.is-auto .fmt-tab[aria-selected=\"true\"] .fmt-timer { animation: fmt-run var(--hold, 7s) linear both; }\r\n#shl-accueil .studio.is-auto:hover .fmt-tab[aria-selected=\"true\"] .fmt-timer, #shl-accueil .studio.is-hold .fmt-tab[aria-selected=\"true\"] .fmt-timer { animation-play-state: paused; }\r\n@keyframes fmt-run{from { transform: scaleX(0); } to { transform: none; }}#shl-accueil .studio-body { display: grid; grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr); }\r\n#shl-accueil .fmt-panels { display: grid; }\r\n#shl-accueil .fmt-panel { display: flex; flex-direction: column; justify-content: center; padding: clamp(28px, 3.4vw, 44px) clamp(24px, 3vw, 40px); }\r\n#shl-accueil.js .fmt-panel { grid-area: 1 \/ 1; }\r\n#shl-accueil.js .fmt-panel:not(.is-on) { visibility: hidden; transition: visibility 0s .3s; }\r\n#shl-accueil.js .fmt-panel > * { transition: opacity .6s var(--ease), transform .8s var(--ease), filter .6s var(--ease); transition-delay: calc(var(--k) * 70ms + 160ms); }\r\n#shl-accueil.js .fmt-panel:not(.is-on) > * { opacity: 0; transform: translateY(14px); filter: blur(6px); transition-duration: .25s; transition-delay: 0s; }\r\n#shl-accueil .fmt-panel h3 { margin-top: 16px; font-size: clamp(26px, 2.5vw, 34px); font-weight: 800; letter-spacing: -.032em; line-height: 1.1; text-wrap: balance; }\r\n#shl-accueil .fmt-panel h3 + p { max-width: 420px; margin-top: 16px; font-size: 16.5px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .fmt-specs { margin-top: 30px; }\r\n#shl-accueil .fmt-specs div { display: grid; grid-template-columns: 72px minmax(0, 1fr) auto; align-items: center; gap: 16px; padding: 15px 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .fmt-specs dt { grid-column: 1; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .fmt-specs dd { grid-column: 3; font-size: 16px; font-weight: 700; letter-spacing: -.01em; text-align: right; }\r\n#shl-accueil .fmt-specs dd.rhythm { grid-column: 2; display: flex; gap: 4px; min-width: 0; overflow: hidden; }\r\n#shl-accueil .rhythm i { flex: 0 1 22px; height: 8px; border-radius: 3px; border: 1.5px dashed color-mix(in srgb, var(--c) 55%, #fff); transform-origin: left; transition: transform .7s var(--ease); transition-delay: calc(var(--k) * 70ms + 260ms); }\r\n#shl-accueil .rhythm i.on { border: 0; background: var(--c); }\r\n#shl-accueil .rhythm.is-fine i { flex-basis: 11px; }\r\n#shl-accueil .rhythm.is-open i.on:nth-child(3) { opacity: .7; }\r\n#shl-accueil .rhythm.is-open i.on:nth-child(4) { opacity: .42; }\r\n#shl-accueil .rhythm.is-open i.on:nth-child(5) { opacity: .18; }\r\n#shl-accueil.js .fmt-panel:not(.is-on) .rhythm i { transform: scaleX(0); transition-delay: 0s; }\r\n#shl-accueil .studio[data-fmt=\"0\"] { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .studio[data-fmt=\"1\"] { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .studio[data-fmt=\"2\"] { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .studio[data-fmt=\"3\"] { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .stage-col { display: flex; flex-direction: column; min-width: 0; margin: 0; padding: 10px 10px 0; }\r\n#shl-accueil .stage { position: relative; flex: 1; min-height: clamp(340px, 28vw, 400px); overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .stage::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); pointer-events: none; }\r\n#shl-accueil .stage canvas { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .stage-cap, #shl-accueil .stage-fig { position: absolute; top: 14px; font-size: 12.5px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .stage-cap { left: 16px; display: flex; align-items: center; gap: 9px; color: var(--cx); transition: color .5s; }\r\n#shl-accueil .stage-cap i { position: relative; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--c); transition: background-color .5s; }\r\n#shl-accueil .stage-cap i::after { content: ''; position: absolute; inset: -4px; border-radius: 50%; border: 1.5px solid var(--c); opacity: 0; animation: stage-ping 2.2s var(--ease) infinite; }\r\n@keyframes stage-ping{0% { transform: scale(.4); opacity: .8; } 100% { transform: scale(1.9); opacity: 0; }}#shl-accueil .stage-cap span { transition: opacity .25s, filter .25s; }\r\n#shl-accueil .stage-cap span.is-swap { opacity: 0; filter: blur(4px); }\r\n#shl-accueil .stage-fig { right: 16px; color: var(--muted); font-variant-numeric: tabular-nums; }\r\n#shl-accueil .stage-fig b { font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .stage-key { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 14px 10px 16px; font-size: 12.5px; font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .stage-key li { display: inline-flex; align-items: center; gap: 8px; transition: opacity .4s var(--ease); }\r\n#shl-accueil .stage-key i { flex: none; width: 9px; height: 9px; border-radius: 50%; }\r\n#shl-accueil .k-part { background: conic-gradient(var(--t1) 0 25%, var(--t5) 0 50%, var(--t7) 0 75%, var(--t9) 0); }\r\n#shl-accueil .k-shl { background: var(--ink); box-shadow: inset 0 0 0 2.5px var(--ink), inset 0 0 0 4.5px #fff; }\r\n#shl-accueil .k-mate { border: 1.5px solid var(--x9); }\r\n#shl-accueil .studio:not([data-fmt=\"3\"]) .k-only { opacity: 0; }\r\n#shl-accueil .formats-cta { position: relative; isolation: isolate; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 22px 40px; margin-top: 20px; padding: clamp(28px, 3.2vw, 40px) clamp(24px, 3.6vw, 48px); overflow: hidden; background: var(--ink); color: #fff; border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .2), 0 30px 60px -36px rgba(22, 38, 44, .7); }\r\n#shl-accueil .cta-threads { position: absolute; z-index: -1; top: 0; right: 0; width: 72%; height: 100%; overflow: visible; -webkit-mask-image: linear-gradient(90deg, transparent, #000 55%); mask-image: linear-gradient(90deg, transparent, #000 55%); }\r\n#shl-accueil .cta-threads use { fill: none; stroke: var(--c); stroke-width: 1.5; stroke-linecap: round; opacity: .8; }\r\n#shl-accueil .cta-threads path { vector-effect: non-scaling-stroke; }\r\n#shl-accueil .cta-bloom { transform-origin: 50% 50%; transform-box: view-box; transition: transform 1.8s var(--ease) .25s, opacity 1.2s var(--ease) .25s; }\r\n#shl-accueil.js .formats-cta:not(.is-in) .cta-bloom { transform: scaleY(.04); opacity: 0; }\r\n#shl-accueil .cta-flow { animation: cta-flow 16s linear infinite; }\r\n@keyframes cta-flow{to { transform: translateX(-400px); }}#shl-accueil .cta-copy { max-width: 600px; }\r\n#shl-accueil .cta-kicker { font: 500 11.5px\/1.3 var(--mono); letter-spacing: .12em; text-transform: uppercase; color: rgba(255, 255, 255, .66); }\r\n#shl-accueil .cta-text { margin-top: 12px; font-size: clamp(19px, 1.7vw, 24px); font-weight: 700; line-height: 1.3; letter-spacing: -.02em; text-wrap: balance; }\r\n#shl-accueil .btn-light { background: #fff; color: var(--ink); box-shadow: 0 12px 28px -14px rgba(0, 0, 0, .6); }\r\n#shl-accueil .btn-light:hover { box-shadow: 0 0 0 5px rgba(255, 255, 255, .16), 0 12px 28px -14px rgba(0, 0, 0, .6); }\r\n#shl-accueil .hub { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: clamp(40px, 6vw, 88px); align-items: center; }\r\n#shl-accueil .hub .btn { margin-top: 32px; }\r\n#shl-accueil .res { overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .04), 0 40px 80px -44px rgba(22, 38, 44, .32); transition: opacity 1s var(--ease), transform 1.2s var(--ease); }\r\n#shl-accueil.js .res:not(.is-in) { opacity: 0; transform: translateY(24px); }\r\n#shl-accueil .res-stage { position: relative; margin: 10px 10px 0; padding: 64px clamp(16px, 6%, 48px) 36px; overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .res-stage::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); pointer-events: none; }\r\n#shl-accueil .res-deck { position: relative; display: grid; max-width: 480px; margin: 0 auto; }\r\n#shl-accueil .res-card { --p: 0; grid-area: 1 \/ 1; position: relative; z-index: calc(10 - var(--p)); display: flex; flex-direction: column; min-width: 0; padding: 20px 22px 22px; border: 1px solid var(--line); border-radius: 16px; background: color-mix(in srgb, var(--k) 7%, #fff); box-shadow: 0 1px 2px rgba(22, 38, 44, .05), 0 22px 40px -26px rgba(22, 38, 44, .34); transform-origin: 50% 0; transform: translateY(calc(var(--p) * var(--gap, -16px))) scale(calc(1 - var(--p) * .05)); opacity: calc(1 - var(--p) * .16); transition: transform .9s var(--ease), opacity .9s var(--ease), background-color .9s var(--ease); }\r\n#shl-accueil .res-card.is-front { background: #fff; }\r\n#shl-accueil .res-card:not(.is-front) > * { visibility: hidden; }\r\n@media (hover: hover){#shl-accueil .res-stage:hover { --gap: -21px; }\r\n}#shl-accueil .res-card.is-out { z-index: 20; opacity: 0; transform: translateY(26px) scale(1.015); transition: transform .56s cubic-bezier(.4, 0, .2, 1), opacity .4s ease-in; }\r\n#shl-accueil .res-card.is-snap { opacity: 0; transition: none; }\r\n#shl-accueil .res-head, #shl-accueil .res-body { transition: opacity .38s var(--ease), filter .38s var(--ease); }\r\n#shl-accueil .res-body { transition-delay: .12s; }\r\n#shl-accueil.js .res.is-auto .res-card:not(.is-shown) > * { opacity: 0; filter: blur(3px); transition-duration: .16s; transition-delay: 0s; }\r\n#shl-accueil .res-head { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; column-gap: 16px; padding-bottom: 14px; border-bottom: 1px solid var(--line-2); }\r\n#shl-accueil .res-kind { grid-column: 1 \/ -1; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--kx); }\r\n#shl-accueil .res-title { margin-top: 6px; font-size: 18px; font-weight: 700; line-height: 1.25; letter-spacing: -.018em; color: var(--ink); }\r\n#shl-accueil .res-meta { padding-bottom: 2px; font-size: 12.5px; color: var(--muted); white-space: nowrap; }\r\n#shl-accueil .res-body { position: relative; flex: 1; margin-top: 18px; }\r\n#shl-accueil .par { display: flex; flex-direction: column; justify-content: center; }\r\n#shl-accueil .par-fig { position: relative; }\r\n#shl-accueil .par-art { width: 100%; height: auto; overflow: visible; color: var(--k); }\r\n#shl-accueil .par-floor { stroke: #dfe5e0; }\r\n#shl-accueil .par-drops path { stroke: #dfe5e0; stroke-dasharray: 2 3; transition: stroke .5s var(--ease); }\r\n#shl-accueil .par-drops path.is-on { stroke: color-mix(in srgb, var(--k) 50%, #fff); stroke-dasharray: none; }\r\n#shl-accueil .par-way { fill: none; stroke: #d3dbd6; stroke-width: 1.5; stroke-dasharray: 2 5; stroke-linecap: round; }\r\n#shl-accueil .par-trail { fill: none; stroke: var(--k); stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1 1; }\r\n#shl-accueil .par-nodes circle { fill: #fff; stroke: #cfd8d2; stroke-width: 1.5; transition: fill .45s var(--ease), stroke .45s var(--ease); }\r\n#shl-accueil .par-nodes circle.is-on { fill: var(--k); stroke: #fff; stroke-width: 2; }\r\n#shl-accueil .par-halo { fill: var(--k); opacity: .18; }\r\n#shl-accueil .par-dot { fill: var(--ink); stroke: #fff; stroke-width: 2.5; }\r\n#shl-accueil .par-axis { position: absolute; left: 0; top: 0; font-size: 11.5px; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .par-caps { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); margin-top: 10px; font-size: 12px; font-weight: 600; line-height: 1.3; text-align: center; color: var(--muted); }\r\n#shl-accueil .par-caps li { padding: 0 2px; transition: color .45s var(--ease); }\r\n#shl-accueil .par-caps b { display: block; margin-bottom: 2px; font: 500 11.5px\/1.3 var(--mono); color: var(--faint); transition: color .45s var(--ease); }\r\n#shl-accueil .par-caps li.is-on { color: var(--ink); }\r\n#shl-accueil .par-caps li.is-on b { color: var(--kx); }\r\n#shl-accueil .bud { display: grid; align-content: start; font-size: 13px; }\r\n#shl-accueil .bud-row { position: relative; display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) 78px; align-items: center; column-gap: 16px; height: 27px; }\r\n#shl-accueil .bud-row > span { overflow: hidden; font-weight: 500; white-space: nowrap; text-overflow: ellipsis; color: var(--ink-2); }\r\n#shl-accueil .bud-row > i { width: var(--w); height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--k) 72%, #fff); transform-origin: left; transition: transform .7s var(--ease); }\r\n#shl-accueil .bud-row > b { font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; color: var(--ink); transition: opacity .38s var(--ease), filter .38s var(--ease); }\r\n#shl-accueil .bud-th { height: 22px; }\r\n#shl-accueil .bud-th span { font-size: 11.5px; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .bud-th span:last-child { text-align: right; }\r\n#shl-accueil .bud-total { height: 32px; margin-top: 5px; border-top: 1px solid var(--line); }\r\n#shl-accueil .bud-total > span { font-weight: 700; color: var(--ink); }\r\n#shl-accueil .bud-total > b { font-size: 14px; color: var(--kx); }\r\n#shl-accueil .bud-total > i { visibility: hidden; }\r\n#shl-accueil .bud-hl { position: absolute; left: -10px; right: -10px; top: 0; height: 27px; border-radius: 7px; background: color-mix(in srgb, var(--k) 12%, #fff); opacity: 0; transition: transform .5s var(--ease), opacity .35s var(--ease); }\r\n#shl-accueil .bud.is-hl .bud-hl { opacity: 1; }\r\n#shl-accueil.js .res.is-auto .bud-row:not(.is-on) > b { opacity: 0; filter: blur(3px); }\r\n#shl-accueil.js .res.is-auto .bud-row:not(.is-on) > i { transform: scaleX(0); }\r\n#shl-accueil .vei { display: grid; align-content: start; gap: 2px; }\r\n#shl-accueil .vei li { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 14px; min-height: 44px; padding: 5px 12px; border: 1px solid transparent; border-radius: 10px; }\r\n#shl-accueil .vei li + li::before { content: ''; position: absolute; left: 12px; right: 12px; top: -2px; border-top: 1px solid var(--line-2); }\r\n#shl-accueil .vei span { min-width: 0; font-size: 13.5px; font-weight: 700; line-height: 1.25; color: var(--ink); }\r\n#shl-accueil .vei small { display: block; margin-top: 2px; overflow: hidden; font-size: 12px; font-weight: 500; white-space: nowrap; text-overflow: ellipsis; color: var(--muted); }\r\n#shl-accueil .vei em { font-size: 12px; font-style: normal; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .vei .vei-new { background: color-mix(in srgb, var(--k) 8%, #fff); border-color: color-mix(in srgb, var(--k) 30%, #fff); transition: background .5s var(--ease), border-color .5s var(--ease); }\r\n#shl-accueil .vei-new em { font-weight: 700; color: var(--kx); }\r\n#shl-accueil .vei-new > * { transition: opacity .38s var(--ease) .3s, filter .38s var(--ease) .3s; }\r\n#shl-accueil .vei-new > em { transition-delay: .7s; }\r\n#shl-accueil.js .res.is-auto .vei:not(.is-played) .vei-new { background: transparent; border-color: #d5ddd8; border-style: dashed; }\r\n#shl-accueil.js .res.is-auto .vei:not(.is-played) .vei-new > * { opacity: 0; filter: blur(3px); transition-delay: 0s; }\r\n#shl-accueil .cad { display: grid; grid-template-columns: minmax(84px, 1.25fr) repeat(3, minmax(0, 1fr)); gap: 5px; align-content: start; }\r\n#shl-accueil .cad-th { overflow: hidden; padding: 0 2px 1px; font-size: 11.5px; font-weight: 600; white-space: nowrap; text-overflow: ellipsis; color: var(--muted); }\r\n#shl-accueil .cad-rh { display: flex; align-items: center; padding-right: 6px; font-size: 12px; font-weight: 600; line-height: 1.25; color: var(--ink-2); }\r\n#shl-accueil .cad-c { display: grid; align-content: center; gap: 6px; height: 38px; padding: 0 9px; background: #fff; border: 1px solid var(--line); border-radius: 7px; transition: background .6s var(--ease), border-color .6s var(--ease); }\r\n#shl-accueil .cad-c i { height: 4px; border-radius: 2px; background: #d7dfda; transform-origin: left; transition: transform .55s var(--ease), background .6s var(--ease); }\r\n#shl-accueil .cad-c i:last-child { width: 58%; }\r\n#shl-accueil .cad-c:nth-child(4n + 3) i:first-child { width: 84%; }\r\n#shl-accueil .cad-c:nth-child(3n) i:last-child { width: 40%; }\r\n#shl-accueil .cad-c.is-hl { background: color-mix(in srgb, var(--k) 11%, #fff); border-color: color-mix(in srgb, var(--k) 48%, #fff); }\r\n#shl-accueil .cad-c.is-hl i { background: color-mix(in srgb, var(--k) 75%, #fff); }\r\n#shl-accueil .cad-c i + i { transition-delay: .09s; }\r\n#shl-accueil.js .res.is-auto .cad-c:not(.is-on) i { transform: scaleX(0); }\r\n#shl-accueil .res-key { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px 26px; padding: 17px 20px 19px; font-size: 13px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .res-key span { cursor: pointer; color: var(--muted); text-decoration: underline 2px transparent; text-underline-offset: 7px; transition: color .45s var(--ease), text-decoration-color .45s var(--ease); }\r\n#shl-accueil .res-key span.is-on { color: var(--kx); text-decoration-color: color-mix(in srgb, var(--k) 60%, #fff); }\r\n@media (hover: hover){#shl-accueil .res-key span:not(.is-on):hover { color: var(--ink); }\r\n}#shl-accueil .contact { padding: clamp(80px, 11vw, 144px) 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .contact-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(40px, 6vw, 88px); align-items: start; }\r\n#shl-accueil .contact h2 { margin-top: 22px; font-size: clamp(30px, 3.6vw, 48px); line-height: 1.08; font-weight: 800; letter-spacing: -.032em; text-wrap: balance; }\r\n#shl-accueil .contact .sec-copy { margin-top: 22px; }\r\n#shl-accueil .person { display: flex; align-items: center; gap: 24px; max-width: 540px; margin-top: 36px; padding: 18px; background: var(--tint); border: 1px solid var(--line); border-radius: var(--r-lg); }\r\n#shl-accueil .person-photo { flex: none; width: 148px; height: 148px; border-radius: 14px; object-fit: cover; background: var(--sunk); box-shadow: 0 0 0 1px var(--line), var(--shadow-sm); }\r\n#shl-accueil .person b { display: block; font-size: 18px; font-weight: 700; }\r\n#shl-accueil .person > div > span { display: block; font-size: 13.5px; color: var(--muted); }\r\n#shl-accueil .person ul { display: grid; gap: 6px; margin-top: 12px; }\r\n#shl-accueil .person a { display: inline-flex; align-items: baseline; gap: 10px; font-size: 14.5px; font-weight: 600; transition: color .3s; }\r\n#shl-accueil .person a:hover { color: var(--accent); }\r\n#shl-accueil .person a i { width: 34px; font: 500 11.5px\/1 var(--mono); font-style: normal; color: var(--muted); }\r\n#shl-accueil .form { padding: clamp(24px, 3vw, 36px); background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: var(--shadow); }\r\n#shl-accueil .form h3 { font-size: 22px; font-weight: 700; letter-spacing: -.02em; }\r\n#shl-accueil .form > p { margin-top: 6px; font-size: 14px; color: var(--muted); }\r\n#shl-accueil .form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: 26px; }\r\n#shl-accueil .form-grid .full { grid-column: 1 \/ -1; }\r\n#shl-accueil .form label { display: block; margin-bottom: 7px; font-size: 13px; font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .form input, #shl-accueil .form select, #shl-accueil .form textarea { width: 100%; height: 46px; padding: 0 14px; background: var(--canvas); border: 1px solid var(--line); border-radius: 10px; transition: border-color .25s, box-shadow .25s, background-color .25s; }\r\n#shl-accueil .form textarea { height: 120px; padding: 12px 14px; resize: vertical; }\r\n#shl-accueil .form input:focus, #shl-accueil .form select:focus, #shl-accueil .form textarea:focus { outline: 0; background: #fff; border-color: var(--accent); box-shadow: 0 0 0 4px rgba(31, 74, 77, .1); }\r\n#shl-accueil .form .btn { margin-top: 22px; }\r\n#shl-accueil .form-note { min-height: 1em; margin-top: 12px; font-size: 13.5px; color: var(--accent); }\r\n#shl-accueil .footer { position: relative; padding: 64px 0 32px; background: var(--tint); }\r\n#shl-accueil .footer::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--spectrum); }\r\n#shl-accueil .footer-grid { display: grid; grid-template-columns: 1.6fr 1fr 1fr 1.2fr; gap: 40px; }\r\n#shl-accueil .footer-about { max-width: 380px; margin-top: 20px; font-size: 14px; line-height: 1.65; color: var(--muted); }\r\n#shl-accueil .footer-grid > :nth-child(2) h4 { color: var(--x7); }\r\n#shl-accueil .footer-grid > :nth-child(3) h4 { color: var(--x5); }\r\n#shl-accueil .footer-grid > :nth-child(4) h4 { color: var(--x1); }\r\n#shl-accueil .footer ul { display: grid; gap: 10px; margin-top: 18px; }\r\n#shl-accueil .footer li { font-size: 14.5px; font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .footer ul a { font-size: 14.5px; font-weight: 600; color: var(--ink-2); transition: color .3s; }\r\n#shl-accueil .footer ul a:hover, #shl-accueil .footer-bottom a:hover { color: var(--ink); }\r\n#shl-accueil .footer-bottom { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 12px; margin-top: 56px; padding-top: 24px; border-top: 1px solid var(--line); font-size: 13px; color: var(--muted); }\r\n#shl-accueil .lang { display: inline-flex; align-items: center; font-size: 13.5px; font-weight: 700; letter-spacing: .02em; }\r\n#shl-accueil .lang a { padding: 6px 8px; color: var(--faint); transition: color .25s; }\r\n#shl-accueil .lang a + a { border-left: 1px solid var(--line); }\r\n#shl-accueil .lang a:hover { color: var(--ink-2); }\r\n#shl-accueil .lang a[aria-current] { color: var(--ink); }\r\n#shl-accueil .lang-m { display: none; }\r\n#shl-accueil .lang-foot { font-size: inherit; font-weight: 600; letter-spacing: 0; }\r\n#shl-accueil .lang-foot a { padding: 0 8px; }\r\n#shl-accueil .lang-foot a:first-child { padding-left: 0; }\r\n#shl-accueil .vids { display: grid; grid-template-columns: minmax(0, 1.75fr) minmax(0, 1fr); gap: 20px; align-items: stretch; }\r\n#shl-accueil .vid-frame { position: relative; isolation: isolate; aspect-ratio: 16 \/ 9; overflow: hidden; border-radius: var(--r-xl); background: var(--ink); color: #fff; box-shadow: 0 30px 60px -32px rgba(22, 38, 44, .55); }\r\n#shl-accueil .vid-poster { position: absolute; inset: 0; z-index: -1; width: 100%; height: 100%; object-fit: cover; transition: transform 1.2s var(--ease), opacity .4s; }\r\n#shl-accueil .vid-frame::after { content: ''; position: absolute; inset: 0; z-index: -1; background: linear-gradient(180deg, rgba(23, 53, 64, 0) 45%, rgba(23, 53, 64, .82)); pointer-events: none; }\r\n#shl-accueil .vid-frame:hover .vid-poster { transform: scale(1.025); }\r\n#shl-accueil .vid-cap { position: absolute; left: 0; right: 0; bottom: 0; padding: clamp(20px, 2.6vw, 32px); }\r\n#shl-accueil .vid-kicker { display: flex; gap: 12px; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: rgba(255, 255, 255, .78); }\r\n#shl-accueil .vid-title { margin-top: 8px; font-size: clamp(22px, 2.3vw, 32px); font-weight: 800; line-height: 1.1; letter-spacing: -.025em; }\r\n#shl-accueil .vid-sub { margin-top: 6px; font-size: 15px; font-weight: 600; color: rgba(255, 255, 255, .82); }\r\n#shl-accueil .vid-play { position: absolute; top: 50%; left: 50%; display: grid; place-items: center; width: 84px; height: 84px; padding: 0; border: 0; border-radius: 50%; background: rgba(255, 255, 255, .95); color: var(--ink); cursor: pointer; translate: -50% -60%; box-shadow: 0 0 0 12px rgba(255, 255, 255, .16), 0 18px 40px -14px rgba(0, 0, 0, .55); transition: transform .5s var(--ease), box-shadow .5s var(--ease); }\r\n#shl-accueil .vid-play svg { width: 30px; height: 30px; margin-left: 4px; fill: currentColor; }\r\n#shl-accueil .vid-frame:hover .vid-play { transform: scale(1.06); box-shadow: 0 0 0 18px rgba(255, 255, 255, .12), 0 18px 40px -14px rgba(0, 0, 0, .55); }\r\n#shl-accueil .vid-frame iframe { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; border: 0; background: #000; }\r\n#shl-accueil .vid-frame.is-playing :is(.vid-cap, .vid-play) { opacity: 0; pointer-events: none; }\r\n#shl-accueil .vid-side { position: relative; display: flex; flex-direction: column; min-height: 0; }\r\n#shl-accueil .vid-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 0 4px 12px; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .vid-head a { font: 700 13.5px\/1.3 var(--font); letter-spacing: 0; text-transform: none; color: var(--accent); }\r\n#shl-accueil .vid-head a:hover { color: var(--ink); }\r\n#shl-accueil .vid-list { position: absolute; top: 36px; left: 0; right: 0; bottom: 0; display: grid; align-content: start; gap: 4px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; scrollbar-color: #c5d0ca transparent; -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 30px), transparent); mask-image: linear-gradient(180deg, #000 calc(100% - 30px), transparent); padding-bottom: 24px; }\r\n#shl-accueil .vid-item { display: grid; grid-template-columns: 128px minmax(0, 1fr); align-items: center; gap: 14px; width: 100%; padding: 8px; border: 0; border-radius: 14px; background: none; font: inherit; text-align: left; color: var(--ink); cursor: pointer; transition: background-color .25s; }\r\n#shl-accueil .vid-item:hover, #shl-accueil .vid-item:focus-visible { background: var(--tint); }\r\n#shl-accueil .vid-item.is-on { background: color-mix(in srgb, var(--c) 10%, #fff); }\r\n#shl-accueil .vid-thumb { position: relative; overflow: hidden; aspect-ratio: 16 \/ 9; border-radius: 10px; background: var(--sunk); }\r\n#shl-accueil .vid-thumb img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease); }\r\n#shl-accueil .vid-item:hover .vid-thumb img { transform: scale(1.05); }\r\n#shl-accueil .vid-item.is-on .vid-thumb { box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--c); }\r\n#shl-accueil .vid-dur { position: absolute; right: 6px; bottom: 6px; padding: 2px 6px; border-radius: 6px; background: rgba(23, 53, 64, .86); color: #fff; font-size: 11.5px; font-weight: 700; line-height: 1.3; }\r\n#shl-accueil .vid-meta b { display: block; font-size: 14.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.01em; }\r\n#shl-accueil .vid-meta span { display: block; margin-top: 3px; font-size: 12.5px; line-height: 1.4; color: var(--muted); }\r\n#shl-accueil .vid-item.is-on .vid-meta b { color: color-mix(in srgb, var(--c) 70%, var(--ink)); }\r\n#shl-accueil .public { --h: var(--x9); }\r\n#shl-accueil .pub-head { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; max-width: 880px; margin-bottom: clamp(36px, 4.5vw, 52px); }\r\n#shl-accueil .pub-points { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .pub-point { display: flex; flex-direction: column; padding: 26px 26px 28px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .03); }\r\n#shl-accueil .pub-point h3 { margin-top: 18px; font-size: 19px; font-weight: 800; letter-spacing: -.02em; }\r\n#shl-accueil .pub-point h3 + p { margin-top: 12px; font-size: 15px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .pub-sum { display: flex; align-items: center; gap: 18px; max-width: 900px; margin: clamp(28px, 3.5vw, 40px) 0 clamp(56px, 7vw, 88px); font-size: clamp(18px, 1.6vw, 21px); font-weight: 700; line-height: 1.4; letter-spacing: -.015em; color: var(--ink); text-wrap: balance; }\r\n#shl-accueil .pub-sum::before { content: ''; flex: none; width: 40px; height: 3px; border-radius: 2px; background: var(--spectrum); }\r\n#shl-accueil .pub-label, #shl-accueil .team-sub { font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; }\r\n#shl-accueil .pub-label { margin-bottom: 18px; color: var(--muted); }\r\n#shl-accueil .pub-label-2 { margin-top: clamp(56px, 7vw, 88px); }\r\n#shl-accueil .pub-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .pub-card { display: flex; flex-direction: column; min-width: 0; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .04); }\r\n#shl-accueil .pub-logo { display: flex; align-items: center; justify-content: center; gap: clamp(18px, 2vw, 28px); height: 164px; margin: 10px 10px 0; padding: 0 22px; background: radial-gradient(closest-side, #fff, var(--canvas)); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .pub-logo img { flex: 0 1 auto; min-width: 0; width: var(--w); height: auto; mix-blend-mode: multiply; }\r\n#shl-accueil .pub-and { flex: none; width: 1px; height: 56px; background: var(--line); }\r\n#shl-accueil .pub-logo:not(:has(img:not(.is-missing))) .pub-and { display: none; }\r\n#shl-accueil .pub-body { padding: 22px 26px 28px; }\r\n#shl-accueil .pub-card h3 { margin-top: 12px; font-size: 19px; font-weight: 700; line-height: 1.25; letter-spacing: -.02em; text-wrap: balance; }\r\n#shl-accueil .pub-body > p:last-child { margin-top: 10px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .pub-anct { display: flex; align-items: center; gap: clamp(18px, 2.4vw, 28px); margin-top: 16px; padding: 10px clamp(18px, 2.4vw, 28px) 10px 10px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .pub-anct-logo { flex: none; display: grid; place-items: center; width: 176px; height: 76px; background: radial-gradient(closest-side, #fff, var(--canvas)); border: 1px solid var(--line-2); border-radius: 12px; }\r\n#shl-accueil .pub-anct-logo img { width: 124px; height: auto; mix-blend-mode: multiply; }\r\n#shl-accueil .pub-anct p { max-width: 760px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .pub-bento { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .sc-cal, #shl-accueil .sc-kpi { container-type: inline-size; }\r\n#shl-accueil .cal { --n: 6; --t: calc(var(--p, 1) * var(--n)); display: grid; grid-template-columns: max-content minmax(0, 1fr); grid-template-rows: auto repeat(4, minmax(24px, auto)) auto; gap: 14px 18px; align-items: center; width: 100%; max-width: 540px; }\r\n#shl-accueil .cal-months { grid-column: 2; grid-row: 1; display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); font-size: 11.5px; font-weight: 600; color: var(--faint); }\r\n#shl-accueil .cal-months span { padding-left: 6px; }\r\n#shl-accueil .cal-grid { grid-column: 2; grid-row: 1 \/ 6; align-self: stretch; margin: -4px 0 -6px; background: linear-gradient(90deg, var(--line) 1px, transparent 1px) 0 0 \/ calc(100% \/ var(--n)) 100%; }\r\n#shl-accueil .cal-lab { grid-column: 1; grid-row: var(--r); font-size: 12.5px; font-weight: 600; line-height: 1.25; color: var(--ink-2); white-space: nowrap; }\r\n#shl-accueil .cal-lane { position: relative; grid-column: 2; grid-row: var(--r); align-self: stretch; transition: opacity .5s var(--ease); }\r\n#shl-accueil .cal-lane i { --on: clamp(0, calc((var(--t) - var(--a)) * 4), 1); position: absolute; top: 50%; left: calc(var(--a) \/ var(--n) * 100%); opacity: var(--on); }\r\n#shl-accueil .cal-bar { width: calc((var(--b) - var(--a)) \/ var(--n) * 100%); height: 12px; margin-top: -6px; border-radius: 6px; background: var(--c); clip-path: inset(0 calc(100% - clamp(0, calc((var(--t) - var(--a)) \/ (var(--b) - var(--a))), 1) * 100%) 0 0 round 6px); }\r\n#shl-accueil .cal-bar.is-res { height: 8px; margin-top: -4px; background: color-mix(in srgb, var(--c) 34%, #fff); }\r\n#shl-accueil .cal-pill { width: calc(.34 \/ var(--n) * 100%); height: 14px; margin-top: -7px; border-radius: 7px; background: var(--c); transform: scale(calc(.5 + .5 * var(--on))); }\r\n#shl-accueil .cal-dot { width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px; border-radius: 50%; background: color-mix(in srgb, var(--c) 72%, var(--ink)); transform: scale(calc(.3 + .7 * var(--on))); }\r\n#shl-accueil .cal-head { position: relative; left: calc(var(--p, 1) * 100%); grid-column: 2; grid-row: 2 \/ 6; align-self: stretch; justify-self: start; width: 0; margin: -6px 0 -6px -.75px; border-left: 1.5px solid var(--ink); transition: opacity .4s var(--ease); }\r\n#shl-accueil .cal-head::before { content: ''; position: absolute; top: -4px; left: -4.75px; width: 8px; height: 8px; border-radius: 50%; background: var(--ink); }\r\n#shl-accueil .cal-end { grid-column: 2; grid-row: 2 \/ 6; justify-self: end; align-self: stretch; margin: -6px 0; border-right: 1.5px dashed #b8c4c2; }\r\n#shl-accueil .cal-dep { grid-column: 2; grid-row: 6; justify-self: end; display: flex; align-items: center; gap: 8px; margin-right: -4.5px; font-size: 12.5px; font-weight: 700; color: var(--ink); opacity: 0; filter: blur(4px); transition: opacity .38s var(--ease), filter .38s var(--ease); }\r\n#shl-accueil .cal-dep::after { content: ''; width: 9px; height: 9px; border-radius: 50%; background: var(--ink); }\r\n#shl-accueil .sc-cal.is-end .cal-head { opacity: 0; }\r\n#shl-accueil .sc-cal.is-end .cal-dep { opacity: 1; filter: none; }\r\n#shl-accueil .sc-cal.is-out .cal-lane, #shl-accueil .sc-cal.is-out .cal-dep { opacity: 0; }\r\n@container (max-width: 440px){#shl-accueil .cal { column-gap: 12px; }\r\n#shl-accueil .cal-lab { max-width: 84px; font-size: 11.5px; white-space: normal; }\r\n#shl-accueil .cal-months span { padding-left: 4px; font-size: 0; }\r\n#shl-accueil .cal-months span::before { content: attr(data-s); font-size: 11.5px; }\r\n#shl-accueil .cal-dot { width: 7px; height: 7px; margin: -3.5px 0 0 -3.5px; }\r\n}#shl-accueil .kpi { display: grid; justify-items: center; gap: 30px; width: 100%; }\r\n#shl-accueil .kpi-grid { --d: 18px; display: grid; grid-template-columns: repeat(10, var(--d)); gap: 13px; }\r\n#shl-accueil .kpi-grid i { position: relative; width: var(--d); height: var(--d); border-radius: 50%; background: #fff; box-shadow: inset 0 0 0 1.5px #b8c4c2; opacity: 0; transform: scale(.4); transition: opacity .45s var(--ease), transform .45s var(--ease), background-color .5s var(--ease), box-shadow .5s var(--ease); transition-delay: calc(var(--i) * 22ms); }\r\n#shl-accueil .kpi-grid i::after { content: ''; position: absolute; top: 34%; left: 30%; width: 38%; height: 19%; border-bottom: 1.8px solid #fff; border-left: 1.8px solid #fff; opacity: 0; transform: rotate(-45deg) scale(.4); transition: opacity .3s, transform .4s var(--ease); transition-delay: inherit; }\r\n#shl-accueil .kpi.is-cand i { opacity: 1; transform: none; }\r\n#shl-accueil .kpi.is-sel i:not(.is-in) { opacity: .6; transform: scale(.72); }\r\n#shl-accueil .kpi.is-dep i.is-in { background: color-mix(in srgb, var(--c) 42%, #fff); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--c) 42%, #fff); transition-delay: calc(var(--j) * 16ms); }\r\n#shl-accueil .kpi.is-fin i.is-ok { background: var(--c); box-shadow: inset 0 0 0 1.5px var(--c); }\r\n#shl-accueil .kpi.is-fin i.is-ok::after { opacity: 1; transform: rotate(-45deg); }\r\n#shl-accueil .kpi.is-out i { opacity: 0; transition-delay: 0s; }\r\n#shl-accueil .kpi-key { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px 22px; font-size: 12.5px; font-weight: 600; color: var(--faint); }\r\n#shl-accueil .kpi-key li { display: inline-flex; align-items: center; gap: 8px; transition: color .38s var(--ease); }\r\n#shl-accueil .kpi-key li.is-on { color: var(--ink-2); }\r\n#shl-accueil .kpi-key i { flex: none; width: 11px; height: 11px; border-radius: 50%; }\r\n#shl-accueil .k-cand { box-shadow: inset 0 0 0 1.5px #b8c4c2; }\r\n#shl-accueil .k-dep { background: color-mix(in srgb, var(--c) 42%, #fff); }\r\n#shl-accueil .k-fin { background: var(--c); }\r\n@container (max-width: 340px){#shl-accueil .kpi-grid { --d: 15px; gap: 10px; }\r\n}#shl-accueil .pub-formats-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr); gap: 14px 48px; align-items: end; margin: clamp(56px, 7vw, 88px) 0 24px; }\r\n#shl-accueil .pub-formats-head h3 { font-size: clamp(24px, 2.4vw, 32px); font-weight: 800; line-height: 1.1; letter-spacing: -.028em; }\r\n#shl-accueil .pub-formats-head p { font-size: 15.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .team { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .mate { display: flex; flex-direction: column; padding: 26px 26px 28px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .03); }\r\n#shl-accueil .mate h3 { margin-top: 18px; font-size: 19px; font-weight: 800; letter-spacing: -.02em; }\r\n#shl-accueil .mate-role { margin-top: 4px; font-size: 13.5px; font-weight: 700; color: var(--cx); }\r\n#shl-accueil .mate p:last-child { margin-top: 12px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .team-sub { margin: 40px 0 16px; color: var(--muted); }\r\n#shl-accueil .team-assoc { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .team-assoc .mate { background: var(--tint); }\r\n#shl-accueil .team-note { display: flex; flex-direction: column; justify-content: space-between; gap: 28px; padding: 26px 26px 28px; background: var(--tint); border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .team-note::before { content: ''; width: 40px; height: 3px; border-radius: 2px; background: var(--spectrum); }\r\n#shl-accueil .team-note p { font-size: 21px; font-weight: 700; line-height: 1.35; letter-spacing: -.02em; color: var(--ink); text-wrap: balance; }\r\n#shl-accueil .team-mark { display: grid; place-items: center; flex: none; width: 76px; height: 76px; padding: 12px; background: #fff; border: 1px solid var(--line); border-radius: 50%; }\r\n#shl-accueil .team-mark img { width: 100%; height: auto; }\r\n@media (max-width: 1320px){#shl-accueil .header-row { gap: 18px; }\r\n#shl-accueil .main-nav a { padding-inline: 9px; }\r\n#shl-accueil .header-actions { gap: 18px; }\r\n}@media (max-width: 1180px){#shl-accueil .main-nav, #shl-accueil .header-actions { display: none; }\r\n#shl-accueil .menu-toggle { display: inline-flex; }\r\n#shl-accueil .lang-m { display: inline-flex; margin-left: auto; }\r\n#shl-accueil .lang-m + .menu-toggle { margin-left: 6px; }\r\n}@media (max-width: 1060px){#shl-accueil .method, #shl-accueil .hub, #shl-accueil .contact-grid { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-head, #shl-accueil .pub-formats-head { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-points { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-cards { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; }\r\n#shl-accueil .pub-logo { align-self: stretch; height: auto; min-height: 150px; margin: 10px; }\r\n#shl-accueil .team { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .vids { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .vid-list { position: static; display: flex; gap: 10px; overflow-x: auto; overflow-y: hidden; scroll-snap-type: x mandatory; margin-inline: calc(-1 * var(--gut)); padding: 2px var(--gut) 8px; scroll-padding-inline: var(--gut); -webkit-mask-image: none; mask-image: none; }\r\n#shl-accueil .vid-list li { flex: 0 0 min(240px, 62%); scroll-snap-align: start; }\r\n#shl-accueil .vid-item { grid-template-columns: minmax(0, 1fr); gap: 10px; padding: 6px; }\r\n#shl-accueil .atlas-over { grid-template-columns: minmax(0, 1fr); min-height: 0; gap: 0; padding: clamp(56px, 9vw, 80px) 0 clamp(44px, 7vw, 64px); }\r\n#shl-accueil .atlas-over > .atlas-canvas { position: relative; inset: auto; height: clamp(340px, 78vw, 620px); margin: 12px calc(-1 * var(--gut)) 4px; }\r\n#shl-accueil .atlas-over > .map-key { position: static; justify-content: flex-start; margin-top: 18px; }\r\n#shl-accueil .terr { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .terr-map { order: -1; }\r\n#shl-accueil .terr-stage { min-height: clamp(360px, 70vw, 520px); }\r\n#shl-accueil .hero-foot { flex-direction: column; align-items: flex-start; }\r\n#shl-accueil .sec-head, #shl-accueil .ident-text, #shl-accueil .ident-body { grid-template-columns: minmax(0, 1fr); align-items: start; }\r\n#shl-accueil .figures { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .method-sticky { position: static; }\r\n#shl-accueil .rail { display: none; }\r\n#shl-accueil .method.is-live .step { opacity: 1; }\r\n#shl-accueil .project { flex-basis: calc((100% - 20px) \/ 2); }\r\n#shl-accueil .studio-body { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .fmt-panel h3 + p { max-width: 560px; }\r\n#shl-accueil .stage-col { padding-top: 0; }\r\n#shl-accueil .stage { min-height: 360px; }\r\n#shl-accueil .quotes { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .quote.feature { grid-column: 1 \/ -1; }\r\n#shl-accueil .footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n}@media (max-width: 1060px){#shl-accueil .bento { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .bc { display: grid; grid-row: auto; grid-template-rows: none; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; }\r\n#shl-accueil .bc-stage { margin: 10px; }\r\n}@media (max-width: 720px){#shl-accueil .team, #shl-accueil .team-assoc { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-card { display: flex; align-items: stretch; }\r\n#shl-accueil .pub-logo { align-self: auto; height: 140px; min-height: 0; margin: 10px 10px 0; }\r\n#shl-accueil .pub-body { padding: 20px 20px 24px; }\r\n#shl-accueil .pub-anct { flex-direction: column; align-items: stretch; padding: 10px 10px 20px; }\r\n#shl-accueil .pub-anct-logo { width: auto; }\r\n#shl-accueil .pub-anct p { padding: 0 10px; }\r\n#shl-accueil .vid-play { width: 64px; height: 64px; }\r\n#shl-accueil .vid-play svg { width: 24px; height: 24px; }\r\n#shl-accueil .vid-sub { display: none; }\r\n#shl-accueil .hero .eyebrow::before { display: none; }\r\n#shl-accueil .hero-banks { grid-template-columns: minmax(0, 1fr); gap: 2px; margin-top: 12px; }\r\n#shl-accueil .hero-banks > span:nth-child(n) { max-width: none; margin-inline: auto; font-size: clamp(19px, 5.4vw, 24px); text-align: center; }\r\n#shl-accueil h1 { text-wrap: balance; }\r\n#shl-accueil .brand { --mh: 28px; }\r\n#shl-accueil .hero-sky { aspect-ratio: 4 \/ 1; }\r\n#shl-accueil h1 .line { display: inline; overflow: visible; padding: 0; margin: 0; }\r\n#shl-accueil.js h1 .line > span { display: inline; transform: none; }\r\n#shl-accueil h1 .line + .line::before { content: ' '; }\r\n#shl-accueil .fields, #shl-accueil .projects, #shl-accueil .quotes, #shl-accueil .form-grid, #shl-accueil .footer-grid { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .project { flex-basis: 100%; }\r\n#shl-accueil .studio-tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .fmt-tab { padding: 14px 14px 20px; }\r\n#shl-accueil .fmt-name { margin-top: 12px; font-size: 15px; }\r\n#shl-accueil .fmt-meta { font-size: 12.5px; }\r\n#shl-accueil .fmt-panel { padding: 26px 22px; }\r\n#shl-accueil .fmt-specs { padding-top: 24px; }\r\n#shl-accueil .fmt-specs div { grid-template-columns: 64px minmax(0, 1fr) auto; gap: 12px; }\r\n#shl-accueil .stage { min-height: 290px; }\r\n#shl-accueil .stage-fig { display: none; }\r\n#shl-accueil .stage-key { gap: 6px 16px; }\r\n#shl-accueil .cta-threads { width: 100%; opacity: .5; }\r\n#shl-accueil .formats-cta .btn { width: 100%; justify-content: center; }\r\n#shl-accueil .partners, #shl-accueil .kinds { grid-template-columns: minmax(0, 1fr); gap: 16px; }\r\n#shl-accueil .logos { --gap: 44px; }\r\n#shl-accueil .logos img { height: calc(var(--lh, 36px) * .82); }\r\n#shl-accueil .res-stage { padding: 52px 12px 26px; }\r\n#shl-accueil .res-card { padding: 17px 16px 18px; }\r\n#shl-accueil .res-meta, #shl-accueil .bud-row > i, #shl-accueil .bud-th span:nth-child(2) { display: none; }\r\n#shl-accueil .bud-row { grid-template-columns: minmax(0, 1fr) auto; }\r\n#shl-accueil .cad { grid-template-columns: minmax(84px, 1.2fr) repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .cad > :nth-child(4n) { display: none; }\r\n#shl-accueil .res-key { gap: 8px 18px; padding-inline: 14px; }\r\n#shl-accueil .step, #shl-accueil .quote { padding: 24px; }\r\n#shl-accueil .field { grid-template-columns: minmax(0, 1fr); padding: 22px 22px 24px; }\r\n#shl-accueil .field-icon { display: none; }\r\n#shl-accueil .terr-stage { min-height: 440px; }\r\n#shl-accueil .drom { left: 10px; right: 10px; top: auto; bottom: 10px; width: auto; height: 84px; grid-template-rows: none; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 6px; }\r\n#shl-accueil .drom li { padding-bottom: 6px; font: 600 10.5px\/1 var(--font); white-space: nowrap; }\r\n#shl-accueil .duo-home { left: max(60px, 20%); width: 104px; height: 62px; --iw: 84px; --ih: 36px; }\r\n#shl-accueil .duo-node { width: 44px; height: 44px; }\r\n#shl-accueil .duo-node.is-sm { width: 36px; height: 36px; }\r\n#shl-accueil .bento { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .bc { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .bc-head { padding: 22px 20px 26px; }\r\n#shl-accueil .bc-stage { min-height: 268px; margin: 10px 10px 0; }\r\n#shl-accueil .tools { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .person { flex-direction: column; align-items: flex-start; }\r\n#shl-accueil .person-photo { width: 120px; height: 120px; }\r\n}@media (prefers-reduced-motion: reduce){html:has(#shl-accueil) { scroll-behavior: auto; }\r\n#shl-accueil *, #shl-accueil *::before, #shl-accueil *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; transition-delay: 0s !important; }\r\n#shl-accueil .logos { -webkit-mask-image: none; mask-image: none; }\r\n#shl-accueil .logos-set { animation: none; flex-wrap: wrap; justify-content: space-between; gap: 20px 36px; min-width: 0; width: 100%; }\r\n#shl-accueil .logos-set + .logos-set { display: none; }\r\n#shl-accueil .ros.is-loop .ros-track { animation-duration: var(--dur, 64s) !important; animation-iteration-count: infinite !important; }\r\n}<\/style>\r\n<div id=\"shl-accueil\">\r\n<script>document.getElementById('shl-accueil').classList.add('js')<\/script>\r\n<script>\r\n<!--\r\nif (\/[?&]lang=en(?:&|$)\/.test(location.search)) document.head.insertAdjacentHTML('beforeend', '<style id=\"lang-hold\">.site-header, #main, .footer { visibility: hidden; }<\/style>');\r\n\/\/-->\r\n<\/script>\r\n<div class=\"intro\" data-intro aria-hidden=\"true\"><canvas><\/canvas><\/div>\r\n<svg class=\"sprite\" width=\"0\" height=\"0\" aria-hidden=\"true\" focusable=\"false\"><defs><symbol id=\"fl-pt\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#da291c\"\/><rect width=\"14.4\" height=\"36\" fill=\"#046a38\"\/><circle cx=\"14.4\" cy=\"18\" r=\"6.2\" fill=\"none\" stroke=\"#ffe900\" stroke-width=\"2.2\"\/><path d=\"M11.8 14.8h5.2v4.4a2.6 2.6 0 0 1-5.2 0z\" fill=\"#da291c\" stroke=\"#fff\"\/><\/symbol><symbol id=\"fl-es\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#aa151b\"\/><rect y=\"9\" width=\"36\" height=\"18\" fill=\"#f1bf00\"\/><\/symbol><symbol id=\"fl-eu\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#003399\"\/><path d=\"M27.40 16.15L27.84 17.39L29.16 17.43L28.11 18.23L28.49 19.50L27.40 18.75L26.31 19.50L26.69 18.23L25.64 17.43L26.96 17.39ZM26.14 20.85L26.58 22.09L27.90 22.13L26.85 22.93L27.23 24.20L26.14 23.45L25.05 24.20L25.43 22.93L24.38 22.13L25.70 22.09ZM22.70 24.29L23.14 25.53L24.46 25.57L23.41 26.37L23.79 27.64L22.70 26.89L21.61 27.64L21.99 26.37L20.94 25.57L22.26 25.53ZM18.00 25.55L18.44 26.79L19.76 26.83L18.71 27.63L19.09 28.90L18.00 28.15L16.91 28.90L17.29 27.63L16.24 26.83L17.56 26.79ZM13.30 24.29L13.74 25.53L15.06 25.57L14.01 26.37L14.39 27.64L13.30 26.89L12.21 27.64L12.59 26.37L11.54 25.57L12.86 25.53ZM9.86 20.85L10.30 22.09L11.62 22.13L10.57 22.93L10.95 24.20L9.86 23.45L8.77 24.20L9.15 22.93L8.10 22.13L9.42 22.09ZM8.60 16.15L9.04 17.39L10.36 17.43L9.31 18.23L9.69 19.50L8.60 18.75L7.51 19.50L7.89 18.23L6.84 17.43L8.16 17.39ZM9.86 11.45L10.30 12.69L11.62 12.73L10.57 13.53L10.95 14.80L9.86 14.05L8.77 14.80L9.15 13.53L8.10 12.73L9.42 12.69ZM13.30 8.01L13.74 9.25L15.06 9.29L14.01 10.09L14.39 11.36L13.30 10.61L12.21 11.36L12.59 10.09L11.54 9.29L12.86 9.25ZM18.00 6.75L18.44 7.99L19.76 8.03L18.71 8.83L19.09 10.10L18.00 9.35L16.91 10.10L17.29 8.83L16.24 8.03L17.56 7.99ZM22.70 8.01L23.14 9.25L24.46 9.29L23.41 10.09L23.79 11.36L22.70 10.61L21.61 11.36L21.99 10.09L20.94 9.29L22.26 9.25ZM26.14 11.45L26.58 12.69L27.90 12.73L26.85 13.53L27.23 14.80L26.14 14.05L25.05 14.80L25.43 13.53L24.38 12.73L25.70 12.69Z\" fill=\"#ffcc00\"\/><\/symbol><symbol id=\"fl-dk\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#c8102e\"\/><path d=\"M11 0h5v36h-5zM0 15.5h36v5H0z\" fill=\"#fff\"\/><\/symbol><symbol id=\"fl-fr\" viewbox=\"0 0 3 2\"><rect width=\"3\" height=\"2\" fill=\"#e1000f\"\/><rect width=\"2\" height=\"2\" fill=\"#fff\"\/><rect width=\"1\" height=\"2\" fill=\"#000091\"\/><\/symbol><symbol id=\"fl-be\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ef3340\"\/><rect width=\"24\" height=\"36\" fill=\"#fdda24\"\/><rect width=\"12\" height=\"36\" fill=\"#1d1d1b\"\/><\/symbol><symbol id=\"fl-it\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ce2b37\"\/><rect width=\"24\" height=\"36\" fill=\"#fff\"\/><rect width=\"12\" height=\"36\" fill=\"#009246\"\/><\/symbol><symbol id=\"fl-ie\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ff883e\"\/><rect width=\"24\" height=\"36\" fill=\"#fff\"\/><rect width=\"12\" height=\"36\" fill=\"#169b62\"\/><\/symbol><symbol id=\"fl-ro\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ce1126\"\/><rect width=\"24\" height=\"36\" fill=\"#fcd116\"\/><rect width=\"12\" height=\"36\" fill=\"#002b7f\"\/><\/symbol><symbol id=\"fl-se\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#006aa7\"\/><path d=\"M11 0h5v36h-5zM0 15.5h36v5H0z\" fill=\"#fecc00\"\/><\/symbol><symbol id=\"fl-pl\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#dc143c\"\/><rect width=\"36\" height=\"18\" fill=\"#fff\"\/><\/symbol><symbol id=\"fl-gr\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#0d5eaf\"\/><path d=\"M0 4h36v4H0zM0 12h36v4H0zM0 20h36v4H0zM0 28h36v4H0z\" fill=\"#fff\"\/><rect width=\"20\" height=\"20\" fill=\"#0d5eaf\"\/><path d=\"M8 0h4v20H8zM0 8h20v4H0z\" fill=\"#fff\"\/><\/symbol><symbol id=\"ic-pub\" viewbox=\"0 0 24 24\"><path d=\"M3 22h18M6 18v-7M10 18v-7M14 18v-7M18 18v-7M12 2l8 5H4z\"\/><\/symbol><symbol id=\"ic-heart\" viewbox=\"0 0 24 24\"><path d=\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\"\/><\/symbol><symbol id=\"ic-compass\" viewbox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"m16.24 7.76-2.12 6.36-6.36 2.12 2.12-6.36z\"\/><\/symbol><symbol id=\"ic-tool\" viewbox=\"0 0 24 24\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"\/><\/symbol><symbol id=\"ic-read\" viewbox=\"0 0 24 24\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"\/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"\/><path d=\"M10 9H8M16 13H8M16 17H8\"\/><\/symbol><symbol id=\"ic-shield\" viewbox=\"0 0 24 24\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"\/><path d=\"m9 12 2 2 4-4\"\/><\/symbol><symbol id=\"ic-users\" viewbox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75\"\/><\/symbol><symbol id=\"ic-check\" viewbox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"\/><\/symbol><\/defs><\/svg>\r\n<a class=\"skip\" href=\"#main\">Aller au contenu<\/a>\r\n<header class=\"site-header\" data-header>\r\n  <div class=\"wrap header-row\">\r\n    <a class=\"brand\" href=\"#top\" aria-label=\"Social Hackers Lab, accueil\">\r\n      <span class=\"brand-mark\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"124\" height=\"124\"><\/span>\r\n    <\/a>\r\n    <nav class=\"main-nav\" aria-label=\"Navigation principale\">\r\n      <span class=\"nav-thumb\" aria-hidden=\"true\"><\/span>\r\n      <a href=\"#approche\" style=\"--c:var(--x1)\">Approche<\/a>\r\n      <a href=\"#territoires\" style=\"--c:var(--x8)\">Territoires<\/a>\r\n      <a href=\"#methode\" style=\"--c:var(--x5)\">M\u00e9thode<\/a>\r\n      <a href=\"#projets\" style=\"--c:var(--x10)\">Projets<\/a>\r\n      <a href=\"#collectivites\" style=\"--c:var(--x9)\">Collectivit\u00e9s<\/a>\r\n      <a href=\"#ressourcerie\" style=\"--c:var(--x3)\">Ressourcerie<\/a>\r\n      <a href=\"#equipe\" style=\"--c:var(--x4)\">\u00c9quipe<\/a>\r\n    <\/nav>\r\n    <div class=\"header-actions\">\r\n      <p class=\"lang\" data-lang-switch><a href=\"?lang=fr\" hreflang=\"fr\" lang=\"fr\" data-lang=\"fr\" aria-label=\"Version fran\u00e7aise\">FR<\/a><a href=\"?lang=en\" hreflang=\"en\" lang=\"en\" data-lang=\"en\" aria-label=\"English version\">EN<\/a><\/p>\r\n      <a class=\"btn btn-primary\" href=\"#contact\">\u00catre accompagn\u00e9 <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n    <\/div>\r\n    <p class=\"lang lang-m\" data-lang-switch><a href=\"?lang=fr\" hreflang=\"fr\" lang=\"fr\" data-lang=\"fr\" aria-label=\"Version fran\u00e7aise\">FR<\/a><a href=\"?lang=en\" hreflang=\"en\" lang=\"en\" data-lang=\"en\" aria-label=\"English version\">EN<\/a><\/p>\r\n    <button class=\"menu-toggle\" type=\"button\" aria-expanded=\"false\" aria-controls=\"mobile-nav\" data-menu><i aria-hidden=\"true\"><\/i>Menu<\/button>\r\n  <\/div>\r\n  <nav class=\"mobile-nav\" id=\"mobile-nav\" aria-label=\"Navigation mobile\" hidden>\r\n    <a href=\"#approche\">Approche<\/a>\r\n    <a href=\"#territoires\">Territoires<\/a>\r\n    <a href=\"#methode\">M\u00e9thode<\/a>\r\n    <a href=\"#projets\">Projets<\/a>\r\n    <a href=\"#collectivites\">Collectivit\u00e9s<\/a>\r\n    <a href=\"#ressourcerie\">Ressourcerie<\/a>\r\n    <a href=\"#equipe\">\u00c9quipe<\/a>\r\n    <a class=\"btn btn-primary\" href=\"#contact\">\u00catre accompagn\u00e9<\/a>\r\n  <\/nav>\r\n<\/header>\r\n<main id=\"main\">\r\n<!-- ============================== Hero ============================== -->\r\n<section class=\"hero\" id=\"top\" aria-labelledby=\"hero-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"hero-stage\">\r\n    <p class=\"eyebrow\" data-reveal>Incubateur associatif \u00b7 Fonds europ\u00e9ens<\/p>\r\n    <h1 id=\"hero-title\">\r\n      <span class=\"line\"><span>Construire des ponts entre<\/span><\/span>\r\n      <span class=\"sr-only\">les associations de terrain, les financements europ\u00e9ens et l\u2019innovation sociale<\/span>\r\n    <\/h1>\r\n    <div class=\"hero-art\" data-rope aria-hidden=\"true\">\r\n      <div class=\"hero-sky\"><canvas><\/canvas><\/div>\r\n      <p class=\"hero-banks\"><span style=\"--i:0\"><b style=\"--c:var(--x1)\">associations de terrain<\/b><\/span><span style=\"--i:1\"><b style=\"--c:var(--x7)\">financements europ\u00e9ens<\/b><\/span><span style=\"--i:2\"><b style=\"--c:var(--x5)\">innovation sociale<\/b><\/span><\/p>\r\n    <\/div>\r\n    <\/div>\r\n    <div class=\"hero-foot\" data-reveal style=\"--d:80\">\r\n      <p class=\"lede\"><b>Social Hackers Lab est ce pont.<\/b> Depuis Marseille, nous accompagnons les associations des quartiers prioritaires, des territoires ruraux et ultramarins \u00e0 acc\u00e9der aux financements europ\u00e9ens, \u00e0 structurer leurs projets et \u00e0 d\u00e9velopper les comp\u00e9tences n\u00e9cessaires pour d\u00e9poser demain en autonomie.<\/p>\r\n      <div class=\"hero-cta\">\r\n        <a class=\"btn btn-primary\" href=\"#contact\">\u00catre accompagn\u00e9 <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n        <a class=\"btn btn-ghost\" href=\"#projets\">Voir les projets financ\u00e9s<\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== Preuves ============================== -->\r\n<section class=\"proof\" aria-labelledby=\"proof-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"proof-head\" data-reveal>\r\n      <h2 id=\"proof-title\">SHL en chiffres<\/h2>\r\n      <p>Un impact mesurable, ancr\u00e9 dans les territoires.<\/p>\r\n    <\/div>\r\n    <dl class=\"figures\" data-counters>\r\n      <div data-reveal style=\"--d:0\"><dt><span data-count=\"5.2\" data-decimals=\"1\">5,2<\/span><small>M\u20ac<\/small><\/dt><dd>de financements europ\u00e9ens lev\u00e9s par les structures accompagn\u00e9es.<\/dd><\/div>\r\n      <div data-reveal style=\"--d:80\"><dt><span data-count=\"150\">150<\/span><small>+<\/small><\/dt><dd>associations accompagn\u00e9es partout en France.<\/dd><\/div>\r\n      <div data-reveal style=\"--d:160\"><dt><span data-count=\"90\">90<\/span><small>%<\/small><\/dt><dd>des structures red\u00e9posent un projet europ\u00e9en en autonomie l\u2019ann\u00e9e suivante.<\/dd><\/div>\r\n      <div data-reveal style=\"--d:240\"><dt><span data-count=\"6\">6<\/span><\/dt><dd>hubs inter-associatifs sur le territoire national.<\/dd><\/div>\r\n    <\/dl>\r\n    <p class=\"hubs-note\" data-reveal><b>6 hubs inter-associatifs<\/b> (R\u00e9gion Sud, Occitanie, Pyr\u00e9n\u00e9es-Atlantiques, \u00cele-de-France, Grand Est et Outre-mer) \u00b7 <b>1 ressourcerie num\u00e9rique<\/b> en acc\u00e8s continu.<\/p>\r\n    <div class=\"partners\" data-reveal>\r\n      <p><b>Partenaires & financeurs<\/b>Un programme soutenu par les collectivit\u00e9s, l\u2019\u00c9tat et l\u2019Europe.<\/p>\r\n      <div class=\"logos\">\r\n        <div class=\"logos-set\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri.png\" alt=\"M\u00e9tropole Aix-Marseille-Provence\" width=\"837\" height=\"134\" style=\"--lh:28px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901.png\" alt=\"Agence nationale de la coh\u00e9sion des territoires\" width=\"1280\" height=\"473\" style=\"--lh:38px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_.webp\" alt=\"D\u00e9partement de l\u2019Essonne\" width=\"960\" height=\"327\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-montpellier-3m.png\" alt=\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole\" width=\"119\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-villes-territoires-occitanie.png\" alt=\"Villes et Territoires Occitanie\" width=\"176\" height=\"81\" style=\"--lh:42px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-beziers-mediterranee.png\" alt=\"Agglom\u00e9ration B\u00e9ziers M\u00e9diterran\u00e9e\" width=\"88\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-herault-mediterranee.png\" alt=\"Agglom\u00e9ration H\u00e9rault M\u00e9diterran\u00e9e\" width=\"293\" height=\"120\" style=\"--lh:40px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-sete-agglopole.png\" alt=\"S\u00e8te Agglop\u00f4le M\u00e9diterran\u00e9e\" width=\"144\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lunel-agglo.png\" alt=\"Lunel Agglo\" width=\"120\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lodevois-larzac.png\" alt=\"Communaut\u00e9 de communes Lod\u00e9vois et Larzac\" width=\"172\" height=\"120\" style=\"--lh:52px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-clermont-l-herault.png\" alt=\"Ville de Clermont-l\u2019H\u00e9rault\" width=\"134\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-ville-de-loos.png\" alt=\"Ville de Loos\" width=\"642\" height=\"358\" style=\"--lh:47px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/images.png\" alt=\"Erasmus+\" width=\"800\" height=\"266\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n        <\/div>\r\n        <div class=\"logos-set\" aria-hidden=\"true\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri.png\" alt=\"\" width=\"837\" height=\"134\" style=\"--lh:28px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901.png\" alt=\"\" width=\"1280\" height=\"473\" style=\"--lh:38px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_.webp\" alt=\"\" width=\"960\" height=\"327\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-montpellier-3m.png\" alt=\"\" width=\"119\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-villes-territoires-occitanie.png\" alt=\"\" width=\"176\" height=\"81\" style=\"--lh:42px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-beziers-mediterranee.png\" alt=\"\" width=\"88\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-herault-mediterranee.png\" alt=\"\" width=\"293\" height=\"120\" style=\"--lh:40px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-sete-agglopole.png\" alt=\"\" width=\"144\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lunel-agglo.png\" alt=\"\" width=\"120\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lodevois-larzac.png\" alt=\"\" width=\"172\" height=\"120\" style=\"--lh:52px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-clermont-l-herault.png\" alt=\"\" width=\"134\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-ville-de-loos.png\" alt=\"\" width=\"642\" height=\"358\" style=\"--lh:47px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/images.png\" alt=\"\" width=\"800\" height=\"266\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== Carte ============================== -->\r\n<section class=\"atlas\" id=\"europe\" style=\"--h:var(--x7)\" aria-labelledby=\"atlas-title\" data-map>\r\n  <div class=\"wrap atlas-over\">\r\n    <div class=\"atlas-copy\" data-reveal>\r\n      <p class=\"sec-index\"><span>\u00b7<\/span> Des ponts vers l\u2019Europe<\/p>\r\n      <h2 class=\"sec-title\" id=\"atlas-title\">Des projets locaux, <em>des coop\u00e9rations europ\u00e9ennes.<\/em><\/h2>\r\n      <p class=\"sec-copy\">Cette carte pr\u00e9sente quelques exemples de coop\u00e9rations europ\u00e9ennes initi\u00e9es ou accompagn\u00e9es par Social Hackers Lab.<\/p>\r\n      <p class=\"sec-copy\">Chaque liaison illustre la mise en relation d\u2019une structure accompagn\u00e9e avec un ou plusieurs partenaires europ\u00e9ens. Elle donne un aper\u00e7u de la diversit\u00e9 des projets, des territoires et des coop\u00e9rations d\u00e9velopp\u00e9es \u00e0 l\u2019\u00e9chelle europ\u00e9enne.<\/p>\r\n    <\/div>\r\n    <div class=\"atlas-canvas\">\r\n      <canvas role=\"img\" aria-label=\"Carte de l\u2019Europe : quelques exemples de coop\u00e9rations relient des structures accompagn\u00e9es en France \u00e0 leurs partenaires europ\u00e9ens.\"><\/canvas>\r\n      <p class=\"map-tip\" data-map-tip aria-hidden=\"true\"><\/p>\r\n    <\/div>\r\n    <aside class=\"atlas-legend\" data-legend data-reveal style=\"--d:120\" aria-label=\"Exemples de projets repr\u00e9sent\u00e9s sur la carte\">\r\n      <ol class=\"legend-list\" data-legend-list aria-label=\"Exemples de projets financ\u00e9s\"><\/ol>\r\n    <\/aside>\r\n    <ul class=\"map-key\" aria-hidden=\"true\">\r\n      <li><i class=\"k-hub\"><\/i>Structure accompagn\u00e9e<\/li>\r\n      <li><i class=\"k-arc\"><\/i>Projet de coop\u00e9ration europ\u00e9en<\/li>\r\n      <li><i class=\"k-ctry\"><\/i>Pays partenaire<\/li>\r\n    <\/ul>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 01 Identit\u00e9 ============================== -->\r\n<section class=\"section\" id=\"approche\" style=\"--h:var(--x1)\" aria-labelledby=\"approche-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"ident-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>01<\/span> Notre identit\u00e9<\/p>\r\n        <h2 class=\"sec-title\" id=\"approche-title\">Notre approche&nbsp;: <em>le hacking social.<\/em><\/h2>\r\n      <\/div>\r\n      <div class=\"ident-text\">\r\n        <p class=\"ident-lead\" data-reveal style=\"--d:80\">Le hacking social, pour nous, c\u2019est une mani\u00e8re d\u2019agir sur les syst\u00e8mes qui emp\u00eachent trop souvent les associations d\u2019acc\u00e9der aux ressources qui leur sont pourtant destin\u00e9es.<\/p>\r\n        <div class=\"ident-body\" data-reveal style=\"--d:160\">\r\n          <p class=\"sec-copy\">Nous traduisons la complexit\u00e9 des financements europ\u00e9ens dans un langage clair, op\u00e9rationnel et directement utilisable. Nous aidons les associations \u00e0 comprendre les r\u00e8gles du jeu, \u00e0 structurer leurs id\u00e9es, \u00e0 construire des dossiers solides et \u00e0 prendre confiance dans leur capacit\u00e9 \u00e0 porter des projets ambitieux.<\/p>\r\n          <p class=\"sec-copy\">Notre approche repose sur trois leviers compl\u00e9mentaires&nbsp;: <b>la formation<\/b>, <b>l\u2019accompagnement individualis\u00e9<\/b> and <b>la mise en r\u00e9seau<\/b> avec des partenaires, financeurs et acteurs europ\u00e9ens.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"bento\">\r\n      <article class=\"bc\" style=\"--c:var(--t7);--cx:var(--x7)\" data-reveal>\r\n        <div class=\"bc-stage sc-pil is-b\" data-scene=\"piliers\" aria-hidden=\"true\">\r\n          <div class=\"pil\">\r\n            <div class=\"pil-fig\">\r\n              <svg class=\"pil-art\" viewbox=\"0 0 300 150\">\r\n                <defs>\r\n                  <lineargradient id=\"pil-g0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#c3cdc8\"\/><stop offset=\".62\" stop-color=\"#c3cdc8\" stop-opacity=\".8\"\/><stop offset=\"1\" stop-color=\"#c3cdc8\" stop-opacity=\".1\"\/><\/lineargradient><lineargradient id=\"pil-g1\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#4b8296\"\/><stop offset=\".62\" stop-color=\"#4b8296\" stop-opacity=\".8\"\/><stop offset=\"1\" stop-color=\"#4b8296\" stop-opacity=\".1\"\/><\/lineargradient><lineargradient id=\"pil-g2\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#bd9035\"\/><stop offset=\".62\" stop-color=\"#bd9035\" stop-opacity=\".8\"\/><stop offset=\"1\" stop-color=\"#bd9035\" stop-opacity=\".1\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-sheen\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".24\"\/><stop offset=\".5\" stop-color=\"#fff\" stop-opacity=\"0\"\/><stop offset=\"1\" stop-color=\"#16262c\" stop-opacity=\".06\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-edge\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".6\"\/><stop offset=\".5\" stop-color=\"#fff\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-top\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".14\"\/><stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-ground\" gradientunits=\"userSpaceOnUse\" x1=\"6\" x2=\"294\"><stop offset=\"0\" stop-color=\"#dde3dd\" stop-opacity=\"0\"\/><stop offset=\".2\" stop-color=\"#dde3dd\"\/><stop offset=\".8\" stop-color=\"#dde3dd\"\/><stop offset=\"1\" stop-color=\"#dde3dd\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                  <filter id=\"pil-lift\" x=\"-10%\" y=\"-40%\" width=\"120%\" height=\"240%\"><fedropshadow dx=\"0\" dy=\"8\" stddeviation=\"7\" flood-color=\"#16262c\" flood-opacity=\".22\"\/><\/filter>\r\n                  <clippath id=\"pil-soil\"><rect y=\"-80\" width=\"300\" height=\"218\"\/><\/clippath>\r\n                <\/defs>\r\n                <path d=\"M6 138.5H294\" stroke=\"url(#pil-ground)\"\/>\r\n                <g clip-path=\"url(#pil-soil)\">\r\n                  <g class=\"pil-col\"><rect x=\"31\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-g1)\"\/><rect x=\"31\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-sheen)\" stroke=\"url(#pil-edge)\"\/><path d=\"M58.50 67.80L59.04 69.25L60.59 69.32L59.38 70.29L59.79 71.78L58.50 70.92L57.21 71.78L57.62 70.29L56.41 69.32L57.96 69.25ZM57.36 72.05L57.90 73.50L59.45 73.57L58.24 74.54L58.65 76.03L57.36 75.17L56.07 76.03L56.48 74.54L55.27 73.57L56.82 73.50ZM54.25 75.16L54.79 76.61L56.34 76.68L55.13 77.65L55.54 79.14L54.25 78.29L52.96 79.14L53.37 77.65L52.16 76.68L53.71 76.61ZM50.00 76.30L50.54 77.75L52.09 77.82L50.88 78.79L51.29 80.28L50.00 79.42L48.71 80.28L49.12 78.79L47.91 77.82L49.46 77.75ZM45.75 75.16L46.29 76.61L47.84 76.68L46.63 77.65L47.04 79.14L45.75 78.29L44.46 79.14L44.87 77.65L43.66 76.68L45.21 76.61ZM42.64 72.05L43.18 73.50L44.73 73.57L43.52 74.54L43.93 76.03L42.64 75.17L41.35 76.03L41.76 74.54L40.55 73.57L42.10 73.50ZM41.50 67.80L42.04 69.25L43.59 69.32L42.38 70.29L42.79 71.78L41.50 70.92L40.21 71.78L40.62 70.29L39.41 69.32L40.96 69.25ZM42.64 63.55L43.18 65.00L44.73 65.07L43.52 66.04L43.93 67.53L42.64 66.67L41.35 67.53L41.76 66.04L40.55 65.07L42.10 65.00ZM45.75 60.44L46.29 61.89L47.84 61.96L46.63 62.92L47.04 64.42L45.75 63.56L44.46 64.42L44.87 62.92L43.66 61.96L45.21 61.89ZM50.00 59.30L50.54 60.75L52.09 60.82L50.88 61.79L51.29 63.28L50.00 62.42L48.71 63.28L49.12 61.79L47.91 60.82L49.46 60.75ZM54.25 60.44L54.79 61.89L56.34 61.96L55.13 62.92L55.54 64.42L54.25 63.56L52.96 64.42L53.37 62.92L52.16 61.96L53.71 61.89ZM57.36 63.55L57.90 65.00L59.45 65.07L58.24 66.04L58.65 67.53L57.36 66.67L56.07 67.53L56.48 66.04L55.27 65.07L56.82 65.00Z\" fill=\"#ffcc00\"\/><\/g>\r\n                  <g class=\"pil-col\"><rect x=\"131\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-g0)\"\/><rect x=\"131\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-sheen)\" stroke=\"url(#pil-edge)\"\/><\/g>\r\n                  <g class=\"pil-col\"><rect x=\"231\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-g2)\"\/><rect x=\"231\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-sheen)\" stroke=\"url(#pil-edge)\"\/><\/g>\r\n                <\/g>\r\n                <g class=\"pil-slab\" filter=\"url(#pil-lift)\"><rect x=\"14\" y=\"20\" width=\"272\" height=\"24\" rx=\"8\" fill=\"#16262c\"\/><rect x=\"14.5\" y=\"20.5\" width=\"271\" height=\"23\" rx=\"7.5\" fill=\"url(#pil-top)\" stroke=\"#fff\" stroke-opacity=\".08\"\/><\/g>\r\n              <\/svg>\r\n              <p class=\"pil-name\" style=\"--i:2\">Vos projets<\/p>\r\n            <\/div>\r\n            <ul class=\"pil-key\"><li class=\"is-new\" style=\"--k:var(--t7); --kx:var(--x7); --i:0\">Fonds<br>europ\u00e9ens<\/li><li>Subventions<br>habituelles<\/li><li class=\"is-new\" style=\"--k:var(--t3); --kx:var(--x3); --i:1\">Autres<br>ressources<\/li><\/ul>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">01<\/p>\r\n          <h3>Renforcer l\u2019autonomie financi\u00e8re<\/h3>\r\n          <p>Nous aidons les associations \u00e0 diversifier leurs ressources et \u00e0 int\u00e9grer durablement les financements europ\u00e9ens dans leur strat\u00e9gie. L\u2019enjeu n\u2019est pas seulement de financer un projet, mais de renforcer leur capacit\u00e9 \u00e0 s\u00e9curiser leur mod\u00e8le \u00e9conomique et \u00e0 choisir leurs opportunit\u00e9s de d\u00e9veloppement.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--t5);--cx:var(--x5); --d:80\" data-reveal>\r\n        <div class=\"bc-stage sc-dos\" data-scene=\"dossiers\" aria-hidden=\"true\">\r\n          <div class=\"dos\">\r\n            <p class=\"dos-key\"><span style=\"--k:var(--soft)\"><svg viewbox=\"0 0 11 16\"><use href=\"#dos-cur\"\/><\/svg>Social Hackers Lab<\/span><span style=\"--k:var(--c)\"><svg viewbox=\"0 0 11 16\"><use href=\"#dos-cur\"\/><\/svg>Votre \u00e9quipe<\/span><\/p>\r\n            <svg class=\"dos-art\" viewbox=\"0 0 300 124\">\r\n              <defs>\r\n                <path id=\"dos-cur\" d=\"M0 0V13.4L3.5 10.2L5.9 15.5L8.3 14.4L5.9 9.2H10.5Z\"\/>\r\n                <filter id=\"dos-sh\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"150%\"><fedropshadow dx=\"0\" dy=\"2\" stddeviation=\"2.5\" flood-color=\"#16262c\" flood-opacity=\".08\"\/><\/filter>\r\n                <filter id=\"dos-cur-sh\" x=\"-60%\" y=\"-40%\" width=\"220%\" height=\"180%\"><fedropshadow dx=\"0\" dy=\"1\" stddeviation=\".9\" flood-color=\"#16262c\" flood-opacity=\".28\"\/><\/filter>\r\n                <filter id=\"dos-blur\" x=\"-40%\" y=\"-40%\" width=\"180%\" height=\"180%\"><fegaussianblur stddeviation=\"6\"\/><\/filter>\r\n              <\/defs>\r\n              <rect class=\"dos-slot\" x=\"14\" y=\"10\" width=\"72\" height=\"96\" rx=\"7\"\/><rect class=\"dos-slot\" x=\"114\" y=\"10\" width=\"72\" height=\"96\" rx=\"7\"\/><rect class=\"dos-slot\" x=\"214\" y=\"10\" width=\"72\" height=\"96\" rx=\"7\"\/>\r\n              <path class=\"dos-brace\" d=\"M14 115v4h72v-4\"\/>\r\n              <path class=\"dos-brace is-you\" d=\"M114 115v4h172v-4\"\/>\r\n              <g class=\"dos-live\">\r\n                <g class=\"dos-sheet\" transform=\"translate(14 10)\">\r\n                  <rect class=\"dos-lift\" x=\"6\" y=\"12\" width=\"60\" height=\"88\" rx=\"8\" filter=\"url(#dos-blur)\"\/>\r\n                  <rect class=\"dos-paper\" width=\"72\" height=\"96\" rx=\"7\" filter=\"url(#dos-sh)\"\/>\r\n                  <rect class=\"dos-title\" x=\"10\" y=\"12\" width=\"30\" height=\"5\" rx=\"2.5\"\/>\r\n                  <rect class=\"dos-bed\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <rect class=\"dos-fill is-shl\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-shl\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <g class=\"dos-ok\" transform=\"translate(58 80)\"><circle r=\"7.5\"\/><path d=\"M-3.3 .2l2.2 2.2 4.3-4.4\"\/><\/g>\r\n                <\/g>\r\n                <g class=\"dos-sheet\" transform=\"translate(114 10)\">\r\n                  <rect class=\"dos-lift\" x=\"6\" y=\"12\" width=\"60\" height=\"88\" rx=\"8\" filter=\"url(#dos-blur)\"\/>\r\n                  <rect class=\"dos-paper\" width=\"72\" height=\"96\" rx=\"7\" filter=\"url(#dos-sh)\"\/>\r\n                  <rect class=\"dos-title\" x=\"10\" y=\"12\" width=\"30\" height=\"5\" rx=\"2.5\"\/>\r\n                  <rect class=\"dos-bed\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <rect class=\"dos-fill is-you\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <g class=\"dos-ok\" transform=\"translate(58 80)\"><circle r=\"7.5\"\/><path d=\"M-3.3 .2l2.2 2.2 4.3-4.4\"\/><\/g>\r\n                <\/g>\r\n                <g class=\"dos-sheet\" transform=\"translate(214 10)\">\r\n                  <rect class=\"dos-lift\" x=\"6\" y=\"12\" width=\"60\" height=\"88\" rx=\"8\" filter=\"url(#dos-blur)\"\/>\r\n                  <rect class=\"dos-paper\" width=\"72\" height=\"96\" rx=\"7\" filter=\"url(#dos-sh)\"\/>\r\n                  <rect class=\"dos-title\" x=\"10\" y=\"12\" width=\"30\" height=\"5\" rx=\"2.5\"\/>\r\n                  <rect class=\"dos-bed\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <rect class=\"dos-fill is-you\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <g class=\"dos-ok\" transform=\"translate(58 80)\"><circle r=\"7.5\"\/><path d=\"M-3.3 .2l2.2 2.2 4.3-4.4\"\/><\/g>\r\n                <\/g>\r\n                <use class=\"dos-cur is-shl\" href=\"#dos-cur\" transform=\"translate(-16 34)\" filter=\"url(#dos-cur-sh)\" style=\"opacity:0\"\/>\r\n                <use class=\"dos-cur is-you\" href=\"#dos-cur\" transform=\"translate(276 100)\" filter=\"url(#dos-cur-sh)\"\/>\r\n              <\/g>\r\n            <\/svg>\r\n            <div class=\"dos-ticks\"><p><b>Ann\u00e9e 1<\/b>avec SHL<\/p><p class=\"is-you\"><b>Ann\u00e9e 2<\/b>en autonomie<\/p><\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">02<\/p>\r\n          <h3>Inscrire l\u2019action dans la dur\u00e9e<\/h3>\r\n          <p>Nous transmettons des comp\u00e9tences techniques et strat\u00e9giques pour que les associations ne d\u00e9pendent pas uniquement d\u2019un accompagnement ponctuel. \u00c0 la fin du parcours, les \u00e9quipes disposent d\u2019outils, de m\u00e9thodes et de mod\u00e8les r\u00e9utilisables pour d\u00e9poser de nouveaux dossiers de mani\u00e8re autonome.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--lv3); --cx:var(--x4); --d:160\" data-reveal>\r\n        <div class=\"bc-stage sc-net\" data-scene=\"reseau\" aria-hidden=\"true\">\r\n          <svg class=\"net-svg\"><\/svg>\r\n          <p class=\"net-key\"><span><i><\/i>Pays partenaires<\/span><span><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Financeur europ\u00e9en<\/span><\/p>\r\n          <span class=\"net-node is-on\" title=\"Portugal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pt\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"SPAIN\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"Union europ\u00e9enne\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"Danemark\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-dk\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"Pologne\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pl\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"GREECE\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-gr\"\/><\/svg><\/span>\r\n          <span class=\"net-core\">Votre association<\/span>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">03<\/p>\r\n          <h3>Saisir les opportunit\u00e9s<\/h3>\r\n          <p>Les financements europ\u00e9ens sont souvent per\u00e7us comme complexes, \u00e9loign\u00e9s ou r\u00e9serv\u00e9s aux grandes structures. Notre r\u00f4le est de les rendre accessibles aux associations de terrain, en identifiant les bons dispositifs, en simplifiant les \u00e9tapes et en accompagnant les structures jusqu\u2019au d\u00e9p\u00f4t.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 02 Territoires ============================== -->\r\n<section class=\"section tint\" id=\"territoires\" style=\"--h:var(--x8)\" aria-labelledby=\"territoires-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>02<\/span> Nos champs d\u2019action<\/p>\r\n        <h2 class=\"sec-title\" id=\"territoires-title\">Des territoires souvent \u00e9loign\u00e9s des <em>circuits de financement.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Nous intervenons prioritairement l\u00e0 o\u00f9 l\u2019acc\u00e8s aux financements reste difficile&nbsp;: quartiers prioritaires de la politique de la ville, territoires ruraux, territoires ultramarins et structures \u00e9mergentes de l\u2019\u00e9conomie sociale et solidaire.<\/p>\r\n    <\/div>\r\n    <div class=\"terr\" data-terr>\r\n      <ol class=\"fields\" data-reveal>\r\n        <li class=\"field is-on\" style=\"--c:var(--t8);--cx:var(--x8)\">\r\n          <span class=\"field-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\"><path d=\"M3 21h18M5 21V9l5-3v15M10 21V4l9 4v13M13 10h3M13 13.5h3M13 17h3M7 12h1M7 15.5h1\"\/><\/svg><\/span>\r\n          <div>\r\n            <p class=\"mono\">QPV<\/p>\r\n            <h3><button class=\"field-btn\" type=\"button\" aria-pressed=\"true\" aria-controls=\"terr-map\">Les quartiers prioritaires de la politique de la ville<\/button><\/h3>\r\n            <p>En partenariat avec les collectivit\u00e9s, nous accompagnons des associations qui portent des actions essentielles aupr\u00e8s des habitants mais manquent de temps, de r\u00e9seau ou d\u2019ing\u00e9nierie. L\u2019incubateur transforme leurs actions de terrain en projets structur\u00e9s, finan\u00e7ables et \u00e9ligibles.<\/p>\r\n          <\/div>\r\n          <i class=\"field-bar\" aria-hidden=\"true\"><\/i>\r\n        <\/li>\r\n        <li class=\"field\" style=\"--c:var(--t5);--cx:var(--x5)\">\r\n          <span class=\"field-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\"><path d=\"M2 17c2.5 0 2.5-1.5 5-1.5S9.5 17 12 17s2.5-1.5 5-1.5 2.5 1.5 5 1.5M2 21c2.5 0 2.5-1.5 5-1.5S9.5 21 12 21s2.5-1.5 5-1.5 2.5 1.5 5 1.5M4 13l5-7 4 5 2.5-3L20 13\"\/><\/svg><\/span>\r\n          <div>\r\n            <p class=\"mono\">Rural \u00b7 Outre-mer<\/p>\r\n            <h3><button class=\"field-btn\" type=\"button\" aria-pressed=\"false\" aria-controls=\"terr-map\">Les territoires ruraux et ultramarins<\/button><\/h3>\r\n            <p>Un accompagnement adapt\u00e9 \u00e0 chaque r\u00e9alit\u00e9&nbsp;: \u00e9loignement g\u00e9ographique, acc\u00e8s aux partenaires, sp\u00e9cificit\u00e9s locales, besoins de coop\u00e9ration r\u00e9gionale ou transfrontali\u00e8re. Nous intervenons notamment en Outre-mer et dans les territoires ruraux.<\/p>\r\n          <\/div>\r\n          <i class=\"field-bar\" aria-hidden=\"true\"><\/i>\r\n        <\/li>\r\n        <li class=\"field\" style=\"--c:var(--t3);--cx:var(--x3)\">\r\n          <span class=\"field-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\"><circle cx=\"12\" cy=\"5\" r=\"2.2\"\/><circle cx=\"5\" cy=\"17\" r=\"2.2\"\/><circle cx=\"19\" cy=\"17\" r=\"2.2\"\/><circle cx=\"12\" cy=\"12.5\" r=\"1.6\"\/><path d=\"M12 7.2v3.7M10.7 13.5l-4 2.3M13.3 13.5l4 2.3\"\/><\/svg><\/span>\r\n          <div>\r\n            <p class=\"mono\">ESS<\/p>\r\n            <h3><button class=\"field-btn\" type=\"button\" aria-pressed=\"false\" aria-controls=\"terr-map\">Les structures \u00e9mergentes de l\u2019ESS<\/button><\/h3>\r\n            <p>L\u2019incubateur s\u2019adresse aux structures qui portent des projets d\u2019int\u00e9r\u00eat g\u00e9n\u00e9ral et souhaitent changer d\u2019\u00e9chelle, quelle que soit leur taille ou leur th\u00e9matique.<\/p>\r\n          <\/div>\r\n          <i class=\"field-bar\" aria-hidden=\"true\"><\/i>\r\n        <\/li>\r\n      <\/ol>\r\n      <figure class=\"terr-map\" id=\"terr-map\" data-reveal style=\"--d:120\">\r\n        <p class=\"terr-head\"><span><b>Fig. 02<\/b> \u00b7 O\u00f9 nous intervenons<\/span><span data-terr-count>01 \/ 03<\/span><\/p>\r\n        <div class=\"terr-stage\">\r\n          <canvas role=\"img\" aria-label=\"Carte de France et des cinq d\u00e9partements d\u2019outre-mer. Tour \u00e0 tour s\u2019allument les quartiers prioritaires des agglom\u00e9rations, les territoires ruraux et ultramarins, puis un r\u00e9seau de structures de l\u2019ESS reli\u00e9 \u00e0 l\u2019Europe.\"><\/canvas>\r\n          <ul class=\"drom\" aria-hidden=\"true\"><li>Guadeloupe<\/li><li>Martinique<\/li><li>Guyane<\/li><li>La R\u00e9union<\/li><li>Mayotte<\/li><\/ul>\r\n        <\/div>\r\n        <ul class=\"terr-key\" aria-hidden=\"true\">\r\n          <li class=\"is-on\" style=\"--k:var(--t8); --kx:var(--x8)\"><i><\/i>Quartiers prioritaires des agglom\u00e9rations<\/li>\r\n          <li style=\"--k:var(--t5); --kx:var(--x5)\"><i><\/i>Territoires ruraux et d\u2019outre-mer<\/li>\r\n          <li style=\"--k:var(--t3); --kx:var(--x3)\"><i><\/i>Structures de l\u2019ESS, en r\u00e9seau jusqu\u2019\u00e0 l\u2019Europe<\/li>\r\n        <\/ul>\r\n      <\/figure>\r\n    <\/div>\r\n    <div class=\"kinds\" data-reveal>\r\n      <p><b>Pour qui<\/b>Des structures de toutes tailles et de tous secteurs.<\/p>\r\n      <ul>\r\n        <li>Associations culturelles<\/li><li>Centres sociaux<\/li><li>Structures d\u2019insertion<\/li><li>Collectifs citoyens<\/li><li>Associations sportives<\/li><li>Lutte contre les discriminations<\/li><li>Jeunesse<\/li><li>Inclusion<\/li><li>Transition \u00e9cologique<\/li>\r\n      <\/ul>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 03 M\u00e9thode ============================== -->\r\n<section class=\"section\" id=\"methode\" style=\"--h:var(--x5)\" aria-labelledby=\"methode-title\">\r\n  <div class=\"wrap method\" data-method>\r\n    <div class=\"method-aside\">\r\n      <div class=\"method-sticky\">\r\n        <p class=\"sec-index\"><span>03<\/span> Notre m\u00e9thodologie<\/p>\r\n        <h2 class=\"sec-title\" id=\"methode-title\">Un parcours structur\u00e9 en <em>cinq \u00e9tapes.<\/em><\/h2>\r\n        <p class=\"sec-copy\">De l\u2019acculturation aux financements europ\u00e9ens jusqu\u2019\u00e0 l\u2019autonomie compl\u00e8te des \u00e9quipes&nbsp;: une progression con\u00e7ue pour conduire les structures jusqu\u2019au d\u00e9p\u00f4t effectif de leurs dossiers et favoriser le transfert durable des comp\u00e9tences.<\/p>\r\n        <div class=\"rail\" aria-hidden=\"true\">\r\n          <div class=\"rail-track\"><span data-rail-fill><\/span><\/div>\r\n          <ol>\r\n            <li><a href=\"#etape-1\" tabindex=\"-1\"><span>01<\/span>Diagnostic<\/a><\/li>\r\n            <li><a href=\"#etape-2\" tabindex=\"-1\"><span>02<\/span>Formation<\/a><\/li>\r\n            <li><a href=\"#etape-3\" tabindex=\"-1\"><span>03<\/span>Montage<\/a><\/li>\r\n            <li><a href=\"#etape-4\" tabindex=\"-1\"><span>04<\/span>Relecture et d\u00e9p\u00f4t<\/a><\/li>\r\n            <li><a href=\"#etape-5\" tabindex=\"-1\"><span>05<\/span>Autonomie<\/a><\/li>\r\n          <\/ol>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <ol class=\"steps\">\r\n      <li class=\"step\" id=\"etape-1\">\r\n        <p class=\"step-top\"><span class=\"big\">01<\/span><span class=\"step-label\">\u00c9tape 1 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"now\"><\/i><i><\/i><i><\/i><i><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Diagnostic de maturit\u00e9 europ\u00e9enne<\/h3>\r\n        <p>Un auto-diagnostic structur\u00e9 permet \u00e0 chaque association d\u2019\u00e9valuer sa capacit\u00e9 \u00e0 mobiliser les fonds europ\u00e9ens, d\u2019identifier ses forces et de cartographier ses besoins.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-2\">\r\n        <p class=\"step-top\"><span class=\"big\">02<\/span><span class=\"step-label\">\u00c9tape 2 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"now\"><\/i><i><\/i><i><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Formation aux logiques de financement<\/h3>\r\n        <p>Des ateliers collectifs pour comprendre les financements europ\u00e9ens&nbsp;: attendus des financeurs, crit\u00e8res d\u2019\u00e9ligibilit\u00e9, logique de projet, cadre logique, budgets, partenariats et \u00e9tapes cl\u00e9s d\u2019un d\u00e9p\u00f4t.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-3\">\r\n        <p class=\"step-top\"><span class=\"big\">03<\/span><span class=\"step-label\">\u00c9tape 3 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"now\"><\/i><i><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Accompagnement au montage<\/h3>\r\n        <p>Chaque structure transforme son id\u00e9e en projet clair, coh\u00e9rent et finan\u00e7able. Nous travaillons ensemble les objectifs, les publics vis\u00e9s, les activit\u00e9s, les r\u00e9sultats attendus, le budget, le calendrier et les partenaires.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-4\">\r\n        <p class=\"step-top\"><span class=\"big\">04<\/span><span class=\"step-label\">\u00c9tape 4 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"now\"><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Relecture et d\u00e9p\u00f4t<\/h3>\r\n        <p>Les dossiers sont relus avant d\u00e9p\u00f4t pour s\u00e9curiser la coh\u00e9rence du projet, la r\u00e9daction, le budget, les pi\u00e8ces administratives et les annexes. Objectif&nbsp;: s\u00e9curiser la qualit\u00e9 du d\u00e9p\u00f4t et renforcer la coh\u00e9rence de la candidature, tout en permettant \u00e0 l\u2019\u00e9quipe de ma\u00eetriser chaque \u00e9tape.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-5\">\r\n        <p class=\"step-top\"><span class=\"big\">05<\/span><span class=\"step-label\">\u00c9tape 5 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"now\"><\/i><\/span><\/span><\/p>\r\n        <h3>Transfert de comp\u00e9tences et autonomisation<\/h3>\r\n        <p>Les associations repartent avec des outils concrets, mieux outill\u00e9es pour d\u00e9poser de nouveaux projets, d\u00e9velopper leurs partenariats et renforcer durablement leur autonomie financi\u00e8re.<\/p>\r\n        <ul class=\"tools\">\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 1.5h5.5L13 5v9.5H4z M9.5 1.5V5H13\"\/><\/svg>Mod\u00e8les de dossiers<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M2.5 2.5h11v11h-11z M2.5 6.2h11 M2.5 9.8h11 M6.2 2.5v11\"\/><\/svg>Trames budg\u00e9taires<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M2 3.5h5a1.5 1.5 0 0 1 1.5 1.5v9A1.5 1.5 0 0 0 7 12.5H2z M14 3.5H9.5A1.5 1.5 0 0 0 8 5\"\/><\/svg>Ressources p\u00e9dagogiques<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M10.5 2.5l3 3-8 8H2.5v-3z\"\/><\/svg>M\u00e9thodes de r\u00e9daction<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"5.5\"\/><path d=\"M8 5v3l2 1.5\"\/><\/svg>Veille sur les appels<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M1.5 3.5h13v8h-13z M5.5 14h5 M8 11.5V14\"\/><\/svg>Supports de formation<\/li>\r\n        <\/ul>\r\n      <\/li>\r\n    <\/ol>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 04 Projets ============================== -->\r\n<section class=\"section tint\" id=\"projets\" style=\"--h:var(--x10)\" aria-labelledby=\"projets-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>04<\/span> Sur le terrain<\/p>\r\n        <h2 class=\"sec-title\" id=\"projets-title\">Des projets r\u00e9els, des <em>r\u00e9sultats mesurables.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Une s\u00e9lection de projets europ\u00e9ens accompagn\u00e9s jusqu\u2019\u00e0 leur financement, repr\u00e9sentatifs de la diversit\u00e9 des th\u00e9matiques et des partenariats transnationaux.<\/p>\r\n    <\/div>\r\n    <div class=\"projects\" data-projects>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:8;--by:164;--bw:488;--bh:171\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Solidarite-femmes-13.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">\u00c9galit\u00e9 & violences de genre<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Espagne<\/p>\r\n        <h3>Solidarit\u00e9 Femmes 13 \u00d7 Dem\u00e9ter<\/h3>\r\n        <p>Projet Hyphen&nbsp;: restaurer le lien m\u00e8re-enfant en contexte de violences domestiques. Module de formation, recherche-action, deux r\u00e9sidences \u00e0 M\u00e1laga et Marseille.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo=\"fan\" aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:55;--by:55;--bw:390;--bh:390\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-le-grand-bleu.jpg\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:22%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:87%;--y:55%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:87%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Jeunesse & sport<\/p>\r\n        <p class=\"place\">Quartiers Nord de Marseille<\/p>\r\n        <h3>Le Grand Bleu<\/h3>\r\n        <p>Mobilit\u00e9 Erasmus+ pour 30 jeunes des quartiers Nord dans trois pays europ\u00e9ens&nbsp;: engagement citoyen et appartenance europ\u00e9enne par le sport.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:37;--by:199;--bw:383;--bh:106\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/action-bomaye.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-gr\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Culture & insertion<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Gr\u00e8ce<\/p>\r\n        <h3>Action Bomaye \u00d7 Balkania<\/h3>\r\n        <p>Cin\u00e9ma et insertion socio-professionnelle&nbsp;: s\u00e9ances plein air, master classes, formation \u00e0 la r\u00e9alisation, r\u00e9duction de l\u2019empreinte carbone des festivals.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:125;--by:77;--bw:246;--bh:327\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Tesslab.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node duo-hub\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 24 24\"><path d=\"M12 12 6 6.5M12 12l6-5M12 12l5.2 6.5M12 12l-6 5.5\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><circle cx=\"6\" cy=\"6.5\" r=\"1.9\"\/><circle cx=\"18\" cy=\"7\" r=\"1.9\"\/><circle cx=\"17.2\" cy=\"18.5\" r=\"1.9\"\/><circle cx=\"6\" cy=\"17.5\" r=\"1.9\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>FSE+<\/span><\/div>\r\n        <p class=\"theme\">Insertion professionnelle<\/p>\r\n        <p class=\"place\">Strasbourg<\/p>\r\n        <h3>Tesslab<\/h3>\r\n        <p>Renforcer l\u2019insertion des publics \u00e9loign\u00e9s de l\u2019emploi via un parcours de formation-action ancr\u00e9 dans l\u2019ESS, avec mobilisation du hub inter-associatif.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:0;--by:218;--bw:500;--bh:63\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Groupe-dispersion.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pl\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Art & inclusion des jeunes<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Pologne<\/p>\r\n        <h3>Groupe Dispersion \u00d7 Fundacja CEL<\/h3>\r\n        <p>Des autoportraits film\u00e9s pour redonner la parole \u00e0 des jeunes en situation d\u2019exclusion&nbsp;: ateliers participatifs, film collectif, projections-d\u00e9bats et livret p\u00e9dagogique pour transmettre la m\u00e9thode.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:14;--by:189;--bw:473;--bh:120\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/lOEIL-DU-LOUP.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-dk\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Pr\u00e9vention & \u00e9ducation<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Danemark<\/p>\r\n        <h3>L\u2019\u0152il du Loup<\/h3>\r\n        <p>Skills for Consent&nbsp;: une bo\u00eete \u00e0 outils de 23 activit\u00e9s pour pr\u00e9venir les violences sexistes et sexuelles d\u00e8s l\u2019enfance, con\u00e7ue avec des enseignants et des professionnels de l\u2019enfance.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:75;--by:155;--bw:364;--bh:202\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/DDA.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pt\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Art & durabilit\u00e9<\/p>\r\n        <p class=\"place\">France \u00d7 Portugal<\/p>\r\n        <h3>DDA Contemporary Art \u00d7 Eruditembrace<\/h3>\r\n        <p>Laboratoire de bonnes pratiques \u00e9cologiques pour r\u00e9inventer l\u2019art de mani\u00e8re durable&nbsp;: approche holistique, interdisciplinaire, publics vari\u00e9s.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo=\"fan\" aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-ajar.png\" alt=\"\" width=\"601\" height=\"240\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:22%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-ro\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:87%;--y:55%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:87%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-se\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+ \u00b7 Europe Cr\u00e9ative<\/span><\/div>\r\n        <p class=\"theme\">\u00c9ducation aux m\u00e9dias<\/p>\r\n        <p class=\"place\">Paris \u00d7 Roumanie, Espagne, Su\u00e8de<\/p>\r\n        <h3>AJAR<\/h3>\r\n        <p>Projet MEDIAWISE&nbsp;: l\u2019\u00e9ducation aux m\u00e9dias au service de l\u2019inclusion et de la participation d\u00e9mocratique de femmes issues de minorit\u00e9s, avec 20 \u00e9ducatrices form\u00e9es et un kit p\u00e9dagogique trilingue.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-e2c.png\" alt=\"\" width=\"440\" height=\"429\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-ie\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Insertion & mobilit\u00e9<\/p>\r\n        <p class=\"place\">Nantes \u00d7 Irlande<\/p>\r\n        <h3>\u00c9COLE DE LA DEUXI\u00c8ME CHANCE<\/h3>\r\n        <p>Projet READY+&nbsp;: pr\u00e9parer des adultes vuln\u00e9rables \u00e0 la mobilit\u00e9 europ\u00e9enne et \u00e0 l\u2019emploi durable, avec un cadre m\u00e9thodologique, des outils p\u00e9dagogiques et une phase pilote en France et en Irlande.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:25;--by:17;--bw:442;--bh:442\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/fifrelin.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-be\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">\u00c9galit\u00e9 & inclusion<\/p>\r\n        <p class=\"place\">La Ciotat \u00d7 Belgique<\/p>\r\n        <h3>Association Fifrelin<\/h3>\r\n        <p>Rompre l\u2019isolement des femmes confront\u00e9es aux discriminations par le sport et la culture&nbsp;: confiance en soi, autonomie, pouvoir d\u2019agir, et des pratiques partag\u00e9es entre structures partenaires.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-ferme-uhaldia.png\" alt=\"\" width=\"144\" height=\"56\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Agriculture & insertion<\/p>\r\n        <p class=\"place\">Pays basque \u00d7 Espagne<\/p>\r\n        <h3>La Ferme d\u2019Uhaldia<\/h3>\r\n        <p>Des mobilit\u00e9s en Espagne pour des personnes en insertion&nbsp;: agriculture \u00e9cologique, alimentation durable et nouvelles m\u00e9thodes d\u2019accompagnement socio-professionnel.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:33;--by:110;--bw:452;--bh:278\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/LA-FORET-EN-PAPIER.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-it\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Lecture & m\u00e9diation culturelle<\/p>\r\n        <p class=\"place\">Aix-Marseille \u00d7 Italie<\/p>\r\n        <h3>La For\u00eat en papier<\/h3>\r\n        <p>Les \u00ab Silent Books \u00bb, livres sans texte, pour ouvrir la lecture aux enfants et aux familles qui en sont \u00e9loign\u00e9s&nbsp;: une m\u00e9thode inclusive et des outils pour les professionnels de l\u2019\u00e9ducation.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:41;--by:127;--bw:408;--bh:255\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/le-facteur-independant.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-be\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Sant\u00e9 mentale & inclusion<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Belgique<\/p>\r\n        <h3>Le Facteur Ind\u00e9pendant<\/h3>\r\n        <p>\u00c9changes europ\u00e9ens et formations en \u00e9ducation non formelle pour des adultes qui ont le moins d\u2019opportunit\u00e9s, notamment face \u00e0 des troubles psychiques&nbsp;: outils p\u00e9dagogiques et participation citoyenne.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:0;--by:0;--bw:225;--bh:225;--n:225\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2023\/03\/20211213171930-logoopen-lande-1.jpg\" alt=\"\" width=\"225\" height=\"225\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node is-sm\" style=\"--x:82%;--y:30%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-it\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:82%;--y:78%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-gr\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Engagement citoyen<\/p>\r\n        <p class=\"place\">Pays basque \u00d7 Italie, Gr\u00e8ce<\/p>\r\n        <h3>Open Lande<\/h3>\r\n        <p>Former des acteurs associatifs en France et en Italie \u00e0 transformer leurs actions en exp\u00e9riences accessibles, pour toucher de nouveaux publics, notamment les plus \u00e9loign\u00e9s, et favoriser l\u2019engagement citoyen.<\/p>\r\n      <\/article>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== T\u00e9moignages ============================== -->\r\n<section class=\"section\" id=\"temoignages\" aria-labelledby=\"avis-title\" style=\"--h:var(--x2)\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>\u00b7<\/span> Ce qu\u2019elles en disent<\/p>\r\n        <h2 class=\"sec-title\" id=\"avis-title\">Des associations qui <em>s\u2019approprient les outils.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Neuf capsules vid\u00e9o&nbsp;: les associations accompagn\u00e9es racontent, face cam\u00e9ra, ce que l\u2019accompagnement a chang\u00e9 pour elles.<\/p>\r\n    <\/div>\r\n    <div class=\"vids\" data-vids data-reveal>\r\n      <div class=\"vid-stage\">\r\n        <div class=\"vid-frame\" data-vid-frame>\r\n          <img loading=\"lazy\" class=\"vid-poster\" data-vid-poster src=\"https:\/\/i.ytimg.com\/vi\/DniqlqYC4OI\/maxresdefault.jpg\" alt=\"\" width=\"1280\" height=\"720\" decoding=\"async\">\r\n          <div class=\"vid-cap\" aria-hidden=\"true\"><p class=\"vid-kicker\"><span>Capsule vid\u00e9o<\/span><span data-vid-dur>1:40<\/span><\/p><p class=\"vid-title\" data-vid-title>Association Fifrelin<\/p><p class=\"vid-sub\" data-vid-sub>La Ciotat \u00b7 inclusion sociale<\/p><\/div>\r\n          <button class=\"vid-play\" type=\"button\" data-vid-play aria-label=\"Lire la vid\u00e9o\"><svg viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8.5 5.8v12.4a.9.9 0 0 0 1.37.77l10-6.2a.9.9 0 0 0 0-1.54l-10-6.2a.9.9 0 0 0-1.37.77z\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vid-side\">\r\n        <p class=\"vid-head\"><span>9 capsules<\/span><\/p>\r\n        <ol class=\"vid-list\" aria-label=\"Capsules vid\u00e9o des associations\">\r\n        <li><button class=\"vid-item is-on\" type=\"button\" data-vid=\"DniqlqYC4OI\" aria-pressed=\"true\" style=\"--c:var(--t2)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/DniqlqYC4OI\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:40<\/span><\/span><span class=\"vid-meta\"><b>Association Fifrelin<\/b><span>La Ciotat \u00b7 inclusion sociale<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"5ajbRhhseEI\" aria-pressed=\"false\" style=\"--c:var(--t8)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/5ajbRhhseEI\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:39<\/span><\/span><span class=\"vid-meta\"><b>En Majuscule<\/b><span>Marseille \u00b7 projets num\u00e9riques<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"yM573lEaPh8\" aria-pressed=\"false\" style=\"--c:var(--t1)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/yM573lEaPh8\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:16<\/span><\/span><span class=\"vid-meta\"><b>Action Bomaye<\/b><span>Marseille \u00b7 cin\u00e9ma et insertion<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"eILCl86NA_o\" aria-pressed=\"false\" style=\"--c:var(--t6)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/eILCl86NA_o\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:05<\/span><\/span><span class=\"vid-meta\"><b>Hatoup!<\/b><span>Marseille \u00b7 mobilit\u00e9 jeunesse<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"y_uC4omhlls\" aria-pressed=\"false\" style=\"--c:var(--t5)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/y_uC4omhlls\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:59<\/span><\/span><span class=\"vid-meta\"><b>La For\u00eat en papier<\/b><span>Aix-Marseille \u00b7 m\u00e9diation culturelle<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"ssh5QegH3YI\" aria-pressed=\"false\" style=\"--c:var(--t3)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/ssh5QegH3YI\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:43<\/span><\/span><span class=\"vid-meta\"><b>Terre Ludique<\/b><span>Aix-Marseille \u00b7 inclusion sociale<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"61UHy-zD1zg\" aria-pressed=\"false\" style=\"--c:var(--t9)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/61UHy-zD1zg\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:48<\/span><\/span><span class=\"vid-meta\"><b>Martigues Sport Athl\u00e9tisme<\/b><span>Martigues \u00b7 jeunesse et sport<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"fN8BeO-cKLc\" aria-pressed=\"false\" style=\"--c:var(--t4)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/fN8BeO-cKLc\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:42<\/span><\/span><span class=\"vid-meta\"><b>Les Cols Verts Provence<\/b><span>La Ciotat \u00b7 transition \u00e9cologique<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"EpO_K-Fi548\" aria-pressed=\"false\" style=\"--c:var(--t10)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/EpO_K-Fi548\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:04<\/span><\/span><span class=\"vid-meta\"><b>\u00c9cole de la 2e chance<\/b><span>Nantes \u00b7 inclusion sociale<\/span><\/span><\/button><\/li>\r\n        <\/ol>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 05 Confiance ============================== -->\r\n<section class=\"section tint\" aria-labelledby=\"confiance-title\" style=\"--h:var(--x6)\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>05<\/span> Pourquoi nous faire confiance<\/p>\r\n        <h2 class=\"sec-title\" id=\"confiance-title\">Trois garanties au service <em>de votre projet.<\/em><\/h2>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"bento trust\">\r\n      <article class=\"bc\" style=\"--c:var(--t1);--cx:var(--x1)\" data-reveal>\r\n        <div class=\"bc-stage sc-ros\" data-scene=\"terrain\" aria-hidden=\"true\">\r\n          <div class=\"ros\">\r\n            <div class=\"ros-side\">\r\n              <p class=\"ros-num\"><span data-odo>150<\/span>+<\/p>\r\n              <p class=\"ros-cap\">associations accompagn\u00e9es partout en France<\/p>\r\n            <\/div>\r\n            <div class=\"ros-roll\">\r\n              <div class=\"ros-track\">\r\n                <ul class=\"ros-list\">\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-action-bomaye.png\" alt=\"\" width=\"240\" height=\"61\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Action Bomaye<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>art et quartiers<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-k-pab6t.png\" alt=\"\" width=\"96\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>K-Pab6T<\/b><small><em>La R\u00e9union<\/em><i> \u00b7 <\/i>innovation sociale<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:55;--by:55;--bw:390;--bh:390\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-le-grand-bleu.jpg\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Le Grand Bleu<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>sport inclusif<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-la-farandole.png\" alt=\"\" width=\"146\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Centre social La Farandole<\/b><small><em>Istres<\/em><i> \u00b7 <\/i>services de proximit\u00e9<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-ferme-uhaldia.png\" alt=\"\" width=\"144\" height=\"56\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>La Ferme d\u2019Uhaldia<\/b><small><em>Pays basque<\/em><i> \u00b7 <\/i>climat et \u00e9ducation<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-acelem.png\" alt=\"\" width=\"240\" height=\"93\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Acelem<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>r\u00e9ussite scolaire<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:8;--by:164;--bw:488;--bh:171\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Solidarite-femmes-13.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Solidarit\u00e9 Femmes 13<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>femmes et m\u00e8res isol\u00e9es<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-nos-vies-nos-avis.png\" alt=\"\" width=\"96\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Nos vies nos avis<\/b><small><em>Nouvelle-Cal\u00e9donie<\/em><i> \u00b7 <\/i>participation citoyenne<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-la-regie-port-de-bouc.png\" alt=\"\" width=\"240\" height=\"79\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>R\u00e9gie de quartier<\/b><small><em>Port-de-Bouc<\/em><i> \u00b7 <\/i>insertion par l\u2019emploi<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-le-paysan-urbain.png\" alt=\"\" width=\"225\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Le Paysan Urbain<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>agriculture urbaine<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-asc-littoral.png\" alt=\"\" width=\"150\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>ASC Littoral<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>sport et jeunesse<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:75;--by:155;--bw:364;--bh:202\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/DDA.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>DDA Contemporary Art<\/b><small><em>Aix-Marseille<\/em><i> \u00b7 <\/i>art contemporain<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-clse.png\" alt=\"\" width=\"113\" height=\"47\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>CLSE<\/b><small><em>Outre-mer<\/em><i> \u00b7 <\/i>transition \u00e9cologique<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-centre-social-fabien-menot.png\" alt=\"\" width=\"183\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Centre social Fabien Menot<\/b><small><em>Port-de-Bouc<\/em><i> \u00b7 <\/i>familles et jeunesse<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-petites-cantines.png\" alt=\"\" width=\"96\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Les Petites Cantines<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>cantine de quartier<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-ancrages.png\" alt=\"\" width=\"240\" height=\"62\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Ancrages<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>formation \u00e0 l\u2019\u00e9galit\u00e9<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-marseille-nord-handball.png\" alt=\"\" width=\"92\" height=\"86\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Marseille Nord Handball<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>sport pour les jeunes<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:14;--by:189;--bw:473;--bh:120\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/lOEIL-DU-LOUP.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>L\u2019\u0152il du Loup<\/b><small><em>Aix-Marseille<\/em><i> \u00b7 <\/i>publics vuln\u00e9rables<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-marseille-sans-frontieres.png\" alt=\"\" width=\"104\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Marseille Sans Fronti\u00e8res<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>projets \u00e9ducatifs<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-centre-social-del-rio.png\" alt=\"\" width=\"58\" height=\"53\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Centre social Del Rio<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>inclusion sociale<\/small><\/span><\/li>\r\n                <\/ul>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">01<\/p>\r\n          <h3>Une expertise \u00e9prouv\u00e9e sur le terrain<\/h3>\r\n          <p><b>150+ associations accompagn\u00e9es partout en France<\/b>, dont une majorit\u00e9 issue des quartiers prioritaires, de territoires ruraux ou ultramarins. Des parcours adapt\u00e9s aux r\u00e9alit\u00e9s associatives&nbsp;: manque de temps, \u00e9quipes mixtes b\u00e9n\u00e9voles et salari\u00e9s, niveaux d\u2019exp\u00e9rience diff\u00e9rents.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--t7);--cx:var(--x7); --d:80\" data-reveal>\r\n        <div class=\"bc-stage sc-anc\" data-scene=\"ancrage\" aria-hidden=\"true\">\r\n          <p class=\"sc-cap\"><i><\/i><span data-cap-text>Tout le r\u00e9seau \u00b7 6 partenaires<\/span><\/p>\r\n          <p class=\"sc-count\" data-fam-count>04 \/ 04<\/p>\r\n          <div class=\"anc\">\r\n            <svg class=\"anc-wires\"><g class=\"anc-base\"><\/g><g class=\"anc-live\"><\/g><\/svg>\r\n            <div class=\"anc-hub\">\r\n              <span class=\"anc-rings\"><i><\/i><i><\/i><i><\/i><\/span>\r\n              <span class=\"anc-core\"><img decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"54\" height=\"54\" loading=\"lazy\"><\/span>\r\n              <b>Social Hackers Lab<\/b>\r\n            <\/div>\r\n            <div class=\"anc-fams\">\r\n              <div class=\"anc-fam\" data-k=\"pub\" data-cap=\"Publics \u00b7 4 partenaires\"><span class=\"anc-tag\"><i><svg class=\"ic\"><use href=\"#ic-pub\"\/><\/svg><\/i>Publics<span class=\"sc-timer\"><\/span><\/span><ul><li><i class=\"anc-logo\"><img class=\"is-mark\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri-300x48.png\" alt=\"\" width=\"300\" height=\"48\" loading=\"lazy\" decoding=\"async\"><\/i><span>M\u00e9tropole Aix-Marseille<\/span><\/li><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901-300x111.png\" alt=\"\" width=\"300\" height=\"111\" loading=\"lazy\" decoding=\"async\"><\/i><span>ANCT<\/span><\/li><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_-300x102.webp\" alt=\"\" width=\"300\" height=\"102\" loading=\"lazy\" decoding=\"async\"><\/i><span>D\u00e9partement de l\u2019Essonne<\/span><\/li><li><i class=\"anc-logo\"><svg class=\"is-flag\"><use href=\"#fl-fr\"\/><\/svg><\/i><span>DDETS<\/span><\/li><\/ul><\/div>\r\n              <div class=\"anc-fam\" data-k=\"eu\" data-cap=\"Europ\u00e9ens \u00b7 1 partenaire\"><span class=\"anc-tag\"><i class=\"is-flag\"><svg><use href=\"#fl-eu\"\/><\/svg><\/i>Europ\u00e9ens<span class=\"sc-timer\"><\/span><\/span><ul><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/images-300x100.png\" alt=\"\" width=\"300\" height=\"100\" loading=\"lazy\" decoding=\"async\"><\/i><span>Agence Erasmus+<\/span><\/li><\/ul><\/div>\r\n              <div class=\"anc-fam\" data-k=\"pri\" data-cap=\"R\u00e9seaux \u00b7 1 partenaire\"><span class=\"anc-tag\"><i><svg class=\"ic\"><use href=\"#ic-users\"\/><\/svg><\/i>R\u00e9seaux<span class=\"sc-timer\"><\/span><\/span><ul><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-villes-territoires-occitanie.png\" alt=\"\" width=\"176\" height=\"81\" loading=\"lazy\" decoding=\"async\"><\/i><span>Villes et Territoires Occitanie<\/span><\/li><\/ul><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">02<\/p>\r\n          <h3>Un ancrage institutionnel solide<\/h3>\r\n          <p>L\u2019incubateur s\u2019appuie sur des partenaires publics et europ\u00e9ens, et sur des r\u00e9seaux territoriaux&nbsp;: <b>M\u00e9tropole Aix-Marseille-Provence, ANCT, D\u00e9partement de l\u2019Essonne, DDETS, agence Erasmus+, Villes et Territoires Occitanie<\/b>\u2026<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc bc-wide\" style=\"--c:var(--t5);--cx:var(--x5); --d:160\" data-reveal>\r\n        <div class=\"bc-stage sc-tra is-done\" data-scene=\"transfert\" style=\"--p:1\" aria-hidden=\"true\">\r\n          <span class=\"tra-glow is-shl\"><\/span>\r\n          <span class=\"tra-glow is-you\"><\/span>\r\n          <div class=\"tra\">\r\n            <div class=\"tra-head\">\r\n              <div class=\"tra-who is-shl\"><span class=\"tra-av\"><img decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"30\" height=\"30\" loading=\"lazy\"><\/span><p><b>Social Hackers Lab<\/b><small><span>Accompagne<\/span><span>Se retire<\/span><\/small><\/p><\/div>\r\n              <div class=\"tra-meter\"><p><span>Autonomie<\/span><b data-pct>100&nbsp;%<\/b><\/p><span class=\"tra-bar\"><i><\/i><\/span><\/div>\r\n              <div class=\"tra-who is-you\"><span class=\"tra-av\"><svg class=\"ic\"><use href=\"#ic-users\"\/><\/svg><b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><\/span><p><b>Votre \u00e9quipe<\/b><small><span>Apprend<\/span><span>Autonome<\/span><\/small><\/p><\/div>\r\n            <\/div>\r\n            <ol class=\"tra-rows\">\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-compass\"\/><\/svg><\/i>Montage<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-tool\"\/><\/svg><\/i>Outils<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-read\"\/><\/svg><\/i>Relecture<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-shield\"\/><\/svg><\/i>S\u00e9curisation<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n            <\/ol>\r\n            <p class=\"tra-note\"><i><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/i>90&nbsp;% des structures red\u00e9posent en autonomie l\u2019ann\u00e9e suivante<span class=\"sc-timer\"><\/span><\/p>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">03<\/p>\r\n          <h3>Le transfert de comp\u00e9tences comme principe<\/h3>\r\n          <p>Notre mission n\u2019est pas de faire \u00e0 la place des associations, mais de leur transmettre les cl\u00e9s pour agir seules demain. Nous accompagnons, outillons, relisons, s\u00e9curisons&nbsp;: <b>l\u2019objectif final reste l\u2019autonomie.<\/b><\/p>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 06 Collectivit\u00e9s et acteurs publics ============================== -->\r\n<section class=\"section public\" id=\"collectivites\" aria-labelledby=\"public-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"pub-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>06<\/span> Collectivit\u00e9s et acteurs publics<\/p>\r\n        <h2 class=\"sec-title\" id=\"public-title\">Pour les collectivit\u00e9s <em>et les acteurs publics.<\/em><\/h2>\r\n      <\/div>\r\n      <div class=\"pub-intro\" data-reveal style=\"--d:120\">\r\n        <p class=\"sec-copy\">M\u00e9tropoles, d\u00e9partements, intercommunalit\u00e9s, services de l\u2019\u00c9tat&nbsp;: vous accompagnez au quotidien des associations engag\u00e9es au plus pr\u00e8s des habitants.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <ul class=\"pub-points\">\r\n      <li class=\"pub-point\" data-reveal style=\"--c:var(--t7);--cx:var(--x7)\">\r\n        <p class=\"bc-kicker\">01<\/p>\r\n        <h3>Concevoir des dispositifs<\/h3>\r\n        <p>Nous concevons avec vous des dispositifs qui renforcent leur capacit\u00e9 \u00e0 acc\u00e9der aux financements europ\u00e9ens et contribuent \u00e0 mobiliser davantage de ressources au b\u00e9n\u00e9fice de votre territoire.<\/p>\r\n      <\/li>\r\n      <li class=\"pub-point\" data-reveal style=\"--c:var(--t5);--cx:var(--x5);--d:80\">\r\n        <p class=\"bc-kicker\">02<\/p>\r\n        <h3>Former vos agents<\/h3>\r\n        <p>Nous accompagnons \u00e9galement la mont\u00e9e en comp\u00e9tence de vos agents \u00e0 travers des formations d\u00e9di\u00e9es&nbsp;: mieux comprendre les programmes europ\u00e9ens, identifier les opportunit\u00e9s adapt\u00e9es au territoire, orienter les porteurs de projets et int\u00e9grer plus efficacement les financements europ\u00e9ens dans les politiques publiques.<\/p>\r\n      <\/li>\r\n      <li class=\"pub-point\" data-reveal style=\"--c:var(--t9);--cx:var(--x9);--d:160\">\r\n        <p class=\"bc-kicker\">03<\/p>\r\n        <h3>Construire le parcours<\/h3>\r\n        <p>Vous d\u00e9finissez les priorit\u00e9s et les publics \u00e0 accompagner. Nous construisons le parcours&nbsp;: ing\u00e9nierie p\u00e9dagogique, formation, outils num\u00e9riques, accompagnement individualis\u00e9 et suivi jusqu\u2019au d\u00e9p\u00f4t des candidatures.<\/p>\r\n      <\/li>\r\n    <\/ul>\r\n    <p class=\"pub-sum\" data-reveal>Un dispositif pens\u00e9 avec le territoire, pour renforcer durablement les comp\u00e9tences de ses acteurs et leur acc\u00e8s aux financements europ\u00e9ens.<\/p>\r\n    <div class=\"pub-partners\">\r\n      <p class=\"pub-label\" data-reveal>Elles nous confient leur territoire<\/p>\r\n      <ul class=\"pub-cards\">\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t7);--cx:var(--x7)\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri.png\" alt=\"\" width=\"837\" height=\"134\" style=\"--w:252px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">M\u00e9tropole \u00b7 R\u00e9gion Sud<\/p>\r\n            <h3>M\u00e9tropole Aix-Marseille-Provence<\/h3>\r\n            <p>Un incubateur associatif m\u00e9tropolitain, inscrit dans les dynamiques du Contrat de ville, pour accompagner les structures du territoire dans l\u2019acc\u00e8s aux financements europ\u00e9ens et la structuration de leurs projets.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t5);--cx:var(--x5);--d:80\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_.webp\" alt=\"\" width=\"960\" height=\"327\" style=\"--w:184px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">D\u00e9partement \u00b7 \u00cele-de-France<\/p>\r\n            <h3>D\u00e9partement de l\u2019Essonne<\/h3>\r\n            <p>Un incubateur associatif d\u00e9partemental&nbsp;: parcours de formation, autodiagnostic et ressourcerie en ligne pour les associations essonniennes.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t1);--cx:var(--x1)\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-montpellier-3m.png\" alt=\"\" width=\"359\" height=\"360\" style=\"--w:86px\" loading=\"lazy\" decoding=\"async\"><i class=\"pub-and\" aria-hidden=\"true\"><\/i><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-villes-territoires-occitanie.png\" alt=\"\" width=\"509\" height=\"225\" style=\"--w:150px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">Sept collectivit\u00e9s \u00b7 Occitanie<\/p>\r\n            <h3>Montpellier M\u00e9diterran\u00e9e M\u00e9tropole et l\u2019H\u00e9rault<\/h3>\r\n            <p>Avec Villes et Territoires Occitanie, une cohorte d\u00e9partementale financ\u00e9e par sept collectivit\u00e9s de l\u2019H\u00e9rault, de Montpellier \u00e0 Lod\u00e8ve.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t3);--cx:var(--x3);--d:80\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-ville-de-loos.png\" alt=\"\" width=\"642\" height=\"358\" style=\"--w:140px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">Ville \u00b7 Hauts-de-France<\/p>\r\n            <h3>Ville de Loos<\/h3>\r\n            <p>Un accompagnement d\u00e9di\u00e9 aux acteurs de la Cit\u00e9 \u00e9ducative pour renforcer leur connaissance des financements europ\u00e9ens, faire \u00e9merger de nouvelles opportunit\u00e9s de coop\u00e9ration et accompagner la structuration de projets adapt\u00e9s aux besoins du territoire.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n      <\/ul>\r\n      <div class=\"pub-anct\" data-reveal>\r\n        <span class=\"pub-anct-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901.png\" alt=\"Agence nationale de la coh\u00e9sion des territoires\" width=\"1280\" height=\"473\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n        <p>Au niveau national, nous travaillons avec l\u2019Agence nationale de la coh\u00e9sion des territoires (ANCT) pour les associations des quartiers prioritaires et des territoires ultramarins.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <p class=\"pub-label pub-label-2\" data-reveal>Un dispositif construit avec vous<\/p>\r\n    <div class=\"bento pub-bento\">\r\n      <article class=\"bc\" style=\"--c:var(--t9);--cx:var(--x9)\" data-reveal>\r\n        <div class=\"bc-stage sc-cal is-end\" data-scene=\"parcours\" style=\"--p:1\" aria-hidden=\"true\">\r\n          <div class=\"cal\">\r\n            <p class=\"cal-months\"><span data-s=\"S\">Sept<\/span><span data-s=\"O\">Oct<\/span><span data-s=\"N\">Nov<\/span><span data-s=\"D\">D\u00e9c<\/span><span data-s=\"J\">Janv<\/span><span data-s=\"F\">F\u00e9vr<\/span><\/p>\r\n            <span class=\"cal-grid\"><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:2\">Diagnostic<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:2\"><i class=\"cal-bar is-diag\" style=\"--a:0;--b:.9\"><\/i><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:3\">Ateliers collectifs<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:3\"><i class=\"cal-pill\" style=\"--a:1.05\"><\/i><i class=\"cal-pill\" style=\"--a:1.55\"><\/i><i class=\"cal-pill\" style=\"--a:2.05\"><\/i><i class=\"cal-pill\" style=\"--a:2.55\"><\/i><i class=\"cal-pill\" style=\"--a:3.05\"><\/i><i class=\"cal-pill\" style=\"--a:3.55\"><\/i><i class=\"cal-pill\" style=\"--a:4.05\"><\/i><i class=\"cal-pill\" style=\"--a:4.55\"><\/i><i class=\"cal-pill\" style=\"--a:5.05\"><\/i><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:4\">Suivi individuel<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:4\"><i class=\"cal-dot\" style=\"--a:2.3\"><\/i><i class=\"cal-dot\" style=\"--a:3\"><\/i><i class=\"cal-dot\" style=\"--a:3.5\"><\/i><i class=\"cal-dot\" style=\"--a:4\"><\/i><i class=\"cal-dot\" style=\"--a:4.35\"><\/i><i class=\"cal-dot\" style=\"--a:4.7\"><\/i><i class=\"cal-dot\" style=\"--a:5\"><\/i><i class=\"cal-dot\" style=\"--a:5.3\"><\/i><i class=\"cal-dot\" style=\"--a:5.55\"><\/i><i class=\"cal-dot\" style=\"--a:5.78\"><\/i><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:5\">Ressourcerie en ligne<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:5\"><i class=\"cal-bar is-res\" style=\"--a:.9;--b:6\"><\/i><\/span>\r\n            <span class=\"cal-head\"><\/span>\r\n            <span class=\"cal-end\"><\/span>\r\n            <p class=\"cal-dep\">D\u00e9p\u00f4t des dossiers<\/p>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">Ce que nous concevons<\/p>\r\n          <h3>Une ing\u00e9nierie p\u00e9dagogique sur mesure<\/h3>\r\n          <p>Nous partons de votre territoire&nbsp;: ses associations, ses quartiers, vos politiques publiques. Diagnostic, programme, calendrier et formats sont construits avec vos services, puis anim\u00e9s par notre \u00e9quipe, en pr\u00e9sentiel et \u00e0 distance.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--t6);--cx:var(--x6);--d:100\" data-reveal>\r\n        <div class=\"bc-stage sc-kpi\" data-scene=\"pilotage\" aria-hidden=\"true\">\r\n          <div class=\"kpi is-cand is-sel is-dep is-fin\">\r\n            <div class=\"kpi-grid\"><i style=\"--i:11;--j:0\"><\/i><i style=\"--i:27;--j:4\"><\/i><i style=\"--i:26;--j:8\"><\/i><i class=\"is-in\" style=\"--i:36;--j:12\"><\/i><i class=\"is-in\" style=\"--i:35;--j:16\"><\/i><i class=\"is-in\" style=\"--i:0;--j:20\"><\/i><i class=\"is-in is-ok\" style=\"--i:33;--j:24\"><\/i><i class=\"is-in is-ok\" style=\"--i:22;--j:28\"><\/i><i class=\"is-in is-ok\" style=\"--i:8;--j:32\"><\/i><i class=\"is-in is-ok\" style=\"--i:38;--j:36\"><\/i><i style=\"--i:5;--j:1\"><\/i><i style=\"--i:9;--j:5\"><\/i><i style=\"--i:2;--j:9\"><\/i><i class=\"is-in\" style=\"--i:25;--j:13\"><\/i><i class=\"is-in\" style=\"--i:13;--j:17\"><\/i><i class=\"is-in\" style=\"--i:4;--j:21\"><\/i><i class=\"is-in is-ok\" style=\"--i:29;--j:25\"><\/i><i class=\"is-in is-ok\" style=\"--i:20;--j:29\"><\/i><i class=\"is-in is-ok\" style=\"--i:15;--j:33\"><\/i><i class=\"is-in is-ok\" style=\"--i:3;--j:37\"><\/i><i style=\"--i:39;--j:2\"><\/i><i style=\"--i:7;--j:6\"><\/i><i style=\"--i:16;--j:10\"><\/i><i class=\"is-in\" style=\"--i:32;--j:14\"><\/i><i class=\"is-in\" style=\"--i:19;--j:18\"><\/i><i class=\"is-in\" style=\"--i:37;--j:22\"><\/i><i class=\"is-in is-ok\" style=\"--i:23;--j:26\"><\/i><i class=\"is-in is-ok\" style=\"--i:18;--j:30\"><\/i><i class=\"is-in is-ok\" style=\"--i:12;--j:34\"><\/i><i class=\"is-in is-ok\" style=\"--i:30;--j:38\"><\/i><i style=\"--i:6;--j:3\"><\/i><i style=\"--i:17;--j:7\"><\/i><i style=\"--i:21;--j:11\"><\/i><i class=\"is-in\" style=\"--i:28;--j:15\"><\/i><i class=\"is-in\" style=\"--i:34;--j:19\"><\/i><i class=\"is-in\" style=\"--i:1;--j:23\"><\/i><i class=\"is-in is-ok\" style=\"--i:31;--j:27\"><\/i><i class=\"is-in is-ok\" style=\"--i:24;--j:31\"><\/i><i class=\"is-in is-ok\" style=\"--i:14;--j:35\"><\/i><i class=\"is-in is-ok\" style=\"--i:10;--j:39\"><\/i><\/div>\r\n            <ul class=\"kpi-key\">\r\n              <li class=\"is-on\"><i class=\"k-cand\"><\/i>Candidatures<\/li>\r\n              <li class=\"is-on\"><i class=\"k-dep\"><\/i>Dossiers d\u00e9pos\u00e9s<\/li>\r\n              <li class=\"is-on\"><i class=\"k-fin\"><\/i>Financements obtenus<\/li>\r\n            <\/ul>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">Ce que vous pilotez<\/p>\r\n          <h3>Un dispositif cl\u00e9 en main, des r\u00e9sultats mesur\u00e9s<\/h3>\r\n          <p>Nous prenons en charge l\u2019appel \u00e0 candidatures, la mobilisation des structures, le suivi jusqu\u2019au d\u00e9p\u00f4t et le bilan. Vous suivez l\u2019avancement avec des indicateurs clairs, pr\u00e9sentables \u00e0 vos instances.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n    <div class=\"pub-formats-head\" data-reveal>\r\n      <h3>Nos formats d\u2019intervention<\/h3>\r\n      <p>Pens\u00e9s pour les r\u00e9alit\u00e9s des \u00e9quipes associatives (b\u00e9n\u00e9voles et salari\u00e9s, temps limit\u00e9, niveaux d\u2019entr\u00e9e h\u00e9t\u00e9rog\u00e8nes), du plus l\u00e9ger au plus pouss\u00e9, et combinables dans un m\u00eame parcours.<\/p>\r\n    <\/div>\r\n    <div class=\"studio\" data-studio data-fmt=\"0\" data-reveal>\r\n      <div class=\"studio-nav\">\r\n        <span class=\"fmt-thumb\" aria-hidden=\"true\"><\/span>\r\n        <div class=\"studio-tabs\" role=\"tablist\" aria-label=\"Nos formats, du plus l\u00e9ger au plus pouss\u00e9\">\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-1\" aria-controls=\"fmt-1\" aria-selected=\"true\" style=\"--c:var(--t1);--cx:var(--x1);--hold:6.5s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">01<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i><\/i><i><\/i><i><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Journ\u00e9e d\u2019initiation<\/span>\r\n            <span class=\"fmt-meta\">1 journ\u00e9e \u00b7 15 \u00e0 25 pers.<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-2\" aria-controls=\"fmt-2\" aria-selected=\"false\" tabindex=\"-1\" style=\"--c:var(--t3);--cx:var(--x3);--hold:6.5s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">02<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><i><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Formation intensive<\/span>\r\n            <span class=\"fmt-meta\">2 \u00e0 3 jours \u00b7 \u00e9quipes internes<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-3\" aria-controls=\"fmt-3\" aria-selected=\"false\" tabindex=\"-1\" style=\"--c:var(--t5);--cx:var(--x5);--hold:11.2s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">03<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Cycle d\u2019ateliers<\/span>\r\n            <span class=\"fmt-meta\">6 \u00e0 10 s\u00e9ances \u00b7 15 \u00e0 40 pers.<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-4\" aria-controls=\"fmt-4\" aria-selected=\"false\" tabindex=\"-1\" style=\"--c:var(--t9);--cx:var(--x9);--hold:8.2s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">04<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Accompagnement individuel<\/span>\r\n            <span class=\"fmt-meta\">Modulable \u00b7 porteur de projet<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"studio-body\">\r\n        <div class=\"fmt-panels\">\r\n          <div class=\"fmt-panel is-on\" role=\"tabpanel\" id=\"fmt-1\" aria-labelledby=\"fmt-tab-1\" tabindex=\"0\" style=\"--c:var(--t1);--cx:var(--x1)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 01 \u00b7 Collectif<\/p>\r\n            <h3 style=\"--k:1\">Journ\u00e9e d\u2019initiation<\/h3>\r\n            <p style=\"--k:2\">Acculturation aux fonds europ\u00e9ens et identification des programmes adapt\u00e9s.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm\" aria-hidden=\"true\"><i class=\"on\"><\/i><\/dd><dd>1 journ\u00e9e<\/dd><\/div>\r\n              <div><dt>Groupe<\/dt><dd>15 \u00e0 25 personnes<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n          <div class=\"fmt-panel\" role=\"tabpanel\" id=\"fmt-2\" aria-labelledby=\"fmt-tab-2\" tabindex=\"0\" style=\"--c:var(--t3);--cx:var(--x3)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 02 \u00b7 En \u00e9quipe<\/p>\r\n            <h3 style=\"--k:1\">Formation intensive<\/h3>\r\n            <p style=\"--k:2\">Mont\u00e9e en comp\u00e9tences acc\u00e9l\u00e9r\u00e9e sur un programme cibl\u00e9.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><\/dd><dd>2 \u00e0 3 jours<\/dd><\/div>\r\n              <div><dt>Groupe<\/dt><dd>\u00c9quipes internes<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n          <div class=\"fmt-panel\" role=\"tabpanel\" id=\"fmt-3\" aria-labelledby=\"fmt-tab-3\" tabindex=\"0\" style=\"--c:var(--t5);--cx:var(--x5)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 03 \u00b7 Collectif et individuel<\/p>\r\n            <h3 style=\"--k:1\">Cycle d\u2019ateliers<\/h3>\r\n            <p style=\"--k:2\">Parcours complet du diagnostic jusqu\u2019au d\u00e9p\u00f4t, en alternance collectif et individuel.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm is-fine\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><i><\/i><i><\/i><i><\/i><\/dd><dd>6 \u00e0 10 s\u00e9ances<\/dd><\/div>\r\n              <div><dt>Groupe<\/dt><dd>Cohorte de 15 \u00e0 40<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n          <div class=\"fmt-panel\" role=\"tabpanel\" id=\"fmt-4\" aria-labelledby=\"fmt-tab-4\" tabindex=\"0\" style=\"--c:var(--t9);--cx:var(--x9)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 04 \u00b7 Individuel<\/p>\r\n            <h3 style=\"--k:1\">Accompagnement individuel<\/h3>\r\n            <p style=\"--k:2\">Ing\u00e9nierie de dossier, recherche de partenaires, s\u00e9curisation du d\u00e9p\u00f4t.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm is-open\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><\/dd><dd>Modulable<\/dd><\/div>\r\n              <div><dt>Pour<\/dt><dd>Porteur de projet<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n        <\/div>\r\n        <figure class=\"stage-col\" aria-hidden=\"true\">\r\n          <div class=\"stage\">\r\n            <canvas><\/canvas>\r\n            <p class=\"stage-cap\"><i><\/i><span data-stage-cap>Pl\u00e9ni\u00e8re \u00b7 1 journ\u00e9e<\/span><\/p>\r\n            <p class=\"stage-fig\"><b>Fig. 03<\/b> \u00b7 <span data-stage-count>01 \/ 04<\/span><\/p>\r\n          <\/div>\r\n          <ul class=\"stage-key\">\r\n            <li><i class=\"k-part\"><\/i>Participants<\/li>\r\n            <li><i class=\"k-shl\"><\/i>\u00c9quipe SHL<\/li>\r\n            <li class=\"k-only\"><i class=\"k-mate\"><\/i>Partenaires<\/li>\r\n          <\/ul>\r\n        <\/figure>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"formats-cta\" data-reveal>\r\n      <svg class=\"cta-threads\" viewbox=\"0 0 800 240\" preserveaspectratio=\"none\" aria-hidden=\"true\">\r\n        <defs><path id=\"cta-thread\" d=\"M-400 120Q-300 -8-200 120T0 120T200 120T400 120T600 120T800 120T1000 120T1200 120T1400 120T1600 120\"\/><\/defs>\r\n        <g class=\"cta-bloom\"><g class=\"cta-flow\">\r\n          <use href=\"#cta-thread\" style=\"--c:var(--t1)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-40\" style=\"--c:var(--t2)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-80\" style=\"--c:var(--t3)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-120\" style=\"--c:var(--t4)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-160\" style=\"--c:var(--t5)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-200\" style=\"--c:var(--t6)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-240\" style=\"--c:var(--t7)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-280\" style=\"--c:var(--t8)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-320\" style=\"--c:var(--t9)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-360\" style=\"--c:var(--t10)\"\/>\r\n        <\/g><\/g>\r\n      <\/svg>\r\n      <div class=\"cta-copy\">\r\n        <p class=\"cta-kicker\">Collectivit\u00e9s \u00b7 Services de l\u2019\u00c9tat \u00b7 Financeurs<\/p>\r\n        <p class=\"cta-text\">Construisons ensemble le dispositif de votre territoire.<\/p>\r\n      <\/div>\r\n      <a class=\"btn btn-light\" href=\"#contact\">\u00c9changer avec l\u2019\u00e9quipe <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 07 Ressourcerie ============================== -->\r\n<section class=\"section tint\" id=\"ressourcerie\" style=\"--h:var(--x3)\" aria-labelledby=\"hub-title\">\r\n  <div class=\"wrap hub\">\r\n    <div data-reveal>\r\n      <p class=\"sec-index\"><span>07<\/span> Ressourcerie num\u00e9rique<\/p>\r\n      <h2 class=\"sec-title\" id=\"hub-title\">Une ressourcerie au service <em>de l\u2019autonomie.<\/em><\/h2>\r\n      <p class=\"sec-copy\" style=\"margin-top:24px\">Le e-hub collaboratif met \u00e0 disposition des associations un ensemble de ressources p\u00e9dagogiques, m\u00e9thodologiques et num\u00e9riques pour les accompagner tout au long de leur mont\u00e9e en comp\u00e9tences.<\/p>\r\n      <p class=\"sec-copy\">Parcours de formation, trames budg\u00e9taires, veille sur les appels \u00e0 projets, cadre logique&nbsp;: tout reste accessible, m\u00eame apr\u00e8s l\u2019accompagnement.<\/p>\r\n      <a class=\"btn btn-ink\" href=\"#contact\">\u00catre accompagn\u00e9 <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n    <\/div>\r\n    <div class=\"res\" data-res>\r\n      <div class=\"res-stage\" aria-hidden=\"true\">\r\n        <div class=\"res-deck\">\r\n          <div class=\"res-card is-front\" data-kind=\"parcours\" style=\"--p:0;--k:var(--t3);--kx:var(--x3)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">P\u00e9dagogique<\/p><p class=\"res-title\">Parcours de formation<\/p><p class=\"res-meta\">Mont\u00e9e en comp\u00e9tences<\/p><\/div>\r\n            <div class=\"res-body par\">\r\n              <div class=\"par-fig\">\r\n                <svg class=\"par-art\" viewbox=\"0 0 400 132\">\r\n                  <defs>\r\n                    <lineargradient id=\"res-par-fade\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"currentColor\" stop-opacity=\".24\"\/><stop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                    <clippath id=\"res-par-clip\"><rect class=\"par-reveal\" x=\"0\" y=\"0\" width=\"400\" height=\"132\"\/><\/clippath>\r\n                  <\/defs>\r\n                  <path class=\"par-floor\" d=\"M16 124.5H384\"\/>\r\n                  <g class=\"par-drops\"><path class=\"is-on\" d=\"M40 116V124\"\/><path class=\"is-on\" d=\"M120 103V124\"\/><path class=\"is-on\" d=\"M200 74V124\"\/><path class=\"is-on\" d=\"M280 45V124\"\/><path class=\"is-on\" d=\"M360 32V124\"\/><\/g>\r\n                  <path class=\"par-area\" fill=\"url(#res-par-fade)\" clip-path=\"url(#res-par-clip)\" d=\"M40 107.1 48 106.4 56 105.6 64 104.7 72 103.6 80 102.5 88 101.1 96 99.7 104 98.0 112 96.2 120 94.2 128 92.0 136 89.6 144 87.1 152 84.3 160 81.4 168 78.3 176 75.1 184 71.8 192 68.4 200 65.0 208 61.6 216 58.2 224 54.9 232 51.7 240 48.6 248 45.7 256 42.9 264 40.4 272 38.0 280 35.8 288 33.8 296 32.0 304 30.3 312 28.9 320 27.5 328 26.4 336 25.3 344 24.4 352 23.6 360 22.9V124.5H40Z\"\/>\r\n                  <path class=\"par-way\" d=\"M40 107.1 48 106.4 56 105.6 64 104.7 72 103.6 80 102.5 88 101.1 96 99.7 104 98.0 112 96.2 120 94.2 128 92.0 136 89.6 144 87.1 152 84.3 160 81.4 168 78.3 176 75.1 184 71.8 192 68.4 200 65.0 208 61.6 216 58.2 224 54.9 232 51.7 240 48.6 248 45.7 256 42.9 264 40.4 272 38.0 280 35.8 288 33.8 296 32.0 304 30.3 312 28.9 320 27.5 328 26.4 336 25.3 344 24.4 352 23.6 360 22.9\"\/>\r\n                  <path class=\"par-trail\" pathlength=\"1\" d=\"M40 107.1 48 106.4 56 105.6 64 104.7 72 103.6 80 102.5 88 101.1 96 99.7 104 98.0 112 96.2 120 94.2 128 92.0 136 89.6 144 87.1 152 84.3 160 81.4 168 78.3 176 75.1 184 71.8 192 68.4 200 65.0 208 61.6 216 58.2 224 54.9 232 51.7 240 48.6 248 45.7 256 42.9 264 40.4 272 38.0 280 35.8 288 33.8 296 32.0 304 30.3 312 28.9 320 27.5 328 26.4 336 25.3 344 24.4 352 23.6 360 22.9\"\/>\r\n                  <g class=\"par-nodes\"><circle class=\"is-on\" cx=\"40\" cy=\"107.1\" r=\"5\"\/><circle class=\"is-on\" cx=\"120\" cy=\"94.2\" r=\"5\"\/><circle class=\"is-on\" cx=\"200\" cy=\"65\" r=\"5\"\/><circle class=\"is-on\" cx=\"280\" cy=\"35.8\" r=\"5\"\/><circle class=\"is-on\" cx=\"360\" cy=\"22.9\" r=\"5\"\/><\/g>\r\n                  <circle class=\"par-halo\" cx=\"360\" cy=\"22.9\" r=\"13\"\/>\r\n                  <circle class=\"par-dot\" cx=\"360\" cy=\"22.9\" r=\"6.5\"\/>\r\n                <\/svg>\r\n                <p class=\"par-axis\">Comp\u00e9tences<\/p>\r\n              <\/div>\r\n              <ol class=\"par-caps\"><li class=\"is-on\"><b>01<\/b>M\u00e9thode<\/li><li class=\"is-on\"><b>02<\/b>Cadre logique<\/li><li class=\"is-on\"><b>03<\/b>Budget<\/li><li class=\"is-on\"><b>04<\/b>R\u00e9seau<\/li><li class=\"is-on\"><b>05<\/b>D\u00e9p\u00f4t<\/li><\/ol>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"res-card\" data-kind=\"budget\" style=\"--p:1;--k:var(--t5);--kx:var(--x5)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">M\u00e9thodologique<\/p><p class=\"res-title\">Trame budg\u00e9taire<\/p><p class=\"res-meta\">Budget pr\u00e9visionnel<\/p><\/div>\r\n            <div class=\"res-body bud\">\r\n              <i class=\"bud-hl\"><\/i>\r\n              <div class=\"bud-row bud-th\"><span>Poste<\/span><span>R\u00e9partition<\/span><span>Montant<\/span><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:100%\"><span>Personnel<\/span><i><\/i><b>18&#8239;400&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:34%\"><span>D\u00e9placements<\/span><i><\/i><b>6&#8239;200&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:17%\"><span>\u00c9quipements<\/span><i><\/i><b>3&#8239;100&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:12.5%\"><span>Communication<\/span><i><\/i><b>2&#8239;300&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:11.4%\"><span>Co\u00fbts indirects (7&nbsp;%)<\/span><i><\/i><b>2&#8239;100&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row bud-total is-on\"><span>Total du projet<\/span><i><\/i><b>32&#8239;100&nbsp;\u20ac<\/b><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"res-card\" data-kind=\"veille\" style=\"--p:2;--k:var(--t7);--kx:var(--x7)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">Num\u00e9rique<\/p><p class=\"res-title\">Veille des appels \u00e0 projets<\/p><p class=\"res-meta\">Programmes europ\u00e9ens<\/p><\/div>\r\n            <ul class=\"res-body vei\">\r\n              <li class=\"vei-new\"><span>Erasmus+<small>Partenariats de coop\u00e9ration<\/small><\/span><em>Nouvel appel<\/em><\/li>\r\n              <li><span>CERV<small>Citoyens, \u00e9galit\u00e9, droits et valeurs<\/small><\/span><em>Citoyennet\u00e9<\/em><\/li>\r\n              <li><span>Europe cr\u00e9ative<small>Projets de coop\u00e9ration europ\u00e9enne<\/small><\/span><em>Culture<\/em><\/li>\r\n              <li><span>Corps europ\u00e9en de solidarit\u00e9<small>Projets de solidarit\u00e9<\/small><\/span><em>Jeunesse<\/em><\/li>\r\n            <\/ul>\r\n          <\/div>\r\n          <div class=\"res-card\" data-kind=\"cadre\" style=\"--p:3;--k:var(--t9);--kx:var(--x9)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">M\u00e9thodologique<\/p><p class=\"res-title\">Cadre logique<\/p><p class=\"res-meta\">Matrice du projet<\/p><\/div>\r\n            <div class=\"res-body cad\">\r\n              <span><\/span><span class=\"cad-th\">Indicateurs<\/span><span class=\"cad-th\">Sources<\/span><span class=\"cad-th\">Hypoth\u00e8ses<\/span>\r\n              <span class=\"cad-rh\">Objectif g\u00e9n\u00e9ral<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n              <span class=\"cad-rh\">Objectifs sp\u00e9cifiques<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n              <span class=\"cad-rh\">R\u00e9sultats attendus<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n              <span class=\"cad-rh\">Activit\u00e9s<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"res-key\" aria-hidden=\"true\"><span class=\"is-on\" style=\"--k:var(--t3);--kx:var(--x3)\">Parcours de formation<\/span><span style=\"--k:var(--t5);--kx:var(--x5)\">Trame budg\u00e9taire<\/span><span style=\"--k:var(--t7);--kx:var(--x7)\">Veille des appels<\/span><span style=\"--k:var(--t9);--kx:var(--x9)\">Cadre logique<\/span><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 08 \u00c9quipe ============================== -->\r\n<section class=\"section\" id=\"equipe\" style=\"--h:var(--x4)\" aria-labelledby=\"equipe-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>08<\/span> L\u2019\u00e9quipe<\/p>\r\n        <h2 class=\"sec-title\" id=\"equipe-title\">Une \u00e9quipe qui s\u2019adapte <em>\u00e0 chaque projet.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Chez Social Hackers Lab, nous travaillons en \u00e9quipe projet. Selon les besoins du territoire ou de la structure accompagn\u00e9e, nous croisons plusieurs expertises pour constituer le bon dispositif d\u2019intervention.<\/p>\r\n    <\/div>\r\n    <ul class=\"team\">\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t7);--cx:var(--x7)\">\r\n        <p class=\"bc-kicker\">01<\/p>\r\n        <h3>Ing\u00e9nierie europ\u00e9enne<\/h3>\r\n        <p>Veille, strat\u00e9gie de financement, montage de projets, recherche de partenaires et accompagnement jusqu\u2019au d\u00e9p\u00f4t.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t1);--cx:var(--x1);--d:80\">\r\n        <p class=\"bc-kicker\">02<\/p>\r\n        <h3>Accompagnement territorial<\/h3>\r\n        <p>Animation de parcours, diagnostic des besoins, structuration des projets et coop\u00e9ration avec les collectivit\u00e9s et les acteurs locaux.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t5);--cx:var(--x5);--d:160\">\r\n        <p class=\"bc-kicker\">03<\/p>\r\n        <h3>Formation & transmission<\/h3>\r\n        <p>Conception et animation de formations pour permettre aux \u00e9quipes de comprendre les financements, ma\u00eetriser les outils et gagner progressivement en autonomie.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t3);--cx:var(--x3)\">\r\n        <p class=\"bc-kicker\">04<\/p>\r\n        <h3>Num\u00e9rique & data<\/h3>\r\n        <p>Plateformes ressources, cartographies, outils de suivi, automatisations et solutions num\u00e9riques con\u00e7ues pour faciliter l\u2019accompagnement.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t9);--cx:var(--x9);--d:80\">\r\n        <p class=\"bc-kicker\">05<\/p>\r\n        <h3>Design & contenus<\/h3>\r\n        <p>Identit\u00e9s visuelles, supports p\u00e9dagogiques, valorisation des projets, graphisme et production de contenus vid\u00e9o.<\/p>\r\n      <\/li>\r\n      <li class=\"team-note\" data-reveal style=\"--d:160\">\r\n        <p>Une organisation agile, des expertises compl\u00e9mentaires, un interlocuteur unique pour chaque projet.<\/p>\r\n      <\/li>\r\n    <\/ul>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== Contact ============================== -->\r\n<section class=\"contact\" id=\"contact\" style=\"--h:var(--x7)\" aria-labelledby=\"contact-title\">\r\n  <div class=\"wrap contact-grid\">\r\n    <div data-reveal>\r\n      <p class=\"eyebrow\">Ouvrons des portes l\u00e0 o\u00f9 elles semblent ferm\u00e9es<\/p>\r\n      <h2 id=\"contact-title\">Chaque association porte en elle une <em>dynamique europ\u00e9enne.<\/em><\/h2>\r\n      <p class=\"sec-copy\">Notre mission est d\u2019en r\u00e9v\u00e9ler le potentiel, de donner aux \u00e9quipes les moyens de le transformer en projet et, progressivement, de se passer de nous.<\/p>\r\n      <div class=\"person team-contact\">\r\n        <span class=\"team-mark\" aria-hidden=\"true\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"52\" height=\"52\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n        <div>\r\n          <b>L\u2019\u00e9quipe Social Hackers Lab<\/b>\r\n          <span>Associations, collectivit\u00e9s, financeurs<\/span>\r\n          <ul>\r\n            <li><a href=\"mailto:sonia@socialhackerslab.com\"><i>Mail<\/i>sonia@socialhackerslab.com<\/a><\/li>\r\n            <li><a href=\"tel:+33647397259\"><i>T\u00e9l.<\/i>+33 6 47 39 72 59<\/a><\/li>\r\n          <\/ul>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <form class=\"form\" data-form data-reveal style=\"--d:120\" novalidate action=\"\">\r\n      <h3>Parlons de votre projet<\/h3>\r\n      <p>R\u00e9ponse sous quelques jours ouvr\u00e9s.<\/p>\r\n      <div class=\"form-grid\">\r\n        <div><label for=\"f-name\">Nom et pr\u00e9nom<\/label><input id=\"f-name\" name=\"name\" autocomplete=\"name\"><\/div>\r\n        <div><label for=\"f-org\">Structure<\/label><input id=\"f-org\" name=\"org\" autocomplete=\"organization\"><\/div>\r\n        <div><label for=\"f-type\">Vous \u00eates<\/label>\r\n          <select id=\"f-type\" name=\"type\"><option>Une association<\/option><option>Une collectivit\u00e9<\/option><option>Un financeur ou une fondation<\/option><option>Autre<\/option><\/select>\r\n        <\/div>\r\n        <div><label for=\"f-mail\">Email<\/label><input id=\"f-mail\" name=\"email\" type=\"email\" autocomplete=\"email\"><\/div>\r\n        <div class=\"full\"><label for=\"f-msg\">Votre projet<\/label><textarea id=\"f-msg\" name=\"message\"><\/textarea><\/div>\r\n      <\/div>\r\n      <button class=\"btn btn-primary\" type=\"submit\">Envoyer la demande <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/button>\r\n      <p class=\"form-note\" data-form-note aria-live=\"polite\"><\/p>\r\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>\r\n  <\/div>\r\n<\/section>\r\n<\/main>\r\n<footer class=\"footer\">\r\n  <div class=\"wrap\">\r\n    <div class=\"footer-grid\">\r\n      <div>\r\n        <a class=\"brand\" href=\"#top\"><span class=\"brand-mark\"><img decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"Social Hackers Lab\" width=\"124\" height=\"124\" loading=\"lazy\"><\/span><\/a>\r\n        <p class=\"footer-about\">Un incubateur associatif d\u00e9di\u00e9 aux financements europ\u00e9ens et \u00e0 l\u2019innovation sociale. Nous accompagnons les associations \u00e0 impact dans la construction de mod\u00e8les \u00e9conomiques p\u00e9rennes, par la formation, l\u2019ing\u00e9nierie de projet et l\u2019acc\u00e8s aux fonds europ\u00e9ens.<\/p>\r\n      <\/div>\r\n      <div>\r\n        <h4>Navigation<\/h4>\r\n        <ul><li><a href=\"#approche\">Notre approche<\/a><\/li><li><a href=\"#methode\">Notre m\u00e9thode<\/a><\/li><li><a href=\"#projets\">Impact et r\u00e9f\u00e9rences<\/a><\/li><li><a href=\"#collectivites\">Collectivit\u00e9s<\/a><\/li><li><a href=\"#equipe\">L\u2019\u00e9quipe<\/a><\/li><\/ul>\r\n      <\/div>\r\n      <div>\r\n        <h4>Ressources<\/h4>\r\n        <ul><li><a href=\"#ressourcerie\">Ressourcerie<\/a><\/li><li><a href=\"#europe\">Carte des projets<\/a><\/li><li><a href=\"#temoignages\">T\u00e9moignages<\/a><\/li><\/ul>\r\n      <\/div>\r\n      <div>\r\n        <h4>Contact<\/h4>\r\n        <ul><li><a href=\"mailto:sonia@socialhackerslab.com\">sonia@socialhackerslab.com<\/a><\/li><li><a href=\"tel:+33647397259\">+33 6 47 39 72 59<\/a><\/li><li>Si\u00e8ge \u00e0 Marseille<\/li><\/ul>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"footer-bottom\">\r\n      <span>\u00a9 2026 Social Hackers Lab, tous droits r\u00e9serv\u00e9s \u00b7 <span class=\"lang lang-foot\" data-lang-switch><a href=\"?lang=fr\" hreflang=\"fr\" lang=\"fr\" data-lang=\"fr\">Fran\u00e7ais<\/a><a href=\"?lang=en\" hreflang=\"en\" lang=\"en\" data-lang=\"en\">English<\/a><\/span><\/span>\r\n      <span><a href=\"https:\/\/socialhackerslab.com\/en\/declaration-daccessibilite\/\">D\u00e9claration d\u2019accessibilit\u00e9<\/a> \u00b7 <a href=\"https:\/\/socialhackerslab.com\/en\/politique-de-cookies-ue\/\">Politique de cookies<\/a><\/span>\r\n    <\/div>\r\n  <\/div>\r\n<\/footer>\r\n<script>\r\n<!--\r\n(function () {\r\n  'use strict';\r\n  var root = document.getElementById('shl-accueil');\r\n  root.classList.add('js');\r\n  var calm = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n  if (calm) root.classList.add('no-motion');\r\n  \/* ---------------- Langue : fran\u00e7ais, ou anglais avec ?lang=en ----------------\r\n     La page est \u00e9crite en fran\u00e7ais. En anglais, chaque texte est remplac\u00e9 au\r\n     chargement, avant toute animation, d\u2019apr\u00e8s le dictionnaire EN (texte\r\n     fran\u00e7ais, espaces normalis\u00e9es \u2192 texte anglais). Un texte absent du\r\n     dictionnaire reste en fran\u00e7ais et se signale dans la console. *\/\r\n  var LANG = \/[?&]lang=en(?:&|$)\/.test(location.search) ? 'en' : 'fr';\r\n  var EN = {\" partenaire trouv\u00e9\":\" partner found\",\" partenaires trouv\u00e9s\":\" partners found\",\"(R\u00e9gion Sud, Occitanie, Pyr\u00e9n\u00e9es-Atlantiques, \u00cele-de-France, Grand Est et Outre-mer) \u00b7\":\"(R\u00e9gion Sud, Occitanie, Pyr\u00e9n\u00e9es-Atlantiques, \u00cele-de-France, Grand Est and Overseas France) \u00b7\",\", dont une majorit\u00e9 issue des quartiers prioritaires, de territoires ruraux ou ultramarins. Des parcours adapt\u00e9s aux r\u00e9alit\u00e9s associatives : manque de temps, \u00e9quipes mixtes b\u00e9n\u00e9voles et salari\u00e9s, niveaux d\u2019exp\u00e9rience diff\u00e9rents.\":\", most of them from priority neighbourhoods, rural or overseas areas. Programmes adapted to the realities of non-profits: little time, mixed teams of volunteers and staff, different levels of experience.\",\"1 journ\u00e9e\":\"1 day\",\"1 journ\u00e9e \u00b7 15 \u00e0 25 pers.\":\"1 day \u00b7 15 to 25 people\",\"1 ressourcerie num\u00e9rique\":\"1 digital resource hub\",\"15 \u00e0 25 personnes\":\"15 to 25 people\",\"150+ associations accompagn\u00e9es partout en France\":\"150+ organisations supported across France\",\"2 \u00e0 3 jours\":\"2 to 3 days\",\"2 \u00e0 3 jours \u00b7 \u00e9quipes internes\":\"2 to 3 days \u00b7 in-house teams\",\"6 hubs inter-associatifs\":\"6 inter-association hubs\",\"6 \u00e0 10 s\u00e9ances\":\"6 to 10 sessions\",\"6 \u00e0 10 s\u00e9ances \u00b7 15 \u00e0 40 pers.\":\"6 to 10 sessions \u00b7 15 to 40 people\",\"9 capsules\":\"9 videos\",\"90 % des structures red\u00e9posent en autonomie l\u2019ann\u00e9e suivante\":\"90% of organisations reapply on their own the following year\",\"AJAR\":\"AJAR\",\"ANCT\":\"ANCT\",\"ASC Littoral\":\"ASC Littoral\",\"Accompagne\":\"Supports\",\"Accompagnement au montage\":\"Support with project design\",\"Accompagnement individuel\":\"One-to-one support\",\"Accompagnement territorial\":\"Local support\",\"Acculturation aux fonds europ\u00e9ens et identification des programmes adapt\u00e9s.\":\"An introduction to European funds and identification of suitable programmes.\",\"Acelem\":\"Acelem\",\"Action Bomaye\":\"Action Bomaye\",\"Action Bomaye \u00d7 Balkania\":\"Action Bomaye \u00d7 Balkania\",\"Activit\u00e9s\":\"Activities\",\"Agence Erasmus+\":\"Erasmus+ Agency\",\"Agence nationale de la coh\u00e9sion des territoires\":\"French National Agency for Territorial Cohesion (ANCT)\",\"Agglom\u00e9ration B\u00e9ziers M\u00e9diterran\u00e9e\":\"Agglom\u00e9ration B\u00e9ziers M\u00e9diterran\u00e9e\",\"Agglom\u00e9ration H\u00e9rault M\u00e9diterran\u00e9e\":\"Agglom\u00e9ration H\u00e9rault M\u00e9diterran\u00e9e\",\"Agriculture & insertion\":\"Farming & employment\",\"Aix-Marseille\":\"Aix-Marseille\",\"Aix-Marseille \u00b7 inclusion sociale\":\"Aix-Marseille \u00b7 social inclusion\",\"Aix-Marseille \u00b7 m\u00e9diation culturelle\":\"Aix-Marseille \u00b7 cultural outreach\",\"Aix-Marseille \u00d7 Italie\":\"Aix-Marseille \u00d7 Italy\",\"Aller au contenu\":\"Skip to content\",\"Ancrages\":\"Ancrages\",\"Animation de parcours, diagnostic des besoins, structuration des projets et coop\u00e9ration avec les collectivit\u00e9s et les acteurs locaux.\":\"Running programmes, assessing needs, structuring projects and working with local authorities and local stakeholders.\",\"Ann\u00e9e 1\":\"Year 1\",\"Ann\u00e9e 2\":\"Year 2\",\"Apprend\":\"Learns\",\"Approche\":\"Approach\",\"Art & durabilit\u00e9\":\"Art & sustainability\",\"Art & inclusion des jeunes\":\"Art & youth inclusion\",\"Association Fifrelin\":\"Association Fifrelin\",\"Associations culturelles\":\"Cultural associations\",\"Associations sportives\":\"Sports clubs\",\"Associations, collectivit\u00e9s, financeurs\":\"Non-profits, local authorities, funders\",\"Ateliers collectifs\":\"Group workshops\",\"Au niveau national, nous travaillons avec l\u2019Agence nationale de la coh\u00e9sion des territoires (ANCT) pour les associations des quartiers prioritaires et des territoires ultramarins.\":\"Nationally, we work with the French National Agency for Territorial Cohesion (ANCT) for organisations in priority neighbourhoods and overseas territories.\",\"Autonome\":\"Independent\",\"Autonomie\":\"Independence\",\"Autre\":\"Other\",\"Autres\":\"Other\",\"Avec Villes et Territoires Occitanie, une cohorte d\u00e9partementale financ\u00e9e par sept collectivit\u00e9s de l\u2019H\u00e9rault, de Montpellier \u00e0 Lod\u00e8ve.\":\"With Villes et Territoires Occitanie, a department-wide cohort funded by seven local authorities in the H\u00e9rault, from Montpellier to Lod\u00e8ve.\",\"B\":\"B\",\"Budget\":\"Budget\",\"Budget pr\u00e9visionnel\":\"Projected budget\",\"CERV\":\"CERV\",\"CLSE\":\"CLSE\",\"Cadre logique\":\"Logical framework\",\"Candidatures\":\"Applications\",\"Capsule vid\u00e9o\":\"Video\",\"Capsules vid\u00e9o des associations\":\"Videos from the organisations\",\"Carte de France et des cinq d\u00e9partements d\u2019outre-mer. Tour \u00e0 tour s\u2019allument les quartiers prioritaires des agglom\u00e9rations, les territoires ruraux et ultramarins, puis un r\u00e9seau de structures de l\u2019ESS reli\u00e9 \u00e0 l\u2019Europe.\":\"Map of mainland France and the five overseas departments. In turn, priority neighbourhoods in urban areas light up, then rural and overseas territories, then a network of social economy organisations linked to Europe.\",\"Carte de l\u2019Europe : quelques exemples de coop\u00e9rations relient des structures accompagn\u00e9es en France \u00e0 leurs partenaires europ\u00e9ens.\":\"Map of Europe: a few examples of partnerships linking organisations we support in France with their European partners.\",\"Carte des projets\":\"Project map\",\"Ce que nous concevons\":\"What we design\",\"Ce que vous pilotez\":\"What you steer\",\"Ce qu\u2019elles en disent\":\"In their words\",\"Centre social Del Rio\":\"Centre social Del Rio\",\"Centre social Fabien Menot\":\"Centre social Fabien Menot\",\"Centre social La Farandole\":\"Centre social La Farandole\",\"Centres sociaux\":\"Community centres\",\"Cette carte pr\u00e9sente quelques exemples de coop\u00e9rations europ\u00e9ennes initi\u00e9es ou accompagn\u00e9es par Social Hackers Lab.\":\"This map shows a few examples of European partnerships initiated or supported by Social Hackers Lab.\",\"Chaque association porte en elle une\":\"Every organisation carries a\",\"Chaque liaison illustre la mise en relation d\u2019une structure accompagn\u00e9e avec un ou plusieurs partenaires europ\u00e9ens. Elle donne un aper\u00e7u de la diversit\u00e9 des projets, des territoires et des coop\u00e9rations d\u00e9velopp\u00e9es \u00e0 l\u2019\u00e9chelle europ\u00e9enne.\":\"Each link shows an organisation we support connecting with one or more European partners. Together they give a glimpse of the diversity of projects, places and partnerships developed across Europe.\",\"Chaque structure transforme son id\u00e9e en projet clair, coh\u00e9rent et finan\u00e7able. Nous travaillons ensemble les objectifs, les publics vis\u00e9s, les activit\u00e9s, les r\u00e9sultats attendus, le budget, le calendrier et les partenaires.\":\"Each organisation turns its idea into a clear, coherent and fundable project. Together we work on objectives, target groups, activities, expected results, budget, timeline and partners.\",\"Chez Social Hackers Lab, nous travaillons en \u00e9quipe projet. Selon les besoins du territoire ou de la structure accompagn\u00e9e, nous croisons plusieurs expertises pour constituer le bon dispositif d\u2019intervention.\":\"At Social Hackers Lab, we work in project teams. Depending on the needs of the area or the organisation we support, we combine several areas of expertise to put together the right support scheme.\",\"Cin\u00e9ma et insertion socio-professionnelle : s\u00e9ances plein air, master classes, formation \u00e0 la r\u00e9alisation, r\u00e9duction de l\u2019empreinte carbone des festivals.\":\"Cinema and social and professional integration: open-air screenings, master classes, filmmaking training, a smaller carbon footprint for festivals.\",\"Citoyennet\u00e9\":\"Citizenship\",\"Citoyens, \u00e9galit\u00e9, droits et valeurs\":\"Citizens, Equality, Rights and Values\",\"Cohorte de 15 \u00e0 40\":\"Cohort of 15 to 40\",\"Collectifs citoyens\":\"Citizen groups\",\"Collectivit\u00e9s\":\"Public sector\",\"Collectivit\u00e9s et acteurs publics\":\"Local authorities and public bodies\",\"Collectivit\u00e9s \u00b7 Services de l\u2019\u00c9tat \u00b7 Financeurs\":\"Local authorities \u00b7 State services \u00b7 Funders\",\"Communaut\u00e9 de communes Lod\u00e9vois et Larzac\":\"Lod\u00e9vois et Larzac community of communes\",\"Communication\":\"Communication\",\"Comp\u00e9tences\":\"Skills\",\"Conception et animation de formations pour permettre aux \u00e9quipes de comprendre les financements, ma\u00eetriser les outils et gagner progressivement en autonomie.\":\"Designing and running training so that teams understand funding, master the tools and gradually become self-sufficient.\",\"Concevoir des dispositifs\":\"Designing schemes\",\"Construire des ponts entre\":\"Building bridges between\",\"Construire le parcours\":\"Building the programme\",\"Construisons ensemble le dispositif de votre territoire.\":\"Let\u2019s build the scheme for your area together.\",\"Contact\":\"Contact\",\"Corps europ\u00e9en de solidarit\u00e9\":\"European Solidarity Corps\",\"Co\u00fbts indirects (7 %)\":\"Indirect costs (7%)\",\"Culture\":\"Culture\",\"Culture & insertion\":\"Culture & employability\",\"Cycle d\u2019ateliers\":\"Workshop series\",\"DA\":\"DA\",\"DDA Contemporary Art\":\"DDA Contemporary Art\",\"DDA Contemporary Art \u00d7 Eruditembrace\":\"DDA Contemporary Art \u00d7 Eruditembrace\",\"DDETS\":\"DDETS\",\"Danemark\":\"Denmark\",\"De l\u2019acculturation aux financements europ\u00e9ens jusqu\u2019\u00e0 l\u2019autonomie compl\u00e8te des \u00e9quipes : une progression con\u00e7ue pour conduire les structures jusqu\u2019au d\u00e9p\u00f4t effectif de leurs dossiers et favoriser le transfert durable des comp\u00e9tences.\":\"From a first introduction to European funding to full team autonomy: a progression designed to take organisations all the way to submitting their applications, and to pass on skills for the long term.\",\"Depuis Marseille, nous accompagnons les associations des quartiers prioritaires, des territoires ruraux et ultramarins \u00e0 acc\u00e9der aux financements europ\u00e9ens, \u00e0 structurer leurs projets et \u00e0 d\u00e9velopper les comp\u00e9tences n\u00e9cessaires pour d\u00e9poser demain en autonomie.\":\"From Marseille, we help organisations in priority neighbourhoods, rural areas and overseas territories access European funding, structure their projects and build the skills they need to apply on their own in the future.\",\"Des associations qui\":\"Organisations that\",\"Des ateliers collectifs pour comprendre les financements europ\u00e9ens : attendus des financeurs, crit\u00e8res d\u2019\u00e9ligibilit\u00e9, logique de projet, cadre logique, budgets, partenariats et \u00e9tapes cl\u00e9s d\u2019un d\u00e9p\u00f4t.\":\"Group workshops to understand European funding: funders\u2019 expectations, eligibility criteria, project logic, logical framework, budgets, partnerships and the key stages of an application.\",\"Des autoportraits film\u00e9s pour redonner la parole \u00e0 des jeunes en situation d\u2019exclusion : ateliers participatifs, film collectif, projections-d\u00e9bats et livret p\u00e9dagogique pour transmettre la m\u00e9thode.\":\"Filmed self-portraits that give a voice back to young people facing exclusion: participatory workshops, a collective film, screenings with debates and a teaching booklet to pass on the method.\",\"Des mobilit\u00e9s en Espagne pour des personnes en insertion : agriculture \u00e9cologique, alimentation durable et nouvelles m\u00e9thodes d\u2019accompagnement socio-professionnel.\":\"Mobility placements in Spain for people on back-to-work pathways: ecological farming, sustainable food and new approaches to social and professional support.\",\"Des ponts vers l\u2019Europe\":\"Bridges to Europe\",\"Des projets locaux,\":\"Local projects,\",\"Des projets r\u00e9els, des\":\"Real projects,\",\"Des structures de toutes tailles et de tous secteurs.\":\"Organisations of every size and sector.\",\"Des territoires souvent \u00e9loign\u00e9s des\":\"Areas often far from\",\"Design & contenus\":\"Design & content\",\"Diagnostic\":\"Assessment\",\"Diagnostic de maturit\u00e9 europ\u00e9enne\":\"European readiness assessment\",\"Dossiers d\u00e9pos\u00e9s\":\"Submissions\",\"Dur\u00e9e\":\"Duration\",\"D\u00e9c\":\"Dec\",\"D\u00e9claration d\u2019accessibilit\u00e9\":\"Accessibility statement\",\"D\u00e9partement de l\u2019Essonne\":\"Essonne Department\",\"D\u00e9partement \u00b7 \u00cele-de-France\":\"Department \u00b7 \u00cele-de-France\",\"D\u00e9placements\":\"Travel\",\"D\u00e9p\u00f4t\":\"Submission\",\"D\u00e9p\u00f4t des dossiers\":\"Submission\",\"EN\":\"EN\",\"ESS\":\"SSE\",\"Elles nous confient leur territoire\":\"They entrust us with their territory\",\"Email\":\"Email\",\"En Majuscule\":\"En Majuscule\",\"En partenariat avec les collectivit\u00e9s, nous accompagnons des associations qui portent des actions essentielles aupr\u00e8s des habitants mais manquent de temps, de r\u00e9seau ou d\u2019ing\u00e9nierie. L\u2019incubateur transforme leurs actions de terrain en projets structur\u00e9s, finan\u00e7ables et \u00e9ligibles.\":\"In partnership with local authorities, we support organisations that do essential work with residents but lack time, networks or project engineering. The incubator turns their grassroots action into structured, fundable and eligible projects.\",\"Engagement citoyen\":\"Civic engagement\",\"English\":\"English\",\"English version\":\"English version\",\"Envoyer la demande\":\"Send request\",\"Erasmus+\":\"Erasmus+\",\"Erasmus+ \u00b7 Europe Cr\u00e9ative\":\"Erasmus+ \u00b7 Creative Europe\",\"Espagne\":\"Spain\",\"Europe cr\u00e9ative\":\"Creative Europe\",\"Europ\u00e9ens\":\"European\",\"Europ\u00e9ens \u00b7 1 partenaire\":\"European \u00b7 1 partner\",\"Exemples de projets financ\u00e9s\":\"Examples of funded projects\",\"Exemples de projets repr\u00e9sent\u00e9s sur la carte\":\"Examples of projects shown on the map\",\"FR\":\"FR\",\"FSE+\":\"ESF+\",\"Fig. 02\":\"Fig. 02\",\"Fig. 03\":\"Fig. 03\",\"Financements obtenus\":\"Funding secured\",\"Financeur europ\u00e9en\":\"European funder\",\"Fonds\":\"EU\",\"Format 01 \u00b7 Collectif\":\"Format 01 \u00b7 Group\",\"Format 02 \u00b7 En \u00e9quipe\":\"Format 02 \u00b7 Team\",\"Format 03 \u00b7 Collectif et individuel\":\"Format 03 \u00b7 Group and one-to-one\",\"Format 04 \u00b7 Individuel\":\"Format 04 \u00b7 One-to-one\",\"Formation\":\"Training\",\"Formation & transmission\":\"Training & knowledge transfer\",\"Formation aux logiques de financement\":\"Training in how funding works\",\"Formation intensive\":\"Intensive training\",\"Former des acteurs associatifs en France et en Italie \u00e0 transformer leurs actions en exp\u00e9riences accessibles, pour toucher de nouveaux publics, notamment les plus \u00e9loign\u00e9s, et favoriser l\u2019engagement citoyen.\":\"Training non-profit practitioners in France and Italy to turn their activities into accessible experiences, in order to reach new audiences, especially the hardest to reach, and encourage civic engagement.\",\"Former vos agents\":\"Training your staff\",\"France \u00d7 Portugal\":\"France \u00d7 Portugal\",\"Fran\u00e7ais\":\"Fran\u00e7ais\",\"F\u00e9vr\":\"Feb\",\"Groupe\":\"Group\",\"Groupe Dispersion\":\"Groupe Dispersion\",\"Groupe Dispersion \u00d7 Fundacja CEL\":\"Groupe Dispersion \u00d7 Fundacja CEL\",\"Gr\u00e8ce\":\"Greece\",\"Guadeloupe\":\"Guadeloupe\",\"Guyane\":\"French Guiana\",\"Hatoup!\":\"Hatoup!\",\"Hypoth\u00e8ses\":\"Assumptions\",\"Identit\u00e9s visuelles, supports p\u00e9dagogiques, valorisation des projets, graphisme et production de contenus vid\u00e9o.\":\"Visual identities, learning materials, project showcases, graphic design and video production.\",\"Impact et r\u00e9f\u00e9rences\":\"Impact and references\",\"Inclusion\":\"Inclusion\",\"Incubateur associatif \u00b7 Fonds europ\u00e9ens\":\"Non-profit incubator \u00b7 EU funding\",\"Indicateurs\":\"Indicators\",\"Ing\u00e9nierie de dossier, recherche de partenaires, s\u00e9curisation du d\u00e9p\u00f4t.\":\"Application design, partner search, securing the submission.\",\"Ing\u00e9nierie europ\u00e9enne\":\"European project engineering\",\"Inscrire l\u2019action dans la dur\u00e9e\":\"Building for the long term\",\"Insertion & mobilit\u00e9\":\"Employment & mobility\",\"Insertion professionnelle\":\"Employment integration\",\"Istres\":\"Istres\",\"Janv\":\"Jan\",\"Jeunesse\":\"Youth\",\"Jeunesse & sport\":\"Youth & sport\",\"Journ\u00e9e d\u2019initiation\":\"Introduction day\",\"K-Pab6T\":\"K-Pab6T\",\"La Ciotat \u00b7 inclusion sociale\":\"La Ciotat \u00b7 social inclusion\",\"La Ciotat \u00b7 transition \u00e9cologique\":\"La Ciotat \u00b7 ecological transition\",\"La Ciotat \u00d7 Belgique\":\"La Ciotat \u00d7 Belgium\",\"La Ferme d\u2019Uhaldia\":\"La Ferme d\u2019Uhaldia\",\"La For\u00eat en papier\":\"La For\u00eat en papier\",\"La R\u00e9union\":\"R\u00e9union\",\"Laboratoire de bonnes pratiques \u00e9cologiques pour r\u00e9inventer l\u2019art de mani\u00e8re durable : approche holistique, interdisciplinaire, publics vari\u00e9s.\":\"A lab of ecological good practice to reinvent art sustainably: a holistic, interdisciplinary approach for varied audiences.\",\"Le Facteur Ind\u00e9pendant\":\"Le Facteur Ind\u00e9pendant\",\"Le Grand Bleu\":\"Le Grand Bleu\",\"Le Paysan Urbain\":\"Le Paysan Urbain\",\"Le e-hub collaboratif met \u00e0 disposition des associations un ensemble de ressources p\u00e9dagogiques, m\u00e9thodologiques et num\u00e9riques pour les accompagner tout au long de leur mont\u00e9e en comp\u00e9tences.\":\"The collaborative e-hub gives organisations a set of learning, methodological and digital resources to support them throughout their upskilling.\",\"Le hacking social, pour nous, c\u2019est une mani\u00e8re d\u2019agir sur les syst\u00e8mes qui emp\u00eachent trop souvent les associations d\u2019acc\u00e9der aux ressources qui leur sont pourtant destin\u00e9es.\":\"For us, social hacking is a way of acting on the systems that too often keep organisations from the very resources meant for them.\",\"Le transfert de comp\u00e9tences comme principe\":\"Skills transfer as a principle\",\"Lecture & m\u00e9diation culturelle\":\"Reading & cultural outreach\",\"Les Cols Verts Provence\":\"Les Cols Verts Provence\",\"Les Petites Cantines\":\"Les Petites Cantines\",\"Les associations repartent avec des outils concrets, mieux outill\u00e9es pour d\u00e9poser de nouveaux projets, d\u00e9velopper leurs partenariats et renforcer durablement leur autonomie financi\u00e8re.\":\"Organisations leave with concrete tools, better equipped to submit new projects, develop their partnerships and lastingly strengthen their financial independence.\",\"Les dossiers sont relus avant d\u00e9p\u00f4t pour s\u00e9curiser la coh\u00e9rence du projet, la r\u00e9daction, le budget, les pi\u00e8ces administratives et les annexes. Objectif : s\u00e9curiser la qualit\u00e9 du d\u00e9p\u00f4t et renforcer la coh\u00e9rence de la candidature, tout en permettant \u00e0 l\u2019\u00e9quipe de ma\u00eetriser chaque \u00e9tape.\":\"Applications are reviewed before submission to secure the project\u2019s coherence, the writing, the budget, the administrative documents and the annexes. The goal: secure the quality of the submission and strengthen the application\u2019s coherence, while enabling the team to master every step.\",\"Les financements europ\u00e9ens sont souvent per\u00e7us comme complexes, \u00e9loign\u00e9s ou r\u00e9serv\u00e9s aux grandes structures. Notre r\u00f4le est de les rendre accessibles aux associations de terrain, en identifiant les bons dispositifs, en simplifiant les \u00e9tapes et en accompagnant les structures jusqu\u2019au d\u00e9p\u00f4t.\":\"European funding is often seen as complex, remote or reserved for large organisations. Our role is to make it accessible to grassroots organisations, by identifying the right schemes, simplifying the steps and supporting them all the way to submission.\",\"Les quartiers prioritaires de la politique de la ville\":\"Priority urban neighbourhoods\",\"Les structures \u00e9mergentes de l\u2019ESS\":\"Emerging social economy organisations\",\"Les territoires ruraux et ultramarins\":\"Rural and overseas territories\",\"Les \u00ab Silent Books \u00bb, livres sans texte, pour ouvrir la lecture aux enfants et aux familles qui en sont \u00e9loign\u00e9s : une m\u00e9thode inclusive et des outils pour les professionnels de l\u2019\u00e9ducation.\":\"\u201cSilent Books\u201d, picture books without words, to open up reading to children and families who rarely have access to it: an inclusive method and tools for education professionals.\",\"Lire la vid\u00e9o\":\"Play video\",\"Lire la vid\u00e9o : \":\"Play video: \",\"Lunel Agglo\":\"Lunel Agglo\",\"Lutte contre les discriminations\":\"Anti-discrimination\",\"L\u2019incubateur s\u2019adresse aux structures qui portent des projets d\u2019int\u00e9r\u00eat g\u00e9n\u00e9ral et souhaitent changer d\u2019\u00e9chelle, quelle que soit leur taille ou leur th\u00e9matique.\":\"The incubator is for organisations that carry public-interest projects and want to scale up, whatever their size or field.\",\"L\u2019incubateur s\u2019appuie sur des partenaires publics et europ\u00e9ens, et sur des r\u00e9seaux territoriaux :\":\"The incubator draws on public and European partners, and on territorial networks:\",\"L\u2019\u00e9quipe\":\"The team\",\"L\u2019\u00e9quipe Social Hackers Lab\":\"The Social Hackers Lab team\",\"L\u2019\u0152il du Loup\":\"L\u2019\u0152il du Loup\",\"ML\":\"ML\",\"Mail\":\"Email\",\"Maquette : l\u2019envoi sera branch\u00e9 sur le formulaire du site.\":\"Mock-up: sending will be connected to the site\u2019s form.\",\"Marseille\":\"Marseille\",\"Marseille Nord Handball\":\"Marseille Nord Handball\",\"Marseille Sans Fronti\u00e8res\":\"Marseille Sans Fronti\u00e8res\",\"Marseille \u00b7 cin\u00e9ma et insertion\":\"Marseille \u00b7 cinema and employability\",\"Marseille \u00b7 mobilit\u00e9 jeunesse\":\"Marseille \u00b7 youth mobility\",\"Marseille \u00b7 projets num\u00e9riques\":\"Marseille \u00b7 digital projects\",\"Marseille \u00d7 Belgique\":\"Marseille \u00d7 Belgium\",\"Marseille \u00d7 Danemark\":\"Marseille \u00d7 Denmark\",\"Marseille \u00d7 Espagne\":\"Marseille \u00d7 Spain\",\"Marseille \u00d7 Gr\u00e8ce\":\"Marseille \u00d7 Greece\",\"Marseille \u00d7 Pologne\":\"Marseille \u00d7 Poland\",\"Martigues Sport Athl\u00e9tisme\":\"Martigues Sport Athl\u00e9tisme\",\"Martigues \u00b7 jeunesse et sport\":\"Martigues \u00b7 youth and sport\",\"Martinique\":\"Martinique\",\"Matrice du projet\":\"Project matrix\",\"Mayotte\":\"Mayotte\",\"Menu\":\"Menu\",\"Mobilit\u00e9\":\"Mobility\",\"Mobilit\u00e9 Erasmus+ pour 30 jeunes des quartiers Nord dans trois pays europ\u00e9ens : engagement citoyen et appartenance europ\u00e9enne par le sport.\":\"Erasmus+ mobility for 30 young people from northern Marseille in three European countries: civic engagement and a sense of European belonging through sport.\",\"Modulable\":\"Flexible\",\"Modulable \u00b7 porteur de projet\":\"Flexible \u00b7 project lead\",\"Mod\u00e8les de dossiers\":\"Application templates\",\"Montage\":\"Drafting\",\"Montant\":\"Amount\",\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole\":\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole\",\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole et l\u2019H\u00e9rault\":\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole and the H\u00e9rault\",\"Mont\u00e9e en comp\u00e9tences\":\"Upskilling\",\"Mont\u00e9e en comp\u00e9tences acc\u00e9l\u00e9r\u00e9e sur un programme cibl\u00e9.\":\"Fast-track upskilling on a targeted programme.\",\"M\u00e9thode\":\"Method\",\"M\u00e9thodes de r\u00e9daction\":\"Writing methods\",\"M\u00e9thodologique\":\"Methodology\",\"M\u00e9tropole Aix-Marseille\":\"M\u00e9tropole Aix-Marseille\",\"M\u00e9tropole Aix-Marseille-Provence\":\"M\u00e9tropole Aix-Marseille-Provence\",\"M\u00e9tropole Aix-Marseille-Provence, ANCT, D\u00e9partement de l\u2019Essonne, DDETS, agence Erasmus+, Villes et Territoires Occitanie\":\"M\u00e9tropole Aix-Marseille-Provence, ANCT, Essonne Department, DDETS, Erasmus+ agency, Villes et Territoires Occitanie\",\"M\u00e9tropole \u00b7 R\u00e9gion Sud\":\"Metropolitan authority \u00b7 R\u00e9gion Sud\",\"M\u00e9tropoles, d\u00e9partements, intercommunalit\u00e9s, services de l\u2019\u00c9tat : vous accompagnez au quotidien des associations engag\u00e9es au plus pr\u00e8s des habitants.\":\"Metropolitan areas, departments, inter-municipal bodies, State services: every day, you support organisations working closely with local residents.\",\"M\u20ac\":\"M\u20ac\",\"Nantes \u00b7 inclusion sociale\":\"Nantes \u00b7 social inclusion\",\"Nantes \u00d7 Irlande\":\"Nantes \u00d7 Ireland\",\"Navigation\":\"Navigation\",\"Navigation mobile\":\"Mobile navigation\",\"Navigation principale\":\"Main navigation\",\"Neuf capsules vid\u00e9o : les associations accompagn\u00e9es racontent, face cam\u00e9ra, ce que l\u2019accompagnement a chang\u00e9 pour elles.\":\"Nine short videos: the organisations we support tell the camera what the support changed for them.\",\"Nom et pr\u00e9nom\":\"Full name\",\"Nos champs d\u2019action\":\"Where we work\",\"Nos formats d\u2019intervention\":\"Our formats\",\"Nos formats, du plus l\u00e9ger au plus pouss\u00e9\":\"Our formats, from lightest to most in-depth\",\"Nos vies nos avis\":\"Nos vies nos avis\",\"Notre approche\":\"Our approach\",\"Notre approche :\":\"Our approach:\",\"Notre approche repose sur trois leviers compl\u00e9mentaires :\":\"Our approach rests on three complementary levers:\",\"Notre identit\u00e9\":\"Who we are\",\"Notre mission est d\u2019en r\u00e9v\u00e9ler le potentiel, de donner aux \u00e9quipes les moyens de le transformer en projet et, progressivement, de se passer de nous.\":\"Our mission is to reveal that potential, give teams the means to turn it into a project and, step by step, no longer need us.\",\"Notre mission n\u2019est pas de faire \u00e0 la place des associations, mais de leur transmettre les cl\u00e9s pour agir seules demain. Nous accompagnons, outillons, relisons, s\u00e9curisons :\":\"Our mission is not to act in place of organisations, but to hand them the keys to act on their own tomorrow. We support, equip, review and safeguard:\",\"Notre m\u00e9thode\":\"Our method\",\"Notre m\u00e9thodologie\":\"Our methodology\",\"Nous accompagnons \u00e9galement la mont\u00e9e en comp\u00e9tence de vos agents \u00e0 travers des formations d\u00e9di\u00e9es : mieux comprendre les programmes europ\u00e9ens, identifier les opportunit\u00e9s adapt\u00e9es au territoire, orienter les porteurs de projets et int\u00e9grer plus efficacement les financements europ\u00e9ens dans les politiques publiques.\":\"We also help your staff build their skills through dedicated training: understanding European programmes better, identifying opportunities suited to your area, guiding project leaders and integrating European funding more effectively into public policy.\",\"Nous aidons les associations \u00e0 diversifier leurs ressources et \u00e0 int\u00e9grer durablement les financements europ\u00e9ens dans leur strat\u00e9gie. L\u2019enjeu n\u2019est pas seulement de financer un projet, mais de renforcer leur capacit\u00e9 \u00e0 s\u00e9curiser leur mod\u00e8le \u00e9conomique et \u00e0 choisir leurs opportunit\u00e9s de d\u00e9veloppement.\":\"We help organisations diversify their resources and build European funding into their strategy for the long term. The aim is not only to fund a project, but to strengthen their ability to secure their business model and choose their development opportunities.\",\"Nous concevons avec vous des dispositifs qui renforcent leur capacit\u00e9 \u00e0 acc\u00e9der aux financements europ\u00e9ens et contribuent \u00e0 mobiliser davantage de ressources au b\u00e9n\u00e9fice de votre territoire.\":\"Together with you, we design schemes that strengthen their ability to access European funding and help bring more resources to your area.\",\"Nous intervenons prioritairement l\u00e0 o\u00f9 l\u2019acc\u00e8s aux financements reste difficile : quartiers prioritaires de la politique de la ville, territoires ruraux, territoires ultramarins et structures \u00e9mergentes de l\u2019\u00e9conomie sociale et solidaire.\":\"We work first and foremost where access to funding remains difficult: priority urban neighbourhoods, rural areas, overseas territories and emerging social and solidarity economy organisations.\",\"Nous partons de votre territoire : ses associations, ses quartiers, vos politiques publiques. Diagnostic, programme, calendrier et formats sont construits avec vos services, puis anim\u00e9s par notre \u00e9quipe, en pr\u00e9sentiel et \u00e0 distance.\":\"We start from your area: its organisations, its neighbourhoods, your public policies. Assessment, programme, timeline and formats are built with your teams, then delivered by ours, on site and online.\",\"Nous prenons en charge l\u2019appel \u00e0 candidatures, la mobilisation des structures, le suivi jusqu\u2019au d\u00e9p\u00f4t et le bilan. Vous suivez l\u2019avancement avec des indicateurs clairs, pr\u00e9sentables \u00e0 vos instances.\":\"We handle the call for applications, outreach to organisations, follow-up through to submission and the final report. You track progress with clear indicators you can present to your governing bodies.\",\"Nous traduisons la complexit\u00e9 des financements europ\u00e9ens dans un langage clair, op\u00e9rationnel et directement utilisable. Nous aidons les associations \u00e0 comprendre les r\u00e8gles du jeu, \u00e0 structurer leurs id\u00e9es, \u00e0 construire des dossiers solides et \u00e0 prendre confiance dans leur capacit\u00e9 \u00e0 porter des projets ambitieux.\":\"We translate the complexity of European funding into clear, practical, ready-to-use language. We help organisations understand the rules of the game, shape their ideas, build solid applications and gain confidence in their ability to lead ambitious projects.\",\"Nous transmettons des comp\u00e9tences techniques et strat\u00e9giques pour que les associations ne d\u00e9pendent pas uniquement d\u2019un accompagnement ponctuel. \u00c0 la fin du parcours, les \u00e9quipes disposent d\u2019outils, de m\u00e9thodes et de mod\u00e8les r\u00e9utilisables pour d\u00e9poser de nouveaux dossiers de mani\u00e8re autonome.\":\"We pass on technical and strategic skills so that organisations do not depend solely on one-off support. By the end of the programme, teams have reusable tools, methods and templates to submit new applications on their own.\",\"Nouvel appel\":\"New call\",\"Nouvelle-Cal\u00e9donie\":\"New Caledonia\",\"Nov\":\"Nov\",\"Num\u00e9rique\":\"Digital\",\"Num\u00e9rique & data\":\"Digital & data\",\"Objectif g\u00e9n\u00e9ral\":\"Overall objective\",\"Objectifs sp\u00e9cifiques\":\"Specific objectives\",\"Oct\":\"Oct\",\"Open Lande\":\"Open Lande\",\"Outils\":\"Tools\",\"Outre-mer\":\"Overseas France\",\"Ouvrons des portes l\u00e0 o\u00f9 elles semblent ferm\u00e9es\":\"Opening doors where they seem closed\",\"Parcours\":\"Programme\",\"Parcours complet du diagnostic jusqu\u2019au d\u00e9p\u00f4t, en alternance collectif et individuel.\":\"A full programme from assessment to submission, alternating group and one-to-one sessions.\",\"Parcours de formation\":\"Training path\",\"Parcours de formation, trames budg\u00e9taires, veille sur les appels \u00e0 projets, cadre logique : tout reste accessible, m\u00eame apr\u00e8s l\u2019accompagnement.\":\"Training paths, budget templates, call monitoring, logical framework: everything stays accessible, even after the support ends.\",\"Paris \u00d7 Roumanie, Espagne, Su\u00e8de\":\"Paris \u00d7 Romania, Spain, Sweden\",\"Parlons de votre projet\":\"Let\u2019s talk about your project\",\"Partenaires\":\"Partners\",\"Partenaires & financeurs\":\"Partners & funders\",\"Partenariats de coop\u00e9ration\":\"Cooperation partnerships\",\"Participants\":\"Participants\",\"Pays basque\":\"Basque Country\",\"Pays basque \u00d7 Espagne\":\"Basque Country \u00d7 Spain\",\"Pays basque \u00d7 Italie, Gr\u00e8ce\":\"Basque Country \u00d7 Italy, Greece\",\"Pays partenaire\":\"Partner country\",\"Pays partenaires\":\"Partner countries\",\"Pens\u00e9s pour les r\u00e9alit\u00e9s des \u00e9quipes associatives (b\u00e9n\u00e9voles et salari\u00e9s, temps limit\u00e9, niveaux d\u2019entr\u00e9e h\u00e9t\u00e9rog\u00e8nes), du plus l\u00e9ger au plus pouss\u00e9, et combinables dans un m\u00eame parcours.\":\"Designed for the realities of non-profit teams (volunteers and staff, limited time, mixed starting levels), from the lightest to the most in-depth, and combinable within a single programme.\",\"Personnel\":\"Staff\",\"Plateformes ressources, cartographies, outils de suivi, automatisations et solutions num\u00e9riques con\u00e7ues pour faciliter l\u2019accompagnement.\":\"Resource platforms, maps, tracking tools, automations and digital solutions designed to make support easier.\",\"Pl\u00e9ni\u00e8re \u00b7 1 journ\u00e9e\":\"Plenary \u00b7 1 day\",\"Politique de cookies\":\"Cookie policy\",\"Pologne\":\"Poland\",\"Port-de-Bouc\":\"Port-de-Bouc\",\"Porteur de projet\":\"Project lead\",\"Portugal\":\"Portugal\",\"Poste\":\"Item\",\"Pour\":\"For\",\"Pour les collectivit\u00e9s\":\"For local authorities\",\"Pour qui\":\"Who for\",\"Pourquoi nous faire confiance\":\"Why trust us\",\"Programmes europ\u00e9ens\":\"European programmes\",\"Projet Hyphen : restaurer le lien m\u00e8re-enfant en contexte de violences domestiques. Module de formation, recherche-action, deux r\u00e9sidences \u00e0 M\u00e1laga et Marseille.\":\"Hyphen project: restoring the mother-child bond in the context of domestic violence. Training module, action research, two residencies in M\u00e1laga and Marseille.\",\"Projet MEDIAWISE : l\u2019\u00e9ducation aux m\u00e9dias au service de l\u2019inclusion et de la participation d\u00e9mocratique de femmes issues de minorit\u00e9s, avec 20 \u00e9ducatrices form\u00e9es et un kit p\u00e9dagogique trilingue.\":\"MEDIAWISE project: media literacy for the inclusion and democratic participation of women from minority backgrounds, with 20 trained educators and a trilingual teaching kit.\",\"Projet READY+ : pr\u00e9parer des adultes vuln\u00e9rables \u00e0 la mobilit\u00e9 europ\u00e9enne et \u00e0 l\u2019emploi durable, avec un cadre m\u00e9thodologique, des outils p\u00e9dagogiques et une phase pilote en France et en Irlande.\":\"READY+ project: preparing vulnerable adults for European mobility and lasting employment, with a methodological framework, teaching tools and a pilot phase in France and Ireland.\",\"Projet de coop\u00e9ration europ\u00e9en\":\"European cooperation project\",\"Projets\":\"Projects\",\"Projets de coop\u00e9ration europ\u00e9enne\":\"European cooperation projects\",\"Projets de solidarit\u00e9\":\"Solidarity projects\",\"Pr\u00e9vention & \u00e9ducation\":\"Prevention & education\",\"Publics\":\"Public\",\"Publics \u00b7 4 partenaires\":\"Public \u00b7 4 partners\",\"P\u00e9dagogique\":\"Learning\",\"QPV\":\"Priority areas\",\"Quartiers Nord de Marseille\":\"Northern Marseille\",\"Quartiers prioritaires des agglom\u00e9rations\":\"Priority neighbourhoods in urban areas\",\"Recherche de partenaires\":\"Looking for partners\",\"Relecture\":\"Review\",\"Relecture et d\u00e9p\u00f4t\":\"Review and submission\",\"Renforcer l\u2019autonomie financi\u00e8re\":\"Strengthening financial independence\",\"Renforcer l\u2019insertion des publics \u00e9loign\u00e9s de l\u2019emploi via un parcours de formation-action ancr\u00e9 dans l\u2019ESS, avec mobilisation du hub inter-associatif.\":\"Helping people far from work into jobs through a learning-by-doing programme rooted in the social economy, drawing on the inter-association hub.\",\"Ressourcerie\":\"Resource hub\",\"Ressourcerie en ligne\":\"Online resource hub\",\"Ressourcerie num\u00e9rique\":\"Digital resource hub\",\"Ressources\":\"Resources\",\"Ressources p\u00e9dagogiques\":\"Learning resources\",\"Rompre l\u2019isolement des femmes confront\u00e9es aux discriminations par le sport et la culture : confiance en soi, autonomie, pouvoir d\u2019agir, et des pratiques partag\u00e9es entre structures partenaires.\":\"Breaking the isolation of women facing discrimination through sport and culture: self-confidence, autonomy, empowerment, and practices shared between partner organisations.\",\"Rural \u00b7 Outre-mer\":\"Rural \u00b7 Overseas\",\"R\u00e9gie de quartier\":\"R\u00e9gie de quartier\",\"R\u00e9partition\":\"Share\",\"R\u00e9ponse sous quelques jours ouvr\u00e9s.\":\"We reply within a few working days.\",\"R\u00e9seau\":\"Network\",\"R\u00e9seaux\":\"Networks\",\"R\u00e9seaux \u00b7 1 partenaire\":\"Networks \u00b7 1 partner\",\"R\u00e9sultats attendus\":\"Expected results\",\"SHL en chiffres\":\"SHL in figures\",\"Saisir les opportunit\u00e9s\":\"Seizing opportunities\",\"Sant\u00e9 mentale & inclusion\":\"Mental health & inclusion\",\"Se retire\":\"Steps back\",\"Sept\":\"Sep\",\"Sept collectivit\u00e9s \u00b7 Occitanie\":\"Seven local authorities \u00b7 Occitanie\",\"Si\u00e8ge \u00e0 Marseille\":\"Based in Marseille\",\"Skills for Consent : une bo\u00eete \u00e0 outils de 23 activit\u00e9s pour pr\u00e9venir les violences sexistes et sexuelles d\u00e8s l\u2019enfance, con\u00e7ue avec des enseignants et des professionnels de l\u2019enfance.\":\"Skills for Consent: a toolbox of 23 activities to prevent sexist and sexual violence from early childhood, designed with teachers and childhood professionals.\",\"Social Hackers Lab\":\"Social Hackers Lab\",\"Social Hackers Lab est ce pont.\":\"Social Hackers Lab is that bridge.\",\"Social Hackers Lab \u00b7 Incubateur associatif\":\"Social Hackers Lab \u00b7 Non-profit incubator\",\"Social Hackers Lab, accueil\":\"Social Hackers Lab, home\",\"Solidarit\u00e9 Femmes 13\":\"Solidarit\u00e9 Femmes 13\",\"Solidarit\u00e9 Femmes 13 \u00d7 Dem\u00e9ter\":\"Solidarit\u00e9 Femmes 13 \u00d7 Dem\u00e9ter\",\"Sources\":\"Sources\",\"Strasbourg\":\"Strasbourg\",\"Structure\":\"Organisation\",\"Structure accompagn\u00e9e\":\"Supported organisation\",\"Structures de l\u2019ESS, en r\u00e9seau jusqu\u2019\u00e0 l\u2019Europe\":\"Social economy organisations, networked across Europe\",\"Structures d\u2019insertion\":\"Work integration organisations\",\"Subventions\":\"Usual\",\"Suivi individuel\":\"One-to-one support\",\"Supports de formation\":\"Training materials\",\"Sur le terrain\":\"On the ground\",\"S\u00e8te Agglop\u00f4le M\u00e9diterran\u00e9e\":\"S\u00e8te Agglop\u00f4le M\u00e9diterran\u00e9e\",\"S\u00e9ance \":\"Session \",\"S\u00e9curisation\":\"Safeguards\",\"Terre Ludique\":\"Terre Ludique\",\"Territoires\":\"Territories\",\"Territoires ruraux et d\u2019outre-mer\":\"Rural and overseas territories\",\"Tesslab\":\"Tesslab\",\"Total du projet\":\"Project total\",\"Tout le r\u00e9seau \u00b7 6 partenaires\":\"Whole network \u00b7 6 partners\",\"Trame budg\u00e9taire\":\"Budget template\",\"Trames budg\u00e9taires\":\"Budget templates\",\"Transfert de comp\u00e9tences et autonomisation\":\"Skills transfer and independence\",\"Transition \u00e9cologique\":\"Ecological transition\",\"Trois garanties au service\":\"Three guarantees\",\"T\u00e9l.\":\"Tel.\",\"T\u00e9moignages\":\"Testimonials\",\"Un accompagnement adapt\u00e9 \u00e0 chaque r\u00e9alit\u00e9 : \u00e9loignement g\u00e9ographique, acc\u00e8s aux partenaires, sp\u00e9cificit\u00e9s locales, besoins de coop\u00e9ration r\u00e9gionale ou transfrontali\u00e8re. Nous intervenons notamment en Outre-mer et dans les territoires ruraux.\":\"Support adapted to each reality: geographical distance, access to partners, local specificities, needs for regional or cross-border cooperation. We work in particular in overseas France and in rural areas.\",\"Un accompagnement d\u00e9di\u00e9 aux acteurs de la Cit\u00e9 \u00e9ducative pour renforcer leur connaissance des financements europ\u00e9ens, faire \u00e9merger de nouvelles opportunit\u00e9s de coop\u00e9ration et accompagner la structuration de projets adapt\u00e9s aux besoins du territoire.\":\"Dedicated support for the partners of the Cit\u00e9 \u00e9ducative programme, to deepen their knowledge of European funding, open up new opportunities for cooperation and help structure projects suited to local needs.\",\"Un ancrage institutionnel solide\":\"Strong institutional roots\",\"Un auto-diagnostic structur\u00e9 permet \u00e0 chaque association d\u2019\u00e9valuer sa capacit\u00e9 \u00e0 mobiliser les fonds europ\u00e9ens, d\u2019identifier ses forces et de cartographier ses besoins.\":\"A structured self-assessment lets each organisation gauge its capacity to mobilise European funds, identify its strengths and map its needs.\",\"Un dispositif cl\u00e9 en main, des r\u00e9sultats mesur\u00e9s\":\"A turnkey scheme, measured results\",\"Un dispositif construit avec vous\":\"A scheme built with you\",\"Un dispositif pens\u00e9 avec le territoire, pour renforcer durablement les comp\u00e9tences de ses acteurs et leur acc\u00e8s aux financements europ\u00e9ens.\":\"A scheme designed with the area, to build lasting skills among its local players and strengthen their access to European funding.\",\"Un financeur ou une fondation\":\"A funder or foundation\",\"Un impact mesurable, ancr\u00e9 dans les territoires.\":\"Measurable impact, rooted in local areas.\",\"Un incubateur associatif d\u00e9di\u00e9 aux financements europ\u00e9ens et \u00e0 l\u2019innovation sociale. Nous accompagnons les associations \u00e0 impact dans la construction de mod\u00e8les \u00e9conomiques p\u00e9rennes, par la formation, l\u2019ing\u00e9nierie de projet et l\u2019acc\u00e8s aux fonds europ\u00e9ens.\":\"A non-profit incubator dedicated to European funding and social innovation. We help impact-driven organisations build sustainable business models through training, project engineering and access to European funds.\",\"Un incubateur associatif d\u00e9partemental : parcours de formation, autodiagnostic et ressourcerie en ligne pour les associations essonniennes.\":\"A departmental incubator: training programme, self-assessment and an online resource hub for organisations in Essonne.\",\"Un incubateur associatif m\u00e9tropolitain, inscrit dans les dynamiques du Contrat de ville, pour accompagner les structures du territoire dans l\u2019acc\u00e8s aux financements europ\u00e9ens et la structuration de leurs projets.\":\"A metropolitan incubator for non-profits, part of the City Contract (Contrat de ville) framework, helping local organisations access European funding and structure their projects.\",\"Un parcours structur\u00e9 en\":\"A structured programme in\",\"Un programme soutenu par les collectivit\u00e9s, l\u2019\u00c9tat et l\u2019Europe.\":\"A programme backed by local authorities, the French State and Europe.\",\"Une association\":\"A non-profit\",\"Une collectivit\u00e9\":\"A local authority\",\"Une expertise \u00e9prouv\u00e9e sur le terrain\":\"Proven expertise on the ground\",\"Une ing\u00e9nierie p\u00e9dagogique sur mesure\":\"Tailor-made learning design\",\"Une organisation agile, des expertises compl\u00e9mentaires, un interlocuteur unique pour chaque projet.\":\"An agile organisation, complementary expertise, a single point of contact for every project.\",\"Une ressourcerie au service\":\"A resource hub\",\"Une s\u00e9lection de projets europ\u00e9ens accompagn\u00e9s jusqu\u2019\u00e0 leur financement, repr\u00e9sentatifs de la diversit\u00e9 des th\u00e9matiques et des partenariats transnationaux.\":\"A selection of European projects supported through to funding, reflecting the diversity of themes and transnational partnerships.\",\"Une \u00e9quipe qui s\u2019adapte\":\"A team that adapts\",\"Union europ\u00e9enne\":\"European Union\",\"Veille des appels\":\"Call monitoring\",\"Veille des appels \u00e0 projets\":\"Monitoring calls for proposals\",\"Veille sur les appels\":\"Call monitoring\",\"Veille, strat\u00e9gie de financement, montage de projets, recherche de partenaires et accompagnement jusqu\u2019au d\u00e9p\u00f4t.\":\"Monitoring calls, funding strategy, project design, partner search and support through to submission.\",\"Version fran\u00e7aise\":\"Version fran\u00e7aise\",\"Ville de Clermont-l\u2019H\u00e9rault\":\"Town of Clermont-l\u2019H\u00e9rault\",\"Ville de Loos\":\"City of Loos\",\"Ville \u00b7 Hauts-de-France\":\"City \u00b7 Hauts-de-France\",\"Villes et Territoires Occitanie\":\"Villes et Territoires Occitanie\",\"Voir les projets financ\u00e9s\":\"See funded projects\",\"Vos projets\":\"Your projects\",\"Votre association\":\"Your organisation\",\"Votre projet\":\"Your project\",\"Votre \u00e9quipe\":\"Your team\",\"Vous d\u00e9finissez les priorit\u00e9s et les publics \u00e0 accompagner. Nous construisons le parcours : ing\u00e9nierie p\u00e9dagogique, formation, outils num\u00e9riques, accompagnement individualis\u00e9 et suivi jusqu\u2019au d\u00e9p\u00f4t des candidatures.\":\"You set the priorities and choose who to support. We build the programme: learning design, training, digital tools, one-to-one support and follow-up until applications are submitted.\",\"Vous \u00eates\":\"You are\",\"agriculture urbaine\":\"urban farming\",\"art contemporain\":\"contemporary art\",\"art et quartiers\":\"art and neighbourhoods\",\"associations accompagn\u00e9es partout en France\":\"organisations supported across France\",\"associations accompagn\u00e9es partout en France.\":\"organisations supported across France.\",\"associations de terrain\":\"grassroots organisations\",\"avec SHL\":\"with SHL\",\"avec des partenaires, financeurs et acteurs europ\u00e9ens.\":\"with European partners, funders and stakeholders.\",\"cantine de quartier\":\"neighbourhood canteen\",\"cinq \u00e9tapes.\":\"five steps.\",\"circuits de financement.\":\"funding channels.\",\"climat et \u00e9ducation\":\"climate and education\",\"de financements europ\u00e9ens lev\u00e9s par les structures accompagn\u00e9es.\":\"in European funding raised by the organisations we support.\",\"de l\u2019autonomie.\":\"for independence.\",\"de votre projet.\":\"for your project.\",\"des coop\u00e9rations europ\u00e9ennes.\":\"European partnerships.\",\"des structures red\u00e9posent un projet europ\u00e9en en autonomie l\u2019ann\u00e9e suivante.\":\"of organisations submit a new European project on their own the following year.\",\"dynamique europ\u00e9enne.\":\"European momentum.\",\"en acc\u00e8s continu.\":\"available at all times.\",\"en autonomie\":\"on your own\",\"et\":\"and\",\"et les acteurs publics.\":\"and public bodies.\",\"europ\u00e9ens\":\"funds\",\"familles et jeunesse\":\"families and youth\",\"femmes et m\u00e8res isol\u00e9es\":\"isolated women and mothers\",\"financements europ\u00e9ens\":\"European funding\",\"formation \u00e0 l\u2019\u00e9galit\u00e9\":\"equality training\",\"habituelles\":\"grants\",\"hubs inter-associatifs sur le territoire national.\":\"inter-association hubs across France.\",\"inclusion sociale\":\"social inclusion\",\"innovation sociale\":\"social innovation\",\"insertion par l\u2019emploi\":\"work integration\",\"la formation\":\"training\",\"la mise en r\u00e9seau\":\"networking\",\"le hacking social.\":\"social hacking.\",\"les associations de terrain, les financements europ\u00e9ens et l\u2019innovation sociale\":\"grassroots organisations, European funding and social innovation\",\"l\u2019accompagnement individualis\u00e9\":\"one-to-one support\",\"l\u2019objectif final reste l\u2019autonomie.\":\"the end goal is always independence.\",\"participation citoyenne\":\"civic participation\",\"pays\":\"countries\",\"projet\":\"project\",\"projets\":\"projects\",\"projets \u00e9ducatifs\":\"educational projects\",\"publics vuln\u00e9rables\":\"vulnerable groups\",\"ressources\":\"resources\",\"r\u00e9sultats mesurables.\":\"measurable results.\",\"r\u00e9ussite scolaire\":\"school success\",\"services de proximit\u00e9\":\"local services\",\"sonia@socialhackerslab.com\":\"sonia@socialhackerslab.com\",\"sport et jeunesse\":\"sport and youth\",\"sport inclusif\":\"inclusive sport\",\"sport pour les jeunes\":\"sport for young people\",\"s\u2019approprient les outils.\":\"make the tools their own.\",\"temps collectif\":\"group time\",\"temps individuel\":\"one-to-one time\",\"transition \u00e9cologique\":\"ecological transition\",\"un pays\":\"country\",\"\u00a9 2026 Social Hackers Lab, tous droits r\u00e9serv\u00e9s \u00b7\":\"\u00a9 2026 Social Hackers Lab, all rights reserved \u00b7\",\"\u00b7 O\u00f9 nous intervenons\":\"\u00b7 Where we work\",\"\u00c9COLE DE LA DEUXI\u00c8ME CHANCE\":\"\u00c9COLE DE LA DEUXI\u00c8ME CHANCE\",\"\u00c9changer avec l\u2019\u00e9quipe\":\"Talk to the team\",\"\u00c9changes europ\u00e9ens et formations en \u00e9ducation non formelle pour des adultes qui ont le moins d\u2019opportunit\u00e9s, notamment face \u00e0 des troubles psychiques : outils p\u00e9dagogiques et participation citoyenne.\":\"European exchanges and non-formal education training for adults with fewer opportunities, including people living with mental health conditions: teaching tools and civic participation.\",\"\u00c9cole de la 2e chance\":\"\u00c9cole de la 2e chance (second-chance school)\",\"\u00c9ducation aux m\u00e9dias\":\"Media literacy\",\"\u00c9galit\u00e9 & inclusion\":\"Equality & inclusion\",\"\u00c9galit\u00e9 & violences de genre\":\"Equality & gender-based violence\",\"\u00c9quipe\":\"Team\",\"\u00c9quipe SHL\":\"SHL team\",\"\u00c9quipe interne \u00b7 programme cibl\u00e9\":\"In-house team \u00b7 targeted programme\",\"\u00c9quipements\":\"Equipment\",\"\u00c9quipes internes\":\"In-house teams\",\"\u00c9tape 1 sur 5\":\"Step 1 of 5\",\"\u00c9tape 2 sur 5\":\"Step 2 of 5\",\"\u00c9tape 3 sur 5\":\"Step 3 of 5\",\"\u00c9tape 4 sur 5\":\"Step 4 of 5\",\"\u00c9tape 5 sur 5\":\"Step 5 of 5\",\"\u00catre accompagn\u00e9\":\"Get support\",\"\u00e0 chaque projet.\":\"to every project.\"};\r\n  var tr = function (s) { return LANG === 'en' && EN[s] || s; };\r\n  (function () {\r\n    var page = root.tagName === 'HTML' ? document.body : root;\r\n    \/\/ Changer de langue recharge la page au m\u00eame endroit : on note la section\r\n    \/\/ lue et l\u2019\u00e9cart \u00e0 son bord. Pas l\u2019ancre de l\u2019adresse, qui date du dernier\r\n    \/\/ lien cliqu\u00e9 (#europe renvoyait sur la carte).\r\n    Array.prototype.forEach.call(page.querySelectorAll('[data-lang-switch] a'), function (a) {\r\n      var to = a.getAttribute('data-lang');\r\n      if (to === LANG) a.setAttribute('aria-current', 'true');\r\n      a.addEventListener('click', function (e) {\r\n        e.preventDefault();\r\n        var q = location.search.replace(\/^\\?\/, '').split('&').filter(function (p) { return p && p.indexOf('lang=') !== 0; });\r\n        if (to === 'en') q.push('lang=en');\r\n        try {\r\n          var secs = page.querySelectorAll('section'), at = -1, dy = 0, i, t;\r\n          if (window.scrollY > 40) for (i = 0; i < secs.length; i++) {\r\n            t = secs[i].getBoundingClientRect().top;\r\n            if (t > 90) break;\r\n            at = i; dy = -t;\r\n          }\r\n          if (at >= 0) sessionStorage.setItem('shl-lang-at', at + ':' + Math.round(dy));\r\n        } catch (err) {}\r\n        location.href = location.pathname + (q.length ? '?' + q.join('&') : '');\r\n      });\r\n    });\r\n    if (LANG !== 'en') return;\r\n    var hold = document.getElementById('lang-hold');\r\n    try {\r\n      var norm = function (t) { return t.replace(\/\\s+\/g, ' ').trim(); };\r\n      var miss = {}, n, k;\r\n      var walker = document.createTreeWalker(page, NodeFilter.SHOW_TEXT, null);\r\n      while ((n = walker.nextNode())) {\r\n        var tag = n.parentNode.nodeName;\r\n        if (tag === 'SCRIPT' || tag === 'STYLE') continue;\r\n        k = norm(n.nodeValue);\r\n        if (!\/[A-Za-z\\u00c0-\\u00ff]\/.test(k)) continue;\r\n        if (EN[k] == null) { miss[k] = 1; continue; }\r\n        n.nodeValue = \/^\\s*\/.exec(n.nodeValue)[0] + EN[k] + \/\\s*$\/.exec(n.nodeValue)[0];\r\n      }\r\n      ['aria-label', 'alt', 'title', 'placeholder', 'data-cap'].forEach(function (at) {\r\n        Array.prototype.forEach.call(page.querySelectorAll('[' + at + ']'), function (el) {\r\n          k = norm(el.getAttribute(at));\r\n          if (!\/[A-Za-z\\u00c0-\\u00ff]\/.test(k)) return;\r\n          if (EN[k] == null) miss[k] = 1; else el.setAttribute(at, EN[k]);\r\n        });\r\n      });\r\n      root.setAttribute('lang', 'en');\r\n      if (root.tagName === 'HTML' && EN[norm(document.title)]) document.title = EN[norm(document.title)];\r\n      if (Object.keys(miss).length) console.info('Traduction manquante (' + Object.keys(miss).length + ')', Object.keys(miss));\r\n    } finally {\r\n      if (hold) hold.parentNode.removeChild(hold);\r\n    }\r\n  })();\r\n  \/\/ \u00c0 l\u2019arriv\u00e9e dans l\u2019autre langue, on revient \u00e0 cet endroit, sans glisser\r\n  var back = null;\r\n  try { back = \/^(\\d+):(-?\\d+)$\/.exec(sessionStorage.getItem('shl-lang-at') || ''); sessionStorage.removeItem('shl-lang-at'); } catch (err) {}\r\n  if (back) {\r\n    var moved = false;\r\n    var goBack = function () {\r\n      var sec = (root.tagName === 'HTML' ? document.body : root).querySelectorAll('section')[+back[1]];\r\n      if (moved || !sec) return;\r\n      var se = document.scrollingElement || document.body;\r\n      se.style.scrollBehavior = 'auto';\r\n      window.scrollTo(0, sec.getBoundingClientRect().top + window.scrollY + +back[2]);\r\n      se.style.scrollBehavior = '';\r\n    };\r\n    goBack();\r\n    \/\/ Les polices et les images peuvent encore d\u00e9caler la page : on recale,\r\n    \/\/ tant que le visiteur n\u2019a pas repris la main\r\n    ['wheel', 'touchstart', 'keydown', 'mousedown'].forEach(function (ev) { window.addEventListener(ev, function () { moved = true; }, { once: true, passive: true }); });\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(goBack);\r\n    window.addEventListener('load', goBack);\r\n  }\r\n  \/\/ L\u2019ouverture (le pont en petit) ne joue qu\u2019en arrivant en haut de page\r\n  var intro = document.getElementById('shl-accueil').querySelector('[data-intro]');\r\n  var introOn = !!intro && !calm && !document.hidden && !location.hash && window.scrollY < 40;\r\n  if (intro && !introOn) intro.parentNode.removeChild(intro);\r\n  if (introOn) root.classList.add('intro-hold');\r\n  \/* ---------------- En-t\u00eate ---------------- *\/\r\n  var header = document.getElementById('shl-accueil').querySelector('[data-header]');\r\n  var menuBtn = document.getElementById('shl-accueil').querySelector('[data-menu]');\r\n  var mobileNav = document.getElementById('mobile-nav');\r\n  var onScroll = function () { header.classList.toggle('is-solid', window.scrollY > 24); };\r\n  onScroll();\r\n  window.addEventListener('scroll', onScroll, { passive: true });\r\n  var setMenu = function (open) {\r\n    menuBtn.setAttribute('aria-expanded', String(open));\r\n    mobileNav.hidden = !open;\r\n    header.classList.toggle('is-open', open);\r\n  };\r\n  menuBtn.addEventListener('click', function () { setMenu(mobileNav.hidden); });\r\n  mobileNav.addEventListener('click', function (e) { if (e.target.closest('a')) setMenu(false); });\r\n  document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !mobileNav.hidden) { setMenu(false); menuBtn.focus(); } });\r\n  \/\/ Lien de navigation courant : un trait dans la teinte de sa section glisse\r\n  \/\/ sous le mot. Au survol, il suit la souris et prend la teinte du lien.\r\n  var nav = document.getElementById('shl-accueil').querySelector('.main-nav');\r\n  var thumb = nav.querySelector('.nav-thumb');\r\n  var navLinks = Array.prototype.slice.call(nav.querySelectorAll('a'));\r\n  var navTargets = navLinks.map(function (a) { return document.getElementById('shl-accueil').querySelector(a.getAttribute('href')); });\r\n  var current = null, hovered = null;\r\n  var placeThumb = function () {\r\n    var a = hovered || current;\r\n    thumb.style.opacity = a ? '1' : '0';\r\n    if (!a) return;\r\n    var first = !thumb.style.width;\r\n    if (first) thumb.style.transition = 'opacity .3s';\r\n    var pad = parseFloat(getComputedStyle(a).paddingLeft) || 0;\r\n    thumb.style.width = a.offsetWidth - 2 * pad + 'px';\r\n    thumb.style.transform = 'translateX(' + (a.offsetLeft + pad) + 'px)';\r\n    thumb.style.backgroundColor = getComputedStyle(a).getPropertyValue('--c');\r\n    if (first) { void thumb.offsetWidth; thumb.style.transition = ''; }\r\n  };\r\n  navLinks.forEach(function (a) { a.addEventListener('mouseenter', function () { hovered = a; placeThumb(); }); });\r\n  nav.addEventListener('mouseleave', function () { hovered = null; placeThumb(); });\r\n  window.addEventListener('resize', placeThumb);\r\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(placeThumb);\r\n  if ('IntersectionObserver' in window) {\r\n    var navIO = new IntersectionObserver(function (entries) {\r\n      entries.forEach(function (entry) {\r\n        if (!entry.isIntersecting) {\r\n          \/\/ Retour en haut de page : plus aucune section courante\r\n          if (entry.target === navTargets[0] && entry.boundingClientRect.top > 0) current = null; else return;\r\n        } else {\r\n          current = navLinks[navTargets.indexOf(entry.target)] || null;\r\n        }\r\n        navLinks.forEach(function (a) { a.classList.toggle('is-current', a === current); });\r\n        placeThumb();\r\n      });\r\n    }, { rootMargin: '-45% 0px -50% 0px' });\r\n    navTargets.forEach(function (t) { if (t) navIO.observe(t); });\r\n    \/\/ Tout en haut de page, aucune section n\u2019est courante\r\n    window.addEventListener('scroll', function () {\r\n      if (!current || navTargets[0].getBoundingClientRect().top < window.innerHeight * .5) return;\r\n      current = null;\r\n      navLinks.forEach(function (a) { a.classList.remove('is-current'); });\r\n      placeThumb();\r\n    }, { passive: true });\r\n  }\r\n  \/* ---------------- Apparitions ---------------- *\/\r\n  var onView = function (els, fn, opts) {\r\n    if (!('IntersectionObserver' in window)) { els.forEach(fn); return; }\r\n    var io = new IntersectionObserver(function (entries) {\r\n      entries.forEach(function (entry) { if (entry.isIntersecting) { io.unobserve(entry.target); fn(entry.target); } });\r\n    }, opts || { rootMargin: '0px 0px -12% 0px' });\r\n    els.forEach(function (el) { io.observe(el); });\r\n  };\r\n  onView(Array.prototype.slice.call(document.getElementById('shl-accueil').querySelectorAll('[data-reveal]')), function (el) { el.classList.add('is-in'); });\r\n  \/* ---------------- Titre : les lignes montent, police charg\u00e9e ---------------- *\/\r\n  var loaded = function () { root.classList.add('is-loaded'); };\r\n  \/\/ Avec l\u2019ouverture, c\u2019est elle qui fait monter le titre\r\n  if (introOn) {} else if (document.fonts && document.fonts.ready) { document.fonts.ready.then(loaded); window.setTimeout(loaded, 900); } else loaded();\r\n  \/* ---------------- Chiffres ---------------- *\/\r\n  var fmt = function (v, d) { return v.toLocaleString(LANG === 'en' ? 'en-GB' : 'fr-FR', { minimumFractionDigits: d, maximumFractionDigits: d }); };\r\n  \/\/ Le compteur part avec l\u2019apparition de son chiffre : m\u00eame seuil que le fondu, m\u00eame\r\n  \/\/ d\u00e9calage (--d). Le z\u00e9ro se pose dans la m\u00eame image que le fondu commence, si bien\r\n  \/\/ qu\u2019on ne voit jamais le chiffre final avant qu\u2019il retombe \u00e0 z\u00e9ro.\r\n  onView(Array.prototype.slice.call(document.getElementById('shl-accueil').querySelectorAll('[data-count]')).map(function (el) { return el.closest('[data-reveal]') || el; }), function (box) {\r\n    var el = box.matches('[data-count]') ? box : box.querySelector('[data-count]');\r\n    var target = parseFloat(el.dataset.count), dec = parseInt(el.dataset.decimals || '0', 10);\r\n    if (calm) { el.textContent = fmt(target, dec); return; }\r\n    var dur = 1600, t0 = 0;\r\n    var tick = function (now) {\r\n      if (!t0) t0 = now;\r\n      var p = Math.min(1, (now - t0) \/ dur), e = 1 - Math.pow(1 - p, 4);\r\n      el.textContent = fmt(target * e, dec);\r\n      if (p < 1) requestAnimationFrame(tick);\r\n    };\r\n    el.textContent = fmt(0, dec);\r\n    window.setTimeout(function () { requestAnimationFrame(tick); }, parseInt(box.style.getPropertyValue('--d') || '0', 10));\r\n  });\r\n  \/* ---------------- Identit\u00e9 : trois sc\u00e8nes anim\u00e9es ---------------- *\/\r\n  \/\/ Chaque carte joue sa sc\u00e8ne en boucle tant qu\u2019elle est \u00e0 l\u2019\u00e9cran. Les mots ne\r\n  \/\/ bougent jamais : seuls les rep\u00e8res se d\u00e9placent (point, curseur, surlignage,\r\n  \/\/ barre), et le texte n\u2019arrive qu\u2019en fondu, une fois le mouvement fini. Le\r\n  \/\/ balisage porte d\u00e9j\u00e0 l\u2019\u00e9tat final : c\u2019est lui qu\u2019on garde en mouvement r\u00e9duit.\r\n  (function () {\r\n    var each = function (list, fn) { Array.prototype.forEach.call(list, fn); };\r\n    var turn = function (el, cls, on) { el.classList.toggle(cls, !!on); };\r\n    var restart = function (el, cls) { el.classList.remove(cls); void el.offsetWidth; el.classList.add(cls); };\r\n    var scenes = {\r\n      \/\/ 01 \u00b7 Autonomie financi\u00e8re : vos projets tiennent sur un seul pilier et\r\n      \/\/ vacillent ; les fonds europ\u00e9ens, puis les autres ressources, montent sous le\r\n      \/\/ plateau et l\u2019immobilisent. Les mots n\u2019arrivent qu\u2019une fois tout immobile.\r\n      piliers: function (st) {\r\n        var cols = st.querySelectorAll('.pil-col'), slab = st.querySelector('.pil-slab');\r\n        var DROP = 96, REACH = 119, TILT = 6 * Math.PI \/ 180, PERIOD = 2600, raf = 0;\r\n        var side = [cols[0], cols[2]].map(function (col) { return { col: col, p: 1, from: 1, to: 1, t0: 0, d: 1 }; });\r\n        var ease = function (k) { return k < .5 ? 4 * k * k * k : 1 - Math.pow(2 - 2 * k, 3) \/ 2; };\r\n        var move = function (s, to, d) { s.from = s.p; s.to = to; s.t0 = performance.now(); s.d = d; };\r\n        \/\/ Marge de bascule d\u2019un c\u00f4t\u00e9 : pleine quand le pilier est loin, elle se\r\n        \/\/ referme en douceur \u00e0 son approche (tanh x \u2264 x : le plateau ne le traverse pas)\r\n        var room = function (s) { return TILT * Math.tanh(Math.asin(Math.min(1, (1 - s.p) * DROP \/ REACH)) \/ TILT); };\r\n        var draw = function (now) {\r\n          side.forEach(function (s) {\r\n            var k = Math.min(1, (now - s.t0) \/ s.d);\r\n            s.p = s.from + (s.to - s.from) * ease(k);\r\n            s.col.setAttribute('transform', 'translate(0 ' + ((1 - s.p) * DROP).toFixed(2) + ')');\r\n          });\r\n          \/\/ Le plateau se balance autour du pilier central, entre les deux marges :\r\n          \/\/ la bascule se resserre \u00e0 chaque pilier qui monte et s\u2019\u00e9teint avec le dernier\r\n          var L = room(side[0]), R = room(side[1]);\r\n          var a = (R - L) \/ 2 + (R + L) \/ 2 * Math.sin(now \/ PERIOD * 2 * Math.PI);\r\n          slab.setAttribute('transform', 'rotate(' + (a * 180 \/ Math.PI).toFixed(3) + ' 150 44)');\r\n        };\r\n        var loop = function (now) { draw(now); raf = window.requestAnimationFrame(loop); };\r\n        return {\r\n          reset: function () { turn(st, 'is-b', 0); side.forEach(function (s) { s.from = s.to = 0; }); draw(performance.now()); },\r\n          steps: [\r\n            [function () {}, 1600],\r\n            [function () { move(side[0], 1, 1300); }, 1700],\r\n            [function () { move(side[1], 1, 1300); }, 1700],\r\n            [function () { turn(st, 'is-b', 1); }, 4400],\r\n            [function () { turn(st, 'is-b', 0); }, 300],\r\n            [function () { move(side[0], 0, 1000); move(side[1], 0, 1000); }, 1200]\r\n          ],\r\n          \/\/ Le balancement tourne en continu, mais seulement quand la sc\u00e8ne est visible\r\n          run: function (go) { window.cancelAnimationFrame(raf); raf = go ? window.requestAnimationFrame(loop) : 0; }\r\n        };\r\n      },\r\n      \/\/ 02 \u00b7 Dans la dur\u00e9e : un premier dossier s\u2019\u00e9crit \u00e0 deux, SHL en gris, l\u2019\u00e9quipe\r\n      \/\/ en vert, puis il est d\u00e9pos\u00e9. SHL s\u2019\u00e9clipse ; l\u2019\u00e9quipe duplique le mod\u00e8le et\r\n      \/\/ remplit seule, de plus en plus vite, deux nouveaux dossiers. Tout suit une\r\n      \/\/ horloge unique, qui s\u2019arr\u00eate hors \u00e9cran et reprend o\u00f9 elle en \u00e9tait.\r\n      dossiers: function (st) {\r\n        var Y = 10, GRAB = [24, 15], OUT = 14400, LOOP = 15200;\r\n        var LINES = [[10, 28, 52], [10, 39, 44], [10, 50, 52], [10, 61, 30]];\r\n        var lin = function (k) { return k; },\r\n            io = function (k) { return k < .5 ? 4 * k * k * k : 1 - Math.pow(2 - 2 * k, 3) \/ 2; },\r\n            sine = function (k) { return (1 - Math.cos(Math.PI * k)) \/ 2; },\r\n            out = function (k) { return 1 - Math.pow(1 - k, 3); },\r\n            back = function (k) { k -= 1; return 1 + 2.4 * k * k * k + 1.4 * k * k; };\r\n        \/\/ Une piste : des segments [d\u00e9but, fin, de, \u00e0, courbe], rang\u00e9s dans l\u2019ordre du temps\r\n        var track = function (v) { return [[0, 0, v, v, lin]]; };\r\n        var val = function (tr, t) {\r\n          var v = tr[0][2];\r\n          for (var i = 0; i < tr.length && t >= tr[i][0]; i++) {\r\n            var s = tr[i], e = s[4](s[1] > s[0] ? Math.min(1, (t - s[0]) \/ (s[1] - s[0])) : 1);\r\n            v = typeof s[2] === 'number' ? s[2] + (s[3] - s[2]) * e : [s[2][0] + (s[3][0] - s[2][0]) * e, s[2][1] + (s[3][1] - s[2][1]) * e];\r\n          }\r\n          return v;\r\n        };\r\n        var sheets = Array.prototype.map.call(st.querySelectorAll('.dos-sheet'), function (g, k) {\r\n          var x = 14 + 100 * k;\r\n          return { g: g, x: x, fills: g.querySelectorAll('.dos-fill'), ok: g.querySelector('.dos-ok'), lift: g.querySelector('.dos-lift'),\r\n            pos: track([x, Y]), show: track(0), up: track(0), pop: track(0), ink: LINES.map(function () { return track(0); }) };\r\n        });\r\n        var cursor = function (sel, at) { return { el: st.querySelector(sel), at: at, pos: track(at), show: track(0) }; };\r\n        var shl = cursor('.dos-cur.is-shl', [-16, 34]), you = cursor('.dos-cur.is-you', [150, 150]), live = st.querySelector('.dos-live');\r\n        var go = function (c, t0, t1, to, e) { c.pos.push([t0, t1, c.at, to, e || io]); c.at = to; };\r\n        var tip = function (s, i, end) { return [s.x + LINES[i][0] + (end ? LINES[i][2] : 0), Y + LINES[i][1] + 2]; };\r\n        \/\/ Le trait suit la pointe du curseur : m\u00eame dur\u00e9e, m\u00eame courbe\r\n        var write = function (c, s, i, t, d) { go(c, t, t + d, tip(s, i, 1), sine); s.ink[i].push([t, t + d, 0, 1, sine]); return t + d; };\r\n        \/\/ Dupliquer : la copie se d\u00e9tache du dossier mod\u00e8le, suit le curseur, se pose\r\n        var copy = function (from, to, t) {\r\n          go(you, t - 550, t, [from.x + GRAB[0], Y + GRAB[1]]);\r\n          to.pos = [[0, 0, [from.x, Y], [from.x, Y], lin], [t + 180, t + 900, [from.x, Y], [to.x, Y], io]];\r\n          to.show.push([t, t + 260, 0, 1, out]);\r\n          to.up.push([t, t + 220, 0, 1, out], [t + 900, t + 1150, 1, 0, io]);\r\n          go(you, t + 180, t + 900, [to.x + GRAB[0], Y + GRAB[1]]);\r\n          return t + 1150;\r\n        };\r\n        var alone = function (s, t, k) {\r\n          for (var i = 0; i < 4; i++) {\r\n            go(you, t, t + 150 * k, tip(s, i, 0));\r\n            t = write(you, s, i, t + 150 * k, (60 + LINES[i][2] * 6) * k);\r\n          }\r\n          s.pop.push([t + 100, t + 500, 0, 1, back]);\r\n          return t + 500;\r\n        };\r\n        var A = sheets[0], B = sheets[1], C = sheets[2];\r\n        \/\/ Ann\u00e9e 1 : \u00e0 deux, ligne par ligne\r\n        A.show.push([200, 650, 0, 1, out]);\r\n        shl.show.push([400, 700, 0, 1, lin]); you.show.push([550, 850, 0, 1, lin]);\r\n        go(shl, 400, 1150, tip(A, 0, 0)); go(you, 550, 1350, tip(A, 1, 0));\r\n        write(shl, A, 0, 1300, 580);\r\n        go(shl, 1880, 2350, tip(A, 2, 0));\r\n        write(you, A, 1, 1880, 520);\r\n        write(shl, A, 2, 2400, 580);\r\n        go(you, 2400, 2850, tip(A, 3, 0));\r\n        write(you, A, 3, 2980, 400);\r\n        A.pop.push([3500, 3900, 0, 1, back]);\r\n        \/\/ SHL s\u2019\u00e9clipse\r\n        go(shl, 3950, 4850, [-24, -18]); shl.show.push([4150, 4850, 1, 0, lin]);\r\n        \/\/ Ann\u00e9e 2 : l\u2019\u00e9quipe seule, deux fois, de plus en plus vite\r\n        alone(C, copy(B, C, alone(B, copy(A, B, 5300), 1) + 250), .8);\r\n        go(you, 12500, 13100, [276, 100]);\r\n        var P = function (v) { return v.toFixed(2); };\r\n        var draw = function (t) {\r\n          sheets.forEach(function (s) {\r\n            var p = val(s.pos, t), show = val(s.show, t), up = val(s.up, t);\r\n            s.g.setAttribute('transform', 'translate(' + P(p[0] + 36) + ' ' + P(p[1] + 48) + ') scale(' + (.96 + .04 * show + .035 * up).toFixed(4) + ') translate(-36 -48)');\r\n            s.g.style.opacity = show;\r\n            s.lift.style.opacity = up;\r\n            s.ink.forEach(function (tr, i) { s.fills[i].setAttribute('width', P(LINES[i][2] * val(tr, t))); });\r\n            s.ok.setAttribute('transform', 'translate(58 80) scale(' + Math.max(0, val(s.pop, t)).toFixed(4) + ')');\r\n          });\r\n          [shl, you].forEach(function (c) {\r\n            var p = val(c.pos, t);\r\n            c.el.setAttribute('transform', 'translate(' + P(p[0]) + ' ' + P(p[1]) + ')');\r\n            c.el.style.opacity = val(c.show, t);\r\n          });\r\n          live.style.opacity = t < OUT ? 1 : Math.max(0, 1 - (t - OUT) \/ 550);\r\n        };\r\n        var raf = 0, clock = 0, last = 0;\r\n        var frame = function (now) { clock = (clock + Math.min(50, now - last)) % LOOP; last = now; draw(clock); raf = window.requestAnimationFrame(frame); };\r\n        return {\r\n          reset: function () { clock = 0; draw(0); },\r\n          run: function (on) { window.cancelAnimationFrame(raf); raf = on ? (last = performance.now(), window.requestAnimationFrame(frame)) : 0; }\r\n        };\r\n      },\r\n      \/\/ 03 \u00b7 Opportunit\u00e9s : de gauche \u00e0 droite, un fil se trace de l\u2019association vers\r\n      \/\/ chaque drapeau, qui prend ses couleurs \u00e0 l\u2019arriv\u00e9e ; puis tout s\u2019efface\r\n      reseau: function (st) {\r\n        var NS = 'http:\/\/www.w3.org\/2000\/svg';\r\n        var svg = st.querySelector('svg'), core = st.querySelector('.net-core');\r\n        var nodes = Array.prototype.slice.call(st.querySelectorAll('.net-node'));\r\n        var paths = [], dot = null, raf = 0;\r\n        var layout = function () {\r\n          var w = st.clientWidth, h = st.clientHeight;\r\n          if (!w || !h) return;\r\n          var cx = w \/ 2, cy = h - 42, hy = cy - 16;\r\n          var R = Math.max(90, Math.min((w \/ 2 - 34) \/ .906, cy - 46));\r\n          core.style.setProperty('--x', cx + 'px');\r\n          core.style.setProperty('--y', cy + 'px');\r\n          svg.setAttribute('viewBox', '0 0 ' + w + ' ' + h);\r\n          svg.textContent = '';\r\n          [.44, .66, .88].forEach(function (f) {\r\n            var r = R * f, p = document.createElementNS(NS, 'path');\r\n            p.setAttribute('d', 'M' + (cx - r) + ' ' + cy + 'A' + r + ' ' + r + ' 0 0 1 ' + (cx + r) + ' ' + cy);\r\n            p.setAttribute('class', 'net-band');\r\n            p.setAttribute('stroke-width', Math.round(R * .07));\r\n            svg.appendChild(p);\r\n          });\r\n          \/\/ Chaque fil monte droit de l\u2019association, puis s\u2019incline vers son drapeau\r\n          paths = nodes.map(function (node, i) {\r\n            var a = Math.PI * (155 - i * 26) \/ 180, x = cx + R * Math.cos(a), y = cy - R * Math.sin(a), my = (hy + y) \/ 2;\r\n            var p = document.createElementNS(NS, 'path');\r\n            node.style.setProperty('--x', x + 'px');\r\n            node.style.setProperty('--y', y + 'px');\r\n            p.setAttribute('d', 'M' + cx + ' ' + hy + 'C' + cx + ' ' + my + ' ' + x + ' ' + my + ' ' + x + ' ' + y);\r\n            p.setAttribute('class', 'net-line' + (node.classList.contains('is-on') ? ' is-on' : ''));\r\n            p.style.setProperty('--c', getComputedStyle(node).getPropertyValue('--c').trim());\r\n            svg.appendChild(p);\r\n            return p;\r\n          });\r\n          dot = document.createElementNS(NS, 'circle');\r\n          dot.setAttribute('r', 3.5);\r\n          dot.setAttribute('class', 'net-dot');\r\n          svg.appendChild(dot);\r\n        };\r\n        var connect = function (i) {\r\n          var p = paths[i], L = p.getTotalLength(), t0 = performance.now();\r\n          restart(core, 'is-ping');\r\n          p.style.strokeDasharray = L;\r\n          p.style.strokeDashoffset = L;\r\n          p.classList.add('is-on');\r\n          dot.style.setProperty('--c', p.style.getPropertyValue('--c'));\r\n          dot.classList.add('is-on');\r\n          window.cancelAnimationFrame(raf);\r\n          var frame = function (now) {\r\n            var k = Math.min(1, (now - t0) \/ 700), e = k < .5 ? 4 * k * k * k : 1 - Math.pow(2 - 2 * k, 3) \/ 2, pt = p.getPointAtLength(L * e);\r\n            p.style.strokeDashoffset = L * (1 - e);\r\n            dot.setAttribute('cx', pt.x);\r\n            dot.setAttribute('cy', pt.y);\r\n            if (k < 1) raf = window.requestAnimationFrame(frame);\r\n            else { dot.classList.remove('is-on'); nodes[i].classList.add('is-on'); }\r\n          };\r\n          raf = window.requestAnimationFrame(frame);\r\n        };\r\n        var clear = function () {\r\n          st.classList.remove('is-fade');\r\n          nodes.forEach(function (n) { n.classList.remove('is-on'); });\r\n          paths.forEach(function (p) { p.classList.remove('is-on'); p.style.strokeDasharray = p.style.strokeDashoffset = ''; });\r\n        };\r\n        var steps = nodes.map(function (n, i) { return [function () { connect(i); }, 880]; });\r\n        steps.push([function () {}, 2400]);\r\n        steps.push([function () { turn(st, 'is-fade', 1); nodes.forEach(function (n) { n.classList.remove('is-on'); }); }, 800]);\r\n        steps.push([clear, 500]);\r\n        return { layout: layout, reset: function () { clear(); st.classList.add('is-live'); }, steps: steps };\r\n      },\r\n      \/\/ Garanties \u00b7 01 : le compteur monte \u00e0 150 quand la carte appara\u00eet ; les\r\n      \/\/ associations, elles, d\u00e9filent en continu, \u00e0 allure lente et constante,\r\n      \/\/ sans jamais s\u2019arr\u00eater.\r\n      terrain: function (st) {\r\n        var list = st.querySelector('.ros-list'), track = list.parentNode, odo = st.querySelector('[data-odo]');\r\n        var started = false, reels = [], dur = 0, SPEED = 20;\r\n        \/\/ La liste suivie de sa copie : la boucle se referme sans raccord\r\n        track.appendChild(list.cloneNode(true));\r\n        st.querySelector('.ros').classList.add('is-loop');\r\n        \/\/ Compteur \u00e0 rouleaux : chaque chiffre d\u00e9file depuis 0, les unit\u00e9s tournent le plus\r\n        if (odo && !calm) {\r\n          var digits = odo.textContent.trim().split('');\r\n          odo.textContent = '';\r\n          digits.forEach(function (ch, i) {\r\n            var col = document.createElement('span'), reel = document.createElement('span'), ghost = document.createElement('i');\r\n            var n = +ch + 10 * i;\r\n            ghost.textContent = '0';\r\n            col.appendChild(ghost);\r\n            for (var v = 0; v <= n; v++) { var c = document.createElement('span'); c.textContent = v % 10; reel.appendChild(c); }\r\n            col.className = 'odo';\r\n            col.style.setProperty('--od', i * 140 + 'ms');\r\n            col.appendChild(reel);\r\n            odo.appendChild(col);\r\n            reels.push({ col: col, ghost: ghost, ch: ch, reel: reel, n: n });\r\n          });\r\n        }\r\n        \/\/ Largeurs en em : elles suivent la taille du chiffre d\u2019une mise en page \u00e0 l\u2019autre\r\n        var count = function () {\r\n          if (!reels.length) return;\r\n          var fs = parseFloat(getComputedStyle(odo).fontSize);\r\n          reels.forEach(function (r) {\r\n            var w0 = r.col.offsetWidth;\r\n            r.ghost.textContent = r.ch;\r\n            var w1 = r.col.offsetWidth;\r\n            r.col.style.width = w0 \/ fs + 'em';\r\n            void r.col.offsetWidth;\r\n            r.col.style.width = w1 \/ fs + 'em';\r\n            r.reel.style.transform = 'translateY(' + -r.n + 'em)';\r\n          });\r\n        };\r\n        return {\r\n          \/\/ Allure fixe en px\/s, quelle que soit la hauteur de la liste ; on ne la\r\n          \/\/ retouche que si la liste change vraiment, pour ne pas faire sauter le d\u00e9filement\r\n          layout: function () {\r\n            var d = list.offsetHeight \/ SPEED;\r\n            if (Math.abs(d - dur) > 2) { dur = d; track.style.setProperty('--dur', d.toFixed(1) + 's'); }\r\n          },\r\n          reset: function () {},\r\n          run: function (go) {\r\n            if (!go || started) return;\r\n            started = true;\r\n            count();\r\n          }\r\n        };\r\n      },\r\n      \/\/ Garanties \u00b7 02 : l\u2019incubateur au c\u0153ur, ses partenaires rang\u00e9s par famille.\r\n      \/\/ Les fils partent de lui ; puis chaque famille, tour \u00e0 tour, envoie son\r\n      \/\/ signal jusqu\u2019au c\u0153ur, qui bat \u00e0 chaque arriv\u00e9e. En dernier, toutes ensemble.\r\n      \/\/ La barre de l\u2019\u00e9tiquette active sert de minuterie ; le libell\u00e9 du haut dit\r\n      \/\/ la famille et son nombre de partenaires. Un clic sur une famille, un\r\n      \/\/ partenaire ou le c\u0153ur prend la main.\r\n      ancrage: function (st) {\r\n        var NS = 'http:\/\/www.w3.org\/2000\/svg';\r\n        var box = st.querySelector('.anc'), svg = st.querySelector('.anc-wires'), core = st.querySelector('.anc-core');\r\n        var base = svg.querySelector('.anc-base'), live = svg.querySelector('.anc-live');\r\n        var fams = Array.prototype.slice.call(st.querySelectorAll('.anc-fam'));\r\n        var cap = st.querySelector('.sc-cap'), capText = st.querySelector('[data-cap-text]'), counter = st.querySelector('[data-fam-count]');\r\n        var ALL = capText.textContent, F = fams.length + 1, pad = function (n) { return (n < 10 ? '0' : '') + n; };\r\n        var TAIL = 42, D = 1150, links = [], flying = [], raf = 0, f = -1, auto = !calm, started = false, swap = 0;\r\n        var el = function (tag, cls, k) { var e = document.createElementNS(NS, tag); e.setAttribute('class', cls); if (k) e.style.setProperty('--k', k); return e; };\r\n        fams.forEach(function (fam, fi) {\r\n          var k = getComputedStyle(fam).getPropertyValue('--k').trim();\r\n          fam.style.setProperty('--f', fi);\r\n          Array.prototype.forEach.call(fam.querySelectorAll('li'), function (li, j) {\r\n            li.style.setProperty('--j', j);\r\n            var link = { fam: fam, tag: fam.querySelector('.anc-tag'), li: li, k: k, L: 0,\r\n              wire: el('path', 'anc-wire'), comet: el('path', 'anc-comet', k), head: el('circle', 'anc-head', k) };\r\n            link.wire.style.setProperty('--f', fi);\r\n            link.head.setAttribute('r', 3.6);\r\n            link.comet.style.opacity = 0;\r\n            base.appendChild(link.wire);\r\n            live.appendChild(link.comet);\r\n            live.appendChild(link.head);\r\n            links.push(link);\r\n          });\r\n        });\r\n        var P = function (v) { return v.toFixed(1); };\r\n        \/\/ Chaque fil part du partenaire, traverse l\u2019\u00e9tiquette de sa famille et\r\n        \/\/ arrive sur le bord du c\u0153ur, dans l\u2019axe du centre\r\n        \/\/ Positions de mise en page, relatives au r\u00e9seau : les transformations\r\n        \/\/ de l\u2019apparition (d\u00e9calage, \u00e9chelle) ne faussent pas le trac\u00e9\r\n        var rect = function (e) {\r\n          var r = { w: e.offsetWidth, h: e.offsetHeight, x: 0, y: 0 };\r\n          for (; e && e !== box; e = e.offsetParent) { r.x += e.offsetLeft; r.y += e.offsetTop; }\r\n          return r;\r\n        };\r\n        var layout = function () {\r\n          if (!box.offsetWidth) return;\r\n          var c = rect(core), cx = c.x + c.w \/ 2, cy = c.y + c.h \/ 2, R = c.w \/ 2 + 2;\r\n          svg.setAttribute('viewBox', '0 0 ' + box.offsetWidth + ' ' + box.offsetHeight);\r\n          links.forEach(function (k) {\r\n            var r = rect(k.li), t = rect(k.tag);\r\n            var x = r.x, y = r.y + r.h \/ 2, d = 'M' + P(x) + ' ' + P(y);\r\n            if (t.x + t.w < r.x - 4) {\r\n              var tr = t.x + t.w, tl = t.x + 8, ty = t.y + t.h \/ 2, m = (x - tr) \/ 2;\r\n              d += ' C' + P(x - m) + ' ' + P(y) + ' ' + P(tr + m) + ' ' + P(ty) + ' ' + P(tr) + ' ' + P(ty) + ' L' + P(tl) + ' ' + P(ty);\r\n              x = tl; y = ty;\r\n            }\r\n            var an = Math.atan2(y - cy, x - cx), ex = cx + R * Math.cos(an), ey = cy + R * Math.sin(an), m2 = Math.max(12, (x - ex) \/ 2);\r\n            d += ' C' + P(x - m2) + ' ' + P(y) + ' ' + P(ex + m2 * .6 * Math.cos(an)) + ' ' + P(ey + m2 * .6 * Math.sin(an)) + ' ' + P(ex) + ' ' + P(ey);\r\n            k.wire.setAttribute('d', d);\r\n            k.comet.setAttribute('d', d);\r\n            k.L = k.wire.getTotalLength();\r\n            k.wire.style.strokeDasharray = P(k.L) + ' ' + P(k.L);\r\n            k.wire.style.setProperty('--L', P(k.L) + 'px');\r\n            k.comet.style.strokeDasharray = TAIL + ' ' + P(k.L + TAIL * 2);\r\n          });\r\n        };\r\n        var io = function (x) { return x < .5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) \/ 2; };\r\n        \/\/ Un signal : une tra\u00een\u00e9e courte et une t\u00eate lumineuse, du partenaire au c\u0153ur\r\n        var frame = function (now) {\r\n          flying = flying.filter(function (p) {\r\n            var k = p.link, u = (now - p.t0) \/ D;\r\n            if (u < 0) return true;\r\n            if (!p.lit) { p.lit = true; k.li.classList.add('is-ping'); k.comet.style.opacity = 1; }\r\n            var s = io(Math.min(1, u)) * (k.L + TAIL), h = Math.min(s, k.L), pt = k.wire.getPointAtLength(h);\r\n            k.comet.style.strokeDashoffset = P(TAIL - s);\r\n            k.head.setAttribute('cx', P(pt.x));\r\n            k.head.setAttribute('cy', P(pt.y));\r\n            k.head.style.opacity = s < k.L ? Math.min(1, s \/ 20) : Math.max(0, 1 - (s - k.L) \/ TAIL);\r\n            if (!p.hit && s >= k.L) {\r\n              p.hit = true;\r\n              k.li.classList.remove('is-ping');\r\n              core.style.setProperty('--k', k.k);\r\n              core.classList.remove('is-beat'); void core.offsetWidth; core.classList.add('is-beat');\r\n            }\r\n            if (u >= 1) { k.comet.style.opacity = 0; k.head.style.opacity = 0; return false; }\r\n            return true;\r\n          });\r\n          raf = flying.length ? window.requestAnimationFrame(frame) : 0;\r\n        };\r\n        var send = function (link, delay) {\r\n          flying.push({ link: link, t0: performance.now() + delay });\r\n          if (!raf) raf = window.requestAnimationFrame(frame);\r\n        };\r\n        var stop = function () {\r\n          window.cancelAnimationFrame(raf); raf = 0; flying = [];\r\n          links.forEach(function (k) { k.comet.style.opacity = 0; k.head.style.opacity = 0; k.li.classList.remove('is-ping'); });\r\n        };\r\n        var bars = fams.map(function (fam) { return fam.querySelector('.sc-timer'); });\r\n        \/\/ Le libell\u00e9 change en fondu, comme celui de la sc\u00e8ne des formats\r\n        var caption = function (text, fam) {\r\n          var st2 = fam ? getComputedStyle(fam) : null;\r\n          cap.style.setProperty('--k', st2 ? st2.getPropertyValue('--k') : '');\r\n          cap.style.setProperty('--kx', st2 ? st2.getPropertyValue('--kx') : '');\r\n          if (capText.textContent === text) return;\r\n          window.clearTimeout(swap);\r\n          capText.classList.add('is-swap');\r\n          swap = window.setTimeout(function () { capText.textContent = text; capText.classList.remove('is-swap'); }, 250);\r\n        };\r\n        \/\/ Publics, europ\u00e9ens, priv\u00e9s, puis tout le r\u00e9seau \u00e0 la fois\r\n        var show = function (n) {\r\n          f = n;\r\n          var all = f === fams.length;\r\n          st.classList.toggle('has-focus', !all);\r\n          fams.forEach(function (fam, i) {\r\n            var on = all || i === f;\r\n            fam.classList.toggle('is-on', on);\r\n            bars[i].classList.remove('is-run');\r\n            void bars[i].offsetWidth;\r\n            if (on && auto) bars[i].classList.add('is-run');\r\n          });\r\n          caption(all ? ALL : fams[f].dataset.cap, all ? null : fams[f]);\r\n          counter.textContent = pad(f + 1) + ' \/ ' + pad(F);\r\n          links.forEach(function (k, i) {\r\n            if (all) send(k, i * 90);\r\n            else if (k.fam === fams[f]) send(k, k.li.style.getPropertyValue('--j') * 200);\r\n          });\r\n        };\r\n        bars.forEach(function (b, i) { b.addEventListener('animationend', function () { if (auto && (f === i || (f === fams.length && i === 0))) show((f + 1) % F); }); });\r\n        var take = function (n) { auto = false; st.classList.remove('is-auto'); show(n); };\r\n        fams.forEach(function (fam, i) {\r\n          fam.querySelector('.anc-tag').addEventListener('click', function () { take(i); });\r\n          Array.prototype.forEach.call(fam.querySelectorAll('li'), function (li) { li.addEventListener('click', function () { take(i); }); });\r\n        });\r\n        core.addEventListener('click', function () { take(fams.length); });\r\n        return {\r\n          layout: layout,\r\n          reset: function () {\r\n            stop();\r\n            f = -1;\r\n            st.classList.remove('is-built', 'has-focus');\r\n            st.classList.add('is-pre', 'is-auto');\r\n            fams.forEach(function (fam) { fam.classList.remove('is-on'); });\r\n          },\r\n          \/\/ Les fils se tracent \u00e0 la premi\u00e8re apparition, puis le cycle d\u00e9marre\r\n          run: function (go) {\r\n            st.classList.toggle('is-hold', !go);\r\n            if (!go) { stop(); return; }\r\n            if (started) return;\r\n            started = true;\r\n            st.classList.remove('is-pre');\r\n            window.setTimeout(function () { st.classList.add('is-built'); }, 1800);\r\n            window.setTimeout(function () { if (auto && f < 0) show(0); }, 2000);\r\n          }\r\n        };\r\n      },\r\n      \/\/ Garanties \u00b7 03 : quatre comp\u00e9tences, quatre cl\u00e9s. Elles partent de chez nous\r\n      \/\/ une \u00e0 une et se posent chez votre \u00e9quipe ; la jauge d\u2019autonomie monte d\u2019un\r\n      \/\/ quart \u00e0 chaque passage. \u00c0 la fin, nous nous retirons ; puis tout recommence.\r\n      \/\/ La cl\u00e9 suivante se charge (sa barre sert de minuterie) avant de partir,\r\n      \/\/ et le bilan final tient le temps de sa propre barre : pause au survol.\r\n      transfert: function (st) {\r\n        var rows = Array.prototype.slice.call(st.querySelectorAll('.tra-row'));\r\n        var pct = st.querySelector('[data-pct]'), raf = 0, shown = 100;\r\n        var layout = function () {\r\n          rows.forEach(function (row) { row.style.setProperty('--dx', row.clientWidth - row.querySelector('.tra-key').offsetWidth + 'px'); });\r\n        };\r\n        var label = function (v) { pct.textContent = Math.round(v) + '\u00a0%'; };\r\n        \/\/ Le pourcentage compte au rythme de la jauge\r\n        var count = function (to) {\r\n          var from = shown, t0 = performance.now();\r\n          shown = to;\r\n          st.style.setProperty('--p', to \/ 100);\r\n          window.cancelAnimationFrame(raf);\r\n          var tick = function (now) {\r\n            var u = Math.min(1, (now - t0) \/ 800);\r\n            label(from + (to - from) * (1 - Math.pow(1 - u, 3)));\r\n            if (u < 1) raf = window.requestAnimationFrame(tick);\r\n          };\r\n          raf = window.requestAnimationFrame(tick);\r\n        };\r\n        var reset = function () {\r\n          window.cancelAnimationFrame(raf);\r\n          st.classList.remove('is-done', 'is-fade');\r\n          rows.forEach(function (row) {\r\n            row.classList.add('no-tr');\r\n            row.classList.remove('is-moved', 'is-yours', 'is-flying', 'is-next');\r\n            void row.offsetWidth;\r\n            row.classList.remove('no-tr');\r\n          });\r\n          shown = 0;\r\n          st.style.setProperty('--p', 0);\r\n          label(0);\r\n        };\r\n        var note = st.querySelector('.tra-note .sc-timer'), started = false;\r\n        var run = function (bar) { bar.classList.remove('is-run'); void bar.offsetWidth; bar.classList.add('is-run'); };\r\n        var charge = function (i) { rows[i].classList.add('is-next'); run(rows[i].querySelector('.sc-timer')); };\r\n        \/\/ Charg\u00e9e, la cl\u00e9 part ; pos\u00e9e, la jauge monte ; puis la suivante se charge\r\n        rows.forEach(function (row, i) {\r\n          row.querySelector('.sc-timer').addEventListener('animationend', function () {\r\n            this.classList.remove('is-run');\r\n            row.classList.remove('is-next');\r\n            row.classList.add('is-moved', 'is-flying');\r\n            window.setTimeout(function () {\r\n              row.classList.remove('is-flying');\r\n              row.classList.add('is-yours');\r\n              count((i + 1) \/ rows.length * 100);\r\n              window.setTimeout(function () {\r\n                if (i + 1 < rows.length) charge(i + 1);\r\n                else { st.classList.add('is-done'); run(note); }\r\n              }, 420);\r\n            }, 1000);\r\n          });\r\n        });\r\n        note.addEventListener('animationend', function () {\r\n          note.classList.remove('is-run');\r\n          st.classList.add('is-fade');\r\n          window.setTimeout(function () {\r\n            reset();\r\n            window.setTimeout(function () { charge(0); }, 500);\r\n          }, 500);\r\n        });\r\n        return {\r\n          layout: layout,\r\n          reset: function () { reset(); st.classList.add('is-auto'); },\r\n          run: function (go) {\r\n            st.classList.toggle('is-hold', !go);\r\n            if (!go || started) return;\r\n            started = true;\r\n            window.setTimeout(function () { charge(0); }, 500);\r\n          }\r\n        };\r\n      },\r\n      \/\/ 06 \u00b7 Ce que nous concevons : une t\u00eate de lecture traverse le calendrier du\r\n      \/\/ parcours, chaque s\u00e9ance para\u00eet \u00e0 son passage (le CSS lit --p). \u00ab D\u00e9p\u00f4t des\r\n      \/\/ dossiers \u00bb ne s\u2019\u00e9crit qu\u2019une fois la t\u00eate arr\u00eat\u00e9e.\r\n      parcours: function (st) {\r\n        var DUR = 5200, p = 1, t0 = 0, raf = 0, going = false, live = false, endWait = false;\r\n        var ease = function (x) { return x < .5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) \/ 2; };\r\n        var set = function () { st.style.setProperty('--p', ease(p).toFixed(4)); };\r\n        var frame = function (now) {\r\n          if (!t0) t0 = now - p * DUR;\r\n          p = Math.min(1, (now - t0) \/ DUR);\r\n          set();\r\n          if (p < 1 && going) { raf = window.requestAnimationFrame(frame); return; }\r\n          raf = 0;\r\n          if (p >= 1) { live = false; if (endWait) { endWait = false; turn(st, 'is-end', 1); } }\r\n        };\r\n        var play = function () { t0 = 0; if (going && !raf) raf = window.requestAnimationFrame(frame); };\r\n        var reset = function () {\r\n          window.cancelAnimationFrame(raf); raf = 0; live = endWait = false; p = 0; set();\r\n          turn(st, 'is-end', 0); turn(st, 'is-out', 0);\r\n        };\r\n        return {\r\n          reset: reset,\r\n          run: function (go) {\r\n            going = go;\r\n            if (go && live) play();\r\n            else if (!go && raf) { window.cancelAnimationFrame(raf); raf = 0; }\r\n          },\r\n          steps: [\r\n            [function () { reset(); live = true; play(); }, DUR + 250],\r\n            [function () { if (p >= 1) turn(st, 'is-end', 1); else endWait = true; }, 3400],\r\n            [function () { turn(st, 'is-out', 1); }, 650],\r\n            [reset, 450]\r\n          ]\r\n        };\r\n      },\r\n      \/\/ 06 \u00b7 Ce que vous pilotez : les candidatures arrivent, une partie est\r\n      \/\/ retenue, les dossiers sont d\u00e9pos\u00e9s, puis les financements obtenus. Chaque\r\n      \/\/ entr\u00e9e de la l\u00e9gende s\u2019allume une fois son \u00e9tape pos\u00e9e.\r\n      pilotage: function (st) {\r\n        var kpi = st.querySelector('.kpi'), keys = st.querySelectorAll('.kpi-key li');\r\n        var key = function (n) { each(keys, function (li, k) { turn(li, 'is-on', k < n); }); };\r\n        var reset = function () { ['is-cand', 'is-sel', 'is-dep', 'is-fin', 'is-out'].forEach(function (c) { turn(kpi, c, 0); }); key(0); };\r\n        return {\r\n          reset: reset,\r\n          steps: [\r\n            [function () { turn(kpi, 'is-cand', 1); }, 1500],\r\n            [function () { key(1); turn(kpi, 'is-sel', 1); }, 1400],\r\n            [function () { turn(kpi, 'is-dep', 1); }, 1300],\r\n            [function () { key(2); turn(kpi, 'is-fin', 1); }, 1200],\r\n            [function () { key(3); }, 3400],\r\n            [function () { turn(kpi, 'is-out', 1); }, 600],\r\n            [reset, 450]\r\n          ]\r\n        };\r\n      },\r\n    };\r\n    each(document.getElementById('shl-accueil').querySelectorAll('[data-scene]'), function (st) {\r\n      var make = scenes[st.dataset.scene];\r\n      if (!make) return;\r\n      var sc = make(st);\r\n      if (sc.layout) {\r\n        sc.layout();\r\n        if ('ResizeObserver' in window) new ResizeObserver(sc.layout).observe(st); else window.addEventListener('resize', sc.layout);\r\n        if (document.fonts && document.fonts.ready) document.fonts.ready.then(sc.layout);\r\n      }\r\n      if (calm) return;\r\n      sc.reset();\r\n      \/\/ La sc\u00e8ne ne tourne que visible, onglet au premier plan ; elle reprend o\u00f9 elle s\u2019\u00e9tait arr\u00eat\u00e9e\r\n      var i = 0, timer = 0, seen = false;\r\n      var tick = function () {\r\n        var s = sc.steps[i];\r\n        i = (i + 1) % sc.steps.length;\r\n        s[0]();\r\n        timer = window.setTimeout(tick, s[1]);\r\n      };\r\n      var sync = function () {\r\n        var go = seen && !document.hidden;\r\n        if (sc.run) sc.run(go);\r\n        if (go && !timer && sc.steps) timer = window.setTimeout(tick, 700);\r\n        else if (!go && timer) { window.clearTimeout(timer); timer = 0; }\r\n      };\r\n      if ('IntersectionObserver' in window) new IntersectionObserver(function (en) { seen = en[0].isIntersecting; sync(); }, { threshold: .35 }).observe(st);\r\n      else seen = true;\r\n      document.addEventListener('visibilitychange', sync);\r\n      sync();\r\n    });\r\n  })();\r\n  \/* ---------------- M\u00e9thode : rail et \u00e9tape active ---------------- *\/\r\n  var method = document.getElementById('shl-accueil').querySelector('[data-method]');\r\n  var steps = Array.prototype.slice.call(method.querySelectorAll('.step'));\r\n  var railItems = Array.prototype.slice.call(method.querySelectorAll('.rail li'));\r\n  var railFill = method.querySelector('[data-rail-fill]');\r\n  var stepsBox = method.querySelector('.steps');\r\n  var setActive = function (idx) {\r\n    steps.forEach(function (s, i) { s.classList.toggle('is-active', i === idx); });\r\n    railItems.forEach(function (li, i) { li.classList.toggle('is-active', i === idx); li.classList.toggle('is-past', i < idx); });\r\n  };\r\n  var methodTick = 0;\r\n  var updateMethod = function () {\r\n    methodTick = 0;\r\n    \/\/ Aucune \u00e9tape active tant que la premi\u00e8re n\u2019entre pas dans l\u2019\u00e9cran : ses traits se remplissent sous les yeux\r\n    var mid = window.innerHeight * 0.5, idx = steps[0].getBoundingClientRect().top < window.innerHeight * 0.85 ? 0 : -1;\r\n    steps.forEach(function (s, i) { if (s.getBoundingClientRect().top < mid) idx = i; });\r\n    setActive(idx);\r\n    var r = stepsBox.getBoundingClientRect();\r\n    var p = Math.max(0, Math.min(1, (mid - r.top) \/ Math.max(1, r.height - 120)));\r\n    railFill.style.transform = 'scaleY(' + p.toFixed(4) + ')';\r\n  };\r\n  method.classList.add('is-live');\r\n  updateMethod();\r\n  window.addEventListener('scroll', function () { if (!methodTick) methodTick = requestAnimationFrame(updateMethod); }, { passive: true });\r\n  window.addEventListener('resize', updateMethod);\r\n  \/* ---------------- Logos : une image absente ne casse pas la mise en page ---------------- *\/\r\n  \/\/ Dans le bandeau, son double de l\u2019autre rang\u00e9e dispara\u00eet aussi : chaque rang\u00e9e d\u00e9file\r\n  \/\/ de sa propre largeur, elles doivent rester \u00e9gales pour ne pas se chevaucher.\r\n  Array.prototype.forEach.call(document.getElementById('shl-accueil').querySelectorAll('.logos img, .pub-logo img'), function (img) {\r\n    var gone = function () {\r\n      var set = img.parentNode, i = Array.prototype.indexOf.call(set.children, img);\r\n      img.classList.add('is-missing');\r\n      if (set.classList.contains('logos-set')) Array.prototype.forEach.call(set.parentNode.children, function (s) { if (s.children[i]) s.children[i].classList.add('is-missing'); });\r\n    };\r\n    if (img.complete && img.getAttribute('src') && !img.naturalWidth) gone();\r\n    else img.addEventListener('error', gone);\r\n  });\r\n  \/* ---------------- Projets : les ponts ---------------- *\/\r\n  \/\/ Les arcs partent du logo de l\u2019association vers chaque partenaire ; ils sont\r\n  \/\/ calcul\u00e9s sur la place r\u00e9elle des pastilles, puis la sc\u00e8ne se joue \u00e0 l\u2019\u00e9cran\r\n  \/\/ (et se rejoue au survol de la carte).\r\n  (function () {\r\n    var scenes = Array.prototype.slice.call(document.getElementById('shl-accueil').querySelectorAll('[data-duo]'));\r\n    if (!scenes.length) return;\r\n    var NS = 'http:\/\/www.w3.org\/2000\/svg';\r\n    var build = function (sc) {\r\n      var r = sc.getBoundingClientRect();\r\n      if (!r.width) return;\r\n      var svg = sc.querySelector('.duo-arc'), fan = sc.dataset.duo === 'fan';\r\n      var h = sc.querySelector('.duo-home').getBoundingClientRect(), A = [h.right - r.left - 2, h.top - r.top + h.height \/ 2];\r\n      svg.setAttribute('viewBox', '0 0 ' + r.width + ' ' + r.height);\r\n      svg.textContent = '';\r\n      Array.prototype.forEach.call(sc.querySelectorAll('.duo-node'), function (n, i) {\r\n        var b = n.getBoundingClientRect(), B = [b.left - r.left + b.width \/ 2, b.top - r.top + b.height \/ 2];\r\n        var dx = B[0] - A[0], down = B[1] > A[1] + 12;\r\n        var C = [(A[0] + B[0]) \/ 2, down ? Math.max(A[1], B[1]) + dx * (fan ? .1 : .22) : Math.min(A[1], B[1]) - dx * (fan ? .18 : .34)];\r\n        var d = 'M' + A[0] + ' ' + A[1] + 'Q' + C[0] + ' ' + C[1] + ' ' + B[0] + ' ' + B[1];\r\n        ['duo-track', 'duo-line', 'duo-spark'].forEach(function (cls) {\r\n          var p = document.createElementNS(NS, 'path');\r\n          p.setAttribute('d', d); p.setAttribute('class', cls);\r\n          if (cls !== 'duo-track') p.setAttribute('pathLength', '1');\r\n          p.style.setProperty('--dl', i * .18 + 's');\r\n          svg.appendChild(p);\r\n        });\r\n        n.style.setProperty('--dl', i * .18 + 's');\r\n      });\r\n    };\r\n    var play = function (sc) { sc.classList.remove('is-play'); void sc.offsetWidth; sc.classList.add('is-play'); sc.dataset.at = Date.now(); };\r\n    scenes.forEach(function (sc) {\r\n      build(sc);\r\n      if ('ResizeObserver' in window) new ResizeObserver(function () { build(sc); }).observe(sc);\r\n      sc.closest('.project').addEventListener('mouseenter', function () {\r\n        if (!calm && sc.classList.contains('is-play') && Date.now() - sc.dataset.at > 2600) play(sc);\r\n      });\r\n    });\r\n    if (calm) { scenes.forEach(function (sc) { sc.classList.add('is-play'); }); return; }\r\n    onView(scenes, function (sc) {\r\n      var d = parseInt(sc.closest('.project').style.getPropertyValue('--d') || '0', 10);\r\n      window.setTimeout(function () { play(sc); }, 280 + d * 2);\r\n    }, { rootMargin: '0px 0px -16% 0px' });\r\n  })();\r\n  \/* ---------------- Ressourcerie : la pile des ressources ---------------- *\/\r\n  \/\/ Les quatre ressources de l\u2019e-hub, en fiches empil\u00e9es. Celle de devant se remplit : le\r\n  \/\/ point gravit la courbe du parcours, le budget s\u2019additionne poste par poste, un nouvel\r\n  \/\/ appel arrive dans la veille, la matrice du cadre logique se compl\u00e8te. Puis elle passe\r\n  \/\/ derri\u00e8re la pile et la suivante avance. Les mots s\u2019\u00e9teignent avant que la pile bouge et\r\n  \/\/ ne reviennent qu\u2019une fois elle immobile. Le balisage porte l\u2019\u00e9tat final, qu\u2019on garde\r\n  \/\/ en mouvement r\u00e9duit ; la l\u00e9gende permet d\u2019appeler une fiche.\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-res]');\r\n    if (!box) return;\r\n    onView([box], function (el) { el.classList.add('is-in'); }, { rootMargin: '0px 0px -25% 0px' });\r\n    var each = function (list, fn) { Array.prototype.forEach.call(list, fn); };\r\n    var cards = Array.prototype.slice.call(box.querySelectorAll('.res-card'));\r\n    var keys = Array.prototype.slice.call(box.querySelectorAll('.res-key span'));\r\n    var n = cards.length, front = 0, timers = [], raf = 0, seen = false, live = false;\r\n    var later = function (fn, ms) { timers.push(window.setTimeout(fn, ms)); };\r\n    var place = function () {\r\n      cards.forEach(function (c, i) { c.style.setProperty('--p', (i - front + n) % n); c.classList.toggle('is-front', i === front); });\r\n      keys.forEach(function (k, i) { k.classList.toggle('is-on', i === front); });\r\n    };\r\n    var kinds = {\r\n      parcours: function (card) {\r\n        var art = card.querySelector('.par-art'), trail = art.querySelector('.par-trail');\r\n        var dot = art.querySelector('.par-dot'), halo = art.querySelector('.par-halo'), reveal = art.querySelector('.par-reveal');\r\n        var nodes = art.querySelectorAll('.par-nodes circle'), drops = art.querySelectorAll('.par-drops path'), caps = card.querySelectorAll('.par-caps li');\r\n        var total = trail.getTotalLength(), at = [];\r\n        \/\/ Longueur du trac\u00e9 au droit de chaque module\r\n        each(nodes, function (nd) {\r\n          var x = +nd.getAttribute('cx'), lo = 0, hi = total;\r\n          for (var k = 0; k < 22; k++) { var m = (lo + hi) \/ 2; if (trail.getPointAtLength(m).x < x) lo = m; else hi = m; }\r\n          at.push(hi);\r\n        });\r\n        var set = function (len) {\r\n          var pt = trail.getPointAtLength(len);\r\n          trail.style.strokeDashoffset = String(1 - len \/ total);\r\n          dot.setAttribute('cx', pt.x); dot.setAttribute('cy', pt.y);\r\n          halo.setAttribute('cx', pt.x); halo.setAttribute('cy', pt.y);\r\n          reveal.setAttribute('width', pt.x);\r\n        };\r\n        var mark = function (k, on) { nodes[k].classList.toggle('is-on', on); drops[k].classList.toggle('is-on', on); caps[k].classList.toggle('is-on', on); };\r\n        \/\/ Le point ralentit \u00e0 chaque module sans jamais s\u2019arr\u00eater net\r\n        var soft = function (v) { var io = v < .5 ? 4 * v * v * v : 1 - Math.pow(-2 * v + 2, 3) \/ 2; return .3 * v + .7 * io; };\r\n        var SEG = 820;\r\n        return {\r\n          reset: function () { set(0); for (var k = 0; k < nodes.length; k++) mark(k, k === 0); },\r\n          play: function () {\r\n            var t0 = 0, done = 0, segs = nodes.length - 1;\r\n            var step = function (now) {\r\n              if (!t0) t0 = now;\r\n              var u = Math.min(1, (now - t0) \/ (SEG * segs)), s = u * segs, k = Math.min(segs - 1, Math.floor(s));\r\n              set(at[k] + (at[k + 1] - at[k]) * soft(s - k));\r\n              var reached = u >= 1 ? segs : (s - k > .94 ? k + 1 : k);\r\n              while (done < reached) mark(++done, true);\r\n              raf = u < 1 ? window.requestAnimationFrame(step) : 0;\r\n            };\r\n            raf = window.requestAnimationFrame(step);\r\n            return SEG * segs;\r\n          }\r\n        };\r\n      },\r\n      budget: function (card) {\r\n        var body = card.querySelector('.bud'), hl = body.querySelector('.bud-hl'), rows = body.querySelectorAll('.bud-row:not(.bud-th)');\r\n        var to = function (row) { hl.style.transform = 'translateY(' + (row.offsetTop + (row.offsetHeight - hl.offsetHeight) \/ 2) + 'px)'; };\r\n        var GAP = 480;\r\n        return {\r\n          reset: function () { body.classList.remove('is-hl'); each(rows, function (r) { r.classList.remove('is-on'); }); to(rows[0]); },\r\n          play: function () {\r\n            body.classList.add('is-hl');\r\n            each(rows, function (r, i) {\r\n              later(function () { to(r); }, i * GAP);\r\n              later(function () { r.classList.add('is-on'); }, i * GAP + 280);\r\n            });\r\n            return rows.length * GAP + 300;\r\n          }\r\n        };\r\n      },\r\n      veille: function (card) {\r\n        var list = card.querySelector('.vei');\r\n        return {\r\n          reset: function () { list.classList.remove('is-played'); },\r\n          play: function () { later(function () { list.classList.add('is-played'); }, 450); return 1900; }\r\n        };\r\n      },\r\n      cadre: function (card) {\r\n        var cells = card.querySelectorAll('.cad-c'), GAP = 150;\r\n        return {\r\n          reset: function () { each(cells, function (c) { c.classList.remove('is-on', 'is-hl'); }); },\r\n          play: function () {\r\n            \/\/ sur mobile, la colonne des hypoth\u00e8ses est masqu\u00e9e : on ne parcourt que les cases visibles\r\n            var shown = Array.prototype.filter.call(cells, function (c) { if (!c.offsetParent) c.classList.add('is-on'); return !!c.offsetParent; });\r\n            each(shown, function (c, i) {\r\n              later(function () { c.classList.add('is-on', 'is-hl'); }, i * GAP);\r\n              later(function () { c.classList.remove('is-hl'); }, i * GAP + 520);\r\n            });\r\n            return shown.length * GAP + 520;\r\n          }\r\n        };\r\n      }\r\n    };\r\n    var ctl = cards.map(function (c) { return kinds[c.dataset.kind](c); });\r\n    \/\/ La l\u00e9gende appelle une fiche : imm\u00e9diatement en mouvement r\u00e9duit, sinon par la pile\r\n    var go = function () {};\r\n    keys.forEach(function (k, i) {\r\n      k.addEventListener('click', function () {\r\n        if (i === front) return;\r\n        if (calm) { front = i; place(); return; }\r\n        if (!live) return;\r\n        timers.forEach(window.clearTimeout); timers = [];\r\n        window.cancelAnimationFrame(raf); raf = 0;\r\n        cards.forEach(function (c) { c.classList.remove('is-out', 'is-snap'); });\r\n        go(i);\r\n      });\r\n    });\r\n    place();\r\n    if (calm) return;\r\n    var HOLD = 2400;\r\n    \/\/ La fiche de devant se remplit, une fois la pile immobile et ses mots revenus\r\n    var show = function () {\r\n      var c = cards[front], k = ctl[front];\r\n      k.reset();\r\n      later(function () {\r\n        c.classList.add('is-shown');\r\n        later(function () { later(next, k.play() + HOLD); }, 620);\r\n      }, 420);\r\n    };\r\n    \/\/ Ses mots s\u2019\u00e9teignent, elle glisse et s\u2019efface, les autres avancent d\u2019un rang ; elle\r\n    \/\/ revient en fondu \u00e0 sa nouvelle place, derri\u00e8re\r\n    go = function (to) {\r\n      var c = cards[front];\r\n      c.classList.remove('is-shown');\r\n      later(function () {\r\n        front = to; place();\r\n        c.classList.add('is-out', 'is-front');\r\n        later(function () {\r\n          c.classList.add('is-snap'); c.classList.remove('is-out', 'is-front');\r\n          void c.offsetWidth;\r\n          c.classList.remove('is-snap');\r\n        }, 580);\r\n        show();\r\n      }, 180);\r\n    };\r\n    var next = function () { go((front + 1) % n); };\r\n    box.classList.add('is-auto');\r\n    ctl.forEach(function (k) { k.reset(); });\r\n    place();\r\n    \/\/ Hors de l\u2019\u00e9cran ou onglet cach\u00e9, tout s\u2019arr\u00eate ; la fiche de devant reprendra du d\u00e9but\r\n    var sync = function () {\r\n      var on = seen && !document.hidden;\r\n      if (on === live) return;\r\n      live = on;\r\n      if (on) { later(show, 300); return; }\r\n      timers.forEach(window.clearTimeout); timers = [];\r\n      window.cancelAnimationFrame(raf); raf = 0;\r\n      cards.forEach(function (c) { c.classList.remove('is-shown', 'is-out', 'is-snap'); });\r\n    };\r\n    if ('IntersectionObserver' in window) new IntersectionObserver(function (en) { seen = en[0].isIntersecting; sync(); }, { threshold: .35 }).observe(box);\r\n    else seen = true;\r\n    document.addEventListener('visibilitychange', sync);\r\n    sync();\r\n  })();\r\n  \/* ---------------- T\u00e9moignages : le lecteur des capsules ----------------\r\n     Un clic sur la liste choisit la capsule et la lance ; la vid\u00e9o YouTube\r\n     (mode sans cookies) ne se charge qu\u2019\u00e0 ce moment-l\u00e0. *\/\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-vids]');\r\n    var frame = box.querySelector('[data-vid-frame]'), poster = box.querySelector('[data-vid-poster]'), play = box.querySelector('[data-vid-play]');\r\n    var items = Array.prototype.slice.call(box.querySelectorAll('.vid-item'));\r\n    var cur = items[0];\r\n    var label = function () { play.setAttribute('aria-label', tr('Lire la vid\u00e9o : ') + cur.querySelector('b').textContent); };\r\n    var start = function () {\r\n      var f = frame.querySelector('iframe');\r\n      if (!f) {\r\n        f = document.createElement('iframe');\r\n        f.allow = 'autoplay; fullscreen; picture-in-picture; encrypted-media';\r\n        f.allowFullscreen = true;\r\n        frame.appendChild(f);\r\n      }\r\n      f.title = cur.querySelector('b').textContent;\r\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + cur.getAttribute('data-vid') + '?autoplay=1&rel=0&playsinline=1&hl=' + LANG;\r\n      frame.classList.add('is-playing');\r\n    };\r\n    var choose = function (it) {\r\n      cur = it;\r\n      items.forEach(function (b) { var on = b === it; b.classList.toggle('is-on', on); b.setAttribute('aria-pressed', String(on)); });\r\n      poster.src = 'https:\/\/i.ytimg.com\/vi\/' + it.getAttribute('data-vid') + '\/maxresdefault.jpg';\r\n      box.querySelector('[data-vid-title]').textContent = it.querySelector('b').textContent;\r\n      box.querySelector('[data-vid-sub]').textContent = it.querySelector('.vid-meta span').textContent;\r\n      box.querySelector('[data-vid-dur]').textContent = it.querySelector('.vid-dur').textContent;\r\n      label();\r\n    };\r\n    label();\r\n    play.addEventListener('click', start);\r\n    items.forEach(function (it) {\r\n      it.addEventListener('click', function () {\r\n        choose(it); start();\r\n        \/\/ Sur t\u00e9l\u00e9phone, la liste est sous le lecteur : on y remonte\r\n        var r = frame.getBoundingClientRect();\r\n        if (r.top < 0 || r.bottom > window.innerHeight) frame.scrollIntoView({ behavior: calm ? 'auto' : 'smooth', block: 'center' });\r\n      });\r\n    });\r\n  })();\r\n  \/* ---------------- Formulaire (maquette) ---------------- *\/\r\n  var form = document.getElementById('shl-accueil').querySelector('[data-form]');\r\n  form.addEventListener('submit', function (e) {\r\n    e.preventDefault();\r\n    form.querySelector('[data-form-note]').textContent = tr('Maquette : l\u2019envoi sera branch\u00e9 sur le formulaire du site.');\r\n  });\r\n  \/* ---------------- H\u00e9ros : trois rives, deux ponts de fils ---------------- *\/\r\n  \/\/ Dix fils aux teintes des th\u00e9matiques, torsad\u00e9s en deux arches : des\r\n  \/\/ associations de terrain aux financements europ\u00e9ens, puis \u00e0 l\u2019innovation\r\n  \/\/ sociale. La torsade tourne lentement et semble couler dans le sens de la\r\n  \/\/ phrase, comme les perles ; les arches penchent vers le pointeur et les\r\n  \/\/ fils s\u2019\u00e9cartent \u00e0 son aplomb. Les trois l\u00e9gendes se\r\n  \/\/ posent une fois le mouvement fini.\r\n  \/\/ Le dessin vaut pour n\u2019importe quelle bo\u00eete : l\u2019ouverture s\u2019en sert aussi,\r\n  \/\/ en petit au centre de l\u2019\u00e9cran, avant de le passer au h\u00e9ros.\r\n  var TONES = ['#c86a5e', '#b25f35', '#bd9035', '#8d9b4e', '#55926f', '#6d9b93', '#4b8296', '#45508a', '#8480be', '#92557c'];\r\n  var clamp01 = function (v) { return v < 0 ? 0 : v > 1 ? 1 : v; };\r\n  \/\/ La pousse du pont : les deux arches \u00e0 la m\u00eame allure, d\u00e9part et arriv\u00e9e en douceur\r\n  var easeGrow = function (p) { return (1 - Math.cos(Math.PI * p)) \/ 2; };\r\n  \/\/ o : la bo\u00eete (x, y, w, h), la pousse (grow, 0 \u00e0 1), l\u2019\u00e9cart des fils (amp),\r\n  \/\/ la rotation (spin), le penchant du pointeur (lx, ly, .5 au repos), l\u2019\u00e9cart\r\n  \/\/ des fils sous le pointeur (part, 0 \u00e0 1) et le temps \u00e9coul\u00e9 depuis le d\u00e9part\r\n  \/\/ des perles (beads, n\u00e9gatif : pas de perles) ; ceil, la marge \u00e0 garder sous\r\n  \/\/ le haut de la bo\u00eete quand elle coupe le dessin ; vib, la vibration de chaque\r\n  \/\/ arche (fondamental et harmonique, en px) ; hot, l\u2019\u00e9clat de chaque pile (0 \u00e0 1) ;\r\n  \/\/ fade, l\u2019opacit\u00e9 des fils de chaque arche.\r\n  \/\/ Rend les deux arches, pour que le h\u00e9ros sache o\u00f9 passe le pointeur\r\n  var paintBridge = (function () {\r\n    \/\/ Les trois rives, en fraction de la bo\u00eete : terrain, financements, innovation,\r\n    \/\/ sur un tablier plat ; chaque pile prend la teinte de sa rive\r\n    var BANKS = [[0, .94], [.5, .94], [1, .94]], LIFT = 1.08;\r\n    var PIERS = ['#af564b', '#43778b', '#437c5d'];\r\n    var S = 64, P = new Float32Array((S + 1) * 2), NV = new Float32Array((S + 1) * 2), AW = new Float32Array(S + 1);\r\n    var cub = function (u, a, b, c, d) { var v = 1 - u; return v * v * v * a + 3 * v * v * u * b + 3 * v * u * u * c + u * u * u * d; };\r\n    var dcub = function (u, a, b, c, d) { var v = 1 - u; return 3 * v * v * (b - a) + 6 * v * u * (c - b) + 3 * u * u * (d - c); };\r\n    var env = function (u) { return Math.pow(Math.abs(Math.sin(Math.PI * u)), .9); };\r\n    \/\/ Une perle franchit une arche en 3,2 s : elle d\u00e9colle d\u2019une pile, file au\r\n    \/\/ sommet et ralentit pour se poser sur la suivante\r\n    var LAP = 6400, glide = function (p) { return p - .7 * Math.sin(6.2832 * p) \/ 6.2832; };\r\n    var where = function (tb, b) { var run = tb \/ LAP + b \/ 3, ph = run % 1; return { lap: Math.floor(run), s: ph < .5 ? 0 : 1, u: glide((ph * 2) % 1), ph: ph }; };\r\n    var paint = function (g, o) {\r\n      var W = o.w, H = o.h, grow = o.grow, amp = o.amp, spin = o.spin, spans = [];\r\n      if (grow <= 0) return;\r\n      \/\/ Les deux arches : x0..x3 puis y0..y3 de chaque courbe\r\n      \/\/ inset : la marge, en px, entre les bords de la bo\u00eete et les rives extr\u00eames\r\n      var inset = o.inset || 0, span = W - 2 * inset;\r\n      var lean = (o.ly - .5) * H * .1, sway = (o.lx - .5) * W * .03, lift = H * LIFT;\r\n      \/\/ Sous le pointeur, les fils s\u2019\u00e9cartent en douceur, d\u2019une moiti\u00e9 en plus\r\n      var part = o.part || 0, hx = o.x + o.lx * W, hw = W * .12;\r\n      var wide = function (x) { return part ? 1 + .5 * part * Math.exp(-(x - hx) * (x - hx) \/ (hw * hw)) : 1; };\r\n      \/\/ Pinc\u00e9e, une arche vibre comme une corde tendue entre ses deux piles\r\n      var vib = o.vib, shake = function (s, u) { return vib ? vib[s][0] * Math.sin(Math.PI * u) + vib[s][1] * Math.sin(2 * Math.PI * u) : 0; };\r\n      for (var s = 0; s < 2; s++) {\r\n        var ax = o.x + inset + BANKS[s][0] * span, ay = o.y + BANKS[s][1] * H, bx = o.x + inset + BANKS[s + 1][0] * span, by = o.y + BANKS[s + 1][1] * H;\r\n        spans.push([ax, ax + (bx - ax) * .28 + sway, ax + (bx - ax) * .72 + sway, bx,\r\n          ay, ay + (by - ay) * .28 - lift + lean, ay + (by - ay) * .72 - lift + lean, by]);\r\n      }\r\n      \/\/ Jamais coup\u00e9 en haut : quand le pointeur soul\u00e8ve les arches ou \u00e9carte\r\n      \/\/ les fils au-del\u00e0 de la marge, les arches s\u2019abaissent d\u2019autant\r\n      if (o.ceil) spans.forEach(function (sp, s) {\r\n        for (var uu = .3, need = 0; uu < .71; uu += .1) {\r\n          var lack = o.y + o.ceil - cub(uu, sp[4], sp[5], sp[6], sp[7]) + amp * env(uu) * wide(cub(uu, sp[0], sp[1], sp[2], sp[3])) + Math.abs(shake(s, uu));\r\n          if (lack > 0) need = Math.max(need, lack \/ (3 * uu * (1 - uu)));\r\n        }\r\n        sp[5] += need; sp[6] += need;\r\n      });\r\n      \/\/ Point du fil k \u00e0 l\u2019abscisse u d\u2019une arche, avec sa profondeur\r\n      var at = function (s, u, k) {\r\n        var sp = spans[s], x = cub(u, sp[0], sp[1], sp[2], sp[3]), y = cub(u, sp[4], sp[5], sp[6], sp[7]);\r\n        var dx = dcub(u, sp[0], sp[1], sp[2], sp[3]), dy = dcub(u, sp[4], sp[5], sp[6], sp[7]), l = Math.hypot(dx, dy) || 1;\r\n        var th = u * 6.3 + k * .6283 + spin, off = amp * env(u) * wide(x) * Math.sin(th) + shake(s, u);\r\n        return [x - dy \/ l * off, y + dx \/ l * off, Math.cos(th)];\r\n      };\r\n      \/\/ Le tablier : un trait d\u2019encre qui relie les trois rives et avance avec le pont\r\n      g.lineCap = 'round'; g.lineWidth = Math.max(1.6, H * .007); g.strokeStyle = 'rgba(23,53,64,.82)';\r\n      g.beginPath();\r\n      spans.forEach(function (sp, s) {\r\n        var e = clamp01(grow * 2 - s);\r\n        if (e) { g.moveTo(sp[0], sp[4]); g.lineTo(sp[0] + (sp[3] - sp[0]) * e, sp[4] + (sp[7] - sp[4]) * e); }\r\n      });\r\n      g.stroke();\r\n      g.lineCap = 'butt'; g.lineJoin = 'round';\r\n      spans.forEach(function (sp, s) {\r\n        var e = clamp01(grow * 2 - s), fade = o.fade ? o.fade[s] : 1;\r\n        if (!e) return;\r\n        \/\/ Le bout du pont avance en continu : le dernier segment est trac\u00e9 en partie\r\n        var n = S * e, last = Math.max(1, Math.ceil(n)), j, u;\r\n        for (j = 0; j <= last; j++) {\r\n          u = Math.min(j, n) \/ S;\r\n          var dx = dcub(u, sp[0], sp[1], sp[2], sp[3]), dy = dcub(u, sp[4], sp[5], sp[6], sp[7]), l = Math.hypot(dx, dy) || 1;\r\n          P[j * 2] = cub(u, sp[0], sp[1], sp[2], sp[3]); P[j * 2 + 1] = cub(u, sp[4], sp[5], sp[6], sp[7]);\r\n          NV[j * 2] = -dy \/ l; NV[j * 2 + 1] = dx \/ l;\r\n          var sh = shake(s, u);\r\n          if (sh) { P[j * 2] += NV[j * 2] * sh; P[j * 2 + 1] += NV[j * 2 + 1] * sh; }\r\n          AW[j] = amp * env(u) * wide(P[j * 2]);\r\n        }\r\n        \/\/ Deux passes : les brins de derri\u00e8re, p\u00e2les et fins, puis ceux de devant.\r\n        \/\/ Chaque brin se trace d\u2019un seul trait tant qu\u2019il reste au m\u00eame palier de\r\n        \/\/ profondeur (six par passe) : pas de coutures, et dix fois moins de traits\r\n        for (var pass = 0; pass < 2; pass++) {\r\n          for (var k = 0; k < 10; k++) {\r\n            g.strokeStyle = TONES[k];\r\n            var qx0 = 0, qy0 = 0, lv = -1;\r\n            for (j = 0; j <= last; j++) {\r\n              u = Math.min(j, n) \/ S;\r\n              var th = u * 6.3 + k * .6283 + spin;\r\n              var off = AW[j] * Math.sin(th), z = Math.cos(th);\r\n              var qx = P[j * 2] + NV[j * 2] * off, qy = P[j * 2 + 1] + NV[j * 2 + 1] * off;\r\n              if (j && (z < 0) === (pass === 0)) {\r\n                var d = Math.round((pass ? z : 1 + z) * 5);\r\n                if (d !== lv) {\r\n                  if (lv >= 0) g.stroke();\r\n                  lv = d; d \/= 5;\r\n                  g.globalAlpha = (pass ? .5 + .45 * d : .16 + .3 * d) * fade;\r\n                  g.lineWidth = pass ? 1.4 + .5 * d : 1 + .4 * d;\r\n                  g.beginPath(); g.moveTo(qx0, qy0);\r\n                }\r\n                g.lineTo(qx, qy);\r\n              } else if (lv >= 0) { g.stroke(); lv = -1; }\r\n              qx0 = qx; qy0 = qy;\r\n            }\r\n            if (lv >= 0) g.stroke();\r\n          }\r\n        }\r\n      });\r\n      \/\/ Des perles traversent les deux ponts, et changent de fil \u00e0 chaque passage.\r\n      \/\/ Chacune allume son fil derri\u00e8re elle, sur ce qu\u2019elle a parcouru dans la\r\n      \/\/ derni\u00e8re demi-seconde : une longue tra\u00eene au sommet, courte pr\u00e8s des piles\r\n      if (o.beads > 0) {\r\n        g.lineCap = 'round';\r\n        for (var b = 0; b < 3; b++) {\r\n          var w = where(o.beads, b), ph = w.ph, kb = (b * 3 + w.lap * 4) % 10, live = Math.min(1, ph * 10, (1 - ph) * 10);\r\n          var q = at(w.s, w.u, kb), fade = live * (q[2] < 0 ? .4 : 1);\r\n          g.strokeStyle = TONES[kb];\r\n          for (var i = 12, q0 = null; i >= 0; i--) {\r\n            var tb = o.beads - i * 42, wp = where(tb, b);\r\n            if (tb <= 0 || wp.lap !== w.lap) continue;\r\n            var qi = i ? at(wp.s, wp.u, kb) : q;\r\n            if (q0) {\r\n              g.globalAlpha = live * (1 - i \/ 13) * (qi[2] < 0 ? .3 : .8);\r\n              g.lineWidth = 1.4 + 1.6 * (1 - i \/ 13);\r\n              g.beginPath(); g.moveTo(q0[0], q0[1]); g.lineTo(qi[0], qi[1]); g.stroke();\r\n            }\r\n            q0 = qi;\r\n          }\r\n          g.fillStyle = TONES[kb];\r\n          g.globalAlpha = .16 * fade; g.beginPath(); g.arc(q[0], q[1], 7, 0, 6.2832); g.fill();\r\n          g.globalAlpha = fade; g.beginPath(); g.arc(q[0], q[1], 3, 0, 6.2832); g.fill();\r\n          g.fillStyle = '#fff'; g.beginPath(); g.arc(q[0], q[1], 1.3, 0, 6.2832); g.fill();\r\n        }\r\n      }\r\n      g.globalAlpha = 1;\r\n      \/\/ Les trois piles, sous le tablier, dans la teinte de leur rive et fondues\r\n      \/\/ dans le sol : chacune pousse quand le pont l\u2019approche\r\n      var pw = Math.max(4, H * .022), foot = o.y + H;\r\n      BANKS.forEach(function (bk, i) {\r\n        var e = clamp01((grow * 2 - i + .15) \/ .15);\r\n        if (!e) return;\r\n        \/\/ La pile de la rive survol\u00e9e s\u2019\u00e9largit et s\u2019\u00e9claire\r\n        var x = o.x + inset + bk[0] * span, y = o.y + bk[1] * H, hot = o.hot ? o.hot[i] : 0, w = pw * (1 + .6 * hot);\r\n        var gr = g.createLinearGradient(0, y, 0, foot), c = parseInt(PIERS[i].slice(1), 16);\r\n        gr.addColorStop(0, PIERS[i]); gr.addColorStop(1, 'rgba(' + (c >> 16) + ',' + (c >> 8 & 255) + ',' + (c & 255) + ',0)');\r\n        g.fillStyle = gr;\r\n        if (hot > .01) { g.shadowColor = PIERS[i]; g.shadowBlur = 12 * hot; }\r\n        g.fillRect(x - w \/ 2, y - 1, w, (foot - y + 1) * e);\r\n        g.shadowBlur = 0;\r\n      });\r\n      return spans;\r\n    };\r\n    paint.lift = LIFT;\r\n    return paint;\r\n  })();\r\n  \/\/ Le h\u00e9ros, que l\u2019ouverture tient en attente puis rel\u00e2che\r\n  var heroRope = null;\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-rope]');\r\n    if (!box) return;\r\n    var cv = box.querySelector('canvas'), g = cv.getContext('2d');\r\n    var W = 0, H = 0, inset = 0, dpr = 1, t0 = 0, raf = 0, running = false, seen = true, ready = false;\r\n    \/\/ Le pointeur, liss\u00e9 : sa position (px, py) et sa pr\u00e9sence au-dessus du pont (on)\r\n    var px = .5, py = .5, tx = .5, ty = .5, on = 0, ton = 0;\r\n    \/\/ La rive au premier plan (focus, -1 : aucune) et l\u2019\u00e9clat de chaque sc\u00e8ne (fw)\r\n    \/\/ wk : le r\u00e9veil de chaque sc\u00e8ne (0 \u00e0 1), hot : l\u2019\u00e9clat de chaque pile,\r\n    \/\/ af : l\u2019opacit\u00e9 des fils de chaque arche (celle qui ne touche pas la rive s\u2019efface)\r\n    var focus = -1, fw = [1, 1, 1], wk = [0, 0, 0], hot = [0, 0, 0], af = [1, 1], DIM = .3;\r\n    \/\/ Les cordes : pour chaque arche, position et vitesse du fondamental puis de\r\n    \/\/ l\u2019harmonique ; le fondamental bat \u00e0 2,2 Hz et s\u2019\u00e9teint en moins d\u2019une seconde\r\n    var vib = [[0, 0, 0, 0], [0, 0, 0, 0]], OMEGA = 13.8, DAMP = .12, lastNow = 0, arches = null;\r\n    \/\/ held : l\u2019ouverture joue encore ; grown : le pont arrive d\u00e9j\u00e0 tendu ;\r\n    \/\/ settle : l\u2019instant (depuis t0) o\u00f9 les l\u00e9gendes et les perles arrivent\r\n    var held = introOn, grown = false, settle = 2500;\r\n    \/\/ Sous les arches, les deux rives dessin\u00e9es en silhouettes simples, fondues\r\n    \/\/ dans le sol, chacune dans la teinte de sa pile. Sous la premi\u00e8re arche, le\r\n    \/\/ terrain : un silo et une grange, un arbre, deux maisons, la maison de\r\n    \/\/ quartier, deux tours. Sous la seconde, l\u2019innovation : une serre, un jardin,\r\n    \/\/ un atelier en sheds, des panneaux solaires, deux \u00e9oliennes. Elles poussent\r\n    \/\/ depuis leur pile quand les mots se posent. Au survol, la rive s\u2019\u00e9veille :\r\n    \/\/ les fen\u00eatres du terrain s\u2019allument une \u00e0 une ; les \u00e9oliennes de\r\n    \/\/ l\u2019innovation acc\u00e9l\u00e8rent, ses verri\u00e8res et ses panneaux passent \u00e0 l\u2019or.\r\n    \/\/ Chaque \u00e9l\u00e9ment : sa forme, sa place depuis la pile de sa rive (en fraction\r\n    \/\/ de trav\u00e9e) et sa hauteur (en fraction de la hauteur des arches)\r\n    var SCENES = [\r\n      [['silo', .11, .14, .3], ['barn', .15, .245, .13, .08], ['tree', .27, .16, .05], ['house', .295, .35, .12, .065],\r\n        ['house', .36, .41, .1, .06], ['hall', .435, .53, .21], ['tower', .55, .61, .5], ['tower', .63, .68, .36], ['tree', .705, .11, .04]],\r\n      [['serre', .09, .22, .16], ['bush', .24, .06], ['bush', .268, .085], ['bush', .296, .055], ['shed', .32, .48, .17, .09],\r\n        ['panels', .495, .59, .1], ['mill', .615, .55, .17, 0], ['mill', .69, .4, .12, 1.9]]\r\n    ];\r\n    var SIDE = ['#c86a5e', null, '#55926f'], scenes = null, millRot = 0;\r\n    var tint = function (h, a) { var v = parseInt(h.slice(1), 16); return 'rgba(' + (v >> 16) + ',' + (v >> 8 & 255) + ',' + (v & 255) + ',' + a + ')'; };\r\n    var hash = function (a, b) { var h = Math.sin(a * 127.1 + b * 311.7) * 43758.5453; return h - Math.floor(h); };\r\n    var buildScenes = function () {\r\n      var S = (W - 2 * inset) \/ 2, deck = H * .94, U = H, lift = H * paintBridge.lift, amp = Math.min(W, H) * .075;\r\n      \/\/ La place libre sous les fils au repos \u00e0 l\u2019abscisse x, en px au-dessus du\r\n      \/\/ tablier, avec de la marge pour le pointeur qui fait pencher les arches\r\n      var room = function (x) {\r\n        var ax = x < W \/ 2 ? inset : W \/ 2, lo = 0, hi = 1;\r\n        for (var k = 0; k < 22; k++) { var m = (lo + hi) \/ 2, v = 1 - m; if (ax + S * (3 * v * v * m * .28 + 3 * v * m * m * .72 + m * m * m) < x) lo = m; else hi = m; }\r\n        return 3 * lo * (1 - lo) * lift - amp * Math.pow(Math.sin(Math.PI * lo), .9) - 22;\r\n      };\r\n      \/\/ Les fen\u00eatres, trop petites sur un t\u00e9l\u00e9phone, n\u2019y sont pas dessin\u00e9es\r\n      var pw = Math.max(1.6, U * .022), ph = pw * 1.35, items = [];\r\n      SCENES.forEach(function (defs, s) {\r\n        var X = function (a) { return s ? W - inset - a * S : inset + a * S; };\r\n        defs.forEach(function (d, n) {\r\n          var p = { side: s * 2, kind: d[0], a: d[1], wins: [], glass: [] }, k;\r\n          if (d[0] === 'tree' || d[0] === 'bush' || d[0] === 'mill') {\r\n            p.x = X(d[1]); p.h = d[2] * U; p.r = (d[3] || 0) * U; p.ph = d[4] || 0;\r\n            k = Math.min(1, room(p.x) \/ (p.h + p.r));\r\n            p.h *= k; p.r *= k;\r\n            items.push(p);\r\n            return;\r\n          }\r\n          var xa = X(d[1]), xb = X(d[2]);\r\n          p.x0 = Math.min(xa, xb); p.x1 = Math.max(xa, xb); p.h = d[3] * U; p.roof = (d[4] || 0) * U;\r\n          k = Math.min(1, Math.min(room(p.x0), room(p.x1), room((p.x0 + p.x1) \/ 2)) \/ (p.h + p.roof));\r\n          p.h *= k; p.roof *= k;\r\n          var w = p.x1 - p.x0, top = deck - p.h, i, j;\r\n          if (S > 300) {\r\n            if (p.kind === 'tower') {\r\n              var cols = Math.max(2, Math.round((w - U * .04) \/ (pw * 2.6))), rows = Math.floor((p.h - U * .07) \/ (ph * 2.3));\r\n              for (j = 0; j < rows; j++) for (i = 0; i < cols; i++)\r\n                p.wins.push([p.x0 + U * .02 + (i + .5) * (w - U * .04) \/ cols - pw \/ 2, top + U * .025 + j * ph * 2.3, pw, ph, hash(n * 7 + i, j + s * 13)]);\r\n            } else if (p.kind === 'hall') {\r\n              for (j = 0; j < 2; j++) for (i = 0; i < 4; i++)\r\n                p.wins.push([p.x0 + (i + .5) * w \/ 4 - pw * .9, top + p.h * (.22 + j * .36), pw * 1.8, ph * 1.1, hash(n * 7 + i, j + 5)]);\r\n            } else if (p.kind === 'house') {\r\n              p.wins.push([p.x0 + w * .3 - pw * .6, deck - p.h * .62, pw * 1.2, ph, hash(n, 3)]);\r\n            }\r\n          }\r\n          \/\/ L\u2019atelier : trois dents de scie, vitr\u00e9es sur leur face droite\r\n          if (p.kind === 'shed') for (i = 1; i <= 3; i++) p.glass.push([p.x0 + i * w \/ 3 - Math.max(1.4, U * .01), top - p.roof * .92, Math.max(1.4, U * .01), p.roof * .84]);\r\n          items.push(p);\r\n        });\r\n      });\r\n      return { items: items, deck: deck, U: U, lw: H > 160 ? 1.2 : 1, cv: [null, null, null] };\r\n    };\r\n    \/\/ Un d\u00e9grad\u00e9 qui se fond dans le sol, et le m\u00eame, plus appuy\u00e9, sur l\u2019ar\u00eate\r\n    var shade = function (c, col, top, base, fa, la) {\r\n      var gf = c.createLinearGradient(0, top, 0, base), gs = c.createLinearGradient(0, top, 0, base);\r\n      gf.addColorStop(0, tint(col, fa)); gf.addColorStop(1, tint(col, fa * .08));\r\n      gs.addColorStop(0, tint(col, la)); gs.addColorStop(1, tint(col, 0));\r\n      c.fillStyle = gf; c.fill(); c.strokeStyle = gs; c.stroke();\r\n    };\r\n    \/\/ La silhouette d\u2019un \u00e9l\u00e9ment, sans ses parties anim\u00e9es (pales, lumi\u00e8res),\r\n    \/\/ dans la teinte de sa rive ou dans celle qu\u2019on lui donne (tone)\r\n    var body = function (c, p, base, U, tone) {\r\n      var col = tone || SIDE[p.side], top = base - p.h;\r\n      c.beginPath();\r\n      if (p.kind === 'tree') {\r\n        c.ellipse(p.x, top, p.r * .8, p.r * 1.1, 0, 0, 6.2832);\r\n        c.rect(p.x - .8, top + p.r * .9, 1.6, base - top - p.r * .9);\r\n        shade(c, col, top - p.r, base, .24, .8);\r\n        return;\r\n      }\r\n      if (p.kind === 'bush') { c.ellipse(p.x, base, p.h * 1.15, p.h, 0, Math.PI, 0); c.closePath(); shade(c, col, top, base, .26, .8); return; }\r\n      if (p.kind === 'mill') {\r\n        c.moveTo(p.x - 1.3, base); c.lineTo(p.x - .55, top); c.lineTo(p.x + .55, top); c.lineTo(p.x + 1.3, base); c.closePath();\r\n        shade(c, col, top, base, .7, .5);\r\n        return;\r\n      }\r\n      var x0 = p.x0, x1 = p.x1, cx = (x0 + x1) \/ 2, w = x1 - x0, i;\r\n      if (p.kind === 'panels') {\r\n        \/\/ Trois panneaux inclin\u00e9s sur leur pied\r\n        for (i = 0; i < 3; i++) {\r\n          var px0 = x0 + i * w \/ 3, pww = w \/ 3 * .82, t = Math.max(1.6, U * .012);\r\n          c.moveTo(px0, base - p.h * .35); c.lineTo(px0 + pww, top); c.lineTo(px0 + pww, top + t); c.lineTo(px0, base - p.h * .35 + t); c.closePath();\r\n          c.rect(px0 + pww \/ 2 - .5, base - p.h * .67, 1, p.h * .67);\r\n        }\r\n        shade(c, col, top, base, .5, .8);\r\n        return;\r\n      }\r\n      c.moveTo(x0, base);\r\n      if (p.kind === 'silo') { c.lineTo(x0, top + w \/ 2); c.arc(cx, top + w \/ 2, w \/ 2, Math.PI, 0); }\r\n      else if (p.kind === 'barn' || p.kind === 'house') { c.lineTo(x0, top); c.lineTo(cx, top - p.roof); c.lineTo(x1, top); }\r\n      else if (p.kind === 'serre') { c.lineTo(x0, top + p.h * .55); c.ellipse(cx, top + p.h * .55, w \/ 2, p.h * .55, 0, Math.PI, 0); }\r\n      else if (p.kind === 'shed') { c.lineTo(x0, top); for (i = 1; i <= 3; i++) { c.lineTo(x0 + i * w \/ 3, top - p.roof); c.lineTo(x0 + i * w \/ 3, top); } }\r\n      else { var rr = Math.min(2, w \/ 6); c.lineTo(x0, top + rr); c.quadraticCurveTo(x0, top, x0 + rr, top); c.lineTo(x1 - rr, top); c.quadraticCurveTo(x1, top, x1, top + rr); }\r\n      c.lineTo(x1, base); c.closePath();\r\n      shade(c, col, top - (p.roof || 0), base, .2, .8);\r\n      \/\/ Les d\u00e9tails : la porte de la grange, les arceaux de la serre, les fen\u00eatres \u00e9teintes\r\n      c.fillStyle = tint(col, .38);\r\n      if (p.kind === 'barn') c.fillRect(cx - w * .14, base - p.h * .62, w * .28, p.h * .62);\r\n      if (p.kind === 'serre') for (i = 1; i < 5; i++) {\r\n        var rx = x0 + i * w \/ 5, ry = top + p.h * .55 - p.h * .55 * Math.sqrt(Math.max(0, 1 - Math.pow((rx - cx) \/ (w \/ 2), 2)));\r\n        c.fillRect(rx - .4, ry, .8, base - ry);\r\n      }\r\n      p.wins.forEach(function (q) { c.fillRect(q[0], q[1], q[2], q[3]); });\r\n      p.glass.forEach(function (q) { c.fillRect(q[0], q[1], q[2], q[3]); });\r\n    };\r\n    \/\/ Les pales d\u2019une \u00e9olienne, fines et effil\u00e9es, et son moyeu\r\n    var blades = function (c, p, top) {\r\n      var len = p.r, rot = millRot + p.ph;\r\n      c.fillStyle = tint(SIDE[p.side], .85);\r\n      c.beginPath();\r\n      for (var b = 0; b < 3; b++) {\r\n        var th = rot + b * 2.0944, ux = Math.cos(th), uy = Math.sin(th);\r\n        c.moveTo(p.x - uy * 1.3, top + ux * 1.3); c.lineTo(p.x + ux * len, top + uy * len); c.lineTo(p.x + uy * 1.3, top - ux * 1.3);\r\n      }\r\n      c.fill();\r\n      c.beginPath(); c.arc(p.x, top, 1.9, 0, 6.2832); c.fill();\r\n    };\r\n    var paintScenes = function (t) {\r\n      if (!scenes) scenes = buildScenes();\r\n      var sc = scenes, base = sc.deck, rv = t - settle + 150, done = calm || rv > 1500;\r\n      if (rv <= 0) return;\r\n      g.lineWidth = sc.lw; g.lineJoin = 'round';\r\n      \/\/ Chaque \u00e9l\u00e9ment pousse depuis le sol, en vague depuis sa pile\r\n      var rise = function (p) { return done ? 1 : 1 - Math.pow(1 - clamp01((rv - 80 - p.a * 900) \/ 700), 3); };\r\n      [0, 2].forEach(function (side) {\r\n        var a = fw[side];\r\n        if (done) {\r\n          \/\/ La vague pass\u00e9e, les silhouettes ne bougent plus : on les garde en image\r\n          if (!sc.cv[side]) {\r\n            var cc = document.createElement('canvas'), c = cc.getContext('2d');\r\n            cc.width = Math.round(W * dpr); cc.height = Math.round(H * dpr);\r\n            c.setTransform(dpr, 0, 0, dpr, 0, 0); c.lineWidth = sc.lw; c.lineJoin = 'round';\r\n            sc.items.forEach(function (p) { if (p.side === side) body(c, p, base, sc.U); });\r\n            sc.cv[side] = cc;\r\n          }\r\n          g.globalAlpha = a; g.drawImage(sc.cv[side], 0, 0, W, H);\r\n        } else sc.items.forEach(function (p) {\r\n          var r = rise(p);\r\n          if (p.side !== side || r <= 0) return;\r\n          g.save(); g.globalAlpha = a; g.translate(0, base); g.scale(1, r); g.translate(0, -base);\r\n          body(g, p, base, sc.U);\r\n          g.restore();\r\n        });\r\n        \/\/ Les parties anim\u00e9es : pales, fen\u00eatres allum\u00e9es, verri\u00e8res et panneaux\r\n        var lights = Math.max(.16, wk[0] * .95);\r\n        sc.items.forEach(function (p) {\r\n          if (p.side !== side) return;\r\n          var r = rise(p), top = base - p.h * r;\r\n          if (r <= 0) return;\r\n          if (p.kind === 'mill') { g.globalAlpha = a; blades(g, p, top); }\r\n          g.fillStyle = LIT;\r\n          p.wins.forEach(function (q) {\r\n            var on = clamp01((lights - q[4]) \/ .1) * r;\r\n            if (on > .01) { g.globalAlpha = on * .95 * a; g.fillRect(q[0], base - (base - q[1]) * r, q[2], q[3] * r); }\r\n          });\r\n          if (wk[2] > .01 && r >= 1) {\r\n            g.globalAlpha = wk[2] * .9 * a;\r\n            p.glass.forEach(function (q) { g.fillRect(q[0], q[1], q[2], q[3]); });\r\n            if (p.kind === 'panels') { g.globalAlpha = wk[2] * .7 * a; body(g, p, base, sc.U, LIT); }\r\n          }\r\n        });\r\n      });\r\n      g.globalAlpha = 1;\r\n    };\r\n    \/\/ Les deux rives en caract\u00e8res : les silhouettes se dessinent d\u2019abord en\r\n    \/\/ petit, un pixel par case de la grille, puis chaque case devient un\r\n    \/\/ caract\u00e8re d\u2019autant plus charg\u00e9 que la silhouette la couvre, dans sa couleur\r\n    \/\/ (fen\u00eatres allum\u00e9es et verri\u00e8res comprises). Tout le reste, la pousse, le\r\n    \/\/ r\u00e9veil au survol et les pales, vient du dessin lui-m\u00eame.\r\n    var RAMP = '.:-=+*#%@', asc = null;\r\n    var asciiScenes = function (t) {\r\n      var ch = Math.max(4, Math.min(7, H \/ 42)), cw = ch * .6, nx = Math.ceil(W \/ cw), ny = Math.ceil(H \/ ch);\r\n      if (!asc || asc.nx !== nx || asc.ny !== ny) {\r\n        var ac = document.createElement('canvas');\r\n        ac.width = nx; ac.height = ny;\r\n        asc = { c: ac.getContext('2d', { willReadFrequently: true }), nx: nx, ny: ny };\r\n      }\r\n      var c = asc.c, main = g;\r\n      c.setTransform(1, 0, 0, 1, 0, 0); c.clearRect(0, 0, nx, ny);\r\n      c.setTransform(1 \/ cw, 0, 0, 1 \/ ch, 0, 0);\r\n      g = c; paintScenes(t); g = main;\r\n      var d = c.getImageData(0, 0, nx, ny).data, bk = {}, i, j, k, key;\r\n      for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) {\r\n        k = (j * nx + i) * 4;\r\n        if (d[k + 3] < 10) continue;\r\n        var lv = Math.min(8, Math.floor(Math.pow(d[k + 3] \/ 255, .5) * 10.5));\r\n        key = (d[k] >> 4) + ',' + (d[k + 1] >> 4) + ',' + (d[k + 2] >> 4) + ',' + lv;\r\n        (bk[key] || (bk[key] = [])).push((i + .5) * cw, (j + .5) * ch);\r\n      }\r\n      g.font = '500 ' + (ch * 1.1).toFixed(2) + \"px 'Geist Mono', ui-monospace, Menlo, monospace\";\r\n      g.textAlign = 'center'; g.textBaseline = 'middle';\r\n      for (key in bk) {\r\n        var q = key.split(','), list = bk[key];\r\n        g.fillStyle = 'rgb(' + (q[0] * 16 + 8) + ',' + (q[1] * 16 + 8) + ',' + (q[2] * 16 + 8) + ')';\r\n        g.globalAlpha = Math.min(1, .72 + .04 * q[3]);\r\n        for (k = 0; k < list.length; k += 2) g.fillText(RAMP[q[3]], list[k], list[k + 1]);\r\n      }\r\n      g.globalAlpha = 1;\r\n    };\r\n    \/\/ Au milieu, les douze \u00e9toiles de l\u2019Europe, en couronne dans le creux entre\r\n    \/\/ les arches, au-dessus de la pile du milieu.\r\n    \/\/ Bleues au repos, elles passent \u00e0 l\u2019or une \u00e0 une quand les financements\r\n    \/\/ europ\u00e9ens sont au premier plan, et une fois d\u2019elles-m\u00eames, le pont tendu.\r\n    var LIT = '#bd9035', STAR = '#43778b', ring = null;\r\n    var buildRing = function () {\r\n      var Sa = (W - 2 * inset) \/ 2, r = Math.min(H * .19, Sa * .13), list = [];\r\n      for (var i = 0; i < 12; i++) list.push([W \/ 2 + r * Math.cos(i * .5236 - 1.5708), H * .38 + r * Math.sin(i * .5236 - 1.5708)]);\r\n      return { list: list, s: Math.max(2.8, H * .019) };\r\n    };\r\n    var star = function (x, y, r) {\r\n      g.beginPath();\r\n      for (var i = 0; i < 10; i++) { var a = i * .6283 - 1.5708, rr = i % 2 ? r * .45 : r; g[i ? 'lineTo' : 'moveTo'](x + rr * Math.cos(a), y + rr * Math.sin(a)); }\r\n      g.closePath(); g.fill();\r\n    };\r\n    var paintRing = function (t) {\r\n      if (!ring) ring = buildRing();\r\n      var rv = t - settle;\r\n      if (rv <= 0) return;\r\n      \/\/ Le salut : une demi-seconde apr\u00e8s la pose, les \u00e9toiles s\u2019allument une\r\n      \/\/ fois en or, puis reviennent au bleu\r\n      var hello = calm ? 0 : clamp01(Math.min((rv - 500) \/ 900, (3600 - rv) \/ 1200)), w = Math.max(wk[1], hello);\r\n      ring.list.forEach(function (p, i) {\r\n        var a = easeGrow(clamp01((rv - i * 60) \/ 520)), lit = clamp01((w - .05 - i \/ 12 * .6) \/ .25), r = ring.s * (.4 + .6 * a) * (1 + .2 * lit);\r\n        if (!a) return;\r\n        if (lit < 1) { g.globalAlpha = a * .72 * (1 - lit) * fw[1]; g.fillStyle = STAR; star(p[0], p[1], r); }\r\n        if (lit > 0) { g.globalAlpha = a * lit * fw[1]; g.fillStyle = LIT; star(p[0], p[1], r); }\r\n      });\r\n      g.globalAlpha = 1;\r\n    };\r\n    var draw = function (now) {\r\n      if (!W) return;\r\n      var t = calm ? 1e9 : now - t0;\r\n      var grow = grown ? 1 : clamp01(t \/ 2400);\r\n      px += (tx - px) * .05; py += (ty - py) * .05; on += (ton - on) * .04;\r\n      var dt = Math.min(1 \/ 30, Math.max(0, (now - lastNow) \/ 1000));\r\n      lastNow = now;\r\n      \/\/ Au survol, tout change lentement : l\u2019estompe en un peu plus d\u2019une demi-seconde,\r\n      \/\/ le r\u00e9veil de la sc\u00e8ne sur une seconde et demie\r\n      var ef = 1 - Math.exp(-dt \/ .55), ew = 1 - Math.exp(-dt \/ .75);\r\n      for (var k = 0; k < 3; k++) {\r\n        fw[k] += ((focus < 0 || focus === k ? 1 : DIM) - fw[k]) * ef;\r\n        hot[k] += ((focus === k ? 1 : 0) - hot[k]) * ef;\r\n        wk[k] += ((focus === k ? 1 : 0) - wk[k]) * ew;\r\n      }\r\n      for (var s = 0; s < 2; s++) af[s] += (((focus === 0 && s === 1) || (focus === 2 && s === 0) ? .4 : 1) - af[s]) * ef;\r\n      for (var s = 0; s < 2; s++) for (var m = 0; m < 2; m++) {\r\n        var om = OMEGA * (m + 1), st = vib[s];\r\n        st[m * 2 + 1] -= (om * om * st[m * 2] + 2 * DAMP * om * st[m * 2 + 1]) * dt;\r\n        st[m * 2] += st[m * 2 + 1] * dt;\r\n      }\r\n      \/\/ Les \u00e9oliennes tournent lentement, plus vite quand l\u2019innovation est au premier plan\r\n      millRot += calm ? 0 : dt * (.6 + 2.2 * wk[2]);\r\n      g.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      g.clearRect(0, 0, W, H);\r\n      if (held) return;\r\n      asciiScenes(t);\r\n      paintRing(t);\r\n      arches = paintBridge(g, { x: 0, y: 0, w: W, h: H, inset: inset, grow: easeGrow(grow), amp: Math.min(W, H) * .075,\r\n        vib: [[vib[0][0], vib[0][2]], [vib[1][0], vib[1][2]]], hot: hot, fade: af,\r\n        spin: calm ? 0 : -t * .00055, lx: px, ly: py, part: on, ceil: 8, beads: calm ? -1 : t - settle });\r\n      if (!ready && t > settle) { ready = true; box.classList.add('is-ready'); }\r\n    };\r\n    var layout = function () {\r\n      var r = cv.getBoundingClientRect();\r\n      W = r.width; H = r.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\r\n      \/\/ Les piles extr\u00eames tombent pile sur les bords du texte, celle du milieu\r\n      \/\/ sur son axe : le ciel d\u00e9borde de chaque c\u00f4t\u00e9\r\n      var bw = box.getBoundingClientRect().width;\r\n      inset = Math.max(0, (W - bw) \/ 2);\r\n      ring = null; scenes = null;\r\n      if (!running) draw(performance.now());\r\n    };\r\n    var loop = function (now) { draw(now); if (running) raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || held || running || !seen || document.hidden) return; running = true; raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    var hero = box.closest('.hero') || box;\r\n    \/\/ Survoler une rive (la pile la plus proche) ou ses mots dans la phrase met\r\n    \/\/ sa sc\u00e8ne au premier plan et souligne ses mots\r\n    var words = Array.prototype.slice.call(hero.querySelectorAll('.hero-banks b')), hoverWord = -1, hoverBank = -1;\r\n    var setFocus = function () {\r\n      var f = hoverWord >= 0 ? hoverWord : hoverBank;\r\n      if (f === focus) return;\r\n      focus = f;\r\n      words.forEach(function (w, i) { w.classList.toggle('is-hot', i === f); });\r\n      if (calm) {\r\n        for (var k = 0; k < 3; k++) { fw[k] = f < 0 || f === k ? 1 : DIM; wk[k] = hot[k] = f === k ? 1 : 0; }\r\n        af = [f === 0 ? 1 : f === 2 ? .4 : 1, f === 0 ? .4 : 1];\r\n        draw(performance.now());\r\n      }\r\n    };\r\n    words.forEach(function (w, i) {\r\n      w.addEventListener('mouseenter', function () { hoverWord = i; setFocus(); });\r\n      w.addEventListener('mouseleave', function () { hoverWord = -1; setFocus(); });\r\n    });\r\n    \/\/ L\u2019arche \u00e0 l\u2019abscisse x : son param\u00e8tre u et sa hauteur, ou rien hors de sa port\u00e9e\r\n    var bez = function (u, a, b, c, d) { var v = 1 - u; return v * v * v * a + 3 * v * v * u * b + 3 * v * u * u * c + u * u * u * d; };\r\n    var archAt = function (sp, x) {\r\n      if (x <= sp[0] || x >= sp[3]) return null;\r\n      for (var i = 1, u0 = 0, x0 = sp[0], y0 = sp[4]; i <= 40; i++) {\r\n        var u = i \/ 40, x1 = bez(u, sp[0], sp[1], sp[2], sp[3]), y1 = bez(u, sp[4], sp[5], sp[6], sp[7]);\r\n        if (x1 >= x) { var f = (x - x0) \/ (x1 - x0 || 1); return [u0 + (u - u0) * f, y0 + (y1 - y0) * f]; }\r\n        u0 = u; x0 = x1; y0 = y1;\r\n      }\r\n      return null;\r\n    };\r\n    var prev = null;\r\n    hero.addEventListener('pointermove', function (e) {\r\n      if (held) return;\r\n      var r = cv.getBoundingClientRect(), x = e.clientX - r.left, y = e.clientY - r.top;\r\n      \/\/ Traverser une arche la pince : plus le geste est vif, plus elle vibre,\r\n      \/\/ et elle part dans le sens du geste\r\n      if (e.pointerType === 'mouse' && arches && prev && !calm) {\r\n        var vy = (y - prev.y) \/ Math.max(8, e.timeStamp - prev.t) * 1000;\r\n        for (var s = 0; s < 2; s++) {\r\n          var a0 = archAt(arches[s], prev.x), a1 = archAt(arches[s], x);\r\n          if (!a0 || !a1 || (prev.y < a0[1]) === (y < a1[1])) continue;\r\n          var hit = (vy < 0 ? -1 : 1) * Math.min(220, Math.max(55, Math.abs(vy) * .15));\r\n          vib[s][1] += hit * Math.sin(Math.PI * a1[0]);\r\n          vib[s][3] += hit * .6 * Math.sin(2 * Math.PI * a1[0]);\r\n        }\r\n      }\r\n      prev = { x: x, y: y, t: e.timeStamp };\r\n      tx = Math.max(-.3, Math.min(1.3, x \/ (r.width || 1)));\r\n      ty = Math.max(-.3, Math.min(1.3, (e.clientY - r.top) \/ (r.height || 1)));\r\n      ton = e.pointerType === 'mouse' && ty > -.15 && ty < 1.15 ? 1 : 0;\r\n      \/\/ La rive survol\u00e9e : sous une arche, sa sc\u00e8ne ; au-dessus, l\u2019Europe vers le milieu\r\n      var side = x < W \/ 2 ? 0 : 1, over = arches && archAt(arches[side], x);\r\n      hoverBank = e.pointerType === 'mouse' && ty >= 0 && ty <= 1 ? (over && y > over[1] ? side * 2 : Math.abs(x - W \/ 2) < W * .17 ? 1 : side * 2) : -1;\r\n      setFocus();\r\n    });\r\n    hero.addEventListener('pointerleave', function () { tx = ty = .5; ton = 0; hoverBank = -1; prev = null; setFocus(); });\r\n    t0 = performance.now() + 350;\r\n    if ('ResizeObserver' in window) new ResizeObserver(layout).observe(cv); else window.addEventListener('resize', layout);\r\n    if ('IntersectionObserver' in window) new IntersectionObserver(function (en) { seen = en[0].isIntersecting; seen ? play() : pause(); }).observe(cv);\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n    layout();\r\n    \/\/ Sans animation, un seul dessin, une fois la grille de l\u2019Europe charg\u00e9e\r\n    if (calm) { ready = true; box.classList.add('is-ready'); window.setTimeout(function () { draw(performance.now()); }, 0); }\r\n    play();\r\n    heroRope = {\r\n      canvas: cv,\r\n      inset: function () { return inset; },\r\n      \/\/ Rel\u00e2ch\u00e9 avec l\u2019horloge de l\u2019ouverture (origin), le pont reprend la\r\n      \/\/ torsade l\u00e0 o\u00f9 elle en \u00e9tait, d\u00e9j\u00e0 tendu ; sans elle, il pousse comme d\u2019habitude\r\n      release: function (origin) {\r\n        if (!held) return;\r\n        var now = performance.now();\r\n        held = false;\r\n        if (origin) { t0 = origin; grown = true; settle = now - t0 + 260; } else t0 = now + 150;\r\n        draw(now);\r\n        play();\r\n      }\r\n    };\r\n  })();\r\n  \/* ---------------- Ouverture ---------------- *\/\r\n  \/\/ Sur l\u2019\u00e9cran blanc, le pont du h\u00e9ros se tend en petit, au centre. Puis le\r\n  \/\/ blanc s\u2019efface et le pont s\u2019\u00e9tire jusqu\u2019\u00e0 sa place ; le titre monte une\r\n  \/\/ fois le mouvement presque fini.\r\n  (function () {\r\n    if (!introOn) return;\r\n    var cv = intro.querySelector('canvas'), g = cv.getContext('2d');\r\n    var T0 = 0, W = 0, H = 0, dpr = 1, raf = 0, out = 0, over = false, fontsIn = false;\r\n    var m = null;\r\n    var lerp = function (a, b, p) { return a + (b - a) * p; };\r\n    var eio = function (p) { return p < .5 ? 4 * p * p * p : 1 - Math.pow(-2 * p + 2, 3) \/ 2; };\r\n    intro.classList.add('is-live');\r\n    var size = function () {\r\n      W = window.innerWidth; H = window.innerHeight;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\r\n      if (out) return;\r\n      \/\/ Le petit pont, centr\u00e9 un rien au-dessus du milieu, aux proportions du grand\r\n      var w = Math.max(260, Math.min(540, W * .36));\r\n      var hr = heroRope && heroRope.canvas.getBoundingClientRect(), h = hr && hr.height ? w * hr.height \/ (hr.width - 2 * heroRope.inset()) : w \/ 5;\r\n      m = { x: (W - w) \/ 2, y: H * .48 - h \/ 2, w: w, h: h };\r\n    };\r\n    var hand = function () {\r\n      if (over) return;\r\n      over = true;\r\n      cancelAnimationFrame(raf);\r\n      if (heroRope) heroRope.release(out ? T0 : 0);\r\n      loaded();\r\n      root.classList.remove('intro-hold');\r\n      if (intro.parentNode) intro.parentNode.removeChild(intro);\r\n    };\r\n    var frame = function (now) {\r\n      var t = now - T0, grow = clamp01((t - 150) \/ 1200), k = .17;\r\n      var o = { x: m.x, y: m.y, w: m.w, h: m.h, grow: easeGrow(grow), amp: 0, spin: -t * .00055, lx: .5, ly: .5, beads: -1 };\r\n      if (!out && fontsIn && t > 1550) leave(now);\r\n      if (out) {\r\n        \/\/ Le pont rejoint celui du h\u00e9ros, qui n\u2019a pas encore boug\u00e9\r\n        var p = eio(clamp01((now - out - 80) \/ 1000)), r = heroRope && heroRope.canvas.getBoundingClientRect();\r\n        if (r && r.width) {\r\n          o.x = lerp(m.x, r.left, p); o.y = lerp(m.y, r.top, p); o.w = lerp(m.w, r.width, p); o.h = lerp(m.h, r.height, p);\r\n          o.inset = lerp(0, heroRope.inset(), p); o.grow += (1 - o.grow) * p; k = lerp(k, .075, p);\r\n        } else intro.classList.add('is-lost');\r\n        if (p >= 1) return hand();\r\n      }\r\n      o.amp = Math.min(o.w, o.h) * k;\r\n      g.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      g.clearRect(0, 0, W, H);\r\n      paintBridge(g, o);\r\n      raf = requestAnimationFrame(frame);\r\n    };\r\n    var leave = function (now) {\r\n      if (out) return;\r\n      out = now;\r\n      intro.classList.add('is-out');\r\n      \/\/ Le titre monte quand le pont a presque fini de s\u2019\u00e9tirer\r\n      window.setTimeout(function () { loaded(); root.classList.remove('intro-hold'); }, 860);\r\n    };\r\n    var begin = function () {\r\n      if (T0) return;\r\n      size();\r\n      T0 = performance.now();\r\n      raf = requestAnimationFrame(frame);\r\n    };\r\n    \/\/ On attend que la page ait fini son premier rendu, qui fige une ou deux images\r\n    requestAnimationFrame(function () { requestAnimationFrame(begin); });\r\n    window.setTimeout(begin, 400);\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(function () { fontsIn = true; });\r\n    else fontsIn = true;\r\n    window.setTimeout(function () { fontsIn = true; }, 2600);\r\n    \/\/ Un clic, une touche ou la molette : on file directement vers la page\r\n    var skip = function () { if (T0 && !out && !over) leave(performance.now()); };\r\n    ['pointerdown', 'keydown', 'wheel', 'touchstart'].forEach(function (ev) { window.addEventListener(ev, skip, { passive: true }); });\r\n    window.addEventListener('resize', function () { if (!over) size(); });\r\n    \/\/ Onglet cach\u00e9 ou page d\u00e9j\u00e0 d\u00e9fil\u00e9e : on rend la main tout de suite\r\n    var bail = function () { if (!over) hand(); };\r\n    document.addEventListener('visibilitychange', function () { if (document.hidden) bail(); });\r\n    window.addEventListener('scroll', function () { if (window.scrollY > 40) bail(); }, { passive: true });\r\n    window.setTimeout(bail, 7000);\r\n  })();\r\n  \/* ---------------- Territoires : carte de France ---------------- *\/\r\n  \/\/ La France en points, avec ses cinq d\u00e9partements d\u2019outre-mer en cartouches.\r\n  \/\/ Chaque champ d\u2019action a sa couche : une onde recolore les points, puis les\r\n  \/\/ rep\u00e8res propres \u00e0 la couche s\u2019animent (anneaux des agglom\u00e9rations, r\u00e9seau des\r\n  \/\/ structures de l\u2019ESS reli\u00e9 \u00e0 l\u2019Europe). La l\u00e9gende ne s\u2019allume qu\u2019apr\u00e8s l\u2019onde.\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-terr]');\r\n    if (!box) return;\r\n    var canvas = box.querySelector('canvas'), ctx = canvas.getContext('2d'), stage = canvas.parentElement;\r\n    var items = Array.prototype.slice.call(box.querySelectorAll('.field'));\r\n    var btns = items.map(function (li) { return li.querySelector('.field-btn'); });\r\n    var keys = Array.prototype.slice.call(box.querySelectorAll('.terr-key li'));\r\n    var slots = Array.prototype.slice.call(box.querySelectorAll('.drom li'));\r\n    var count = box.querySelector('[data-terr-count]');\r\n    var TONES = ['#45508a', '#55926f', '#bd9035'], GREY = '#d3dbd7', TAU = 6.2832, WAVE = 900;\r\n    \/\/ Contours simplifi\u00e9s (latitude, longitude)\r\n    var HEX = [[51.09,2.55],[50.95,2.61],[50.82,2.63],[50.7,2.9],[50.77,3.1],[50.7,3.25],[50.52,3.3],[50.47,3.6],[50.35,3.7],[50.33,4.02],[50.13,4.2],[49.98,4.15],[50.02,4.45],[50.17,4.83],[49.97,4.85],[49.8,4.9],[49.7,5.2],[49.55,5.45],[49.53,5.8],[49.47,6.1],[49.47,6.37],[49.35,6.55],[49.2,6.75],[49.2,7],[49.12,7.3],[49.17,7.55],[49.05,7.95],[48.97,8.23],[48.8,8.1],[48.55,7.8],[48.3,7.7],[47.95,7.55],[47.59,7.59],[47.5,7.35],[47.45,7],[47.3,6.95],[47.1,6.75],[46.9,6.45],[46.6,6.15],[46.4,6.1],[46.25,5.97],[46.15,5.96],[46.13,6.15],[46.25,6.3],[46.4,6.5],[46.38,6.8],[46.15,6.85],[45.95,6.95],[45.83,6.86],[45.65,6.95],[45.45,7.1],[45.25,6.9],[45.1,6.7],[44.95,6.75],[44.85,6.95],[44.6,6.95],[44.4,6.9],[44.25,7],[44.15,7.35],[43.95,7.6],[43.78,7.53],[43.7,7.3],[43.55,7.1],[43.52,6.93],[43.42,6.8],[43.27,6.7],[43.2,6.55],[43.08,6.3],[43.02,6.12],[43.07,5.9],[43.2,5.6],[43.22,5.35],[43.33,5.2],[43.4,5],[43.33,4.85],[43.4,4.55],[43.45,4.35],[43.53,4.12],[43.4,3.7],[43.28,3.45],[43.15,3.2],[42.95,3.05],[42.7,3.03],[42.52,3.1],[42.43,3.17],[42.43,2.9],[42.35,2.6],[42.4,2.2],[42.45,1.95],[42.5,1.72],[42.6,1.45],[42.7,1.05],[42.78,0.7],[42.7,0.4],[42.78,0],[42.85,-0.3],[42.95,-0.55],[42.97,-0.9],[43.05,-1.3],[43.2,-1.45],[43.37,-1.78],[43.48,-1.56],[43.7,-1.44],[44.2,-1.28],[44.64,-1.25],[45.1,-1.18],[45.57,-1.06],[45.75,-1.2],[45.95,-1.35],[46.15,-1.25],[46.35,-1.45],[46.45,-1.75],[46.7,-1.95],[46.9,-2.15],[47.05,-2.25],[47.15,-2.12],[47.28,-2.25],[47.3,-2.52],[47.48,-2.85],[47.52,-3.1],[47.62,-3.2],[47.72,-3.45],[47.8,-3.85],[47.85,-4.1],[47.8,-4.37],[48,-4.6],[48.1,-4.72],[48.35,-4.78],[48.6,-4.62],[48.68,-4.3],[48.72,-3.98],[48.73,-3.6],[48.83,-3.45],[48.8,-3.05],[48.55,-2.75],[48.6,-2.45],[48.68,-2.32],[48.65,-2.02],[48.68,-1.85],[48.62,-1.51],[48.84,-1.58],[49.1,-1.6],[49.38,-1.8],[49.72,-1.94],[49.66,-1.62],[49.7,-1.26],[49.58,-1.25],[49.38,-1.15],[49.36,-0.85],[49.34,-0.55],[49.29,-0.25],[49.42,0.2],[49.49,0.1],[49.7,0.2],[49.77,0.4],[49.87,0.75],[49.93,1.08],[50.06,1.37],[50.2,1.58],[50.4,1.56],[50.52,1.58],[50.73,1.6],[50.87,1.58],[50.95,1.85],[51,2.12],[51.05,2.37]];\r\n    var CORSE = [[43.01,9.42],[42.8,9.48],[42.7,9.45],[42.4,9.54],[42.1,9.55],[41.86,9.4],[41.6,9.29],[41.38,9.2],[41.4,9.05],[41.6,8.8],[41.72,8.7],[41.92,8.74],[42.05,8.6],[42.25,8.62],[42.38,8.55],[42.55,8.72],[42.64,8.95],[42.68,9.25],[42.75,9.33],[42.95,9.35]];\r\n    \/\/ Outre-mer, dans l\u2019ordre des cartouches ; `c` est le chef-lieu\r\n    var DOM = [\r\n      { c: [16.24, -61.53], p: [[[16.35,-61.72],[16.3,-61.79],[16.17,-61.8],[16.02,-61.74],[15.96,-61.68],[16,-61.58],[16.1,-61.56],[16.2,-61.57],[16.27,-61.58],[16.34,-61.61]], [[16.51,-61.47],[16.47,-61.35],[16.4,-61.23],[16.33,-61.18],[16.28,-61.25],[16.23,-61.38],[16.22,-61.5],[16.27,-61.54],[16.35,-61.52],[16.45,-61.53]], [[15.99,-61.28],[15.95,-61.2],[15.87,-61.22],[15.86,-61.3],[15.92,-61.34]]] },\r\n      { c: [14.61, -61.07], p: [[[14.88,-61.17],[14.8,-61.23],[14.72,-61.18],[14.63,-61.15],[14.57,-61.1],[14.5,-61.08],[14.45,-60.98],[14.4,-60.88],[14.45,-60.82],[14.55,-60.82],[14.64,-60.86],[14.72,-60.9],[14.76,-60.82],[14.79,-60.92],[14.85,-61.02]]] },\r\n      { c: [4.93, -52.33], p: [[[5.75,-54.02],[5.55,-53.5],[5.25,-52.9],[4.93,-52.3],[4.6,-51.95],[4.25,-51.63],[3.8,-51.7],[3.3,-52.2],[2.6,-52.55],[2.2,-52.9],[2.25,-53.7],[2.2,-54.2],[2.4,-54.55],[3.2,-54.2],[3.7,-54.4],[4.3,-54.45],[5,-54.2],[5.4,-54.1]]] },\r\n      { c: [-20.9, 55.45], p: [[[-20.87,55.4],[-20.88,55.6],[-20.95,55.7],[-21.05,55.8],[-21.2,55.83],[-21.33,55.78],[-21.39,55.62],[-21.37,55.45],[-21.28,55.3],[-21.12,55.22],[-20.98,55.28]]] },\r\n      { c: [-12.78, 45.22], p: [[[-12.64,45.05],[-12.68,45.15],[-12.75,45.19],[-12.88,45.2],[-12.97,45.21],[-13,45.14],[-12.94,45.1],[-12.88,45.05],[-12.8,45.07],[-12.72,45.03]], [[-12.77,45.27],[-12.8,45.3],[-12.83,45.28],[-12.8,45.25]]] }\r\n    ];\r\n    \/\/ Agglom\u00e9rations (poids : \u00e9tendue des quartiers prioritaires)\r\n    var CITIES = [[48.86,2.35,1.35],[43.3,5.37,1],[45.76,4.84,.9],[50.63,3.06,.9],[43.6,1.44,.75],[44.84,-.58,.7],[47.22,-1.55,.65],[48.58,7.75,.65],[43.61,3.88,.65],[43.7,7.27,.6],[49.44,1.1,.6],[45.19,5.72,.55],[45.44,4.39,.55],[48.11,-1.68,.55],[50.43,2.83,.55],[47.75,7.34,.5],[49.26,4.03,.5],[49.49,.11,.5],[43.12,5.93,.5],[43.95,4.81,.5],[43.84,4.36,.5],[49.12,6.18,.5],[50.36,3.52,.5],[49.89,2.3,.45],[48.69,6.18,.45],[47.32,5.04,.45],[45.78,3.08,.45],[47.9,1.9,.45],[47.39,.69,.45],[42.7,2.9,.45],[49.26,2.47,.4],[45.83,1.26,.4],[47.24,6.02,.4],[49.18,-.37,.4],[47.47,-.55,.4],[48,.2,.4],[43.34,3.21,.4],[47.51,6.8,.4],[51.03,2.37,.4],[48.39,-4.49,.35],[43.3,-.37,.35],[46.58,.34,.35],[48.3,4.08,.35],[41.93,8.74,.3],[42.7,9.45,.3]];\r\n    \/\/ Structures de l\u2019ESS accompagn\u00e9es : un semis de villes, Marseille en t\u00eate\r\n    var ESS = [[43.3,5.37],[50.63,3.06],[48.11,-1.68],[47.22,-1.55],[44.84,-.58],[43.6,1.44],[43.61,3.88],[45.76,4.84],[45.19,5.72],[48.58,7.75],[48.69,6.18],[47.32,5.04],[48.86,2.35],[49.44,1.1],[47.39,.69],[45.83,1.26],[45.78,3.08],[43.3,-.37],[43.7,7.27],[41.93,8.74],[48.39,-4.49],[49.89,2.3],[46.58,.34]];\r\n    var TOP = 10;   \/\/ les dix premi\u00e8res agglom\u00e9rations portent un anneau\r\n    var K = Math.cos(46.5 * Math.PI \/ 180);\r\n    var proj = function (ll, k) { return [ll[1] * (k || K), -ll[0]]; };\r\n    var inPoly = function (poly, x, y) {\r\n      for (var c = false, i = 0, j = poly.length - 1; i < poly.length; j = i++) {\r\n        var a = poly[i], b = poly[j];\r\n        if ((a[1] > y) !== (b[1] > y) && x < (b[0] - a[0]) * (y - a[1]) \/ (b[1] - a[1]) + a[0]) c = !c;\r\n      }\r\n      return c;\r\n    };\r\n    var clamp01 = function (v) { return v < 0 ? 0 : v > 1 ? 1 : v; };\r\n    var ease = function (t) { return t < .5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2; };\r\n    var hash = function (n) { var x = Math.sin(n * 127.1) * 43758.5453; return x - Math.floor(x); };\r\n    var segDist = function (p, a, b) {\r\n      var dx = b[0] - a[0], dy = b[1] - a[1], t = clamp01(((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) \/ (dx * dx + dy * dy));\r\n      return Math.hypot(p[0] - a[0] - t * dx, p[1] - a[1] - t * dy);\r\n    };\r\n    \/\/ La grille de l\u2019hexagone, calcul\u00e9e une fois, en unit\u00e9s projet\u00e9es\r\n    var HP = HEX.map(function (p) { return proj(p); }), CP = CORSE.map(function (p) { return proj(p); });\r\n    var all = HP.concat(CP), minX = 1e9, maxX = -1e9, minY = 1e9, maxY = -1e9;\r\n    all.forEach(function (p) { minX = Math.min(minX, p[0]); maxX = Math.max(maxX, p[0]); minY = Math.min(minY, p[1]); maxY = Math.max(maxY, p[1]); });\r\n    var ROWS = 62, STEP = (maxY - minY) \/ ROWS, COLS = Math.ceil((maxX - minX) \/ STEP);\r\n    var cityP = CITIES.map(function (c) { return proj(c); }), essP = ESS.map(function (c) { return proj(c); });\r\n    var diagA = proj([49.6, 5.4]), diagB = proj([43.5, -.8]);\r\n    var FX = [], FY = [], V = [[], [], []];\r\n    for (var j = 0; j < ROWS; j++) for (var i = 0; i < COLS; i++) {\r\n      var x = minX + (i + .5) * STEP, y = minY + (j + .5) * STEP;\r\n      if (!inPoly(HP, x, y) && !inPoly(CP, x, y)) continue;\r\n      var n = FX.length, q = 0, dmin = 1e9;\r\n      FX.push(x); FY.push(y);\r\n      cityP.forEach(function (c, k) {\r\n        var d = Math.hypot(x - c[0], y - c[1]), w = CITIES[k][2];\r\n        q = Math.max(q, w * clamp01(1 - d \/ (.2 + .24 * w)));\r\n        if (w >= .45) dmin = Math.min(dmin, d);\r\n      });\r\n      V[0].push(q > .12 ? Math.min(1, .35 + q) : 0);\r\n      var far = clamp01((dmin - .28) \/ .5), band = Math.exp(-Math.pow(segDist([x, y], diagA, diagB) \/ .9, 2));\r\n      var r = far * (.4 + .6 * band) * (.8 + .2 * hash(n + 1));\r\n      V[1].push(r > .16 ? r : 0);\r\n      var e = 0;\r\n      essP.forEach(function (c) { e = Math.max(e, clamp01(1 - Math.hypot(x - c[0], y - c[1]) \/ .2)); });\r\n      V[2].push(e > .05 ? .25 + .6 * e : 0);\r\n    }\r\n    var NF = FX.length;\r\n    \/\/ Liens du r\u00e9seau : chaque structure vers ses deux voisines les plus proches\r\n    var LINKS = [];\r\n    essP.forEach(function (a, ia) {\r\n      essP.map(function (b, ib) { return [ib, Math.hypot(a[0] - b[0], a[1] - b[1])]; })\r\n        .sort(function (u, v) { return u[1] - v[1]; }).slice(1, 3)\r\n        .forEach(function (nb) { var k = Math.min(ia, nb[0]) + ':' + Math.max(ia, nb[0]); if (LINKS.indexOf(k) < 0) LINKS.push(k); });\r\n    });\r\n    LINKS = LINKS.map(function (k) { return k.split(':').map(Number); });\r\n    var STRAS = 9;   \/\/ Strasbourg : le r\u00e9seau y rejoint l\u2019Europe\r\n    \/\/ Mise en page (px) : points de l\u2019hexagone, puis des cartouches\r\n    var W = 0, H = 0, dpr = 1, pitch = 1, r0 = 1, mk = 1, ox = 0, oy = 0, base = null;\r\n    var PX = [], PY = [], DX = [], DY = [], DS = [], DV = [[], [], []], cityPx = [], essPx = [], eu = [0, 0];\r\n    var toPx = function (p) { return [ox + (p[0] - minX) * pitch \/ STEP, oy + (p[1] - minY) * pitch \/ STEP]; };\r\n    var layout = function () {\r\n      var rect = stage.getBoundingClientRect();\r\n      W = rect.width; H = rect.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      canvas.width = Math.round(W * dpr); canvas.height = Math.round(H * dpr);\r\n      \/\/ Cartouches en colonne \u00e0 gauche, ou en rang\u00e9e dessous (t\u00e9l\u00e9phone)\r\n      var dr = slots[0].parentElement.getBoundingClientRect(), row = dr.width > W \/ 2, pad = row ? 14 : 22;\r\n      var L = row ? pad : dr.right - rect.left + 18, B = row ? rect.bottom - dr.top + 12 : pad;\r\n      pitch = Math.min((W - L - pad) \/ COLS, (H - pad - B) \/ ROWS);\r\n      ox = L + (W - L - pad - COLS * pitch) \/ 2; oy = pad + (H - pad - B - ROWS * pitch) \/ 2;\r\n      r0 = Math.max(1, pitch * .3); mk = Math.max(.7, Math.min(1.3, pitch \/ 8));\r\n      PX = []; PY = [];\r\n      for (var k = 0; k < NF; k++) { var p = toPx([FX[k], FY[k]]); PX.push(p[0]); PY.push(p[1]); }\r\n      cityPx = cityP.slice(0, TOP).map(toPx); essPx = essP.map(toPx);\r\n      eu = [W - 34 * mk - 8, 34 * mk + 8];\r\n      \/\/ Cartouches : chaque \u00eele \u00e0 sa propre \u00e9chelle, points un peu plus serr\u00e9s\r\n      DX = []; DY = []; DS = []; DV = [[], [], []];\r\n      var pp = pitch * .78;\r\n      DOM.forEach(function (d, si) {\r\n        var sr = slots[si].getBoundingClientRect();\r\n        var bx = sr.left - rect.left + 6, by = sr.top - rect.top + 6, bw = sr.width - 12, bh = sr.height - 28;\r\n        var kk = Math.cos(d.c[0] * Math.PI \/ 180), polys = d.p.map(function (poly) { return poly.map(function (q) { return proj(q, kk); }); });\r\n        var x0 = 1e9, x1 = -1e9, y0 = 1e9, y1 = -1e9;\r\n        polys.forEach(function (poly) { poly.forEach(function (q) { x0 = Math.min(x0, q[0]); x1 = Math.max(x1, q[0]); y0 = Math.min(y0, q[1]); y1 = Math.max(y1, q[1]); }); });\r\n        var sc = Math.min(bw \/ (x1 - x0), bh \/ (y1 - y0)), cx = bx + bw \/ 2, cy = by + bh \/ 2;\r\n        var mx = (x0 + x1) \/ 2, my = (y0 + y1) \/ 2, cc = proj(d.c, kk);\r\n        var ccx = cx + (cc[0] - mx) * sc, ccy = cy + (cc[1] - my) * sc;\r\n        var nx = Math.floor(bw \/ pp), ny = Math.floor(bh \/ pp);\r\n        for (var iy = 0; iy < ny; iy++) for (var ix = 0; ix < nx; ix++) {\r\n          var gx = cx + (ix - (nx - 1) \/ 2) * pp, gy = cy + (iy - (ny - 1) \/ 2) * pp;\r\n          var ux = mx + (gx - cx) \/ sc, uy = my + (gy - cy) \/ sc;\r\n          if (!polys.some(function (poly) { return inPoly(poly, ux, uy); })) continue;\r\n          var dc = Math.hypot(gx - ccx, gy - ccy) \/ pp;\r\n          DX.push(gx); DY.push(gy); DS.push(si);\r\n          DV[0].push(dc < 2.2 ? .45 + .5 * (1 - dc \/ 2.2) : 0);\r\n          DV[1].push(.55 + .35 * hash(DX.length));\r\n          DV[2].push(dc < 1.6 ? .4 + .5 * (1 - dc \/ 1.6) : 0);\r\n        }\r\n      });\r\n      \/\/ Couche fixe : tous les points gris\r\n      base = document.createElement('canvas');\r\n      base.width = canvas.width; base.height = canvas.height;\r\n      var b = base.getContext('2d');\r\n      b.scale(dpr, dpr); b.fillStyle = GREY; b.beginPath();\r\n      for (k = 0; k < NF; k++) { b.moveTo(PX[k] + r0, PY[k]); b.arc(PX[k], PY[k], r0, 0, TAU); }\r\n      for (k = 0; k < DX.length; k++) { b.moveTo(DX[k] + r0 * .85, DY[k]); b.arc(DX[k], DY[k], r0 * .85, 0, TAU); }\r\n      b.fill();\r\n      draw(performance.now());\r\n    };\r\n    \/\/ \u00c9tat : couche affich\u00e9e, couche pr\u00e9c\u00e9dente, instant du changement\r\n    var cur = -1, prev = -1, ts = 0, running = false, visible = false, raf = 0, keyTimer = 0;\r\n    var ORIG = [[48.86, 2.35], [45.5, 2.8], [43.3, 5.37]].map(function (o) { return proj(o); });\r\n    var dot = function (x, y, r) { ctx.beginPath(); ctx.arc(x, y, r, 0, TAU); ctx.fill(); };\r\n    var ring = function (x, y, r) { ctx.beginPath(); ctx.arc(x, y, r, 0, TAU); ctx.stroke(); };\r\n    var draw = function (now) {\r\n      if (!base) return;\r\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n      ctx.drawImage(base, 0, 0);\r\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      if (cur < 0) return;\r\n      var t = calm ? 1e9 : now - ts, o = toPx(ORIG[cur]), reach = Math.hypot(W, H);\r\n      \/\/ L\u2019onde : la couche pr\u00e9c\u00e9dente s\u2019\u00e9teint, la nouvelle s\u2019allume, depuis son origine\r\n      var wave = function (x, y) { return ease(clamp01((t - Math.hypot(x - o[0], y - o[1]) \/ reach * WAVE) \/ 520)); };\r\n      var paint = function (px, py, vals, r, k, pd) {\r\n        var p = pd == null ? wave(px, py) : ease(clamp01((t - pd) \/ 520));\r\n        var a = prev >= 0 ? vals[prev][k] * (1 - p) : 0, b = vals[cur][k] * p;\r\n        if (cur === 1 && b) b *= .88 + .12 * Math.sin(now \/ 900 + k);\r\n        if (a > .02) { ctx.globalAlpha = a; ctx.fillStyle = TONES[prev]; dot(px, py, r * (1 + .3 * a)); }\r\n        if (b > .02) { ctx.globalAlpha = b; ctx.fillStyle = TONES[cur]; dot(px, py, r * (1 + .3 * b)); }\r\n      };\r\n      for (var k = 0; k < NF; k++) paint(PX[k], PY[k], V, r0, k);\r\n      for (k = 0; k < DX.length; k++) paint(DX[k], DY[k], DV, r0 * .85, k, WAVE * .45 + DS[k] * 70);\r\n      ctx.globalAlpha = 1;\r\n      \/\/ Rep\u00e8res propres \u00e0 chaque couche, une fois l\u2019onde pass\u00e9e\r\n      var fin = calm ? 1 : clamp01((t - WAVE * .8) \/ 600), out = calm ? 0 : 1 - clamp01((t) \/ 260);\r\n      var layer = function (L, amt) {\r\n        if (amt <= .01) return;\r\n        var tone = TONES[L];\r\n        if (L === 0) {\r\n          cityPx.forEach(function (c, i) {\r\n            if (!calm) {\r\n              var q = ((now + i * 330) % 2800) \/ 2800;\r\n              ctx.globalAlpha = (1 - q) * .55 * amt; ctx.strokeStyle = tone; ctx.lineWidth = 1.2;\r\n              ring(c[0], c[1], (4 + q * 18) * mk);\r\n            }\r\n            ctx.globalAlpha = amt; ctx.fillStyle = '#fff'; dot(c[0], c[1], 3.6 * mk);\r\n            ctx.fillStyle = tone; dot(c[0], c[1], 2.2 * mk);\r\n          });\r\n        }\r\n        if (L === 2) {\r\n          var grow = calm ? 1 : clamp01((t - WAVE * .7) \/ 1100);\r\n          ctx.lineCap = 'round'; ctx.strokeStyle = tone; ctx.lineWidth = 1.3 * mk;\r\n          LINKS.forEach(function (lk, i) {\r\n            var a = essPx[lk[0]], b = essPx[lk[1]], g = ease(clamp01(grow * 1.6 - i \/ LINKS.length * .6));\r\n            if (g <= 0) return;\r\n            ctx.globalAlpha = .5 * amt;\r\n            ctx.beginPath(); ctx.moveTo(a[0], a[1]); ctx.lineTo(a[0] + (b[0] - a[0]) * g, a[1] + (b[1] - a[1]) * g); ctx.stroke();\r\n          });\r\n          \/\/ Changer d\u2019\u00e9chelle : du r\u00e9seau, un fil part vers l\u2019Europe\r\n          var s = essPx[STRAS], ge = calm ? 1 : ease(clamp01((t - WAVE * .7 - 900) \/ 800));\r\n          if (ge > 0) {\r\n            ctx.globalAlpha = .75 * amt; ctx.setLineDash([0, 5 * mk]); ctx.lineWidth = 1.6 * mk;\r\n            ctx.beginPath(); ctx.moveTo(s[0], s[1]); ctx.lineTo(s[0] + (eu[0] - s[0]) * ge, s[1] + (eu[1] - s[1]) * ge); ctx.stroke();\r\n            ctx.setLineDash([]);\r\n            var ea = amt * clamp01(ge * 3 - 2), er = 13 * mk;\r\n            if (ea > 0) {\r\n              ctx.globalAlpha = ea;\r\n              ctx.fillStyle = '#fff'; dot(eu[0], eu[1], er + 3 * mk);\r\n              ctx.fillStyle = '#003399'; dot(eu[0], eu[1], er);\r\n              ctx.fillStyle = '#ffcc00';\r\n              for (var st = 0; st < 12; st++) dot(eu[0] + Math.cos(st * TAU \/ 12) * er * .62, eu[1] + Math.sin(st * TAU \/ 12) * er * .62, 1.1 * mk);\r\n              if (!calm) { var qe = (now % 2400) \/ 2400; ctx.globalAlpha = (1 - qe) * .5 * ea; ctx.strokeStyle = '#003399'; ctx.lineWidth = 1.2; ring(eu[0], eu[1], er + (3 + qe * 14) * mk); }\r\n            }\r\n          }\r\n          \/\/ Des \u00e9clats circulent sur le r\u00e9seau\r\n          if (!calm && grow >= 1) {\r\n            for (var c = 0; c < 3; c++) {\r\n              var cyc = Math.floor((now + c * 700) \/ 2100), lk = LINKS[(cyc * 7 + c * 5) % LINKS.length], u = ease(((now + c * 700) % 2100) \/ 2100);\r\n              var A = essPx[lk[0]], B = essPx[lk[1]];\r\n              if (cyc % 2) { var tmp = A; A = B; B = tmp; }\r\n              ctx.globalAlpha = amt * Math.sin(u * Math.PI); ctx.fillStyle = tone;\r\n              dot(A[0] + (B[0] - A[0]) * u, A[1] + (B[1] - A[1]) * u, 2.6 * mk);\r\n            }\r\n          }\r\n          essPx.forEach(function (p, i) {\r\n            var pop = calm ? 1 : ease(clamp01((t - WAVE * .6 - i * 40) \/ 420)), big = i === 0 ? 1.35 : 1;\r\n            if (pop <= 0) return;\r\n            if (!calm) {\r\n              var q = ((now + i * 410) % 3600) \/ 3600;\r\n              ctx.globalAlpha = (1 - q) * .35 * amt; ctx.strokeStyle = tone; ctx.lineWidth = 1;\r\n              ring(p[0], p[1], (5 + q * 16) * mk * big);\r\n            }\r\n            ctx.globalAlpha = amt * pop;\r\n            ctx.fillStyle = '#fff'; dot(p[0], p[1], 4.4 * mk * big * pop);\r\n            ctx.fillStyle = tone; dot(p[0], p[1], 2.6 * mk * big * pop);\r\n          });\r\n        }\r\n        ctx.globalAlpha = 1;\r\n      };\r\n      if (prev >= 0 && out > 0) layer(prev, out);\r\n      layer(cur, fin);\r\n    };\r\n    var loop = function (now) { draw(now); if (running) raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || running || !visible || cur < 0 || document.hidden) return; running = true; raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    \/\/ Passer \u00e0 une couche : la l\u00e9gende s\u2019\u00e9teint d\u2019un coup, se rallume apr\u00e8s l\u2019onde\r\n    var show = function (L) {\r\n      if (L === cur) return;\r\n      prev = cur; cur = L; ts = performance.now();\r\n      items.forEach(function (li, i) { li.classList.toggle('is-on', i === L); btns[i].setAttribute('aria-pressed', i === L ? 'true' : 'false'); });\r\n      keys.forEach(function (k) { k.classList.remove('is-on'); });\r\n      box.classList.remove('is-dom');\r\n      clearTimeout(keyTimer);\r\n      keyTimer = setTimeout(function () {\r\n        keys[L].classList.add('is-on');\r\n        box.classList.toggle('is-dom', L === 1);\r\n        count.textContent = '0' + (L + 1) + ' \/ 03';\r\n      }, calm ? 0 : WAVE + 150);\r\n      if (calm) draw(performance.now()); else play();\r\n    };\r\n    btns.forEach(function (b, i) { b.addEventListener('click', function () { box.classList.remove('is-auto'); show(i); }); });\r\n    \/\/ Le cycle : la barre du champ actif sert de minuterie\r\n    items.forEach(function (li, i) {\r\n      li.querySelector('.field-bar').addEventListener('animationend', function () { if (box.classList.contains('is-auto')) show((i + 1) % items.length); });\r\n    });\r\n    keys[0].classList.remove('is-on');\r\n    if ('ResizeObserver' in window) new ResizeObserver(layout).observe(stage); else window.addEventListener('resize', layout);\r\n    layout();\r\n    if (calm) { show(0); return; }\r\n    if ('IntersectionObserver' in window) {\r\n      new IntersectionObserver(function (entries) {\r\n        visible = entries[0].isIntersecting;\r\n        box.classList.toggle('is-hold', !visible);\r\n        if (visible) { if (cur < 0) { box.classList.add('is-auto'); show(0); } play(); } else pause();\r\n      }, { threshold: .35 }).observe(stage);\r\n    } else { visible = true; show(0); }\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n  })();\r\n  \/* ---------------- Carte de l\u2019Europe ---------------- *\/\r\n  \/\/ Grille de points pr\u00e9calcul\u00e9e (projection azimutale \u00e9quivalente centr\u00e9e sur\r\n  \/\/ l\u2019Europe, 134 \u00d7 92 cases ; \u00e0 partir de la colonne 111, de la Turquie \u00e0\r\n  \/\/ Chypre, la terre vient de la carte du monde de GeoKit). Chaque bit dit si la\r\n  \/\/ case est sur terre, et si elle est en France. Les lieux sont en unit\u00e9s de case.\r\n  var GRID = {\"cols\":134,\"rows\":92,\"step\":9,\"land\":\"AAAAAEAA\/P\/\/kQb4\/\/\/\/\/z8AAAAAEAD\/\/\/8B8P\/\/\/\/\/\/DwAAAAAAAP\/\/fwD+\/\/\/\/\/\/8DAAAAAADA\/\/8fwP\/\/\/\/\/\/\/wAAAAAEAPz\/\/wP2\/\/\/\/\/\/8\/AAAABAAA\/\/\/\/APz\/\/\/\/\/\/w8AAIA4AAA\/\/g9g\/P\/\/\/\/\/\/AwAAEAcA4If\/AwD\/\/\/\/\/\/\/8AAADoAAD44P8AwP\/\/\/\/\/\/PwAAgPoBABzwP4Lj\/\/\/\/\/\/8PAAAA\/gAAAPyP4P3\/\/\/\/\/\/wMAAMAfAAAg\/iP4\/\/\/\/\/\/\/\/AAAA6AcAAIz\/Af7\/\/\/\/\/\/z8AAAD8AADAwz+A\/\/\/\/\/\/\/\/DwAAQD8AAPDwB+D\/\/\/\/\/\/\/8DAACgDwAAfvwB+P\/\/\/\/\/\/\/wAAwOAHAIAPHwD8\/\/\/\/\/\/8\/AAD4+AEA4KEDgP\/\/\/\/\/\/\/w8AIH5\/AAB47gDA\/\/\/\/\/\/\/\/AwDwHz4AAOwDAPz\/\/\/\/\/\/\/8AAP6DDwAAAwAY\/\/\/\/\/\/\/\/PwCAf+QHAMAdgOf\/\/\/\/\/\/\/8PAIAf8AMAYELw\/\/\/\/\/\/\/\/\/wMA8Af8AAB4DP\/\/\/\/\/\/\/\/\/\/AAD+kR8AAP7\/\/\/\/\/\/\/\/\/\/z8A4D\/8DwDQ\/\/\/\/\/\/\/\/\/\/\/\/DwD4D\/4DwP7\/\/\/\/\/\/\/\/\/\/\/8DAH6A\/wP4\/\/\/\/\/\/\/\/\/\/\/\/\/wAAAPj\/Af\/\/\/\/\/\/\/\/\/\/\/\/8\/AAAA\/3\/g\/\/\/\/\/\/\/\/\/\/\/\/\/w8AAAD\/H\/j\/\/\/\/\/\/\/\/\/\/\/\/\/AwAAgP4B\/\/\/\/\/\/\/\/\/\/\/\/\/\/8AAAD4P8D\/\/\/\/\/\/\/\/\/\/\/\/\/PwAAAP8\/9P\/\/\/\/\/\/\/\/\/\/\/\/8PAADgieP\/\/\/\/\/\/\/\/\/\/\/\/\/\/wMAAAQA\/P\/\/\/\/\/\/\/\/\/\/\/\/\/\/AAAAAAD\/\/\/\/\/\/\/\/\/\/\/\/\/\/z8AAAAAwP\/\/\/\/\/\/\/\/\/\/\/\/\/\/DwAAABD+\/\/\/\/\/\/\/\/\/\/\/\/\/+cDAAAAjP\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/QAAAAD\/\/\/\/\/\/\/\/\/\/\/\/\/\/x8\/AADAx\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/4w8AAOD\/\/\/\/\/\/\/\/\/\/\/\/\/\/z\/wAwAA+P\/\/\/\/\/\/\/\/\/\/\/\/\/+D\/wAAAD4\/\/\/\/\/\/\/\/\/\/\/\/v\/+BPwAAAPj\/\/\/\/\/\/\/\/\/\/\/+Pf+APAAAA\/v\/\/\/\/\/\/\/\/\/\/\/8Ee\/wMAAAD\/\/\/\/\/\/\/\/\/\/\/8\/wH\/+AAAAwP\/\/\/\/\/\/\/\/\/\/\/x\/wBzAAAADw\/\/\/\/\/\/\/\/\/\/\/\/B\/AAAAAAAPD\/\/\/\/\/\/\/\/\/\/\/8BGAAAAAAA\/P\/\/\/\/\/\/\/\/\/\/HwAAAAAAAID\/\/\/\/\/\/\/\/\/\/\/8HAAAAAAAAwP\/\/\/\/\/\/\/\/\/\/\/wEAAAAAAADo\/\/\/\/f\/7\/\/\/9\/AAAAAAAAAP7\/\/\/+H\/v\/\/\/x8AAAAAAACA\/\/\/\/\/2P\/\/\/\/\/AwAAAAAcAOD\/\/\/9\/wP\/\/\/\/8AAAAAwP8A\/P\/\/\/x\/g\/\/\/\/PwAAAADw\/wL\/\/\/\/xD\/j\/\/\/8PAMAEAPz\/5\/\/\/f\/AH+P\/\/\/wMA\/y8A\/\/\/\/\/\/8D\/Afw\/\/\/\/AeD\/D8D\/\/\/8\/eAD+Afj\/\/\/8A\/P8D8P\/\/\/wcIgP8A\/P\/\/\/4H\/\/wD+\/\/\/\/AQDAPwD8\/\/8\/8P8\/AP\/\/\/\/8AwOAfAPz\/\/6H\/\/w\/g\/\/\/\/HwAw8A8A\/v8\/+P\/\/A\/j\/\/\/8HAAz4P4D\/D9D\/\/\/8A\/\/\/\/fwAAA\/wP4P8B\/\/\/\/P8D\/\/\/8HAIAA\/A\/478D\/\/\/8P+P\/\/fwAAIAD8D\/4j8v\/\/\/wP\/\/\/8PAAAcAPyP\/wDw\/\/\/\/QP\/\/\/wEAgAcAPoZ\/AP\/\/\/z\/g\/\/8\/AADgAQAP8T8A\/v\/\/D\/j\/\/weQAHgAAAPwD4D\/\/\/8D\/v\/\/AQYAHADAAfgJ8P\/\/\/4D\/\/38AAYAHAOAA\/A\/w\/\/8\/4P\/\/PwIA4AEAGADGBfz\/\/wn8\/\/8HAAAQAAACIJ8E\/P8fAv\/\/\/wAAAAAAwADgBwD+\/gMA8P8fAAAAAAAYAPSCkD98IAD4\/wcAAAAA7gEAeADgDwIAAP4\/AAAAAIB\/AAAaAIABAACAjw8AAAAAgA8AAAgAAgAHAEAAAAAAAASABwAAAgAA4AAAAAAAAIfEF4ABAAAAAAAcAAAGAOD\/\/\/8HAAAAAKAAAAYAgAMA\/v\/\/\/wAAAADADwAAAADwAfD\/\/\/8fAAAAAAAAAAAAAP4P\/\/\/\/\/w8AAAAAAAAAAACA\/\/\/\/\/\/\/\/BwAAAAAAAAAAAPD\/\/\/\/\/\/\/8BAAAAAAAAAAA=\",\"france\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAwA8AAAAAAAAAAAAAAAAAABD+AwAAAAAAAAAAAAAAAAAAjP8DAAAAAAAAAAAAAAAAAAD\/\/wcAAAAAAAAAAAAAAADAx\/\/\/AwAAAAAAAAAAAAAAAOD\/\/\/8HAAAAAAAAAAAAAAAA+P\/\/\/wAAAAAAAAAAAAAAAAD4\/\/8\/AAAAAAAAAAAAAAAAAPj\/\/w8AAAAAAAAAAAAAAAAA\/v\/\/AwAAAAAAAAAAAAAAAAD\/\/38AAAAAAAAAAAAAAAAAwP\/\/DwAAAAAAAAAAAAAAAADw\/\/8BAAAAAAAAAAAAAAAAAPD\/PwAAAAAAAAAAAAAAAAAA\/P8PAAAAAAAAAAAAAAAAAID\/\/wcAAAAAAAAAAAAAAAAAwP\/\/AwAAAAAAAAAAAAAAAADo\/\/8AAAAAAAAAAAAAAAAAAP7\/PwAAAAAAAAAAAAAAAACA\/\/8HAAAAAAAAAAAAAAAAAOD\/\/wMAAAAAAAAAAAAAAAAA\/P9\/AAAAAAAAAAAAAAAAAAD\/\/z8AAAAAAAAAAAAAAAAA4P\/\/HwAAAAAAAAAAAAAAAADw\/\/8DAAAAAAAAAAAAAAAAAPg\/eAAAAAAAAAAAAAAAAAAA2AcIAAAAAAAAAAAAAAAAAADAAQAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"cities\":{\"sud\":[47.23,62.51],\"oc\":[43.42,61.18],\"pa\":[29.29,60.29],\"idf\":[41.22,42.22],\"ge\":[53.99,43.89],\"pdl\":[31.18,47.01],\"om\":[11.2,46.54],\"ES\":[22.01,70.85],\"IT\":[66.21,65.24],\"GR\":[93.07,75.05],\"IE\":[20.86,23.6],\"TR\":[113.58,68.29],\"NO\":[60.8,3.92],\"BE\":[46.75,36.38],\"NL\":[49.63,30.49],\"PT\":[10.05,71.02],\"DE\":[60.28,34.64],\"RO\":[96.71,50.54],\"EE\":[88.86,5.5],\"SE\":[70.55,4.61],\"LV\":[89.1,11.94],\"PL\":[79.82,30.42],\"CZ\":[71.96,39.26],\"CY\":[126.51,84.5],\"LT\":[88.04,17.88],\"HU\":[82.33,47.74],\"RS\":[87.2,58.74],\"DK\":[57.77,17.64],\"BG\":[99.23,61.8],\"LU\":[50.3,39.77]}};\r\n  \/\/ Quelques exemples de projets financ\u00e9s, d\u2019apr\u00e8s la feuille de la carte des\r\n  \/\/ partenaires : nom, ann\u00e9e, origine, type (c coop\u00e9ration, m mobilit\u00e9, cm les\r\n  \/\/ deux), pays partenaires, \u00e9tat (f financ\u00e9).\r\n  var PROJ = [\r\n    [\"Solidarit\u00e9 Femmes 13\", 2023, \"sud\", \"c\", \"ES\", \"f\"],\r\n    [\"Groupe Dispersion\", 2023, \"sud\", \"c\", \"PL\", \"f\"],\r\n    [\"L\u2019\u0152il du Loup\", 2023, \"sud\", \"c\", \"DK\", \"f\"],\r\n    [\"Le Grand Bleu\", 2025, \"sud\", \"m\", \"GR\", \"f\"],\r\n    [\"La For\u00eat en papier\", 2025, \"sud\", \"c\", \"IT\", \"f\"],\r\n    [\"AJAR\", 2026, \"idf\", \"m\", \"RO ES SE\", \"f\"],\r\n    [\"\u00c9COLE DE LA DEUXI\u00c8ME CHANCE\", 2026, \"pdl\", \"cm\", \"IE\", \"f\"],\r\n    [\"La Ferme d\u2019Uhaldia\", 2026, \"pa\", \"m\", \"ES\", \"f\"]\r\n  ];\r\n  \/\/ La carte se d\u00e9ploie quand elle entre \u00e0 l\u2019\u00e9cran : les points naissent depuis\r\n  \/\/ les villes des structures, puis les ponts se tracent, un par un, chacun vers\r\n  \/\/ la teinte de son pays ; \u00e0 l\u2019arriv\u00e9e, une onde colore les points alentour.\r\n  \/\/ Survoler un projet de la liste, une ville ou un pays isole ses ponts.\r\n  (function () {\r\n    var mapEl = document.getElementById('shl-accueil').querySelector('[data-map]');\r\n    var canvas = mapEl.querySelector('canvas');\r\n    var ctx = canvas.getContext('2d');\r\n    var legend = mapEl.querySelector('[data-legend]');\r\n    var listEl = legend.querySelector('[data-legend-list]');\r\n    var tip = mapEl.querySelector('[data-map-tip]');\r\n    var holder = canvas.parentElement, col = mapEl.querySelector('.atlas-copy'), key = mapEl.querySelector('.map-key');\r\n    \/\/ Le cadrage, en cases : de l\u2019Irlande \u00e0 Chypre, de la Norv\u00e8ge au sud de l\u2019Espagne\r\n    var ROI = [5, 0, 129, 88];\r\n    var COLS = GRID.cols, ROWS = GRID.rows, N = COLS * ROWS;\r\n    var bits = function (b64) {\r\n      var bin = atob(b64), out = new Uint8Array(N);\r\n      for (var i = 0; i < N; i++) out[i] = (bin.charCodeAt(i >> 3) >> (i & 7)) & 1;\r\n      return out;\r\n    };\r\n    var land = bits(GRID.land), france = bits(GRID.france), C = GRID.cities;\r\n    var EN = LANG === 'en';\r\n    \/\/ D\u2019o\u00f9 partent les projets : la ville ou le pays de la structure accompagn\u00e9e\r\n    var ORIG = {\r\n      sud: ['Aix-Marseille', 'Aix-Marseille', 1], pa: ['Pays basque', 'Basque Country', 1],\r\n      idf: ['Paris', 'Paris', 1], pdl: ['Nantes', 'Nantes', 1]\r\n    };\r\n    var NET = [];\r\n    \/\/ Pays partenaires : nom, nom anglais, teinte de la roue (deux voisins n\u2019ont jamais la m\u00eame)\r\n    var CTRY = {\r\n      ES: ['Espagne', 'Spain', 1], PT: ['Portugal', 'Portugal', 4], IT: ['Italie', 'Italy', 5], GR: ['Gr\u00e8ce', 'Greece', 7],\r\n      BE: ['Belgique', 'Belgium', 8], NL: ['Pays-Bas', 'Netherlands', 3], LU: ['Luxembourg', 'Luxembourg', 2], DE: ['Allemagne', 'Germany', 10],\r\n      IE: ['Irlande', 'Ireland', 6], TR: ['Turquie', 'T\u00fcrkiye', 2], RO: ['Roumanie', 'Romania', 3], PL: ['Pologne', 'Poland', 9],\r\n      EE: ['Estonie', 'Estonia', 2], LV: ['Lettonie', 'Latvia', 6], LT: ['Lituanie', 'Lithuania', 1], SE: ['Su\u00e8de', 'Sweden', 3],\r\n      NO: ['Norv\u00e8ge', 'Norway', 9], DK: ['Danemark', 'Denmark', 5], CZ: ['Tch\u00e9quie', 'Czechia', 7], HU: ['Hongrie', 'Hungary', 4],\r\n      RS: ['Serbie', 'Serbia', 10], BG: ['Bulgarie', 'Bulgaria', 1], CY: ['Chypre', 'Cyprus', 6]\r\n    };\r\n    var TONE = ['', '#c86a5e', '#b25f35', '#bd9035', '#8d9b4e', '#55926f', '#6d9b93', '#4b8296', '#45508a', '#8480be', '#92557c'];\r\n    var TONEX = ['', '#af564b', '#ab5b32', '#8c6c20', '#6a7637', '#437c5d', '#4f7871', '#43778b', '#45508a', '#6e6aa8', '#92557c'];\r\n    var LAND = '#d3dbd7', FR = '#7f9b9b', INK = '#16262c', TEAL = '#1f4a4d', TAU = 6.2832;\r\n    var oName = function (o) { return ORIG[o][EN ? 1 : 0]; };\r\n    var cName = function (c) { return CTRY[c][EN ? 1 : 0]; };\r\n    var esc = function (s) { return String(s).replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/\"\/g, '&quot;'); };\r\n    var plural = function (n, one, many) { return n + ' ' + tr(n > 1 ? many : one); };\r\n    \/\/ Projets, et paires origine \u2192 pays : un pont par paire, d\u2019autant plus \u00e9pais qu\u2019il porte de projets\r\n    var projects = PROJ.map(function (p, i) { return { i: i, name: p[0], year: p[1], o: p[2], type: p[3], c: p[4].split(' '), st: p[5] }; });\r\n    var pairs = [], pairAt = {};\r\n    projects.forEach(function (p) {\r\n      p.pairs = p.c.map(function (c) {\r\n        var k = p.o + '>' + c;\r\n        if (!(k in pairAt)) { pairAt[k] = pairs.length; pairs.push({ o: p.o, c: c, n: 0 }); }\r\n        pairs[pairAt[k]].n++;\r\n        return pairAt[k];\r\n      });\r\n    });\r\n    var usedC = Object.keys(CTRY).filter(function (c) { return pairs.some(function (q) { return q.c === c; }); });\r\n    var origins = Object.keys(ORIG).filter(function (o) { return projects.some(function (p) { return p.o === o; }); });\r\n    var perO = {}, perC = {};\r\n    origins.forEach(function (o) { perO[o] = projects.filter(function (p) { return p.o === o; }).length; });\r\n    usedC.forEach(function (c) { perC[c] = projects.filter(function (p) { return p.c.indexOf(c) >= 0; }).length; });\r\n    \/\/ Ordre d\u2019apparition : le hub le plus fourni d\u2019abord, puis du pont le plus court au plus long\r\n    var seq = pairs.map(function (q, i) { return i; }).sort(function (a, b) {\r\n      var A = pairs[a], B = pairs[b];\r\n      if (A.o !== B.o) return perO[B.o] - perO[A.o];\r\n      return Math.hypot(C[A.c][0] - C[A.o][0], C[A.c][1] - C[A.o][1]) - Math.hypot(C[B.c][0] - C[B.o][0], C[B.c][1] - C[B.o][1]);\r\n    });\r\n    seq.forEach(function (k, r) { pairs[k].r = r; });\r\n    var T_DOTS = 1100, T_NET = 900, T_ARC = 1400, GAP = 55, DUR = 1000;\r\n    var T_END = T_ARC + (pairs.length - 1) * GAP + DUR;\r\n    \/\/ Un pays s\u2019allume quand son premier pont arrive\r\n    var landT = {};\r\n    pairs.forEach(function (q) { landT[q.c] = Math.min(landT[q.c] || 1e9, T_ARC + q.r * GAP + DUR); });\r\n    \/\/ Les points de terre, et leur distance au hub le plus proche (en cases)\r\n    var DX = [], DY = [], DF = [], DD = [], EF = [], cellDot = new Int32Array(N).fill(-1), x, y, i;\r\n    var starts = origins.map(function (o) { return C[o]; });\r\n    for (y = 0; y < ROWS; y++) for (x = 0; x < COLS; x++) {\r\n      i = y * COLS + x;\r\n      if (!land[i]) continue;\r\n      cellDot[i] = DX.length;\r\n      DX.push(x + .5); DY.push(y + .5); DF.push(france[i]);\r\n      EF.push(Math.min(1, (y + .5) \/ 7, (COLS - x - .5) \/ 7, (ROWS - y - .5) \/ 6));\r\n      var d0 = 1e9;\r\n      for (var s = 0; s < starts.length; s++) d0 = Math.min(d0, Math.hypot(x + .5 - starts[s][0], y + .5 - starts[s][1]));\r\n      DD.push(d0);\r\n    }\r\n    var D = DX.length, maxD = 0;\r\n    for (i = 0; i < D; i++) if (DD[i] > maxD) maxD = DD[i];\r\n    \/\/ Tri par distance, pour ne dessiner que l\u2019anneau de l\u2019onde\r\n    var order = DD.map(function (d, k) { return k; }).sort(function (a, b) { return DD[a] - DD[b]; });\r\n    var sortedD = order.map(function (k) { return DD[k]; });\r\n    var lowerBound = function (v) { var lo = 0, hi = D; while (lo < hi) { var m = (lo + hi) >> 1; if (sortedD[m] < v) lo = m + 1; else hi = m; } return lo; };\r\n    \/\/ Autour de chaque pays, les points qui prendront sa teinte\r\n    var halos = {};\r\n    usedC.forEach(function (c) {\r\n      var p = C[c], out = [];\r\n      for (var k = 0; k < D; k++) { var d = Math.hypot(DX[k] - p[0], DY[k] - p[1]); if (d < 4.5) out.push([k, 1 - d \/ 4.5]); }\r\n      halos[c] = out;\r\n    });\r\n    var W = 0, H = 0, cell = 1, dpr = 1, r0 = 1, mk = 1, ox = 0, oy = 0, base = null, geo = [];\r\n    var t0 = 0, started = false, running = false, visible = false, ready = false, raf = 0;\r\n    var filter = { k: 'all' }, hot = null, pinned = -1, overMap = null;\r\n    var pa = pairs.map(function () { return .55; }), pt = pa.slice();\r\n    var ca = {}, ct = {}, ha = {}, ht = {};\r\n    usedC.forEach(function (c) { ca[c] = ct[c] = 1; });\r\n    origins.forEach(function (o) { ha[o] = ht[o] = 1; });\r\n    var lens = { x: 0, y: 0, on: false, amt: 0 };\r\n    var ripples = [], comets = [], nextComet = 0;\r\n    var clamp01 = function (v) { return v < 0 ? 0 : v > 1 ? 1 : v; };\r\n    var ease = function (t) { return t < .5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2; };\r\n    var backOut = function (s) { s -= 1; return 1 + 2.7 * s * s * s + 1.7 * s * s; };\r\n    var bez = function (g, t) { var u = 1 - t; return [u * u * g.a[0] + 2 * u * t * g.c[0] + t * t * g.b[0], u * u * g.a[1] + 2 * u * t * g.c[1] + t * t * g.b[1]]; };\r\n    var dot = function (px, py, r) { ctx.beginPath(); ctx.arc(px, py, r, 0, TAU); ctx.fill(); };\r\n    var trace = function (g, to) {\r\n      ctx.beginPath(); ctx.moveTo(g.a[0], g.a[1]);\r\n      var n = Math.max(2, Math.ceil(36 * to));\r\n      for (var s = 1; s <= n; s++) { var p = bez(g, to * s \/ n); ctx.lineTo(p[0], p[1]); }\r\n    };\r\n    \/\/ Tous les points, en un seul trac\u00e9 par couleur ; `scale` peut varier par point\r\n    var dots = function (c, fr, color, scale) {\r\n      c.fillStyle = color; c.beginPath();\r\n      for (var k = 0; k < D; k++) {\r\n        if (DF[k] !== fr) continue;\r\n        var s = typeof scale === 'function' ? scale(k) : scale;\r\n        if (s <= 0) continue;\r\n        var px = DX[k] * cell, py = DY[k] * cell;\r\n        c.moveTo(px + r0 * s, py); c.arc(px, py, r0 * s, 0, TAU);\r\n      }\r\n      c.fill();\r\n    };\r\n    \/\/ Points de la grille autour d\u2019un point (en cases), pour les ondes et la loupe\r\n    var around = function (cx, cy, R, fn) {\r\n      var x0 = Math.max(0, Math.floor(cx - R)), x1 = Math.min(COLS - 1, Math.ceil(cx + R));\r\n      var y0 = Math.max(0, Math.floor(cy - R)), y1 = Math.min(ROWS - 1, Math.ceil(cy + R));\r\n      for (var yy = y0; yy <= y1; yy++) for (var xx = x0; xx <= x1; xx++) {\r\n        var k = cellDot[yy * COLS + xx];\r\n        if (k >= 0) fn(k, Math.hypot(DX[k] - cx, DY[k] - cy));\r\n      }\r\n    };\r\n    \/\/ Les bords de la grille s\u2019estompent : sur tr\u00e8s grand \u00e9cran, pas de coupure nette\r\n    var fadeEdges = function (c) {\r\n      var gw = COLS * cell, gh = ROWS * cell, e = 7 * cell, f = 6 * cell;\r\n      c.globalCompositeOperation = 'destination-out';\r\n      [[0, 0, 0, e, 0, 0, gw, e], [gw, 0, gw - e, 0, gw - e, 0, e, gh], [0, gh, 0, gh - f, 0, gh - f, gw, f]].forEach(function (z) {\r\n        var g = c.createLinearGradient(z[0], z[1], z[2], z[3]);\r\n        g.addColorStop(0, '#000'); g.addColorStop(1, 'rgba(0,0,0,0)');\r\n        c.fillStyle = g; c.fillRect(z[4], z[5], z[6], z[7]);\r\n      });\r\n      c.globalCompositeOperation = 'source-over';\r\n    };\r\n    \/* Ce qui est mis en avant : le survol prime sur le filtre choisi *\/\r\n    var matches = function (p, f) {\r\n      if (f.k === 'all') return true;\r\n      if (f.k === 'p') return p.i === f.v;\r\n      if (f.k === 'o') return p.o === f.v;\r\n      if (f.k === 'c') return p.c.indexOf(f.v) >= 0;\r\n      return p.type.indexOf(f.v) >= 0;\r\n    };\r\n    var focusOf = function () { return hot || (pinned >= 0 ? { k: 'p', v: pinned } : filter); };\r\n    var recompute = function () {\r\n      var f = focusOf(), all = f.k === 'all', on = pairs.map(function () { return false; });\r\n      projects.forEach(function (p) {\r\n        if (!matches(p, f)) return;\r\n        p.pairs.forEach(function (k) { if (f.k !== 'c' || pairs[k].c === f.v) on[k] = true; });\r\n      });\r\n      var cOn = {}, oOn = {};\r\n      pairs.forEach(function (q, k) {\r\n        pt[k] = all ? .55 : on[k] ? 1 : .07;\r\n        if (on[k]) { cOn[q.c] = 1; oOn[q.o] = 1; }\r\n      });\r\n      usedC.forEach(function (c) { ct[c] = all || cOn[c] ? 1 : .18; });\r\n      origins.forEach(function (o) { ht[o] = all || oOn[o] || (f.k === 'o' && f.v === o) ? 1 : .35; });\r\n      if (calm) draw(performance.now());\r\n    };\r\n    \/* La l\u00e9gende : la liste des exemples, une ligne par projet avec ses pays partenaires *\/\r\n    var row = function (p) {\r\n      var ctry = p.c.map(function (c) { return '<span style=\"color:' + TONEX[CTRY[c][2]] + '\">' + esc(cName(c)) + '<\/span>'; }).join('<i> \u00b7 <\/i>');\r\n      return '<li><button class=\"pj\" type=\"button\" data-p=\"' + p.i + '\" aria-pressed=\"false\">'\r\n        + '<b class=\"pj-name\">' + esc(p.name) + '<\/b><span class=\"pj-ctry\">' + ctry + '<\/span><\/button><\/li>';\r\n    };\r\n    listEl.innerHTML = projects.map(row).join('');\r\n    var hoverTo = function (h) {\r\n      var same = (h && hot && h.k === hot.k && h.v === hot.v) || (!h && !hot);\r\n      if (same) return;\r\n      hot = h; recompute();\r\n    };\r\n    var pjOf = function (e) { var b = e.target.closest('.pj'); return b ? +b.dataset.p : -1; };\r\n    listEl.addEventListener('pointerover', function (e) { var i = pjOf(e); if (i >= 0 && ready) hoverTo({ k: 'p', v: i }); });\r\n    listEl.addEventListener('pointerleave', function () { hoverTo(null); });\r\n    listEl.addEventListener('focusin', function (e) { var i = pjOf(e); if (i >= 0) hoverTo({ k: 'p', v: i }); });\r\n    listEl.addEventListener('focusout', function () { hoverTo(null); });\r\n    listEl.addEventListener('click', function (e) {\r\n      var i = pjOf(e);\r\n      if (i < 0) return;\r\n      pinned = pinned === i ? -1 : i;\r\n      Array.prototype.forEach.call(listEl.querySelectorAll('.pj'), function (b) {\r\n        var on = +b.dataset.p === pinned;\r\n        b.classList.toggle('is-on', on); b.setAttribute('aria-pressed', String(on));\r\n      });\r\n      recompute();\r\n    });\r\n    var layout = function () {\r\n      var rect = canvas.getBoundingClientRect();\r\n      W = rect.width; H = rect.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, W * H > 1.2e6 ? 1.5 : 2);\r\n      canvas.width = Math.round(W * dpr); canvas.height = Math.round(H * dpr);\r\n      \/\/ Plein cadre, l\u2019Europe commence apr\u00e8s la colonne de texte ; empil\u00e9e, elle remplit son cadre\r\n      var full = getComputedStyle(holder).position === 'absolute';\r\n      var L = full ? col.getBoundingClientRect().right - rect.left + 40 : 6, R = full ? 16 : 6, T = full ? 28 : 6;\r\n      \/\/ En bas, la carte s\u2019arr\u00eate au-dessus de la cl\u00e9 des symboles\r\n      var B = full ? rect.bottom - key.getBoundingClientRect().top + 16 : 6;\r\n      var rw = ROI[2] - ROI[0], rh = ROI[3] - ROI[1];\r\n      cell = Math.min((W - L - R) \/ rw, (H - T - B) \/ rh);\r\n      ox = L + (W - L - R - rw * cell) \/ 2 - ROI[0] * cell;\r\n      oy = T + (H - T - B - rh * cell) \/ 2 - ROI[1] * cell;\r\n      r0 = Math.max(.8, cell * .28);\r\n      mk = Math.max(.6, Math.min(1.5, cell \/ 6));\r\n      \/\/ Couche fixe : tous les points \u00e0 leur taille de repos\r\n      base = document.createElement('canvas');\r\n      base.width = canvas.width; base.height = canvas.height;\r\n      var b = base.getContext('2d');\r\n      b.setTransform(dpr, 0, 0, dpr, ox * dpr, oy * dpr);\r\n      dots(b, 0, LAND, 1); dots(b, 1, FR, 1);\r\n      fadeEdges(b);\r\n      \/\/ G\u00e9om\u00e9trie des ponts : une arche qui monte toujours vers le haut\r\n      geo = pairs.map(function (q) {\r\n        var A = [C[q.o][0] * cell, C[q.o][1] * cell], B = [C[q.c][0] * cell, C[q.c][1] * cell], tone = TONE[CTRY[q.c][2]];\r\n        var dx = B[0] - A[0], dy = B[1] - A[1], len = Math.hypot(dx, dy), nx = -dy \/ len, ny = dx \/ len;\r\n        if (ny > 0) { nx = -nx; ny = -ny; }\r\n        var grad = ctx.createLinearGradient(A[0], A[1], B[0], B[1]);\r\n        grad.addColorStop(0, TEAL); grad.addColorStop(1, tone);\r\n        return { a: A, b: B, c: [(A[0] + B[0]) \/ 2 + nx * len * .3, (A[1] + B[1]) \/ 2 + ny * len * .3], tone: tone, grad: grad, w: 1 + .35 * Math.min(q.n, 6) };\r\n      });\r\n      if (!running) draw(performance.now());\r\n    };\r\n    var draw = function (now) {\r\n      if (!base) return;\r\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n      if (!started) return;\r\n      var t = calm ? 1e9 : now - t0, k, q, n;\r\n      if (t < 0) return;\r\n      var lerp = calm ? 1 : .12;\r\n      for (k = 0; k < pairs.length; k++) pa[k] += (pt[k] - pa[k]) * lerp;\r\n      usedC.forEach(function (c) { ca[c] += (ct[c] - ca[c]) * lerp; });\r\n      origins.forEach(function (o) { ha[o] += (ht[o] - ha[o]) * lerp; });\r\n      \/\/ 1. Les points naissent depuis les hubs, puis restent pos\u00e9s\r\n      if (t < T_DOTS + 500) {\r\n        ctx.setTransform(dpr, 0, 0, dpr, ox * dpr, oy * dpr);\r\n        var born = function (k) { return backOut(clamp01((t - DD[k] \/ maxD * T_DOTS) \/ 500)); };\r\n        dots(ctx, 0, LAND, born); dots(ctx, 1, FR, born);\r\n        fadeEdges(ctx);\r\n      } else {\r\n        ctx.drawImage(base, 0, 0);\r\n        ctx.setTransform(dpr, 0, 0, dpr, ox * dpr, oy * dpr);\r\n      }\r\n      \/\/ 2. Autour de chaque pays reli\u00e9, les points prennent sa teinte\r\n      usedC.forEach(function (c) {\r\n        var since = t - landT[c];\r\n        if (since <= 0) return;\r\n        var rv = ease(clamp01(since \/ 900)) * ca[c];\r\n        ctx.fillStyle = TONE[CTRY[c][2]];\r\n        halos[c].forEach(function (h) {\r\n          ctx.globalAlpha = rv * (.25 + .65 * h[1]);\r\n          dot(DX[h[0]] * cell, DY[h[0]] * cell, r0 * (1 + .45 * h[1] * rv));\r\n        });\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 3. Ondes dans la grille : arriv\u00e9es des ponts et des \u00e9clats\r\n      ripples = ripples.filter(function (rp) {\r\n        var p = (now - rp.t) \/ rp.dur;\r\n        if (p >= 1) return false;\r\n        var R = rp.max * ease(p), band = 1.7, fade = 1 - p;\r\n        ctx.fillStyle = rp.tone;\r\n        around(rp.x, rp.y, R + band, function (k, d) {\r\n          var w = 1 - Math.abs(d - R) \/ band;\r\n          if (w <= 0) return;\r\n          ctx.globalAlpha = w * fade * rp.a * EF[k];\r\n          dot(DX[k] * cell, DY[k] * cell, r0 * (1 + w * fade));\r\n        });\r\n        return true;\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 4. Une onde repart des hubs et traverse l\u2019Europe\r\n      if (!calm && t > T_END) {\r\n        var sp = ((t - T_END) % 6400) \/ 4200;\r\n        if (sp < 1) {\r\n          var R = sp * (maxD + 3), band = 2.4, hi = lowerBound(R + band), fade = 1 - sp;\r\n          ctx.fillStyle = TEAL;\r\n          for (var w0 = lowerBound(R - band); w0 < hi; w0++) {\r\n            k = order[w0];\r\n            var w = 1 - Math.abs(DD[k] - R) \/ band;\r\n            ctx.globalAlpha = w * fade * .45 * EF[k];\r\n            dot(DX[k] * cell, DY[k] * cell, r0 * (1 + .6 * w));\r\n          }\r\n          ctx.globalAlpha = 1;\r\n        }\r\n      }\r\n      \/\/ 5. La loupe : le pointeur grossit les points qu\u2019il survole\r\n      lens.amt += ((lens.on ? 1 : 0) - lens.amt) * .15;\r\n      if (lens.amt > .02) {\r\n        around(lens.x \/ cell, lens.y \/ cell, 6, function (k, d) {\r\n          if (d > 6) return;\r\n          var w = 1 - d \/ 6;\r\n          w = w * w * (3 - 2 * w);\r\n          ctx.globalAlpha = w * lens.amt * EF[k];\r\n          ctx.fillStyle = DF[k] ? TEAL : '#93a6a6';\r\n          dot(DX[k] * cell, DY[k] * cell, r0 * (1 + 1.1 * w * lens.amt));\r\n        });\r\n        ctx.globalAlpha = 1;\r\n      }\r\n      \/\/ 6. Le r\u00e9seau national : les hubs reli\u00e9s entre eux, en pointill\u00e9s\r\n      var net = ease(clamp01((t - T_NET) \/ 800));\r\n      if (net > 0) {\r\n        ctx.lineCap = 'round'; ctx.setLineDash([0, 4 * mk]); ctx.lineWidth = 1.4 * mk; ctx.strokeStyle = 'rgba(31,74,77,.45)';\r\n        NET.forEach(function (e) {\r\n          var a = C[e[0]], b = C[e[1]];\r\n          ctx.beginPath(); ctx.moveTo(a[0] * cell, a[1] * cell);\r\n          ctx.lineTo((a[0] + (b[0] - a[0]) * net) * cell, (a[1] + (b[1] - a[1]) * net) * cell); ctx.stroke();\r\n        });\r\n        ctx.setLineDash([]);\r\n      }\r\n      \/\/ 7. Les ponts : halo, trait en d\u00e9grad\u00e9, t\u00eate qui avance\r\n      ctx.lineCap = 'round';\r\n      for (k = 0; k < pairs.length; k++) {\r\n        var g = geo[k], local = (t - T_ARC - pairs[k].r * GAP) \/ DUR;\r\n        if (local <= 0) continue;\r\n        var prog = ease(Math.min(1, local)), a = pa[k];\r\n        trace(g, prog);\r\n        if (a > .8) { ctx.globalAlpha = .1 * a; ctx.strokeStyle = g.tone; ctx.lineWidth = (g.w + 5) * mk; ctx.stroke(); }\r\n        ctx.globalAlpha = a; ctx.strokeStyle = g.grad; ctx.lineWidth = g.w * mk * (a > .9 ? 1.25 : 1); ctx.stroke();\r\n        if (local < 1) {\r\n          var hd = bez(g, prog);\r\n          ctx.fillStyle = g.tone;\r\n          ctx.globalAlpha = .2; dot(hd[0], hd[1], 6 * mk);\r\n          ctx.globalAlpha = 1; dot(hd[0], hd[1], 2.6 * mk);\r\n          ctx.fillStyle = '#fff'; dot(hd[0], hd[1], 1.1 * mk);\r\n        } else if (!pairs[k].landed) {\r\n          pairs[k].landed = true;\r\n          if (!calm) ripples.push({ x: C[pairs[k].c][0], y: C[pairs[k].c][1], t: now, dur: 1300, max: 7, tone: g.tone, a: .8 });\r\n        }\r\n      }\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 8. Des \u00e9clats circulent sur les ponts mis en avant, dans un sens ou dans l\u2019autre\r\n      if (!calm && t > T_END) {\r\n        if (now > nextComet) {\r\n          var pool = [];\r\n          pairs.forEach(function (q, k) { if (pt[k] > .5) for (var m = 0; m < q.n; m++) pool.push(k); });\r\n          if (pool.length) comets.push({ i: pool[Math.floor(Math.random() * pool.length)], t: now, back: Math.random() < .3 });\r\n          nextComet = now + 520;\r\n        }\r\n        comets = comets.filter(function (cm) {\r\n          var p = (now - cm.t) \/ 1500, g = geo[cm.i], q = pairs[cm.i];\r\n          if (p >= 1) {\r\n            var end = C[cm.back ? q.o : q.c];\r\n            ripples.push({ x: end[0], y: end[1], t: now, dur: 900, max: 4.5, tone: cm.back ? TEAL : g.tone, a: .7 * pa[cm.i] });\r\n            return false;\r\n          }\r\n          var e = ease(p);\r\n          ctx.fillStyle = g.tone;\r\n          for (var s = 8; s >= 0; s--) {\r\n            var u = e - s * .018;\r\n            if (u < 0) continue;\r\n            var pt2 = bez(g, cm.back ? 1 - u : u);\r\n            ctx.globalAlpha = (1 - s \/ 9) * .9 * pa[cm.i];\r\n            dot(pt2[0], pt2[1], (s ? 2.3 - s * .17 : 2.9) * mk);\r\n          }\r\n          var hd2 = bez(g, cm.back ? 1 - e : e);\r\n          ctx.globalAlpha = pa[cm.i]; ctx.fillStyle = '#fff'; dot(hd2[0], hd2[1], 1.1 * mk);\r\n          return true;\r\n        });\r\n        ctx.globalAlpha = 1;\r\n      }\r\n      \/\/ 9. Les pays reli\u00e9s : un disque blanc cercl\u00e9 de leur teinte\r\n      usedC.forEach(function (c) {\r\n        var since = t - landT[c];\r\n        if (since <= 0) return;\r\n        var p = C[c], s = backOut(clamp01(since \/ 500)), tone = TONE[CTRY[c][2]];\r\n        ctx.globalAlpha = Math.max(.25, ca[c]);\r\n        ctx.fillStyle = '#fff'; dot(p[0] * cell, p[1] * cell, 4.6 * mk * s);\r\n        ctx.lineWidth = 1.8 * mk; ctx.strokeStyle = tone; ctx.stroke();\r\n        ctx.fillStyle = tone; dot(p[0] * cell, p[1] * cell, 1.9 * mk * s);\r\n        if (overMap && overMap.k === 'c' && overMap.v === c && !calm) {\r\n          var pq = (now % 1400) \/ 1400;\r\n          ctx.globalAlpha = (1 - pq) * .6; ctx.lineWidth = 1.2;\r\n          ctx.beginPath(); ctx.arc(p[0] * cell, p[1] * cell, (5 + pq * 14) * mk, 0, TAU); ctx.stroke();\r\n        }\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 10. Les villes des structures, par-dessus tout : un anneau d\u2019encre qui respire\r\n      var hp = clamp01((t - 200) \/ 500);\r\n      origins.forEach(function (o, j) {\r\n        var p = C[o], px = p[0] * cell, py = p[1] * cell, a = hp * Math.max(.3, ha[o]);\r\n        if (!ORIG[o][2]) {\r\n          ctx.globalAlpha = a; ctx.fillStyle = '#fff'; dot(px, py, 3.6 * mk);\r\n          ctx.fillStyle = TEAL; dot(px, py, 2.1 * mk);\r\n          return;\r\n        }\r\n        var br = calm ? .5 : (Math.sin(now \/ 1100 + j * 1.3) + 1) \/ 2;\r\n        var focus = (filter.k === 'o' && filter.v === o) || (hot && hot.k === 'o' && hot.v === o);\r\n        ctx.globalAlpha = a;\r\n        ctx.fillStyle = 'rgba(31,74,77,' + (.1 + .08 * br + (focus ? .1 : 0)) + ')'; dot(px, py, (8 + 3 * br + (focus ? 3 : 0)) * mk);\r\n        ctx.fillStyle = '#fff'; dot(px, py, 6 * mk);\r\n        ctx.lineWidth = 1.8 * mk; ctx.strokeStyle = INK;\r\n        if (o === 'om') ctx.setLineDash([2 * mk, 2 * mk]);\r\n        ctx.beginPath(); ctx.arc(px, py, 5.4 * mk, 0, TAU); ctx.stroke();\r\n        ctx.setLineDash([]);\r\n        ctx.fillStyle = INK; dot(px, py, 2.5 * mk);\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ Les libell\u00e9s ne se posent qu\u2019une fois les ponts immobiles\r\n      if (!ready && t >= T_END + 150) { ready = true; legend.classList.add('is-ready'); }\r\n    };\r\n    var loop = function (now) { draw(now); if (running) raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || running || !visible || !started || document.hidden) return; running = true; raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    \/\/ Survol de la carte : la ville ou le pays le plus proche, et son infobulle\r\n    var showTip = function (m) {\r\n      if (!m) { tip.classList.remove('is-on'); return; }\r\n      var p = C[m.v], n = m.k === 'o' ? perO[m.v] : perC[m.v];\r\n      var name = m.k === 'o' ? oName(m.v) : cName(m.v);\r\n      var sub = plural(n, 'projet', 'projets');\r\n      tip.innerHTML = '<b>' + esc(name) + '<\/b><span>' + esc(sub) + '<\/span>';\r\n      tip.style.transform = 'translate(' + (ox + p[0] * cell) + 'px,' + (oy + p[1] * cell) + 'px)';\r\n      tip.classList.add('is-on');\r\n    };\r\n    canvas.addEventListener('pointermove', function (e) {\r\n      var r = canvas.getBoundingClientRect(), px = e.clientX - r.left - ox, py = e.clientY - r.top - oy;\r\n      lens.x = px; lens.y = py; lens.on = !calm;\r\n      if (!ready) return;\r\n      var best = null, bd = Math.max(12, 9 * mk);\r\n      origins.forEach(function (o) { var d = Math.hypot(C[o][0] * cell - px, C[o][1] * cell - py); if (d < bd) { bd = d; best = { k: 'o', v: o }; } });\r\n      usedC.forEach(function (c) { var d = Math.hypot(C[c][0] * cell - px, C[c][1] * cell - py); if (d < bd) { bd = d; best = { k: 'c', v: c }; } });\r\n      canvas.style.cursor = best ? 'pointer' : '';\r\n      if ((best && overMap && best.v === overMap.v) || (!best && !overMap)) return;\r\n      overMap = best; showTip(best); hoverTo(best);\r\n    });\r\n    canvas.addEventListener('pointerleave', function () { lens.on = false; overMap = null; showTip(null); hoverTo(null); });\r\n    if ('ResizeObserver' in window) new ResizeObserver(layout).observe(canvas); else window.addEventListener('resize', layout);\r\n    layout();\r\n    var start = function () { if (!started) { started = true; t0 = performance.now() + 400; } };\r\n    if (calm) { start(); ready = true; legend.classList.add('is-ready'); draw(performance.now()); }\r\n    else if ('IntersectionObserver' in window) {\r\n      new IntersectionObserver(function (entries) {\r\n        visible = entries[0].isIntersecting;\r\n        if (visible) { start(); play(); } else pause();\r\n      }, { threshold: .25 }).observe(canvas);\r\n    } else { visible = true; start(); play(); }\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n  })();\r\n  \/* ---------------- Formats : la salle se recompose ---------------- *\/\r\n  \/\/ Les m\u00eames points changent de salle \u00e0 chaque format : une pl\u00e9ni\u00e8re que\r\n  \/\/ l\u2019intervenant \u00e9claire par vagues, une \u00e9quipe resserr\u00e9e autour d\u2019un\r\n  \/\/ programme cibl\u00e9, une cohorte qui alterne temps collectif et temps\r\n  \/\/ individuel, puis un porteur de projet et son accompagnateur qui tissent\r\n  \/\/ des liens vers des partenaires. Comme pour les territoires, la barre de\r\n  \/\/ l\u2019onglet actif sert de minuterie : le cycle s\u2019arr\u00eate au survol et c\u00e8de la\r\n  \/\/ main au premier clic.\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-studio]');\r\n    if (!box) return;\r\n    var thumb = box.querySelector('.fmt-thumb');\r\n    var tabs = Array.prototype.slice.call(box.querySelectorAll('[role=\"tab\"]'));\r\n    var panels = tabs.map(function (t) { return document.getElementById(t.getAttribute('aria-controls')); });\r\n    var capEl = box.querySelector('[data-stage-cap]'), countEl = box.querySelector('[data-stage-count]');\r\n    var cv = box.querySelector('.stage canvas'), g = cv.getContext('2d');\r\n    var HUES = ['#c86a5e', '#b25f35', '#bd9035', '#8d9b4e', '#55926f', '#6d9b93', '#4b8296', '#45508a', '#8480be', '#92557c'];\r\n    var HUE = [HUES[0], HUES[2], HUES[4], HUES[8]];\r\n    var VW = 640, VH = 440, CX = 320, CY = 220, TAU = 6.2832, INK = '#173540', TABLE = '#eef1ec';\r\n    var N = 37; \/\/ 0 : l\u2019intervenant SHL ; 1 \u00e0 36 : les participants\r\n    var j;\r\n    \/\/ Salle 1 : trois rangs en arc de cercle, face \u00e0 l\u2019intervenant\r\n    var SPK = [CX, 92], ROWS1 = [[112, 6], [176, 8], [240, 8]], seats = [];\r\n    ROWS1.forEach(function (r) {\r\n      for (var s = 0; s < r[1]; s++) { var a = (30 + 120 * s \/ (r[1] - 1)) * Math.PI \/ 180; seats.push([SPK[0] + r[0] * Math.cos(a), SPK[1] + r[0] * Math.sin(a)]); }\r\n    });\r\n    \/\/ Salle 3 : la cohorte en disque (temps collectif), puis en six tables\r\n    var disc = [], tables = [], atelier = [];\r\n    for (j = 0; j < 36; j++) { var rr = 34 + 124 * Math.sqrt(j \/ 35), aa = j * 2.39996; disc.push([CX + rr * Math.cos(aa), CY + rr * Math.sin(aa)]); }\r\n    for (j = 0; j < 6; j++) tables.push([170 + (j % 3) * 150, 138 + Math.floor(j \/ 3) * 164]);\r\n    for (j = 0; j < 36; j++) { var tb = tables[j % 6], an = Math.floor(j \/ 6) * TAU \/ 6 + (j % 6) * .35; atelier.push([tb[0] + 38 * Math.cos(an), tb[1] + 38 * Math.sin(an)]); }\r\n    var A_T = 2400, B_T = 3200, SEANCE = A_T + B_T;\r\n    var cohort = function (lt) {\r\n      var m = lt % SEANCE, n = Math.floor(lt \/ SEANCE);\r\n      return { b: m >= A_T, n: n % 10 + 1, visit: (n * 3 + Math.floor(Math.max(0, m - A_T) \/ (B_T \/ 3))) % 6 };\r\n    };\r\n    \/\/ Salle 4 : dix partenaires possibles, trouv\u00e9s un \u00e0 un\r\n    var MATES = 10, SEQ = [2, 7, 4, 9, 0, 5, 3, 8, 1, 6], M0 = 1100, M_T = 1500, M_DRAW = 950, M_MAX = 6;\r\n    var matches = function (lt) {\r\n      var q = lt - M0, idx = Math.floor(q \/ M_T), p = (q - idx * M_T) \/ M_DRAW;\r\n      var done = q < 0 ? 0 : Math.min(M_MAX, idx + (p >= 1 ? 1 : 0)), set = {};\r\n      for (var s = 0; s < done; s++) set[SEQ[s]] = true;\r\n      return { done: done, cur: q >= 0 && idx < M_MAX && p < 1 ? SEQ[idx] : -1, p: Math.max(0, Math.min(1, p)), set: set };\r\n    };\r\n    var D = [];\r\n    for (j = 0; j < N; j++) D.push({ x: CX, y: CY, vx: 0, vy: 0, s: 0, a: 0, tx: CX, ty: CY, ts: 0, ta: 0, wx: CX, wy: CY, ws: 0, wa: 0, glow: 0, hold: 0, hollow: false, ph: j * 2.39996, tone: j ? HUES[(j * 3 + 1) % 10] : INK });\r\n    var rank = D.map(function (d, k) { return (k * 17) % N; }); \/\/ ordre de d\u00e9part, m\u00e9lang\u00e9\r\n    var active = 0, t0 = 0, last = 0, auto = !calm, visible = false, started = false, running = false, raf = 0;\r\n    var ga = [1, 0, 0, 0], pa = 0, found = 0, ripples = [], capText = '', capTimer = 0;\r\n    var W = 0, H = 0, dpr = 1, sc = 1, ox = 0, oy = 0, k = 1, R0 = 7;\r\n    \/\/ O\u00f9 chaque point veut aller, \u00e0 l\u2019instant lt du format f\r\n    var place = function (f, lt) {\r\n      var d, s;\r\n      for (s = 0; s < N; s++) { d = D[s]; d.wx = d.tx; d.wy = d.ty; d.ws = 0; d.wa = 0; d.hollow = false; }\r\n      var set = function (n, x, y, sz, al) { var e = D[n]; e.wx = x; e.wy = y; e.ws = sz; e.wa = al === undefined ? 1 : al; };\r\n      if (f === 0) {\r\n        set(0, SPK[0], SPK[1], 1.3);\r\n        for (s = 0; s < seats.length; s++) set(s + 1, seats[s][0], seats[s][1], 1);\r\n      } else if (f === 1) {\r\n        for (s = 0; s < 9; s++) { var a = -Math.PI \/ 2 + s * TAU \/ 9 + lt * .00012; set(s, CX + 128 * Math.cos(a), CY + 128 * Math.sin(a), s ? 1.1 : 1.3); }\r\n      } else if (f === 2) {\r\n        var c = cohort(lt), v = c.b ? tables[c.visit] : [CX, CY];\r\n        for (s = 0; s < 36; s++) { var q = c.b ? atelier[s] : disc[s]; set(s + 1, q[0], q[1], 1); }\r\n        set(0, v[0], v[1], 1.3);\r\n      } else {\r\n        var th = lt * .0005, px = 46 * Math.cos(th), py = 22 * Math.sin(th), m = matches(lt);\r\n        set(1, CX - px, CY - py, 1.7);\r\n        set(0, CX + px, CY + py, 1.35);\r\n        for (s = 0; s < MATES; s++) {\r\n          var am = -Math.PI \/ 2 + s * TAU \/ MATES + .31 + lt * .00004, on = m.set[s];\r\n          set(s + 2, CX + 236 * Math.cos(am), CY + 150 * Math.sin(am), on ? 1.05 : .85, on ? 1 : .7);\r\n          D[s + 2].hollow = !on;\r\n        }\r\n      }\r\n    };\r\n    \/\/ Des ressorts un peu souples : la salle se recompose comme une foule\r\n    var step = function (dt, now) {\r\n      var e = 1 - Math.exp(-dt * 7);\r\n      for (var s = 0; s < N; s++) {\r\n        var d = D[s];\r\n        if (now >= d.hold) { d.tx = d.wx; d.ty = d.wy; d.ts = d.ws; d.ta = d.wa; }\r\n        d.vx += ((d.tx - d.x) * 70 - d.vx * 12) * dt; d.vy += ((d.ty - d.y) * 70 - d.vy * 12) * dt;\r\n        d.x += d.vx * dt; d.y += d.vy * dt;\r\n        d.s += (d.ts - d.s) * e; d.a += (d.ta - d.a) * e;\r\n        d.glow *= Math.exp(-dt * 2.2);\r\n      }\r\n    };\r\n    var circle = function (x, y, r) { g.beginPath(); g.arc(x, y, r, 0, TAU); g.fill(); };\r\n    var ring = function (x, y, r) { g.beginPath(); g.arc(x, y, r, 0, TAU); g.stroke(); };\r\n    \/\/ Un lien courbe du porteur vers un partenaire, trac\u00e9 jusqu\u2019\u00e0 `to`\r\n    var link = function (A, B, to, tone, alpha, head) {\r\n      var mx = (A.x + B.x) \/ 2, my = (A.y + B.y) \/ 2, dx = B.x - A.x, dy = B.y - A.y, l = Math.hypot(dx, dy) || 1;\r\n      var nx = -dy \/ l, ny = dx \/ l;\r\n      if ((mx - CX) * nx + (my - CY) * ny < 0) { nx = -nx; ny = -ny; }\r\n      var cx = mx + nx * l * .2, cy = my + ny * l * .2, n = Math.max(2, Math.ceil(28 * to)), x = A.x, y = A.y;\r\n      g.globalAlpha = alpha * ga[3]; g.strokeStyle = tone; g.lineWidth = 1.5 * k;\r\n      g.beginPath(); g.moveTo(A.x, A.y);\r\n      for (var s = 1; s <= n; s++) { var u = to * s \/ n, w = 1 - u; x = w * w * A.x + 2 * w * u * cx + u * u * B.x; y = w * w * A.y + 2 * w * u * cy + u * u * B.y; g.lineTo(x, y); }\r\n      g.stroke();\r\n      if (head) { g.fillStyle = tone; g.globalAlpha = .2 * ga[3]; circle(x, y, 7 * k); g.globalAlpha = ga[3]; circle(x, y, 3 * k); g.fillStyle = '#fff'; circle(x, y, 1.2 * k); }\r\n    };\r\n    var draw = function (lt, now) {\r\n      g.setTransform(1, 0, 0, 1, 0, 0);\r\n      g.clearRect(0, 0, cv.width, cv.height);\r\n      if (!W) return;\r\n      g.setTransform(dpr * sc, 0, 0, dpr * sc, dpr * ox, dpr * oy);\r\n      g.lineCap = 'round';\r\n      var s, p, d, live = !calm;\r\n      \/\/ 1. La pl\u00e9ni\u00e8re : rangs en pointill\u00e9s, vagues qui partent de l\u2019intervenant\r\n      if (ga[0] > .01) {\r\n        g.globalAlpha = ga[0]; g.setLineDash([0, 7]); g.lineWidth = 1.6 * k; g.strokeStyle = 'rgba(23,53,64,.2)';\r\n        ROWS1.forEach(function (r) { g.beginPath(); g.arc(SPK[0], SPK[1], r[0], .44, 2.7); g.stroke(); });\r\n        g.setLineDash([]);\r\n        if (live && active === 0) {\r\n          for (var w = 0; w < 2; w++) {\r\n            var q = lt - 700 - w * 1100;\r\n            if (q < 0) continue;\r\n            p = (q % 2200) \/ 2200;\r\n            var R = 18 + p * 290;\r\n            g.globalAlpha = ga[0] * Math.pow(1 - p, 1.5) * .6; g.strokeStyle = HUE[0]; g.lineWidth = 2 * k;\r\n            g.beginPath(); g.arc(SPK[0], SPK[1], R, .3, 2.84); g.stroke();\r\n            for (s = 1; s <= seats.length; s++) {\r\n              d = D[s];\r\n              var gap = Math.abs(Math.hypot(d.x - SPK[0], d.y - SPK[1]) - R);\r\n              if (gap < 16) d.glow = Math.max(d.glow, 1 - gap \/ 16);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \/\/ 2. L\u2019\u00e9quipe : une table, une cible, un filet entre les membres\r\n      if (ga[1] > .01) {\r\n        g.globalAlpha = ga[1]; g.fillStyle = '#fff'; circle(CX, CY, 82);\r\n        g.strokeStyle = '#e1e6e0'; g.lineWidth = k; ring(CX, CY, 82);\r\n        g.strokeStyle = HUE[1]; g.lineWidth = 1.5 * k;\r\n        [18, 32, 46].forEach(function (r, n) { g.globalAlpha = ga[1] * (.9 - n * .28); ring(CX, CY, r); });\r\n        g.globalAlpha = ga[1]; g.fillStyle = HUE[1]; circle(CX, CY, 7);\r\n        if (live) { p = (lt % 1800) \/ 1800; g.globalAlpha = ga[1] * (1 - p) * .35; ring(CX, CY, 46 + p * 40); }\r\n        g.globalAlpha = ga[1]; g.lineWidth = k; g.strokeStyle = 'rgba(23,53,64,.08)'; g.beginPath();\r\n        for (s = 0; s < 9; s++) for (var t = s + 1; t < 9; t++) { g.moveTo(D[s].x, D[s].y); g.lineTo(D[t].x, D[t].y); }\r\n        g.stroke();\r\n        if (live && active === 1 && lt > 900) {\r\n          for (s = 0; s < 9; s++) {\r\n            p = ((lt - 900 + s * 260) % 1800) \/ 1800;\r\n            var e = p * p * .8;\r\n            g.globalAlpha = ga[1] * Math.sin(Math.PI * p); g.fillStyle = D[s].tone;\r\n            circle(D[s].x + (CX - D[s].x) * e, D[s].y + (CY - D[s].y) * e, 2.8 * k);\r\n          }\r\n        }\r\n      }\r\n      \/\/ 3. La cohorte : un grand cercle, puis six tables ; l\u2019intervenant passe de l\u2019une \u00e0 l\u2019autre\r\n      if (ga[2] > .01) {\r\n        g.globalAlpha = ga[2] * (1 - pa); g.setLineDash([0, 7]); g.strokeStyle = 'rgba(23,53,64,.2)'; g.lineWidth = 1.6 * k;\r\n        ring(CX, CY, 178); g.setLineDash([]);\r\n        if (active === 2 && pa > .01) {\r\n          var v = tables[cohort(lt).visit];\r\n          g.globalAlpha = ga[2] * pa * .12; g.fillStyle = HUE[2]; circle(v[0], v[1], 60);\r\n        }\r\n        g.globalAlpha = ga[2] * pa;\r\n        tables.forEach(function (tb) { g.fillStyle = '#fff'; circle(tb[0], tb[1], 20); g.strokeStyle = '#e1e6e0'; g.lineWidth = k; ring(tb[0], tb[1], 20); });\r\n      }\r\n      \/\/ 4. Le porteur et son accompagnateur, li\u00e9s par une tresse ; les partenaires autour\r\n      if (ga[3] > .01) {\r\n        g.globalAlpha = ga[3]; g.setLineDash([0, 7]); g.strokeStyle = 'rgba(23,53,64,.18)'; g.lineWidth = 1.6 * k;\r\n        g.beginPath(); g.ellipse(CX, CY, 236, 150, 0, 0, TAU); g.stroke(); g.setLineDash([]);\r\n        if (active === 3) {\r\n          var m = matches(lt);\r\n          for (s = 0; s < MATES; s++) if (m.set[s]) link(D[1], D[s + 2], 1, D[s + 2].tone, .5, false);\r\n          if (m.cur >= 0) link(D[1], D[m.cur + 2], m.p, D[m.cur + 2].tone, .9, live);\r\n        }\r\n        var P = D[1], Q = D[0], bx = Q.x - P.x, by = Q.y - P.y, bl = Math.hypot(bx, by) || 1;\r\n        g.lineWidth = 1.6 * k;\r\n        for (s = 0; s < 3; s++) {\r\n          g.globalAlpha = ga[3] * .85; g.strokeStyle = [HUES[8], HUES[4], HUES[0]][s]; g.beginPath();\r\n          for (var n = 0; n <= 24; n++) {\r\n            var u = n \/ 24, off = 9 * Math.sin(Math.PI * u) * Math.sin(u * TAU * 1.5 + s * TAU \/ 3 + lt * .004);\r\n            var x = P.x + bx * u - by \/ bl * off, y = P.y + by * u + bx \/ bl * off;\r\n            n ? g.lineTo(x, y) : g.moveTo(x, y);\r\n          }\r\n          g.stroke();\r\n        }\r\n      }\r\n      \/\/ Ondes d\u2019arriv\u00e9e\r\n      ripples = ripples.filter(function (rp) {\r\n        var q = (now - rp.t) \/ 900;\r\n        if (q >= 1) return false;\r\n        g.globalAlpha = (1 - q) * .6; g.strokeStyle = rp.c; g.lineWidth = 1.5 * k; ring(rp.x, rp.y, 8 + q * 26);\r\n        return true;\r\n      });\r\n      \/\/ Les personnes : les participants, puis l\u2019intervenant par-dessus\r\n      var wob = live ? 1.6 : 0;\r\n      for (var o = 1; o <= N; o++) {\r\n        s = o % N; d = D[s];\r\n        if (d.s < .03 || d.a < .02) continue;\r\n        var dx = d.x + wob * Math.sin(now * .0011 + d.ph), dy = d.y + wob * Math.cos(now * .0013 + d.ph * 1.3), r = R0 * d.s;\r\n        if (d.glow > .02) { g.globalAlpha = d.a * .24 * d.glow; g.fillStyle = d.tone; circle(dx, dy, r * (1.8 + d.glow)); }\r\n        g.globalAlpha = d.a; g.fillStyle = '#fff'; circle(dx, dy, r + 2.2 * k);\r\n        if (d.hollow) { g.strokeStyle = d.tone; g.lineWidth = 1.6 * k; ring(dx, dy, r - .8 * k); }\r\n        else { g.fillStyle = d.tone; circle(dx, dy, r); }\r\n        if (!s) {\r\n          g.fillStyle = '#fff'; circle(dx, dy, r * .36);\r\n          if (live) { p = (now % 2400) \/ 2400; g.globalAlpha = d.a * (1 - p) * .35; g.strokeStyle = INK; g.lineWidth = k; ring(dx, dy, r + 4 + p * 16); }\r\n        }\r\n      }\r\n      g.globalAlpha = 1;\r\n    };\r\n    var pad = function (n) { return (n < 10 ? '0' : '') + n; };\r\n    var caption = function (lt) {\r\n      if (active === 0) return tr('Pl\u00e9ni\u00e8re \u00b7 1 journ\u00e9e');\r\n      if (active === 1) return tr('\u00c9quipe interne \u00b7 programme cibl\u00e9');\r\n      if (active === 2) { var c = cohort(lt); return tr('S\u00e9ance ') + pad(c.n) + ' \u00b7 ' + tr(c.b ? 'temps individuel' : 'temps collectif'); }\r\n      var n = matches(lt).done;\r\n      return n ? n + tr(n > 1 ? ' partenaires trouv\u00e9s' : ' partenaire trouv\u00e9') : tr('Recherche de partenaires');\r\n    };\r\n    var setCap = function (txt) {\r\n      if (txt === capText) return;\r\n      capText = txt;\r\n      if (calm) { capEl.textContent = txt; return; }\r\n      capEl.classList.add('is-swap');\r\n      clearTimeout(capTimer);\r\n      capTimer = setTimeout(function () { capEl.textContent = capText; capEl.classList.remove('is-swap'); }, 220);\r\n    };\r\n    \/\/ Sans animation : chaque salle est pos\u00e9e d\u2019un coup, \u00e0 un instant parlant\r\n    var still = function () {\r\n      var lt = [1800, 2000, A_T + 400, M0 + 3 * M_T + M_DRAW + 100][active];\r\n      place(active, lt);\r\n      D.forEach(function (d) { d.x = d.tx = d.wx; d.y = d.ty = d.wy; d.s = d.ts = d.ws; d.a = d.ta = d.wa; d.vx = d.vy = 0; d.glow = 0; });\r\n      ga = ga.map(function (x, f) { return f === active ? 1 : 0; });\r\n      pa = active === 2 && cohort(lt).b ? 1 : 0;\r\n      draw(lt, 0);\r\n      setCap(caption(lt));\r\n    };\r\n    \/\/ La pastille blanche glisse sous l\u2019onglet actif, comme dans l\u2019en-t\u00eate\r\n    var thumbSet = false;\r\n    var placeThumb = function () {\r\n      var t = tabs[active];\r\n      if (!t.offsetWidth) return;\r\n      if (!thumbSet) thumb.style.transition = 'none';\r\n      thumb.style.width = t.offsetWidth + 'px'; thumb.style.height = t.offsetHeight + 'px';\r\n      thumb.style.transform = 'translate(' + t.offsetLeft + 'px,' + t.offsetTop + 'px)';\r\n      if (!thumbSet) { void thumb.offsetWidth; thumb.style.transition = ''; thumbSet = true; }\r\n    };\r\n    var stopAuto = function () { auto = false; box.classList.remove('is-auto'); };\r\n    var select = function (f) {\r\n      if (f === active) return;\r\n      active = f; found = 0; ripples = [];\r\n      t0 = performance.now();\r\n      box.setAttribute('data-fmt', String(f));\r\n      tabs.forEach(function (t, n) { var on = n === f; t.setAttribute('aria-selected', String(on)); t.tabIndex = on ? 0 : -1; });\r\n      panels.forEach(function (pn, n) { pn.classList.toggle('is-on', n === f); });\r\n      countEl.textContent = pad(f + 1) + ' \/ 04';\r\n      placeThumb();\r\n      D.forEach(function (d, n) { d.hold = t0 + rank[n] * 13; });\r\n      if (calm) still();\r\n    };\r\n    var frame = function (now) {\r\n      var dt = Math.min(.05, Math.max(0, (now - last) \/ 1000));\r\n      last = now;\r\n      var lt = Math.max(0, now - t0), ge = 1 - Math.exp(-dt * 5);\r\n      place(active, lt);\r\n      step(dt, now);\r\n      for (var f = 0; f < 4; f++) ga[f] += ((f === active ? 1 : 0) - ga[f]) * ge;\r\n      pa += ((active === 2 && cohort(lt).b ? 1 : 0) - pa) * ge;\r\n      if (active === 3) {\r\n        var m = matches(lt);\r\n        if (m.done > found) { found = m.done; var pd = D[SEQ[found - 1] + 2]; pd.glow = 1; ripples.push({ x: pd.x, y: pd.y, t: now, c: pd.tone }); }\r\n      }\r\n      draw(lt, now);\r\n      setCap(caption(lt));\r\n    };\r\n    var loop = function (now) { if (!running) return; frame(now); raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || running || !visible || document.hidden) return; running = true; last = performance.now(); raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    var start = function () {\r\n      if (started) return;\r\n      started = true;\r\n      t0 = performance.now();\r\n      D.forEach(function (d, n) { d.hold = t0 + 250 + rank[n] * 16; });\r\n      if (auto) box.classList.add('is-auto');\r\n    };\r\n    var layout = function () {\r\n      var r = cv.getBoundingClientRect();\r\n      W = r.width; H = r.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\r\n      \/\/ Cadrage sur la zone r\u00e9ellement dessin\u00e9e (environ 485 \u00d7 320 au centre), pas sur tout le rep\u00e8re\r\n      sc = Math.min(W \/ (VW - 100), H \/ (VH - 80)) * .94;\r\n      ox = (W - VW * sc) \/ 2; oy = (H - VH * sc) \/ 2 + 8;\r\n      k = Math.min(1.4, Math.max(1, .7 \/ sc));\r\n      R0 = 7 * k;\r\n      if (calm) still(); else if (!running && started) draw(Math.max(0, last - t0), last);\r\n    };\r\n    tabs.forEach(function (t, n) {\r\n      t.addEventListener('click', function () { stopAuto(); select(n); });\r\n      t.addEventListener('keydown', function (e) {\r\n        var to = { ArrowRight: n + 1, ArrowDown: n + 1, ArrowLeft: n + 3, ArrowUp: n + 3, Home: 0, End: 3 }[e.key];\r\n        if (to === undefined) return;\r\n        e.preventDefault();\r\n        stopAuto(); select(to % 4); tabs[to % 4].focus();\r\n      });\r\n      \/\/ Le cycle : la barre de l\u2019onglet actif sert de minuterie\r\n      t.querySelector('.fmt-timer').addEventListener('animationend', function () { if (auto && n === active) select((n + 1) % tabs.length); });\r\n    });\r\n    box.addEventListener('focusin', stopAuto);\r\n    if ('ResizeObserver' in window) {\r\n      new ResizeObserver(layout).observe(cv);\r\n      new ResizeObserver(placeThumb).observe(box.querySelector('.studio-tabs'));\r\n    } else window.addEventListener('resize', function () { layout(); placeThumb(); });\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(placeThumb);\r\n    placeThumb();\r\n    layout();\r\n    if (calm) { still(); return; }\r\n    if ('IntersectionObserver' in window) {\r\n      new IntersectionObserver(function (en) {\r\n        visible = en[0].isIntersecting;\r\n        box.classList.toggle('is-hold', !visible);\r\n        if (visible) { start(); play(); } else pause();\r\n      }, { threshold: .3 }).observe(cv);\r\n    } else { visible = true; start(); play(); }\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n  })();\r\n})();\r\n\/\/-->\r\n<\/script>\r\n<\/div>\r\n\n[\/et_pb_text][\/et_pb_column]\n\t\t\t[\/et_pb_row]\n\t\t[\/et_pb_section]","protected":false},"excerpt":{"rendered":"<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@300..800&family=Geist+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n\/* Autour de la page : le th\u00e8me s'efface (en-t\u00eate, titre, barre lat\u00e9rale, pied) *\/\r\nbody:has(#shl-accueil) { margin: 0 !important; padding: 0 !important; background: #fff !important; }\r\nbody :has(#shl-accueil) { all: unset !important; display: block !important; }\r\nbody :has(#shl-accueil)::before, body :has(#shl-accueil)::after { content: none !important; }\r\nbody :has(#shl-accueil) > :not(:has(#shl-accueil), #shl-accueil) { display: none !important; }\r\n\/* Dans la page : aucun style du th\u00e8me ne d\u00e9teint *\/\r\n#shl-accueil { all: initial; display: block; }\r\nbody #shl-accueil :where(div, section, header, footer, nav, main, article, aside, span, b, strong, em, i, small, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, figure, figcaption, blockquote, a, button, input, select, textarea, label, table, tr, th, td) { all: revert; box-sizing: border-box; }\r\n\/* Connect\u00e9, la barre d'admin de WordPress reste en haut : l'en-t\u00eate de la page se cale dessous *\/\r\nbody.admin-bar #shl-accueil .site-header { top: 32px; }\r\n@media (max-width: 782px) { body.admin-bar #shl-accueil .site-header { top: 46px; } }\r\n@media (max-width: 600px) { body.admin-bar #shl-accueil .site-header { top: 0; } }\r\n#shl-accueil { --bg: #fff;\r\n  --canvas: #fbfbf8;\r\n  --tint: #f7f8f5;\r\n  --sunk: #f2f4ef;\r\n  --ink: #173540;\r\n  --ink-2: #445f69;\r\n  --muted: #5f7276;\r\n  --soft: #6b8286;\r\n  --faint: #9aa9ab;\r\n  --line: #e6eae3;\r\n  --line-2: #eef1ec;\r\n  --accent: #1f4a4d;\r\n  --t1: #c86a5e; --t2: #b25f35; --t3: #bd9035; --t4: #8d9b4e; --t5: #55926f;\r\n  --t6: #6d9b93; --t7: #4b8296; --t8: #45508a; --t9: #8480be; --t10: #92557c;\r\n  --x1: #af564b; --x2: #ab5b32; --x3: #8c6c20; --x4: #6a7637; --x5: #437c5d;\r\n  --x6: #4f7871; --x7: #43778b; --x8: #45508a; --x9: #6e6aa8; --x10: #92557c;\r\n  --lv1: #b25f35; --lv2: #2a7fae; --lv3: #8d9b4e;\r\n  --spectrum: linear-gradient(90deg, var(--t1) 0 10%, var(--t2) 0 20%, var(--t3) 0 30%, var(--t4) 0 40%, var(--t5) 0 50%, var(--t6) 0 60%, var(--t7) 0 70%, var(--t8) 0 80%, var(--t9) 0 90%, var(--t10) 0);\r\n  --shadow-sm: 0 1px 2px rgba(14, 27, 46, .05), 0 8px 20px -10px rgba(14, 27, 46, .14);\r\n  --shadow: 0 1px 2px rgba(22, 38, 44, .04), 0 18px 40px -24px rgba(22, 38, 44, .28);\r\n  --r-md: 12px;\r\n  --r-lg: 16px;\r\n  --r-xl: 20px;\r\n  --ease: cubic-bezier(.16, 1, .3, 1);\r\n  --ease-io: cubic-bezier(.65, 0, .35, 1);\r\n  --font: 'Manrope', system-ui, -apple-system, 'Segoe UI', sans-serif;\r\n  --mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;\r\n  --gut: clamp(16px, 4vw, 40px); }\r\n#shl-accueil *, #shl-accueil *::before, #shl-accueil *::after { box-sizing: border-box; }\r\nhtml:has(#shl-accueil) { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: 88px; }\r\n#shl-accueil { margin: 0; background: var(--bg); color: var(--ink); font: 400 16px\/1.6 var(--font); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: clip; }\r\n#shl-accueil img, #shl-accueil svg, #shl-accueil canvas { display: block; max-width: 100%; }\r\n#shl-accueil a { color: inherit; text-decoration: none; }\r\n#shl-accueil button, #shl-accueil input, #shl-accueil select, #shl-accueil textarea { font: inherit; color: inherit; }\r\n#shl-accueil h1, #shl-accueil h2, #shl-accueil h3, #shl-accueil h4, #shl-accueil p, #shl-accueil ol, #shl-accueil ul, #shl-accueil dl, #shl-accueil dd, #shl-accueil figure, #shl-accueil blockquote { margin: 0; }\r\n#shl-accueil ol, #shl-accueil ul { padding: 0; list-style: none; }\r\n#shl-accueil :focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 6px; }\r\n#shl-accueil ::selection { background: rgba(31, 74, 77, .14); }\r\n#shl-accueil .wrap { width: min(1240px, 100% - 2 * var(--gut)); margin-inline: auto; }\r\n#shl-accueil .sprite { position: absolute; width: 0; height: 0; overflow: hidden; }\r\n#shl-accueil .skip { position: absolute; left: 16px; top: -60px; z-index: 100; padding: 10px 16px; border-radius: 999px; background: var(--ink); color: #fff; font-size: 14px; font-weight: 700; }\r\n#shl-accueil .skip:focus { top: 12px; }\r\n#shl-accueil .eyebrow, #shl-accueil .sec-index, #shl-accueil .map-key, #shl-accueil .partners p b, #shl-accueil .kinds p b, #shl-accueil .step-top, #shl-accueil .project .place, #shl-accueil .field .mono, #shl-accueil .bc-kicker, #shl-accueil .footer h4 { font-family: var(--mono); font-size: 11.5px; font-weight: 500; line-height: 1.3; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .intro { display: none; }\r\n#shl-accueil.js .intro { position: fixed; inset: 0; z-index: 200; display: block; background: #fff; animation: intro-safe .4s 4s forwards; transition: background-color .8s var(--ease) .1s; }\r\n#shl-accueil.js .intro.is-live { animation: none; }\r\n#shl-accueil .intro.is-out { background-color: rgba(255, 255, 255, 0); pointer-events: none; }\r\n#shl-accueil .intro canvas { position: absolute; inset: 0; width: 100%; height: 100%; transition: opacity .5s var(--ease); }\r\n#shl-accueil .intro.is-lost canvas { opacity: 0; }\r\n@keyframes intro-safe{to { opacity: 0; visibility: hidden; }}#shl-accueil.js.intro-hold .hero [data-reveal] { opacity: 0; transform: translateY(22px); filter: blur(8px); }\r\n#shl-accueil.js h1 { transition: opacity .9s var(--ease), filter .9s var(--ease); }\r\n#shl-accueil.js.intro-hold h1 { opacity: 0; filter: blur(6px); }\r\n@media (prefers-reduced-motion: reduce){#shl-accueil.js .intro { display: none; }\r\n}#shl-accueil.js [data-reveal] { opacity: 0; transform: translateY(22px); filter: blur(8px);\r\n  transition-property: opacity, transform, filter, translate, box-shadow, border-color, background-color;\r\n  transition-duration: .9s, 1.1s, .9s, .5s, .5s, .4s, .4s;\r\n  transition-timing-function: var(--ease);\r\n  transition-delay: calc(var(--d, 0) * 1ms), calc(var(--d, 0) * 1ms), calc(var(--d, 0) * 1ms), 0s, 0s, 0s, 0s; }\r\n#shl-accueil.js [data-reveal].is-in { opacity: 1; transform: none; filter: none; }\r\n#shl-accueil .btn { display: inline-flex; align-items: center; gap: 10px; height: 48px; padding: 0 24px; border: 1px solid transparent; border-radius: 999px; font-size: 15px; font-weight: 700; letter-spacing: -.005em; white-space: nowrap; cursor: pointer; transition: background-color .35s var(--ease), color .35s var(--ease), border-color .35s var(--ease), box-shadow .35s var(--ease); }\r\n#shl-accueil .btn .arr { transition: transform .45s var(--ease); }\r\n#shl-accueil .btn:hover .arr { transform: translateX(4px); }\r\n#shl-accueil .btn-primary { background: var(--ink); color: #fff; box-shadow: 0 1px 2px rgba(22, 38, 44, .14), 0 12px 24px -14px rgba(22, 38, 44, .6); }\r\n#shl-accueil .btn-primary:hover { background: var(--accent); }\r\n#shl-accueil .btn-ghost { background: #fff; color: var(--ink); border-color: var(--line); }\r\n#shl-accueil .btn-ghost:hover { border-color: #cdd6d0; box-shadow: var(--shadow-sm); }\r\n#shl-accueil .btn-ink { background: transparent; color: var(--ink); border-color: var(--ink); }\r\n#shl-accueil .btn-ink:hover { background: var(--ink); color: #fff; }\r\n#shl-accueil .site-header { position: sticky; top: 0; z-index: 50; background: rgba(255, 255, 255, .86); -webkit-backdrop-filter: saturate(1.4) blur(14px); backdrop-filter: saturate(1.4) blur(14px); border-bottom: 1px solid transparent; transition: border-color .3s, box-shadow .3s; }\r\n#shl-accueil .site-header.is-solid { border-bottom-color: var(--line); box-shadow: 0 10px 30px -24px rgba(22, 38, 44, .3); }\r\n#shl-accueil .header-row { display: flex; align-items: center; gap: 24px; height: 76px; }\r\n#shl-accueil .brand { --mh: 34px; display: flex; flex: none; }\r\n#shl-accueil .brand-mark { position: relative; flex: none; width: calc(var(--mh) * 2.697); height: var(--mh); overflow: hidden; }\r\n#shl-accueil .brand-mark img { position: absolute; left: calc(var(--mh) * -.462); top: calc(var(--mh) * -1.22); width: calc(var(--mh) * 3.636); height: auto; max-width: none; }\r\n#shl-accueil .main-nav { position: relative; display: flex; margin-inline: auto; }\r\n#shl-accueil .main-nav a { padding: 10px 12px 12px; font-size: 14.5px; font-weight: 600; letter-spacing: -.01em; color: var(--ink-2); transition: color .35s var(--ease); }\r\n#shl-accueil .main-nav a:hover { color: var(--ink); }\r\n#shl-accueil .main-nav a.is-current { color: var(--c); }\r\n#shl-accueil .nav-thumb { position: absolute; bottom: 3px; left: 0; width: 0; height: 2px; border-radius: 2px; background: var(--ink); opacity: 0; transition: transform .55s var(--ease), width .55s var(--ease), background-color .55s var(--ease), opacity .3s; }\r\n#shl-accueil .header-actions { display: flex; align-items: center; gap: 22px; flex: none; }\r\n#shl-accueil .header-actions .btn { height: 44px; padding: 0 20px; font-size: 14.5px; }\r\n#shl-accueil .menu-toggle { display: none; align-items: center; gap: 10px; height: 40px; margin-left: auto; padding: 0 16px; border: 1px solid var(--line); border-radius: 999px; background: #fff; font-size: 14px; font-weight: 600; cursor: pointer; }\r\n#shl-accueil .menu-toggle i { width: 16px; height: 10px; border-top: 1.5px solid; border-bottom: 1.5px solid; transition: transform .3s var(--ease); }\r\n#shl-accueil .is-open .menu-toggle i { transform: rotate(90deg); }\r\n#shl-accueil .mobile-nav { display: grid; padding: 8px var(--gut) 24px; border-top: 1px solid var(--line); background: #fff; }\r\n#shl-accueil .mobile-nav[hidden] { display: none; }\r\n#shl-accueil .mobile-nav a { padding: 13px 0; border-bottom: 1px solid var(--line-2); font-size: 16px; font-weight: 600; }\r\n#shl-accueil .mobile-nav .btn { justify-content: center; margin-top: 16px; padding: 0 22px; border-bottom: 0; }\r\n#shl-accueil .hero { position: relative; padding: clamp(36px, 6vh, 72px) 0 clamp(40px, 6vh, 72px); overflow: hidden; text-align: center; }\r\n#shl-accueil .eyebrow { display: inline-flex; align-items: center; gap: 12px; font-size: 12px; letter-spacing: .12em; }\r\n#shl-accueil .eyebrow::before { content: ''; width: 40px; height: 3px; border-radius: 2px; background: var(--spectrum); flex: none; }\r\n#shl-accueil h1 { margin-top: 22px; font-size: clamp(36px, 6.2vw, 90px); line-height: 1.04; font-weight: 600; letter-spacing: -.032em; }\r\n#shl-accueil h1 .line { display: block; overflow: hidden; padding-bottom: .08em; margin-bottom: -.08em; }\r\n#shl-accueil h1 .line > span { display: inline-block; text-wrap: balance; transition: transform 1.2s var(--ease) calc(var(--l, 0) * 110ms + 80ms); }\r\n#shl-accueil.js h1 .line > span { transform: translateY(108%); }\r\n#shl-accueil.js.is-loaded h1 .line > span { transform: none; }\r\n#shl-accueil .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }\r\n#shl-accueil .hero-stage { display: flex; flex-direction: column; padding-bottom: clamp(8px, 1.5vh, 16px); }\r\n#shl-accueil .hero-stage > .eyebrow { align-self: center; }\r\n#shl-accueil .hero-art { position: relative; margin-top: clamp(16px, 3vh, 36px); }\r\n#shl-accueil .hero-sky { position: relative; aspect-ratio: 5 \/ 1; max-height: 320px; margin-inline: -16px; }\r\n#shl-accueil .hero-sky canvas { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .hero-banks { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(12px, 2vw, 24px); margin-top: clamp(10px, 1.6vh, 18px); text-align: center; }\r\n#shl-accueil .hero-banks > span { margin-inline: auto; font-size: clamp(16px, 2.35vw, 34px); font-weight: 700; line-height: 1.12; letter-spacing: -.025em; text-wrap: balance; }\r\n#shl-accueil .hero-banks > span:nth-child(1) { margin-left: 0; text-align: left; }\r\n#shl-accueil .hero-banks > span:nth-child(3) { margin-right: 0; text-align: right; }\r\n#shl-accueil.js .hero-banks > span { opacity: 0; transform: translateY(8px); transition: opacity .9s var(--ease) calc(var(--i) * 180ms), transform .9s var(--ease) calc(var(--i) * 180ms); }\r\n#shl-accueil.js .is-ready .hero-banks > span { opacity: 1; transform: none; }\r\n#shl-accueil .hero-banks b { font-weight: inherit; color: var(--c); text-decoration-line: underline; text-decoration-thickness: .06em; text-decoration-color: transparent; text-underline-offset: .2em; transition: text-decoration-color .8s var(--ease); }\r\n#shl-accueil .hero-banks b.is-hot { text-decoration-color: var(--c); }\r\n#shl-accueil .hero-foot { display: flex; align-items: center; justify-content: space-between; gap: 20px 48px; margin-top: clamp(32px, 5vh, 52px); padding-top: 28px; border-top: 1px solid var(--line); text-align: left; }\r\n#shl-accueil .lede { max-width: 700px; font-size: clamp(16px, 1.2vw, 18px); line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .lede b { font-weight: 700; color: var(--ink); }\r\n#shl-accueil .hero-cta { display: flex; flex-wrap: wrap; gap: 12px; flex: none; }\r\n#shl-accueil .proof { padding: clamp(64px, 8vw, 104px) 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .proof-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px 24px; }\r\n#shl-accueil .proof-head h2 { font-size: clamp(24px, 2.4vw, 32px); font-weight: 800; letter-spacing: -.025em; }\r\n#shl-accueil .proof-head p { font-size: 15px; color: var(--muted); }\r\n#shl-accueil .figures { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 32px 40px; margin-top: 40px; }\r\n#shl-accueil .figures > div { position: relative; padding-top: 28px; border-top: 1px solid var(--line); }\r\n#shl-accueil .figures > div::before { content: ''; position: absolute; top: -1px; left: 0; width: 48px; height: 2px; background: var(--c); transform: scaleX(0); transform-origin: left; transition: transform 1.1s var(--ease) calc(var(--d, 0) * 1ms + 250ms); }\r\n#shl-accueil .figures > div.is-in::before { transform: none; }\r\n#shl-accueil .figures > div:nth-child(1) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .figures > div:nth-child(2) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .figures > div:nth-child(3) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .figures > div:nth-child(4) { --c: var(--t10); --cx: var(--x10); }\r\n#shl-accueil .figures dt { color: var(--cx); display: flex; align-items: baseline; gap: 6px; font-size: clamp(44px, 5vw, 68px); font-weight: 800; line-height: 1; letter-spacing: -.045em; font-variant-numeric: tabular-nums; }\r\n#shl-accueil .figures dt small { font-size: .38em; font-weight: 700; letter-spacing: -.01em; }\r\n#shl-accueil .figures dd { max-width: 260px; margin-top: 14px; font-size: 14.5px; line-height: 1.55; color: var(--ink-2); }\r\n#shl-accueil .hubs-note { margin-top: 36px; font-size: 14.5px; color: var(--ink-2); }\r\n#shl-accueil .hubs-note b { color: var(--ink); }\r\n#shl-accueil .partners, #shl-accueil .kinds { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 32px; align-items: center; margin-top: 48px; padding-top: 32px; border-top: 1px solid var(--line); }\r\n#shl-accueil .partners p, #shl-accueil .kinds p { font-size: 14px; line-height: 1.5; color: var(--muted); }\r\n#shl-accueil .partners p b, #shl-accueil .kinds p b { display: block; margin-bottom: 6px; color: var(--ink); }\r\n#shl-accueil .logos { --gap: 72px; display: flex; gap: var(--gap); padding-block: 6px; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); }\r\n#shl-accueil .logos-set { flex: none; display: flex; align-items: center; justify-content: space-around; gap: var(--gap); min-width: 100%; animation: logos-roll 40s linear infinite; }\r\n#shl-accueil .logos:hover .logos-set { animation-play-state: paused; }\r\n#shl-accueil .logos img { width: auto; height: var(--lh, 36px); transition: transform .45s var(--ease); }\r\n#shl-accueil .logos img.is-missing, #shl-accueil .pub-logo img.is-missing { display: none; }\r\n#shl-accueil .logos img:hover { transform: scale(1.06); }\r\n@keyframes logos-roll{to { transform: translateX(calc(-100% - var(--gap))); }}#shl-accueil .atlas { position: relative; overflow: hidden; background: var(--tint); border-top: 1px solid var(--line); scroll-margin-top: 76px; }\r\n#shl-accueil .atlas-over { display: grid; grid-template-columns: minmax(0, clamp(360px, 33vw, 420px)) minmax(0, 1fr); align-content: space-between; gap: 24px 0; min-height: clamp(540px, calc(100vh - 77px), 1160px); min-height: clamp(540px, calc(100svh - 77px), 1160px); padding: clamp(28px, 5.5vh, 88px) 0 clamp(24px, 4.5vh, 60px); pointer-events: none; }\r\n#shl-accueil .atlas-over > * { position: relative; z-index: 1; grid-column: 1; pointer-events: auto; }\r\n#shl-accueil .atlas-copy .sec-title { font-size: clamp(28px, min(2.8vw, 4.6vh), 42px); }\r\n#shl-accueil .atlas-copy .sec-copy { margin-top: clamp(12px, 2.2vh, 20px); font-size: clamp(15px, 2.2vh, 16px); line-height: 1.6; }\r\n#shl-accueil .atlas-over > .atlas-canvas { position: absolute; inset: 0; z-index: 0; -webkit-mask-image: linear-gradient(180deg, transparent, #000 28px, #000 calc(100% - 28px), transparent); mask-image: linear-gradient(180deg, transparent, #000 28px, #000 calc(100% - 28px), transparent); }\r\n#shl-accueil .atlas-canvas canvas { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .atlas-over > .map-key { position: absolute; right: max(var(--gut), calc((100% - 1240px) \/ 2)); bottom: clamp(24px, 4.5vh, 60px); display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px 22px; letter-spacing: .04em; text-transform: none; font-size: 12px; color: var(--ink-2); }\r\n#shl-accueil .map-key li { display: inline-flex; align-items: center; gap: 9px; }\r\n#shl-accueil .map-key i { flex: none; }\r\n#shl-accueil .k-hub { width: 11px; height: 11px; border-radius: 50%; background: radial-gradient(circle, var(--ink) 0 2.4px, #fff 2.9px); box-shadow: inset 0 0 0 1.8px var(--ink), 0 0 0 4px rgba(31, 74, 77, .14); }\r\n#shl-accueil .k-arc { width: 24px; height: 11px; border: 2px solid; border-color: var(--t7) var(--t1) transparent var(--accent); border-bottom: 0; border-radius: 12px 12px 0 0; }\r\n#shl-accueil .k-ctry { width: 10px; height: 10px; border-radius: 50%; background: radial-gradient(circle, var(--t1) 0 2px, #fff 2.5px); box-shadow: inset 0 0 0 1.6px var(--t1); }\r\n#shl-accueil .map-tip { position: absolute; top: 0; left: 0; z-index: 2; display: grid; gap: 1px; padding: 8px 12px; background: #fff; border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow-sm); white-space: nowrap; pointer-events: none; opacity: 0; translate: -50% calc(-100% - 14px); transition: opacity .25s; }\r\n#shl-accueil .map-tip.is-on { opacity: 1; }\r\n#shl-accueil .map-tip b { font-size: 14px; font-weight: 700; letter-spacing: -.01em; }\r\n#shl-accueil .map-tip span { font-size: 12.5px; color: var(--muted); }\r\n#shl-accueil .atlas-legend { display: flex; flex-direction: column; min-width: 0; }\r\n#shl-accueil .legend-list { margin-top: clamp(16px, 2.6vh, 26px); border-top: 1px solid var(--line); }\r\n#shl-accueil .pj { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 3px 16px; width: 100%; padding: 9px 8px; border: 0; border-bottom: 1px solid var(--line); background: none; font: inherit; text-align: left; color: var(--ink); cursor: pointer; transition: background-color .25s, box-shadow .25s; }\r\n#shl-accueil .pj:hover, #shl-accueil .pj:focus-visible { background: rgba(31, 74, 77, .05); }\r\n#shl-accueil .pj:focus-visible { outline-offset: -2px; }\r\n#shl-accueil .pj.is-on { background: rgba(31, 74, 77, .08); box-shadow: inset 3px 0 0 var(--ink); }\r\n#shl-accueil .pj-name { font-size: 14.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.01em; }\r\n#shl-accueil .pj-ctry { align-self: baseline; font-size: 13px; font-weight: 700; line-height: 1.4; text-align: right; }\r\n#shl-accueil .pj i { font-style: normal; color: var(--faint); }\r\n#shl-accueil.js .atlas-legend .legend-list { opacity: 0; transform: translateY(6px); transition: opacity .38s var(--ease), transform .38s var(--ease); }\r\n#shl-accueil.js .atlas-legend.is-ready .legend-list { opacity: 1; transform: none; }\r\n#shl-accueil .section { padding: clamp(80px, 11vw, 144px) 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .section.tint { background: var(--tint); }\r\n#shl-accueil .sec-head { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; max-width: 880px; margin-bottom: clamp(40px, 5vw, 60px); }\r\n#shl-accueil .sec-index { display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 600; letter-spacing: .12em; }\r\n#shl-accueil .sec-index, #shl-accueil .sec-index span, #shl-accueil .contact .eyebrow { color: var(--h, var(--muted)); }\r\n#shl-accueil .sec-index::before { content: ''; width: 40px; height: 3px; margin-right: 4px; border-radius: 2px; background: var(--spectrum); flex: none; transform: scaleX(.001); transform-origin: left; transition: transform 1.1s var(--ease) .2s; }\r\n#shl-accueil .is-in .sec-index::before, #shl-accueil .method .sec-index::before { transform: none; }\r\n#shl-accueil .sec-title { margin-top: 18px; font-size: clamp(30px, 3.6vw, 50px); line-height: 1.08; font-weight: 800; letter-spacing: -.032em; text-wrap: balance; }\r\n#shl-accueil .sec-title em, #shl-accueil .contact h2 em { font-style: normal; color: var(--h, var(--soft)); }\r\n#shl-accueil .sec-copy { max-width: 640px; font-size: 18px; line-height: 1.6; color: var(--ink-2); text-wrap: pretty; }\r\n#shl-accueil .sec-copy + .sec-copy { margin-top: 14px; }\r\n#shl-accueil .kinds li { padding: 8px 14px; border: 1px solid var(--line); border-radius: 999px; background: #fff; font-size: 13.5px; font-weight: 600; box-shadow: 0 1px 2px rgba(22, 38, 44, .04); }\r\n#shl-accueil .ident-head { margin-bottom: clamp(48px, 6vw, 80px); }\r\n#shl-accueil .ident-text { display: grid; gap: clamp(22px, 2.6vw, 32px); max-width: 1000px; margin-top: clamp(22px, 2.6vw, 30px); }\r\n#shl-accueil .ident-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px clamp(32px, 4vw, 56px); align-items: start; }\r\n#shl-accueil .ident-body .sec-copy { max-width: none; font-size: 17px; }\r\n#shl-accueil .ident-body .sec-copy + .sec-copy { margin-top: 0; }\r\n#shl-accueil .ident-lead { max-width: none; font-size: clamp(21px, 2vw, 27px); font-weight: 600; line-height: 1.42; letter-spacing: -.018em; color: var(--ink); text-wrap: pretty; }\r\n#shl-accueil .ident-text .sec-copy b { font-weight: 700; color: var(--ink); }\r\n#shl-accueil .bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .bc { --c: var(--accent); --cx: var(--accent); position: relative; display: flex; flex-direction: column; min-width: 0; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .04); }\r\n@supports (grid-template-rows: subgrid){#shl-accueil .bc { display: grid; grid-row: span 2; grid-template-rows: subgrid; row-gap: 0; }\r\n}#shl-accueil .bc-stage { position: relative; display: grid; place-items: center; min-height: 292px; margin: 10px 10px 0; padding: 22px 18px; overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .bc-stage::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); pointer-events: none; }\r\n#shl-accueil .bc-stage > * { position: relative; }\r\n#shl-accueil .bc-head { padding: 24px 28px 30px; }\r\n#shl-accueil .bc-kicker { color: var(--cx); display: flex; align-items: center; gap: 10px; }\r\n#shl-accueil .bc-kicker::before { content: ''; width: 18px; height: 3px; border-radius: 2px; background: var(--c); flex: none; }\r\n#shl-accueil .bc h3 { margin-top: 12px; font-size: 21px; font-weight: 700; line-height: 1.25; letter-spacing: -.02em; text-wrap: balance; }\r\n#shl-accueil .bc-head > p:last-child { margin-top: 12px; font-size: 15px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .sc-card { background: #fff; border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow-sm); }\r\n#shl-accueil .pil { display: grid; justify-items: center; width: min(100%, 320px); }\r\n#shl-accueil .pil-fig { position: relative; width: 100%; }\r\n#shl-accueil .pil-art { display: block; width: 100%; height: auto; overflow: visible; }\r\n#shl-accueil .pil-name { position: absolute; left: 0; right: 0; top: 21.33%; transform: translateY(-50%); font-size: 12.5px; font-weight: 600; line-height: 1; letter-spacing: -.005em; color: #fff; text-align: center; }\r\n#shl-accueil .pil-key { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); width: 100%; margin-top: 14px; font-size: 12px; font-weight: 600; line-height: 1.35; color: var(--muted); text-align: center; }\r\n#shl-accueil .pil-key .is-new { color: color-mix(in srgb, var(--k) 68%, var(--ink)); }\r\n#shl-accueil .pil-name, #shl-accueil .pil-key .is-new { transition: opacity .16s, filter .16s; }\r\n#shl-accueil .sc-pil:not(.is-b) .pil-name, #shl-accueil .sc-pil:not(.is-b) .pil-key .is-new { opacity: 0; filter: blur(4px); }\r\n#shl-accueil .sc-pil.is-b .pil-name, #shl-accueil .sc-pil.is-b .pil-key .is-new { transition: opacity .5s var(--ease) calc(var(--i, 0) * 90ms), filter .5s var(--ease) calc(var(--i, 0) * 90ms); }\r\n#shl-accueil .dos { display: grid; gap: 12px; width: min(100%, 330px); }\r\n#shl-accueil .dos-key { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 20px; font-size: 12px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .dos-key span { display: inline-flex; align-items: center; gap: 7px; color: color-mix(in srgb, var(--k) 70%, var(--ink)); }\r\n#shl-accueil .dos-key svg { flex: none; width: 10px; height: 15px; overflow: visible; fill: var(--k); }\r\n#shl-accueil .dos-art { display: block; width: 100%; height: auto; overflow: visible; }\r\n#shl-accueil .dos-slot { fill: none; stroke: #d5ddd8; stroke-dasharray: 3 3; }\r\n#shl-accueil .dos-brace { fill: none; stroke: #d5ddd8; }\r\n#shl-accueil .dos-brace.is-you { stroke: color-mix(in srgb, var(--c) 45%, #fff); }\r\n#shl-accueil .dos-paper { fill: #fff; stroke: #e0e6e0; }\r\n#shl-accueil .dos-lift { fill: #16262c; fill-opacity: .2; opacity: 0; }\r\n#shl-accueil .dos-title { fill: #d3dcd8; }\r\n#shl-accueil .dos-bed { fill: #edf1ed; }\r\n#shl-accueil .dos-fill.is-shl { fill: var(--faint); }\r\n#shl-accueil .dos-fill.is-you { fill: var(--c); }\r\n#shl-accueil .dos-ok circle { fill: var(--c); }\r\n#shl-accueil .dos-ok path { fill: none; stroke: #fff; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .dos-cur { stroke: #fff; stroke-width: 1.3; stroke-linejoin: round; }\r\n#shl-accueil .dos-cur.is-shl { fill: var(--soft); }\r\n#shl-accueil .dos-cur.is-you { fill: var(--c); }\r\n#shl-accueil .dos-ticks { display: grid; grid-template-columns: 1fr 2fr; margin-top: -4px; font-size: 12px; line-height: 1.35; color: var(--muted); text-align: center; }\r\n#shl-accueil .dos-ticks b { display: block; font-weight: 700; color: var(--ink-2); }\r\n#shl-accueil .dos-ticks .is-you, #shl-accueil .dos-ticks .is-you b { color: color-mix(in srgb, var(--c) 72%, var(--ink)); }\r\n#shl-accueil .sc-net { display: block; padding: 0; }\r\n#shl-accueil .bc-stage > .net-svg { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .net-band { fill: none; stroke: #f1f4f0; }\r\n#shl-accueil .net-line { fill: none; stroke: color-mix(in srgb, var(--c) 60%, #fff); stroke-width: 1.6; stroke-linecap: round; opacity: 0; }\r\n#shl-accueil .net-line.is-on { opacity: 1; }\r\n#shl-accueil .sc-net.is-fade .net-line { opacity: 0; transition: opacity .6s var(--ease); }\r\n#shl-accueil .net-dot { fill: var(--c); opacity: 0; filter: drop-shadow(0 0 3px var(--c)); }\r\n#shl-accueil .net-dot.is-on { opacity: 1; }\r\n#shl-accueil .bc-stage > .net-node { position: absolute; left: var(--x); top: var(--y); width: 44px; height: 44px; margin: -22px 0 0 -22px; padding: 4px; border-radius: 50%; background: #fff; box-shadow: 0 0 0 1px var(--line), 0 6px 14px -8px rgba(22, 38, 44, .35); transition: box-shadow .5s var(--ease); }\r\n#shl-accueil .net-node::after { content: ''; position: absolute; inset: 4px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(22, 38, 44, .1); }\r\n#shl-accueil .net-node svg { width: 36px; height: 36px; border-radius: 50%; filter: grayscale(1); opacity: .4; transition: filter .6s var(--ease), opacity .6s var(--ease); }\r\n#shl-accueil .net-node.is-on { box-shadow: 0 0 0 1.5px var(--c), 0 0 0 6px color-mix(in srgb, var(--c) 14%, transparent), 0 6px 14px -8px rgba(22, 38, 44, .35); }\r\n#shl-accueil .sc-net.is-live .net-node.is-on { animation: net-pop .55s var(--ease); }\r\n#shl-accueil .net-node.is-on svg { filter: none; opacity: 1; }\r\n#shl-accueil .net-node:nth-of-type(1) { --x: 16.6%; --y: 56%; }\r\n#shl-accueil .net-node:nth-of-type(2) { --x: 26.8%; --y: 32%; }\r\n#shl-accueil .net-node:nth-of-type(3) { --x: 41.7%; --y: 18.6%; }\r\n#shl-accueil .net-node:nth-of-type(4) { --x: 58.3%; --y: 18.6%; }\r\n#shl-accueil .net-node:nth-of-type(5) { --x: 73.2%; --y: 32%; }\r\n#shl-accueil .net-node:nth-of-type(6) { --x: 83.4%; --y: 56%; }\r\n#shl-accueil .net-node:nth-of-type(1) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .net-node:nth-of-type(2) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .net-node:nth-of-type(3) { --c: var(--t8); --cx: var(--x8); }\r\n#shl-accueil .net-node:nth-of-type(4) { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .net-node:nth-of-type(5) { --c: var(--t10); --cx: var(--x10); }\r\n#shl-accueil .net-node:nth-of-type(6) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .bc-stage > .net-core { position: absolute; left: var(--x, 50%); top: var(--y, 85%); transform: translate(-50%, -50%); padding: 9px 16px; border-radius: 999px; background: var(--ink); color: #fff; font-size: 13px; font-weight: 700; white-space: nowrap; box-shadow: 0 10px 22px -10px rgba(22, 38, 44, .6); }\r\n#shl-accueil .net-core::after { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; }\r\n#shl-accueil .net-core.is-ping::after { animation: net-ping .9s var(--ease) both; }\r\n#shl-accueil .bc-stage > .net-key { position: absolute; left: 16px; top: 14px; display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 12px; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .net-key span { display: inline-flex; align-items: center; gap: 7px; }\r\n#shl-accueil .net-key i, #shl-accueil .net-key svg { width: 14px; height: 14px; border-radius: 50%; }\r\n#shl-accueil .net-key i { box-shadow: inset 0 0 0 1.5px #cdd6d0; }\r\n@keyframes net-pop{45% { transform: scale(1.1); }}@keyframes net-ping{from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--c) 50%, transparent); } to { box-shadow: 0 0 0 14px transparent; }}#shl-accueil .terr { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 20px; }\r\n#shl-accueil .fields { display: flex; flex-direction: column; gap: 10px; }\r\n#shl-accueil .field { --c: var(--accent); --cx: var(--accent); position: relative; display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 0 18px; padding: 24px 26px 26px 22px; overflow: hidden; border: 1px solid var(--line); border-radius: var(--r-xl); transition: background-color .45s var(--ease), border-color .45s, box-shadow .45s var(--ease); }\r\n#shl-accueil .field:hover { background: rgba(255, 255, 255, .6); }\r\n#shl-accueil .field.is-on { background: #fff; border-color: #dfe5df; box-shadow: var(--shadow); }\r\n#shl-accueil .field-icon { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 12px; background: color-mix(in srgb, var(--c) 12%, #fff); color: var(--c); }\r\n#shl-accueil .field-icon svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .field .mono { margin-top: 3px; color: color-mix(in srgb, var(--c) 70%, #000); }\r\n#shl-accueil .field h3 { margin-top: 8px; font-size: 19px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; }\r\n#shl-accueil .field-btn { padding: 0; border: 0; background: none; font: inherit; letter-spacing: inherit; text-align: left; cursor: pointer; }\r\n#shl-accueil .field-btn::after { content: ''; position: absolute; inset: 0; border-radius: inherit; }\r\n#shl-accueil .field-btn:focus-visible { outline: none; }\r\n#shl-accueil .field:has(.field-btn:focus-visible) { outline: 2px solid var(--accent); outline-offset: 3px; }\r\n#shl-accueil .field h3 + p { margin-top: 10px; font-size: 15px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .field-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: var(--c); transform: scaleX(0); transform-origin: left; opacity: 0; transition: opacity .3s; }\r\n#shl-accueil .field.is-on .field-bar { opacity: 1; transform: none; }\r\n#shl-accueil .terr.is-auto .field.is-on .field-bar { animation: field-run 7s linear both; }\r\n#shl-accueil .terr.is-auto:hover .field.is-on .field-bar, #shl-accueil .terr.is-hold .field.is-on .field-bar { animation-play-state: paused; }\r\n@keyframes field-run{from { transform: scaleX(0); } to { transform: none; }}#shl-accueil .terr-map { display: flex; flex-direction: column; min-width: 0; margin: 0; overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: var(--shadow); }\r\n#shl-accueil .terr-head { display: flex; justify-content: space-between; gap: 12px; padding: 14px 20px; border-bottom: 1px solid var(--line-2); }\r\n#shl-accueil .terr-head b { font-weight: 500; color: var(--ink); }\r\n#shl-accueil .terr-stage { position: relative; flex: 1; min-height: 460px; }\r\n#shl-accueil .terr-stage canvas { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; }\r\n#shl-accueil .drom { position: absolute; left: 16px; top: 16px; bottom: 16px; display: grid; grid-template-rows: repeat(5, minmax(0, 1fr)); gap: 8px; width: clamp(92px, 8.4vw, 116px); }\r\n#shl-accueil .drom li { display: flex; align-items: flex-end; justify-content: center; padding-bottom: 7px; border: 1px solid var(--line-2); border-radius: 12px; background: var(--canvas); font: 500 11.5px\/1 var(--mono); color: var(--muted); transition: border-color .5s var(--ease), background-color .5s var(--ease), color .5s; }\r\n#shl-accueil .terr.is-dom .drom li { border-color: color-mix(in srgb, var(--t5) 40%, #fff); background: color-mix(in srgb, var(--t5) 6%, #fff); color: color-mix(in srgb, var(--t5) 70%, #000); }\r\n#shl-accueil .terr-key { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 14px 20px; border-top: 1px solid var(--line-2); font-size: 12.5px; font-weight: 600; color: var(--faint); }\r\n#shl-accueil .terr-key li { display: inline-flex; align-items: center; gap: 8px; transition: color .16s; }\r\n#shl-accueil .terr-key i { width: 9px; height: 9px; border-radius: 50%; background: #cfd8d3; transition: background-color .16s; }\r\n#shl-accueil .terr-key li.is-on { color: var(--kx); transition: color .38s var(--ease); }\r\n#shl-accueil .terr-key li.is-on i { background: var(--k); transition: background-color .38s var(--ease); }\r\n#shl-accueil .kinds ul { display: flex; flex-wrap: wrap; gap: 8px; }\r\n#shl-accueil .kinds li { color: var(--ink-2); }\r\n#shl-accueil .method { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: clamp(40px, 6vw, 96px); }\r\n#shl-accueil .method-sticky { position: sticky; top: 120px; }\r\n#shl-accueil .method .sec-copy { margin-top: 22px; }\r\n#shl-accueil .rail { position: relative; margin-top: 40px; padding-left: 28px; }\r\n#shl-accueil .rail-track { position: absolute; left: 5px; top: 18px; bottom: 18px; width: 2px; border-radius: 2px; background: var(--line); overflow: hidden; }\r\n#shl-accueil .rail-track span { position: absolute; inset: 0; background: linear-gradient(180deg, var(--t1), var(--t3), var(--t5), var(--t7), var(--t9)); transform: scaleY(0); transform-origin: top; }\r\n#shl-accueil .rail li { position: relative; }\r\n#shl-accueil .rail li:nth-child(1), #shl-accueil .step:nth-child(1) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .rail li:nth-child(2), #shl-accueil .step:nth-child(2) { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .rail li:nth-child(3), #shl-accueil .step:nth-child(3) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .rail li:nth-child(4), #shl-accueil .step:nth-child(4) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .rail li:nth-child(5), #shl-accueil .step:nth-child(5) { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .rail li::before { content: ''; position: absolute; left: -28px; top: 50%; width: 12px; height: 12px; margin-top: -6px; border: 2px solid var(--line); border-radius: 50%; background: #fff; transition: border-color .4s, background-color .4s, box-shadow .4s, transform .4s var(--ease); }\r\n#shl-accueil .rail li.is-past::before { border-color: var(--c); background: var(--c); }\r\n#shl-accueil .rail li.is-active::before { border-color: var(--c); transform: scale(1.2); box-shadow: 0 0 0 5px color-mix(in srgb, var(--c) 18%, transparent); }\r\n#shl-accueil .rail a { display: flex; align-items: baseline; gap: 14px; padding: 9px 0; font-size: 15px; font-weight: 600; color: var(--faint); transition: color .4s var(--ease); }\r\n#shl-accueil .rail a span { font: 500 12px\/1 var(--mono); }\r\n#shl-accueil .rail li.is-past a { color: var(--ink-2); }\r\n#shl-accueil .rail li.is-active a { color: var(--cx); }\r\n#shl-accueil .steps { display: grid; gap: 20px; }\r\n#shl-accueil .step { padding: 36px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); transition: opacity .5s var(--ease), box-shadow .5s var(--ease), border-color .5s; }\r\n#shl-accueil .method.is-live .step { opacity: .55; }\r\n#shl-accueil .method.is-live .step.is-active { opacity: 1; border-color: #dce2dc; box-shadow: var(--shadow); }\r\n#shl-accueil .step-top { color: var(--cx); display: flex; align-items: baseline; gap: 14px; }\r\n#shl-accueil .step-top .big { font: 800 44px\/1 var(--font); letter-spacing: -.04em; color: var(--c); }\r\n#shl-accueil .step-label { display: grid; gap: 9px; }\r\n#shl-accueil .step-bar { display: flex; gap: 5px; }\r\n#shl-accueil .step-bar i { position: relative; width: 18px; height: 4px; border-radius: 4px; background: var(--line); overflow: hidden; }\r\n#shl-accueil .step-bar i.now { width: 34px; }\r\n#shl-accueil .step-bar i::after { content: ''; position: absolute; inset: 0; border-radius: inherit; background: color-mix(in srgb, var(--c) 42%, #fff); transform: scaleX(0); transform-origin: left; transition: transform .8s var(--ease) calc(var(--k) * 90ms + .25s); }\r\n#shl-accueil .step-bar i.now::after { background: var(--c); }\r\n#shl-accueil .step-bar i:is(.done, .now)::after { transform: none; }\r\n#shl-accueil .step-bar i:nth-child(1) { --k: 0; }\r\n#shl-accueil .step-bar i:nth-child(2) { --k: 1; }\r\n#shl-accueil .step-bar i:nth-child(3) { --k: 2; }\r\n#shl-accueil .step-bar i:nth-child(4) { --k: 3; }\r\n#shl-accueil .step-bar i:nth-child(5) { --k: 4; }\r\n@media (min-width: 1061px){#shl-accueil .method.is-live .step:not(.is-active) .step-bar i::after { transform: scaleX(0); transition-duration: .4s; transition-delay: 0s; }\r\n}#shl-accueil .step h3 { margin-top: 22px; font-size: 24px; font-weight: 700; letter-spacing: -.02em; line-height: 1.25; }\r\n#shl-accueil .step h3 + p { max-width: 580px; margin-top: 12px; font-size: 15.5px; line-height: 1.7; color: var(--ink-2); }\r\n#shl-accueil .tools { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-top: 24px; }\r\n#shl-accueil .tools li { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 10px; font-size: 14px; font-weight: 600; }\r\n#shl-accueil .tools svg { flex: none; width: 16px; height: 16px; fill: none; stroke: var(--accent); stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .projects { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; }\r\n#shl-accueil .project { position: relative; display: flex; flex: 0 1 calc((100% - 40px) \/ 3); min-width: 0; flex-direction: column; padding: 28px; overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .project:nth-child(1) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .project:nth-child(2) { --c: var(--t6); --cx: var(--x6); }\r\n#shl-accueil .project:nth-child(3) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .project:nth-child(4) { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .project:nth-child(5) { --c: var(--t10); --cx: var(--x10); }\r\n#shl-accueil .project:nth-child(6) { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .project:nth-child(7) { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .project:nth-child(8) { --c: var(--t8); --cx: var(--x8); }\r\n#shl-accueil .project:nth-child(9) { --c: var(--t2); --cx: var(--x2); }\r\n#shl-accueil .project:nth-child(10) { --c: var(--t4); --cx: var(--x4); }\r\n#shl-accueil .project:nth-child(11) { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .project:nth-child(12) { --c: var(--t6); --cx: var(--x6); }\r\n#shl-accueil .project:nth-child(13) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .project:nth-child(14) { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .project::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--c); transform: scaleX(0); transform-origin: left; transition: transform .6s var(--ease); }\r\n#shl-accueil .project:hover::before { transform: none; }\r\n#shl-accueil .duo { position: relative; height: 164px; margin: -12px -12px 24px; overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .duo::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); }\r\n#shl-accueil .duo-arc { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }\r\n#shl-accueil .duo-arc path { fill: none; stroke-linecap: round; }\r\n#shl-accueil .duo-track { stroke: #cfd8d3; stroke-width: 1.5; stroke-dasharray: 0 5; }\r\n#shl-accueil .duo-line { stroke: var(--c); stroke-width: 2; stroke-dasharray: 1; stroke-dashoffset: 0; transition: stroke-dashoffset 1s var(--ease-io) var(--dl, 0s); }\r\n#shl-accueil .duo-spark { stroke: #fff; stroke-width: 3; stroke-dasharray: .05 1.2; stroke-dashoffset: .05; opacity: 0; filter: drop-shadow(0 0 2px var(--c)) drop-shadow(0 0 5px var(--c)); }\r\n#shl-accueil .duo.is-play .duo-spark { animation: duo-spark 4.2s var(--ease-io) calc(2.2s + var(--dl, 0s)) infinite; }\r\n#shl-accueil .duo-home, #shl-accueil .duo-node { position: absolute; left: var(--x, 25%); top: var(--y, 56%); transform: translate(-50%, -50%); }\r\n#shl-accueil .duo-home { left: max(76px, 23%); display: grid; place-items: center; width: 124px; height: 72px; background: #fff; border: 1px solid var(--line); border-radius: 18px; box-shadow: var(--shadow-sm); --iw: 100px; --ih: 44px; }\r\n#shl-accueil .duo-fit { --s: min(calc(var(--iw) \/ var(--bw)), calc(var(--ih) \/ var(--bh))); overflow: hidden; }\r\n#shl-accueil .duo .duo-fit > img { position: absolute; border-radius: 0; max-width: none; width: calc(var(--n, 500) * var(--s)); height: calc(var(--n, 500) * var(--s)); left: calc(50% - (var(--bx) + var(--bw) \/ 2) * var(--s)); top: calc(50% - (var(--by) + var(--bh) \/ 2) * var(--s)); }\r\n#shl-accueil .duo-home:not(.duo-fit) > img { width: auto; height: auto; max-width: var(--iw); max-height: var(--ih); border-radius: 0; }\r\n#shl-accueil .duo-name { padding: 8px; font-size: 13px; font-weight: 800; line-height: 1.15; letter-spacing: -.01em; text-align: center; color: color-mix(in srgb, var(--c) 72%, var(--ink)); }\r\n#shl-accueil .duo-node { width: 52px; height: 52px; padding: 4px; border-radius: 50%; background: #fff; box-shadow: 0 0 0 1.5px var(--c), 0 0 0 6px color-mix(in srgb, var(--c) 14%, transparent), 0 6px 14px -8px rgba(22, 38, 44, .35); transition: box-shadow .5s var(--ease) calc(.8s + var(--dl, 0s)); }\r\n#shl-accueil .duo-node > svg, #shl-accueil .duo-node > img { width: 100%; height: 100%; border-radius: 50%; transition: filter .6s var(--ease) calc(.8s + var(--dl, 0s)), opacity .6s var(--ease) calc(.8s + var(--dl, 0s)); }\r\n#shl-accueil .duo-node.is-sm { width: 40px; height: 40px; padding: 3px; }\r\n#shl-accueil .duo-node.is-tile { --iw: 84px; --ih: 30px; width: 104px; height: 48px; padding: 0; border-radius: 14px; }\r\n#shl-accueil .duo-badge { position: absolute; width: 20px; height: 20px; border-radius: 50%; box-shadow: 0 0 0 2px #fff; transform: translate(-50%, -50%); transition: opacity .4s var(--ease) calc(.9s + var(--dl, 0s)); }\r\n#shl-accueil .duo-hub { color: var(--accent); }\r\n#shl-accueil .duo-hub svg { fill: currentColor; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; }\r\n#shl-accueil .duo-seal { position: absolute; left: 12px; top: 12px; z-index: 2; display: inline-flex; align-items: center; gap: 7px; padding: 4px 10px 4px 4px; background: #fff; border: 1px solid var(--line); border-radius: 999px; box-shadow: var(--shadow-sm); font: 500 11.5px\/1 var(--mono); color: var(--ink); white-space: nowrap; transform-origin: left top; transition: opacity .38s var(--ease) 1.35s, transform .5s var(--ease) 1.35s; }\r\n#shl-accueil .duo-seal svg { width: 18px; height: 18px; border-radius: 50%; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-line { stroke-dashoffset: 1; transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-node { box-shadow: 0 0 0 1px var(--line), 0 6px 14px -8px rgba(22, 38, 44, .35); transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-node > svg, #shl-accueil.js .duo:not(.is-play) .duo-node > img { filter: grayscale(1); opacity: .45; transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-badge { opacity: 0; transition: none; }\r\n#shl-accueil.js .duo:not(.is-play) .duo-seal { opacity: 0; transform: scale(.86); transition: none; }\r\n@keyframes duo-spark{0% { stroke-dashoffset: .05; opacity: 0; } 4% { opacity: 1; } 34% { stroke-dashoffset: -1; opacity: 1; } 38%, 100% { stroke-dashoffset: -1; opacity: 0; }}#shl-accueil .project .theme { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 700; color: color-mix(in srgb, var(--c) 72%, #000); }\r\n#shl-accueil .project .theme::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--c); }\r\n#shl-accueil .project .place { margin-top: 20px; }\r\n#shl-accueil .project h3 { margin-top: 8px; font-size: 20px; font-weight: 700; letter-spacing: -.02em; line-height: 1.3; }\r\n#shl-accueil .project h3 + p { flex: 1; margin-top: 12px; font-size: 14.5px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .quotes { display: grid; grid-template-columns: 1.3fr 1fr 1fr; gap: 20px; }\r\n#shl-accueil .quote { display: flex; flex-direction: column; padding: 32px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .quote:nth-child(1) { --c: var(--t2); --cx: var(--x2); }\r\n#shl-accueil .quote:nth-child(2) { --c: var(--t8); --cx: var(--x8); }\r\n#shl-accueil .quote:nth-child(3) { --c: var(--t7); --cx: var(--x7); }\r\n#shl-accueil .quote.feature { position: relative; overflow: hidden; }\r\n#shl-accueil .quote.feature::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--spectrum); }\r\n#shl-accueil .quote .mark { height: 34px; font: 800 64px\/.9 var(--font); color: var(--c); }\r\n#shl-accueil .quote blockquote { flex: 1; margin-top: 14px; font-size: 15.5px; line-height: 1.7; color: var(--ink); }\r\n#shl-accueil .quote.feature blockquote { font-size: 20px; line-height: 1.5; font-weight: 600; letter-spacing: -.012em; }\r\n#shl-accueil .quote figcaption { display: flex; align-items: center; gap: 12px; margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--line-2); }\r\n#shl-accueil .quote .face { flex: none; width: 48px; height: 48px; border-radius: 50%; object-fit: cover; box-shadow: 0 0 0 2px #fff, 0 0 0 3px color-mix(in srgb, var(--c) 45%, #fff); }\r\n#shl-accueil .quote figcaption b { display: block; font-size: 14.5px; font-weight: 700; }\r\n#shl-accueil .quote .role { display: block; font-size: 13px; font-weight: 600; color: var(--cx); }\r\n#shl-accueil .trust { --lift: 0 0 0 1px rgba(22, 38, 44, .06), 0 1px 2px rgba(22, 38, 44, .05), 0 6px 12px -6px rgba(22, 38, 44, .12), 0 18px 32px -18px rgba(22, 38, 44, .2);\r\n  --lift-hi: 0 0 0 1px rgba(22, 38, 44, .07), 0 2px 4px rgba(22, 38, 44, .06), 0 14px 24px -10px rgba(22, 38, 44, .22), 0 34px 50px -24px rgba(22, 38, 44, .32);\r\n  --roll: cubic-bezier(.76, 0, .24, 1); }\r\n#shl-accueil .trust .sc-cap, #shl-accueil .trust .sc-count { position: absolute; top: 14px; z-index: 2; font-size: 12.5px; font-weight: 600; line-height: 1.3; transition: color .5s, opacity .4s var(--ease); }\r\n#shl-accueil .trust .sc-cap { left: 16px; display: flex; align-items: center; gap: 9px; color: var(--kx, var(--cx)); }\r\n#shl-accueil .trust .sc-cap i { position: relative; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--k, var(--c)); transition: background-color .5s; }\r\n#shl-accueil .trust .sc-cap i::after { content: ''; position: absolute; inset: -4px; border-radius: 50%; border: 1.5px solid var(--k, var(--c)); opacity: 0; animation: sc-ping 2.2s var(--ease) infinite; }\r\n#shl-accueil .trust .sc-cap span { transition: opacity .25s, filter .25s; }\r\n#shl-accueil .trust .sc-cap span.is-swap { opacity: 0; filter: blur(4px); }\r\n#shl-accueil .trust .sc-count { right: 16px; color: var(--muted); font-variant-numeric: tabular-nums; }\r\n#shl-accueil .trust .sc-timer { position: absolute; left: 0; bottom: 0; width: 1px; height: 1px; visibility: hidden; pointer-events: none; }\r\n#shl-accueil .trust .is-auto .sc-timer.is-run { animation: sc-run var(--hold, 3s) linear both; }\r\n#shl-accueil .trust .is-hold .sc-timer.is-run { animation-play-state: paused; }\r\n@media (hover: hover){#shl-accueil .trust .is-auto:hover .sc-timer.is-run { animation-play-state: paused; }\r\n}@keyframes sc-ping{0% { transform: scale(.4); opacity: .8; } 100% { transform: scale(1.9); opacity: 0; }}@keyframes sc-run{from { transform: scaleX(0); } to { transform: none; }}#shl-accueil .trust svg.ic { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\r\n#shl-accueil .trust [data-k=\"pub\"] { --k: var(--t7); --kx: var(--x7); }\r\n#shl-accueil .trust [data-k=\"eu\"] { --k: var(--t8); --kx: var(--x8); }\r\n#shl-accueil .trust [data-k=\"pri\"] { --k: var(--t3); --kx: var(--x3); }\r\n@media (min-width: 1061px){#shl-accueil .trust { grid-template-columns: repeat(12, minmax(0, 1fr)); }\r\n#shl-accueil .trust > .bc:nth-child(1) { grid-column: span 7; }\r\n#shl-accueil .trust > .bc:nth-child(2) { grid-column: span 5; }\r\n#shl-accueil .trust > .bc-wide { display: grid; grid-column: 1 \/ -1; grid-row: auto; grid-template-rows: none; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); align-items: center; }\r\n#shl-accueil .bc-wide .bc-head { order: -1; padding: 32px 40px; }\r\n#shl-accueil .bc-wide .bc-stage { min-height: 250px; margin: 10px; }\r\n}#shl-accueil .sc-ros { padding: 20px 24px; container-type: inline-size; }\r\n#shl-accueil .ros { display: grid; grid-template-columns: minmax(0, 200px) minmax(0, 1fr); align-items: center; gap: 30px; width: 100%; }\r\n#shl-accueil .ros-side { display: grid; justify-items: start; min-width: 0; }\r\n#shl-accueil .ros-num [data-odo] { display: flex; }\r\n#shl-accueil .ros-num { display: flex; font-size: 76px; font-weight: 800; line-height: 1; letter-spacing: -.05em; color: var(--ink); }\r\n#shl-accueil .odo { position: relative; display: block; height: 1em; overflow: hidden; transition: width 2.4s cubic-bezier(.2, .9, .1, 1) var(--od, 0ms); -webkit-mask-image: linear-gradient(transparent, #000 22%, #000 78%, transparent); mask-image: linear-gradient(transparent, #000 22%, #000 78%, transparent); }\r\n#shl-accueil .odo > i { display: block; font-style: normal; visibility: hidden; }\r\n#shl-accueil .odo > span { position: absolute; left: 0; right: 0; top: 0; text-align: center; transition: transform 2.4s cubic-bezier(.2, .9, .1, 1) var(--od, 0ms); }\r\n#shl-accueil .odo > span > span { display: block; height: 1em; }\r\n#shl-accueil .ros-cap { max-width: 180px; margin-top: 12px; font-size: 14px; font-weight: 600; line-height: 1.35; color: var(--ink-2); }\r\n#shl-accueil .ros-roll { height: 264px; overflow: hidden; -webkit-mask-image: linear-gradient(transparent, #000 18%, #000 82%, transparent); mask-image: linear-gradient(transparent, #000 18%, #000 82%, transparent); }\r\n#shl-accueil .ros.is-loop .ros-track { animation: ros-up var(--dur, 64s) linear infinite; }\r\n@keyframes ros-up{to { transform: translateY(-50%); }}#shl-accueil .ros-list li { display: flex; align-items: center; gap: 14px; padding: 8px 2px; }\r\n#shl-accueil .ros-logo { position: relative; display: flex; align-items: center; justify-content: center; flex: none; width: 72px; height: 44px; border-radius: 11px; background: #fff; box-shadow: inset 0 0 0 1px var(--line); --iw: 60px; --ih: 32px; }\r\n#shl-accueil .ros-logo > img { width: auto; height: auto; max-width: var(--iw); max-height: var(--ih); }\r\n#shl-accueil .ros-logo.duo-fit > img { position: absolute; max-width: none; max-height: none; width: calc(500 * var(--s)); height: calc(500 * var(--s)); left: calc(50% - (var(--bx) + var(--bw) \/ 2) * var(--s)); top: calc(50% - (var(--by) + var(--bh) \/ 2) * var(--s)); }\r\n#shl-accueil .ros-tx { display: grid; gap: 1px; min-width: 0; }\r\n#shl-accueil .ros-tx b { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 2; font-size: 14.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.012em; color: var(--ink); text-wrap: balance; }\r\n#shl-accueil .ros-tx small { overflow: hidden; font-size: 12px; font-weight: 600; line-height: 1.45; color: var(--muted); white-space: nowrap; text-overflow: ellipsis; }\r\n#shl-accueil .ros-tx small em, #shl-accueil .ros-tx small i { font-style: normal; }\r\n#shl-accueil .ros-tx small em { color: var(--ink-2); }\r\n@container (max-width: 540px){#shl-accueil .ros { grid-template-columns: minmax(0, 1fr); gap: 14px; }\r\n#shl-accueil .ros-side { grid-template-columns: auto minmax(0, 1fr); align-items: end; column-gap: 14px; }\r\n#shl-accueil .ros-num { font-size: 56px; }\r\n#shl-accueil .ros-cap { margin: 0 0 4px; }\r\n#shl-accueil .ros-roll { height: 300px; }\r\n#shl-accueil .ros-logo { width: 60px; height: 40px; border-radius: 10px; --iw: 50px; --ih: 28px; }\r\n#shl-accueil .ros-tx small { white-space: normal; }\r\n}#shl-accueil .sc-anc { --hold: 2.8s; padding: 46px 18px 18px; container-type: inline-size; }\r\n#shl-accueil .sc-anc .anc-tag, #shl-accueil .sc-anc .anc-fam li, #shl-accueil .sc-anc .anc-core { cursor: pointer; }\r\n#shl-accueil .anc { position: relative; display: grid; grid-template-columns: 92px minmax(0, 1fr); align-items: center; gap: 30px; width: 100%; }\r\n#shl-accueil .anc > .anc-wires { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }\r\n#shl-accueil .anc-wire { fill: none; stroke: #d9e1db; stroke-width: 1.25; }\r\n#shl-accueil .anc-comet { fill: none; stroke: var(--k); stroke-width: 2.4; stroke-linecap: round; }\r\n#shl-accueil .anc-head { fill: #fff; stroke: var(--k); stroke-width: 2; opacity: 0; filter: drop-shadow(0 0 4px var(--k)); }\r\n#shl-accueil .anc-hub { position: relative; z-index: 1; display: grid; justify-items: center; gap: 10px; text-align: center; }\r\n#shl-accueil .anc-hub > b { font-size: 12px; font-weight: 700; line-height: 1.25; color: var(--ink); }\r\n#shl-accueil .anc-core { position: relative; display: grid; place-items: center; width: 72px; height: 72px; border-radius: 50%; background: #fff; box-shadow: var(--lift); }\r\n#shl-accueil .anc-core img { width: 54px; height: 54px; }\r\n#shl-accueil .anc-core::after { content: ''; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; }\r\n#shl-accueil .anc-core.is-beat::after { animation: anc-beat 1s var(--ease) both; }\r\n#shl-accueil .anc-core.is-beat { animation: anc-thump .6s var(--ease); }\r\n#shl-accueil .anc-rings { position: absolute; left: 50%; top: 36px; z-index: -1; }\r\n#shl-accueil .anc-rings i { position: absolute; left: calc(var(--r) * -1); top: calc(var(--r) * -1); width: calc(var(--r) * 2); height: calc(var(--r) * 2); border-radius: 50%; border: 1px solid #e6ebe6; }\r\n#shl-accueil .anc-rings i:nth-child(1) { --r: 52px; background: radial-gradient(closest-side, rgba(255, 255, 255, .9), rgba(255, 255, 255, 0)); }\r\n#shl-accueil .anc-rings i:nth-child(2) { --r: 78px; border-style: dashed; border-color: #dce3dd; animation: anc-spin 60s linear infinite; }\r\n#shl-accueil .anc-rings i:nth-child(3) { --r: 106px; border-color: #eef1ec; }\r\n#shl-accueil .anc-fams { position: relative; z-index: 1; display: grid; gap: 14px; }\r\n#shl-accueil .anc-fam { display: grid; grid-template-columns: 86px minmax(0, 1fr); align-items: center; gap: 26px; transition: opacity .6s var(--ease); }\r\n#shl-accueil .anc-tag { position: relative; justify-self: start; display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px 4px 4px; border-radius: 999px; background: #fff; box-shadow: var(--lift); font-size: 11.5px; font-weight: 700; line-height: 18px; color: var(--kx); white-space: nowrap; transition: background-color .5s var(--ease), color .5s var(--ease), box-shadow .5s var(--ease); }\r\n#shl-accueil .anc-tag i { display: grid; place-items: center; width: 20px; height: 20px; overflow: hidden; border-radius: 50%; background: color-mix(in srgb, var(--k) 15%, #fff); color: var(--k); transition: background-color .5s var(--ease), color .5s var(--ease); }\r\n#shl-accueil .anc-tag .ic { width: 11px; height: 11px; }\r\n#shl-accueil .anc-tag i.is-flag svg { width: 20px; height: 20px; }\r\n#shl-accueil .anc-fam ul { display: grid; gap: 6px; min-width: 0; }\r\n#shl-accueil .anc-fam li { display: flex; align-items: center; gap: 8px; min-width: 0; padding: 5px 10px 5px 7px; border-radius: 9px; background: #fff; box-shadow: var(--lift); font-size: 12px; font-weight: 600; line-height: 1.3; color: var(--ink); white-space: nowrap; transition: box-shadow .5s var(--ease), transform .5s var(--ease); }\r\n#shl-accueil .anc-logo { flex: none; display: grid; place-items: center; width: 38px; height: 18px; }\r\n#shl-accueil .anc-logo img { width: auto; height: auto; max-width: 100%; max-height: 100%; }\r\n#shl-accueil .anc-logo img.is-mark { width: 18px; height: 18px; max-width: none; object-fit: cover; object-position: left center; }\r\n#shl-accueil .anc-logo .is-flag { width: 21px; height: 14px; overflow: hidden; border-radius: 3px; box-shadow: 0 0 0 1px rgba(22, 38, 44, .1); }\r\n#shl-accueil .anc-fam li span { overflow: hidden; text-overflow: ellipsis; }\r\n#shl-accueil .anc-fam li.is-ping { box-shadow: 0 0 0 1.5px var(--k), 0 0 0 5px color-mix(in srgb, var(--k) 14%, transparent), 0 8px 16px -8px rgba(22, 38, 44, .25); }\r\n#shl-accueil .anc-fam.is-on .anc-tag { background: color-mix(in srgb, var(--k) 10%, #fff); box-shadow: 0 0 0 1.5px var(--k), 0 10px 20px -10px var(--k); }\r\n#shl-accueil .anc-fam.is-on .anc-tag i { background: var(--k); color: #fff; }\r\n#shl-accueil .sc-anc.has-focus .anc-fam:not(.is-on) { opacity: .5; }\r\n#shl-accueil .anc-hub, #shl-accueil .anc-tag, #shl-accueil .anc-fam li { transition-property: opacity, filter, transform, box-shadow, background-color, color; transition-duration: .7s; transition-timing-function: var(--ease); }\r\n#shl-accueil .anc-wire { transition: stroke-dashoffset 1s var(--ease-io) calc(.2s + var(--f, 0) * .16s); }\r\n#shl-accueil .anc-tag { transition-delay: calc(.55s + var(--f, 0) * .16s); }\r\n#shl-accueil .anc-fam li { transition-delay: calc(.85s + var(--f, 0) * .16s + var(--j, 0) * 60ms); }\r\n#shl-accueil .sc-anc.is-built .anc-tag, #shl-accueil .sc-anc.is-built .anc-fam li { transition-delay: 0s; }\r\n#shl-accueil .sc-anc.is-pre .anc-wire { stroke-dashoffset: calc(-1 * var(--L, 0px)); transition: none; }\r\n#shl-accueil .sc-anc.is-pre .anc-hub { opacity: 0; transform: scale(.9); filter: blur(4px); }\r\n#shl-accueil .sc-anc.is-pre .sc-count { opacity: 0; }\r\n#shl-accueil .sc-anc.is-pre .anc-tag, #shl-accueil .sc-anc.is-pre .anc-fam li { opacity: 0; transform: translateX(-6px); filter: blur(4px); transition-duration: 0s; }\r\n@keyframes anc-spin{to { transform: rotate(360deg); }}@keyframes anc-beat{from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--k, var(--t7)) 45%, transparent); } to { box-shadow: 0 0 0 26px transparent; }}@keyframes anc-thump{30% { transform: scale(1.06); }}@container (max-width: 430px){#shl-accueil .anc { grid-template-columns: 72px minmax(0, 1fr); gap: 22px; }\r\n#shl-accueil .anc-core { width: 60px; height: 60px; }\r\n#shl-accueil .anc-core img { width: 44px; height: 44px; }\r\n#shl-accueil .anc-rings { top: 30px; }\r\n#shl-accueil .anc-hub > b { font-size: 11px; }\r\n#shl-accueil .anc-fams { gap: 10px; }\r\n#shl-accueil .anc-fam { grid-template-columns: minmax(0, 1fr); gap: 6px; }\r\n#shl-accueil .anc-fam li { gap: 5px; font-size: 11.5px; padding: 5px 8px 5px 5px; }\r\n#shl-accueil .anc-logo { width: 26px; height: 16px; }\r\n#shl-accueil .anc-logo img.is-mark { width: 16px; height: 16px; }\r\n}#shl-accueil .sc-tra { --k: var(--t5); --kx: var(--x5); --hold: 1.1s; padding: 22px 26px; container-type: inline-size; }\r\n#shl-accueil .tra { position: relative; display: grid; gap: 12px; width: min(100%, 660px); --cw: 178px; }\r\n#shl-accueil .tra-glow { position: absolute; top: 18%; bottom: 18%; width: 34%; border-radius: 50%; filter: blur(36px); pointer-events: none; transition: opacity 1s var(--ease); }\r\n#shl-accueil .tra-glow.is-shl { left: 4%; background: #cfd9dd; opacity: calc(.7 - var(--p, 0) * .5); }\r\n#shl-accueil .tra-glow.is-you { right: 4%; background: var(--t5); opacity: calc(var(--p, 0) * .22); }\r\n#shl-accueil .tra-head, #shl-accueil .tra-row { display: grid; grid-template-columns: var(--cw) minmax(0, 1fr) var(--cw); align-items: center; }\r\n#shl-accueil .tra-head { margin-bottom: 4px; }\r\n#shl-accueil .tra-who { display: flex; align-items: center; gap: 10px; min-width: 0; transition: opacity .8s var(--ease); }\r\n#shl-accueil .tra-who p { min-width: 0; }\r\n#shl-accueil .tra-who p > b { display: block; font-size: 12.5px; font-weight: 700; line-height: 1.2; color: var(--ink); }\r\n#shl-accueil .tra-who small { display: grid; margin-top: 2px; font-size: 11.5px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .tra-who small span { grid-area: 1 \/ 1; transition: opacity .5s var(--ease), filter .5s var(--ease); }\r\n#shl-accueil .tra-who small span:last-child, #shl-accueil .sc-tra.is-done .tra-who small span:first-child { opacity: 0; filter: blur(3px); }\r\n#shl-accueil .sc-tra.is-done .tra-who small span:last-child { opacity: 1; filter: none; }\r\n#shl-accueil .tra-who.is-shl small { color: var(--muted); }\r\n#shl-accueil .tra-who.is-you small { color: var(--x5); }\r\n#shl-accueil .sc-tra.is-done .tra-who.is-shl { opacity: .5; }\r\n#shl-accueil .tra-av { position: relative; display: grid; place-items: center; flex: none; width: 36px; height: 36px; background: #fff; box-shadow: var(--lift); }\r\n#shl-accueil .tra-who.is-shl .tra-av { border-radius: 10px; }\r\n#shl-accueil .tra-who.is-shl .tra-av img { width: 30px; height: 30px; }\r\n#shl-accueil .tra-who.is-you .tra-av { border-radius: 50%; background: color-mix(in srgb, var(--t5) 14%, #fff); color: var(--x5); }\r\n#shl-accueil .tra-who.is-you .tra-av .ic { width: 17px; height: 17px; }\r\n#shl-accueil .tra-meter { display: grid; gap: 7px; padding: 0 24px; }\r\n#shl-accueil .tra-meter p { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }\r\n#shl-accueil .tra-meter p span { font: 500 10.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .tra-meter p b { font-size: 13px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); font-variant-numeric: tabular-nums; }\r\n#shl-accueil .tra-bar { display: block; height: 6px; overflow: hidden; border-radius: 3px; background: var(--sunk); box-shadow: inset 0 0 0 1px var(--line-2); }\r\n#shl-accueil .tra-bar i { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, color-mix(in srgb, var(--t5) 55%, #fff), var(--t5)); transform: scaleX(var(--p, 0)); transform-origin: left; transition: transform .9s var(--ease); }\r\n#shl-accueil .tra-rows { display: grid; gap: 6px; }\r\n#shl-accueil .tra-row { position: relative; height: 34px; }\r\n#shl-accueil .tra-slot { height: 100%; border: 1px dashed #d3dbd5; border-radius: 10px; }\r\n#shl-accueil .tra-lane { position: relative; height: 0; margin: 0 12px; border-top: 1.5px dashed #d8dfda; }\r\n#shl-accueil .tra-lane::after { content: ''; position: absolute; left: 0; right: 0; top: -1.5px; height: 1.5px; background: linear-gradient(90deg, #b9c6c9, var(--t5)); transform: scaleX(0); transform-origin: left; transition: transform 1s var(--roll); }\r\n#shl-accueil .tra-key { position: absolute; left: 0; top: 0; z-index: 1; width: var(--cw); height: 100%; transition: transform 1s var(--roll); }\r\n#shl-accueil .tra-row.is-moved .tra-key { transform: translateX(var(--dx, 0px)); }\r\n#shl-accueil .tra-row.is-moved .tra-lane::after { transform: scaleX(1); }\r\n#shl-accueil:not(.js) .tra-row.is-moved .tra-key { left: auto; right: 0; }\r\n#shl-accueil .tra-row.no-tr *, #shl-accueil .tra-row.no-tr *::after { transition: none !important; }\r\n#shl-accueil .tra-chip { position: relative; display: flex; align-items: center; gap: 9px; height: 100%; padding: 0 12px 0 5px; border-radius: 10px; background: #fff; box-shadow: var(--lift); font-size: 12.5px; font-weight: 700; line-height: 1; color: var(--ink); white-space: nowrap; transition: box-shadow .5s var(--ease); }\r\n#shl-accueil .tra-chip > i { display: grid; place-items: center; flex: none; width: 24px; height: 24px; border-radius: 7px; background: var(--sunk); color: var(--ink-2); transition: background-color .5s var(--ease), color .5s var(--ease); }\r\n#shl-accueil .tra-chip .ic { width: 13px; height: 13px; }\r\n#shl-accueil .tra-row.is-next .tra-chip { box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--t5) 45%, transparent), 0 1px 2px rgba(22, 38, 44, .05), 0 10px 20px -10px color-mix(in srgb, var(--t5) 55%, transparent); }\r\n#shl-accueil .tra-row.is-flying .tra-chip { animation: tra-hop 1s var(--roll); }\r\n#shl-accueil .tra-row.is-yours .tra-chip { box-shadow: 0 0 0 1px color-mix(in srgb, var(--t5) 30%, transparent), 0 1px 2px rgba(22, 38, 44, .05), 0 6px 12px -6px rgba(22, 38, 44, .12), 0 18px 32px -18px color-mix(in srgb, var(--t5) 45%, transparent); }\r\n#shl-accueil .tra-row.is-yours .tra-chip > i { background: color-mix(in srgb, var(--t5) 16%, #fff); color: var(--x5); }\r\n#shl-accueil .tra-ok { position: absolute; display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--t5); color: #fff; box-shadow: 0 0 0 2px #fff; transform: scale(0); transition: transform .45s cubic-bezier(.34, 1.56, .64, 1); }\r\n#shl-accueil .tra-ok .ic { width: 9px; height: 9px; stroke-width: 3.2; }\r\n#shl-accueil .tra-chip .tra-ok { right: -5px; top: -5px; }\r\n#shl-accueil .tra-row.is-yours .tra-ok, #shl-accueil .sc-tra.is-done .tra-av .tra-ok { transform: scale(1); }\r\n#shl-accueil .tra-av .tra-ok { right: -4px; bottom: -4px; }\r\n#shl-accueil .tra-note { --hold: 3.6s; position: relative; justify-self: center; display: inline-flex; align-items: center; gap: 8px; margin-top: 6px; padding: 6px 12px 6px 7px; border-radius: 999px; background: #fff; box-shadow: var(--lift); font-size: 12px; font-weight: 700; line-height: 1.3; color: var(--x5); text-align: left; opacity: 0; transform: translateY(6px); filter: blur(4px); transition: opacity .6s var(--ease), transform .6s var(--ease), filter .6s var(--ease); }\r\n#shl-accueil .tra-note i { display: grid; place-items: center; flex: none; width: 18px; height: 18px; border-radius: 50%; background: color-mix(in srgb, var(--t5) 16%, #fff); }\r\n#shl-accueil .tra-note .ic { width: 10px; height: 10px; stroke-width: 3; }\r\n#shl-accueil .sc-tra.is-done .tra-note { opacity: 1; transform: none; filter: none; }\r\n#shl-accueil .tra-rows, #shl-accueil .tra-meter { transition: opacity .45s var(--ease); }\r\n#shl-accueil .sc-tra.is-fade .tra-rows, #shl-accueil .sc-tra.is-fade .tra-meter, #shl-accueil .sc-tra.is-fade .tra-note { opacity: 0; }\r\n@keyframes tra-hop{45% { transform: translateY(-7px) scale(1.05) rotate(-1.2deg); box-shadow: var(--lift-hi); }}@container (max-width: 560px){#shl-accueil .tra-head { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); row-gap: 14px; }\r\n#shl-accueil .tra-head .tra-who.is-you { grid-column: 2; grid-row: 1; }\r\n#shl-accueil .tra-meter { grid-column: 1 \/ -1; padding: 0; }\r\n#shl-accueil .tra-row { grid-template-columns: minmax(0, 1fr) 28px minmax(0, 1fr); }\r\n#shl-accueil .tra-lane { margin: 0 6px; }\r\n#shl-accueil .tra-key { width: calc(50% - 14px); }\r\n}@container (max-width: 380px){#shl-accueil .tra-who { gap: 8px; }\r\n#shl-accueil .tra-av { width: 30px; height: 30px; }\r\n#shl-accueil .tra-who.is-shl .tra-av img { width: 25px; height: 25px; }\r\n#shl-accueil .tra-who p > b { font-size: 12px; }\r\n#shl-accueil .tra-chip { gap: 7px; padding-right: 8px; font-size: 12px; }\r\n#shl-accueil .tra-chip > i { width: 22px; height: 22px; }\r\n}#shl-accueil .studio { overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: var(--shadow); }\r\n#shl-accueil .studio-nav { position: relative; padding: 8px; background: var(--canvas); border-bottom: 1px solid var(--line); }\r\n#shl-accueil .studio-tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }\r\n#shl-accueil .fmt-thumb { position: absolute; top: 0; left: 0; width: 0; height: 0; border-radius: 14px; background: #fff; box-shadow: 0 1px 2px rgba(14, 27, 46, .06), 0 10px 24px -12px rgba(14, 27, 46, .24); opacity: 0; transition: transform .6s var(--ease), width .6s var(--ease), height .6s var(--ease), opacity .3s; }\r\n#shl-accueil.js .fmt-thumb { opacity: 1; }\r\n#shl-accueil .fmt-tab { --c: var(--accent); --cx: var(--accent); position: relative; z-index: 1; display: flex; flex-direction: column; align-items: flex-start; padding: 14px 18px 17px; overflow: hidden; border: 0; border-radius: 14px; background: transparent; text-align: left; cursor: pointer; transition: background-color .3s; }\r\n#shl-accueil .fmt-tab:hover { background: rgba(255, 255, 255, .6); }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] { background: transparent; }\r\n#shl-accueil:not(.js) .fmt-tab[aria-selected=\"true\"] { background: #fff; }\r\n#shl-accueil .fmt-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; }\r\n#shl-accueil .fmt-n { font: 500 12px\/1 var(--mono); letter-spacing: .1em; color: var(--cx); }\r\n#shl-accueil .fmt-name { margin-top: 10px; font-size: 16px; font-weight: 700; letter-spacing: -.015em; line-height: 1.25; color: var(--ink-2); transition: color .4s; }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] .fmt-name { color: var(--ink); }\r\n#shl-accueil .fmt-meta { margin-top: 6px; font-size: 13px; line-height: 1.4; color: var(--muted); }\r\n#shl-accueil .scale { display: flex; gap: 3px; opacity: .45; transition: opacity .5s var(--ease); }\r\n#shl-accueil .scale i { width: 14px; height: 4px; border-radius: 2px; background: var(--line); }\r\n#shl-accueil .scale i.on { background: var(--c); }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] .scale { opacity: 1; }\r\n#shl-accueil .fmt-timer { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: var(--c); transform: scaleX(0); transform-origin: left; opacity: 0; transition: opacity .3s; }\r\n#shl-accueil .fmt-tab[aria-selected=\"true\"] .fmt-timer { opacity: 1; transform: none; }\r\n#shl-accueil .studio.is-auto .fmt-tab[aria-selected=\"true\"] .fmt-timer { animation: fmt-run var(--hold, 7s) linear both; }\r\n#shl-accueil .studio.is-auto:hover .fmt-tab[aria-selected=\"true\"] .fmt-timer, #shl-accueil .studio.is-hold .fmt-tab[aria-selected=\"true\"] .fmt-timer { animation-play-state: paused; }\r\n@keyframes fmt-run{from { transform: scaleX(0); } to { transform: none; }}#shl-accueil .studio-body { display: grid; grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr); }\r\n#shl-accueil .fmt-panels { display: grid; }\r\n#shl-accueil .fmt-panel { display: flex; flex-direction: column; justify-content: center; padding: clamp(28px, 3.4vw, 44px) clamp(24px, 3vw, 40px); }\r\n#shl-accueil.js .fmt-panel { grid-area: 1 \/ 1; }\r\n#shl-accueil.js .fmt-panel:not(.is-on) { visibility: hidden; transition: visibility 0s .3s; }\r\n#shl-accueil.js .fmt-panel > * { transition: opacity .6s var(--ease), transform .8s var(--ease), filter .6s var(--ease); transition-delay: calc(var(--k) * 70ms + 160ms); }\r\n#shl-accueil.js .fmt-panel:not(.is-on) > * { opacity: 0; transform: translateY(14px); filter: blur(6px); transition-duration: .25s; transition-delay: 0s; }\r\n#shl-accueil .fmt-panel h3 { margin-top: 16px; font-size: clamp(26px, 2.5vw, 34px); font-weight: 800; letter-spacing: -.032em; line-height: 1.1; text-wrap: balance; }\r\n#shl-accueil .fmt-panel h3 + p { max-width: 420px; margin-top: 16px; font-size: 16.5px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .fmt-specs { margin-top: 30px; }\r\n#shl-accueil .fmt-specs div { display: grid; grid-template-columns: 72px minmax(0, 1fr) auto; align-items: center; gap: 16px; padding: 15px 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .fmt-specs dt { grid-column: 1; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .fmt-specs dd { grid-column: 3; font-size: 16px; font-weight: 700; letter-spacing: -.01em; text-align: right; }\r\n#shl-accueil .fmt-specs dd.rhythm { grid-column: 2; display: flex; gap: 4px; min-width: 0; overflow: hidden; }\r\n#shl-accueil .rhythm i { flex: 0 1 22px; height: 8px; border-radius: 3px; border: 1.5px dashed color-mix(in srgb, var(--c) 55%, #fff); transform-origin: left; transition: transform .7s var(--ease); transition-delay: calc(var(--k) * 70ms + 260ms); }\r\n#shl-accueil .rhythm i.on { border: 0; background: var(--c); }\r\n#shl-accueil .rhythm.is-fine i { flex-basis: 11px; }\r\n#shl-accueil .rhythm.is-open i.on:nth-child(3) { opacity: .7; }\r\n#shl-accueil .rhythm.is-open i.on:nth-child(4) { opacity: .42; }\r\n#shl-accueil .rhythm.is-open i.on:nth-child(5) { opacity: .18; }\r\n#shl-accueil.js .fmt-panel:not(.is-on) .rhythm i { transform: scaleX(0); transition-delay: 0s; }\r\n#shl-accueil .studio[data-fmt=\"0\"] { --c: var(--t1); --cx: var(--x1); }\r\n#shl-accueil .studio[data-fmt=\"1\"] { --c: var(--t3); --cx: var(--x3); }\r\n#shl-accueil .studio[data-fmt=\"2\"] { --c: var(--t5); --cx: var(--x5); }\r\n#shl-accueil .studio[data-fmt=\"3\"] { --c: var(--t9); --cx: var(--x9); }\r\n#shl-accueil .stage-col { display: flex; flex-direction: column; min-width: 0; margin: 0; padding: 10px 10px 0; }\r\n#shl-accueil .stage { position: relative; flex: 1; min-height: clamp(340px, 28vw, 400px); overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .stage::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); pointer-events: none; }\r\n#shl-accueil .stage canvas { position: absolute; inset: 0; width: 100%; height: 100%; }\r\n#shl-accueil .stage-cap, #shl-accueil .stage-fig { position: absolute; top: 14px; font-size: 12.5px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .stage-cap { left: 16px; display: flex; align-items: center; gap: 9px; color: var(--cx); transition: color .5s; }\r\n#shl-accueil .stage-cap i { position: relative; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--c); transition: background-color .5s; }\r\n#shl-accueil .stage-cap i::after { content: ''; position: absolute; inset: -4px; border-radius: 50%; border: 1.5px solid var(--c); opacity: 0; animation: stage-ping 2.2s var(--ease) infinite; }\r\n@keyframes stage-ping{0% { transform: scale(.4); opacity: .8; } 100% { transform: scale(1.9); opacity: 0; }}#shl-accueil .stage-cap span { transition: opacity .25s, filter .25s; }\r\n#shl-accueil .stage-cap span.is-swap { opacity: 0; filter: blur(4px); }\r\n#shl-accueil .stage-fig { right: 16px; color: var(--muted); font-variant-numeric: tabular-nums; }\r\n#shl-accueil .stage-fig b { font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .stage-key { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 14px 10px 16px; font-size: 12.5px; font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .stage-key li { display: inline-flex; align-items: center; gap: 8px; transition: opacity .4s var(--ease); }\r\n#shl-accueil .stage-key i { flex: none; width: 9px; height: 9px; border-radius: 50%; }\r\n#shl-accueil .k-part { background: conic-gradient(var(--t1) 0 25%, var(--t5) 0 50%, var(--t7) 0 75%, var(--t9) 0); }\r\n#shl-accueil .k-shl { background: var(--ink); box-shadow: inset 0 0 0 2.5px var(--ink), inset 0 0 0 4.5px #fff; }\r\n#shl-accueil .k-mate { border: 1.5px solid var(--x9); }\r\n#shl-accueil .studio:not([data-fmt=\"3\"]) .k-only { opacity: 0; }\r\n#shl-accueil .formats-cta { position: relative; isolation: isolate; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 22px 40px; margin-top: 20px; padding: clamp(28px, 3.2vw, 40px) clamp(24px, 3.6vw, 48px); overflow: hidden; background: var(--ink); color: #fff; border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .2), 0 30px 60px -36px rgba(22, 38, 44, .7); }\r\n#shl-accueil .cta-threads { position: absolute; z-index: -1; top: 0; right: 0; width: 72%; height: 100%; overflow: visible; -webkit-mask-image: linear-gradient(90deg, transparent, #000 55%); mask-image: linear-gradient(90deg, transparent, #000 55%); }\r\n#shl-accueil .cta-threads use { fill: none; stroke: var(--c); stroke-width: 1.5; stroke-linecap: round; opacity: .8; }\r\n#shl-accueil .cta-threads path { vector-effect: non-scaling-stroke; }\r\n#shl-accueil .cta-bloom { transform-origin: 50% 50%; transform-box: view-box; transition: transform 1.8s var(--ease) .25s, opacity 1.2s var(--ease) .25s; }\r\n#shl-accueil.js .formats-cta:not(.is-in) .cta-bloom { transform: scaleY(.04); opacity: 0; }\r\n#shl-accueil .cta-flow { animation: cta-flow 16s linear infinite; }\r\n@keyframes cta-flow{to { transform: translateX(-400px); }}#shl-accueil .cta-copy { max-width: 600px; }\r\n#shl-accueil .cta-kicker { font: 500 11.5px\/1.3 var(--mono); letter-spacing: .12em; text-transform: uppercase; color: rgba(255, 255, 255, .66); }\r\n#shl-accueil .cta-text { margin-top: 12px; font-size: clamp(19px, 1.7vw, 24px); font-weight: 700; line-height: 1.3; letter-spacing: -.02em; text-wrap: balance; }\r\n#shl-accueil .btn-light { background: #fff; color: var(--ink); box-shadow: 0 12px 28px -14px rgba(0, 0, 0, .6); }\r\n#shl-accueil .btn-light:hover { box-shadow: 0 0 0 5px rgba(255, 255, 255, .16), 0 12px 28px -14px rgba(0, 0, 0, .6); }\r\n#shl-accueil .hub { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: clamp(40px, 6vw, 88px); align-items: center; }\r\n#shl-accueil .hub .btn { margin-top: 32px; }\r\n#shl-accueil .res { overflow: hidden; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .04), 0 40px 80px -44px rgba(22, 38, 44, .32); transition: opacity 1s var(--ease), transform 1.2s var(--ease); }\r\n#shl-accueil.js .res:not(.is-in) { opacity: 0; transform: translateY(24px); }\r\n#shl-accueil .res-stage { position: relative; margin: 10px 10px 0; padding: 64px clamp(16px, 6%, 48px) 36px; overflow: hidden; background: var(--canvas); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .res-stage::before { content: ''; position: absolute; inset: 0; background: radial-gradient(circle, #e1e7e2 1px, transparent 1.5px) 0 0 \/ 14px 14px; -webkit-mask-image: radial-gradient(closest-side, #000, transparent); mask-image: radial-gradient(closest-side, #000, transparent); pointer-events: none; }\r\n#shl-accueil .res-deck { position: relative; display: grid; max-width: 480px; margin: 0 auto; }\r\n#shl-accueil .res-card { --p: 0; grid-area: 1 \/ 1; position: relative; z-index: calc(10 - var(--p)); display: flex; flex-direction: column; min-width: 0; padding: 20px 22px 22px; border: 1px solid var(--line); border-radius: 16px; background: color-mix(in srgb, var(--k) 7%, #fff); box-shadow: 0 1px 2px rgba(22, 38, 44, .05), 0 22px 40px -26px rgba(22, 38, 44, .34); transform-origin: 50% 0; transform: translateY(calc(var(--p) * var(--gap, -16px))) scale(calc(1 - var(--p) * .05)); opacity: calc(1 - var(--p) * .16); transition: transform .9s var(--ease), opacity .9s var(--ease), background-color .9s var(--ease); }\r\n#shl-accueil .res-card.is-front { background: #fff; }\r\n#shl-accueil .res-card:not(.is-front) > * { visibility: hidden; }\r\n@media (hover: hover){#shl-accueil .res-stage:hover { --gap: -21px; }\r\n}#shl-accueil .res-card.is-out { z-index: 20; opacity: 0; transform: translateY(26px) scale(1.015); transition: transform .56s cubic-bezier(.4, 0, .2, 1), opacity .4s ease-in; }\r\n#shl-accueil .res-card.is-snap { opacity: 0; transition: none; }\r\n#shl-accueil .res-head, #shl-accueil .res-body { transition: opacity .38s var(--ease), filter .38s var(--ease); }\r\n#shl-accueil .res-body { transition-delay: .12s; }\r\n#shl-accueil.js .res.is-auto .res-card:not(.is-shown) > * { opacity: 0; filter: blur(3px); transition-duration: .16s; transition-delay: 0s; }\r\n#shl-accueil .res-head { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; column-gap: 16px; padding-bottom: 14px; border-bottom: 1px solid var(--line-2); }\r\n#shl-accueil .res-kind { grid-column: 1 \/ -1; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--kx); }\r\n#shl-accueil .res-title { margin-top: 6px; font-size: 18px; font-weight: 700; line-height: 1.25; letter-spacing: -.018em; color: var(--ink); }\r\n#shl-accueil .res-meta { padding-bottom: 2px; font-size: 12.5px; color: var(--muted); white-space: nowrap; }\r\n#shl-accueil .res-body { position: relative; flex: 1; margin-top: 18px; }\r\n#shl-accueil .par { display: flex; flex-direction: column; justify-content: center; }\r\n#shl-accueil .par-fig { position: relative; }\r\n#shl-accueil .par-art { width: 100%; height: auto; overflow: visible; color: var(--k); }\r\n#shl-accueil .par-floor { stroke: #dfe5e0; }\r\n#shl-accueil .par-drops path { stroke: #dfe5e0; stroke-dasharray: 2 3; transition: stroke .5s var(--ease); }\r\n#shl-accueil .par-drops path.is-on { stroke: color-mix(in srgb, var(--k) 50%, #fff); stroke-dasharray: none; }\r\n#shl-accueil .par-way { fill: none; stroke: #d3dbd6; stroke-width: 1.5; stroke-dasharray: 2 5; stroke-linecap: round; }\r\n#shl-accueil .par-trail { fill: none; stroke: var(--k); stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1 1; }\r\n#shl-accueil .par-nodes circle { fill: #fff; stroke: #cfd8d2; stroke-width: 1.5; transition: fill .45s var(--ease), stroke .45s var(--ease); }\r\n#shl-accueil .par-nodes circle.is-on { fill: var(--k); stroke: #fff; stroke-width: 2; }\r\n#shl-accueil .par-halo { fill: var(--k); opacity: .18; }\r\n#shl-accueil .par-dot { fill: var(--ink); stroke: #fff; stroke-width: 2.5; }\r\n#shl-accueil .par-axis { position: absolute; left: 0; top: 0; font-size: 11.5px; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .par-caps { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); margin-top: 10px; font-size: 12px; font-weight: 600; line-height: 1.3; text-align: center; color: var(--muted); }\r\n#shl-accueil .par-caps li { padding: 0 2px; transition: color .45s var(--ease); }\r\n#shl-accueil .par-caps b { display: block; margin-bottom: 2px; font: 500 11.5px\/1.3 var(--mono); color: var(--faint); transition: color .45s var(--ease); }\r\n#shl-accueil .par-caps li.is-on { color: var(--ink); }\r\n#shl-accueil .par-caps li.is-on b { color: var(--kx); }\r\n#shl-accueil .bud { display: grid; align-content: start; font-size: 13px; }\r\n#shl-accueil .bud-row { position: relative; display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) 78px; align-items: center; column-gap: 16px; height: 27px; }\r\n#shl-accueil .bud-row > span { overflow: hidden; font-weight: 500; white-space: nowrap; text-overflow: ellipsis; color: var(--ink-2); }\r\n#shl-accueil .bud-row > i { width: var(--w); height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--k) 72%, #fff); transform-origin: left; transition: transform .7s var(--ease); }\r\n#shl-accueil .bud-row > b { font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; color: var(--ink); transition: opacity .38s var(--ease), filter .38s var(--ease); }\r\n#shl-accueil .bud-th { height: 22px; }\r\n#shl-accueil .bud-th span { font-size: 11.5px; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .bud-th span:last-child { text-align: right; }\r\n#shl-accueil .bud-total { height: 32px; margin-top: 5px; border-top: 1px solid var(--line); }\r\n#shl-accueil .bud-total > span { font-weight: 700; color: var(--ink); }\r\n#shl-accueil .bud-total > b { font-size: 14px; color: var(--kx); }\r\n#shl-accueil .bud-total > i { visibility: hidden; }\r\n#shl-accueil .bud-hl { position: absolute; left: -10px; right: -10px; top: 0; height: 27px; border-radius: 7px; background: color-mix(in srgb, var(--k) 12%, #fff); opacity: 0; transition: transform .5s var(--ease), opacity .35s var(--ease); }\r\n#shl-accueil .bud.is-hl .bud-hl { opacity: 1; }\r\n#shl-accueil.js .res.is-auto .bud-row:not(.is-on) > b { opacity: 0; filter: blur(3px); }\r\n#shl-accueil.js .res.is-auto .bud-row:not(.is-on) > i { transform: scaleX(0); }\r\n#shl-accueil .vei { display: grid; align-content: start; gap: 2px; }\r\n#shl-accueil .vei li { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 14px; min-height: 44px; padding: 5px 12px; border: 1px solid transparent; border-radius: 10px; }\r\n#shl-accueil .vei li + li::before { content: ''; position: absolute; left: 12px; right: 12px; top: -2px; border-top: 1px solid var(--line-2); }\r\n#shl-accueil .vei span { min-width: 0; font-size: 13.5px; font-weight: 700; line-height: 1.25; color: var(--ink); }\r\n#shl-accueil .vei small { display: block; margin-top: 2px; overflow: hidden; font-size: 12px; font-weight: 500; white-space: nowrap; text-overflow: ellipsis; color: var(--muted); }\r\n#shl-accueil .vei em { font-size: 12px; font-style: normal; font-weight: 600; color: var(--muted); }\r\n#shl-accueil .vei .vei-new { background: color-mix(in srgb, var(--k) 8%, #fff); border-color: color-mix(in srgb, var(--k) 30%, #fff); transition: background .5s var(--ease), border-color .5s var(--ease); }\r\n#shl-accueil .vei-new em { font-weight: 700; color: var(--kx); }\r\n#shl-accueil .vei-new > * { transition: opacity .38s var(--ease) .3s, filter .38s var(--ease) .3s; }\r\n#shl-accueil .vei-new > em { transition-delay: .7s; }\r\n#shl-accueil.js .res.is-auto .vei:not(.is-played) .vei-new { background: transparent; border-color: #d5ddd8; border-style: dashed; }\r\n#shl-accueil.js .res.is-auto .vei:not(.is-played) .vei-new > * { opacity: 0; filter: blur(3px); transition-delay: 0s; }\r\n#shl-accueil .cad { display: grid; grid-template-columns: minmax(84px, 1.25fr) repeat(3, minmax(0, 1fr)); gap: 5px; align-content: start; }\r\n#shl-accueil .cad-th { overflow: hidden; padding: 0 2px 1px; font-size: 11.5px; font-weight: 600; white-space: nowrap; text-overflow: ellipsis; color: var(--muted); }\r\n#shl-accueil .cad-rh { display: flex; align-items: center; padding-right: 6px; font-size: 12px; font-weight: 600; line-height: 1.25; color: var(--ink-2); }\r\n#shl-accueil .cad-c { display: grid; align-content: center; gap: 6px; height: 38px; padding: 0 9px; background: #fff; border: 1px solid var(--line); border-radius: 7px; transition: background .6s var(--ease), border-color .6s var(--ease); }\r\n#shl-accueil .cad-c i { height: 4px; border-radius: 2px; background: #d7dfda; transform-origin: left; transition: transform .55s var(--ease), background .6s var(--ease); }\r\n#shl-accueil .cad-c i:last-child { width: 58%; }\r\n#shl-accueil .cad-c:nth-child(4n + 3) i:first-child { width: 84%; }\r\n#shl-accueil .cad-c:nth-child(3n) i:last-child { width: 40%; }\r\n#shl-accueil .cad-c.is-hl { background: color-mix(in srgb, var(--k) 11%, #fff); border-color: color-mix(in srgb, var(--k) 48%, #fff); }\r\n#shl-accueil .cad-c.is-hl i { background: color-mix(in srgb, var(--k) 75%, #fff); }\r\n#shl-accueil .cad-c i + i { transition-delay: .09s; }\r\n#shl-accueil.js .res.is-auto .cad-c:not(.is-on) i { transform: scaleX(0); }\r\n#shl-accueil .res-key { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px 26px; padding: 17px 20px 19px; font-size: 13px; font-weight: 600; line-height: 1.3; }\r\n#shl-accueil .res-key span { cursor: pointer; color: var(--muted); text-decoration: underline 2px transparent; text-underline-offset: 7px; transition: color .45s var(--ease), text-decoration-color .45s var(--ease); }\r\n#shl-accueil .res-key span.is-on { color: var(--kx); text-decoration-color: color-mix(in srgb, var(--k) 60%, #fff); }\r\n@media (hover: hover){#shl-accueil .res-key span:not(.is-on):hover { color: var(--ink); }\r\n}#shl-accueil .contact { padding: clamp(80px, 11vw, 144px) 0; border-top: 1px solid var(--line); }\r\n#shl-accueil .contact-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(40px, 6vw, 88px); align-items: start; }\r\n#shl-accueil .contact h2 { margin-top: 22px; font-size: clamp(30px, 3.6vw, 48px); line-height: 1.08; font-weight: 800; letter-spacing: -.032em; text-wrap: balance; }\r\n#shl-accueil .contact .sec-copy { margin-top: 22px; }\r\n#shl-accueil .person { display: flex; align-items: center; gap: 24px; max-width: 540px; margin-top: 36px; padding: 18px; background: var(--tint); border: 1px solid var(--line); border-radius: var(--r-lg); }\r\n#shl-accueil .person-photo { flex: none; width: 148px; height: 148px; border-radius: 14px; object-fit: cover; background: var(--sunk); box-shadow: 0 0 0 1px var(--line), var(--shadow-sm); }\r\n#shl-accueil .person b { display: block; font-size: 18px; font-weight: 700; }\r\n#shl-accueil .person > div > span { display: block; font-size: 13.5px; color: var(--muted); }\r\n#shl-accueil .person ul { display: grid; gap: 6px; margin-top: 12px; }\r\n#shl-accueil .person a { display: inline-flex; align-items: baseline; gap: 10px; font-size: 14.5px; font-weight: 600; transition: color .3s; }\r\n#shl-accueil .person a:hover { color: var(--accent); }\r\n#shl-accueil .person a i { width: 34px; font: 500 11.5px\/1 var(--mono); font-style: normal; color: var(--muted); }\r\n#shl-accueil .form { padding: clamp(24px, 3vw, 36px); background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: var(--shadow); }\r\n#shl-accueil .form h3 { font-size: 22px; font-weight: 700; letter-spacing: -.02em; }\r\n#shl-accueil .form > p { margin-top: 6px; font-size: 14px; color: var(--muted); }\r\n#shl-accueil .form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: 26px; }\r\n#shl-accueil .form-grid .full { grid-column: 1 \/ -1; }\r\n#shl-accueil .form label { display: block; margin-bottom: 7px; font-size: 13px; font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .form input, #shl-accueil .form select, #shl-accueil .form textarea { width: 100%; height: 46px; padding: 0 14px; background: var(--canvas); border: 1px solid var(--line); border-radius: 10px; transition: border-color .25s, box-shadow .25s, background-color .25s; }\r\n#shl-accueil .form textarea { height: 120px; padding: 12px 14px; resize: vertical; }\r\n#shl-accueil .form input:focus, #shl-accueil .form select:focus, #shl-accueil .form textarea:focus { outline: 0; background: #fff; border-color: var(--accent); box-shadow: 0 0 0 4px rgba(31, 74, 77, .1); }\r\n#shl-accueil .form .btn { margin-top: 22px; }\r\n#shl-accueil .form-note { min-height: 1em; margin-top: 12px; font-size: 13.5px; color: var(--accent); }\r\n#shl-accueil .footer { position: relative; padding: 64px 0 32px; background: var(--tint); }\r\n#shl-accueil .footer::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--spectrum); }\r\n#shl-accueil .footer-grid { display: grid; grid-template-columns: 1.6fr 1fr 1fr 1.2fr; gap: 40px; }\r\n#shl-accueil .footer-about { max-width: 380px; margin-top: 20px; font-size: 14px; line-height: 1.65; color: var(--muted); }\r\n#shl-accueil .footer-grid > :nth-child(2) h4 { color: var(--x7); }\r\n#shl-accueil .footer-grid > :nth-child(3) h4 { color: var(--x5); }\r\n#shl-accueil .footer-grid > :nth-child(4) h4 { color: var(--x1); }\r\n#shl-accueil .footer ul { display: grid; gap: 10px; margin-top: 18px; }\r\n#shl-accueil .footer li { font-size: 14.5px; font-weight: 600; color: var(--ink-2); }\r\n#shl-accueil .footer ul a { font-size: 14.5px; font-weight: 600; color: var(--ink-2); transition: color .3s; }\r\n#shl-accueil .footer ul a:hover, #shl-accueil .footer-bottom a:hover { color: var(--ink); }\r\n#shl-accueil .footer-bottom { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 12px; margin-top: 56px; padding-top: 24px; border-top: 1px solid var(--line); font-size: 13px; color: var(--muted); }\r\n#shl-accueil .lang { display: inline-flex; align-items: center; font-size: 13.5px; font-weight: 700; letter-spacing: .02em; }\r\n#shl-accueil .lang a { padding: 6px 8px; color: var(--faint); transition: color .25s; }\r\n#shl-accueil .lang a + a { border-left: 1px solid var(--line); }\r\n#shl-accueil .lang a:hover { color: var(--ink-2); }\r\n#shl-accueil .lang a[aria-current] { color: var(--ink); }\r\n#shl-accueil .lang-m { display: none; }\r\n#shl-accueil .lang-foot { font-size: inherit; font-weight: 600; letter-spacing: 0; }\r\n#shl-accueil .lang-foot a { padding: 0 8px; }\r\n#shl-accueil .lang-foot a:first-child { padding-left: 0; }\r\n#shl-accueil .vids { display: grid; grid-template-columns: minmax(0, 1.75fr) minmax(0, 1fr); gap: 20px; align-items: stretch; }\r\n#shl-accueil .vid-frame { position: relative; isolation: isolate; aspect-ratio: 16 \/ 9; overflow: hidden; border-radius: var(--r-xl); background: var(--ink); color: #fff; box-shadow: 0 30px 60px -32px rgba(22, 38, 44, .55); }\r\n#shl-accueil .vid-poster { position: absolute; inset: 0; z-index: -1; width: 100%; height: 100%; object-fit: cover; transition: transform 1.2s var(--ease), opacity .4s; }\r\n#shl-accueil .vid-frame::after { content: ''; position: absolute; inset: 0; z-index: -1; background: linear-gradient(180deg, rgba(23, 53, 64, 0) 45%, rgba(23, 53, 64, .82)); pointer-events: none; }\r\n#shl-accueil .vid-frame:hover .vid-poster { transform: scale(1.025); }\r\n#shl-accueil .vid-cap { position: absolute; left: 0; right: 0; bottom: 0; padding: clamp(20px, 2.6vw, 32px); }\r\n#shl-accueil .vid-kicker { display: flex; gap: 12px; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: rgba(255, 255, 255, .78); }\r\n#shl-accueil .vid-title { margin-top: 8px; font-size: clamp(22px, 2.3vw, 32px); font-weight: 800; line-height: 1.1; letter-spacing: -.025em; }\r\n#shl-accueil .vid-sub { margin-top: 6px; font-size: 15px; font-weight: 600; color: rgba(255, 255, 255, .82); }\r\n#shl-accueil .vid-play { position: absolute; top: 50%; left: 50%; display: grid; place-items: center; width: 84px; height: 84px; padding: 0; border: 0; border-radius: 50%; background: rgba(255, 255, 255, .95); color: var(--ink); cursor: pointer; translate: -50% -60%; box-shadow: 0 0 0 12px rgba(255, 255, 255, .16), 0 18px 40px -14px rgba(0, 0, 0, .55); transition: transform .5s var(--ease), box-shadow .5s var(--ease); }\r\n#shl-accueil .vid-play svg { width: 30px; height: 30px; margin-left: 4px; fill: currentColor; }\r\n#shl-accueil .vid-frame:hover .vid-play { transform: scale(1.06); box-shadow: 0 0 0 18px rgba(255, 255, 255, .12), 0 18px 40px -14px rgba(0, 0, 0, .55); }\r\n#shl-accueil .vid-frame iframe { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; border: 0; background: #000; }\r\n#shl-accueil .vid-frame.is-playing :is(.vid-cap, .vid-play) { opacity: 0; pointer-events: none; }\r\n#shl-accueil .vid-side { position: relative; display: flex; flex-direction: column; min-height: 0; }\r\n#shl-accueil .vid-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 0 4px 12px; font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }\r\n#shl-accueil .vid-head a { font: 700 13.5px\/1.3 var(--font); letter-spacing: 0; text-transform: none; color: var(--accent); }\r\n#shl-accueil .vid-head a:hover { color: var(--ink); }\r\n#shl-accueil .vid-list { position: absolute; top: 36px; left: 0; right: 0; bottom: 0; display: grid; align-content: start; gap: 4px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; scrollbar-color: #c5d0ca transparent; -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 30px), transparent); mask-image: linear-gradient(180deg, #000 calc(100% - 30px), transparent); padding-bottom: 24px; }\r\n#shl-accueil .vid-item { display: grid; grid-template-columns: 128px minmax(0, 1fr); align-items: center; gap: 14px; width: 100%; padding: 8px; border: 0; border-radius: 14px; background: none; font: inherit; text-align: left; color: var(--ink); cursor: pointer; transition: background-color .25s; }\r\n#shl-accueil .vid-item:hover, #shl-accueil .vid-item:focus-visible { background: var(--tint); }\r\n#shl-accueil .vid-item.is-on { background: color-mix(in srgb, var(--c) 10%, #fff); }\r\n#shl-accueil .vid-thumb { position: relative; overflow: hidden; aspect-ratio: 16 \/ 9; border-radius: 10px; background: var(--sunk); }\r\n#shl-accueil .vid-thumb img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease); }\r\n#shl-accueil .vid-item:hover .vid-thumb img { transform: scale(1.05); }\r\n#shl-accueil .vid-item.is-on .vid-thumb { box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--c); }\r\n#shl-accueil .vid-dur { position: absolute; right: 6px; bottom: 6px; padding: 2px 6px; border-radius: 6px; background: rgba(23, 53, 64, .86); color: #fff; font-size: 11.5px; font-weight: 700; line-height: 1.3; }\r\n#shl-accueil .vid-meta b { display: block; font-size: 14.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.01em; }\r\n#shl-accueil .vid-meta span { display: block; margin-top: 3px; font-size: 12.5px; line-height: 1.4; color: var(--muted); }\r\n#shl-accueil .vid-item.is-on .vid-meta b { color: color-mix(in srgb, var(--c) 70%, var(--ink)); }\r\n#shl-accueil .public { --h: var(--x9); }\r\n#shl-accueil .pub-head { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; max-width: 880px; margin-bottom: clamp(36px, 4.5vw, 52px); }\r\n#shl-accueil .pub-points { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .pub-point { display: flex; flex-direction: column; padding: 26px 26px 28px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .03); }\r\n#shl-accueil .pub-point h3 { margin-top: 18px; font-size: 19px; font-weight: 800; letter-spacing: -.02em; }\r\n#shl-accueil .pub-point h3 + p { margin-top: 12px; font-size: 15px; line-height: 1.65; color: var(--ink-2); }\r\n#shl-accueil .pub-sum { display: flex; align-items: center; gap: 18px; max-width: 900px; margin: clamp(28px, 3.5vw, 40px) 0 clamp(56px, 7vw, 88px); font-size: clamp(18px, 1.6vw, 21px); font-weight: 700; line-height: 1.4; letter-spacing: -.015em; color: var(--ink); text-wrap: balance; }\r\n#shl-accueil .pub-sum::before { content: ''; flex: none; width: 40px; height: 3px; border-radius: 2px; background: var(--spectrum); }\r\n#shl-accueil .pub-label, #shl-accueil .team-sub { font: 500 11.5px\/1.3 var(--mono); letter-spacing: .1em; text-transform: uppercase; }\r\n#shl-accueil .pub-label { margin-bottom: 18px; color: var(--muted); }\r\n#shl-accueil .pub-label-2 { margin-top: clamp(56px, 7vw, 88px); }\r\n#shl-accueil .pub-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .pub-card { display: flex; flex-direction: column; min-width: 0; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .04); }\r\n#shl-accueil .pub-logo { display: flex; align-items: center; justify-content: center; gap: clamp(18px, 2vw, 28px); height: 164px; margin: 10px 10px 0; padding: 0 22px; background: radial-gradient(closest-side, #fff, var(--canvas)); border: 1px solid var(--line-2); border-radius: 14px; }\r\n#shl-accueil .pub-logo img { flex: 0 1 auto; min-width: 0; width: var(--w); height: auto; mix-blend-mode: multiply; }\r\n#shl-accueil .pub-and { flex: none; width: 1px; height: 56px; background: var(--line); }\r\n#shl-accueil .pub-logo:not(:has(img:not(.is-missing))) .pub-and { display: none; }\r\n#shl-accueil .pub-body { padding: 22px 26px 28px; }\r\n#shl-accueil .pub-card h3 { margin-top: 12px; font-size: 19px; font-weight: 700; line-height: 1.25; letter-spacing: -.02em; text-wrap: balance; }\r\n#shl-accueil .pub-body > p:last-child { margin-top: 10px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .pub-anct { display: flex; align-items: center; gap: clamp(18px, 2.4vw, 28px); margin-top: 16px; padding: 10px clamp(18px, 2.4vw, 28px) 10px 10px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .pub-anct-logo { flex: none; display: grid; place-items: center; width: 176px; height: 76px; background: radial-gradient(closest-side, #fff, var(--canvas)); border: 1px solid var(--line-2); border-radius: 12px; }\r\n#shl-accueil .pub-anct-logo img { width: 124px; height: auto; mix-blend-mode: multiply; }\r\n#shl-accueil .pub-anct p { max-width: 760px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .pub-bento { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .sc-cal, #shl-accueil .sc-kpi { container-type: inline-size; }\r\n#shl-accueil .cal { --n: 6; --t: calc(var(--p, 1) * var(--n)); display: grid; grid-template-columns: max-content minmax(0, 1fr); grid-template-rows: auto repeat(4, minmax(24px, auto)) auto; gap: 14px 18px; align-items: center; width: 100%; max-width: 540px; }\r\n#shl-accueil .cal-months { grid-column: 2; grid-row: 1; display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); font-size: 11.5px; font-weight: 600; color: var(--faint); }\r\n#shl-accueil .cal-months span { padding-left: 6px; }\r\n#shl-accueil .cal-grid { grid-column: 2; grid-row: 1 \/ 6; align-self: stretch; margin: -4px 0 -6px; background: linear-gradient(90deg, var(--line) 1px, transparent 1px) 0 0 \/ calc(100% \/ var(--n)) 100%; }\r\n#shl-accueil .cal-lab { grid-column: 1; grid-row: var(--r); font-size: 12.5px; font-weight: 600; line-height: 1.25; color: var(--ink-2); white-space: nowrap; }\r\n#shl-accueil .cal-lane { position: relative; grid-column: 2; grid-row: var(--r); align-self: stretch; transition: opacity .5s var(--ease); }\r\n#shl-accueil .cal-lane i { --on: clamp(0, calc((var(--t) - var(--a)) * 4), 1); position: absolute; top: 50%; left: calc(var(--a) \/ var(--n) * 100%); opacity: var(--on); }\r\n#shl-accueil .cal-bar { width: calc((var(--b) - var(--a)) \/ var(--n) * 100%); height: 12px; margin-top: -6px; border-radius: 6px; background: var(--c); clip-path: inset(0 calc(100% - clamp(0, calc((var(--t) - var(--a)) \/ (var(--b) - var(--a))), 1) * 100%) 0 0 round 6px); }\r\n#shl-accueil .cal-bar.is-res { height: 8px; margin-top: -4px; background: color-mix(in srgb, var(--c) 34%, #fff); }\r\n#shl-accueil .cal-pill { width: calc(.34 \/ var(--n) * 100%); height: 14px; margin-top: -7px; border-radius: 7px; background: var(--c); transform: scale(calc(.5 + .5 * var(--on))); }\r\n#shl-accueil .cal-dot { width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px; border-radius: 50%; background: color-mix(in srgb, var(--c) 72%, var(--ink)); transform: scale(calc(.3 + .7 * var(--on))); }\r\n#shl-accueil .cal-head { position: relative; left: calc(var(--p, 1) * 100%); grid-column: 2; grid-row: 2 \/ 6; align-self: stretch; justify-self: start; width: 0; margin: -6px 0 -6px -.75px; border-left: 1.5px solid var(--ink); transition: opacity .4s var(--ease); }\r\n#shl-accueil .cal-head::before { content: ''; position: absolute; top: -4px; left: -4.75px; width: 8px; height: 8px; border-radius: 50%; background: var(--ink); }\r\n#shl-accueil .cal-end { grid-column: 2; grid-row: 2 \/ 6; justify-self: end; align-self: stretch; margin: -6px 0; border-right: 1.5px dashed #b8c4c2; }\r\n#shl-accueil .cal-dep { grid-column: 2; grid-row: 6; justify-self: end; display: flex; align-items: center; gap: 8px; margin-right: -4.5px; font-size: 12.5px; font-weight: 700; color: var(--ink); opacity: 0; filter: blur(4px); transition: opacity .38s var(--ease), filter .38s var(--ease); }\r\n#shl-accueil .cal-dep::after { content: ''; width: 9px; height: 9px; border-radius: 50%; background: var(--ink); }\r\n#shl-accueil .sc-cal.is-end .cal-head { opacity: 0; }\r\n#shl-accueil .sc-cal.is-end .cal-dep { opacity: 1; filter: none; }\r\n#shl-accueil .sc-cal.is-out .cal-lane, #shl-accueil .sc-cal.is-out .cal-dep { opacity: 0; }\r\n@container (max-width: 440px){#shl-accueil .cal { column-gap: 12px; }\r\n#shl-accueil .cal-lab { max-width: 84px; font-size: 11.5px; white-space: normal; }\r\n#shl-accueil .cal-months span { padding-left: 4px; font-size: 0; }\r\n#shl-accueil .cal-months span::before { content: attr(data-s); font-size: 11.5px; }\r\n#shl-accueil .cal-dot { width: 7px; height: 7px; margin: -3.5px 0 0 -3.5px; }\r\n}#shl-accueil .kpi { display: grid; justify-items: center; gap: 30px; width: 100%; }\r\n#shl-accueil .kpi-grid { --d: 18px; display: grid; grid-template-columns: repeat(10, var(--d)); gap: 13px; }\r\n#shl-accueil .kpi-grid i { position: relative; width: var(--d); height: var(--d); border-radius: 50%; background: #fff; box-shadow: inset 0 0 0 1.5px #b8c4c2; opacity: 0; transform: scale(.4); transition: opacity .45s var(--ease), transform .45s var(--ease), background-color .5s var(--ease), box-shadow .5s var(--ease); transition-delay: calc(var(--i) * 22ms); }\r\n#shl-accueil .kpi-grid i::after { content: ''; position: absolute; top: 34%; left: 30%; width: 38%; height: 19%; border-bottom: 1.8px solid #fff; border-left: 1.8px solid #fff; opacity: 0; transform: rotate(-45deg) scale(.4); transition: opacity .3s, transform .4s var(--ease); transition-delay: inherit; }\r\n#shl-accueil .kpi.is-cand i { opacity: 1; transform: none; }\r\n#shl-accueil .kpi.is-sel i:not(.is-in) { opacity: .6; transform: scale(.72); }\r\n#shl-accueil .kpi.is-dep i.is-in { background: color-mix(in srgb, var(--c) 42%, #fff); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--c) 42%, #fff); transition-delay: calc(var(--j) * 16ms); }\r\n#shl-accueil .kpi.is-fin i.is-ok { background: var(--c); box-shadow: inset 0 0 0 1.5px var(--c); }\r\n#shl-accueil .kpi.is-fin i.is-ok::after { opacity: 1; transform: rotate(-45deg); }\r\n#shl-accueil .kpi.is-out i { opacity: 0; transition-delay: 0s; }\r\n#shl-accueil .kpi-key { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px 22px; font-size: 12.5px; font-weight: 600; color: var(--faint); }\r\n#shl-accueil .kpi-key li { display: inline-flex; align-items: center; gap: 8px; transition: color .38s var(--ease); }\r\n#shl-accueil .kpi-key li.is-on { color: var(--ink-2); }\r\n#shl-accueil .kpi-key i { flex: none; width: 11px; height: 11px; border-radius: 50%; }\r\n#shl-accueil .k-cand { box-shadow: inset 0 0 0 1.5px #b8c4c2; }\r\n#shl-accueil .k-dep { background: color-mix(in srgb, var(--c) 42%, #fff); }\r\n#shl-accueil .k-fin { background: var(--c); }\r\n@container (max-width: 340px){#shl-accueil .kpi-grid { --d: 15px; gap: 10px; }\r\n}#shl-accueil .pub-formats-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr); gap: 14px 48px; align-items: end; margin: clamp(56px, 7vw, 88px) 0 24px; }\r\n#shl-accueil .pub-formats-head h3 { font-size: clamp(24px, 2.4vw, 32px); font-weight: 800; line-height: 1.1; letter-spacing: -.028em; }\r\n#shl-accueil .pub-formats-head p { font-size: 15.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .team { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }\r\n#shl-accueil .mate { display: flex; flex-direction: column; padding: 26px 26px 28px; background: #fff; border: 1px solid var(--line); border-radius: var(--r-xl); box-shadow: 0 1px 2px rgba(22, 38, 44, .03); }\r\n#shl-accueil .mate h3 { margin-top: 18px; font-size: 19px; font-weight: 800; letter-spacing: -.02em; }\r\n#shl-accueil .mate-role { margin-top: 4px; font-size: 13.5px; font-weight: 700; color: var(--cx); }\r\n#shl-accueil .mate p:last-child { margin-top: 12px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }\r\n#shl-accueil .team-sub { margin: 40px 0 16px; color: var(--muted); }\r\n#shl-accueil .team-assoc { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .team-assoc .mate { background: var(--tint); }\r\n#shl-accueil .team-note { display: flex; flex-direction: column; justify-content: space-between; gap: 28px; padding: 26px 26px 28px; background: var(--tint); border: 1px solid var(--line); border-radius: var(--r-xl); }\r\n#shl-accueil .team-note::before { content: ''; width: 40px; height: 3px; border-radius: 2px; background: var(--spectrum); }\r\n#shl-accueil .team-note p { font-size: 21px; font-weight: 700; line-height: 1.35; letter-spacing: -.02em; color: var(--ink); text-wrap: balance; }\r\n#shl-accueil .team-mark { display: grid; place-items: center; flex: none; width: 76px; height: 76px; padding: 12px; background: #fff; border: 1px solid var(--line); border-radius: 50%; }\r\n#shl-accueil .team-mark img { width: 100%; height: auto; }\r\n@media (max-width: 1320px){#shl-accueil .header-row { gap: 18px; }\r\n#shl-accueil .main-nav a { padding-inline: 9px; }\r\n#shl-accueil .header-actions { gap: 18px; }\r\n}@media (max-width: 1180px){#shl-accueil .main-nav, #shl-accueil .header-actions { display: none; }\r\n#shl-accueil .menu-toggle { display: inline-flex; }\r\n#shl-accueil .lang-m { display: inline-flex; margin-left: auto; }\r\n#shl-accueil .lang-m + .menu-toggle { margin-left: 6px; }\r\n}@media (max-width: 1060px){#shl-accueil .method, #shl-accueil .hub, #shl-accueil .contact-grid { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-head, #shl-accueil .pub-formats-head { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-points { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-cards { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; }\r\n#shl-accueil .pub-logo { align-self: stretch; height: auto; min-height: 150px; margin: 10px; }\r\n#shl-accueil .team { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .vids { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .vid-list { position: static; display: flex; gap: 10px; overflow-x: auto; overflow-y: hidden; scroll-snap-type: x mandatory; margin-inline: calc(-1 * var(--gut)); padding: 2px var(--gut) 8px; scroll-padding-inline: var(--gut); -webkit-mask-image: none; mask-image: none; }\r\n#shl-accueil .vid-list li { flex: 0 0 min(240px, 62%); scroll-snap-align: start; }\r\n#shl-accueil .vid-item { grid-template-columns: minmax(0, 1fr); gap: 10px; padding: 6px; }\r\n#shl-accueil .atlas-over { grid-template-columns: minmax(0, 1fr); min-height: 0; gap: 0; padding: clamp(56px, 9vw, 80px) 0 clamp(44px, 7vw, 64px); }\r\n#shl-accueil .atlas-over > .atlas-canvas { position: relative; inset: auto; height: clamp(340px, 78vw, 620px); margin: 12px calc(-1 * var(--gut)) 4px; }\r\n#shl-accueil .atlas-over > .map-key { position: static; justify-content: flex-start; margin-top: 18px; }\r\n#shl-accueil .terr { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .terr-map { order: -1; }\r\n#shl-accueil .terr-stage { min-height: clamp(360px, 70vw, 520px); }\r\n#shl-accueil .hero-foot { flex-direction: column; align-items: flex-start; }\r\n#shl-accueil .sec-head, #shl-accueil .ident-text, #shl-accueil .ident-body { grid-template-columns: minmax(0, 1fr); align-items: start; }\r\n#shl-accueil .figures { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .method-sticky { position: static; }\r\n#shl-accueil .rail { display: none; }\r\n#shl-accueil .method.is-live .step { opacity: 1; }\r\n#shl-accueil .project { flex-basis: calc((100% - 20px) \/ 2); }\r\n#shl-accueil .studio-body { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .fmt-panel h3 + p { max-width: 560px; }\r\n#shl-accueil .stage-col { padding-top: 0; }\r\n#shl-accueil .stage { min-height: 360px; }\r\n#shl-accueil .quotes { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .quote.feature { grid-column: 1 \/ -1; }\r\n#shl-accueil .footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n}@media (max-width: 1060px){#shl-accueil .bento { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .bc { display: grid; grid-row: auto; grid-template-rows: none; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; }\r\n#shl-accueil .bc-stage { margin: 10px; }\r\n}@media (max-width: 720px){#shl-accueil .team, #shl-accueil .team-assoc { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .pub-card { display: flex; align-items: stretch; }\r\n#shl-accueil .pub-logo { align-self: auto; height: 140px; min-height: 0; margin: 10px 10px 0; }\r\n#shl-accueil .pub-body { padding: 20px 20px 24px; }\r\n#shl-accueil .pub-anct { flex-direction: column; align-items: stretch; padding: 10px 10px 20px; }\r\n#shl-accueil .pub-anct-logo { width: auto; }\r\n#shl-accueil .pub-anct p { padding: 0 10px; }\r\n#shl-accueil .vid-play { width: 64px; height: 64px; }\r\n#shl-accueil .vid-play svg { width: 24px; height: 24px; }\r\n#shl-accueil .vid-sub { display: none; }\r\n#shl-accueil .hero .eyebrow::before { display: none; }\r\n#shl-accueil .hero-banks { grid-template-columns: minmax(0, 1fr); gap: 2px; margin-top: 12px; }\r\n#shl-accueil .hero-banks > span:nth-child(n) { max-width: none; margin-inline: auto; font-size: clamp(19px, 5.4vw, 24px); text-align: center; }\r\n#shl-accueil h1 { text-wrap: balance; }\r\n#shl-accueil .brand { --mh: 28px; }\r\n#shl-accueil .hero-sky { aspect-ratio: 4 \/ 1; }\r\n#shl-accueil h1 .line { display: inline; overflow: visible; padding: 0; margin: 0; }\r\n#shl-accueil.js h1 .line > span { display: inline; transform: none; }\r\n#shl-accueil h1 .line + .line::before { content: ' '; }\r\n#shl-accueil .fields, #shl-accueil .projects, #shl-accueil .quotes, #shl-accueil .form-grid, #shl-accueil .footer-grid { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .project { flex-basis: 100%; }\r\n#shl-accueil .studio-tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .fmt-tab { padding: 14px 14px 20px; }\r\n#shl-accueil .fmt-name { margin-top: 12px; font-size: 15px; }\r\n#shl-accueil .fmt-meta { font-size: 12.5px; }\r\n#shl-accueil .fmt-panel { padding: 26px 22px; }\r\n#shl-accueil .fmt-specs { padding-top: 24px; }\r\n#shl-accueil .fmt-specs div { grid-template-columns: 64px minmax(0, 1fr) auto; gap: 12px; }\r\n#shl-accueil .stage { min-height: 290px; }\r\n#shl-accueil .stage-fig { display: none; }\r\n#shl-accueil .stage-key { gap: 6px 16px; }\r\n#shl-accueil .cta-threads { width: 100%; opacity: .5; }\r\n#shl-accueil .formats-cta .btn { width: 100%; justify-content: center; }\r\n#shl-accueil .partners, #shl-accueil .kinds { grid-template-columns: minmax(0, 1fr); gap: 16px; }\r\n#shl-accueil .logos { --gap: 44px; }\r\n#shl-accueil .logos img { height: calc(var(--lh, 36px) * .82); }\r\n#shl-accueil .res-stage { padding: 52px 12px 26px; }\r\n#shl-accueil .res-card { padding: 17px 16px 18px; }\r\n#shl-accueil .res-meta, #shl-accueil .bud-row > i, #shl-accueil .bud-th span:nth-child(2) { display: none; }\r\n#shl-accueil .bud-row { grid-template-columns: minmax(0, 1fr) auto; }\r\n#shl-accueil .cad { grid-template-columns: minmax(84px, 1.2fr) repeat(2, minmax(0, 1fr)); }\r\n#shl-accueil .cad > :nth-child(4n) { display: none; }\r\n#shl-accueil .res-key { gap: 8px 18px; padding-inline: 14px; }\r\n#shl-accueil .step, #shl-accueil .quote { padding: 24px; }\r\n#shl-accueil .field { grid-template-columns: minmax(0, 1fr); padding: 22px 22px 24px; }\r\n#shl-accueil .field-icon { display: none; }\r\n#shl-accueil .terr-stage { min-height: 440px; }\r\n#shl-accueil .drom { left: 10px; right: 10px; top: auto; bottom: 10px; width: auto; height: 84px; grid-template-rows: none; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 6px; }\r\n#shl-accueil .drom li { padding-bottom: 6px; font: 600 10.5px\/1 var(--font); white-space: nowrap; }\r\n#shl-accueil .duo-home { left: max(60px, 20%); width: 104px; height: 62px; --iw: 84px; --ih: 36px; }\r\n#shl-accueil .duo-node { width: 44px; height: 44px; }\r\n#shl-accueil .duo-node.is-sm { width: 36px; height: 36px; }\r\n#shl-accueil .bento { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .bc { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .bc-head { padding: 22px 20px 26px; }\r\n#shl-accueil .bc-stage { min-height: 268px; margin: 10px 10px 0; }\r\n#shl-accueil .tools { grid-template-columns: minmax(0, 1fr); }\r\n#shl-accueil .person { flex-direction: column; align-items: flex-start; }\r\n#shl-accueil .person-photo { width: 120px; height: 120px; }\r\n}@media (prefers-reduced-motion: reduce){html:has(#shl-accueil) { scroll-behavior: auto; }\r\n#shl-accueil *, #shl-accueil *::before, #shl-accueil *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; transition-delay: 0s !important; }\r\n#shl-accueil .logos { -webkit-mask-image: none; mask-image: none; }\r\n#shl-accueil .logos-set { animation: none; flex-wrap: wrap; justify-content: space-between; gap: 20px 36px; min-width: 0; width: 100%; }\r\n#shl-accueil .logos-set + .logos-set { display: none; }\r\n#shl-accueil .ros.is-loop .ros-track { animation-duration: var(--dur, 64s) !important; animation-iteration-count: infinite !important; }\r\n}<\/style>\r\n<div id=\"shl-accueil\">\r\n<script>document.getElementById('shl-accueil').classList.add('js')<\/script>\r\n<script>\r\n<!--\r\nif (\/[?&]lang=en(?:&|$)\/.test(location.search)) document.head.insertAdjacentHTML('beforeend', '<style id=\"lang-hold\">.site-header, #main, .footer { visibility: hidden; }<\/style>');\r\n\/\/-->\r\n<\/script>\r\n<div class=\"intro\" data-intro aria-hidden=\"true\"><canvas><\/canvas><\/div>\r\n<svg class=\"sprite\" width=\"0\" height=\"0\" aria-hidden=\"true\" focusable=\"false\"><defs><symbol id=\"fl-pt\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#da291c\"\/><rect width=\"14.4\" height=\"36\" fill=\"#046a38\"\/><circle cx=\"14.4\" cy=\"18\" r=\"6.2\" fill=\"none\" stroke=\"#ffe900\" stroke-width=\"2.2\"\/><path d=\"M11.8 14.8h5.2v4.4a2.6 2.6 0 0 1-5.2 0z\" fill=\"#da291c\" stroke=\"#fff\"\/><\/symbol><symbol id=\"fl-es\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#aa151b\"\/><rect y=\"9\" width=\"36\" height=\"18\" fill=\"#f1bf00\"\/><\/symbol><symbol id=\"fl-eu\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#003399\"\/><path d=\"M27.40 16.15L27.84 17.39L29.16 17.43L28.11 18.23L28.49 19.50L27.40 18.75L26.31 19.50L26.69 18.23L25.64 17.43L26.96 17.39ZM26.14 20.85L26.58 22.09L27.90 22.13L26.85 22.93L27.23 24.20L26.14 23.45L25.05 24.20L25.43 22.93L24.38 22.13L25.70 22.09ZM22.70 24.29L23.14 25.53L24.46 25.57L23.41 26.37L23.79 27.64L22.70 26.89L21.61 27.64L21.99 26.37L20.94 25.57L22.26 25.53ZM18.00 25.55L18.44 26.79L19.76 26.83L18.71 27.63L19.09 28.90L18.00 28.15L16.91 28.90L17.29 27.63L16.24 26.83L17.56 26.79ZM13.30 24.29L13.74 25.53L15.06 25.57L14.01 26.37L14.39 27.64L13.30 26.89L12.21 27.64L12.59 26.37L11.54 25.57L12.86 25.53ZM9.86 20.85L10.30 22.09L11.62 22.13L10.57 22.93L10.95 24.20L9.86 23.45L8.77 24.20L9.15 22.93L8.10 22.13L9.42 22.09ZM8.60 16.15L9.04 17.39L10.36 17.43L9.31 18.23L9.69 19.50L8.60 18.75L7.51 19.50L7.89 18.23L6.84 17.43L8.16 17.39ZM9.86 11.45L10.30 12.69L11.62 12.73L10.57 13.53L10.95 14.80L9.86 14.05L8.77 14.80L9.15 13.53L8.10 12.73L9.42 12.69ZM13.30 8.01L13.74 9.25L15.06 9.29L14.01 10.09L14.39 11.36L13.30 10.61L12.21 11.36L12.59 10.09L11.54 9.29L12.86 9.25ZM18.00 6.75L18.44 7.99L19.76 8.03L18.71 8.83L19.09 10.10L18.00 9.35L16.91 10.10L17.29 8.83L16.24 8.03L17.56 7.99ZM22.70 8.01L23.14 9.25L24.46 9.29L23.41 10.09L23.79 11.36L22.70 10.61L21.61 11.36L21.99 10.09L20.94 9.29L22.26 9.25ZM26.14 11.45L26.58 12.69L27.90 12.73L26.85 13.53L27.23 14.80L26.14 14.05L25.05 14.80L25.43 13.53L24.38 12.73L25.70 12.69Z\" fill=\"#ffcc00\"\/><\/symbol><symbol id=\"fl-dk\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#c8102e\"\/><path d=\"M11 0h5v36h-5zM0 15.5h36v5H0z\" fill=\"#fff\"\/><\/symbol><symbol id=\"fl-fr\" viewbox=\"0 0 3 2\"><rect width=\"3\" height=\"2\" fill=\"#e1000f\"\/><rect width=\"2\" height=\"2\" fill=\"#fff\"\/><rect width=\"1\" height=\"2\" fill=\"#000091\"\/><\/symbol><symbol id=\"fl-be\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ef3340\"\/><rect width=\"24\" height=\"36\" fill=\"#fdda24\"\/><rect width=\"12\" height=\"36\" fill=\"#1d1d1b\"\/><\/symbol><symbol id=\"fl-it\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ce2b37\"\/><rect width=\"24\" height=\"36\" fill=\"#fff\"\/><rect width=\"12\" height=\"36\" fill=\"#009246\"\/><\/symbol><symbol id=\"fl-ie\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ff883e\"\/><rect width=\"24\" height=\"36\" fill=\"#fff\"\/><rect width=\"12\" height=\"36\" fill=\"#169b62\"\/><\/symbol><symbol id=\"fl-ro\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#ce1126\"\/><rect width=\"24\" height=\"36\" fill=\"#fcd116\"\/><rect width=\"12\" height=\"36\" fill=\"#002b7f\"\/><\/symbol><symbol id=\"fl-se\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#006aa7\"\/><path d=\"M11 0h5v36h-5zM0 15.5h36v5H0z\" fill=\"#fecc00\"\/><\/symbol><symbol id=\"fl-pl\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#dc143c\"\/><rect width=\"36\" height=\"18\" fill=\"#fff\"\/><\/symbol><symbol id=\"fl-gr\" viewbox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" fill=\"#0d5eaf\"\/><path d=\"M0 4h36v4H0zM0 12h36v4H0zM0 20h36v4H0zM0 28h36v4H0z\" fill=\"#fff\"\/><rect width=\"20\" height=\"20\" fill=\"#0d5eaf\"\/><path d=\"M8 0h4v20H8zM0 8h20v4H0z\" fill=\"#fff\"\/><\/symbol><symbol id=\"ic-pub\" viewbox=\"0 0 24 24\"><path d=\"M3 22h18M6 18v-7M10 18v-7M14 18v-7M18 18v-7M12 2l8 5H4z\"\/><\/symbol><symbol id=\"ic-heart\" viewbox=\"0 0 24 24\"><path d=\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\"\/><\/symbol><symbol id=\"ic-compass\" viewbox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"m16.24 7.76-2.12 6.36-6.36 2.12 2.12-6.36z\"\/><\/symbol><symbol id=\"ic-tool\" viewbox=\"0 0 24 24\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"\/><\/symbol><symbol id=\"ic-read\" viewbox=\"0 0 24 24\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"\/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"\/><path d=\"M10 9H8M16 13H8M16 17H8\"\/><\/symbol><symbol id=\"ic-shield\" viewbox=\"0 0 24 24\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"\/><path d=\"m9 12 2 2 4-4\"\/><\/symbol><symbol id=\"ic-users\" viewbox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"\/><circle cx=\"9\" cy=\"7\" r=\"4\"\/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75\"\/><\/symbol><symbol id=\"ic-check\" viewbox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"\/><\/symbol><\/defs><\/svg>\r\n<a class=\"skip\" href=\"#main\">Aller au contenu<\/a>\r\n<header class=\"site-header\" data-header>\r\n  <div class=\"wrap header-row\">\r\n    <a class=\"brand\" href=\"#top\" aria-label=\"Social Hackers Lab, accueil\">\r\n      <span class=\"brand-mark\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"124\" height=\"124\"><\/span>\r\n    <\/a>\r\n    <nav class=\"main-nav\" aria-label=\"Navigation principale\">\r\n      <span class=\"nav-thumb\" aria-hidden=\"true\"><\/span>\r\n      <a href=\"#approche\" style=\"--c:var(--x1)\">Approche<\/a>\r\n      <a href=\"#territoires\" style=\"--c:var(--x8)\">Territoires<\/a>\r\n      <a href=\"#methode\" style=\"--c:var(--x5)\">M\u00e9thode<\/a>\r\n      <a href=\"#projets\" style=\"--c:var(--x10)\">Projets<\/a>\r\n      <a href=\"#collectivites\" style=\"--c:var(--x9)\">Collectivit\u00e9s<\/a>\r\n      <a href=\"#ressourcerie\" style=\"--c:var(--x3)\">Ressourcerie<\/a>\r\n      <a href=\"#equipe\" style=\"--c:var(--x4)\">\u00c9quipe<\/a>\r\n    <\/nav>\r\n    <div class=\"header-actions\">\r\n      <p class=\"lang\" data-lang-switch><a href=\"?lang=fr\" hreflang=\"fr\" lang=\"fr\" data-lang=\"fr\" aria-label=\"Version fran\u00e7aise\">FR<\/a><a href=\"?lang=en\" hreflang=\"en\" lang=\"en\" data-lang=\"en\" aria-label=\"English version\">EN<\/a><\/p>\r\n      <a class=\"btn btn-primary\" href=\"#contact\">\u00catre accompagn\u00e9 <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n    <\/div>\r\n    <p class=\"lang lang-m\" data-lang-switch><a href=\"?lang=fr\" hreflang=\"fr\" lang=\"fr\" data-lang=\"fr\" aria-label=\"Version fran\u00e7aise\">FR<\/a><a href=\"?lang=en\" hreflang=\"en\" lang=\"en\" data-lang=\"en\" aria-label=\"English version\">EN<\/a><\/p>\r\n    <button class=\"menu-toggle\" type=\"button\" aria-expanded=\"false\" aria-controls=\"mobile-nav\" data-menu><i aria-hidden=\"true\"><\/i>Menu<\/button>\r\n  <\/div>\r\n  <nav class=\"mobile-nav\" id=\"mobile-nav\" aria-label=\"Navigation mobile\" hidden>\r\n    <a href=\"#approche\">Approche<\/a>\r\n    <a href=\"#territoires\">Territoires<\/a>\r\n    <a href=\"#methode\">M\u00e9thode<\/a>\r\n    <a href=\"#projets\">Projets<\/a>\r\n    <a href=\"#collectivites\">Collectivit\u00e9s<\/a>\r\n    <a href=\"#ressourcerie\">Ressourcerie<\/a>\r\n    <a href=\"#equipe\">\u00c9quipe<\/a>\r\n    <a class=\"btn btn-primary\" href=\"#contact\">\u00catre accompagn\u00e9<\/a>\r\n  <\/nav>\r\n<\/header>\r\n<main id=\"main\">\r\n<!-- ============================== Hero ============================== -->\r\n<section class=\"hero\" id=\"top\" aria-labelledby=\"hero-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"hero-stage\">\r\n    <p class=\"eyebrow\" data-reveal>Incubateur associatif \u00b7 Fonds europ\u00e9ens<\/p>\r\n    <h1 id=\"hero-title\">\r\n      <span class=\"line\"><span>Construire des ponts entre<\/span><\/span>\r\n      <span class=\"sr-only\">les associations de terrain, les financements europ\u00e9ens et l\u2019innovation sociale<\/span>\r\n    <\/h1>\r\n    <div class=\"hero-art\" data-rope aria-hidden=\"true\">\r\n      <div class=\"hero-sky\"><canvas><\/canvas><\/div>\r\n      <p class=\"hero-banks\"><span style=\"--i:0\"><b style=\"--c:var(--x1)\">associations de terrain<\/b><\/span><span style=\"--i:1\"><b style=\"--c:var(--x7)\">financements europ\u00e9ens<\/b><\/span><span style=\"--i:2\"><b style=\"--c:var(--x5)\">innovation sociale<\/b><\/span><\/p>\r\n    <\/div>\r\n    <\/div>\r\n    <div class=\"hero-foot\" data-reveal style=\"--d:80\">\r\n      <p class=\"lede\"><b>Social Hackers Lab est ce pont.<\/b> Depuis Marseille, nous accompagnons les associations des quartiers prioritaires, des territoires ruraux et ultramarins \u00e0 acc\u00e9der aux financements europ\u00e9ens, \u00e0 structurer leurs projets et \u00e0 d\u00e9velopper les comp\u00e9tences n\u00e9cessaires pour d\u00e9poser demain en autonomie.<\/p>\r\n      <div class=\"hero-cta\">\r\n        <a class=\"btn btn-primary\" href=\"#contact\">\u00catre accompagn\u00e9 <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n        <a class=\"btn btn-ghost\" href=\"#projets\">Voir les projets financ\u00e9s<\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== Preuves ============================== -->\r\n<section class=\"proof\" aria-labelledby=\"proof-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"proof-head\" data-reveal>\r\n      <h2 id=\"proof-title\">SHL en chiffres<\/h2>\r\n      <p>Un impact mesurable, ancr\u00e9 dans les territoires.<\/p>\r\n    <\/div>\r\n    <dl class=\"figures\" data-counters>\r\n      <div data-reveal style=\"--d:0\"><dt><span data-count=\"5.2\" data-decimals=\"1\">5,2<\/span><small>M\u20ac<\/small><\/dt><dd>de financements europ\u00e9ens lev\u00e9s par les structures accompagn\u00e9es.<\/dd><\/div>\r\n      <div data-reveal style=\"--d:80\"><dt><span data-count=\"150\">150<\/span><small>+<\/small><\/dt><dd>associations accompagn\u00e9es partout en France.<\/dd><\/div>\r\n      <div data-reveal style=\"--d:160\"><dt><span data-count=\"90\">90<\/span><small>%<\/small><\/dt><dd>des structures red\u00e9posent un projet europ\u00e9en en autonomie l\u2019ann\u00e9e suivante.<\/dd><\/div>\r\n      <div data-reveal style=\"--d:240\"><dt><span data-count=\"6\">6<\/span><\/dt><dd>hubs inter-associatifs sur le territoire national.<\/dd><\/div>\r\n    <\/dl>\r\n    <p class=\"hubs-note\" data-reveal><b>6 hubs inter-associatifs<\/b> (R\u00e9gion Sud, Occitanie, Pyr\u00e9n\u00e9es-Atlantiques, \u00cele-de-France, Grand Est et Outre-mer) \u00b7 <b>1 ressourcerie num\u00e9rique<\/b> en acc\u00e8s continu.<\/p>\r\n    <div class=\"partners\" data-reveal>\r\n      <p><b>Partenaires & financeurs<\/b>Un programme soutenu par les collectivit\u00e9s, l\u2019\u00c9tat et l\u2019Europe.<\/p>\r\n      <div class=\"logos\">\r\n        <div class=\"logos-set\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri.png\" alt=\"M\u00e9tropole Aix-Marseille-Provence\" width=\"837\" height=\"134\" style=\"--lh:28px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901.png\" alt=\"Agence nationale de la coh\u00e9sion des territoires\" width=\"1280\" height=\"473\" style=\"--lh:38px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_.webp\" alt=\"D\u00e9partement de l\u2019Essonne\" width=\"960\" height=\"327\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-montpellier-3m.png\" alt=\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole\" width=\"119\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-villes-territoires-occitanie.png\" alt=\"Villes et Territoires Occitanie\" width=\"176\" height=\"81\" style=\"--lh:42px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-beziers-mediterranee.png\" alt=\"Agglom\u00e9ration B\u00e9ziers M\u00e9diterran\u00e9e\" width=\"88\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-herault-mediterranee.png\" alt=\"Agglom\u00e9ration H\u00e9rault M\u00e9diterran\u00e9e\" width=\"293\" height=\"120\" style=\"--lh:40px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-sete-agglopole.png\" alt=\"S\u00e8te Agglop\u00f4le M\u00e9diterran\u00e9e\" width=\"144\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lunel-agglo.png\" alt=\"Lunel Agglo\" width=\"120\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lodevois-larzac.png\" alt=\"Communaut\u00e9 de communes Lod\u00e9vois et Larzac\" width=\"172\" height=\"120\" style=\"--lh:52px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-clermont-l-herault.png\" alt=\"Ville de Clermont-l\u2019H\u00e9rault\" width=\"134\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-ville-de-loos.png\" alt=\"Ville de Loos\" width=\"642\" height=\"358\" style=\"--lh:47px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/images.png\" alt=\"Erasmus+\" width=\"800\" height=\"266\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n        <\/div>\r\n        <div class=\"logos-set\" aria-hidden=\"true\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri.png\" alt=\"\" width=\"837\" height=\"134\" style=\"--lh:28px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901.png\" alt=\"\" width=\"1280\" height=\"473\" style=\"--lh:38px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_.webp\" alt=\"\" width=\"960\" height=\"327\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-montpellier-3m.png\" alt=\"\" width=\"119\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-villes-territoires-occitanie.png\" alt=\"\" width=\"176\" height=\"81\" style=\"--lh:42px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-beziers-mediterranee.png\" alt=\"\" width=\"88\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-herault-mediterranee.png\" alt=\"\" width=\"293\" height=\"120\" style=\"--lh:40px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-sete-agglopole.png\" alt=\"\" width=\"144\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lunel-agglo.png\" alt=\"\" width=\"120\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-lodevois-larzac.png\" alt=\"\" width=\"172\" height=\"120\" style=\"--lh:52px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-clermont-l-herault.png\" alt=\"\" width=\"134\" height=\"120\" style=\"--lh:54px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-ville-de-loos.png\" alt=\"\" width=\"642\" height=\"358\" style=\"--lh:47px\" loading=\"lazy\" decoding=\"async\">\r\n          <img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/images.png\" alt=\"\" width=\"800\" height=\"266\" style=\"--lh:36px\" loading=\"lazy\" decoding=\"async\">\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== Carte ============================== -->\r\n<section class=\"atlas\" id=\"europe\" style=\"--h:var(--x7)\" aria-labelledby=\"atlas-title\" data-map>\r\n  <div class=\"wrap atlas-over\">\r\n    <div class=\"atlas-copy\" data-reveal>\r\n      <p class=\"sec-index\"><span>\u00b7<\/span> Des ponts vers l\u2019Europe<\/p>\r\n      <h2 class=\"sec-title\" id=\"atlas-title\">Des projets locaux, <em>des coop\u00e9rations europ\u00e9ennes.<\/em><\/h2>\r\n      <p class=\"sec-copy\">Cette carte pr\u00e9sente quelques exemples de coop\u00e9rations europ\u00e9ennes initi\u00e9es ou accompagn\u00e9es par Social Hackers Lab.<\/p>\r\n      <p class=\"sec-copy\">Chaque liaison illustre la mise en relation d\u2019une structure accompagn\u00e9e avec un ou plusieurs partenaires europ\u00e9ens. Elle donne un aper\u00e7u de la diversit\u00e9 des projets, des territoires et des coop\u00e9rations d\u00e9velopp\u00e9es \u00e0 l\u2019\u00e9chelle europ\u00e9enne.<\/p>\r\n    <\/div>\r\n    <div class=\"atlas-canvas\">\r\n      <canvas role=\"img\" aria-label=\"Carte de l\u2019Europe : quelques exemples de coop\u00e9rations relient des structures accompagn\u00e9es en France \u00e0 leurs partenaires europ\u00e9ens.\"><\/canvas>\r\n      <p class=\"map-tip\" data-map-tip aria-hidden=\"true\"><\/p>\r\n    <\/div>\r\n    <aside class=\"atlas-legend\" data-legend data-reveal style=\"--d:120\" aria-label=\"Exemples de projets repr\u00e9sent\u00e9s sur la carte\">\r\n      <ol class=\"legend-list\" data-legend-list aria-label=\"Exemples de projets financ\u00e9s\"><\/ol>\r\n    <\/aside>\r\n    <ul class=\"map-key\" aria-hidden=\"true\">\r\n      <li><i class=\"k-hub\"><\/i>Structure accompagn\u00e9e<\/li>\r\n      <li><i class=\"k-arc\"><\/i>Projet de coop\u00e9ration europ\u00e9en<\/li>\r\n      <li><i class=\"k-ctry\"><\/i>Pays partenaire<\/li>\r\n    <\/ul>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 01 Identit\u00e9 ============================== -->\r\n<section class=\"section\" id=\"approche\" style=\"--h:var(--x1)\" aria-labelledby=\"approche-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"ident-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>01<\/span> Notre identit\u00e9<\/p>\r\n        <h2 class=\"sec-title\" id=\"approche-title\">Notre approche&nbsp;: <em>le hacking social.<\/em><\/h2>\r\n      <\/div>\r\n      <div class=\"ident-text\">\r\n        <p class=\"ident-lead\" data-reveal style=\"--d:80\">Le hacking social, pour nous, c\u2019est une mani\u00e8re d\u2019agir sur les syst\u00e8mes qui emp\u00eachent trop souvent les associations d\u2019acc\u00e9der aux ressources qui leur sont pourtant destin\u00e9es.<\/p>\r\n        <div class=\"ident-body\" data-reveal style=\"--d:160\">\r\n          <p class=\"sec-copy\">Nous traduisons la complexit\u00e9 des financements europ\u00e9ens dans un langage clair, op\u00e9rationnel et directement utilisable. Nous aidons les associations \u00e0 comprendre les r\u00e8gles du jeu, \u00e0 structurer leurs id\u00e9es, \u00e0 construire des dossiers solides et \u00e0 prendre confiance dans leur capacit\u00e9 \u00e0 porter des projets ambitieux.<\/p>\r\n          <p class=\"sec-copy\">Notre approche repose sur trois leviers compl\u00e9mentaires&nbsp;: <b>la formation<\/b>, <b>l\u2019accompagnement individualis\u00e9<\/b> and <b>la mise en r\u00e9seau<\/b> avec des partenaires, financeurs et acteurs europ\u00e9ens.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"bento\">\r\n      <article class=\"bc\" style=\"--c:var(--t7);--cx:var(--x7)\" data-reveal>\r\n        <div class=\"bc-stage sc-pil is-b\" data-scene=\"piliers\" aria-hidden=\"true\">\r\n          <div class=\"pil\">\r\n            <div class=\"pil-fig\">\r\n              <svg class=\"pil-art\" viewbox=\"0 0 300 150\">\r\n                <defs>\r\n                  <lineargradient id=\"pil-g0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#c3cdc8\"\/><stop offset=\".62\" stop-color=\"#c3cdc8\" stop-opacity=\".8\"\/><stop offset=\"1\" stop-color=\"#c3cdc8\" stop-opacity=\".1\"\/><\/lineargradient><lineargradient id=\"pil-g1\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#4b8296\"\/><stop offset=\".62\" stop-color=\"#4b8296\" stop-opacity=\".8\"\/><stop offset=\"1\" stop-color=\"#4b8296\" stop-opacity=\".1\"\/><\/lineargradient><lineargradient id=\"pil-g2\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#bd9035\"\/><stop offset=\".62\" stop-color=\"#bd9035\" stop-opacity=\".8\"\/><stop offset=\"1\" stop-color=\"#bd9035\" stop-opacity=\".1\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-sheen\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".24\"\/><stop offset=\".5\" stop-color=\"#fff\" stop-opacity=\"0\"\/><stop offset=\"1\" stop-color=\"#16262c\" stop-opacity=\".06\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-edge\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".6\"\/><stop offset=\".5\" stop-color=\"#fff\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-top\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".14\"\/><stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                  <lineargradient id=\"pil-ground\" gradientunits=\"userSpaceOnUse\" x1=\"6\" x2=\"294\"><stop offset=\"0\" stop-color=\"#dde3dd\" stop-opacity=\"0\"\/><stop offset=\".2\" stop-color=\"#dde3dd\"\/><stop offset=\".8\" stop-color=\"#dde3dd\"\/><stop offset=\"1\" stop-color=\"#dde3dd\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                  <filter id=\"pil-lift\" x=\"-10%\" y=\"-40%\" width=\"120%\" height=\"240%\"><fedropshadow dx=\"0\" dy=\"8\" stddeviation=\"7\" flood-color=\"#16262c\" flood-opacity=\".22\"\/><\/filter>\r\n                  <clippath id=\"pil-soil\"><rect y=\"-80\" width=\"300\" height=\"218\"\/><\/clippath>\r\n                <\/defs>\r\n                <path d=\"M6 138.5H294\" stroke=\"url(#pil-ground)\"\/>\r\n                <g clip-path=\"url(#pil-soil)\">\r\n                  <g class=\"pil-col\"><rect x=\"31\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-g1)\"\/><rect x=\"31\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-sheen)\" stroke=\"url(#pil-edge)\"\/><path d=\"M58.50 67.80L59.04 69.25L60.59 69.32L59.38 70.29L59.79 71.78L58.50 70.92L57.21 71.78L57.62 70.29L56.41 69.32L57.96 69.25ZM57.36 72.05L57.90 73.50L59.45 73.57L58.24 74.54L58.65 76.03L57.36 75.17L56.07 76.03L56.48 74.54L55.27 73.57L56.82 73.50ZM54.25 75.16L54.79 76.61L56.34 76.68L55.13 77.65L55.54 79.14L54.25 78.29L52.96 79.14L53.37 77.65L52.16 76.68L53.71 76.61ZM50.00 76.30L50.54 77.75L52.09 77.82L50.88 78.79L51.29 80.28L50.00 79.42L48.71 80.28L49.12 78.79L47.91 77.82L49.46 77.75ZM45.75 75.16L46.29 76.61L47.84 76.68L46.63 77.65L47.04 79.14L45.75 78.29L44.46 79.14L44.87 77.65L43.66 76.68L45.21 76.61ZM42.64 72.05L43.18 73.50L44.73 73.57L43.52 74.54L43.93 76.03L42.64 75.17L41.35 76.03L41.76 74.54L40.55 73.57L42.10 73.50ZM41.50 67.80L42.04 69.25L43.59 69.32L42.38 70.29L42.79 71.78L41.50 70.92L40.21 71.78L40.62 70.29L39.41 69.32L40.96 69.25ZM42.64 63.55L43.18 65.00L44.73 65.07L43.52 66.04L43.93 67.53L42.64 66.67L41.35 67.53L41.76 66.04L40.55 65.07L42.10 65.00ZM45.75 60.44L46.29 61.89L47.84 61.96L46.63 62.92L47.04 64.42L45.75 63.56L44.46 64.42L44.87 62.92L43.66 61.96L45.21 61.89ZM50.00 59.30L50.54 60.75L52.09 60.82L50.88 61.79L51.29 63.28L50.00 62.42L48.71 63.28L49.12 61.79L47.91 60.82L49.46 60.75ZM54.25 60.44L54.79 61.89L56.34 61.96L55.13 62.92L55.54 64.42L54.25 63.56L52.96 64.42L53.37 62.92L52.16 61.96L53.71 61.89ZM57.36 63.55L57.90 65.00L59.45 65.07L58.24 66.04L58.65 67.53L57.36 66.67L56.07 67.53L56.48 66.04L55.27 65.07L56.82 65.00Z\" fill=\"#ffcc00\"\/><\/g>\r\n                  <g class=\"pil-col\"><rect x=\"131\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-g0)\"\/><rect x=\"131\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-sheen)\" stroke=\"url(#pil-edge)\"\/><\/g>\r\n                  <g class=\"pil-col\"><rect x=\"231\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-g2)\"\/><rect x=\"231\" y=\"44\" width=\"38\" height=\"104\" rx=\"8\" fill=\"url(#pil-sheen)\" stroke=\"url(#pil-edge)\"\/><\/g>\r\n                <\/g>\r\n                <g class=\"pil-slab\" filter=\"url(#pil-lift)\"><rect x=\"14\" y=\"20\" width=\"272\" height=\"24\" rx=\"8\" fill=\"#16262c\"\/><rect x=\"14.5\" y=\"20.5\" width=\"271\" height=\"23\" rx=\"7.5\" fill=\"url(#pil-top)\" stroke=\"#fff\" stroke-opacity=\".08\"\/><\/g>\r\n              <\/svg>\r\n              <p class=\"pil-name\" style=\"--i:2\">Vos projets<\/p>\r\n            <\/div>\r\n            <ul class=\"pil-key\"><li class=\"is-new\" style=\"--k:var(--t7); --kx:var(--x7); --i:0\">Fonds<br>europ\u00e9ens<\/li><li>Subventions<br>habituelles<\/li><li class=\"is-new\" style=\"--k:var(--t3); --kx:var(--x3); --i:1\">Autres<br>ressources<\/li><\/ul>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">01<\/p>\r\n          <h3>Renforcer l\u2019autonomie financi\u00e8re<\/h3>\r\n          <p>Nous aidons les associations \u00e0 diversifier leurs ressources et \u00e0 int\u00e9grer durablement les financements europ\u00e9ens dans leur strat\u00e9gie. L\u2019enjeu n\u2019est pas seulement de financer un projet, mais de renforcer leur capacit\u00e9 \u00e0 s\u00e9curiser leur mod\u00e8le \u00e9conomique et \u00e0 choisir leurs opportunit\u00e9s de d\u00e9veloppement.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--t5);--cx:var(--x5); --d:80\" data-reveal>\r\n        <div class=\"bc-stage sc-dos\" data-scene=\"dossiers\" aria-hidden=\"true\">\r\n          <div class=\"dos\">\r\n            <p class=\"dos-key\"><span style=\"--k:var(--soft)\"><svg viewbox=\"0 0 11 16\"><use href=\"#dos-cur\"\/><\/svg>Social Hackers Lab<\/span><span style=\"--k:var(--c)\"><svg viewbox=\"0 0 11 16\"><use href=\"#dos-cur\"\/><\/svg>Votre \u00e9quipe<\/span><\/p>\r\n            <svg class=\"dos-art\" viewbox=\"0 0 300 124\">\r\n              <defs>\r\n                <path id=\"dos-cur\" d=\"M0 0V13.4L3.5 10.2L5.9 15.5L8.3 14.4L5.9 9.2H10.5Z\"\/>\r\n                <filter id=\"dos-sh\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"150%\"><fedropshadow dx=\"0\" dy=\"2\" stddeviation=\"2.5\" flood-color=\"#16262c\" flood-opacity=\".08\"\/><\/filter>\r\n                <filter id=\"dos-cur-sh\" x=\"-60%\" y=\"-40%\" width=\"220%\" height=\"180%\"><fedropshadow dx=\"0\" dy=\"1\" stddeviation=\".9\" flood-color=\"#16262c\" flood-opacity=\".28\"\/><\/filter>\r\n                <filter id=\"dos-blur\" x=\"-40%\" y=\"-40%\" width=\"180%\" height=\"180%\"><fegaussianblur stddeviation=\"6\"\/><\/filter>\r\n              <\/defs>\r\n              <rect class=\"dos-slot\" x=\"14\" y=\"10\" width=\"72\" height=\"96\" rx=\"7\"\/><rect class=\"dos-slot\" x=\"114\" y=\"10\" width=\"72\" height=\"96\" rx=\"7\"\/><rect class=\"dos-slot\" x=\"214\" y=\"10\" width=\"72\" height=\"96\" rx=\"7\"\/>\r\n              <path class=\"dos-brace\" d=\"M14 115v4h72v-4\"\/>\r\n              <path class=\"dos-brace is-you\" d=\"M114 115v4h172v-4\"\/>\r\n              <g class=\"dos-live\">\r\n                <g class=\"dos-sheet\" transform=\"translate(14 10)\">\r\n                  <rect class=\"dos-lift\" x=\"6\" y=\"12\" width=\"60\" height=\"88\" rx=\"8\" filter=\"url(#dos-blur)\"\/>\r\n                  <rect class=\"dos-paper\" width=\"72\" height=\"96\" rx=\"7\" filter=\"url(#dos-sh)\"\/>\r\n                  <rect class=\"dos-title\" x=\"10\" y=\"12\" width=\"30\" height=\"5\" rx=\"2.5\"\/>\r\n                  <rect class=\"dos-bed\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <rect class=\"dos-fill is-shl\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-shl\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <g class=\"dos-ok\" transform=\"translate(58 80)\"><circle r=\"7.5\"\/><path d=\"M-3.3 .2l2.2 2.2 4.3-4.4\"\/><\/g>\r\n                <\/g>\r\n                <g class=\"dos-sheet\" transform=\"translate(114 10)\">\r\n                  <rect class=\"dos-lift\" x=\"6\" y=\"12\" width=\"60\" height=\"88\" rx=\"8\" filter=\"url(#dos-blur)\"\/>\r\n                  <rect class=\"dos-paper\" width=\"72\" height=\"96\" rx=\"7\" filter=\"url(#dos-sh)\"\/>\r\n                  <rect class=\"dos-title\" x=\"10\" y=\"12\" width=\"30\" height=\"5\" rx=\"2.5\"\/>\r\n                  <rect class=\"dos-bed\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <rect class=\"dos-fill is-you\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <g class=\"dos-ok\" transform=\"translate(58 80)\"><circle r=\"7.5\"\/><path d=\"M-3.3 .2l2.2 2.2 4.3-4.4\"\/><\/g>\r\n                <\/g>\r\n                <g class=\"dos-sheet\" transform=\"translate(214 10)\">\r\n                  <rect class=\"dos-lift\" x=\"6\" y=\"12\" width=\"60\" height=\"88\" rx=\"8\" filter=\"url(#dos-blur)\"\/>\r\n                  <rect class=\"dos-paper\" width=\"72\" height=\"96\" rx=\"7\" filter=\"url(#dos-sh)\"\/>\r\n                  <rect class=\"dos-title\" x=\"10\" y=\"12\" width=\"30\" height=\"5\" rx=\"2.5\"\/>\r\n                  <rect class=\"dos-bed\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-bed\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <rect class=\"dos-fill is-you\" x=\"10\" y=\"28\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"39\" width=\"44\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"50\" width=\"52\" height=\"4\" rx=\"2\"\/><rect class=\"dos-fill is-you\" x=\"10\" y=\"61\" width=\"30\" height=\"4\" rx=\"2\"\/>\r\n                  <g class=\"dos-ok\" transform=\"translate(58 80)\"><circle r=\"7.5\"\/><path d=\"M-3.3 .2l2.2 2.2 4.3-4.4\"\/><\/g>\r\n                <\/g>\r\n                <use class=\"dos-cur is-shl\" href=\"#dos-cur\" transform=\"translate(-16 34)\" filter=\"url(#dos-cur-sh)\" style=\"opacity:0\"\/>\r\n                <use class=\"dos-cur is-you\" href=\"#dos-cur\" transform=\"translate(276 100)\" filter=\"url(#dos-cur-sh)\"\/>\r\n              <\/g>\r\n            <\/svg>\r\n            <div class=\"dos-ticks\"><p><b>Ann\u00e9e 1<\/b>avec SHL<\/p><p class=\"is-you\"><b>Ann\u00e9e 2<\/b>en autonomie<\/p><\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">02<\/p>\r\n          <h3>Inscrire l\u2019action dans la dur\u00e9e<\/h3>\r\n          <p>Nous transmettons des comp\u00e9tences techniques et strat\u00e9giques pour que les associations ne d\u00e9pendent pas uniquement d\u2019un accompagnement ponctuel. \u00c0 la fin du parcours, les \u00e9quipes disposent d\u2019outils, de m\u00e9thodes et de mod\u00e8les r\u00e9utilisables pour d\u00e9poser de nouveaux dossiers de mani\u00e8re autonome.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--lv3); --cx:var(--x4); --d:160\" data-reveal>\r\n        <div class=\"bc-stage sc-net\" data-scene=\"reseau\" aria-hidden=\"true\">\r\n          <svg class=\"net-svg\"><\/svg>\r\n          <p class=\"net-key\"><span><i><\/i>Pays partenaires<\/span><span><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Financeur europ\u00e9en<\/span><\/p>\r\n          <span class=\"net-node is-on\" title=\"Portugal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pt\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"SPAIN\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"Union europ\u00e9enne\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"Danemark\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-dk\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"Pologne\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pl\"\/><\/svg><\/span>\r\n          <span class=\"net-node is-on\" title=\"GREECE\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-gr\"\/><\/svg><\/span>\r\n          <span class=\"net-core\">Votre association<\/span>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">03<\/p>\r\n          <h3>Saisir les opportunit\u00e9s<\/h3>\r\n          <p>Les financements europ\u00e9ens sont souvent per\u00e7us comme complexes, \u00e9loign\u00e9s ou r\u00e9serv\u00e9s aux grandes structures. Notre r\u00f4le est de les rendre accessibles aux associations de terrain, en identifiant les bons dispositifs, en simplifiant les \u00e9tapes et en accompagnant les structures jusqu\u2019au d\u00e9p\u00f4t.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 02 Territoires ============================== -->\r\n<section class=\"section tint\" id=\"territoires\" style=\"--h:var(--x8)\" aria-labelledby=\"territoires-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>02<\/span> Nos champs d\u2019action<\/p>\r\n        <h2 class=\"sec-title\" id=\"territoires-title\">Des territoires souvent \u00e9loign\u00e9s des <em>circuits de financement.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Nous intervenons prioritairement l\u00e0 o\u00f9 l\u2019acc\u00e8s aux financements reste difficile&nbsp;: quartiers prioritaires de la politique de la ville, territoires ruraux, territoires ultramarins et structures \u00e9mergentes de l\u2019\u00e9conomie sociale et solidaire.<\/p>\r\n    <\/div>\r\n    <div class=\"terr\" data-terr>\r\n      <ol class=\"fields\" data-reveal>\r\n        <li class=\"field is-on\" style=\"--c:var(--t8);--cx:var(--x8)\">\r\n          <span class=\"field-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\"><path d=\"M3 21h18M5 21V9l5-3v15M10 21V4l9 4v13M13 10h3M13 13.5h3M13 17h3M7 12h1M7 15.5h1\"\/><\/svg><\/span>\r\n          <div>\r\n            <p class=\"mono\">QPV<\/p>\r\n            <h3><button class=\"field-btn\" type=\"button\" aria-pressed=\"true\" aria-controls=\"terr-map\">Les quartiers prioritaires de la politique de la ville<\/button><\/h3>\r\n            <p>En partenariat avec les collectivit\u00e9s, nous accompagnons des associations qui portent des actions essentielles aupr\u00e8s des habitants mais manquent de temps, de r\u00e9seau ou d\u2019ing\u00e9nierie. L\u2019incubateur transforme leurs actions de terrain en projets structur\u00e9s, finan\u00e7ables et \u00e9ligibles.<\/p>\r\n          <\/div>\r\n          <i class=\"field-bar\" aria-hidden=\"true\"><\/i>\r\n        <\/li>\r\n        <li class=\"field\" style=\"--c:var(--t5);--cx:var(--x5)\">\r\n          <span class=\"field-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\"><path d=\"M2 17c2.5 0 2.5-1.5 5-1.5S9.5 17 12 17s2.5-1.5 5-1.5 2.5 1.5 5 1.5M2 21c2.5 0 2.5-1.5 5-1.5S9.5 21 12 21s2.5-1.5 5-1.5 2.5 1.5 5 1.5M4 13l5-7 4 5 2.5-3L20 13\"\/><\/svg><\/span>\r\n          <div>\r\n            <p class=\"mono\">Rural \u00b7 Outre-mer<\/p>\r\n            <h3><button class=\"field-btn\" type=\"button\" aria-pressed=\"false\" aria-controls=\"terr-map\">Les territoires ruraux et ultramarins<\/button><\/h3>\r\n            <p>Un accompagnement adapt\u00e9 \u00e0 chaque r\u00e9alit\u00e9&nbsp;: \u00e9loignement g\u00e9ographique, acc\u00e8s aux partenaires, sp\u00e9cificit\u00e9s locales, besoins de coop\u00e9ration r\u00e9gionale ou transfrontali\u00e8re. Nous intervenons notamment en Outre-mer et dans les territoires ruraux.<\/p>\r\n          <\/div>\r\n          <i class=\"field-bar\" aria-hidden=\"true\"><\/i>\r\n        <\/li>\r\n        <li class=\"field\" style=\"--c:var(--t3);--cx:var(--x3)\">\r\n          <span class=\"field-icon\" aria-hidden=\"true\"><svg viewbox=\"0 0 24 24\"><circle cx=\"12\" cy=\"5\" r=\"2.2\"\/><circle cx=\"5\" cy=\"17\" r=\"2.2\"\/><circle cx=\"19\" cy=\"17\" r=\"2.2\"\/><circle cx=\"12\" cy=\"12.5\" r=\"1.6\"\/><path d=\"M12 7.2v3.7M10.7 13.5l-4 2.3M13.3 13.5l4 2.3\"\/><\/svg><\/span>\r\n          <div>\r\n            <p class=\"mono\">ESS<\/p>\r\n            <h3><button class=\"field-btn\" type=\"button\" aria-pressed=\"false\" aria-controls=\"terr-map\">Les structures \u00e9mergentes de l\u2019ESS<\/button><\/h3>\r\n            <p>L\u2019incubateur s\u2019adresse aux structures qui portent des projets d\u2019int\u00e9r\u00eat g\u00e9n\u00e9ral et souhaitent changer d\u2019\u00e9chelle, quelle que soit leur taille ou leur th\u00e9matique.<\/p>\r\n          <\/div>\r\n          <i class=\"field-bar\" aria-hidden=\"true\"><\/i>\r\n        <\/li>\r\n      <\/ol>\r\n      <figure class=\"terr-map\" id=\"terr-map\" data-reveal style=\"--d:120\">\r\n        <p class=\"terr-head\"><span><b>Fig. 02<\/b> \u00b7 O\u00f9 nous intervenons<\/span><span data-terr-count>01 \/ 03<\/span><\/p>\r\n        <div class=\"terr-stage\">\r\n          <canvas role=\"img\" aria-label=\"Carte de France et des cinq d\u00e9partements d\u2019outre-mer. Tour \u00e0 tour s\u2019allument les quartiers prioritaires des agglom\u00e9rations, les territoires ruraux et ultramarins, puis un r\u00e9seau de structures de l\u2019ESS reli\u00e9 \u00e0 l\u2019Europe.\"><\/canvas>\r\n          <ul class=\"drom\" aria-hidden=\"true\"><li>Guadeloupe<\/li><li>Martinique<\/li><li>Guyane<\/li><li>La R\u00e9union<\/li><li>Mayotte<\/li><\/ul>\r\n        <\/div>\r\n        <ul class=\"terr-key\" aria-hidden=\"true\">\r\n          <li class=\"is-on\" style=\"--k:var(--t8); --kx:var(--x8)\"><i><\/i>Quartiers prioritaires des agglom\u00e9rations<\/li>\r\n          <li style=\"--k:var(--t5); --kx:var(--x5)\"><i><\/i>Territoires ruraux et d\u2019outre-mer<\/li>\r\n          <li style=\"--k:var(--t3); --kx:var(--x3)\"><i><\/i>Structures de l\u2019ESS, en r\u00e9seau jusqu\u2019\u00e0 l\u2019Europe<\/li>\r\n        <\/ul>\r\n      <\/figure>\r\n    <\/div>\r\n    <div class=\"kinds\" data-reveal>\r\n      <p><b>Pour qui<\/b>Des structures de toutes tailles et de tous secteurs.<\/p>\r\n      <ul>\r\n        <li>Associations culturelles<\/li><li>Centres sociaux<\/li><li>Structures d\u2019insertion<\/li><li>Collectifs citoyens<\/li><li>Associations sportives<\/li><li>Lutte contre les discriminations<\/li><li>Jeunesse<\/li><li>Inclusion<\/li><li>Transition \u00e9cologique<\/li>\r\n      <\/ul>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 03 M\u00e9thode ============================== -->\r\n<section class=\"section\" id=\"methode\" style=\"--h:var(--x5)\" aria-labelledby=\"methode-title\">\r\n  <div class=\"wrap method\" data-method>\r\n    <div class=\"method-aside\">\r\n      <div class=\"method-sticky\">\r\n        <p class=\"sec-index\"><span>03<\/span> Notre m\u00e9thodologie<\/p>\r\n        <h2 class=\"sec-title\" id=\"methode-title\">Un parcours structur\u00e9 en <em>cinq \u00e9tapes.<\/em><\/h2>\r\n        <p class=\"sec-copy\">De l\u2019acculturation aux financements europ\u00e9ens jusqu\u2019\u00e0 l\u2019autonomie compl\u00e8te des \u00e9quipes&nbsp;: une progression con\u00e7ue pour conduire les structures jusqu\u2019au d\u00e9p\u00f4t effectif de leurs dossiers et favoriser le transfert durable des comp\u00e9tences.<\/p>\r\n        <div class=\"rail\" aria-hidden=\"true\">\r\n          <div class=\"rail-track\"><span data-rail-fill><\/span><\/div>\r\n          <ol>\r\n            <li><a href=\"#etape-1\" tabindex=\"-1\"><span>01<\/span>Diagnostic<\/a><\/li>\r\n            <li><a href=\"#etape-2\" tabindex=\"-1\"><span>02<\/span>Formation<\/a><\/li>\r\n            <li><a href=\"#etape-3\" tabindex=\"-1\"><span>03<\/span>Montage<\/a><\/li>\r\n            <li><a href=\"#etape-4\" tabindex=\"-1\"><span>04<\/span>Relecture et d\u00e9p\u00f4t<\/a><\/li>\r\n            <li><a href=\"#etape-5\" tabindex=\"-1\"><span>05<\/span>Autonomie<\/a><\/li>\r\n          <\/ol>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <ol class=\"steps\">\r\n      <li class=\"step\" id=\"etape-1\">\r\n        <p class=\"step-top\"><span class=\"big\">01<\/span><span class=\"step-label\">\u00c9tape 1 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"now\"><\/i><i><\/i><i><\/i><i><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Diagnostic de maturit\u00e9 europ\u00e9enne<\/h3>\r\n        <p>Un auto-diagnostic structur\u00e9 permet \u00e0 chaque association d\u2019\u00e9valuer sa capacit\u00e9 \u00e0 mobiliser les fonds europ\u00e9ens, d\u2019identifier ses forces et de cartographier ses besoins.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-2\">\r\n        <p class=\"step-top\"><span class=\"big\">02<\/span><span class=\"step-label\">\u00c9tape 2 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"now\"><\/i><i><\/i><i><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Formation aux logiques de financement<\/h3>\r\n        <p>Des ateliers collectifs pour comprendre les financements europ\u00e9ens&nbsp;: attendus des financeurs, crit\u00e8res d\u2019\u00e9ligibilit\u00e9, logique de projet, cadre logique, budgets, partenariats et \u00e9tapes cl\u00e9s d\u2019un d\u00e9p\u00f4t.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-3\">\r\n        <p class=\"step-top\"><span class=\"big\">03<\/span><span class=\"step-label\">\u00c9tape 3 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"now\"><\/i><i><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Accompagnement au montage<\/h3>\r\n        <p>Chaque structure transforme son id\u00e9e en projet clair, coh\u00e9rent et finan\u00e7able. Nous travaillons ensemble les objectifs, les publics vis\u00e9s, les activit\u00e9s, les r\u00e9sultats attendus, le budget, le calendrier et les partenaires.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-4\">\r\n        <p class=\"step-top\"><span class=\"big\">04<\/span><span class=\"step-label\">\u00c9tape 4 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"now\"><\/i><i><\/i><\/span><\/span><\/p>\r\n        <h3>Relecture et d\u00e9p\u00f4t<\/h3>\r\n        <p>Les dossiers sont relus avant d\u00e9p\u00f4t pour s\u00e9curiser la coh\u00e9rence du projet, la r\u00e9daction, le budget, les pi\u00e8ces administratives et les annexes. Objectif&nbsp;: s\u00e9curiser la qualit\u00e9 du d\u00e9p\u00f4t et renforcer la coh\u00e9rence de la candidature, tout en permettant \u00e0 l\u2019\u00e9quipe de ma\u00eetriser chaque \u00e9tape.<\/p>\r\n      <\/li>\r\n      <li class=\"step\" id=\"etape-5\">\r\n        <p class=\"step-top\"><span class=\"big\">05<\/span><span class=\"step-label\">\u00c9tape 5 sur 5<span class=\"step-bar\" aria-hidden=\"true\"><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"done\"><\/i><i class=\"now\"><\/i><\/span><\/span><\/p>\r\n        <h3>Transfert de comp\u00e9tences et autonomisation<\/h3>\r\n        <p>Les associations repartent avec des outils concrets, mieux outill\u00e9es pour d\u00e9poser de nouveaux projets, d\u00e9velopper leurs partenariats et renforcer durablement leur autonomie financi\u00e8re.<\/p>\r\n        <ul class=\"tools\">\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 1.5h5.5L13 5v9.5H4z M9.5 1.5V5H13\"\/><\/svg>Mod\u00e8les de dossiers<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M2.5 2.5h11v11h-11z M2.5 6.2h11 M2.5 9.8h11 M6.2 2.5v11\"\/><\/svg>Trames budg\u00e9taires<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M2 3.5h5a1.5 1.5 0 0 1 1.5 1.5v9A1.5 1.5 0 0 0 7 12.5H2z M14 3.5H9.5A1.5 1.5 0 0 0 8 5\"\/><\/svg>Ressources p\u00e9dagogiques<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M10.5 2.5l3 3-8 8H2.5v-3z\"\/><\/svg>M\u00e9thodes de r\u00e9daction<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"5.5\"\/><path d=\"M8 5v3l2 1.5\"\/><\/svg>Veille sur les appels<\/li>\r\n          <li><svg viewbox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M1.5 3.5h13v8h-13z M5.5 14h5 M8 11.5V14\"\/><\/svg>Supports de formation<\/li>\r\n        <\/ul>\r\n      <\/li>\r\n    <\/ol>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 04 Projets ============================== -->\r\n<section class=\"section tint\" id=\"projets\" style=\"--h:var(--x10)\" aria-labelledby=\"projets-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>04<\/span> Sur le terrain<\/p>\r\n        <h2 class=\"sec-title\" id=\"projets-title\">Des projets r\u00e9els, des <em>r\u00e9sultats mesurables.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Une s\u00e9lection de projets europ\u00e9ens accompagn\u00e9s jusqu\u2019\u00e0 leur financement, repr\u00e9sentatifs de la diversit\u00e9 des th\u00e9matiques et des partenariats transnationaux.<\/p>\r\n    <\/div>\r\n    <div class=\"projects\" data-projects>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:8;--by:164;--bw:488;--bh:171\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Solidarite-femmes-13.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">\u00c9galit\u00e9 & violences de genre<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Espagne<\/p>\r\n        <h3>Solidarit\u00e9 Femmes 13 \u00d7 Dem\u00e9ter<\/h3>\r\n        <p>Projet Hyphen&nbsp;: restaurer le lien m\u00e8re-enfant en contexte de violences domestiques. Module de formation, recherche-action, deux r\u00e9sidences \u00e0 M\u00e1laga et Marseille.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo=\"fan\" aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:55;--by:55;--bw:390;--bh:390\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-le-grand-bleu.jpg\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:22%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:87%;--y:55%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:87%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Jeunesse & sport<\/p>\r\n        <p class=\"place\">Quartiers Nord de Marseille<\/p>\r\n        <h3>Le Grand Bleu<\/h3>\r\n        <p>Mobilit\u00e9 Erasmus+ pour 30 jeunes des quartiers Nord dans trois pays europ\u00e9ens&nbsp;: engagement citoyen et appartenance europ\u00e9enne par le sport.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:37;--by:199;--bw:383;--bh:106\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/action-bomaye.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-gr\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Culture & insertion<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Gr\u00e8ce<\/p>\r\n        <h3>Action Bomaye \u00d7 Balkania<\/h3>\r\n        <p>Cin\u00e9ma et insertion socio-professionnelle&nbsp;: s\u00e9ances plein air, master classes, formation \u00e0 la r\u00e9alisation, r\u00e9duction de l\u2019empreinte carbone des festivals.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:125;--by:77;--bw:246;--bh:327\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Tesslab.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node duo-hub\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 24 24\"><path d=\"M12 12 6 6.5M12 12l6-5M12 12l5.2 6.5M12 12l-6 5.5\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><circle cx=\"6\" cy=\"6.5\" r=\"1.9\"\/><circle cx=\"18\" cy=\"7\" r=\"1.9\"\/><circle cx=\"17.2\" cy=\"18.5\" r=\"1.9\"\/><circle cx=\"6\" cy=\"17.5\" r=\"1.9\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>FSE+<\/span><\/div>\r\n        <p class=\"theme\">Insertion professionnelle<\/p>\r\n        <p class=\"place\">Strasbourg<\/p>\r\n        <h3>Tesslab<\/h3>\r\n        <p>Renforcer l\u2019insertion des publics \u00e9loign\u00e9s de l\u2019emploi via un parcours de formation-action ancr\u00e9 dans l\u2019ESS, avec mobilisation du hub inter-associatif.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:0;--by:218;--bw:500;--bh:63\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Groupe-dispersion.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pl\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Art & inclusion des jeunes<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Pologne<\/p>\r\n        <h3>Groupe Dispersion \u00d7 Fundacja CEL<\/h3>\r\n        <p>Des autoportraits film\u00e9s pour redonner la parole \u00e0 des jeunes en situation d\u2019exclusion&nbsp;: ateliers participatifs, film collectif, projections-d\u00e9bats et livret p\u00e9dagogique pour transmettre la m\u00e9thode.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:14;--by:189;--bw:473;--bh:120\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/lOEIL-DU-LOUP.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-dk\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Pr\u00e9vention & \u00e9ducation<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Danemark<\/p>\r\n        <h3>L\u2019\u0152il du Loup<\/h3>\r\n        <p>Skills for Consent&nbsp;: une bo\u00eete \u00e0 outils de 23 activit\u00e9s pour pr\u00e9venir les violences sexistes et sexuelles d\u00e8s l\u2019enfance, con\u00e7ue avec des enseignants et des professionnels de l\u2019enfance.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:75;--by:155;--bw:364;--bh:202\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/DDA.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-pt\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Art & durabilit\u00e9<\/p>\r\n        <p class=\"place\">France \u00d7 Portugal<\/p>\r\n        <h3>DDA Contemporary Art \u00d7 Eruditembrace<\/h3>\r\n        <p>Laboratoire de bonnes pratiques \u00e9cologiques pour r\u00e9inventer l\u2019art de mani\u00e8re durable&nbsp;: approche holistique, interdisciplinaire, publics vari\u00e9s.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo=\"fan\" aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-ajar.png\" alt=\"\" width=\"601\" height=\"240\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:22%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-ro\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:87%;--y:55%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:80%;--y:87%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-se\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+ \u00b7 Europe Cr\u00e9ative<\/span><\/div>\r\n        <p class=\"theme\">\u00c9ducation aux m\u00e9dias<\/p>\r\n        <p class=\"place\">Paris \u00d7 Roumanie, Espagne, Su\u00e8de<\/p>\r\n        <h3>AJAR<\/h3>\r\n        <p>Projet MEDIAWISE&nbsp;: l\u2019\u00e9ducation aux m\u00e9dias au service de l\u2019inclusion et de la participation d\u00e9mocratique de femmes issues de minorit\u00e9s, avec 20 \u00e9ducatrices form\u00e9es et un kit p\u00e9dagogique trilingue.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-e2c.png\" alt=\"\" width=\"440\" height=\"429\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-ie\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Insertion & mobilit\u00e9<\/p>\r\n        <p class=\"place\">Nantes \u00d7 Irlande<\/p>\r\n        <h3>\u00c9COLE DE LA DEUXI\u00c8ME CHANCE<\/h3>\r\n        <p>Projet READY+&nbsp;: pr\u00e9parer des adultes vuln\u00e9rables \u00e0 la mobilit\u00e9 europ\u00e9enne et \u00e0 l\u2019emploi durable, avec un cadre m\u00e9thodologique, des outils p\u00e9dagogiques et une phase pilote en France et en Irlande.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:25;--by:17;--bw:442;--bh:442\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/fifrelin.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-be\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">\u00c9galit\u00e9 & inclusion<\/p>\r\n        <p class=\"place\">La Ciotat \u00d7 Belgique<\/p>\r\n        <h3>Association Fifrelin<\/h3>\r\n        <p>Rompre l\u2019isolement des femmes confront\u00e9es aux discriminations par le sport et la culture&nbsp;: confiance en soi, autonomie, pouvoir d\u2019agir, et des pratiques partag\u00e9es entre structures partenaires.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-ferme-uhaldia.png\" alt=\"\" width=\"144\" height=\"56\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-es\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Agriculture & insertion<\/p>\r\n        <p class=\"place\">Pays basque \u00d7 Espagne<\/p>\r\n        <h3>La Ferme d\u2019Uhaldia<\/h3>\r\n        <p>Des mobilit\u00e9s en Espagne pour des personnes en insertion&nbsp;: agriculture \u00e9cologique, alimentation durable et nouvelles m\u00e9thodes d\u2019accompagnement socio-professionnel.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:160\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:33;--by:110;--bw:452;--bh:278\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/LA-FORET-EN-PAPIER.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-it\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Lecture & m\u00e9diation culturelle<\/p>\r\n        <p class=\"place\">Aix-Marseille \u00d7 Italie<\/p>\r\n        <h3>La For\u00eat en papier<\/h3>\r\n        <p>Les \u00ab Silent Books \u00bb, livres sans texte, pour ouvrir la lecture aux enfants et aux familles qui en sont \u00e9loign\u00e9s&nbsp;: une m\u00e9thode inclusive et des outils pour les professionnels de l\u2019\u00e9ducation.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal>\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:41;--by:127;--bw:408;--bh:255\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/le-facteur-independant.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node\" style=\"--x:83%;--y:56%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-be\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Sant\u00e9 mentale & inclusion<\/p>\r\n        <p class=\"place\">Marseille \u00d7 Belgique<\/p>\r\n        <h3>Le Facteur Ind\u00e9pendant<\/h3>\r\n        <p>\u00c9changes europ\u00e9ens et formations en \u00e9ducation non formelle pour des adultes qui ont le moins d\u2019opportunit\u00e9s, notamment face \u00e0 des troubles psychiques&nbsp;: outils p\u00e9dagogiques et participation citoyenne.<\/p>\r\n      <\/article>\r\n      <article class=\"project\" data-reveal style=\"--d:80\">\r\n        <div class=\"duo\" data-duo aria-hidden=\"true\"><svg class=\"duo-arc\"><\/svg><span class=\"duo-home duo-fit\" style=\"--bx:0;--by:0;--bw:225;--bh:225;--n:225\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2023\/03\/20211213171930-logoopen-lande-1.jpg\" alt=\"\" width=\"225\" height=\"225\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"duo-node is-sm\" style=\"--x:82%;--y:30%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-it\"\/><\/svg><\/span><span class=\"duo-node is-sm\" style=\"--x:82%;--y:78%\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-gr\"\/><\/svg><\/span><span class=\"duo-seal\"><svg viewbox=\"0 0 36 36\"><use href=\"#fl-eu\"\/><\/svg>Erasmus+<\/span><\/div>\r\n        <p class=\"theme\">Engagement citoyen<\/p>\r\n        <p class=\"place\">Pays basque \u00d7 Italie, Gr\u00e8ce<\/p>\r\n        <h3>Open Lande<\/h3>\r\n        <p>Former des acteurs associatifs en France et en Italie \u00e0 transformer leurs actions en exp\u00e9riences accessibles, pour toucher de nouveaux publics, notamment les plus \u00e9loign\u00e9s, et favoriser l\u2019engagement citoyen.<\/p>\r\n      <\/article>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== T\u00e9moignages ============================== -->\r\n<section class=\"section\" id=\"temoignages\" aria-labelledby=\"avis-title\" style=\"--h:var(--x2)\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>\u00b7<\/span> Ce qu\u2019elles en disent<\/p>\r\n        <h2 class=\"sec-title\" id=\"avis-title\">Des associations qui <em>s\u2019approprient les outils.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Neuf capsules vid\u00e9o&nbsp;: les associations accompagn\u00e9es racontent, face cam\u00e9ra, ce que l\u2019accompagnement a chang\u00e9 pour elles.<\/p>\r\n    <\/div>\r\n    <div class=\"vids\" data-vids data-reveal>\r\n      <div class=\"vid-stage\">\r\n        <div class=\"vid-frame\" data-vid-frame>\r\n          <img loading=\"lazy\" class=\"vid-poster\" data-vid-poster src=\"https:\/\/i.ytimg.com\/vi\/DniqlqYC4OI\/maxresdefault.jpg\" alt=\"\" width=\"1280\" height=\"720\" decoding=\"async\">\r\n          <div class=\"vid-cap\" aria-hidden=\"true\"><p class=\"vid-kicker\"><span>Capsule vid\u00e9o<\/span><span data-vid-dur>1:40<\/span><\/p><p class=\"vid-title\" data-vid-title>Association Fifrelin<\/p><p class=\"vid-sub\" data-vid-sub>La Ciotat \u00b7 inclusion sociale<\/p><\/div>\r\n          <button class=\"vid-play\" type=\"button\" data-vid-play aria-label=\"Lire la vid\u00e9o\"><svg viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8.5 5.8v12.4a.9.9 0 0 0 1.37.77l10-6.2a.9.9 0 0 0 0-1.54l-10-6.2a.9.9 0 0 0-1.37.77z\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vid-side\">\r\n        <p class=\"vid-head\"><span>9 capsules<\/span><\/p>\r\n        <ol class=\"vid-list\" aria-label=\"Capsules vid\u00e9o des associations\">\r\n        <li><button class=\"vid-item is-on\" type=\"button\" data-vid=\"DniqlqYC4OI\" aria-pressed=\"true\" style=\"--c:var(--t2)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/DniqlqYC4OI\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:40<\/span><\/span><span class=\"vid-meta\"><b>Association Fifrelin<\/b><span>La Ciotat \u00b7 inclusion sociale<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"5ajbRhhseEI\" aria-pressed=\"false\" style=\"--c:var(--t8)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/5ajbRhhseEI\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:39<\/span><\/span><span class=\"vid-meta\"><b>En Majuscule<\/b><span>Marseille \u00b7 projets num\u00e9riques<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"yM573lEaPh8\" aria-pressed=\"false\" style=\"--c:var(--t1)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/yM573lEaPh8\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:16<\/span><\/span><span class=\"vid-meta\"><b>Action Bomaye<\/b><span>Marseille \u00b7 cin\u00e9ma et insertion<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"eILCl86NA_o\" aria-pressed=\"false\" style=\"--c:var(--t6)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/eILCl86NA_o\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:05<\/span><\/span><span class=\"vid-meta\"><b>Hatoup!<\/b><span>Marseille \u00b7 mobilit\u00e9 jeunesse<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"y_uC4omhlls\" aria-pressed=\"false\" style=\"--c:var(--t5)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/y_uC4omhlls\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:59<\/span><\/span><span class=\"vid-meta\"><b>La For\u00eat en papier<\/b><span>Aix-Marseille \u00b7 m\u00e9diation culturelle<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"ssh5QegH3YI\" aria-pressed=\"false\" style=\"--c:var(--t3)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/ssh5QegH3YI\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:43<\/span><\/span><span class=\"vid-meta\"><b>Terre Ludique<\/b><span>Aix-Marseille \u00b7 inclusion sociale<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"61UHy-zD1zg\" aria-pressed=\"false\" style=\"--c:var(--t9)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/61UHy-zD1zg\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:48<\/span><\/span><span class=\"vid-meta\"><b>Martigues Sport Athl\u00e9tisme<\/b><span>Martigues \u00b7 jeunesse et sport<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"fN8BeO-cKLc\" aria-pressed=\"false\" style=\"--c:var(--t4)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/fN8BeO-cKLc\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">1:42<\/span><\/span><span class=\"vid-meta\"><b>Les Cols Verts Provence<\/b><span>La Ciotat \u00b7 transition \u00e9cologique<\/span><\/span><\/button><\/li>\r\n        <li><button class=\"vid-item\" type=\"button\" data-vid=\"EpO_K-Fi548\" aria-pressed=\"false\" style=\"--c:var(--t10)\"><span class=\"vid-thumb\"><img src=\"https:\/\/i.ytimg.com\/vi\/EpO_K-Fi548\/mqdefault.jpg\" alt=\"\" width=\"320\" height=\"180\" loading=\"lazy\" decoding=\"async\"><span class=\"vid-dur\">2:04<\/span><\/span><span class=\"vid-meta\"><b>\u00c9cole de la 2e chance<\/b><span>Nantes \u00b7 inclusion sociale<\/span><\/span><\/button><\/li>\r\n        <\/ol>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 05 Confiance ============================== -->\r\n<section class=\"section tint\" aria-labelledby=\"confiance-title\" style=\"--h:var(--x6)\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>05<\/span> Pourquoi nous faire confiance<\/p>\r\n        <h2 class=\"sec-title\" id=\"confiance-title\">Trois garanties au service <em>de votre projet.<\/em><\/h2>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"bento trust\">\r\n      <article class=\"bc\" style=\"--c:var(--t1);--cx:var(--x1)\" data-reveal>\r\n        <div class=\"bc-stage sc-ros\" data-scene=\"terrain\" aria-hidden=\"true\">\r\n          <div class=\"ros\">\r\n            <div class=\"ros-side\">\r\n              <p class=\"ros-num\"><span data-odo>150<\/span>+<\/p>\r\n              <p class=\"ros-cap\">associations accompagn\u00e9es partout en France<\/p>\r\n            <\/div>\r\n            <div class=\"ros-roll\">\r\n              <div class=\"ros-track\">\r\n                <ul class=\"ros-list\">\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-action-bomaye.png\" alt=\"\" width=\"240\" height=\"61\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Action Bomaye<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>art et quartiers<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-k-pab6t.png\" alt=\"\" width=\"96\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>K-Pab6T<\/b><small><em>La R\u00e9union<\/em><i> \u00b7 <\/i>innovation sociale<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:55;--by:55;--bw:390;--bh:390\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-le-grand-bleu.jpg\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Le Grand Bleu<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>sport inclusif<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-la-farandole.png\" alt=\"\" width=\"146\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Centre social La Farandole<\/b><small><em>Istres<\/em><i> \u00b7 <\/i>services de proximit\u00e9<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-ferme-uhaldia.png\" alt=\"\" width=\"144\" height=\"56\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>La Ferme d\u2019Uhaldia<\/b><small><em>Pays basque<\/em><i> \u00b7 <\/i>climat et \u00e9ducation<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-acelem.png\" alt=\"\" width=\"240\" height=\"93\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Acelem<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>r\u00e9ussite scolaire<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:8;--by:164;--bw:488;--bh:171\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Solidarite-femmes-13.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Solidarit\u00e9 Femmes 13<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>femmes et m\u00e8res isol\u00e9es<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-nos-vies-nos-avis.png\" alt=\"\" width=\"96\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Nos vies nos avis<\/b><small><em>Nouvelle-Cal\u00e9donie<\/em><i> \u00b7 <\/i>participation citoyenne<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-la-regie-port-de-bouc.png\" alt=\"\" width=\"240\" height=\"79\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>R\u00e9gie de quartier<\/b><small><em>Port-de-Bouc<\/em><i> \u00b7 <\/i>insertion par l\u2019emploi<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-le-paysan-urbain.png\" alt=\"\" width=\"225\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Le Paysan Urbain<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>agriculture urbaine<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-asc-littoral.png\" alt=\"\" width=\"150\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>ASC Littoral<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>sport et jeunesse<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:75;--by:155;--bw:364;--bh:202\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/DDA.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>DDA Contemporary Art<\/b><small><em>Aix-Marseille<\/em><i> \u00b7 <\/i>art contemporain<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-clse.png\" alt=\"\" width=\"113\" height=\"47\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>CLSE<\/b><small><em>Outre-mer<\/em><i> \u00b7 <\/i>transition \u00e9cologique<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-centre-social-fabien-menot.png\" alt=\"\" width=\"183\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Centre social Fabien Menot<\/b><small><em>Port-de-Bouc<\/em><i> \u00b7 <\/i>familles et jeunesse<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-petites-cantines.png\" alt=\"\" width=\"96\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Les Petites Cantines<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>cantine de quartier<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-ancrages.png\" alt=\"\" width=\"240\" height=\"62\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Ancrages<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>formation \u00e0 l\u2019\u00e9galit\u00e9<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-marseille-nord-handball.png\" alt=\"\" width=\"92\" height=\"86\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Marseille Nord Handball<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>sport pour les jeunes<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo duo-fit\" style=\"--bx:14;--by:189;--bw:473;--bh:120\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/lOEIL-DU-LOUP.png\" alt=\"\" width=\"500\" height=\"500\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>L\u2019\u0152il du Loup<\/b><small><em>Aix-Marseille<\/em><i> \u00b7 <\/i>publics vuln\u00e9rables<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-marseille-sans-frontieres.png\" alt=\"\" width=\"104\" height=\"96\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Marseille Sans Fronti\u00e8res<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>projets \u00e9ducatifs<\/small><\/span><\/li>\r\n                  <li><span class=\"ros-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/09\/shl-accueil-centre-social-del-rio.png\" alt=\"\" width=\"58\" height=\"53\" loading=\"lazy\" decoding=\"async\"><\/span><span class=\"ros-tx\"><b>Centre social Del Rio<\/b><small><em>Marseille<\/em><i> \u00b7 <\/i>inclusion sociale<\/small><\/span><\/li>\r\n                <\/ul>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">01<\/p>\r\n          <h3>Une expertise \u00e9prouv\u00e9e sur le terrain<\/h3>\r\n          <p><b>150+ associations accompagn\u00e9es partout en France<\/b>, dont une majorit\u00e9 issue des quartiers prioritaires, de territoires ruraux ou ultramarins. Des parcours adapt\u00e9s aux r\u00e9alit\u00e9s associatives&nbsp;: manque de temps, \u00e9quipes mixtes b\u00e9n\u00e9voles et salari\u00e9s, niveaux d\u2019exp\u00e9rience diff\u00e9rents.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--t7);--cx:var(--x7); --d:80\" data-reveal>\r\n        <div class=\"bc-stage sc-anc\" data-scene=\"ancrage\" aria-hidden=\"true\">\r\n          <p class=\"sc-cap\"><i><\/i><span data-cap-text>Tout le r\u00e9seau \u00b7 6 partenaires<\/span><\/p>\r\n          <p class=\"sc-count\" data-fam-count>04 \/ 04<\/p>\r\n          <div class=\"anc\">\r\n            <svg class=\"anc-wires\"><g class=\"anc-base\"><\/g><g class=\"anc-live\"><\/g><\/svg>\r\n            <div class=\"anc-hub\">\r\n              <span class=\"anc-rings\"><i><\/i><i><\/i><i><\/i><\/span>\r\n              <span class=\"anc-core\"><img decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"54\" height=\"54\" loading=\"lazy\"><\/span>\r\n              <b>Social Hackers Lab<\/b>\r\n            <\/div>\r\n            <div class=\"anc-fams\">\r\n              <div class=\"anc-fam\" data-k=\"pub\" data-cap=\"Publics \u00b7 4 partenaires\"><span class=\"anc-tag\"><i><svg class=\"ic\"><use href=\"#ic-pub\"\/><\/svg><\/i>Publics<span class=\"sc-timer\"><\/span><\/span><ul><li><i class=\"anc-logo\"><img class=\"is-mark\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri-300x48.png\" alt=\"\" width=\"300\" height=\"48\" loading=\"lazy\" decoding=\"async\"><\/i><span>M\u00e9tropole Aix-Marseille<\/span><\/li><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901-300x111.png\" alt=\"\" width=\"300\" height=\"111\" loading=\"lazy\" decoding=\"async\"><\/i><span>ANCT<\/span><\/li><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_-300x102.webp\" alt=\"\" width=\"300\" height=\"102\" loading=\"lazy\" decoding=\"async\"><\/i><span>D\u00e9partement de l\u2019Essonne<\/span><\/li><li><i class=\"anc-logo\"><svg class=\"is-flag\"><use href=\"#fl-fr\"\/><\/svg><\/i><span>DDETS<\/span><\/li><\/ul><\/div>\r\n              <div class=\"anc-fam\" data-k=\"eu\" data-cap=\"Europ\u00e9ens \u00b7 1 partenaire\"><span class=\"anc-tag\"><i class=\"is-flag\"><svg><use href=\"#fl-eu\"\/><\/svg><\/i>Europ\u00e9ens<span class=\"sc-timer\"><\/span><\/span><ul><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/images-300x100.png\" alt=\"\" width=\"300\" height=\"100\" loading=\"lazy\" decoding=\"async\"><\/i><span>Agence Erasmus+<\/span><\/li><\/ul><\/div>\r\n              <div class=\"anc-fam\" data-k=\"pri\" data-cap=\"R\u00e9seaux \u00b7 1 partenaire\"><span class=\"anc-tag\"><i><svg class=\"ic\"><use href=\"#ic-users\"\/><\/svg><\/i>R\u00e9seaux<span class=\"sc-timer\"><\/span><\/span><ul><li><i class=\"anc-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-fin-villes-territoires-occitanie.png\" alt=\"\" width=\"176\" height=\"81\" loading=\"lazy\" decoding=\"async\"><\/i><span>Villes et Territoires Occitanie<\/span><\/li><\/ul><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">02<\/p>\r\n          <h3>Un ancrage institutionnel solide<\/h3>\r\n          <p>L\u2019incubateur s\u2019appuie sur des partenaires publics et europ\u00e9ens, et sur des r\u00e9seaux territoriaux&nbsp;: <b>M\u00e9tropole Aix-Marseille-Provence, ANCT, D\u00e9partement de l\u2019Essonne, DDETS, agence Erasmus+, Villes et Territoires Occitanie<\/b>\u2026<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc bc-wide\" style=\"--c:var(--t5);--cx:var(--x5); --d:160\" data-reveal>\r\n        <div class=\"bc-stage sc-tra is-done\" data-scene=\"transfert\" style=\"--p:1\" aria-hidden=\"true\">\r\n          <span class=\"tra-glow is-shl\"><\/span>\r\n          <span class=\"tra-glow is-you\"><\/span>\r\n          <div class=\"tra\">\r\n            <div class=\"tra-head\">\r\n              <div class=\"tra-who is-shl\"><span class=\"tra-av\"><img decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"30\" height=\"30\" loading=\"lazy\"><\/span><p><b>Social Hackers Lab<\/b><small><span>Accompagne<\/span><span>Se retire<\/span><\/small><\/p><\/div>\r\n              <div class=\"tra-meter\"><p><span>Autonomie<\/span><b data-pct>100&nbsp;%<\/b><\/p><span class=\"tra-bar\"><i><\/i><\/span><\/div>\r\n              <div class=\"tra-who is-you\"><span class=\"tra-av\"><svg class=\"ic\"><use href=\"#ic-users\"\/><\/svg><b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><\/span><p><b>Votre \u00e9quipe<\/b><small><span>Apprend<\/span><span>Autonome<\/span><\/small><\/p><\/div>\r\n            <\/div>\r\n            <ol class=\"tra-rows\">\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-compass\"\/><\/svg><\/i>Montage<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-tool\"\/><\/svg><\/i>Outils<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-read\"\/><\/svg><\/i>Relecture<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n              <li class=\"tra-row is-moved is-yours\"><span class=\"tra-slot\"><\/span><span class=\"tra-lane\"><\/span><span class=\"tra-slot\"><\/span><span class=\"tra-key\"><span class=\"tra-chip\"><i><svg class=\"ic\"><use href=\"#ic-shield\"\/><\/svg><\/i>S\u00e9curisation<b class=\"tra-ok\"><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/b><span class=\"sc-timer\"><\/span><\/span><\/span><\/li>\r\n            <\/ol>\r\n            <p class=\"tra-note\"><i><svg class=\"ic\"><use href=\"#ic-check\"\/><\/svg><\/i>90&nbsp;% des structures red\u00e9posent en autonomie l\u2019ann\u00e9e suivante<span class=\"sc-timer\"><\/span><\/p>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">03<\/p>\r\n          <h3>Le transfert de comp\u00e9tences comme principe<\/h3>\r\n          <p>Notre mission n\u2019est pas de faire \u00e0 la place des associations, mais de leur transmettre les cl\u00e9s pour agir seules demain. Nous accompagnons, outillons, relisons, s\u00e9curisons&nbsp;: <b>l\u2019objectif final reste l\u2019autonomie.<\/b><\/p>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 06 Collectivit\u00e9s et acteurs publics ============================== -->\r\n<section class=\"section public\" id=\"collectivites\" aria-labelledby=\"public-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"pub-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>06<\/span> Collectivit\u00e9s et acteurs publics<\/p>\r\n        <h2 class=\"sec-title\" id=\"public-title\">Pour les collectivit\u00e9s <em>et les acteurs publics.<\/em><\/h2>\r\n      <\/div>\r\n      <div class=\"pub-intro\" data-reveal style=\"--d:120\">\r\n        <p class=\"sec-copy\">M\u00e9tropoles, d\u00e9partements, intercommunalit\u00e9s, services de l\u2019\u00c9tat&nbsp;: vous accompagnez au quotidien des associations engag\u00e9es au plus pr\u00e8s des habitants.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <ul class=\"pub-points\">\r\n      <li class=\"pub-point\" data-reveal style=\"--c:var(--t7);--cx:var(--x7)\">\r\n        <p class=\"bc-kicker\">01<\/p>\r\n        <h3>Concevoir des dispositifs<\/h3>\r\n        <p>Nous concevons avec vous des dispositifs qui renforcent leur capacit\u00e9 \u00e0 acc\u00e9der aux financements europ\u00e9ens et contribuent \u00e0 mobiliser davantage de ressources au b\u00e9n\u00e9fice de votre territoire.<\/p>\r\n      <\/li>\r\n      <li class=\"pub-point\" data-reveal style=\"--c:var(--t5);--cx:var(--x5);--d:80\">\r\n        <p class=\"bc-kicker\">02<\/p>\r\n        <h3>Former vos agents<\/h3>\r\n        <p>Nous accompagnons \u00e9galement la mont\u00e9e en comp\u00e9tence de vos agents \u00e0 travers des formations d\u00e9di\u00e9es&nbsp;: mieux comprendre les programmes europ\u00e9ens, identifier les opportunit\u00e9s adapt\u00e9es au territoire, orienter les porteurs de projets et int\u00e9grer plus efficacement les financements europ\u00e9ens dans les politiques publiques.<\/p>\r\n      <\/li>\r\n      <li class=\"pub-point\" data-reveal style=\"--c:var(--t9);--cx:var(--x9);--d:160\">\r\n        <p class=\"bc-kicker\">03<\/p>\r\n        <h3>Construire le parcours<\/h3>\r\n        <p>Vous d\u00e9finissez les priorit\u00e9s et les publics \u00e0 accompagner. Nous construisons le parcours&nbsp;: ing\u00e9nierie p\u00e9dagogique, formation, outils num\u00e9riques, accompagnement individualis\u00e9 et suivi jusqu\u2019au d\u00e9p\u00f4t des candidatures.<\/p>\r\n      <\/li>\r\n    <\/ul>\r\n    <p class=\"pub-sum\" data-reveal>Un dispositif pens\u00e9 avec le territoire, pour renforcer durablement les comp\u00e9tences de ses acteurs et leur acc\u00e8s aux financements europ\u00e9ens.<\/p>\r\n    <div class=\"pub-partners\">\r\n      <p class=\"pub-label\" data-reveal>Elles nous confient leur territoire<\/p>\r\n      <ul class=\"pub-cards\">\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t7);--cx:var(--x7)\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_LAMETROPOLE_H_quadri.png\" alt=\"\" width=\"837\" height=\"134\" style=\"--w:252px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">M\u00e9tropole \u00b7 R\u00e9gion Sud<\/p>\r\n            <h3>M\u00e9tropole Aix-Marseille-Provence<\/h3>\r\n            <p>Un incubateur associatif m\u00e9tropolitain, inscrit dans les dynamiques du Contrat de ville, pour accompagner les structures du territoire dans l\u2019acc\u00e8s aux financements europ\u00e9ens et la structuration de leurs projets.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t5);--cx:var(--x5);--d:80\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/Logo_Departement_Esssonne_-_2022.svg_.webp\" alt=\"\" width=\"960\" height=\"327\" style=\"--w:184px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">D\u00e9partement \u00b7 \u00cele-de-France<\/p>\r\n            <h3>D\u00e9partement de l\u2019Essonne<\/h3>\r\n            <p>Un incubateur associatif d\u00e9partemental&nbsp;: parcours de formation, autodiagnostic et ressourcerie en ligne pour les associations essonniennes.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t1);--cx:var(--x1)\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-montpellier-3m.png\" alt=\"\" width=\"359\" height=\"360\" style=\"--w:86px\" loading=\"lazy\" decoding=\"async\"><i class=\"pub-and\" aria-hidden=\"true\"><\/i><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-villes-territoires-occitanie.png\" alt=\"\" width=\"509\" height=\"225\" style=\"--w:150px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">Sept collectivit\u00e9s \u00b7 Occitanie<\/p>\r\n            <h3>Montpellier M\u00e9diterran\u00e9e M\u00e9tropole et l\u2019H\u00e9rault<\/h3>\r\n            <p>Avec Villes et Territoires Occitanie, une cohorte d\u00e9partementale financ\u00e9e par sept collectivit\u00e9s de l\u2019H\u00e9rault, de Montpellier \u00e0 Lod\u00e8ve.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n        <li class=\"pub-card\" data-reveal style=\"--c:var(--t3);--cx:var(--x3);--d:80\">\r\n          <span class=\"pub-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/10\/shl-accueil-col-ville-de-loos.png\" alt=\"\" width=\"642\" height=\"358\" style=\"--w:140px\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n          <div class=\"pub-body\">\r\n            <p class=\"bc-kicker\">Ville \u00b7 Hauts-de-France<\/p>\r\n            <h3>Ville de Loos<\/h3>\r\n            <p>Un accompagnement d\u00e9di\u00e9 aux acteurs de la Cit\u00e9 \u00e9ducative pour renforcer leur connaissance des financements europ\u00e9ens, faire \u00e9merger de nouvelles opportunit\u00e9s de coop\u00e9ration et accompagner la structuration de projets adapt\u00e9s aux besoins du territoire.<\/p>\r\n          <\/div>\r\n        <\/li>\r\n      <\/ul>\r\n      <div class=\"pub-anct\" data-reveal>\r\n        <span class=\"pub-anct-logo\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2026\/07\/logo_ANCT_header.20220901.png\" alt=\"Agence nationale de la coh\u00e9sion des territoires\" width=\"1280\" height=\"473\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n        <p>Au niveau national, nous travaillons avec l\u2019Agence nationale de la coh\u00e9sion des territoires (ANCT) pour les associations des quartiers prioritaires et des territoires ultramarins.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <p class=\"pub-label pub-label-2\" data-reveal>Un dispositif construit avec vous<\/p>\r\n    <div class=\"bento pub-bento\">\r\n      <article class=\"bc\" style=\"--c:var(--t9);--cx:var(--x9)\" data-reveal>\r\n        <div class=\"bc-stage sc-cal is-end\" data-scene=\"parcours\" style=\"--p:1\" aria-hidden=\"true\">\r\n          <div class=\"cal\">\r\n            <p class=\"cal-months\"><span data-s=\"S\">Sept<\/span><span data-s=\"O\">Oct<\/span><span data-s=\"N\">Nov<\/span><span data-s=\"D\">D\u00e9c<\/span><span data-s=\"J\">Janv<\/span><span data-s=\"F\">F\u00e9vr<\/span><\/p>\r\n            <span class=\"cal-grid\"><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:2\">Diagnostic<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:2\"><i class=\"cal-bar is-diag\" style=\"--a:0;--b:.9\"><\/i><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:3\">Ateliers collectifs<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:3\"><i class=\"cal-pill\" style=\"--a:1.05\"><\/i><i class=\"cal-pill\" style=\"--a:1.55\"><\/i><i class=\"cal-pill\" style=\"--a:2.05\"><\/i><i class=\"cal-pill\" style=\"--a:2.55\"><\/i><i class=\"cal-pill\" style=\"--a:3.05\"><\/i><i class=\"cal-pill\" style=\"--a:3.55\"><\/i><i class=\"cal-pill\" style=\"--a:4.05\"><\/i><i class=\"cal-pill\" style=\"--a:4.55\"><\/i><i class=\"cal-pill\" style=\"--a:5.05\"><\/i><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:4\">Suivi individuel<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:4\"><i class=\"cal-dot\" style=\"--a:2.3\"><\/i><i class=\"cal-dot\" style=\"--a:3\"><\/i><i class=\"cal-dot\" style=\"--a:3.5\"><\/i><i class=\"cal-dot\" style=\"--a:4\"><\/i><i class=\"cal-dot\" style=\"--a:4.35\"><\/i><i class=\"cal-dot\" style=\"--a:4.7\"><\/i><i class=\"cal-dot\" style=\"--a:5\"><\/i><i class=\"cal-dot\" style=\"--a:5.3\"><\/i><i class=\"cal-dot\" style=\"--a:5.55\"><\/i><i class=\"cal-dot\" style=\"--a:5.78\"><\/i><\/span>\r\n            <span class=\"cal-lab\" style=\"--r:5\">Ressourcerie en ligne<\/span>\r\n            <span class=\"cal-lane\" style=\"--r:5\"><i class=\"cal-bar is-res\" style=\"--a:.9;--b:6\"><\/i><\/span>\r\n            <span class=\"cal-head\"><\/span>\r\n            <span class=\"cal-end\"><\/span>\r\n            <p class=\"cal-dep\">D\u00e9p\u00f4t des dossiers<\/p>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">Ce que nous concevons<\/p>\r\n          <h3>Une ing\u00e9nierie p\u00e9dagogique sur mesure<\/h3>\r\n          <p>Nous partons de votre territoire&nbsp;: ses associations, ses quartiers, vos politiques publiques. Diagnostic, programme, calendrier et formats sont construits avec vos services, puis anim\u00e9s par notre \u00e9quipe, en pr\u00e9sentiel et \u00e0 distance.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n      <article class=\"bc\" style=\"--c:var(--t6);--cx:var(--x6);--d:100\" data-reveal>\r\n        <div class=\"bc-stage sc-kpi\" data-scene=\"pilotage\" aria-hidden=\"true\">\r\n          <div class=\"kpi is-cand is-sel is-dep is-fin\">\r\n            <div class=\"kpi-grid\"><i style=\"--i:11;--j:0\"><\/i><i style=\"--i:27;--j:4\"><\/i><i style=\"--i:26;--j:8\"><\/i><i class=\"is-in\" style=\"--i:36;--j:12\"><\/i><i class=\"is-in\" style=\"--i:35;--j:16\"><\/i><i class=\"is-in\" style=\"--i:0;--j:20\"><\/i><i class=\"is-in is-ok\" style=\"--i:33;--j:24\"><\/i><i class=\"is-in is-ok\" style=\"--i:22;--j:28\"><\/i><i class=\"is-in is-ok\" style=\"--i:8;--j:32\"><\/i><i class=\"is-in is-ok\" style=\"--i:38;--j:36\"><\/i><i style=\"--i:5;--j:1\"><\/i><i style=\"--i:9;--j:5\"><\/i><i style=\"--i:2;--j:9\"><\/i><i class=\"is-in\" style=\"--i:25;--j:13\"><\/i><i class=\"is-in\" style=\"--i:13;--j:17\"><\/i><i class=\"is-in\" style=\"--i:4;--j:21\"><\/i><i class=\"is-in is-ok\" style=\"--i:29;--j:25\"><\/i><i class=\"is-in is-ok\" style=\"--i:20;--j:29\"><\/i><i class=\"is-in is-ok\" style=\"--i:15;--j:33\"><\/i><i class=\"is-in is-ok\" style=\"--i:3;--j:37\"><\/i><i style=\"--i:39;--j:2\"><\/i><i style=\"--i:7;--j:6\"><\/i><i style=\"--i:16;--j:10\"><\/i><i class=\"is-in\" style=\"--i:32;--j:14\"><\/i><i class=\"is-in\" style=\"--i:19;--j:18\"><\/i><i class=\"is-in\" style=\"--i:37;--j:22\"><\/i><i class=\"is-in is-ok\" style=\"--i:23;--j:26\"><\/i><i class=\"is-in is-ok\" style=\"--i:18;--j:30\"><\/i><i class=\"is-in is-ok\" style=\"--i:12;--j:34\"><\/i><i class=\"is-in is-ok\" style=\"--i:30;--j:38\"><\/i><i style=\"--i:6;--j:3\"><\/i><i style=\"--i:17;--j:7\"><\/i><i style=\"--i:21;--j:11\"><\/i><i class=\"is-in\" style=\"--i:28;--j:15\"><\/i><i class=\"is-in\" style=\"--i:34;--j:19\"><\/i><i class=\"is-in\" style=\"--i:1;--j:23\"><\/i><i class=\"is-in is-ok\" style=\"--i:31;--j:27\"><\/i><i class=\"is-in is-ok\" style=\"--i:24;--j:31\"><\/i><i class=\"is-in is-ok\" style=\"--i:14;--j:35\"><\/i><i class=\"is-in is-ok\" style=\"--i:10;--j:39\"><\/i><\/div>\r\n            <ul class=\"kpi-key\">\r\n              <li class=\"is-on\"><i class=\"k-cand\"><\/i>Candidatures<\/li>\r\n              <li class=\"is-on\"><i class=\"k-dep\"><\/i>Dossiers d\u00e9pos\u00e9s<\/li>\r\n              <li class=\"is-on\"><i class=\"k-fin\"><\/i>Financements obtenus<\/li>\r\n            <\/ul>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"bc-head\">\r\n          <p class=\"bc-kicker\">Ce que vous pilotez<\/p>\r\n          <h3>Un dispositif cl\u00e9 en main, des r\u00e9sultats mesur\u00e9s<\/h3>\r\n          <p>Nous prenons en charge l\u2019appel \u00e0 candidatures, la mobilisation des structures, le suivi jusqu\u2019au d\u00e9p\u00f4t et le bilan. Vous suivez l\u2019avancement avec des indicateurs clairs, pr\u00e9sentables \u00e0 vos instances.<\/p>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n    <div class=\"pub-formats-head\" data-reveal>\r\n      <h3>Nos formats d\u2019intervention<\/h3>\r\n      <p>Pens\u00e9s pour les r\u00e9alit\u00e9s des \u00e9quipes associatives (b\u00e9n\u00e9voles et salari\u00e9s, temps limit\u00e9, niveaux d\u2019entr\u00e9e h\u00e9t\u00e9rog\u00e8nes), du plus l\u00e9ger au plus pouss\u00e9, et combinables dans un m\u00eame parcours.<\/p>\r\n    <\/div>\r\n    <div class=\"studio\" data-studio data-fmt=\"0\" data-reveal>\r\n      <div class=\"studio-nav\">\r\n        <span class=\"fmt-thumb\" aria-hidden=\"true\"><\/span>\r\n        <div class=\"studio-tabs\" role=\"tablist\" aria-label=\"Nos formats, du plus l\u00e9ger au plus pouss\u00e9\">\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-1\" aria-controls=\"fmt-1\" aria-selected=\"true\" style=\"--c:var(--t1);--cx:var(--x1);--hold:6.5s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">01<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i><\/i><i><\/i><i><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Journ\u00e9e d\u2019initiation<\/span>\r\n            <span class=\"fmt-meta\">1 journ\u00e9e \u00b7 15 \u00e0 25 pers.<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-2\" aria-controls=\"fmt-2\" aria-selected=\"false\" tabindex=\"-1\" style=\"--c:var(--t3);--cx:var(--x3);--hold:6.5s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">02<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><i><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Formation intensive<\/span>\r\n            <span class=\"fmt-meta\">2 \u00e0 3 jours \u00b7 \u00e9quipes internes<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-3\" aria-controls=\"fmt-3\" aria-selected=\"false\" tabindex=\"-1\" style=\"--c:var(--t5);--cx:var(--x5);--hold:11.2s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">03<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Cycle d\u2019ateliers<\/span>\r\n            <span class=\"fmt-meta\">6 \u00e0 10 s\u00e9ances \u00b7 15 \u00e0 40 pers.<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n          <button class=\"fmt-tab\" type=\"button\" role=\"tab\" id=\"fmt-tab-4\" aria-controls=\"fmt-4\" aria-selected=\"false\" tabindex=\"-1\" style=\"--c:var(--t9);--cx:var(--x9);--hold:8.2s\">\r\n            <span class=\"fmt-top\"><span class=\"fmt-n\">04<\/span><span class=\"scale\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><\/span><\/span>\r\n            <span class=\"fmt-name\">Accompagnement individuel<\/span>\r\n            <span class=\"fmt-meta\">Modulable \u00b7 porteur de projet<\/span>\r\n            <i class=\"fmt-timer\" aria-hidden=\"true\"><\/i>\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"studio-body\">\r\n        <div class=\"fmt-panels\">\r\n          <div class=\"fmt-panel is-on\" role=\"tabpanel\" id=\"fmt-1\" aria-labelledby=\"fmt-tab-1\" tabindex=\"0\" style=\"--c:var(--t1);--cx:var(--x1)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 01 \u00b7 Collectif<\/p>\r\n            <h3 style=\"--k:1\">Journ\u00e9e d\u2019initiation<\/h3>\r\n            <p style=\"--k:2\">Acculturation aux fonds europ\u00e9ens et identification des programmes adapt\u00e9s.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm\" aria-hidden=\"true\"><i class=\"on\"><\/i><\/dd><dd>1 journ\u00e9e<\/dd><\/div>\r\n              <div><dt>Groupe<\/dt><dd>15 \u00e0 25 personnes<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n          <div class=\"fmt-panel\" role=\"tabpanel\" id=\"fmt-2\" aria-labelledby=\"fmt-tab-2\" tabindex=\"0\" style=\"--c:var(--t3);--cx:var(--x3)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 02 \u00b7 En \u00e9quipe<\/p>\r\n            <h3 style=\"--k:1\">Formation intensive<\/h3>\r\n            <p style=\"--k:2\">Mont\u00e9e en comp\u00e9tences acc\u00e9l\u00e9r\u00e9e sur un programme cibl\u00e9.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><\/dd><dd>2 \u00e0 3 jours<\/dd><\/div>\r\n              <div><dt>Groupe<\/dt><dd>\u00c9quipes internes<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n          <div class=\"fmt-panel\" role=\"tabpanel\" id=\"fmt-3\" aria-labelledby=\"fmt-tab-3\" tabindex=\"0\" style=\"--c:var(--t5);--cx:var(--x5)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 03 \u00b7 Collectif et individuel<\/p>\r\n            <h3 style=\"--k:1\">Cycle d\u2019ateliers<\/h3>\r\n            <p style=\"--k:2\">Parcours complet du diagnostic jusqu\u2019au d\u00e9p\u00f4t, en alternance collectif et individuel.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm is-fine\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i><\/i><i><\/i><i><\/i><i><\/i><\/dd><dd>6 \u00e0 10 s\u00e9ances<\/dd><\/div>\r\n              <div><dt>Groupe<\/dt><dd>Cohorte de 15 \u00e0 40<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n          <div class=\"fmt-panel\" role=\"tabpanel\" id=\"fmt-4\" aria-labelledby=\"fmt-tab-4\" tabindex=\"0\" style=\"--c:var(--t9);--cx:var(--x9)\">\r\n            <p class=\"bc-kicker\" style=\"--k:0\">Format 04 \u00b7 Individuel<\/p>\r\n            <h3 style=\"--k:1\">Accompagnement individuel<\/h3>\r\n            <p style=\"--k:2\">Ing\u00e9nierie de dossier, recherche de partenaires, s\u00e9curisation du d\u00e9p\u00f4t.<\/p>\r\n            <dl class=\"fmt-specs\" style=\"--k:3\">\r\n              <div><dt>Dur\u00e9e<\/dt><dd class=\"rhythm is-open\" aria-hidden=\"true\"><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><i class=\"on\"><\/i><\/dd><dd>Modulable<\/dd><\/div>\r\n              <div><dt>Pour<\/dt><dd>Porteur de projet<\/dd><\/div>\r\n            <\/dl>\r\n          <\/div>\r\n        <\/div>\r\n        <figure class=\"stage-col\" aria-hidden=\"true\">\r\n          <div class=\"stage\">\r\n            <canvas><\/canvas>\r\n            <p class=\"stage-cap\"><i><\/i><span data-stage-cap>Pl\u00e9ni\u00e8re \u00b7 1 journ\u00e9e<\/span><\/p>\r\n            <p class=\"stage-fig\"><b>Fig. 03<\/b> \u00b7 <span data-stage-count>01 \/ 04<\/span><\/p>\r\n          <\/div>\r\n          <ul class=\"stage-key\">\r\n            <li><i class=\"k-part\"><\/i>Participants<\/li>\r\n            <li><i class=\"k-shl\"><\/i>\u00c9quipe SHL<\/li>\r\n            <li class=\"k-only\"><i class=\"k-mate\"><\/i>Partenaires<\/li>\r\n          <\/ul>\r\n        <\/figure>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"formats-cta\" data-reveal>\r\n      <svg class=\"cta-threads\" viewbox=\"0 0 800 240\" preserveaspectratio=\"none\" aria-hidden=\"true\">\r\n        <defs><path id=\"cta-thread\" d=\"M-400 120Q-300 -8-200 120T0 120T200 120T400 120T600 120T800 120T1000 120T1200 120T1400 120T1600 120\"\/><\/defs>\r\n        <g class=\"cta-bloom\"><g class=\"cta-flow\">\r\n          <use href=\"#cta-thread\" style=\"--c:var(--t1)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-40\" style=\"--c:var(--t2)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-80\" style=\"--c:var(--t3)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-120\" style=\"--c:var(--t4)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-160\" style=\"--c:var(--t5)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-200\" style=\"--c:var(--t6)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-240\" style=\"--c:var(--t7)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-280\" style=\"--c:var(--t8)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-320\" style=\"--c:var(--t9)\"\/>\r\n          <use href=\"#cta-thread\" x=\"-360\" style=\"--c:var(--t10)\"\/>\r\n        <\/g><\/g>\r\n      <\/svg>\r\n      <div class=\"cta-copy\">\r\n        <p class=\"cta-kicker\">Collectivit\u00e9s \u00b7 Services de l\u2019\u00c9tat \u00b7 Financeurs<\/p>\r\n        <p class=\"cta-text\">Construisons ensemble le dispositif de votre territoire.<\/p>\r\n      <\/div>\r\n      <a class=\"btn btn-light\" href=\"#contact\">\u00c9changer avec l\u2019\u00e9quipe <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 07 Ressourcerie ============================== -->\r\n<section class=\"section tint\" id=\"ressourcerie\" style=\"--h:var(--x3)\" aria-labelledby=\"hub-title\">\r\n  <div class=\"wrap hub\">\r\n    <div data-reveal>\r\n      <p class=\"sec-index\"><span>07<\/span> Ressourcerie num\u00e9rique<\/p>\r\n      <h2 class=\"sec-title\" id=\"hub-title\">Une ressourcerie au service <em>de l\u2019autonomie.<\/em><\/h2>\r\n      <p class=\"sec-copy\" style=\"margin-top:24px\">Le e-hub collaboratif met \u00e0 disposition des associations un ensemble de ressources p\u00e9dagogiques, m\u00e9thodologiques et num\u00e9riques pour les accompagner tout au long de leur mont\u00e9e en comp\u00e9tences.<\/p>\r\n      <p class=\"sec-copy\">Parcours de formation, trames budg\u00e9taires, veille sur les appels \u00e0 projets, cadre logique&nbsp;: tout reste accessible, m\u00eame apr\u00e8s l\u2019accompagnement.<\/p>\r\n      <a class=\"btn btn-ink\" href=\"#contact\">\u00catre accompagn\u00e9 <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/a>\r\n    <\/div>\r\n    <div class=\"res\" data-res>\r\n      <div class=\"res-stage\" aria-hidden=\"true\">\r\n        <div class=\"res-deck\">\r\n          <div class=\"res-card is-front\" data-kind=\"parcours\" style=\"--p:0;--k:var(--t3);--kx:var(--x3)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">P\u00e9dagogique<\/p><p class=\"res-title\">Parcours de formation<\/p><p class=\"res-meta\">Mont\u00e9e en comp\u00e9tences<\/p><\/div>\r\n            <div class=\"res-body par\">\r\n              <div class=\"par-fig\">\r\n                <svg class=\"par-art\" viewbox=\"0 0 400 132\">\r\n                  <defs>\r\n                    <lineargradient id=\"res-par-fade\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"currentColor\" stop-opacity=\".24\"\/><stop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0\"\/><\/lineargradient>\r\n                    <clippath id=\"res-par-clip\"><rect class=\"par-reveal\" x=\"0\" y=\"0\" width=\"400\" height=\"132\"\/><\/clippath>\r\n                  <\/defs>\r\n                  <path class=\"par-floor\" d=\"M16 124.5H384\"\/>\r\n                  <g class=\"par-drops\"><path class=\"is-on\" d=\"M40 116V124\"\/><path class=\"is-on\" d=\"M120 103V124\"\/><path class=\"is-on\" d=\"M200 74V124\"\/><path class=\"is-on\" d=\"M280 45V124\"\/><path class=\"is-on\" d=\"M360 32V124\"\/><\/g>\r\n                  <path class=\"par-area\" fill=\"url(#res-par-fade)\" clip-path=\"url(#res-par-clip)\" d=\"M40 107.1 48 106.4 56 105.6 64 104.7 72 103.6 80 102.5 88 101.1 96 99.7 104 98.0 112 96.2 120 94.2 128 92.0 136 89.6 144 87.1 152 84.3 160 81.4 168 78.3 176 75.1 184 71.8 192 68.4 200 65.0 208 61.6 216 58.2 224 54.9 232 51.7 240 48.6 248 45.7 256 42.9 264 40.4 272 38.0 280 35.8 288 33.8 296 32.0 304 30.3 312 28.9 320 27.5 328 26.4 336 25.3 344 24.4 352 23.6 360 22.9V124.5H40Z\"\/>\r\n                  <path class=\"par-way\" d=\"M40 107.1 48 106.4 56 105.6 64 104.7 72 103.6 80 102.5 88 101.1 96 99.7 104 98.0 112 96.2 120 94.2 128 92.0 136 89.6 144 87.1 152 84.3 160 81.4 168 78.3 176 75.1 184 71.8 192 68.4 200 65.0 208 61.6 216 58.2 224 54.9 232 51.7 240 48.6 248 45.7 256 42.9 264 40.4 272 38.0 280 35.8 288 33.8 296 32.0 304 30.3 312 28.9 320 27.5 328 26.4 336 25.3 344 24.4 352 23.6 360 22.9\"\/>\r\n                  <path class=\"par-trail\" pathlength=\"1\" d=\"M40 107.1 48 106.4 56 105.6 64 104.7 72 103.6 80 102.5 88 101.1 96 99.7 104 98.0 112 96.2 120 94.2 128 92.0 136 89.6 144 87.1 152 84.3 160 81.4 168 78.3 176 75.1 184 71.8 192 68.4 200 65.0 208 61.6 216 58.2 224 54.9 232 51.7 240 48.6 248 45.7 256 42.9 264 40.4 272 38.0 280 35.8 288 33.8 296 32.0 304 30.3 312 28.9 320 27.5 328 26.4 336 25.3 344 24.4 352 23.6 360 22.9\"\/>\r\n                  <g class=\"par-nodes\"><circle class=\"is-on\" cx=\"40\" cy=\"107.1\" r=\"5\"\/><circle class=\"is-on\" cx=\"120\" cy=\"94.2\" r=\"5\"\/><circle class=\"is-on\" cx=\"200\" cy=\"65\" r=\"5\"\/><circle class=\"is-on\" cx=\"280\" cy=\"35.8\" r=\"5\"\/><circle class=\"is-on\" cx=\"360\" cy=\"22.9\" r=\"5\"\/><\/g>\r\n                  <circle class=\"par-halo\" cx=\"360\" cy=\"22.9\" r=\"13\"\/>\r\n                  <circle class=\"par-dot\" cx=\"360\" cy=\"22.9\" r=\"6.5\"\/>\r\n                <\/svg>\r\n                <p class=\"par-axis\">Comp\u00e9tences<\/p>\r\n              <\/div>\r\n              <ol class=\"par-caps\"><li class=\"is-on\"><b>01<\/b>M\u00e9thode<\/li><li class=\"is-on\"><b>02<\/b>Cadre logique<\/li><li class=\"is-on\"><b>03<\/b>Budget<\/li><li class=\"is-on\"><b>04<\/b>R\u00e9seau<\/li><li class=\"is-on\"><b>05<\/b>D\u00e9p\u00f4t<\/li><\/ol>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"res-card\" data-kind=\"budget\" style=\"--p:1;--k:var(--t5);--kx:var(--x5)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">M\u00e9thodologique<\/p><p class=\"res-title\">Trame budg\u00e9taire<\/p><p class=\"res-meta\">Budget pr\u00e9visionnel<\/p><\/div>\r\n            <div class=\"res-body bud\">\r\n              <i class=\"bud-hl\"><\/i>\r\n              <div class=\"bud-row bud-th\"><span>Poste<\/span><span>R\u00e9partition<\/span><span>Montant<\/span><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:100%\"><span>Personnel<\/span><i><\/i><b>18&#8239;400&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:34%\"><span>D\u00e9placements<\/span><i><\/i><b>6&#8239;200&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:17%\"><span>\u00c9quipements<\/span><i><\/i><b>3&#8239;100&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:12.5%\"><span>Communication<\/span><i><\/i><b>2&#8239;300&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row is-on\" style=\"--w:11.4%\"><span>Co\u00fbts indirects (7&nbsp;%)<\/span><i><\/i><b>2&#8239;100&nbsp;\u20ac<\/b><\/div>\r\n              <div class=\"bud-row bud-total is-on\"><span>Total du projet<\/span><i><\/i><b>32&#8239;100&nbsp;\u20ac<\/b><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"res-card\" data-kind=\"veille\" style=\"--p:2;--k:var(--t7);--kx:var(--x7)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">Num\u00e9rique<\/p><p class=\"res-title\">Veille des appels \u00e0 projets<\/p><p class=\"res-meta\">Programmes europ\u00e9ens<\/p><\/div>\r\n            <ul class=\"res-body vei\">\r\n              <li class=\"vei-new\"><span>Erasmus+<small>Partenariats de coop\u00e9ration<\/small><\/span><em>Nouvel appel<\/em><\/li>\r\n              <li><span>CERV<small>Citoyens, \u00e9galit\u00e9, droits et valeurs<\/small><\/span><em>Citoyennet\u00e9<\/em><\/li>\r\n              <li><span>Europe cr\u00e9ative<small>Projets de coop\u00e9ration europ\u00e9enne<\/small><\/span><em>Culture<\/em><\/li>\r\n              <li><span>Corps europ\u00e9en de solidarit\u00e9<small>Projets de solidarit\u00e9<\/small><\/span><em>Jeunesse<\/em><\/li>\r\n            <\/ul>\r\n          <\/div>\r\n          <div class=\"res-card\" data-kind=\"cadre\" style=\"--p:3;--k:var(--t9);--kx:var(--x9)\">\r\n            <div class=\"res-head\"><p class=\"res-kind\">M\u00e9thodologique<\/p><p class=\"res-title\">Cadre logique<\/p><p class=\"res-meta\">Matrice du projet<\/p><\/div>\r\n            <div class=\"res-body cad\">\r\n              <span><\/span><span class=\"cad-th\">Indicateurs<\/span><span class=\"cad-th\">Sources<\/span><span class=\"cad-th\">Hypoth\u00e8ses<\/span>\r\n              <span class=\"cad-rh\">Objectif g\u00e9n\u00e9ral<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n              <span class=\"cad-rh\">Objectifs sp\u00e9cifiques<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n              <span class=\"cad-rh\">R\u00e9sultats attendus<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n              <span class=\"cad-rh\">Activit\u00e9s<\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span><span class=\"cad-c is-on\"><i><\/i><i><\/i><\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"res-key\" aria-hidden=\"true\"><span class=\"is-on\" style=\"--k:var(--t3);--kx:var(--x3)\">Parcours de formation<\/span><span style=\"--k:var(--t5);--kx:var(--x5)\">Trame budg\u00e9taire<\/span><span style=\"--k:var(--t7);--kx:var(--x7)\">Veille des appels<\/span><span style=\"--k:var(--t9);--kx:var(--x9)\">Cadre logique<\/span><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== 08 \u00c9quipe ============================== -->\r\n<section class=\"section\" id=\"equipe\" style=\"--h:var(--x4)\" aria-labelledby=\"equipe-title\">\r\n  <div class=\"wrap\">\r\n    <div class=\"sec-head\">\r\n      <div data-reveal>\r\n        <p class=\"sec-index\"><span>08<\/span> L\u2019\u00e9quipe<\/p>\r\n        <h2 class=\"sec-title\" id=\"equipe-title\">Une \u00e9quipe qui s\u2019adapte <em>\u00e0 chaque projet.<\/em><\/h2>\r\n      <\/div>\r\n      <p class=\"sec-copy\" data-reveal style=\"--d:120\">Chez Social Hackers Lab, nous travaillons en \u00e9quipe projet. Selon les besoins du territoire ou de la structure accompagn\u00e9e, nous croisons plusieurs expertises pour constituer le bon dispositif d\u2019intervention.<\/p>\r\n    <\/div>\r\n    <ul class=\"team\">\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t7);--cx:var(--x7)\">\r\n        <p class=\"bc-kicker\">01<\/p>\r\n        <h3>Ing\u00e9nierie europ\u00e9enne<\/h3>\r\n        <p>Veille, strat\u00e9gie de financement, montage de projets, recherche de partenaires et accompagnement jusqu\u2019au d\u00e9p\u00f4t.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t1);--cx:var(--x1);--d:80\">\r\n        <p class=\"bc-kicker\">02<\/p>\r\n        <h3>Accompagnement territorial<\/h3>\r\n        <p>Animation de parcours, diagnostic des besoins, structuration des projets et coop\u00e9ration avec les collectivit\u00e9s et les acteurs locaux.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t5);--cx:var(--x5);--d:160\">\r\n        <p class=\"bc-kicker\">03<\/p>\r\n        <h3>Formation & transmission<\/h3>\r\n        <p>Conception et animation de formations pour permettre aux \u00e9quipes de comprendre les financements, ma\u00eetriser les outils et gagner progressivement en autonomie.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t3);--cx:var(--x3)\">\r\n        <p class=\"bc-kicker\">04<\/p>\r\n        <h3>Num\u00e9rique & data<\/h3>\r\n        <p>Plateformes ressources, cartographies, outils de suivi, automatisations et solutions num\u00e9riques con\u00e7ues pour faciliter l\u2019accompagnement.<\/p>\r\n      <\/li>\r\n      <li class=\"mate\" data-reveal style=\"--c:var(--t9);--cx:var(--x9);--d:80\">\r\n        <p class=\"bc-kicker\">05<\/p>\r\n        <h3>Design & contenus<\/h3>\r\n        <p>Identit\u00e9s visuelles, supports p\u00e9dagogiques, valorisation des projets, graphisme et production de contenus vid\u00e9o.<\/p>\r\n      <\/li>\r\n      <li class=\"team-note\" data-reveal style=\"--d:160\">\r\n        <p>Une organisation agile, des expertises compl\u00e9mentaires, un interlocuteur unique pour chaque projet.<\/p>\r\n      <\/li>\r\n    <\/ul>\r\n  <\/div>\r\n<\/section>\r\n<!-- ============================== Contact ============================== -->\r\n<section class=\"contact\" id=\"contact\" style=\"--h:var(--x7)\" aria-labelledby=\"contact-title\">\r\n  <div class=\"wrap contact-grid\">\r\n    <div data-reveal>\r\n      <p class=\"eyebrow\">Ouvrons des portes l\u00e0 o\u00f9 elles semblent ferm\u00e9es<\/p>\r\n      <h2 id=\"contact-title\">Chaque association porte en elle une <em>dynamique europ\u00e9enne.<\/em><\/h2>\r\n      <p class=\"sec-copy\">Notre mission est d\u2019en r\u00e9v\u00e9ler le potentiel, de donner aux \u00e9quipes les moyens de le transformer en projet et, progressivement, de se passer de nous.<\/p>\r\n      <div class=\"person team-contact\">\r\n        <span class=\"team-mark\" aria-hidden=\"true\"><img src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"\" width=\"52\" height=\"52\" loading=\"lazy\" decoding=\"async\"><\/span>\r\n        <div>\r\n          <b>L\u2019\u00e9quipe Social Hackers Lab<\/b>\r\n          <span>Associations, collectivit\u00e9s, financeurs<\/span>\r\n          <ul>\r\n            <li><a href=\"mailto:sonia@socialhackerslab.com\"><i>Mail<\/i>sonia@socialhackerslab.com<\/a><\/li>\r\n            <li><a href=\"tel:+33647397259\"><i>T\u00e9l.<\/i>+33 6 47 39 72 59<\/a><\/li>\r\n          <\/ul>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <form class=\"form\" data-form data-reveal style=\"--d:120\" novalidate action=\"\">\r\n      <h3>Parlons de votre projet<\/h3>\r\n      <p>R\u00e9ponse sous quelques jours ouvr\u00e9s.<\/p>\r\n      <div class=\"form-grid\">\r\n        <div><label for=\"f-name\">Nom et pr\u00e9nom<\/label><input id=\"f-name\" name=\"name\" autocomplete=\"name\"><\/div>\r\n        <div><label for=\"f-org\">Structure<\/label><input id=\"f-org\" name=\"org\" autocomplete=\"organization\"><\/div>\r\n        <div><label for=\"f-type\">Vous \u00eates<\/label>\r\n          <select id=\"f-type\" name=\"type\"><option>Une association<\/option><option>Une collectivit\u00e9<\/option><option>Un financeur ou une fondation<\/option><option>Autre<\/option><\/select>\r\n        <\/div>\r\n        <div><label for=\"f-mail\">Email<\/label><input id=\"f-mail\" name=\"email\" type=\"email\" autocomplete=\"email\"><\/div>\r\n        <div class=\"full\"><label for=\"f-msg\">Votre projet<\/label><textarea id=\"f-msg\" name=\"message\"><\/textarea><\/div>\r\n      <\/div>\r\n      <button class=\"btn btn-primary\" type=\"submit\">Envoyer la demande <span class=\"arr\" aria-hidden=\"true\">\u2192<\/span><\/button>\r\n      <p class=\"form-note\" data-form-note aria-live=\"polite\"><\/p>\r\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>\r\n  <\/div>\r\n<\/section>\r\n<\/main>\r\n<footer class=\"footer\">\r\n  <div class=\"wrap\">\r\n    <div class=\"footer-grid\">\r\n      <div>\r\n        <a class=\"brand\" href=\"#top\"><span class=\"brand-mark\"><img decoding=\"async\" src=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/06\/SHL-1-480x480.png\" alt=\"Social Hackers Lab\" width=\"124\" height=\"124\" loading=\"lazy\"><\/span><\/a>\r\n        <p class=\"footer-about\">Un incubateur associatif d\u00e9di\u00e9 aux financements europ\u00e9ens et \u00e0 l\u2019innovation sociale. Nous accompagnons les associations \u00e0 impact dans la construction de mod\u00e8les \u00e9conomiques p\u00e9rennes, par la formation, l\u2019ing\u00e9nierie de projet et l\u2019acc\u00e8s aux fonds europ\u00e9ens.<\/p>\r\n      <\/div>\r\n      <div>\r\n        <h4>Navigation<\/h4>\r\n        <ul><li><a href=\"#approche\">Notre approche<\/a><\/li><li><a href=\"#methode\">Notre m\u00e9thode<\/a><\/li><li><a href=\"#projets\">Impact et r\u00e9f\u00e9rences<\/a><\/li><li><a href=\"#collectivites\">Collectivit\u00e9s<\/a><\/li><li><a href=\"#equipe\">L\u2019\u00e9quipe<\/a><\/li><\/ul>\r\n      <\/div>\r\n      <div>\r\n        <h4>Ressources<\/h4>\r\n        <ul><li><a href=\"#ressourcerie\">Ressourcerie<\/a><\/li><li><a href=\"#europe\">Carte des projets<\/a><\/li><li><a href=\"#temoignages\">T\u00e9moignages<\/a><\/li><\/ul>\r\n      <\/div>\r\n      <div>\r\n        <h4>Contact<\/h4>\r\n        <ul><li><a href=\"mailto:sonia@socialhackerslab.com\">sonia@socialhackerslab.com<\/a><\/li><li><a href=\"tel:+33647397259\">+33 6 47 39 72 59<\/a><\/li><li>Si\u00e8ge \u00e0 Marseille<\/li><\/ul>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"footer-bottom\">\r\n      <span>\u00a9 2026 Social Hackers Lab, tous droits r\u00e9serv\u00e9s \u00b7 <span class=\"lang lang-foot\" data-lang-switch><a href=\"?lang=fr\" hreflang=\"fr\" lang=\"fr\" data-lang=\"fr\">Fran\u00e7ais<\/a><a href=\"?lang=en\" hreflang=\"en\" lang=\"en\" data-lang=\"en\">English<\/a><\/span><\/span>\r\n      <span><a href=\"https:\/\/socialhackerslab.com\/en\/declaration-daccessibilite\/\">D\u00e9claration d\u2019accessibilit\u00e9<\/a> \u00b7 <a href=\"https:\/\/socialhackerslab.com\/en\/politique-de-cookies-ue\/\">Politique de cookies<\/a><\/span>\r\n    <\/div>\r\n  <\/div>\r\n<\/footer>\r\n<script>\r\n<!--\r\n(function () {\r\n  'use strict';\r\n  var root = document.getElementById('shl-accueil');\r\n  root.classList.add('js');\r\n  var calm = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n  if (calm) root.classList.add('no-motion');\r\n  \/* ---------------- Langue : fran\u00e7ais, ou anglais avec ?lang=en ----------------\r\n     La page est \u00e9crite en fran\u00e7ais. En anglais, chaque texte est remplac\u00e9 au\r\n     chargement, avant toute animation, d\u2019apr\u00e8s le dictionnaire EN (texte\r\n     fran\u00e7ais, espaces normalis\u00e9es \u2192 texte anglais). Un texte absent du\r\n     dictionnaire reste en fran\u00e7ais et se signale dans la console. *\/\r\n  var LANG = \/[?&]lang=en(?:&|$)\/.test(location.search) ? 'en' : 'fr';\r\n  var EN = {\" partenaire trouv\u00e9\":\" partner found\",\" partenaires trouv\u00e9s\":\" partners found\",\"(R\u00e9gion Sud, Occitanie, Pyr\u00e9n\u00e9es-Atlantiques, \u00cele-de-France, Grand Est et Outre-mer) \u00b7\":\"(R\u00e9gion Sud, Occitanie, Pyr\u00e9n\u00e9es-Atlantiques, \u00cele-de-France, Grand Est and Overseas France) \u00b7\",\", dont une majorit\u00e9 issue des quartiers prioritaires, de territoires ruraux ou ultramarins. Des parcours adapt\u00e9s aux r\u00e9alit\u00e9s associatives : manque de temps, \u00e9quipes mixtes b\u00e9n\u00e9voles et salari\u00e9s, niveaux d\u2019exp\u00e9rience diff\u00e9rents.\":\", most of them from priority neighbourhoods, rural or overseas areas. Programmes adapted to the realities of non-profits: little time, mixed teams of volunteers and staff, different levels of experience.\",\"1 journ\u00e9e\":\"1 day\",\"1 journ\u00e9e \u00b7 15 \u00e0 25 pers.\":\"1 day \u00b7 15 to 25 people\",\"1 ressourcerie num\u00e9rique\":\"1 digital resource hub\",\"15 \u00e0 25 personnes\":\"15 to 25 people\",\"150+ associations accompagn\u00e9es partout en France\":\"150+ organisations supported across France\",\"2 \u00e0 3 jours\":\"2 to 3 days\",\"2 \u00e0 3 jours \u00b7 \u00e9quipes internes\":\"2 to 3 days \u00b7 in-house teams\",\"6 hubs inter-associatifs\":\"6 inter-association hubs\",\"6 \u00e0 10 s\u00e9ances\":\"6 to 10 sessions\",\"6 \u00e0 10 s\u00e9ances \u00b7 15 \u00e0 40 pers.\":\"6 to 10 sessions \u00b7 15 to 40 people\",\"9 capsules\":\"9 videos\",\"90 % des structures red\u00e9posent en autonomie l\u2019ann\u00e9e suivante\":\"90% of organisations reapply on their own the following year\",\"AJAR\":\"AJAR\",\"ANCT\":\"ANCT\",\"ASC Littoral\":\"ASC Littoral\",\"Accompagne\":\"Supports\",\"Accompagnement au montage\":\"Support with project design\",\"Accompagnement individuel\":\"One-to-one support\",\"Accompagnement territorial\":\"Local support\",\"Acculturation aux fonds europ\u00e9ens et identification des programmes adapt\u00e9s.\":\"An introduction to European funds and identification of suitable programmes.\",\"Acelem\":\"Acelem\",\"Action Bomaye\":\"Action Bomaye\",\"Action Bomaye \u00d7 Balkania\":\"Action Bomaye \u00d7 Balkania\",\"Activit\u00e9s\":\"Activities\",\"Agence Erasmus+\":\"Erasmus+ Agency\",\"Agence nationale de la coh\u00e9sion des territoires\":\"French National Agency for Territorial Cohesion (ANCT)\",\"Agglom\u00e9ration B\u00e9ziers M\u00e9diterran\u00e9e\":\"Agglom\u00e9ration B\u00e9ziers M\u00e9diterran\u00e9e\",\"Agglom\u00e9ration H\u00e9rault M\u00e9diterran\u00e9e\":\"Agglom\u00e9ration H\u00e9rault M\u00e9diterran\u00e9e\",\"Agriculture & insertion\":\"Farming & employment\",\"Aix-Marseille\":\"Aix-Marseille\",\"Aix-Marseille \u00b7 inclusion sociale\":\"Aix-Marseille \u00b7 social inclusion\",\"Aix-Marseille \u00b7 m\u00e9diation culturelle\":\"Aix-Marseille \u00b7 cultural outreach\",\"Aix-Marseille \u00d7 Italie\":\"Aix-Marseille \u00d7 Italy\",\"Aller au contenu\":\"Skip to content\",\"Ancrages\":\"Ancrages\",\"Animation de parcours, diagnostic des besoins, structuration des projets et coop\u00e9ration avec les collectivit\u00e9s et les acteurs locaux.\":\"Running programmes, assessing needs, structuring projects and working with local authorities and local stakeholders.\",\"Ann\u00e9e 1\":\"Year 1\",\"Ann\u00e9e 2\":\"Year 2\",\"Apprend\":\"Learns\",\"Approche\":\"Approach\",\"Art & durabilit\u00e9\":\"Art & sustainability\",\"Art & inclusion des jeunes\":\"Art & youth inclusion\",\"Association Fifrelin\":\"Association Fifrelin\",\"Associations culturelles\":\"Cultural associations\",\"Associations sportives\":\"Sports clubs\",\"Associations, collectivit\u00e9s, financeurs\":\"Non-profits, local authorities, funders\",\"Ateliers collectifs\":\"Group workshops\",\"Au niveau national, nous travaillons avec l\u2019Agence nationale de la coh\u00e9sion des territoires (ANCT) pour les associations des quartiers prioritaires et des territoires ultramarins.\":\"Nationally, we work with the French National Agency for Territorial Cohesion (ANCT) for organisations in priority neighbourhoods and overseas territories.\",\"Autonome\":\"Independent\",\"Autonomie\":\"Independence\",\"Autre\":\"Other\",\"Autres\":\"Other\",\"Avec Villes et Territoires Occitanie, une cohorte d\u00e9partementale financ\u00e9e par sept collectivit\u00e9s de l\u2019H\u00e9rault, de Montpellier \u00e0 Lod\u00e8ve.\":\"With Villes et Territoires Occitanie, a department-wide cohort funded by seven local authorities in the H\u00e9rault, from Montpellier to Lod\u00e8ve.\",\"B\":\"B\",\"Budget\":\"Budget\",\"Budget pr\u00e9visionnel\":\"Projected budget\",\"CERV\":\"CERV\",\"CLSE\":\"CLSE\",\"Cadre logique\":\"Logical framework\",\"Candidatures\":\"Applications\",\"Capsule vid\u00e9o\":\"Video\",\"Capsules vid\u00e9o des associations\":\"Videos from the organisations\",\"Carte de France et des cinq d\u00e9partements d\u2019outre-mer. Tour \u00e0 tour s\u2019allument les quartiers prioritaires des agglom\u00e9rations, les territoires ruraux et ultramarins, puis un r\u00e9seau de structures de l\u2019ESS reli\u00e9 \u00e0 l\u2019Europe.\":\"Map of mainland France and the five overseas departments. In turn, priority neighbourhoods in urban areas light up, then rural and overseas territories, then a network of social economy organisations linked to Europe.\",\"Carte de l\u2019Europe : quelques exemples de coop\u00e9rations relient des structures accompagn\u00e9es en France \u00e0 leurs partenaires europ\u00e9ens.\":\"Map of Europe: a few examples of partnerships linking organisations we support in France with their European partners.\",\"Carte des projets\":\"Project map\",\"Ce que nous concevons\":\"What we design\",\"Ce que vous pilotez\":\"What you steer\",\"Ce qu\u2019elles en disent\":\"In their words\",\"Centre social Del Rio\":\"Centre social Del Rio\",\"Centre social Fabien Menot\":\"Centre social Fabien Menot\",\"Centre social La Farandole\":\"Centre social La Farandole\",\"Centres sociaux\":\"Community centres\",\"Cette carte pr\u00e9sente quelques exemples de coop\u00e9rations europ\u00e9ennes initi\u00e9es ou accompagn\u00e9es par Social Hackers Lab.\":\"This map shows a few examples of European partnerships initiated or supported by Social Hackers Lab.\",\"Chaque association porte en elle une\":\"Every organisation carries a\",\"Chaque liaison illustre la mise en relation d\u2019une structure accompagn\u00e9e avec un ou plusieurs partenaires europ\u00e9ens. Elle donne un aper\u00e7u de la diversit\u00e9 des projets, des territoires et des coop\u00e9rations d\u00e9velopp\u00e9es \u00e0 l\u2019\u00e9chelle europ\u00e9enne.\":\"Each link shows an organisation we support connecting with one or more European partners. Together they give a glimpse of the diversity of projects, places and partnerships developed across Europe.\",\"Chaque structure transforme son id\u00e9e en projet clair, coh\u00e9rent et finan\u00e7able. Nous travaillons ensemble les objectifs, les publics vis\u00e9s, les activit\u00e9s, les r\u00e9sultats attendus, le budget, le calendrier et les partenaires.\":\"Each organisation turns its idea into a clear, coherent and fundable project. Together we work on objectives, target groups, activities, expected results, budget, timeline and partners.\",\"Chez Social Hackers Lab, nous travaillons en \u00e9quipe projet. Selon les besoins du territoire ou de la structure accompagn\u00e9e, nous croisons plusieurs expertises pour constituer le bon dispositif d\u2019intervention.\":\"At Social Hackers Lab, we work in project teams. Depending on the needs of the area or the organisation we support, we combine several areas of expertise to put together the right support scheme.\",\"Cin\u00e9ma et insertion socio-professionnelle : s\u00e9ances plein air, master classes, formation \u00e0 la r\u00e9alisation, r\u00e9duction de l\u2019empreinte carbone des festivals.\":\"Cinema and social and professional integration: open-air screenings, master classes, filmmaking training, a smaller carbon footprint for festivals.\",\"Citoyennet\u00e9\":\"Citizenship\",\"Citoyens, \u00e9galit\u00e9, droits et valeurs\":\"Citizens, Equality, Rights and Values\",\"Cohorte de 15 \u00e0 40\":\"Cohort of 15 to 40\",\"Collectifs citoyens\":\"Citizen groups\",\"Collectivit\u00e9s\":\"Public sector\",\"Collectivit\u00e9s et acteurs publics\":\"Local authorities and public bodies\",\"Collectivit\u00e9s \u00b7 Services de l\u2019\u00c9tat \u00b7 Financeurs\":\"Local authorities \u00b7 State services \u00b7 Funders\",\"Communaut\u00e9 de communes Lod\u00e9vois et Larzac\":\"Lod\u00e9vois et Larzac community of communes\",\"Communication\":\"Communication\",\"Comp\u00e9tences\":\"Skills\",\"Conception et animation de formations pour permettre aux \u00e9quipes de comprendre les financements, ma\u00eetriser les outils et gagner progressivement en autonomie.\":\"Designing and running training so that teams understand funding, master the tools and gradually become self-sufficient.\",\"Concevoir des dispositifs\":\"Designing schemes\",\"Construire des ponts entre\":\"Building bridges between\",\"Construire le parcours\":\"Building the programme\",\"Construisons ensemble le dispositif de votre territoire.\":\"Let\u2019s build the scheme for your area together.\",\"Contact\":\"Contact\",\"Corps europ\u00e9en de solidarit\u00e9\":\"European Solidarity Corps\",\"Co\u00fbts indirects (7 %)\":\"Indirect costs (7%)\",\"Culture\":\"Culture\",\"Culture & insertion\":\"Culture & employability\",\"Cycle d\u2019ateliers\":\"Workshop series\",\"DA\":\"DA\",\"DDA Contemporary Art\":\"DDA Contemporary Art\",\"DDA Contemporary Art \u00d7 Eruditembrace\":\"DDA Contemporary Art \u00d7 Eruditembrace\",\"DDETS\":\"DDETS\",\"Danemark\":\"Denmark\",\"De l\u2019acculturation aux financements europ\u00e9ens jusqu\u2019\u00e0 l\u2019autonomie compl\u00e8te des \u00e9quipes : une progression con\u00e7ue pour conduire les structures jusqu\u2019au d\u00e9p\u00f4t effectif de leurs dossiers et favoriser le transfert durable des comp\u00e9tences.\":\"From a first introduction to European funding to full team autonomy: a progression designed to take organisations all the way to submitting their applications, and to pass on skills for the long term.\",\"Depuis Marseille, nous accompagnons les associations des quartiers prioritaires, des territoires ruraux et ultramarins \u00e0 acc\u00e9der aux financements europ\u00e9ens, \u00e0 structurer leurs projets et \u00e0 d\u00e9velopper les comp\u00e9tences n\u00e9cessaires pour d\u00e9poser demain en autonomie.\":\"From Marseille, we help organisations in priority neighbourhoods, rural areas and overseas territories access European funding, structure their projects and build the skills they need to apply on their own in the future.\",\"Des associations qui\":\"Organisations that\",\"Des ateliers collectifs pour comprendre les financements europ\u00e9ens : attendus des financeurs, crit\u00e8res d\u2019\u00e9ligibilit\u00e9, logique de projet, cadre logique, budgets, partenariats et \u00e9tapes cl\u00e9s d\u2019un d\u00e9p\u00f4t.\":\"Group workshops to understand European funding: funders\u2019 expectations, eligibility criteria, project logic, logical framework, budgets, partnerships and the key stages of an application.\",\"Des autoportraits film\u00e9s pour redonner la parole \u00e0 des jeunes en situation d\u2019exclusion : ateliers participatifs, film collectif, projections-d\u00e9bats et livret p\u00e9dagogique pour transmettre la m\u00e9thode.\":\"Filmed self-portraits that give a voice back to young people facing exclusion: participatory workshops, a collective film, screenings with debates and a teaching booklet to pass on the method.\",\"Des mobilit\u00e9s en Espagne pour des personnes en insertion : agriculture \u00e9cologique, alimentation durable et nouvelles m\u00e9thodes d\u2019accompagnement socio-professionnel.\":\"Mobility placements in Spain for people on back-to-work pathways: ecological farming, sustainable food and new approaches to social and professional support.\",\"Des ponts vers l\u2019Europe\":\"Bridges to Europe\",\"Des projets locaux,\":\"Local projects,\",\"Des projets r\u00e9els, des\":\"Real projects,\",\"Des structures de toutes tailles et de tous secteurs.\":\"Organisations of every size and sector.\",\"Des territoires souvent \u00e9loign\u00e9s des\":\"Areas often far from\",\"Design & contenus\":\"Design & content\",\"Diagnostic\":\"Assessment\",\"Diagnostic de maturit\u00e9 europ\u00e9enne\":\"European readiness assessment\",\"Dossiers d\u00e9pos\u00e9s\":\"Submissions\",\"Dur\u00e9e\":\"Duration\",\"D\u00e9c\":\"Dec\",\"D\u00e9claration d\u2019accessibilit\u00e9\":\"Accessibility statement\",\"D\u00e9partement de l\u2019Essonne\":\"Essonne Department\",\"D\u00e9partement \u00b7 \u00cele-de-France\":\"Department \u00b7 \u00cele-de-France\",\"D\u00e9placements\":\"Travel\",\"D\u00e9p\u00f4t\":\"Submission\",\"D\u00e9p\u00f4t des dossiers\":\"Submission\",\"EN\":\"EN\",\"ESS\":\"SSE\",\"Elles nous confient leur territoire\":\"They entrust us with their territory\",\"Email\":\"Email\",\"En Majuscule\":\"En Majuscule\",\"En partenariat avec les collectivit\u00e9s, nous accompagnons des associations qui portent des actions essentielles aupr\u00e8s des habitants mais manquent de temps, de r\u00e9seau ou d\u2019ing\u00e9nierie. L\u2019incubateur transforme leurs actions de terrain en projets structur\u00e9s, finan\u00e7ables et \u00e9ligibles.\":\"In partnership with local authorities, we support organisations that do essential work with residents but lack time, networks or project engineering. The incubator turns their grassroots action into structured, fundable and eligible projects.\",\"Engagement citoyen\":\"Civic engagement\",\"English\":\"English\",\"English version\":\"English version\",\"Envoyer la demande\":\"Send request\",\"Erasmus+\":\"Erasmus+\",\"Erasmus+ \u00b7 Europe Cr\u00e9ative\":\"Erasmus+ \u00b7 Creative Europe\",\"Espagne\":\"Spain\",\"Europe cr\u00e9ative\":\"Creative Europe\",\"Europ\u00e9ens\":\"European\",\"Europ\u00e9ens \u00b7 1 partenaire\":\"European \u00b7 1 partner\",\"Exemples de projets financ\u00e9s\":\"Examples of funded projects\",\"Exemples de projets repr\u00e9sent\u00e9s sur la carte\":\"Examples of projects shown on the map\",\"FR\":\"FR\",\"FSE+\":\"ESF+\",\"Fig. 02\":\"Fig. 02\",\"Fig. 03\":\"Fig. 03\",\"Financements obtenus\":\"Funding secured\",\"Financeur europ\u00e9en\":\"European funder\",\"Fonds\":\"EU\",\"Format 01 \u00b7 Collectif\":\"Format 01 \u00b7 Group\",\"Format 02 \u00b7 En \u00e9quipe\":\"Format 02 \u00b7 Team\",\"Format 03 \u00b7 Collectif et individuel\":\"Format 03 \u00b7 Group and one-to-one\",\"Format 04 \u00b7 Individuel\":\"Format 04 \u00b7 One-to-one\",\"Formation\":\"Training\",\"Formation & transmission\":\"Training & knowledge transfer\",\"Formation aux logiques de financement\":\"Training in how funding works\",\"Formation intensive\":\"Intensive training\",\"Former des acteurs associatifs en France et en Italie \u00e0 transformer leurs actions en exp\u00e9riences accessibles, pour toucher de nouveaux publics, notamment les plus \u00e9loign\u00e9s, et favoriser l\u2019engagement citoyen.\":\"Training non-profit practitioners in France and Italy to turn their activities into accessible experiences, in order to reach new audiences, especially the hardest to reach, and encourage civic engagement.\",\"Former vos agents\":\"Training your staff\",\"France \u00d7 Portugal\":\"France \u00d7 Portugal\",\"Fran\u00e7ais\":\"Fran\u00e7ais\",\"F\u00e9vr\":\"Feb\",\"Groupe\":\"Group\",\"Groupe Dispersion\":\"Groupe Dispersion\",\"Groupe Dispersion \u00d7 Fundacja CEL\":\"Groupe Dispersion \u00d7 Fundacja CEL\",\"Gr\u00e8ce\":\"Greece\",\"Guadeloupe\":\"Guadeloupe\",\"Guyane\":\"French Guiana\",\"Hatoup!\":\"Hatoup!\",\"Hypoth\u00e8ses\":\"Assumptions\",\"Identit\u00e9s visuelles, supports p\u00e9dagogiques, valorisation des projets, graphisme et production de contenus vid\u00e9o.\":\"Visual identities, learning materials, project showcases, graphic design and video production.\",\"Impact et r\u00e9f\u00e9rences\":\"Impact and references\",\"Inclusion\":\"Inclusion\",\"Incubateur associatif \u00b7 Fonds europ\u00e9ens\":\"Non-profit incubator \u00b7 EU funding\",\"Indicateurs\":\"Indicators\",\"Ing\u00e9nierie de dossier, recherche de partenaires, s\u00e9curisation du d\u00e9p\u00f4t.\":\"Application design, partner search, securing the submission.\",\"Ing\u00e9nierie europ\u00e9enne\":\"European project engineering\",\"Inscrire l\u2019action dans la dur\u00e9e\":\"Building for the long term\",\"Insertion & mobilit\u00e9\":\"Employment & mobility\",\"Insertion professionnelle\":\"Employment integration\",\"Istres\":\"Istres\",\"Janv\":\"Jan\",\"Jeunesse\":\"Youth\",\"Jeunesse & sport\":\"Youth & sport\",\"Journ\u00e9e d\u2019initiation\":\"Introduction day\",\"K-Pab6T\":\"K-Pab6T\",\"La Ciotat \u00b7 inclusion sociale\":\"La Ciotat \u00b7 social inclusion\",\"La Ciotat \u00b7 transition \u00e9cologique\":\"La Ciotat \u00b7 ecological transition\",\"La Ciotat \u00d7 Belgique\":\"La Ciotat \u00d7 Belgium\",\"La Ferme d\u2019Uhaldia\":\"La Ferme d\u2019Uhaldia\",\"La For\u00eat en papier\":\"La For\u00eat en papier\",\"La R\u00e9union\":\"R\u00e9union\",\"Laboratoire de bonnes pratiques \u00e9cologiques pour r\u00e9inventer l\u2019art de mani\u00e8re durable : approche holistique, interdisciplinaire, publics vari\u00e9s.\":\"A lab of ecological good practice to reinvent art sustainably: a holistic, interdisciplinary approach for varied audiences.\",\"Le Facteur Ind\u00e9pendant\":\"Le Facteur Ind\u00e9pendant\",\"Le Grand Bleu\":\"Le Grand Bleu\",\"Le Paysan Urbain\":\"Le Paysan Urbain\",\"Le e-hub collaboratif met \u00e0 disposition des associations un ensemble de ressources p\u00e9dagogiques, m\u00e9thodologiques et num\u00e9riques pour les accompagner tout au long de leur mont\u00e9e en comp\u00e9tences.\":\"The collaborative e-hub gives organisations a set of learning, methodological and digital resources to support them throughout their upskilling.\",\"Le hacking social, pour nous, c\u2019est une mani\u00e8re d\u2019agir sur les syst\u00e8mes qui emp\u00eachent trop souvent les associations d\u2019acc\u00e9der aux ressources qui leur sont pourtant destin\u00e9es.\":\"For us, social hacking is a way of acting on the systems that too often keep organisations from the very resources meant for them.\",\"Le transfert de comp\u00e9tences comme principe\":\"Skills transfer as a principle\",\"Lecture & m\u00e9diation culturelle\":\"Reading & cultural outreach\",\"Les Cols Verts Provence\":\"Les Cols Verts Provence\",\"Les Petites Cantines\":\"Les Petites Cantines\",\"Les associations repartent avec des outils concrets, mieux outill\u00e9es pour d\u00e9poser de nouveaux projets, d\u00e9velopper leurs partenariats et renforcer durablement leur autonomie financi\u00e8re.\":\"Organisations leave with concrete tools, better equipped to submit new projects, develop their partnerships and lastingly strengthen their financial independence.\",\"Les dossiers sont relus avant d\u00e9p\u00f4t pour s\u00e9curiser la coh\u00e9rence du projet, la r\u00e9daction, le budget, les pi\u00e8ces administratives et les annexes. Objectif : s\u00e9curiser la qualit\u00e9 du d\u00e9p\u00f4t et renforcer la coh\u00e9rence de la candidature, tout en permettant \u00e0 l\u2019\u00e9quipe de ma\u00eetriser chaque \u00e9tape.\":\"Applications are reviewed before submission to secure the project\u2019s coherence, the writing, the budget, the administrative documents and the annexes. The goal: secure the quality of the submission and strengthen the application\u2019s coherence, while enabling the team to master every step.\",\"Les financements europ\u00e9ens sont souvent per\u00e7us comme complexes, \u00e9loign\u00e9s ou r\u00e9serv\u00e9s aux grandes structures. Notre r\u00f4le est de les rendre accessibles aux associations de terrain, en identifiant les bons dispositifs, en simplifiant les \u00e9tapes et en accompagnant les structures jusqu\u2019au d\u00e9p\u00f4t.\":\"European funding is often seen as complex, remote or reserved for large organisations. Our role is to make it accessible to grassroots organisations, by identifying the right schemes, simplifying the steps and supporting them all the way to submission.\",\"Les quartiers prioritaires de la politique de la ville\":\"Priority urban neighbourhoods\",\"Les structures \u00e9mergentes de l\u2019ESS\":\"Emerging social economy organisations\",\"Les territoires ruraux et ultramarins\":\"Rural and overseas territories\",\"Les \u00ab Silent Books \u00bb, livres sans texte, pour ouvrir la lecture aux enfants et aux familles qui en sont \u00e9loign\u00e9s : une m\u00e9thode inclusive et des outils pour les professionnels de l\u2019\u00e9ducation.\":\"\u201cSilent Books\u201d, picture books without words, to open up reading to children and families who rarely have access to it: an inclusive method and tools for education professionals.\",\"Lire la vid\u00e9o\":\"Play video\",\"Lire la vid\u00e9o : \":\"Play video: \",\"Lunel Agglo\":\"Lunel Agglo\",\"Lutte contre les discriminations\":\"Anti-discrimination\",\"L\u2019incubateur s\u2019adresse aux structures qui portent des projets d\u2019int\u00e9r\u00eat g\u00e9n\u00e9ral et souhaitent changer d\u2019\u00e9chelle, quelle que soit leur taille ou leur th\u00e9matique.\":\"The incubator is for organisations that carry public-interest projects and want to scale up, whatever their size or field.\",\"L\u2019incubateur s\u2019appuie sur des partenaires publics et europ\u00e9ens, et sur des r\u00e9seaux territoriaux :\":\"The incubator draws on public and European partners, and on territorial networks:\",\"L\u2019\u00e9quipe\":\"The team\",\"L\u2019\u00e9quipe Social Hackers Lab\":\"The Social Hackers Lab team\",\"L\u2019\u0152il du Loup\":\"L\u2019\u0152il du Loup\",\"ML\":\"ML\",\"Mail\":\"Email\",\"Maquette : l\u2019envoi sera branch\u00e9 sur le formulaire du site.\":\"Mock-up: sending will be connected to the site\u2019s form.\",\"Marseille\":\"Marseille\",\"Marseille Nord Handball\":\"Marseille Nord Handball\",\"Marseille Sans Fronti\u00e8res\":\"Marseille Sans Fronti\u00e8res\",\"Marseille \u00b7 cin\u00e9ma et insertion\":\"Marseille \u00b7 cinema and employability\",\"Marseille \u00b7 mobilit\u00e9 jeunesse\":\"Marseille \u00b7 youth mobility\",\"Marseille \u00b7 projets num\u00e9riques\":\"Marseille \u00b7 digital projects\",\"Marseille \u00d7 Belgique\":\"Marseille \u00d7 Belgium\",\"Marseille \u00d7 Danemark\":\"Marseille \u00d7 Denmark\",\"Marseille \u00d7 Espagne\":\"Marseille \u00d7 Spain\",\"Marseille \u00d7 Gr\u00e8ce\":\"Marseille \u00d7 Greece\",\"Marseille \u00d7 Pologne\":\"Marseille \u00d7 Poland\",\"Martigues Sport Athl\u00e9tisme\":\"Martigues Sport Athl\u00e9tisme\",\"Martigues \u00b7 jeunesse et sport\":\"Martigues \u00b7 youth and sport\",\"Martinique\":\"Martinique\",\"Matrice du projet\":\"Project matrix\",\"Mayotte\":\"Mayotte\",\"Menu\":\"Menu\",\"Mobilit\u00e9\":\"Mobility\",\"Mobilit\u00e9 Erasmus+ pour 30 jeunes des quartiers Nord dans trois pays europ\u00e9ens : engagement citoyen et appartenance europ\u00e9enne par le sport.\":\"Erasmus+ mobility for 30 young people from northern Marseille in three European countries: civic engagement and a sense of European belonging through sport.\",\"Modulable\":\"Flexible\",\"Modulable \u00b7 porteur de projet\":\"Flexible \u00b7 project lead\",\"Mod\u00e8les de dossiers\":\"Application templates\",\"Montage\":\"Drafting\",\"Montant\":\"Amount\",\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole\":\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole\",\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole et l\u2019H\u00e9rault\":\"Montpellier M\u00e9diterran\u00e9e M\u00e9tropole and the H\u00e9rault\",\"Mont\u00e9e en comp\u00e9tences\":\"Upskilling\",\"Mont\u00e9e en comp\u00e9tences acc\u00e9l\u00e9r\u00e9e sur un programme cibl\u00e9.\":\"Fast-track upskilling on a targeted programme.\",\"M\u00e9thode\":\"Method\",\"M\u00e9thodes de r\u00e9daction\":\"Writing methods\",\"M\u00e9thodologique\":\"Methodology\",\"M\u00e9tropole Aix-Marseille\":\"M\u00e9tropole Aix-Marseille\",\"M\u00e9tropole Aix-Marseille-Provence\":\"M\u00e9tropole Aix-Marseille-Provence\",\"M\u00e9tropole Aix-Marseille-Provence, ANCT, D\u00e9partement de l\u2019Essonne, DDETS, agence Erasmus+, Villes et Territoires Occitanie\":\"M\u00e9tropole Aix-Marseille-Provence, ANCT, Essonne Department, DDETS, Erasmus+ agency, Villes et Territoires Occitanie\",\"M\u00e9tropole \u00b7 R\u00e9gion Sud\":\"Metropolitan authority \u00b7 R\u00e9gion Sud\",\"M\u00e9tropoles, d\u00e9partements, intercommunalit\u00e9s, services de l\u2019\u00c9tat : vous accompagnez au quotidien des associations engag\u00e9es au plus pr\u00e8s des habitants.\":\"Metropolitan areas, departments, inter-municipal bodies, State services: every day, you support organisations working closely with local residents.\",\"M\u20ac\":\"M\u20ac\",\"Nantes \u00b7 inclusion sociale\":\"Nantes \u00b7 social inclusion\",\"Nantes \u00d7 Irlande\":\"Nantes \u00d7 Ireland\",\"Navigation\":\"Navigation\",\"Navigation mobile\":\"Mobile navigation\",\"Navigation principale\":\"Main navigation\",\"Neuf capsules vid\u00e9o : les associations accompagn\u00e9es racontent, face cam\u00e9ra, ce que l\u2019accompagnement a chang\u00e9 pour elles.\":\"Nine short videos: the organisations we support tell the camera what the support changed for them.\",\"Nom et pr\u00e9nom\":\"Full name\",\"Nos champs d\u2019action\":\"Where we work\",\"Nos formats d\u2019intervention\":\"Our formats\",\"Nos formats, du plus l\u00e9ger au plus pouss\u00e9\":\"Our formats, from lightest to most in-depth\",\"Nos vies nos avis\":\"Nos vies nos avis\",\"Notre approche\":\"Our approach\",\"Notre approche :\":\"Our approach:\",\"Notre approche repose sur trois leviers compl\u00e9mentaires :\":\"Our approach rests on three complementary levers:\",\"Notre identit\u00e9\":\"Who we are\",\"Notre mission est d\u2019en r\u00e9v\u00e9ler le potentiel, de donner aux \u00e9quipes les moyens de le transformer en projet et, progressivement, de se passer de nous.\":\"Our mission is to reveal that potential, give teams the means to turn it into a project and, step by step, no longer need us.\",\"Notre mission n\u2019est pas de faire \u00e0 la place des associations, mais de leur transmettre les cl\u00e9s pour agir seules demain. Nous accompagnons, outillons, relisons, s\u00e9curisons :\":\"Our mission is not to act in place of organisations, but to hand them the keys to act on their own tomorrow. We support, equip, review and safeguard:\",\"Notre m\u00e9thode\":\"Our method\",\"Notre m\u00e9thodologie\":\"Our methodology\",\"Nous accompagnons \u00e9galement la mont\u00e9e en comp\u00e9tence de vos agents \u00e0 travers des formations d\u00e9di\u00e9es : mieux comprendre les programmes europ\u00e9ens, identifier les opportunit\u00e9s adapt\u00e9es au territoire, orienter les porteurs de projets et int\u00e9grer plus efficacement les financements europ\u00e9ens dans les politiques publiques.\":\"We also help your staff build their skills through dedicated training: understanding European programmes better, identifying opportunities suited to your area, guiding project leaders and integrating European funding more effectively into public policy.\",\"Nous aidons les associations \u00e0 diversifier leurs ressources et \u00e0 int\u00e9grer durablement les financements europ\u00e9ens dans leur strat\u00e9gie. L\u2019enjeu n\u2019est pas seulement de financer un projet, mais de renforcer leur capacit\u00e9 \u00e0 s\u00e9curiser leur mod\u00e8le \u00e9conomique et \u00e0 choisir leurs opportunit\u00e9s de d\u00e9veloppement.\":\"We help organisations diversify their resources and build European funding into their strategy for the long term. The aim is not only to fund a project, but to strengthen their ability to secure their business model and choose their development opportunities.\",\"Nous concevons avec vous des dispositifs qui renforcent leur capacit\u00e9 \u00e0 acc\u00e9der aux financements europ\u00e9ens et contribuent \u00e0 mobiliser davantage de ressources au b\u00e9n\u00e9fice de votre territoire.\":\"Together with you, we design schemes that strengthen their ability to access European funding and help bring more resources to your area.\",\"Nous intervenons prioritairement l\u00e0 o\u00f9 l\u2019acc\u00e8s aux financements reste difficile : quartiers prioritaires de la politique de la ville, territoires ruraux, territoires ultramarins et structures \u00e9mergentes de l\u2019\u00e9conomie sociale et solidaire.\":\"We work first and foremost where access to funding remains difficult: priority urban neighbourhoods, rural areas, overseas territories and emerging social and solidarity economy organisations.\",\"Nous partons de votre territoire : ses associations, ses quartiers, vos politiques publiques. Diagnostic, programme, calendrier et formats sont construits avec vos services, puis anim\u00e9s par notre \u00e9quipe, en pr\u00e9sentiel et \u00e0 distance.\":\"We start from your area: its organisations, its neighbourhoods, your public policies. Assessment, programme, timeline and formats are built with your teams, then delivered by ours, on site and online.\",\"Nous prenons en charge l\u2019appel \u00e0 candidatures, la mobilisation des structures, le suivi jusqu\u2019au d\u00e9p\u00f4t et le bilan. Vous suivez l\u2019avancement avec des indicateurs clairs, pr\u00e9sentables \u00e0 vos instances.\":\"We handle the call for applications, outreach to organisations, follow-up through to submission and the final report. You track progress with clear indicators you can present to your governing bodies.\",\"Nous traduisons la complexit\u00e9 des financements europ\u00e9ens dans un langage clair, op\u00e9rationnel et directement utilisable. Nous aidons les associations \u00e0 comprendre les r\u00e8gles du jeu, \u00e0 structurer leurs id\u00e9es, \u00e0 construire des dossiers solides et \u00e0 prendre confiance dans leur capacit\u00e9 \u00e0 porter des projets ambitieux.\":\"We translate the complexity of European funding into clear, practical, ready-to-use language. We help organisations understand the rules of the game, shape their ideas, build solid applications and gain confidence in their ability to lead ambitious projects.\",\"Nous transmettons des comp\u00e9tences techniques et strat\u00e9giques pour que les associations ne d\u00e9pendent pas uniquement d\u2019un accompagnement ponctuel. \u00c0 la fin du parcours, les \u00e9quipes disposent d\u2019outils, de m\u00e9thodes et de mod\u00e8les r\u00e9utilisables pour d\u00e9poser de nouveaux dossiers de mani\u00e8re autonome.\":\"We pass on technical and strategic skills so that organisations do not depend solely on one-off support. By the end of the programme, teams have reusable tools, methods and templates to submit new applications on their own.\",\"Nouvel appel\":\"New call\",\"Nouvelle-Cal\u00e9donie\":\"New Caledonia\",\"Nov\":\"Nov\",\"Num\u00e9rique\":\"Digital\",\"Num\u00e9rique & data\":\"Digital & data\",\"Objectif g\u00e9n\u00e9ral\":\"Overall objective\",\"Objectifs sp\u00e9cifiques\":\"Specific objectives\",\"Oct\":\"Oct\",\"Open Lande\":\"Open Lande\",\"Outils\":\"Tools\",\"Outre-mer\":\"Overseas France\",\"Ouvrons des portes l\u00e0 o\u00f9 elles semblent ferm\u00e9es\":\"Opening doors where they seem closed\",\"Parcours\":\"Programme\",\"Parcours complet du diagnostic jusqu\u2019au d\u00e9p\u00f4t, en alternance collectif et individuel.\":\"A full programme from assessment to submission, alternating group and one-to-one sessions.\",\"Parcours de formation\":\"Training path\",\"Parcours de formation, trames budg\u00e9taires, veille sur les appels \u00e0 projets, cadre logique : tout reste accessible, m\u00eame apr\u00e8s l\u2019accompagnement.\":\"Training paths, budget templates, call monitoring, logical framework: everything stays accessible, even after the support ends.\",\"Paris \u00d7 Roumanie, Espagne, Su\u00e8de\":\"Paris \u00d7 Romania, Spain, Sweden\",\"Parlons de votre projet\":\"Let\u2019s talk about your project\",\"Partenaires\":\"Partners\",\"Partenaires & financeurs\":\"Partners & funders\",\"Partenariats de coop\u00e9ration\":\"Cooperation partnerships\",\"Participants\":\"Participants\",\"Pays basque\":\"Basque Country\",\"Pays basque \u00d7 Espagne\":\"Basque Country \u00d7 Spain\",\"Pays basque \u00d7 Italie, Gr\u00e8ce\":\"Basque Country \u00d7 Italy, Greece\",\"Pays partenaire\":\"Partner country\",\"Pays partenaires\":\"Partner countries\",\"Pens\u00e9s pour les r\u00e9alit\u00e9s des \u00e9quipes associatives (b\u00e9n\u00e9voles et salari\u00e9s, temps limit\u00e9, niveaux d\u2019entr\u00e9e h\u00e9t\u00e9rog\u00e8nes), du plus l\u00e9ger au plus pouss\u00e9, et combinables dans un m\u00eame parcours.\":\"Designed for the realities of non-profit teams (volunteers and staff, limited time, mixed starting levels), from the lightest to the most in-depth, and combinable within a single programme.\",\"Personnel\":\"Staff\",\"Plateformes ressources, cartographies, outils de suivi, automatisations et solutions num\u00e9riques con\u00e7ues pour faciliter l\u2019accompagnement.\":\"Resource platforms, maps, tracking tools, automations and digital solutions designed to make support easier.\",\"Pl\u00e9ni\u00e8re \u00b7 1 journ\u00e9e\":\"Plenary \u00b7 1 day\",\"Politique de cookies\":\"Cookie policy\",\"Pologne\":\"Poland\",\"Port-de-Bouc\":\"Port-de-Bouc\",\"Porteur de projet\":\"Project lead\",\"Portugal\":\"Portugal\",\"Poste\":\"Item\",\"Pour\":\"For\",\"Pour les collectivit\u00e9s\":\"For local authorities\",\"Pour qui\":\"Who for\",\"Pourquoi nous faire confiance\":\"Why trust us\",\"Programmes europ\u00e9ens\":\"European programmes\",\"Projet Hyphen : restaurer le lien m\u00e8re-enfant en contexte de violences domestiques. Module de formation, recherche-action, deux r\u00e9sidences \u00e0 M\u00e1laga et Marseille.\":\"Hyphen project: restoring the mother-child bond in the context of domestic violence. Training module, action research, two residencies in M\u00e1laga and Marseille.\",\"Projet MEDIAWISE : l\u2019\u00e9ducation aux m\u00e9dias au service de l\u2019inclusion et de la participation d\u00e9mocratique de femmes issues de minorit\u00e9s, avec 20 \u00e9ducatrices form\u00e9es et un kit p\u00e9dagogique trilingue.\":\"MEDIAWISE project: media literacy for the inclusion and democratic participation of women from minority backgrounds, with 20 trained educators and a trilingual teaching kit.\",\"Projet READY+ : pr\u00e9parer des adultes vuln\u00e9rables \u00e0 la mobilit\u00e9 europ\u00e9enne et \u00e0 l\u2019emploi durable, avec un cadre m\u00e9thodologique, des outils p\u00e9dagogiques et une phase pilote en France et en Irlande.\":\"READY+ project: preparing vulnerable adults for European mobility and lasting employment, with a methodological framework, teaching tools and a pilot phase in France and Ireland.\",\"Projet de coop\u00e9ration europ\u00e9en\":\"European cooperation project\",\"Projets\":\"Projects\",\"Projets de coop\u00e9ration europ\u00e9enne\":\"European cooperation projects\",\"Projets de solidarit\u00e9\":\"Solidarity projects\",\"Pr\u00e9vention & \u00e9ducation\":\"Prevention & education\",\"Publics\":\"Public\",\"Publics \u00b7 4 partenaires\":\"Public \u00b7 4 partners\",\"P\u00e9dagogique\":\"Learning\",\"QPV\":\"Priority areas\",\"Quartiers Nord de Marseille\":\"Northern Marseille\",\"Quartiers prioritaires des agglom\u00e9rations\":\"Priority neighbourhoods in urban areas\",\"Recherche de partenaires\":\"Looking for partners\",\"Relecture\":\"Review\",\"Relecture et d\u00e9p\u00f4t\":\"Review and submission\",\"Renforcer l\u2019autonomie financi\u00e8re\":\"Strengthening financial independence\",\"Renforcer l\u2019insertion des publics \u00e9loign\u00e9s de l\u2019emploi via un parcours de formation-action ancr\u00e9 dans l\u2019ESS, avec mobilisation du hub inter-associatif.\":\"Helping people far from work into jobs through a learning-by-doing programme rooted in the social economy, drawing on the inter-association hub.\",\"Ressourcerie\":\"Resource hub\",\"Ressourcerie en ligne\":\"Online resource hub\",\"Ressourcerie num\u00e9rique\":\"Digital resource hub\",\"Ressources\":\"Resources\",\"Ressources p\u00e9dagogiques\":\"Learning resources\",\"Rompre l\u2019isolement des femmes confront\u00e9es aux discriminations par le sport et la culture : confiance en soi, autonomie, pouvoir d\u2019agir, et des pratiques partag\u00e9es entre structures partenaires.\":\"Breaking the isolation of women facing discrimination through sport and culture: self-confidence, autonomy, empowerment, and practices shared between partner organisations.\",\"Rural \u00b7 Outre-mer\":\"Rural \u00b7 Overseas\",\"R\u00e9gie de quartier\":\"R\u00e9gie de quartier\",\"R\u00e9partition\":\"Share\",\"R\u00e9ponse sous quelques jours ouvr\u00e9s.\":\"We reply within a few working days.\",\"R\u00e9seau\":\"Network\",\"R\u00e9seaux\":\"Networks\",\"R\u00e9seaux \u00b7 1 partenaire\":\"Networks \u00b7 1 partner\",\"R\u00e9sultats attendus\":\"Expected results\",\"SHL en chiffres\":\"SHL in figures\",\"Saisir les opportunit\u00e9s\":\"Seizing opportunities\",\"Sant\u00e9 mentale & inclusion\":\"Mental health & inclusion\",\"Se retire\":\"Steps back\",\"Sept\":\"Sep\",\"Sept collectivit\u00e9s \u00b7 Occitanie\":\"Seven local authorities \u00b7 Occitanie\",\"Si\u00e8ge \u00e0 Marseille\":\"Based in Marseille\",\"Skills for Consent : une bo\u00eete \u00e0 outils de 23 activit\u00e9s pour pr\u00e9venir les violences sexistes et sexuelles d\u00e8s l\u2019enfance, con\u00e7ue avec des enseignants et des professionnels de l\u2019enfance.\":\"Skills for Consent: a toolbox of 23 activities to prevent sexist and sexual violence from early childhood, designed with teachers and childhood professionals.\",\"Social Hackers Lab\":\"Social Hackers Lab\",\"Social Hackers Lab est ce pont.\":\"Social Hackers Lab is that bridge.\",\"Social Hackers Lab \u00b7 Incubateur associatif\":\"Social Hackers Lab \u00b7 Non-profit incubator\",\"Social Hackers Lab, accueil\":\"Social Hackers Lab, home\",\"Solidarit\u00e9 Femmes 13\":\"Solidarit\u00e9 Femmes 13\",\"Solidarit\u00e9 Femmes 13 \u00d7 Dem\u00e9ter\":\"Solidarit\u00e9 Femmes 13 \u00d7 Dem\u00e9ter\",\"Sources\":\"Sources\",\"Strasbourg\":\"Strasbourg\",\"Structure\":\"Organisation\",\"Structure accompagn\u00e9e\":\"Supported organisation\",\"Structures de l\u2019ESS, en r\u00e9seau jusqu\u2019\u00e0 l\u2019Europe\":\"Social economy organisations, networked across Europe\",\"Structures d\u2019insertion\":\"Work integration organisations\",\"Subventions\":\"Usual\",\"Suivi individuel\":\"One-to-one support\",\"Supports de formation\":\"Training materials\",\"Sur le terrain\":\"On the ground\",\"S\u00e8te Agglop\u00f4le M\u00e9diterran\u00e9e\":\"S\u00e8te Agglop\u00f4le M\u00e9diterran\u00e9e\",\"S\u00e9ance \":\"Session \",\"S\u00e9curisation\":\"Safeguards\",\"Terre Ludique\":\"Terre Ludique\",\"Territoires\":\"Territories\",\"Territoires ruraux et d\u2019outre-mer\":\"Rural and overseas territories\",\"Tesslab\":\"Tesslab\",\"Total du projet\":\"Project total\",\"Tout le r\u00e9seau \u00b7 6 partenaires\":\"Whole network \u00b7 6 partners\",\"Trame budg\u00e9taire\":\"Budget template\",\"Trames budg\u00e9taires\":\"Budget templates\",\"Transfert de comp\u00e9tences et autonomisation\":\"Skills transfer and independence\",\"Transition \u00e9cologique\":\"Ecological transition\",\"Trois garanties au service\":\"Three guarantees\",\"T\u00e9l.\":\"Tel.\",\"T\u00e9moignages\":\"Testimonials\",\"Un accompagnement adapt\u00e9 \u00e0 chaque r\u00e9alit\u00e9 : \u00e9loignement g\u00e9ographique, acc\u00e8s aux partenaires, sp\u00e9cificit\u00e9s locales, besoins de coop\u00e9ration r\u00e9gionale ou transfrontali\u00e8re. Nous intervenons notamment en Outre-mer et dans les territoires ruraux.\":\"Support adapted to each reality: geographical distance, access to partners, local specificities, needs for regional or cross-border cooperation. We work in particular in overseas France and in rural areas.\",\"Un accompagnement d\u00e9di\u00e9 aux acteurs de la Cit\u00e9 \u00e9ducative pour renforcer leur connaissance des financements europ\u00e9ens, faire \u00e9merger de nouvelles opportunit\u00e9s de coop\u00e9ration et accompagner la structuration de projets adapt\u00e9s aux besoins du territoire.\":\"Dedicated support for the partners of the Cit\u00e9 \u00e9ducative programme, to deepen their knowledge of European funding, open up new opportunities for cooperation and help structure projects suited to local needs.\",\"Un ancrage institutionnel solide\":\"Strong institutional roots\",\"Un auto-diagnostic structur\u00e9 permet \u00e0 chaque association d\u2019\u00e9valuer sa capacit\u00e9 \u00e0 mobiliser les fonds europ\u00e9ens, d\u2019identifier ses forces et de cartographier ses besoins.\":\"A structured self-assessment lets each organisation gauge its capacity to mobilise European funds, identify its strengths and map its needs.\",\"Un dispositif cl\u00e9 en main, des r\u00e9sultats mesur\u00e9s\":\"A turnkey scheme, measured results\",\"Un dispositif construit avec vous\":\"A scheme built with you\",\"Un dispositif pens\u00e9 avec le territoire, pour renforcer durablement les comp\u00e9tences de ses acteurs et leur acc\u00e8s aux financements europ\u00e9ens.\":\"A scheme designed with the area, to build lasting skills among its local players and strengthen their access to European funding.\",\"Un financeur ou une fondation\":\"A funder or foundation\",\"Un impact mesurable, ancr\u00e9 dans les territoires.\":\"Measurable impact, rooted in local areas.\",\"Un incubateur associatif d\u00e9di\u00e9 aux financements europ\u00e9ens et \u00e0 l\u2019innovation sociale. Nous accompagnons les associations \u00e0 impact dans la construction de mod\u00e8les \u00e9conomiques p\u00e9rennes, par la formation, l\u2019ing\u00e9nierie de projet et l\u2019acc\u00e8s aux fonds europ\u00e9ens.\":\"A non-profit incubator dedicated to European funding and social innovation. We help impact-driven organisations build sustainable business models through training, project engineering and access to European funds.\",\"Un incubateur associatif d\u00e9partemental : parcours de formation, autodiagnostic et ressourcerie en ligne pour les associations essonniennes.\":\"A departmental incubator: training programme, self-assessment and an online resource hub for organisations in Essonne.\",\"Un incubateur associatif m\u00e9tropolitain, inscrit dans les dynamiques du Contrat de ville, pour accompagner les structures du territoire dans l\u2019acc\u00e8s aux financements europ\u00e9ens et la structuration de leurs projets.\":\"A metropolitan incubator for non-profits, part of the City Contract (Contrat de ville) framework, helping local organisations access European funding and structure their projects.\",\"Un parcours structur\u00e9 en\":\"A structured programme in\",\"Un programme soutenu par les collectivit\u00e9s, l\u2019\u00c9tat et l\u2019Europe.\":\"A programme backed by local authorities, the French State and Europe.\",\"Une association\":\"A non-profit\",\"Une collectivit\u00e9\":\"A local authority\",\"Une expertise \u00e9prouv\u00e9e sur le terrain\":\"Proven expertise on the ground\",\"Une ing\u00e9nierie p\u00e9dagogique sur mesure\":\"Tailor-made learning design\",\"Une organisation agile, des expertises compl\u00e9mentaires, un interlocuteur unique pour chaque projet.\":\"An agile organisation, complementary expertise, a single point of contact for every project.\",\"Une ressourcerie au service\":\"A resource hub\",\"Une s\u00e9lection de projets europ\u00e9ens accompagn\u00e9s jusqu\u2019\u00e0 leur financement, repr\u00e9sentatifs de la diversit\u00e9 des th\u00e9matiques et des partenariats transnationaux.\":\"A selection of European projects supported through to funding, reflecting the diversity of themes and transnational partnerships.\",\"Une \u00e9quipe qui s\u2019adapte\":\"A team that adapts\",\"Union europ\u00e9enne\":\"European Union\",\"Veille des appels\":\"Call monitoring\",\"Veille des appels \u00e0 projets\":\"Monitoring calls for proposals\",\"Veille sur les appels\":\"Call monitoring\",\"Veille, strat\u00e9gie de financement, montage de projets, recherche de partenaires et accompagnement jusqu\u2019au d\u00e9p\u00f4t.\":\"Monitoring calls, funding strategy, project design, partner search and support through to submission.\",\"Version fran\u00e7aise\":\"Version fran\u00e7aise\",\"Ville de Clermont-l\u2019H\u00e9rault\":\"Town of Clermont-l\u2019H\u00e9rault\",\"Ville de Loos\":\"City of Loos\",\"Ville \u00b7 Hauts-de-France\":\"City \u00b7 Hauts-de-France\",\"Villes et Territoires Occitanie\":\"Villes et Territoires Occitanie\",\"Voir les projets financ\u00e9s\":\"See funded projects\",\"Vos projets\":\"Your projects\",\"Votre association\":\"Your organisation\",\"Votre projet\":\"Your project\",\"Votre \u00e9quipe\":\"Your team\",\"Vous d\u00e9finissez les priorit\u00e9s et les publics \u00e0 accompagner. Nous construisons le parcours : ing\u00e9nierie p\u00e9dagogique, formation, outils num\u00e9riques, accompagnement individualis\u00e9 et suivi jusqu\u2019au d\u00e9p\u00f4t des candidatures.\":\"You set the priorities and choose who to support. We build the programme: learning design, training, digital tools, one-to-one support and follow-up until applications are submitted.\",\"Vous \u00eates\":\"You are\",\"agriculture urbaine\":\"urban farming\",\"art contemporain\":\"contemporary art\",\"art et quartiers\":\"art and neighbourhoods\",\"associations accompagn\u00e9es partout en France\":\"organisations supported across France\",\"associations accompagn\u00e9es partout en France.\":\"organisations supported across France.\",\"associations de terrain\":\"grassroots organisations\",\"avec SHL\":\"with SHL\",\"avec des partenaires, financeurs et acteurs europ\u00e9ens.\":\"with European partners, funders and stakeholders.\",\"cantine de quartier\":\"neighbourhood canteen\",\"cinq \u00e9tapes.\":\"five steps.\",\"circuits de financement.\":\"funding channels.\",\"climat et \u00e9ducation\":\"climate and education\",\"de financements europ\u00e9ens lev\u00e9s par les structures accompagn\u00e9es.\":\"in European funding raised by the organisations we support.\",\"de l\u2019autonomie.\":\"for independence.\",\"de votre projet.\":\"for your project.\",\"des coop\u00e9rations europ\u00e9ennes.\":\"European partnerships.\",\"des structures red\u00e9posent un projet europ\u00e9en en autonomie l\u2019ann\u00e9e suivante.\":\"of organisations submit a new European project on their own the following year.\",\"dynamique europ\u00e9enne.\":\"European momentum.\",\"en acc\u00e8s continu.\":\"available at all times.\",\"en autonomie\":\"on your own\",\"et\":\"and\",\"et les acteurs publics.\":\"and public bodies.\",\"europ\u00e9ens\":\"funds\",\"familles et jeunesse\":\"families and youth\",\"femmes et m\u00e8res isol\u00e9es\":\"isolated women and mothers\",\"financements europ\u00e9ens\":\"European funding\",\"formation \u00e0 l\u2019\u00e9galit\u00e9\":\"equality training\",\"habituelles\":\"grants\",\"hubs inter-associatifs sur le territoire national.\":\"inter-association hubs across France.\",\"inclusion sociale\":\"social inclusion\",\"innovation sociale\":\"social innovation\",\"insertion par l\u2019emploi\":\"work integration\",\"la formation\":\"training\",\"la mise en r\u00e9seau\":\"networking\",\"le hacking social.\":\"social hacking.\",\"les associations de terrain, les financements europ\u00e9ens et l\u2019innovation sociale\":\"grassroots organisations, European funding and social innovation\",\"l\u2019accompagnement individualis\u00e9\":\"one-to-one support\",\"l\u2019objectif final reste l\u2019autonomie.\":\"the end goal is always independence.\",\"participation citoyenne\":\"civic participation\",\"pays\":\"countries\",\"projet\":\"project\",\"projets\":\"projects\",\"projets \u00e9ducatifs\":\"educational projects\",\"publics vuln\u00e9rables\":\"vulnerable groups\",\"ressources\":\"resources\",\"r\u00e9sultats mesurables.\":\"measurable results.\",\"r\u00e9ussite scolaire\":\"school success\",\"services de proximit\u00e9\":\"local services\",\"sonia@socialhackerslab.com\":\"sonia@socialhackerslab.com\",\"sport et jeunesse\":\"sport and youth\",\"sport inclusif\":\"inclusive sport\",\"sport pour les jeunes\":\"sport for young people\",\"s\u2019approprient les outils.\":\"make the tools their own.\",\"temps collectif\":\"group time\",\"temps individuel\":\"one-to-one time\",\"transition \u00e9cologique\":\"ecological transition\",\"un pays\":\"country\",\"\u00a9 2026 Social Hackers Lab, tous droits r\u00e9serv\u00e9s \u00b7\":\"\u00a9 2026 Social Hackers Lab, all rights reserved \u00b7\",\"\u00b7 O\u00f9 nous intervenons\":\"\u00b7 Where we work\",\"\u00c9COLE DE LA DEUXI\u00c8ME CHANCE\":\"\u00c9COLE DE LA DEUXI\u00c8ME CHANCE\",\"\u00c9changer avec l\u2019\u00e9quipe\":\"Talk to the team\",\"\u00c9changes europ\u00e9ens et formations en \u00e9ducation non formelle pour des adultes qui ont le moins d\u2019opportunit\u00e9s, notamment face \u00e0 des troubles psychiques : outils p\u00e9dagogiques et participation citoyenne.\":\"European exchanges and non-formal education training for adults with fewer opportunities, including people living with mental health conditions: teaching tools and civic participation.\",\"\u00c9cole de la 2e chance\":\"\u00c9cole de la 2e chance (second-chance school)\",\"\u00c9ducation aux m\u00e9dias\":\"Media literacy\",\"\u00c9galit\u00e9 & inclusion\":\"Equality & inclusion\",\"\u00c9galit\u00e9 & violences de genre\":\"Equality & gender-based violence\",\"\u00c9quipe\":\"Team\",\"\u00c9quipe SHL\":\"SHL team\",\"\u00c9quipe interne \u00b7 programme cibl\u00e9\":\"In-house team \u00b7 targeted programme\",\"\u00c9quipements\":\"Equipment\",\"\u00c9quipes internes\":\"In-house teams\",\"\u00c9tape 1 sur 5\":\"Step 1 of 5\",\"\u00c9tape 2 sur 5\":\"Step 2 of 5\",\"\u00c9tape 3 sur 5\":\"Step 3 of 5\",\"\u00c9tape 4 sur 5\":\"Step 4 of 5\",\"\u00c9tape 5 sur 5\":\"Step 5 of 5\",\"\u00catre accompagn\u00e9\":\"Get support\",\"\u00e0 chaque projet.\":\"to every project.\"};\r\n  var tr = function (s) { return LANG === 'en' && EN[s] || s; };\r\n  (function () {\r\n    var page = root.tagName === 'HTML' ? document.body : root;\r\n    \/\/ Changer de langue recharge la page au m\u00eame endroit : on note la section\r\n    \/\/ lue et l\u2019\u00e9cart \u00e0 son bord. Pas l\u2019ancre de l\u2019adresse, qui date du dernier\r\n    \/\/ lien cliqu\u00e9 (#europe renvoyait sur la carte).\r\n    Array.prototype.forEach.call(page.querySelectorAll('[data-lang-switch] a'), function (a) {\r\n      var to = a.getAttribute('data-lang');\r\n      if (to === LANG) a.setAttribute('aria-current', 'true');\r\n      a.addEventListener('click', function (e) {\r\n        e.preventDefault();\r\n        var q = location.search.replace(\/^\\?\/, '').split('&').filter(function (p) { return p && p.indexOf('lang=') !== 0; });\r\n        if (to === 'en') q.push('lang=en');\r\n        try {\r\n          var secs = page.querySelectorAll('section'), at = -1, dy = 0, i, t;\r\n          if (window.scrollY > 40) for (i = 0; i < secs.length; i++) {\r\n            t = secs[i].getBoundingClientRect().top;\r\n            if (t > 90) break;\r\n            at = i; dy = -t;\r\n          }\r\n          if (at >= 0) sessionStorage.setItem('shl-lang-at', at + ':' + Math.round(dy));\r\n        } catch (err) {}\r\n        location.href = location.pathname + (q.length ? '?' + q.join('&') : '');\r\n      });\r\n    });\r\n    if (LANG !== 'en') return;\r\n    var hold = document.getElementById('lang-hold');\r\n    try {\r\n      var norm = function (t) { return t.replace(\/\\s+\/g, ' ').trim(); };\r\n      var miss = {}, n, k;\r\n      var walker = document.createTreeWalker(page, NodeFilter.SHOW_TEXT, null);\r\n      while ((n = walker.nextNode())) {\r\n        var tag = n.parentNode.nodeName;\r\n        if (tag === 'SCRIPT' || tag === 'STYLE') continue;\r\n        k = norm(n.nodeValue);\r\n        if (!\/[A-Za-z\\u00c0-\\u00ff]\/.test(k)) continue;\r\n        if (EN[k] == null) { miss[k] = 1; continue; }\r\n        n.nodeValue = \/^\\s*\/.exec(n.nodeValue)[0] + EN[k] + \/\\s*$\/.exec(n.nodeValue)[0];\r\n      }\r\n      ['aria-label', 'alt', 'title', 'placeholder', 'data-cap'].forEach(function (at) {\r\n        Array.prototype.forEach.call(page.querySelectorAll('[' + at + ']'), function (el) {\r\n          k = norm(el.getAttribute(at));\r\n          if (!\/[A-Za-z\\u00c0-\\u00ff]\/.test(k)) return;\r\n          if (EN[k] == null) miss[k] = 1; else el.setAttribute(at, EN[k]);\r\n        });\r\n      });\r\n      root.setAttribute('lang', 'en');\r\n      if (root.tagName === 'HTML' && EN[norm(document.title)]) document.title = EN[norm(document.title)];\r\n      if (Object.keys(miss).length) console.info('Traduction manquante (' + Object.keys(miss).length + ')', Object.keys(miss));\r\n    } finally {\r\n      if (hold) hold.parentNode.removeChild(hold);\r\n    }\r\n  })();\r\n  \/\/ \u00c0 l\u2019arriv\u00e9e dans l\u2019autre langue, on revient \u00e0 cet endroit, sans glisser\r\n  var back = null;\r\n  try { back = \/^(\\d+):(-?\\d+)$\/.exec(sessionStorage.getItem('shl-lang-at') || ''); sessionStorage.removeItem('shl-lang-at'); } catch (err) {}\r\n  if (back) {\r\n    var moved = false;\r\n    var goBack = function () {\r\n      var sec = (root.tagName === 'HTML' ? document.body : root).querySelectorAll('section')[+back[1]];\r\n      if (moved || !sec) return;\r\n      var se = document.scrollingElement || document.body;\r\n      se.style.scrollBehavior = 'auto';\r\n      window.scrollTo(0, sec.getBoundingClientRect().top + window.scrollY + +back[2]);\r\n      se.style.scrollBehavior = '';\r\n    };\r\n    goBack();\r\n    \/\/ Les polices et les images peuvent encore d\u00e9caler la page : on recale,\r\n    \/\/ tant que le visiteur n\u2019a pas repris la main\r\n    ['wheel', 'touchstart', 'keydown', 'mousedown'].forEach(function (ev) { window.addEventListener(ev, function () { moved = true; }, { once: true, passive: true }); });\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(goBack);\r\n    window.addEventListener('load', goBack);\r\n  }\r\n  \/\/ L\u2019ouverture (le pont en petit) ne joue qu\u2019en arrivant en haut de page\r\n  var intro = document.getElementById('shl-accueil').querySelector('[data-intro]');\r\n  var introOn = !!intro && !calm && !document.hidden && !location.hash && window.scrollY < 40;\r\n  if (intro && !introOn) intro.parentNode.removeChild(intro);\r\n  if (introOn) root.classList.add('intro-hold');\r\n  \/* ---------------- En-t\u00eate ---------------- *\/\r\n  var header = document.getElementById('shl-accueil').querySelector('[data-header]');\r\n  var menuBtn = document.getElementById('shl-accueil').querySelector('[data-menu]');\r\n  var mobileNav = document.getElementById('mobile-nav');\r\n  var onScroll = function () { header.classList.toggle('is-solid', window.scrollY > 24); };\r\n  onScroll();\r\n  window.addEventListener('scroll', onScroll, { passive: true });\r\n  var setMenu = function (open) {\r\n    menuBtn.setAttribute('aria-expanded', String(open));\r\n    mobileNav.hidden = !open;\r\n    header.classList.toggle('is-open', open);\r\n  };\r\n  menuBtn.addEventListener('click', function () { setMenu(mobileNav.hidden); });\r\n  mobileNav.addEventListener('click', function (e) { if (e.target.closest('a')) setMenu(false); });\r\n  document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !mobileNav.hidden) { setMenu(false); menuBtn.focus(); } });\r\n  \/\/ Lien de navigation courant : un trait dans la teinte de sa section glisse\r\n  \/\/ sous le mot. Au survol, il suit la souris et prend la teinte du lien.\r\n  var nav = document.getElementById('shl-accueil').querySelector('.main-nav');\r\n  var thumb = nav.querySelector('.nav-thumb');\r\n  var navLinks = Array.prototype.slice.call(nav.querySelectorAll('a'));\r\n  var navTargets = navLinks.map(function (a) { return document.getElementById('shl-accueil').querySelector(a.getAttribute('href')); });\r\n  var current = null, hovered = null;\r\n  var placeThumb = function () {\r\n    var a = hovered || current;\r\n    thumb.style.opacity = a ? '1' : '0';\r\n    if (!a) return;\r\n    var first = !thumb.style.width;\r\n    if (first) thumb.style.transition = 'opacity .3s';\r\n    var pad = parseFloat(getComputedStyle(a).paddingLeft) || 0;\r\n    thumb.style.width = a.offsetWidth - 2 * pad + 'px';\r\n    thumb.style.transform = 'translateX(' + (a.offsetLeft + pad) + 'px)';\r\n    thumb.style.backgroundColor = getComputedStyle(a).getPropertyValue('--c');\r\n    if (first) { void thumb.offsetWidth; thumb.style.transition = ''; }\r\n  };\r\n  navLinks.forEach(function (a) { a.addEventListener('mouseenter', function () { hovered = a; placeThumb(); }); });\r\n  nav.addEventListener('mouseleave', function () { hovered = null; placeThumb(); });\r\n  window.addEventListener('resize', placeThumb);\r\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(placeThumb);\r\n  if ('IntersectionObserver' in window) {\r\n    var navIO = new IntersectionObserver(function (entries) {\r\n      entries.forEach(function (entry) {\r\n        if (!entry.isIntersecting) {\r\n          \/\/ Retour en haut de page : plus aucune section courante\r\n          if (entry.target === navTargets[0] && entry.boundingClientRect.top > 0) current = null; else return;\r\n        } else {\r\n          current = navLinks[navTargets.indexOf(entry.target)] || null;\r\n        }\r\n        navLinks.forEach(function (a) { a.classList.toggle('is-current', a === current); });\r\n        placeThumb();\r\n      });\r\n    }, { rootMargin: '-45% 0px -50% 0px' });\r\n    navTargets.forEach(function (t) { if (t) navIO.observe(t); });\r\n    \/\/ Tout en haut de page, aucune section n\u2019est courante\r\n    window.addEventListener('scroll', function () {\r\n      if (!current || navTargets[0].getBoundingClientRect().top < window.innerHeight * .5) return;\r\n      current = null;\r\n      navLinks.forEach(function (a) { a.classList.remove('is-current'); });\r\n      placeThumb();\r\n    }, { passive: true });\r\n  }\r\n  \/* ---------------- Apparitions ---------------- *\/\r\n  var onView = function (els, fn, opts) {\r\n    if (!('IntersectionObserver' in window)) { els.forEach(fn); return; }\r\n    var io = new IntersectionObserver(function (entries) {\r\n      entries.forEach(function (entry) { if (entry.isIntersecting) { io.unobserve(entry.target); fn(entry.target); } });\r\n    }, opts || { rootMargin: '0px 0px -12% 0px' });\r\n    els.forEach(function (el) { io.observe(el); });\r\n  };\r\n  onView(Array.prototype.slice.call(document.getElementById('shl-accueil').querySelectorAll('[data-reveal]')), function (el) { el.classList.add('is-in'); });\r\n  \/* ---------------- Titre : les lignes montent, police charg\u00e9e ---------------- *\/\r\n  var loaded = function () { root.classList.add('is-loaded'); };\r\n  \/\/ Avec l\u2019ouverture, c\u2019est elle qui fait monter le titre\r\n  if (introOn) {} else if (document.fonts && document.fonts.ready) { document.fonts.ready.then(loaded); window.setTimeout(loaded, 900); } else loaded();\r\n  \/* ---------------- Chiffres ---------------- *\/\r\n  var fmt = function (v, d) { return v.toLocaleString(LANG === 'en' ? 'en-GB' : 'fr-FR', { minimumFractionDigits: d, maximumFractionDigits: d }); };\r\n  \/\/ Le compteur part avec l\u2019apparition de son chiffre : m\u00eame seuil que le fondu, m\u00eame\r\n  \/\/ d\u00e9calage (--d). Le z\u00e9ro se pose dans la m\u00eame image que le fondu commence, si bien\r\n  \/\/ qu\u2019on ne voit jamais le chiffre final avant qu\u2019il retombe \u00e0 z\u00e9ro.\r\n  onView(Array.prototype.slice.call(document.getElementById('shl-accueil').querySelectorAll('[data-count]')).map(function (el) { return el.closest('[data-reveal]') || el; }), function (box) {\r\n    var el = box.matches('[data-count]') ? box : box.querySelector('[data-count]');\r\n    var target = parseFloat(el.dataset.count), dec = parseInt(el.dataset.decimals || '0', 10);\r\n    if (calm) { el.textContent = fmt(target, dec); return; }\r\n    var dur = 1600, t0 = 0;\r\n    var tick = function (now) {\r\n      if (!t0) t0 = now;\r\n      var p = Math.min(1, (now - t0) \/ dur), e = 1 - Math.pow(1 - p, 4);\r\n      el.textContent = fmt(target * e, dec);\r\n      if (p < 1) requestAnimationFrame(tick);\r\n    };\r\n    el.textContent = fmt(0, dec);\r\n    window.setTimeout(function () { requestAnimationFrame(tick); }, parseInt(box.style.getPropertyValue('--d') || '0', 10));\r\n  });\r\n  \/* ---------------- Identit\u00e9 : trois sc\u00e8nes anim\u00e9es ---------------- *\/\r\n  \/\/ Chaque carte joue sa sc\u00e8ne en boucle tant qu\u2019elle est \u00e0 l\u2019\u00e9cran. Les mots ne\r\n  \/\/ bougent jamais : seuls les rep\u00e8res se d\u00e9placent (point, curseur, surlignage,\r\n  \/\/ barre), et le texte n\u2019arrive qu\u2019en fondu, une fois le mouvement fini. Le\r\n  \/\/ balisage porte d\u00e9j\u00e0 l\u2019\u00e9tat final : c\u2019est lui qu\u2019on garde en mouvement r\u00e9duit.\r\n  (function () {\r\n    var each = function (list, fn) { Array.prototype.forEach.call(list, fn); };\r\n    var turn = function (el, cls, on) { el.classList.toggle(cls, !!on); };\r\n    var restart = function (el, cls) { el.classList.remove(cls); void el.offsetWidth; el.classList.add(cls); };\r\n    var scenes = {\r\n      \/\/ 01 \u00b7 Autonomie financi\u00e8re : vos projets tiennent sur un seul pilier et\r\n      \/\/ vacillent ; les fonds europ\u00e9ens, puis les autres ressources, montent sous le\r\n      \/\/ plateau et l\u2019immobilisent. Les mots n\u2019arrivent qu\u2019une fois tout immobile.\r\n      piliers: function (st) {\r\n        var cols = st.querySelectorAll('.pil-col'), slab = st.querySelector('.pil-slab');\r\n        var DROP = 96, REACH = 119, TILT = 6 * Math.PI \/ 180, PERIOD = 2600, raf = 0;\r\n        var side = [cols[0], cols[2]].map(function (col) { return { col: col, p: 1, from: 1, to: 1, t0: 0, d: 1 }; });\r\n        var ease = function (k) { return k < .5 ? 4 * k * k * k : 1 - Math.pow(2 - 2 * k, 3) \/ 2; };\r\n        var move = function (s, to, d) { s.from = s.p; s.to = to; s.t0 = performance.now(); s.d = d; };\r\n        \/\/ Marge de bascule d\u2019un c\u00f4t\u00e9 : pleine quand le pilier est loin, elle se\r\n        \/\/ referme en douceur \u00e0 son approche (tanh x \u2264 x : le plateau ne le traverse pas)\r\n        var room = function (s) { return TILT * Math.tanh(Math.asin(Math.min(1, (1 - s.p) * DROP \/ REACH)) \/ TILT); };\r\n        var draw = function (now) {\r\n          side.forEach(function (s) {\r\n            var k = Math.min(1, (now - s.t0) \/ s.d);\r\n            s.p = s.from + (s.to - s.from) * ease(k);\r\n            s.col.setAttribute('transform', 'translate(0 ' + ((1 - s.p) * DROP).toFixed(2) + ')');\r\n          });\r\n          \/\/ Le plateau se balance autour du pilier central, entre les deux marges :\r\n          \/\/ la bascule se resserre \u00e0 chaque pilier qui monte et s\u2019\u00e9teint avec le dernier\r\n          var L = room(side[0]), R = room(side[1]);\r\n          var a = (R - L) \/ 2 + (R + L) \/ 2 * Math.sin(now \/ PERIOD * 2 * Math.PI);\r\n          slab.setAttribute('transform', 'rotate(' + (a * 180 \/ Math.PI).toFixed(3) + ' 150 44)');\r\n        };\r\n        var loop = function (now) { draw(now); raf = window.requestAnimationFrame(loop); };\r\n        return {\r\n          reset: function () { turn(st, 'is-b', 0); side.forEach(function (s) { s.from = s.to = 0; }); draw(performance.now()); },\r\n          steps: [\r\n            [function () {}, 1600],\r\n            [function () { move(side[0], 1, 1300); }, 1700],\r\n            [function () { move(side[1], 1, 1300); }, 1700],\r\n            [function () { turn(st, 'is-b', 1); }, 4400],\r\n            [function () { turn(st, 'is-b', 0); }, 300],\r\n            [function () { move(side[0], 0, 1000); move(side[1], 0, 1000); }, 1200]\r\n          ],\r\n          \/\/ Le balancement tourne en continu, mais seulement quand la sc\u00e8ne est visible\r\n          run: function (go) { window.cancelAnimationFrame(raf); raf = go ? window.requestAnimationFrame(loop) : 0; }\r\n        };\r\n      },\r\n      \/\/ 02 \u00b7 Dans la dur\u00e9e : un premier dossier s\u2019\u00e9crit \u00e0 deux, SHL en gris, l\u2019\u00e9quipe\r\n      \/\/ en vert, puis il est d\u00e9pos\u00e9. SHL s\u2019\u00e9clipse ; l\u2019\u00e9quipe duplique le mod\u00e8le et\r\n      \/\/ remplit seule, de plus en plus vite, deux nouveaux dossiers. Tout suit une\r\n      \/\/ horloge unique, qui s\u2019arr\u00eate hors \u00e9cran et reprend o\u00f9 elle en \u00e9tait.\r\n      dossiers: function (st) {\r\n        var Y = 10, GRAB = [24, 15], OUT = 14400, LOOP = 15200;\r\n        var LINES = [[10, 28, 52], [10, 39, 44], [10, 50, 52], [10, 61, 30]];\r\n        var lin = function (k) { return k; },\r\n            io = function (k) { return k < .5 ? 4 * k * k * k : 1 - Math.pow(2 - 2 * k, 3) \/ 2; },\r\n            sine = function (k) { return (1 - Math.cos(Math.PI * k)) \/ 2; },\r\n            out = function (k) { return 1 - Math.pow(1 - k, 3); },\r\n            back = function (k) { k -= 1; return 1 + 2.4 * k * k * k + 1.4 * k * k; };\r\n        \/\/ Une piste : des segments [d\u00e9but, fin, de, \u00e0, courbe], rang\u00e9s dans l\u2019ordre du temps\r\n        var track = function (v) { return [[0, 0, v, v, lin]]; };\r\n        var val = function (tr, t) {\r\n          var v = tr[0][2];\r\n          for (var i = 0; i < tr.length && t >= tr[i][0]; i++) {\r\n            var s = tr[i], e = s[4](s[1] > s[0] ? Math.min(1, (t - s[0]) \/ (s[1] - s[0])) : 1);\r\n            v = typeof s[2] === 'number' ? s[2] + (s[3] - s[2]) * e : [s[2][0] + (s[3][0] - s[2][0]) * e, s[2][1] + (s[3][1] - s[2][1]) * e];\r\n          }\r\n          return v;\r\n        };\r\n        var sheets = Array.prototype.map.call(st.querySelectorAll('.dos-sheet'), function (g, k) {\r\n          var x = 14 + 100 * k;\r\n          return { g: g, x: x, fills: g.querySelectorAll('.dos-fill'), ok: g.querySelector('.dos-ok'), lift: g.querySelector('.dos-lift'),\r\n            pos: track([x, Y]), show: track(0), up: track(0), pop: track(0), ink: LINES.map(function () { return track(0); }) };\r\n        });\r\n        var cursor = function (sel, at) { return { el: st.querySelector(sel), at: at, pos: track(at), show: track(0) }; };\r\n        var shl = cursor('.dos-cur.is-shl', [-16, 34]), you = cursor('.dos-cur.is-you', [150, 150]), live = st.querySelector('.dos-live');\r\n        var go = function (c, t0, t1, to, e) { c.pos.push([t0, t1, c.at, to, e || io]); c.at = to; };\r\n        var tip = function (s, i, end) { return [s.x + LINES[i][0] + (end ? LINES[i][2] : 0), Y + LINES[i][1] + 2]; };\r\n        \/\/ Le trait suit la pointe du curseur : m\u00eame dur\u00e9e, m\u00eame courbe\r\n        var write = function (c, s, i, t, d) { go(c, t, t + d, tip(s, i, 1), sine); s.ink[i].push([t, t + d, 0, 1, sine]); return t + d; };\r\n        \/\/ Dupliquer : la copie se d\u00e9tache du dossier mod\u00e8le, suit le curseur, se pose\r\n        var copy = function (from, to, t) {\r\n          go(you, t - 550, t, [from.x + GRAB[0], Y + GRAB[1]]);\r\n          to.pos = [[0, 0, [from.x, Y], [from.x, Y], lin], [t + 180, t + 900, [from.x, Y], [to.x, Y], io]];\r\n          to.show.push([t, t + 260, 0, 1, out]);\r\n          to.up.push([t, t + 220, 0, 1, out], [t + 900, t + 1150, 1, 0, io]);\r\n          go(you, t + 180, t + 900, [to.x + GRAB[0], Y + GRAB[1]]);\r\n          return t + 1150;\r\n        };\r\n        var alone = function (s, t, k) {\r\n          for (var i = 0; i < 4; i++) {\r\n            go(you, t, t + 150 * k, tip(s, i, 0));\r\n            t = write(you, s, i, t + 150 * k, (60 + LINES[i][2] * 6) * k);\r\n          }\r\n          s.pop.push([t + 100, t + 500, 0, 1, back]);\r\n          return t + 500;\r\n        };\r\n        var A = sheets[0], B = sheets[1], C = sheets[2];\r\n        \/\/ Ann\u00e9e 1 : \u00e0 deux, ligne par ligne\r\n        A.show.push([200, 650, 0, 1, out]);\r\n        shl.show.push([400, 700, 0, 1, lin]); you.show.push([550, 850, 0, 1, lin]);\r\n        go(shl, 400, 1150, tip(A, 0, 0)); go(you, 550, 1350, tip(A, 1, 0));\r\n        write(shl, A, 0, 1300, 580);\r\n        go(shl, 1880, 2350, tip(A, 2, 0));\r\n        write(you, A, 1, 1880, 520);\r\n        write(shl, A, 2, 2400, 580);\r\n        go(you, 2400, 2850, tip(A, 3, 0));\r\n        write(you, A, 3, 2980, 400);\r\n        A.pop.push([3500, 3900, 0, 1, back]);\r\n        \/\/ SHL s\u2019\u00e9clipse\r\n        go(shl, 3950, 4850, [-24, -18]); shl.show.push([4150, 4850, 1, 0, lin]);\r\n        \/\/ Ann\u00e9e 2 : l\u2019\u00e9quipe seule, deux fois, de plus en plus vite\r\n        alone(C, copy(B, C, alone(B, copy(A, B, 5300), 1) + 250), .8);\r\n        go(you, 12500, 13100, [276, 100]);\r\n        var P = function (v) { return v.toFixed(2); };\r\n        var draw = function (t) {\r\n          sheets.forEach(function (s) {\r\n            var p = val(s.pos, t), show = val(s.show, t), up = val(s.up, t);\r\n            s.g.setAttribute('transform', 'translate(' + P(p[0] + 36) + ' ' + P(p[1] + 48) + ') scale(' + (.96 + .04 * show + .035 * up).toFixed(4) + ') translate(-36 -48)');\r\n            s.g.style.opacity = show;\r\n            s.lift.style.opacity = up;\r\n            s.ink.forEach(function (tr, i) { s.fills[i].setAttribute('width', P(LINES[i][2] * val(tr, t))); });\r\n            s.ok.setAttribute('transform', 'translate(58 80) scale(' + Math.max(0, val(s.pop, t)).toFixed(4) + ')');\r\n          });\r\n          [shl, you].forEach(function (c) {\r\n            var p = val(c.pos, t);\r\n            c.el.setAttribute('transform', 'translate(' + P(p[0]) + ' ' + P(p[1]) + ')');\r\n            c.el.style.opacity = val(c.show, t);\r\n          });\r\n          live.style.opacity = t < OUT ? 1 : Math.max(0, 1 - (t - OUT) \/ 550);\r\n        };\r\n        var raf = 0, clock = 0, last = 0;\r\n        var frame = function (now) { clock = (clock + Math.min(50, now - last)) % LOOP; last = now; draw(clock); raf = window.requestAnimationFrame(frame); };\r\n        return {\r\n          reset: function () { clock = 0; draw(0); },\r\n          run: function (on) { window.cancelAnimationFrame(raf); raf = on ? (last = performance.now(), window.requestAnimationFrame(frame)) : 0; }\r\n        };\r\n      },\r\n      \/\/ 03 \u00b7 Opportunit\u00e9s : de gauche \u00e0 droite, un fil se trace de l\u2019association vers\r\n      \/\/ chaque drapeau, qui prend ses couleurs \u00e0 l\u2019arriv\u00e9e ; puis tout s\u2019efface\r\n      reseau: function (st) {\r\n        var NS = 'http:\/\/www.w3.org\/2000\/svg';\r\n        var svg = st.querySelector('svg'), core = st.querySelector('.net-core');\r\n        var nodes = Array.prototype.slice.call(st.querySelectorAll('.net-node'));\r\n        var paths = [], dot = null, raf = 0;\r\n        var layout = function () {\r\n          var w = st.clientWidth, h = st.clientHeight;\r\n          if (!w || !h) return;\r\n          var cx = w \/ 2, cy = h - 42, hy = cy - 16;\r\n          var R = Math.max(90, Math.min((w \/ 2 - 34) \/ .906, cy - 46));\r\n          core.style.setProperty('--x', cx + 'px');\r\n          core.style.setProperty('--y', cy + 'px');\r\n          svg.setAttribute('viewBox', '0 0 ' + w + ' ' + h);\r\n          svg.textContent = '';\r\n          [.44, .66, .88].forEach(function (f) {\r\n            var r = R * f, p = document.createElementNS(NS, 'path');\r\n            p.setAttribute('d', 'M' + (cx - r) + ' ' + cy + 'A' + r + ' ' + r + ' 0 0 1 ' + (cx + r) + ' ' + cy);\r\n            p.setAttribute('class', 'net-band');\r\n            p.setAttribute('stroke-width', Math.round(R * .07));\r\n            svg.appendChild(p);\r\n          });\r\n          \/\/ Chaque fil monte droit de l\u2019association, puis s\u2019incline vers son drapeau\r\n          paths = nodes.map(function (node, i) {\r\n            var a = Math.PI * (155 - i * 26) \/ 180, x = cx + R * Math.cos(a), y = cy - R * Math.sin(a), my = (hy + y) \/ 2;\r\n            var p = document.createElementNS(NS, 'path');\r\n            node.style.setProperty('--x', x + 'px');\r\n            node.style.setProperty('--y', y + 'px');\r\n            p.setAttribute('d', 'M' + cx + ' ' + hy + 'C' + cx + ' ' + my + ' ' + x + ' ' + my + ' ' + x + ' ' + y);\r\n            p.setAttribute('class', 'net-line' + (node.classList.contains('is-on') ? ' is-on' : ''));\r\n            p.style.setProperty('--c', getComputedStyle(node).getPropertyValue('--c').trim());\r\n            svg.appendChild(p);\r\n            return p;\r\n          });\r\n          dot = document.createElementNS(NS, 'circle');\r\n          dot.setAttribute('r', 3.5);\r\n          dot.setAttribute('class', 'net-dot');\r\n          svg.appendChild(dot);\r\n        };\r\n        var connect = function (i) {\r\n          var p = paths[i], L = p.getTotalLength(), t0 = performance.now();\r\n          restart(core, 'is-ping');\r\n          p.style.strokeDasharray = L;\r\n          p.style.strokeDashoffset = L;\r\n          p.classList.add('is-on');\r\n          dot.style.setProperty('--c', p.style.getPropertyValue('--c'));\r\n          dot.classList.add('is-on');\r\n          window.cancelAnimationFrame(raf);\r\n          var frame = function (now) {\r\n            var k = Math.min(1, (now - t0) \/ 700), e = k < .5 ? 4 * k * k * k : 1 - Math.pow(2 - 2 * k, 3) \/ 2, pt = p.getPointAtLength(L * e);\r\n            p.style.strokeDashoffset = L * (1 - e);\r\n            dot.setAttribute('cx', pt.x);\r\n            dot.setAttribute('cy', pt.y);\r\n            if (k < 1) raf = window.requestAnimationFrame(frame);\r\n            else { dot.classList.remove('is-on'); nodes[i].classList.add('is-on'); }\r\n          };\r\n          raf = window.requestAnimationFrame(frame);\r\n        };\r\n        var clear = function () {\r\n          st.classList.remove('is-fade');\r\n          nodes.forEach(function (n) { n.classList.remove('is-on'); });\r\n          paths.forEach(function (p) { p.classList.remove('is-on'); p.style.strokeDasharray = p.style.strokeDashoffset = ''; });\r\n        };\r\n        var steps = nodes.map(function (n, i) { return [function () { connect(i); }, 880]; });\r\n        steps.push([function () {}, 2400]);\r\n        steps.push([function () { turn(st, 'is-fade', 1); nodes.forEach(function (n) { n.classList.remove('is-on'); }); }, 800]);\r\n        steps.push([clear, 500]);\r\n        return { layout: layout, reset: function () { clear(); st.classList.add('is-live'); }, steps: steps };\r\n      },\r\n      \/\/ Garanties \u00b7 01 : le compteur monte \u00e0 150 quand la carte appara\u00eet ; les\r\n      \/\/ associations, elles, d\u00e9filent en continu, \u00e0 allure lente et constante,\r\n      \/\/ sans jamais s\u2019arr\u00eater.\r\n      terrain: function (st) {\r\n        var list = st.querySelector('.ros-list'), track = list.parentNode, odo = st.querySelector('[data-odo]');\r\n        var started = false, reels = [], dur = 0, SPEED = 20;\r\n        \/\/ La liste suivie de sa copie : la boucle se referme sans raccord\r\n        track.appendChild(list.cloneNode(true));\r\n        st.querySelector('.ros').classList.add('is-loop');\r\n        \/\/ Compteur \u00e0 rouleaux : chaque chiffre d\u00e9file depuis 0, les unit\u00e9s tournent le plus\r\n        if (odo && !calm) {\r\n          var digits = odo.textContent.trim().split('');\r\n          odo.textContent = '';\r\n          digits.forEach(function (ch, i) {\r\n            var col = document.createElement('span'), reel = document.createElement('span'), ghost = document.createElement('i');\r\n            var n = +ch + 10 * i;\r\n            ghost.textContent = '0';\r\n            col.appendChild(ghost);\r\n            for (var v = 0; v <= n; v++) { var c = document.createElement('span'); c.textContent = v % 10; reel.appendChild(c); }\r\n            col.className = 'odo';\r\n            col.style.setProperty('--od', i * 140 + 'ms');\r\n            col.appendChild(reel);\r\n            odo.appendChild(col);\r\n            reels.push({ col: col, ghost: ghost, ch: ch, reel: reel, n: n });\r\n          });\r\n        }\r\n        \/\/ Largeurs en em : elles suivent la taille du chiffre d\u2019une mise en page \u00e0 l\u2019autre\r\n        var count = function () {\r\n          if (!reels.length) return;\r\n          var fs = parseFloat(getComputedStyle(odo).fontSize);\r\n          reels.forEach(function (r) {\r\n            var w0 = r.col.offsetWidth;\r\n            r.ghost.textContent = r.ch;\r\n            var w1 = r.col.offsetWidth;\r\n            r.col.style.width = w0 \/ fs + 'em';\r\n            void r.col.offsetWidth;\r\n            r.col.style.width = w1 \/ fs + 'em';\r\n            r.reel.style.transform = 'translateY(' + -r.n + 'em)';\r\n          });\r\n        };\r\n        return {\r\n          \/\/ Allure fixe en px\/s, quelle que soit la hauteur de la liste ; on ne la\r\n          \/\/ retouche que si la liste change vraiment, pour ne pas faire sauter le d\u00e9filement\r\n          layout: function () {\r\n            var d = list.offsetHeight \/ SPEED;\r\n            if (Math.abs(d - dur) > 2) { dur = d; track.style.setProperty('--dur', d.toFixed(1) + 's'); }\r\n          },\r\n          reset: function () {},\r\n          run: function (go) {\r\n            if (!go || started) return;\r\n            started = true;\r\n            count();\r\n          }\r\n        };\r\n      },\r\n      \/\/ Garanties \u00b7 02 : l\u2019incubateur au c\u0153ur, ses partenaires rang\u00e9s par famille.\r\n      \/\/ Les fils partent de lui ; puis chaque famille, tour \u00e0 tour, envoie son\r\n      \/\/ signal jusqu\u2019au c\u0153ur, qui bat \u00e0 chaque arriv\u00e9e. En dernier, toutes ensemble.\r\n      \/\/ La barre de l\u2019\u00e9tiquette active sert de minuterie ; le libell\u00e9 du haut dit\r\n      \/\/ la famille et son nombre de partenaires. Un clic sur une famille, un\r\n      \/\/ partenaire ou le c\u0153ur prend la main.\r\n      ancrage: function (st) {\r\n        var NS = 'http:\/\/www.w3.org\/2000\/svg';\r\n        var box = st.querySelector('.anc'), svg = st.querySelector('.anc-wires'), core = st.querySelector('.anc-core');\r\n        var base = svg.querySelector('.anc-base'), live = svg.querySelector('.anc-live');\r\n        var fams = Array.prototype.slice.call(st.querySelectorAll('.anc-fam'));\r\n        var cap = st.querySelector('.sc-cap'), capText = st.querySelector('[data-cap-text]'), counter = st.querySelector('[data-fam-count]');\r\n        var ALL = capText.textContent, F = fams.length + 1, pad = function (n) { return (n < 10 ? '0' : '') + n; };\r\n        var TAIL = 42, D = 1150, links = [], flying = [], raf = 0, f = -1, auto = !calm, started = false, swap = 0;\r\n        var el = function (tag, cls, k) { var e = document.createElementNS(NS, tag); e.setAttribute('class', cls); if (k) e.style.setProperty('--k', k); return e; };\r\n        fams.forEach(function (fam, fi) {\r\n          var k = getComputedStyle(fam).getPropertyValue('--k').trim();\r\n          fam.style.setProperty('--f', fi);\r\n          Array.prototype.forEach.call(fam.querySelectorAll('li'), function (li, j) {\r\n            li.style.setProperty('--j', j);\r\n            var link = { fam: fam, tag: fam.querySelector('.anc-tag'), li: li, k: k, L: 0,\r\n              wire: el('path', 'anc-wire'), comet: el('path', 'anc-comet', k), head: el('circle', 'anc-head', k) };\r\n            link.wire.style.setProperty('--f', fi);\r\n            link.head.setAttribute('r', 3.6);\r\n            link.comet.style.opacity = 0;\r\n            base.appendChild(link.wire);\r\n            live.appendChild(link.comet);\r\n            live.appendChild(link.head);\r\n            links.push(link);\r\n          });\r\n        });\r\n        var P = function (v) { return v.toFixed(1); };\r\n        \/\/ Chaque fil part du partenaire, traverse l\u2019\u00e9tiquette de sa famille et\r\n        \/\/ arrive sur le bord du c\u0153ur, dans l\u2019axe du centre\r\n        \/\/ Positions de mise en page, relatives au r\u00e9seau : les transformations\r\n        \/\/ de l\u2019apparition (d\u00e9calage, \u00e9chelle) ne faussent pas le trac\u00e9\r\n        var rect = function (e) {\r\n          var r = { w: e.offsetWidth, h: e.offsetHeight, x: 0, y: 0 };\r\n          for (; e && e !== box; e = e.offsetParent) { r.x += e.offsetLeft; r.y += e.offsetTop; }\r\n          return r;\r\n        };\r\n        var layout = function () {\r\n          if (!box.offsetWidth) return;\r\n          var c = rect(core), cx = c.x + c.w \/ 2, cy = c.y + c.h \/ 2, R = c.w \/ 2 + 2;\r\n          svg.setAttribute('viewBox', '0 0 ' + box.offsetWidth + ' ' + box.offsetHeight);\r\n          links.forEach(function (k) {\r\n            var r = rect(k.li), t = rect(k.tag);\r\n            var x = r.x, y = r.y + r.h \/ 2, d = 'M' + P(x) + ' ' + P(y);\r\n            if (t.x + t.w < r.x - 4) {\r\n              var tr = t.x + t.w, tl = t.x + 8, ty = t.y + t.h \/ 2, m = (x - tr) \/ 2;\r\n              d += ' C' + P(x - m) + ' ' + P(y) + ' ' + P(tr + m) + ' ' + P(ty) + ' ' + P(tr) + ' ' + P(ty) + ' L' + P(tl) + ' ' + P(ty);\r\n              x = tl; y = ty;\r\n            }\r\n            var an = Math.atan2(y - cy, x - cx), ex = cx + R * Math.cos(an), ey = cy + R * Math.sin(an), m2 = Math.max(12, (x - ex) \/ 2);\r\n            d += ' C' + P(x - m2) + ' ' + P(y) + ' ' + P(ex + m2 * .6 * Math.cos(an)) + ' ' + P(ey + m2 * .6 * Math.sin(an)) + ' ' + P(ex) + ' ' + P(ey);\r\n            k.wire.setAttribute('d', d);\r\n            k.comet.setAttribute('d', d);\r\n            k.L = k.wire.getTotalLength();\r\n            k.wire.style.strokeDasharray = P(k.L) + ' ' + P(k.L);\r\n            k.wire.style.setProperty('--L', P(k.L) + 'px');\r\n            k.comet.style.strokeDasharray = TAIL + ' ' + P(k.L + TAIL * 2);\r\n          });\r\n        };\r\n        var io = function (x) { return x < .5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) \/ 2; };\r\n        \/\/ Un signal : une tra\u00een\u00e9e courte et une t\u00eate lumineuse, du partenaire au c\u0153ur\r\n        var frame = function (now) {\r\n          flying = flying.filter(function (p) {\r\n            var k = p.link, u = (now - p.t0) \/ D;\r\n            if (u < 0) return true;\r\n            if (!p.lit) { p.lit = true; k.li.classList.add('is-ping'); k.comet.style.opacity = 1; }\r\n            var s = io(Math.min(1, u)) * (k.L + TAIL), h = Math.min(s, k.L), pt = k.wire.getPointAtLength(h);\r\n            k.comet.style.strokeDashoffset = P(TAIL - s);\r\n            k.head.setAttribute('cx', P(pt.x));\r\n            k.head.setAttribute('cy', P(pt.y));\r\n            k.head.style.opacity = s < k.L ? Math.min(1, s \/ 20) : Math.max(0, 1 - (s - k.L) \/ TAIL);\r\n            if (!p.hit && s >= k.L) {\r\n              p.hit = true;\r\n              k.li.classList.remove('is-ping');\r\n              core.style.setProperty('--k', k.k);\r\n              core.classList.remove('is-beat'); void core.offsetWidth; core.classList.add('is-beat');\r\n            }\r\n            if (u >= 1) { k.comet.style.opacity = 0; k.head.style.opacity = 0; return false; }\r\n            return true;\r\n          });\r\n          raf = flying.length ? window.requestAnimationFrame(frame) : 0;\r\n        };\r\n        var send = function (link, delay) {\r\n          flying.push({ link: link, t0: performance.now() + delay });\r\n          if (!raf) raf = window.requestAnimationFrame(frame);\r\n        };\r\n        var stop = function () {\r\n          window.cancelAnimationFrame(raf); raf = 0; flying = [];\r\n          links.forEach(function (k) { k.comet.style.opacity = 0; k.head.style.opacity = 0; k.li.classList.remove('is-ping'); });\r\n        };\r\n        var bars = fams.map(function (fam) { return fam.querySelector('.sc-timer'); });\r\n        \/\/ Le libell\u00e9 change en fondu, comme celui de la sc\u00e8ne des formats\r\n        var caption = function (text, fam) {\r\n          var st2 = fam ? getComputedStyle(fam) : null;\r\n          cap.style.setProperty('--k', st2 ? st2.getPropertyValue('--k') : '');\r\n          cap.style.setProperty('--kx', st2 ? st2.getPropertyValue('--kx') : '');\r\n          if (capText.textContent === text) return;\r\n          window.clearTimeout(swap);\r\n          capText.classList.add('is-swap');\r\n          swap = window.setTimeout(function () { capText.textContent = text; capText.classList.remove('is-swap'); }, 250);\r\n        };\r\n        \/\/ Publics, europ\u00e9ens, priv\u00e9s, puis tout le r\u00e9seau \u00e0 la fois\r\n        var show = function (n) {\r\n          f = n;\r\n          var all = f === fams.length;\r\n          st.classList.toggle('has-focus', !all);\r\n          fams.forEach(function (fam, i) {\r\n            var on = all || i === f;\r\n            fam.classList.toggle('is-on', on);\r\n            bars[i].classList.remove('is-run');\r\n            void bars[i].offsetWidth;\r\n            if (on && auto) bars[i].classList.add('is-run');\r\n          });\r\n          caption(all ? ALL : fams[f].dataset.cap, all ? null : fams[f]);\r\n          counter.textContent = pad(f + 1) + ' \/ ' + pad(F);\r\n          links.forEach(function (k, i) {\r\n            if (all) send(k, i * 90);\r\n            else if (k.fam === fams[f]) send(k, k.li.style.getPropertyValue('--j') * 200);\r\n          });\r\n        };\r\n        bars.forEach(function (b, i) { b.addEventListener('animationend', function () { if (auto && (f === i || (f === fams.length && i === 0))) show((f + 1) % F); }); });\r\n        var take = function (n) { auto = false; st.classList.remove('is-auto'); show(n); };\r\n        fams.forEach(function (fam, i) {\r\n          fam.querySelector('.anc-tag').addEventListener('click', function () { take(i); });\r\n          Array.prototype.forEach.call(fam.querySelectorAll('li'), function (li) { li.addEventListener('click', function () { take(i); }); });\r\n        });\r\n        core.addEventListener('click', function () { take(fams.length); });\r\n        return {\r\n          layout: layout,\r\n          reset: function () {\r\n            stop();\r\n            f = -1;\r\n            st.classList.remove('is-built', 'has-focus');\r\n            st.classList.add('is-pre', 'is-auto');\r\n            fams.forEach(function (fam) { fam.classList.remove('is-on'); });\r\n          },\r\n          \/\/ Les fils se tracent \u00e0 la premi\u00e8re apparition, puis le cycle d\u00e9marre\r\n          run: function (go) {\r\n            st.classList.toggle('is-hold', !go);\r\n            if (!go) { stop(); return; }\r\n            if (started) return;\r\n            started = true;\r\n            st.classList.remove('is-pre');\r\n            window.setTimeout(function () { st.classList.add('is-built'); }, 1800);\r\n            window.setTimeout(function () { if (auto && f < 0) show(0); }, 2000);\r\n          }\r\n        };\r\n      },\r\n      \/\/ Garanties \u00b7 03 : quatre comp\u00e9tences, quatre cl\u00e9s. Elles partent de chez nous\r\n      \/\/ une \u00e0 une et se posent chez votre \u00e9quipe ; la jauge d\u2019autonomie monte d\u2019un\r\n      \/\/ quart \u00e0 chaque passage. \u00c0 la fin, nous nous retirons ; puis tout recommence.\r\n      \/\/ La cl\u00e9 suivante se charge (sa barre sert de minuterie) avant de partir,\r\n      \/\/ et le bilan final tient le temps de sa propre barre : pause au survol.\r\n      transfert: function (st) {\r\n        var rows = Array.prototype.slice.call(st.querySelectorAll('.tra-row'));\r\n        var pct = st.querySelector('[data-pct]'), raf = 0, shown = 100;\r\n        var layout = function () {\r\n          rows.forEach(function (row) { row.style.setProperty('--dx', row.clientWidth - row.querySelector('.tra-key').offsetWidth + 'px'); });\r\n        };\r\n        var label = function (v) { pct.textContent = Math.round(v) + '\u00a0%'; };\r\n        \/\/ Le pourcentage compte au rythme de la jauge\r\n        var count = function (to) {\r\n          var from = shown, t0 = performance.now();\r\n          shown = to;\r\n          st.style.setProperty('--p', to \/ 100);\r\n          window.cancelAnimationFrame(raf);\r\n          var tick = function (now) {\r\n            var u = Math.min(1, (now - t0) \/ 800);\r\n            label(from + (to - from) * (1 - Math.pow(1 - u, 3)));\r\n            if (u < 1) raf = window.requestAnimationFrame(tick);\r\n          };\r\n          raf = window.requestAnimationFrame(tick);\r\n        };\r\n        var reset = function () {\r\n          window.cancelAnimationFrame(raf);\r\n          st.classList.remove('is-done', 'is-fade');\r\n          rows.forEach(function (row) {\r\n            row.classList.add('no-tr');\r\n            row.classList.remove('is-moved', 'is-yours', 'is-flying', 'is-next');\r\n            void row.offsetWidth;\r\n            row.classList.remove('no-tr');\r\n          });\r\n          shown = 0;\r\n          st.style.setProperty('--p', 0);\r\n          label(0);\r\n        };\r\n        var note = st.querySelector('.tra-note .sc-timer'), started = false;\r\n        var run = function (bar) { bar.classList.remove('is-run'); void bar.offsetWidth; bar.classList.add('is-run'); };\r\n        var charge = function (i) { rows[i].classList.add('is-next'); run(rows[i].querySelector('.sc-timer')); };\r\n        \/\/ Charg\u00e9e, la cl\u00e9 part ; pos\u00e9e, la jauge monte ; puis la suivante se charge\r\n        rows.forEach(function (row, i) {\r\n          row.querySelector('.sc-timer').addEventListener('animationend', function () {\r\n            this.classList.remove('is-run');\r\n            row.classList.remove('is-next');\r\n            row.classList.add('is-moved', 'is-flying');\r\n            window.setTimeout(function () {\r\n              row.classList.remove('is-flying');\r\n              row.classList.add('is-yours');\r\n              count((i + 1) \/ rows.length * 100);\r\n              window.setTimeout(function () {\r\n                if (i + 1 < rows.length) charge(i + 1);\r\n                else { st.classList.add('is-done'); run(note); }\r\n              }, 420);\r\n            }, 1000);\r\n          });\r\n        });\r\n        note.addEventListener('animationend', function () {\r\n          note.classList.remove('is-run');\r\n          st.classList.add('is-fade');\r\n          window.setTimeout(function () {\r\n            reset();\r\n            window.setTimeout(function () { charge(0); }, 500);\r\n          }, 500);\r\n        });\r\n        return {\r\n          layout: layout,\r\n          reset: function () { reset(); st.classList.add('is-auto'); },\r\n          run: function (go) {\r\n            st.classList.toggle('is-hold', !go);\r\n            if (!go || started) return;\r\n            started = true;\r\n            window.setTimeout(function () { charge(0); }, 500);\r\n          }\r\n        };\r\n      },\r\n      \/\/ 06 \u00b7 Ce que nous concevons : une t\u00eate de lecture traverse le calendrier du\r\n      \/\/ parcours, chaque s\u00e9ance para\u00eet \u00e0 son passage (le CSS lit --p). \u00ab D\u00e9p\u00f4t des\r\n      \/\/ dossiers \u00bb ne s\u2019\u00e9crit qu\u2019une fois la t\u00eate arr\u00eat\u00e9e.\r\n      parcours: function (st) {\r\n        var DUR = 5200, p = 1, t0 = 0, raf = 0, going = false, live = false, endWait = false;\r\n        var ease = function (x) { return x < .5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) \/ 2; };\r\n        var set = function () { st.style.setProperty('--p', ease(p).toFixed(4)); };\r\n        var frame = function (now) {\r\n          if (!t0) t0 = now - p * DUR;\r\n          p = Math.min(1, (now - t0) \/ DUR);\r\n          set();\r\n          if (p < 1 && going) { raf = window.requestAnimationFrame(frame); return; }\r\n          raf = 0;\r\n          if (p >= 1) { live = false; if (endWait) { endWait = false; turn(st, 'is-end', 1); } }\r\n        };\r\n        var play = function () { t0 = 0; if (going && !raf) raf = window.requestAnimationFrame(frame); };\r\n        var reset = function () {\r\n          window.cancelAnimationFrame(raf); raf = 0; live = endWait = false; p = 0; set();\r\n          turn(st, 'is-end', 0); turn(st, 'is-out', 0);\r\n        };\r\n        return {\r\n          reset: reset,\r\n          run: function (go) {\r\n            going = go;\r\n            if (go && live) play();\r\n            else if (!go && raf) { window.cancelAnimationFrame(raf); raf = 0; }\r\n          },\r\n          steps: [\r\n            [function () { reset(); live = true; play(); }, DUR + 250],\r\n            [function () { if (p >= 1) turn(st, 'is-end', 1); else endWait = true; }, 3400],\r\n            [function () { turn(st, 'is-out', 1); }, 650],\r\n            [reset, 450]\r\n          ]\r\n        };\r\n      },\r\n      \/\/ 06 \u00b7 Ce que vous pilotez : les candidatures arrivent, une partie est\r\n      \/\/ retenue, les dossiers sont d\u00e9pos\u00e9s, puis les financements obtenus. Chaque\r\n      \/\/ entr\u00e9e de la l\u00e9gende s\u2019allume une fois son \u00e9tape pos\u00e9e.\r\n      pilotage: function (st) {\r\n        var kpi = st.querySelector('.kpi'), keys = st.querySelectorAll('.kpi-key li');\r\n        var key = function (n) { each(keys, function (li, k) { turn(li, 'is-on', k < n); }); };\r\n        var reset = function () { ['is-cand', 'is-sel', 'is-dep', 'is-fin', 'is-out'].forEach(function (c) { turn(kpi, c, 0); }); key(0); };\r\n        return {\r\n          reset: reset,\r\n          steps: [\r\n            [function () { turn(kpi, 'is-cand', 1); }, 1500],\r\n            [function () { key(1); turn(kpi, 'is-sel', 1); }, 1400],\r\n            [function () { turn(kpi, 'is-dep', 1); }, 1300],\r\n            [function () { key(2); turn(kpi, 'is-fin', 1); }, 1200],\r\n            [function () { key(3); }, 3400],\r\n            [function () { turn(kpi, 'is-out', 1); }, 600],\r\n            [reset, 450]\r\n          ]\r\n        };\r\n      },\r\n    };\r\n    each(document.getElementById('shl-accueil').querySelectorAll('[data-scene]'), function (st) {\r\n      var make = scenes[st.dataset.scene];\r\n      if (!make) return;\r\n      var sc = make(st);\r\n      if (sc.layout) {\r\n        sc.layout();\r\n        if ('ResizeObserver' in window) new ResizeObserver(sc.layout).observe(st); else window.addEventListener('resize', sc.layout);\r\n        if (document.fonts && document.fonts.ready) document.fonts.ready.then(sc.layout);\r\n      }\r\n      if (calm) return;\r\n      sc.reset();\r\n      \/\/ La sc\u00e8ne ne tourne que visible, onglet au premier plan ; elle reprend o\u00f9 elle s\u2019\u00e9tait arr\u00eat\u00e9e\r\n      var i = 0, timer = 0, seen = false;\r\n      var tick = function () {\r\n        var s = sc.steps[i];\r\n        i = (i + 1) % sc.steps.length;\r\n        s[0]();\r\n        timer = window.setTimeout(tick, s[1]);\r\n      };\r\n      var sync = function () {\r\n        var go = seen && !document.hidden;\r\n        if (sc.run) sc.run(go);\r\n        if (go && !timer && sc.steps) timer = window.setTimeout(tick, 700);\r\n        else if (!go && timer) { window.clearTimeout(timer); timer = 0; }\r\n      };\r\n      if ('IntersectionObserver' in window) new IntersectionObserver(function (en) { seen = en[0].isIntersecting; sync(); }, { threshold: .35 }).observe(st);\r\n      else seen = true;\r\n      document.addEventListener('visibilitychange', sync);\r\n      sync();\r\n    });\r\n  })();\r\n  \/* ---------------- M\u00e9thode : rail et \u00e9tape active ---------------- *\/\r\n  var method = document.getElementById('shl-accueil').querySelector('[data-method]');\r\n  var steps = Array.prototype.slice.call(method.querySelectorAll('.step'));\r\n  var railItems = Array.prototype.slice.call(method.querySelectorAll('.rail li'));\r\n  var railFill = method.querySelector('[data-rail-fill]');\r\n  var stepsBox = method.querySelector('.steps');\r\n  var setActive = function (idx) {\r\n    steps.forEach(function (s, i) { s.classList.toggle('is-active', i === idx); });\r\n    railItems.forEach(function (li, i) { li.classList.toggle('is-active', i === idx); li.classList.toggle('is-past', i < idx); });\r\n  };\r\n  var methodTick = 0;\r\n  var updateMethod = function () {\r\n    methodTick = 0;\r\n    \/\/ Aucune \u00e9tape active tant que la premi\u00e8re n\u2019entre pas dans l\u2019\u00e9cran : ses traits se remplissent sous les yeux\r\n    var mid = window.innerHeight * 0.5, idx = steps[0].getBoundingClientRect().top < window.innerHeight * 0.85 ? 0 : -1;\r\n    steps.forEach(function (s, i) { if (s.getBoundingClientRect().top < mid) idx = i; });\r\n    setActive(idx);\r\n    var r = stepsBox.getBoundingClientRect();\r\n    var p = Math.max(0, Math.min(1, (mid - r.top) \/ Math.max(1, r.height - 120)));\r\n    railFill.style.transform = 'scaleY(' + p.toFixed(4) + ')';\r\n  };\r\n  method.classList.add('is-live');\r\n  updateMethod();\r\n  window.addEventListener('scroll', function () { if (!methodTick) methodTick = requestAnimationFrame(updateMethod); }, { passive: true });\r\n  window.addEventListener('resize', updateMethod);\r\n  \/* ---------------- Logos : une image absente ne casse pas la mise en page ---------------- *\/\r\n  \/\/ Dans le bandeau, son double de l\u2019autre rang\u00e9e dispara\u00eet aussi : chaque rang\u00e9e d\u00e9file\r\n  \/\/ de sa propre largeur, elles doivent rester \u00e9gales pour ne pas se chevaucher.\r\n  Array.prototype.forEach.call(document.getElementById('shl-accueil').querySelectorAll('.logos img, .pub-logo img'), function (img) {\r\n    var gone = function () {\r\n      var set = img.parentNode, i = Array.prototype.indexOf.call(set.children, img);\r\n      img.classList.add('is-missing');\r\n      if (set.classList.contains('logos-set')) Array.prototype.forEach.call(set.parentNode.children, function (s) { if (s.children[i]) s.children[i].classList.add('is-missing'); });\r\n    };\r\n    if (img.complete && img.getAttribute('src') && !img.naturalWidth) gone();\r\n    else img.addEventListener('error', gone);\r\n  });\r\n  \/* ---------------- Projets : les ponts ---------------- *\/\r\n  \/\/ Les arcs partent du logo de l\u2019association vers chaque partenaire ; ils sont\r\n  \/\/ calcul\u00e9s sur la place r\u00e9elle des pastilles, puis la sc\u00e8ne se joue \u00e0 l\u2019\u00e9cran\r\n  \/\/ (et se rejoue au survol de la carte).\r\n  (function () {\r\n    var scenes = Array.prototype.slice.call(document.getElementById('shl-accueil').querySelectorAll('[data-duo]'));\r\n    if (!scenes.length) return;\r\n    var NS = 'http:\/\/www.w3.org\/2000\/svg';\r\n    var build = function (sc) {\r\n      var r = sc.getBoundingClientRect();\r\n      if (!r.width) return;\r\n      var svg = sc.querySelector('.duo-arc'), fan = sc.dataset.duo === 'fan';\r\n      var h = sc.querySelector('.duo-home').getBoundingClientRect(), A = [h.right - r.left - 2, h.top - r.top + h.height \/ 2];\r\n      svg.setAttribute('viewBox', '0 0 ' + r.width + ' ' + r.height);\r\n      svg.textContent = '';\r\n      Array.prototype.forEach.call(sc.querySelectorAll('.duo-node'), function (n, i) {\r\n        var b = n.getBoundingClientRect(), B = [b.left - r.left + b.width \/ 2, b.top - r.top + b.height \/ 2];\r\n        var dx = B[0] - A[0], down = B[1] > A[1] + 12;\r\n        var C = [(A[0] + B[0]) \/ 2, down ? Math.max(A[1], B[1]) + dx * (fan ? .1 : .22) : Math.min(A[1], B[1]) - dx * (fan ? .18 : .34)];\r\n        var d = 'M' + A[0] + ' ' + A[1] + 'Q' + C[0] + ' ' + C[1] + ' ' + B[0] + ' ' + B[1];\r\n        ['duo-track', 'duo-line', 'duo-spark'].forEach(function (cls) {\r\n          var p = document.createElementNS(NS, 'path');\r\n          p.setAttribute('d', d); p.setAttribute('class', cls);\r\n          if (cls !== 'duo-track') p.setAttribute('pathLength', '1');\r\n          p.style.setProperty('--dl', i * .18 + 's');\r\n          svg.appendChild(p);\r\n        });\r\n        n.style.setProperty('--dl', i * .18 + 's');\r\n      });\r\n    };\r\n    var play = function (sc) { sc.classList.remove('is-play'); void sc.offsetWidth; sc.classList.add('is-play'); sc.dataset.at = Date.now(); };\r\n    scenes.forEach(function (sc) {\r\n      build(sc);\r\n      if ('ResizeObserver' in window) new ResizeObserver(function () { build(sc); }).observe(sc);\r\n      sc.closest('.project').addEventListener('mouseenter', function () {\r\n        if (!calm && sc.classList.contains('is-play') && Date.now() - sc.dataset.at > 2600) play(sc);\r\n      });\r\n    });\r\n    if (calm) { scenes.forEach(function (sc) { sc.classList.add('is-play'); }); return; }\r\n    onView(scenes, function (sc) {\r\n      var d = parseInt(sc.closest('.project').style.getPropertyValue('--d') || '0', 10);\r\n      window.setTimeout(function () { play(sc); }, 280 + d * 2);\r\n    }, { rootMargin: '0px 0px -16% 0px' });\r\n  })();\r\n  \/* ---------------- Ressourcerie : la pile des ressources ---------------- *\/\r\n  \/\/ Les quatre ressources de l\u2019e-hub, en fiches empil\u00e9es. Celle de devant se remplit : le\r\n  \/\/ point gravit la courbe du parcours, le budget s\u2019additionne poste par poste, un nouvel\r\n  \/\/ appel arrive dans la veille, la matrice du cadre logique se compl\u00e8te. Puis elle passe\r\n  \/\/ derri\u00e8re la pile et la suivante avance. Les mots s\u2019\u00e9teignent avant que la pile bouge et\r\n  \/\/ ne reviennent qu\u2019une fois elle immobile. Le balisage porte l\u2019\u00e9tat final, qu\u2019on garde\r\n  \/\/ en mouvement r\u00e9duit ; la l\u00e9gende permet d\u2019appeler une fiche.\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-res]');\r\n    if (!box) return;\r\n    onView([box], function (el) { el.classList.add('is-in'); }, { rootMargin: '0px 0px -25% 0px' });\r\n    var each = function (list, fn) { Array.prototype.forEach.call(list, fn); };\r\n    var cards = Array.prototype.slice.call(box.querySelectorAll('.res-card'));\r\n    var keys = Array.prototype.slice.call(box.querySelectorAll('.res-key span'));\r\n    var n = cards.length, front = 0, timers = [], raf = 0, seen = false, live = false;\r\n    var later = function (fn, ms) { timers.push(window.setTimeout(fn, ms)); };\r\n    var place = function () {\r\n      cards.forEach(function (c, i) { c.style.setProperty('--p', (i - front + n) % n); c.classList.toggle('is-front', i === front); });\r\n      keys.forEach(function (k, i) { k.classList.toggle('is-on', i === front); });\r\n    };\r\n    var kinds = {\r\n      parcours: function (card) {\r\n        var art = card.querySelector('.par-art'), trail = art.querySelector('.par-trail');\r\n        var dot = art.querySelector('.par-dot'), halo = art.querySelector('.par-halo'), reveal = art.querySelector('.par-reveal');\r\n        var nodes = art.querySelectorAll('.par-nodes circle'), drops = art.querySelectorAll('.par-drops path'), caps = card.querySelectorAll('.par-caps li');\r\n        var total = trail.getTotalLength(), at = [];\r\n        \/\/ Longueur du trac\u00e9 au droit de chaque module\r\n        each(nodes, function (nd) {\r\n          var x = +nd.getAttribute('cx'), lo = 0, hi = total;\r\n          for (var k = 0; k < 22; k++) { var m = (lo + hi) \/ 2; if (trail.getPointAtLength(m).x < x) lo = m; else hi = m; }\r\n          at.push(hi);\r\n        });\r\n        var set = function (len) {\r\n          var pt = trail.getPointAtLength(len);\r\n          trail.style.strokeDashoffset = String(1 - len \/ total);\r\n          dot.setAttribute('cx', pt.x); dot.setAttribute('cy', pt.y);\r\n          halo.setAttribute('cx', pt.x); halo.setAttribute('cy', pt.y);\r\n          reveal.setAttribute('width', pt.x);\r\n        };\r\n        var mark = function (k, on) { nodes[k].classList.toggle('is-on', on); drops[k].classList.toggle('is-on', on); caps[k].classList.toggle('is-on', on); };\r\n        \/\/ Le point ralentit \u00e0 chaque module sans jamais s\u2019arr\u00eater net\r\n        var soft = function (v) { var io = v < .5 ? 4 * v * v * v : 1 - Math.pow(-2 * v + 2, 3) \/ 2; return .3 * v + .7 * io; };\r\n        var SEG = 820;\r\n        return {\r\n          reset: function () { set(0); for (var k = 0; k < nodes.length; k++) mark(k, k === 0); },\r\n          play: function () {\r\n            var t0 = 0, done = 0, segs = nodes.length - 1;\r\n            var step = function (now) {\r\n              if (!t0) t0 = now;\r\n              var u = Math.min(1, (now - t0) \/ (SEG * segs)), s = u * segs, k = Math.min(segs - 1, Math.floor(s));\r\n              set(at[k] + (at[k + 1] - at[k]) * soft(s - k));\r\n              var reached = u >= 1 ? segs : (s - k > .94 ? k + 1 : k);\r\n              while (done < reached) mark(++done, true);\r\n              raf = u < 1 ? window.requestAnimationFrame(step) : 0;\r\n            };\r\n            raf = window.requestAnimationFrame(step);\r\n            return SEG * segs;\r\n          }\r\n        };\r\n      },\r\n      budget: function (card) {\r\n        var body = card.querySelector('.bud'), hl = body.querySelector('.bud-hl'), rows = body.querySelectorAll('.bud-row:not(.bud-th)');\r\n        var to = function (row) { hl.style.transform = 'translateY(' + (row.offsetTop + (row.offsetHeight - hl.offsetHeight) \/ 2) + 'px)'; };\r\n        var GAP = 480;\r\n        return {\r\n          reset: function () { body.classList.remove('is-hl'); each(rows, function (r) { r.classList.remove('is-on'); }); to(rows[0]); },\r\n          play: function () {\r\n            body.classList.add('is-hl');\r\n            each(rows, function (r, i) {\r\n              later(function () { to(r); }, i * GAP);\r\n              later(function () { r.classList.add('is-on'); }, i * GAP + 280);\r\n            });\r\n            return rows.length * GAP + 300;\r\n          }\r\n        };\r\n      },\r\n      veille: function (card) {\r\n        var list = card.querySelector('.vei');\r\n        return {\r\n          reset: function () { list.classList.remove('is-played'); },\r\n          play: function () { later(function () { list.classList.add('is-played'); }, 450); return 1900; }\r\n        };\r\n      },\r\n      cadre: function (card) {\r\n        var cells = card.querySelectorAll('.cad-c'), GAP = 150;\r\n        return {\r\n          reset: function () { each(cells, function (c) { c.classList.remove('is-on', 'is-hl'); }); },\r\n          play: function () {\r\n            \/\/ sur mobile, la colonne des hypoth\u00e8ses est masqu\u00e9e : on ne parcourt que les cases visibles\r\n            var shown = Array.prototype.filter.call(cells, function (c) { if (!c.offsetParent) c.classList.add('is-on'); return !!c.offsetParent; });\r\n            each(shown, function (c, i) {\r\n              later(function () { c.classList.add('is-on', 'is-hl'); }, i * GAP);\r\n              later(function () { c.classList.remove('is-hl'); }, i * GAP + 520);\r\n            });\r\n            return shown.length * GAP + 520;\r\n          }\r\n        };\r\n      }\r\n    };\r\n    var ctl = cards.map(function (c) { return kinds[c.dataset.kind](c); });\r\n    \/\/ La l\u00e9gende appelle une fiche : imm\u00e9diatement en mouvement r\u00e9duit, sinon par la pile\r\n    var go = function () {};\r\n    keys.forEach(function (k, i) {\r\n      k.addEventListener('click', function () {\r\n        if (i === front) return;\r\n        if (calm) { front = i; place(); return; }\r\n        if (!live) return;\r\n        timers.forEach(window.clearTimeout); timers = [];\r\n        window.cancelAnimationFrame(raf); raf = 0;\r\n        cards.forEach(function (c) { c.classList.remove('is-out', 'is-snap'); });\r\n        go(i);\r\n      });\r\n    });\r\n    place();\r\n    if (calm) return;\r\n    var HOLD = 2400;\r\n    \/\/ La fiche de devant se remplit, une fois la pile immobile et ses mots revenus\r\n    var show = function () {\r\n      var c = cards[front], k = ctl[front];\r\n      k.reset();\r\n      later(function () {\r\n        c.classList.add('is-shown');\r\n        later(function () { later(next, k.play() + HOLD); }, 620);\r\n      }, 420);\r\n    };\r\n    \/\/ Ses mots s\u2019\u00e9teignent, elle glisse et s\u2019efface, les autres avancent d\u2019un rang ; elle\r\n    \/\/ revient en fondu \u00e0 sa nouvelle place, derri\u00e8re\r\n    go = function (to) {\r\n      var c = cards[front];\r\n      c.classList.remove('is-shown');\r\n      later(function () {\r\n        front = to; place();\r\n        c.classList.add('is-out', 'is-front');\r\n        later(function () {\r\n          c.classList.add('is-snap'); c.classList.remove('is-out', 'is-front');\r\n          void c.offsetWidth;\r\n          c.classList.remove('is-snap');\r\n        }, 580);\r\n        show();\r\n      }, 180);\r\n    };\r\n    var next = function () { go((front + 1) % n); };\r\n    box.classList.add('is-auto');\r\n    ctl.forEach(function (k) { k.reset(); });\r\n    place();\r\n    \/\/ Hors de l\u2019\u00e9cran ou onglet cach\u00e9, tout s\u2019arr\u00eate ; la fiche de devant reprendra du d\u00e9but\r\n    var sync = function () {\r\n      var on = seen && !document.hidden;\r\n      if (on === live) return;\r\n      live = on;\r\n      if (on) { later(show, 300); return; }\r\n      timers.forEach(window.clearTimeout); timers = [];\r\n      window.cancelAnimationFrame(raf); raf = 0;\r\n      cards.forEach(function (c) { c.classList.remove('is-shown', 'is-out', 'is-snap'); });\r\n    };\r\n    if ('IntersectionObserver' in window) new IntersectionObserver(function (en) { seen = en[0].isIntersecting; sync(); }, { threshold: .35 }).observe(box);\r\n    else seen = true;\r\n    document.addEventListener('visibilitychange', sync);\r\n    sync();\r\n  })();\r\n  \/* ---------------- T\u00e9moignages : le lecteur des capsules ----------------\r\n     Un clic sur la liste choisit la capsule et la lance ; la vid\u00e9o YouTube\r\n     (mode sans cookies) ne se charge qu\u2019\u00e0 ce moment-l\u00e0. *\/\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-vids]');\r\n    var frame = box.querySelector('[data-vid-frame]'), poster = box.querySelector('[data-vid-poster]'), play = box.querySelector('[data-vid-play]');\r\n    var items = Array.prototype.slice.call(box.querySelectorAll('.vid-item'));\r\n    var cur = items[0];\r\n    var label = function () { play.setAttribute('aria-label', tr('Lire la vid\u00e9o : ') + cur.querySelector('b').textContent); };\r\n    var start = function () {\r\n      var f = frame.querySelector('iframe');\r\n      if (!f) {\r\n        f = document.createElement('iframe');\r\n        f.allow = 'autoplay; fullscreen; picture-in-picture; encrypted-media';\r\n        f.allowFullscreen = true;\r\n        frame.appendChild(f);\r\n      }\r\n      f.title = cur.querySelector('b').textContent;\r\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + cur.getAttribute('data-vid') + '?autoplay=1&rel=0&playsinline=1&hl=' + LANG;\r\n      frame.classList.add('is-playing');\r\n    };\r\n    var choose = function (it) {\r\n      cur = it;\r\n      items.forEach(function (b) { var on = b === it; b.classList.toggle('is-on', on); b.setAttribute('aria-pressed', String(on)); });\r\n      poster.src = 'https:\/\/i.ytimg.com\/vi\/' + it.getAttribute('data-vid') + '\/maxresdefault.jpg';\r\n      box.querySelector('[data-vid-title]').textContent = it.querySelector('b').textContent;\r\n      box.querySelector('[data-vid-sub]').textContent = it.querySelector('.vid-meta span').textContent;\r\n      box.querySelector('[data-vid-dur]').textContent = it.querySelector('.vid-dur').textContent;\r\n      label();\r\n    };\r\n    label();\r\n    play.addEventListener('click', start);\r\n    items.forEach(function (it) {\r\n      it.addEventListener('click', function () {\r\n        choose(it); start();\r\n        \/\/ Sur t\u00e9l\u00e9phone, la liste est sous le lecteur : on y remonte\r\n        var r = frame.getBoundingClientRect();\r\n        if (r.top < 0 || r.bottom > window.innerHeight) frame.scrollIntoView({ behavior: calm ? 'auto' : 'smooth', block: 'center' });\r\n      });\r\n    });\r\n  })();\r\n  \/* ---------------- Formulaire (maquette) ---------------- *\/\r\n  var form = document.getElementById('shl-accueil').querySelector('[data-form]');\r\n  form.addEventListener('submit', function (e) {\r\n    e.preventDefault();\r\n    form.querySelector('[data-form-note]').textContent = tr('Maquette : l\u2019envoi sera branch\u00e9 sur le formulaire du site.');\r\n  });\r\n  \/* ---------------- H\u00e9ros : trois rives, deux ponts de fils ---------------- *\/\r\n  \/\/ Dix fils aux teintes des th\u00e9matiques, torsad\u00e9s en deux arches : des\r\n  \/\/ associations de terrain aux financements europ\u00e9ens, puis \u00e0 l\u2019innovation\r\n  \/\/ sociale. La torsade tourne lentement et semble couler dans le sens de la\r\n  \/\/ phrase, comme les perles ; les arches penchent vers le pointeur et les\r\n  \/\/ fils s\u2019\u00e9cartent \u00e0 son aplomb. Les trois l\u00e9gendes se\r\n  \/\/ posent une fois le mouvement fini.\r\n  \/\/ Le dessin vaut pour n\u2019importe quelle bo\u00eete : l\u2019ouverture s\u2019en sert aussi,\r\n  \/\/ en petit au centre de l\u2019\u00e9cran, avant de le passer au h\u00e9ros.\r\n  var TONES = ['#c86a5e', '#b25f35', '#bd9035', '#8d9b4e', '#55926f', '#6d9b93', '#4b8296', '#45508a', '#8480be', '#92557c'];\r\n  var clamp01 = function (v) { return v < 0 ? 0 : v > 1 ? 1 : v; };\r\n  \/\/ La pousse du pont : les deux arches \u00e0 la m\u00eame allure, d\u00e9part et arriv\u00e9e en douceur\r\n  var easeGrow = function (p) { return (1 - Math.cos(Math.PI * p)) \/ 2; };\r\n  \/\/ o : la bo\u00eete (x, y, w, h), la pousse (grow, 0 \u00e0 1), l\u2019\u00e9cart des fils (amp),\r\n  \/\/ la rotation (spin), le penchant du pointeur (lx, ly, .5 au repos), l\u2019\u00e9cart\r\n  \/\/ des fils sous le pointeur (part, 0 \u00e0 1) et le temps \u00e9coul\u00e9 depuis le d\u00e9part\r\n  \/\/ des perles (beads, n\u00e9gatif : pas de perles) ; ceil, la marge \u00e0 garder sous\r\n  \/\/ le haut de la bo\u00eete quand elle coupe le dessin ; vib, la vibration de chaque\r\n  \/\/ arche (fondamental et harmonique, en px) ; hot, l\u2019\u00e9clat de chaque pile (0 \u00e0 1) ;\r\n  \/\/ fade, l\u2019opacit\u00e9 des fils de chaque arche.\r\n  \/\/ Rend les deux arches, pour que le h\u00e9ros sache o\u00f9 passe le pointeur\r\n  var paintBridge = (function () {\r\n    \/\/ Les trois rives, en fraction de la bo\u00eete : terrain, financements, innovation,\r\n    \/\/ sur un tablier plat ; chaque pile prend la teinte de sa rive\r\n    var BANKS = [[0, .94], [.5, .94], [1, .94]], LIFT = 1.08;\r\n    var PIERS = ['#af564b', '#43778b', '#437c5d'];\r\n    var S = 64, P = new Float32Array((S + 1) * 2), NV = new Float32Array((S + 1) * 2), AW = new Float32Array(S + 1);\r\n    var cub = function (u, a, b, c, d) { var v = 1 - u; return v * v * v * a + 3 * v * v * u * b + 3 * v * u * u * c + u * u * u * d; };\r\n    var dcub = function (u, a, b, c, d) { var v = 1 - u; return 3 * v * v * (b - a) + 6 * v * u * (c - b) + 3 * u * u * (d - c); };\r\n    var env = function (u) { return Math.pow(Math.abs(Math.sin(Math.PI * u)), .9); };\r\n    \/\/ Une perle franchit une arche en 3,2 s : elle d\u00e9colle d\u2019une pile, file au\r\n    \/\/ sommet et ralentit pour se poser sur la suivante\r\n    var LAP = 6400, glide = function (p) { return p - .7 * Math.sin(6.2832 * p) \/ 6.2832; };\r\n    var where = function (tb, b) { var run = tb \/ LAP + b \/ 3, ph = run % 1; return { lap: Math.floor(run), s: ph < .5 ? 0 : 1, u: glide((ph * 2) % 1), ph: ph }; };\r\n    var paint = function (g, o) {\r\n      var W = o.w, H = o.h, grow = o.grow, amp = o.amp, spin = o.spin, spans = [];\r\n      if (grow <= 0) return;\r\n      \/\/ Les deux arches : x0..x3 puis y0..y3 de chaque courbe\r\n      \/\/ inset : la marge, en px, entre les bords de la bo\u00eete et les rives extr\u00eames\r\n      var inset = o.inset || 0, span = W - 2 * inset;\r\n      var lean = (o.ly - .5) * H * .1, sway = (o.lx - .5) * W * .03, lift = H * LIFT;\r\n      \/\/ Sous le pointeur, les fils s\u2019\u00e9cartent en douceur, d\u2019une moiti\u00e9 en plus\r\n      var part = o.part || 0, hx = o.x + o.lx * W, hw = W * .12;\r\n      var wide = function (x) { return part ? 1 + .5 * part * Math.exp(-(x - hx) * (x - hx) \/ (hw * hw)) : 1; };\r\n      \/\/ Pinc\u00e9e, une arche vibre comme une corde tendue entre ses deux piles\r\n      var vib = o.vib, shake = function (s, u) { return vib ? vib[s][0] * Math.sin(Math.PI * u) + vib[s][1] * Math.sin(2 * Math.PI * u) : 0; };\r\n      for (var s = 0; s < 2; s++) {\r\n        var ax = o.x + inset + BANKS[s][0] * span, ay = o.y + BANKS[s][1] * H, bx = o.x + inset + BANKS[s + 1][0] * span, by = o.y + BANKS[s + 1][1] * H;\r\n        spans.push([ax, ax + (bx - ax) * .28 + sway, ax + (bx - ax) * .72 + sway, bx,\r\n          ay, ay + (by - ay) * .28 - lift + lean, ay + (by - ay) * .72 - lift + lean, by]);\r\n      }\r\n      \/\/ Jamais coup\u00e9 en haut : quand le pointeur soul\u00e8ve les arches ou \u00e9carte\r\n      \/\/ les fils au-del\u00e0 de la marge, les arches s\u2019abaissent d\u2019autant\r\n      if (o.ceil) spans.forEach(function (sp, s) {\r\n        for (var uu = .3, need = 0; uu < .71; uu += .1) {\r\n          var lack = o.y + o.ceil - cub(uu, sp[4], sp[5], sp[6], sp[7]) + amp * env(uu) * wide(cub(uu, sp[0], sp[1], sp[2], sp[3])) + Math.abs(shake(s, uu));\r\n          if (lack > 0) need = Math.max(need, lack \/ (3 * uu * (1 - uu)));\r\n        }\r\n        sp[5] += need; sp[6] += need;\r\n      });\r\n      \/\/ Point du fil k \u00e0 l\u2019abscisse u d\u2019une arche, avec sa profondeur\r\n      var at = function (s, u, k) {\r\n        var sp = spans[s], x = cub(u, sp[0], sp[1], sp[2], sp[3]), y = cub(u, sp[4], sp[5], sp[6], sp[7]);\r\n        var dx = dcub(u, sp[0], sp[1], sp[2], sp[3]), dy = dcub(u, sp[4], sp[5], sp[6], sp[7]), l = Math.hypot(dx, dy) || 1;\r\n        var th = u * 6.3 + k * .6283 + spin, off = amp * env(u) * wide(x) * Math.sin(th) + shake(s, u);\r\n        return [x - dy \/ l * off, y + dx \/ l * off, Math.cos(th)];\r\n      };\r\n      \/\/ Le tablier : un trait d\u2019encre qui relie les trois rives et avance avec le pont\r\n      g.lineCap = 'round'; g.lineWidth = Math.max(1.6, H * .007); g.strokeStyle = 'rgba(23,53,64,.82)';\r\n      g.beginPath();\r\n      spans.forEach(function (sp, s) {\r\n        var e = clamp01(grow * 2 - s);\r\n        if (e) { g.moveTo(sp[0], sp[4]); g.lineTo(sp[0] + (sp[3] - sp[0]) * e, sp[4] + (sp[7] - sp[4]) * e); }\r\n      });\r\n      g.stroke();\r\n      g.lineCap = 'butt'; g.lineJoin = 'round';\r\n      spans.forEach(function (sp, s) {\r\n        var e = clamp01(grow * 2 - s), fade = o.fade ? o.fade[s] : 1;\r\n        if (!e) return;\r\n        \/\/ Le bout du pont avance en continu : le dernier segment est trac\u00e9 en partie\r\n        var n = S * e, last = Math.max(1, Math.ceil(n)), j, u;\r\n        for (j = 0; j <= last; j++) {\r\n          u = Math.min(j, n) \/ S;\r\n          var dx = dcub(u, sp[0], sp[1], sp[2], sp[3]), dy = dcub(u, sp[4], sp[5], sp[6], sp[7]), l = Math.hypot(dx, dy) || 1;\r\n          P[j * 2] = cub(u, sp[0], sp[1], sp[2], sp[3]); P[j * 2 + 1] = cub(u, sp[4], sp[5], sp[6], sp[7]);\r\n          NV[j * 2] = -dy \/ l; NV[j * 2 + 1] = dx \/ l;\r\n          var sh = shake(s, u);\r\n          if (sh) { P[j * 2] += NV[j * 2] * sh; P[j * 2 + 1] += NV[j * 2 + 1] * sh; }\r\n          AW[j] = amp * env(u) * wide(P[j * 2]);\r\n        }\r\n        \/\/ Deux passes : les brins de derri\u00e8re, p\u00e2les et fins, puis ceux de devant.\r\n        \/\/ Chaque brin se trace d\u2019un seul trait tant qu\u2019il reste au m\u00eame palier de\r\n        \/\/ profondeur (six par passe) : pas de coutures, et dix fois moins de traits\r\n        for (var pass = 0; pass < 2; pass++) {\r\n          for (var k = 0; k < 10; k++) {\r\n            g.strokeStyle = TONES[k];\r\n            var qx0 = 0, qy0 = 0, lv = -1;\r\n            for (j = 0; j <= last; j++) {\r\n              u = Math.min(j, n) \/ S;\r\n              var th = u * 6.3 + k * .6283 + spin;\r\n              var off = AW[j] * Math.sin(th), z = Math.cos(th);\r\n              var qx = P[j * 2] + NV[j * 2] * off, qy = P[j * 2 + 1] + NV[j * 2 + 1] * off;\r\n              if (j && (z < 0) === (pass === 0)) {\r\n                var d = Math.round((pass ? z : 1 + z) * 5);\r\n                if (d !== lv) {\r\n                  if (lv >= 0) g.stroke();\r\n                  lv = d; d \/= 5;\r\n                  g.globalAlpha = (pass ? .5 + .45 * d : .16 + .3 * d) * fade;\r\n                  g.lineWidth = pass ? 1.4 + .5 * d : 1 + .4 * d;\r\n                  g.beginPath(); g.moveTo(qx0, qy0);\r\n                }\r\n                g.lineTo(qx, qy);\r\n              } else if (lv >= 0) { g.stroke(); lv = -1; }\r\n              qx0 = qx; qy0 = qy;\r\n            }\r\n            if (lv >= 0) g.stroke();\r\n          }\r\n        }\r\n      });\r\n      \/\/ Des perles traversent les deux ponts, et changent de fil \u00e0 chaque passage.\r\n      \/\/ Chacune allume son fil derri\u00e8re elle, sur ce qu\u2019elle a parcouru dans la\r\n      \/\/ derni\u00e8re demi-seconde : une longue tra\u00eene au sommet, courte pr\u00e8s des piles\r\n      if (o.beads > 0) {\r\n        g.lineCap = 'round';\r\n        for (var b = 0; b < 3; b++) {\r\n          var w = where(o.beads, b), ph = w.ph, kb = (b * 3 + w.lap * 4) % 10, live = Math.min(1, ph * 10, (1 - ph) * 10);\r\n          var q = at(w.s, w.u, kb), fade = live * (q[2] < 0 ? .4 : 1);\r\n          g.strokeStyle = TONES[kb];\r\n          for (var i = 12, q0 = null; i >= 0; i--) {\r\n            var tb = o.beads - i * 42, wp = where(tb, b);\r\n            if (tb <= 0 || wp.lap !== w.lap) continue;\r\n            var qi = i ? at(wp.s, wp.u, kb) : q;\r\n            if (q0) {\r\n              g.globalAlpha = live * (1 - i \/ 13) * (qi[2] < 0 ? .3 : .8);\r\n              g.lineWidth = 1.4 + 1.6 * (1 - i \/ 13);\r\n              g.beginPath(); g.moveTo(q0[0], q0[1]); g.lineTo(qi[0], qi[1]); g.stroke();\r\n            }\r\n            q0 = qi;\r\n          }\r\n          g.fillStyle = TONES[kb];\r\n          g.globalAlpha = .16 * fade; g.beginPath(); g.arc(q[0], q[1], 7, 0, 6.2832); g.fill();\r\n          g.globalAlpha = fade; g.beginPath(); g.arc(q[0], q[1], 3, 0, 6.2832); g.fill();\r\n          g.fillStyle = '#fff'; g.beginPath(); g.arc(q[0], q[1], 1.3, 0, 6.2832); g.fill();\r\n        }\r\n      }\r\n      g.globalAlpha = 1;\r\n      \/\/ Les trois piles, sous le tablier, dans la teinte de leur rive et fondues\r\n      \/\/ dans le sol : chacune pousse quand le pont l\u2019approche\r\n      var pw = Math.max(4, H * .022), foot = o.y + H;\r\n      BANKS.forEach(function (bk, i) {\r\n        var e = clamp01((grow * 2 - i + .15) \/ .15);\r\n        if (!e) return;\r\n        \/\/ La pile de la rive survol\u00e9e s\u2019\u00e9largit et s\u2019\u00e9claire\r\n        var x = o.x + inset + bk[0] * span, y = o.y + bk[1] * H, hot = o.hot ? o.hot[i] : 0, w = pw * (1 + .6 * hot);\r\n        var gr = g.createLinearGradient(0, y, 0, foot), c = parseInt(PIERS[i].slice(1), 16);\r\n        gr.addColorStop(0, PIERS[i]); gr.addColorStop(1, 'rgba(' + (c >> 16) + ',' + (c >> 8 & 255) + ',' + (c & 255) + ',0)');\r\n        g.fillStyle = gr;\r\n        if (hot > .01) { g.shadowColor = PIERS[i]; g.shadowBlur = 12 * hot; }\r\n        g.fillRect(x - w \/ 2, y - 1, w, (foot - y + 1) * e);\r\n        g.shadowBlur = 0;\r\n      });\r\n      return spans;\r\n    };\r\n    paint.lift = LIFT;\r\n    return paint;\r\n  })();\r\n  \/\/ Le h\u00e9ros, que l\u2019ouverture tient en attente puis rel\u00e2che\r\n  var heroRope = null;\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-rope]');\r\n    if (!box) return;\r\n    var cv = box.querySelector('canvas'), g = cv.getContext('2d');\r\n    var W = 0, H = 0, inset = 0, dpr = 1, t0 = 0, raf = 0, running = false, seen = true, ready = false;\r\n    \/\/ Le pointeur, liss\u00e9 : sa position (px, py) et sa pr\u00e9sence au-dessus du pont (on)\r\n    var px = .5, py = .5, tx = .5, ty = .5, on = 0, ton = 0;\r\n    \/\/ La rive au premier plan (focus, -1 : aucune) et l\u2019\u00e9clat de chaque sc\u00e8ne (fw)\r\n    \/\/ wk : le r\u00e9veil de chaque sc\u00e8ne (0 \u00e0 1), hot : l\u2019\u00e9clat de chaque pile,\r\n    \/\/ af : l\u2019opacit\u00e9 des fils de chaque arche (celle qui ne touche pas la rive s\u2019efface)\r\n    var focus = -1, fw = [1, 1, 1], wk = [0, 0, 0], hot = [0, 0, 0], af = [1, 1], DIM = .3;\r\n    \/\/ Les cordes : pour chaque arche, position et vitesse du fondamental puis de\r\n    \/\/ l\u2019harmonique ; le fondamental bat \u00e0 2,2 Hz et s\u2019\u00e9teint en moins d\u2019une seconde\r\n    var vib = [[0, 0, 0, 0], [0, 0, 0, 0]], OMEGA = 13.8, DAMP = .12, lastNow = 0, arches = null;\r\n    \/\/ held : l\u2019ouverture joue encore ; grown : le pont arrive d\u00e9j\u00e0 tendu ;\r\n    \/\/ settle : l\u2019instant (depuis t0) o\u00f9 les l\u00e9gendes et les perles arrivent\r\n    var held = introOn, grown = false, settle = 2500;\r\n    \/\/ Sous les arches, les deux rives dessin\u00e9es en silhouettes simples, fondues\r\n    \/\/ dans le sol, chacune dans la teinte de sa pile. Sous la premi\u00e8re arche, le\r\n    \/\/ terrain : un silo et une grange, un arbre, deux maisons, la maison de\r\n    \/\/ quartier, deux tours. Sous la seconde, l\u2019innovation : une serre, un jardin,\r\n    \/\/ un atelier en sheds, des panneaux solaires, deux \u00e9oliennes. Elles poussent\r\n    \/\/ depuis leur pile quand les mots se posent. Au survol, la rive s\u2019\u00e9veille :\r\n    \/\/ les fen\u00eatres du terrain s\u2019allument une \u00e0 une ; les \u00e9oliennes de\r\n    \/\/ l\u2019innovation acc\u00e9l\u00e8rent, ses verri\u00e8res et ses panneaux passent \u00e0 l\u2019or.\r\n    \/\/ Chaque \u00e9l\u00e9ment : sa forme, sa place depuis la pile de sa rive (en fraction\r\n    \/\/ de trav\u00e9e) et sa hauteur (en fraction de la hauteur des arches)\r\n    var SCENES = [\r\n      [['silo', .11, .14, .3], ['barn', .15, .245, .13, .08], ['tree', .27, .16, .05], ['house', .295, .35, .12, .065],\r\n        ['house', .36, .41, .1, .06], ['hall', .435, .53, .21], ['tower', .55, .61, .5], ['tower', .63, .68, .36], ['tree', .705, .11, .04]],\r\n      [['serre', .09, .22, .16], ['bush', .24, .06], ['bush', .268, .085], ['bush', .296, .055], ['shed', .32, .48, .17, .09],\r\n        ['panels', .495, .59, .1], ['mill', .615, .55, .17, 0], ['mill', .69, .4, .12, 1.9]]\r\n    ];\r\n    var SIDE = ['#c86a5e', null, '#55926f'], scenes = null, millRot = 0;\r\n    var tint = function (h, a) { var v = parseInt(h.slice(1), 16); return 'rgba(' + (v >> 16) + ',' + (v >> 8 & 255) + ',' + (v & 255) + ',' + a + ')'; };\r\n    var hash = function (a, b) { var h = Math.sin(a * 127.1 + b * 311.7) * 43758.5453; return h - Math.floor(h); };\r\n    var buildScenes = function () {\r\n      var S = (W - 2 * inset) \/ 2, deck = H * .94, U = H, lift = H * paintBridge.lift, amp = Math.min(W, H) * .075;\r\n      \/\/ La place libre sous les fils au repos \u00e0 l\u2019abscisse x, en px au-dessus du\r\n      \/\/ tablier, avec de la marge pour le pointeur qui fait pencher les arches\r\n      var room = function (x) {\r\n        var ax = x < W \/ 2 ? inset : W \/ 2, lo = 0, hi = 1;\r\n        for (var k = 0; k < 22; k++) { var m = (lo + hi) \/ 2, v = 1 - m; if (ax + S * (3 * v * v * m * .28 + 3 * v * m * m * .72 + m * m * m) < x) lo = m; else hi = m; }\r\n        return 3 * lo * (1 - lo) * lift - amp * Math.pow(Math.sin(Math.PI * lo), .9) - 22;\r\n      };\r\n      \/\/ Les fen\u00eatres, trop petites sur un t\u00e9l\u00e9phone, n\u2019y sont pas dessin\u00e9es\r\n      var pw = Math.max(1.6, U * .022), ph = pw * 1.35, items = [];\r\n      SCENES.forEach(function (defs, s) {\r\n        var X = function (a) { return s ? W - inset - a * S : inset + a * S; };\r\n        defs.forEach(function (d, n) {\r\n          var p = { side: s * 2, kind: d[0], a: d[1], wins: [], glass: [] }, k;\r\n          if (d[0] === 'tree' || d[0] === 'bush' || d[0] === 'mill') {\r\n            p.x = X(d[1]); p.h = d[2] * U; p.r = (d[3] || 0) * U; p.ph = d[4] || 0;\r\n            k = Math.min(1, room(p.x) \/ (p.h + p.r));\r\n            p.h *= k; p.r *= k;\r\n            items.push(p);\r\n            return;\r\n          }\r\n          var xa = X(d[1]), xb = X(d[2]);\r\n          p.x0 = Math.min(xa, xb); p.x1 = Math.max(xa, xb); p.h = d[3] * U; p.roof = (d[4] || 0) * U;\r\n          k = Math.min(1, Math.min(room(p.x0), room(p.x1), room((p.x0 + p.x1) \/ 2)) \/ (p.h + p.roof));\r\n          p.h *= k; p.roof *= k;\r\n          var w = p.x1 - p.x0, top = deck - p.h, i, j;\r\n          if (S > 300) {\r\n            if (p.kind === 'tower') {\r\n              var cols = Math.max(2, Math.round((w - U * .04) \/ (pw * 2.6))), rows = Math.floor((p.h - U * .07) \/ (ph * 2.3));\r\n              for (j = 0; j < rows; j++) for (i = 0; i < cols; i++)\r\n                p.wins.push([p.x0 + U * .02 + (i + .5) * (w - U * .04) \/ cols - pw \/ 2, top + U * .025 + j * ph * 2.3, pw, ph, hash(n * 7 + i, j + s * 13)]);\r\n            } else if (p.kind === 'hall') {\r\n              for (j = 0; j < 2; j++) for (i = 0; i < 4; i++)\r\n                p.wins.push([p.x0 + (i + .5) * w \/ 4 - pw * .9, top + p.h * (.22 + j * .36), pw * 1.8, ph * 1.1, hash(n * 7 + i, j + 5)]);\r\n            } else if (p.kind === 'house') {\r\n              p.wins.push([p.x0 + w * .3 - pw * .6, deck - p.h * .62, pw * 1.2, ph, hash(n, 3)]);\r\n            }\r\n          }\r\n          \/\/ L\u2019atelier : trois dents de scie, vitr\u00e9es sur leur face droite\r\n          if (p.kind === 'shed') for (i = 1; i <= 3; i++) p.glass.push([p.x0 + i * w \/ 3 - Math.max(1.4, U * .01), top - p.roof * .92, Math.max(1.4, U * .01), p.roof * .84]);\r\n          items.push(p);\r\n        });\r\n      });\r\n      return { items: items, deck: deck, U: U, lw: H > 160 ? 1.2 : 1, cv: [null, null, null] };\r\n    };\r\n    \/\/ Un d\u00e9grad\u00e9 qui se fond dans le sol, et le m\u00eame, plus appuy\u00e9, sur l\u2019ar\u00eate\r\n    var shade = function (c, col, top, base, fa, la) {\r\n      var gf = c.createLinearGradient(0, top, 0, base), gs = c.createLinearGradient(0, top, 0, base);\r\n      gf.addColorStop(0, tint(col, fa)); gf.addColorStop(1, tint(col, fa * .08));\r\n      gs.addColorStop(0, tint(col, la)); gs.addColorStop(1, tint(col, 0));\r\n      c.fillStyle = gf; c.fill(); c.strokeStyle = gs; c.stroke();\r\n    };\r\n    \/\/ La silhouette d\u2019un \u00e9l\u00e9ment, sans ses parties anim\u00e9es (pales, lumi\u00e8res),\r\n    \/\/ dans la teinte de sa rive ou dans celle qu\u2019on lui donne (tone)\r\n    var body = function (c, p, base, U, tone) {\r\n      var col = tone || SIDE[p.side], top = base - p.h;\r\n      c.beginPath();\r\n      if (p.kind === 'tree') {\r\n        c.ellipse(p.x, top, p.r * .8, p.r * 1.1, 0, 0, 6.2832);\r\n        c.rect(p.x - .8, top + p.r * .9, 1.6, base - top - p.r * .9);\r\n        shade(c, col, top - p.r, base, .24, .8);\r\n        return;\r\n      }\r\n      if (p.kind === 'bush') { c.ellipse(p.x, base, p.h * 1.15, p.h, 0, Math.PI, 0); c.closePath(); shade(c, col, top, base, .26, .8); return; }\r\n      if (p.kind === 'mill') {\r\n        c.moveTo(p.x - 1.3, base); c.lineTo(p.x - .55, top); c.lineTo(p.x + .55, top); c.lineTo(p.x + 1.3, base); c.closePath();\r\n        shade(c, col, top, base, .7, .5);\r\n        return;\r\n      }\r\n      var x0 = p.x0, x1 = p.x1, cx = (x0 + x1) \/ 2, w = x1 - x0, i;\r\n      if (p.kind === 'panels') {\r\n        \/\/ Trois panneaux inclin\u00e9s sur leur pied\r\n        for (i = 0; i < 3; i++) {\r\n          var px0 = x0 + i * w \/ 3, pww = w \/ 3 * .82, t = Math.max(1.6, U * .012);\r\n          c.moveTo(px0, base - p.h * .35); c.lineTo(px0 + pww, top); c.lineTo(px0 + pww, top + t); c.lineTo(px0, base - p.h * .35 + t); c.closePath();\r\n          c.rect(px0 + pww \/ 2 - .5, base - p.h * .67, 1, p.h * .67);\r\n        }\r\n        shade(c, col, top, base, .5, .8);\r\n        return;\r\n      }\r\n      c.moveTo(x0, base);\r\n      if (p.kind === 'silo') { c.lineTo(x0, top + w \/ 2); c.arc(cx, top + w \/ 2, w \/ 2, Math.PI, 0); }\r\n      else if (p.kind === 'barn' || p.kind === 'house') { c.lineTo(x0, top); c.lineTo(cx, top - p.roof); c.lineTo(x1, top); }\r\n      else if (p.kind === 'serre') { c.lineTo(x0, top + p.h * .55); c.ellipse(cx, top + p.h * .55, w \/ 2, p.h * .55, 0, Math.PI, 0); }\r\n      else if (p.kind === 'shed') { c.lineTo(x0, top); for (i = 1; i <= 3; i++) { c.lineTo(x0 + i * w \/ 3, top - p.roof); c.lineTo(x0 + i * w \/ 3, top); } }\r\n      else { var rr = Math.min(2, w \/ 6); c.lineTo(x0, top + rr); c.quadraticCurveTo(x0, top, x0 + rr, top); c.lineTo(x1 - rr, top); c.quadraticCurveTo(x1, top, x1, top + rr); }\r\n      c.lineTo(x1, base); c.closePath();\r\n      shade(c, col, top - (p.roof || 0), base, .2, .8);\r\n      \/\/ Les d\u00e9tails : la porte de la grange, les arceaux de la serre, les fen\u00eatres \u00e9teintes\r\n      c.fillStyle = tint(col, .38);\r\n      if (p.kind === 'barn') c.fillRect(cx - w * .14, base - p.h * .62, w * .28, p.h * .62);\r\n      if (p.kind === 'serre') for (i = 1; i < 5; i++) {\r\n        var rx = x0 + i * w \/ 5, ry = top + p.h * .55 - p.h * .55 * Math.sqrt(Math.max(0, 1 - Math.pow((rx - cx) \/ (w \/ 2), 2)));\r\n        c.fillRect(rx - .4, ry, .8, base - ry);\r\n      }\r\n      p.wins.forEach(function (q) { c.fillRect(q[0], q[1], q[2], q[3]); });\r\n      p.glass.forEach(function (q) { c.fillRect(q[0], q[1], q[2], q[3]); });\r\n    };\r\n    \/\/ Les pales d\u2019une \u00e9olienne, fines et effil\u00e9es, et son moyeu\r\n    var blades = function (c, p, top) {\r\n      var len = p.r, rot = millRot + p.ph;\r\n      c.fillStyle = tint(SIDE[p.side], .85);\r\n      c.beginPath();\r\n      for (var b = 0; b < 3; b++) {\r\n        var th = rot + b * 2.0944, ux = Math.cos(th), uy = Math.sin(th);\r\n        c.moveTo(p.x - uy * 1.3, top + ux * 1.3); c.lineTo(p.x + ux * len, top + uy * len); c.lineTo(p.x + uy * 1.3, top - ux * 1.3);\r\n      }\r\n      c.fill();\r\n      c.beginPath(); c.arc(p.x, top, 1.9, 0, 6.2832); c.fill();\r\n    };\r\n    var paintScenes = function (t) {\r\n      if (!scenes) scenes = buildScenes();\r\n      var sc = scenes, base = sc.deck, rv = t - settle + 150, done = calm || rv > 1500;\r\n      if (rv <= 0) return;\r\n      g.lineWidth = sc.lw; g.lineJoin = 'round';\r\n      \/\/ Chaque \u00e9l\u00e9ment pousse depuis le sol, en vague depuis sa pile\r\n      var rise = function (p) { return done ? 1 : 1 - Math.pow(1 - clamp01((rv - 80 - p.a * 900) \/ 700), 3); };\r\n      [0, 2].forEach(function (side) {\r\n        var a = fw[side];\r\n        if (done) {\r\n          \/\/ La vague pass\u00e9e, les silhouettes ne bougent plus : on les garde en image\r\n          if (!sc.cv[side]) {\r\n            var cc = document.createElement('canvas'), c = cc.getContext('2d');\r\n            cc.width = Math.round(W * dpr); cc.height = Math.round(H * dpr);\r\n            c.setTransform(dpr, 0, 0, dpr, 0, 0); c.lineWidth = sc.lw; c.lineJoin = 'round';\r\n            sc.items.forEach(function (p) { if (p.side === side) body(c, p, base, sc.U); });\r\n            sc.cv[side] = cc;\r\n          }\r\n          g.globalAlpha = a; g.drawImage(sc.cv[side], 0, 0, W, H);\r\n        } else sc.items.forEach(function (p) {\r\n          var r = rise(p);\r\n          if (p.side !== side || r <= 0) return;\r\n          g.save(); g.globalAlpha = a; g.translate(0, base); g.scale(1, r); g.translate(0, -base);\r\n          body(g, p, base, sc.U);\r\n          g.restore();\r\n        });\r\n        \/\/ Les parties anim\u00e9es : pales, fen\u00eatres allum\u00e9es, verri\u00e8res et panneaux\r\n        var lights = Math.max(.16, wk[0] * .95);\r\n        sc.items.forEach(function (p) {\r\n          if (p.side !== side) return;\r\n          var r = rise(p), top = base - p.h * r;\r\n          if (r <= 0) return;\r\n          if (p.kind === 'mill') { g.globalAlpha = a; blades(g, p, top); }\r\n          g.fillStyle = LIT;\r\n          p.wins.forEach(function (q) {\r\n            var on = clamp01((lights - q[4]) \/ .1) * r;\r\n            if (on > .01) { g.globalAlpha = on * .95 * a; g.fillRect(q[0], base - (base - q[1]) * r, q[2], q[3] * r); }\r\n          });\r\n          if (wk[2] > .01 && r >= 1) {\r\n            g.globalAlpha = wk[2] * .9 * a;\r\n            p.glass.forEach(function (q) { g.fillRect(q[0], q[1], q[2], q[3]); });\r\n            if (p.kind === 'panels') { g.globalAlpha = wk[2] * .7 * a; body(g, p, base, sc.U, LIT); }\r\n          }\r\n        });\r\n      });\r\n      g.globalAlpha = 1;\r\n    };\r\n    \/\/ Les deux rives en caract\u00e8res : les silhouettes se dessinent d\u2019abord en\r\n    \/\/ petit, un pixel par case de la grille, puis chaque case devient un\r\n    \/\/ caract\u00e8re d\u2019autant plus charg\u00e9 que la silhouette la couvre, dans sa couleur\r\n    \/\/ (fen\u00eatres allum\u00e9es et verri\u00e8res comprises). Tout le reste, la pousse, le\r\n    \/\/ r\u00e9veil au survol et les pales, vient du dessin lui-m\u00eame.\r\n    var RAMP = '.:-=+*#%@', asc = null;\r\n    var asciiScenes = function (t) {\r\n      var ch = Math.max(4, Math.min(7, H \/ 42)), cw = ch * .6, nx = Math.ceil(W \/ cw), ny = Math.ceil(H \/ ch);\r\n      if (!asc || asc.nx !== nx || asc.ny !== ny) {\r\n        var ac = document.createElement('canvas');\r\n        ac.width = nx; ac.height = ny;\r\n        asc = { c: ac.getContext('2d', { willReadFrequently: true }), nx: nx, ny: ny };\r\n      }\r\n      var c = asc.c, main = g;\r\n      c.setTransform(1, 0, 0, 1, 0, 0); c.clearRect(0, 0, nx, ny);\r\n      c.setTransform(1 \/ cw, 0, 0, 1 \/ ch, 0, 0);\r\n      g = c; paintScenes(t); g = main;\r\n      var d = c.getImageData(0, 0, nx, ny).data, bk = {}, i, j, k, key;\r\n      for (j = 0; j < ny; j++) for (i = 0; i < nx; i++) {\r\n        k = (j * nx + i) * 4;\r\n        if (d[k + 3] < 10) continue;\r\n        var lv = Math.min(8, Math.floor(Math.pow(d[k + 3] \/ 255, .5) * 10.5));\r\n        key = (d[k] >> 4) + ',' + (d[k + 1] >> 4) + ',' + (d[k + 2] >> 4) + ',' + lv;\r\n        (bk[key] || (bk[key] = [])).push((i + .5) * cw, (j + .5) * ch);\r\n      }\r\n      g.font = '500 ' + (ch * 1.1).toFixed(2) + \"px 'Geist Mono', ui-monospace, Menlo, monospace\";\r\n      g.textAlign = 'center'; g.textBaseline = 'middle';\r\n      for (key in bk) {\r\n        var q = key.split(','), list = bk[key];\r\n        g.fillStyle = 'rgb(' + (q[0] * 16 + 8) + ',' + (q[1] * 16 + 8) + ',' + (q[2] * 16 + 8) + ')';\r\n        g.globalAlpha = Math.min(1, .72 + .04 * q[3]);\r\n        for (k = 0; k < list.length; k += 2) g.fillText(RAMP[q[3]], list[k], list[k + 1]);\r\n      }\r\n      g.globalAlpha = 1;\r\n    };\r\n    \/\/ Au milieu, les douze \u00e9toiles de l\u2019Europe, en couronne dans le creux entre\r\n    \/\/ les arches, au-dessus de la pile du milieu.\r\n    \/\/ Bleues au repos, elles passent \u00e0 l\u2019or une \u00e0 une quand les financements\r\n    \/\/ europ\u00e9ens sont au premier plan, et une fois d\u2019elles-m\u00eames, le pont tendu.\r\n    var LIT = '#bd9035', STAR = '#43778b', ring = null;\r\n    var buildRing = function () {\r\n      var Sa = (W - 2 * inset) \/ 2, r = Math.min(H * .19, Sa * .13), list = [];\r\n      for (var i = 0; i < 12; i++) list.push([W \/ 2 + r * Math.cos(i * .5236 - 1.5708), H * .38 + r * Math.sin(i * .5236 - 1.5708)]);\r\n      return { list: list, s: Math.max(2.8, H * .019) };\r\n    };\r\n    var star = function (x, y, r) {\r\n      g.beginPath();\r\n      for (var i = 0; i < 10; i++) { var a = i * .6283 - 1.5708, rr = i % 2 ? r * .45 : r; g[i ? 'lineTo' : 'moveTo'](x + rr * Math.cos(a), y + rr * Math.sin(a)); }\r\n      g.closePath(); g.fill();\r\n    };\r\n    var paintRing = function (t) {\r\n      if (!ring) ring = buildRing();\r\n      var rv = t - settle;\r\n      if (rv <= 0) return;\r\n      \/\/ Le salut : une demi-seconde apr\u00e8s la pose, les \u00e9toiles s\u2019allument une\r\n      \/\/ fois en or, puis reviennent au bleu\r\n      var hello = calm ? 0 : clamp01(Math.min((rv - 500) \/ 900, (3600 - rv) \/ 1200)), w = Math.max(wk[1], hello);\r\n      ring.list.forEach(function (p, i) {\r\n        var a = easeGrow(clamp01((rv - i * 60) \/ 520)), lit = clamp01((w - .05 - i \/ 12 * .6) \/ .25), r = ring.s * (.4 + .6 * a) * (1 + .2 * lit);\r\n        if (!a) return;\r\n        if (lit < 1) { g.globalAlpha = a * .72 * (1 - lit) * fw[1]; g.fillStyle = STAR; star(p[0], p[1], r); }\r\n        if (lit > 0) { g.globalAlpha = a * lit * fw[1]; g.fillStyle = LIT; star(p[0], p[1], r); }\r\n      });\r\n      g.globalAlpha = 1;\r\n    };\r\n    var draw = function (now) {\r\n      if (!W) return;\r\n      var t = calm ? 1e9 : now - t0;\r\n      var grow = grown ? 1 : clamp01(t \/ 2400);\r\n      px += (tx - px) * .05; py += (ty - py) * .05; on += (ton - on) * .04;\r\n      var dt = Math.min(1 \/ 30, Math.max(0, (now - lastNow) \/ 1000));\r\n      lastNow = now;\r\n      \/\/ Au survol, tout change lentement : l\u2019estompe en un peu plus d\u2019une demi-seconde,\r\n      \/\/ le r\u00e9veil de la sc\u00e8ne sur une seconde et demie\r\n      var ef = 1 - Math.exp(-dt \/ .55), ew = 1 - Math.exp(-dt \/ .75);\r\n      for (var k = 0; k < 3; k++) {\r\n        fw[k] += ((focus < 0 || focus === k ? 1 : DIM) - fw[k]) * ef;\r\n        hot[k] += ((focus === k ? 1 : 0) - hot[k]) * ef;\r\n        wk[k] += ((focus === k ? 1 : 0) - wk[k]) * ew;\r\n      }\r\n      for (var s = 0; s < 2; s++) af[s] += (((focus === 0 && s === 1) || (focus === 2 && s === 0) ? .4 : 1) - af[s]) * ef;\r\n      for (var s = 0; s < 2; s++) for (var m = 0; m < 2; m++) {\r\n        var om = OMEGA * (m + 1), st = vib[s];\r\n        st[m * 2 + 1] -= (om * om * st[m * 2] + 2 * DAMP * om * st[m * 2 + 1]) * dt;\r\n        st[m * 2] += st[m * 2 + 1] * dt;\r\n      }\r\n      \/\/ Les \u00e9oliennes tournent lentement, plus vite quand l\u2019innovation est au premier plan\r\n      millRot += calm ? 0 : dt * (.6 + 2.2 * wk[2]);\r\n      g.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      g.clearRect(0, 0, W, H);\r\n      if (held) return;\r\n      asciiScenes(t);\r\n      paintRing(t);\r\n      arches = paintBridge(g, { x: 0, y: 0, w: W, h: H, inset: inset, grow: easeGrow(grow), amp: Math.min(W, H) * .075,\r\n        vib: [[vib[0][0], vib[0][2]], [vib[1][0], vib[1][2]]], hot: hot, fade: af,\r\n        spin: calm ? 0 : -t * .00055, lx: px, ly: py, part: on, ceil: 8, beads: calm ? -1 : t - settle });\r\n      if (!ready && t > settle) { ready = true; box.classList.add('is-ready'); }\r\n    };\r\n    var layout = function () {\r\n      var r = cv.getBoundingClientRect();\r\n      W = r.width; H = r.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\r\n      \/\/ Les piles extr\u00eames tombent pile sur les bords du texte, celle du milieu\r\n      \/\/ sur son axe : le ciel d\u00e9borde de chaque c\u00f4t\u00e9\r\n      var bw = box.getBoundingClientRect().width;\r\n      inset = Math.max(0, (W - bw) \/ 2);\r\n      ring = null; scenes = null;\r\n      if (!running) draw(performance.now());\r\n    };\r\n    var loop = function (now) { draw(now); if (running) raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || held || running || !seen || document.hidden) return; running = true; raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    var hero = box.closest('.hero') || box;\r\n    \/\/ Survoler une rive (la pile la plus proche) ou ses mots dans la phrase met\r\n    \/\/ sa sc\u00e8ne au premier plan et souligne ses mots\r\n    var words = Array.prototype.slice.call(hero.querySelectorAll('.hero-banks b')), hoverWord = -1, hoverBank = -1;\r\n    var setFocus = function () {\r\n      var f = hoverWord >= 0 ? hoverWord : hoverBank;\r\n      if (f === focus) return;\r\n      focus = f;\r\n      words.forEach(function (w, i) { w.classList.toggle('is-hot', i === f); });\r\n      if (calm) {\r\n        for (var k = 0; k < 3; k++) { fw[k] = f < 0 || f === k ? 1 : DIM; wk[k] = hot[k] = f === k ? 1 : 0; }\r\n        af = [f === 0 ? 1 : f === 2 ? .4 : 1, f === 0 ? .4 : 1];\r\n        draw(performance.now());\r\n      }\r\n    };\r\n    words.forEach(function (w, i) {\r\n      w.addEventListener('mouseenter', function () { hoverWord = i; setFocus(); });\r\n      w.addEventListener('mouseleave', function () { hoverWord = -1; setFocus(); });\r\n    });\r\n    \/\/ L\u2019arche \u00e0 l\u2019abscisse x : son param\u00e8tre u et sa hauteur, ou rien hors de sa port\u00e9e\r\n    var bez = function (u, a, b, c, d) { var v = 1 - u; return v * v * v * a + 3 * v * v * u * b + 3 * v * u * u * c + u * u * u * d; };\r\n    var archAt = function (sp, x) {\r\n      if (x <= sp[0] || x >= sp[3]) return null;\r\n      for (var i = 1, u0 = 0, x0 = sp[0], y0 = sp[4]; i <= 40; i++) {\r\n        var u = i \/ 40, x1 = bez(u, sp[0], sp[1], sp[2], sp[3]), y1 = bez(u, sp[4], sp[5], sp[6], sp[7]);\r\n        if (x1 >= x) { var f = (x - x0) \/ (x1 - x0 || 1); return [u0 + (u - u0) * f, y0 + (y1 - y0) * f]; }\r\n        u0 = u; x0 = x1; y0 = y1;\r\n      }\r\n      return null;\r\n    };\r\n    var prev = null;\r\n    hero.addEventListener('pointermove', function (e) {\r\n      if (held) return;\r\n      var r = cv.getBoundingClientRect(), x = e.clientX - r.left, y = e.clientY - r.top;\r\n      \/\/ Traverser une arche la pince : plus le geste est vif, plus elle vibre,\r\n      \/\/ et elle part dans le sens du geste\r\n      if (e.pointerType === 'mouse' && arches && prev && !calm) {\r\n        var vy = (y - prev.y) \/ Math.max(8, e.timeStamp - prev.t) * 1000;\r\n        for (var s = 0; s < 2; s++) {\r\n          var a0 = archAt(arches[s], prev.x), a1 = archAt(arches[s], x);\r\n          if (!a0 || !a1 || (prev.y < a0[1]) === (y < a1[1])) continue;\r\n          var hit = (vy < 0 ? -1 : 1) * Math.min(220, Math.max(55, Math.abs(vy) * .15));\r\n          vib[s][1] += hit * Math.sin(Math.PI * a1[0]);\r\n          vib[s][3] += hit * .6 * Math.sin(2 * Math.PI * a1[0]);\r\n        }\r\n      }\r\n      prev = { x: x, y: y, t: e.timeStamp };\r\n      tx = Math.max(-.3, Math.min(1.3, x \/ (r.width || 1)));\r\n      ty = Math.max(-.3, Math.min(1.3, (e.clientY - r.top) \/ (r.height || 1)));\r\n      ton = e.pointerType === 'mouse' && ty > -.15 && ty < 1.15 ? 1 : 0;\r\n      \/\/ La rive survol\u00e9e : sous une arche, sa sc\u00e8ne ; au-dessus, l\u2019Europe vers le milieu\r\n      var side = x < W \/ 2 ? 0 : 1, over = arches && archAt(arches[side], x);\r\n      hoverBank = e.pointerType === 'mouse' && ty >= 0 && ty <= 1 ? (over && y > over[1] ? side * 2 : Math.abs(x - W \/ 2) < W * .17 ? 1 : side * 2) : -1;\r\n      setFocus();\r\n    });\r\n    hero.addEventListener('pointerleave', function () { tx = ty = .5; ton = 0; hoverBank = -1; prev = null; setFocus(); });\r\n    t0 = performance.now() + 350;\r\n    if ('ResizeObserver' in window) new ResizeObserver(layout).observe(cv); else window.addEventListener('resize', layout);\r\n    if ('IntersectionObserver' in window) new IntersectionObserver(function (en) { seen = en[0].isIntersecting; seen ? play() : pause(); }).observe(cv);\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n    layout();\r\n    \/\/ Sans animation, un seul dessin, une fois la grille de l\u2019Europe charg\u00e9e\r\n    if (calm) { ready = true; box.classList.add('is-ready'); window.setTimeout(function () { draw(performance.now()); }, 0); }\r\n    play();\r\n    heroRope = {\r\n      canvas: cv,\r\n      inset: function () { return inset; },\r\n      \/\/ Rel\u00e2ch\u00e9 avec l\u2019horloge de l\u2019ouverture (origin), le pont reprend la\r\n      \/\/ torsade l\u00e0 o\u00f9 elle en \u00e9tait, d\u00e9j\u00e0 tendu ; sans elle, il pousse comme d\u2019habitude\r\n      release: function (origin) {\r\n        if (!held) return;\r\n        var now = performance.now();\r\n        held = false;\r\n        if (origin) { t0 = origin; grown = true; settle = now - t0 + 260; } else t0 = now + 150;\r\n        draw(now);\r\n        play();\r\n      }\r\n    };\r\n  })();\r\n  \/* ---------------- Ouverture ---------------- *\/\r\n  \/\/ Sur l\u2019\u00e9cran blanc, le pont du h\u00e9ros se tend en petit, au centre. Puis le\r\n  \/\/ blanc s\u2019efface et le pont s\u2019\u00e9tire jusqu\u2019\u00e0 sa place ; le titre monte une\r\n  \/\/ fois le mouvement presque fini.\r\n  (function () {\r\n    if (!introOn) return;\r\n    var cv = intro.querySelector('canvas'), g = cv.getContext('2d');\r\n    var T0 = 0, W = 0, H = 0, dpr = 1, raf = 0, out = 0, over = false, fontsIn = false;\r\n    var m = null;\r\n    var lerp = function (a, b, p) { return a + (b - a) * p; };\r\n    var eio = function (p) { return p < .5 ? 4 * p * p * p : 1 - Math.pow(-2 * p + 2, 3) \/ 2; };\r\n    intro.classList.add('is-live');\r\n    var size = function () {\r\n      W = window.innerWidth; H = window.innerHeight;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\r\n      if (out) return;\r\n      \/\/ Le petit pont, centr\u00e9 un rien au-dessus du milieu, aux proportions du grand\r\n      var w = Math.max(260, Math.min(540, W * .36));\r\n      var hr = heroRope && heroRope.canvas.getBoundingClientRect(), h = hr && hr.height ? w * hr.height \/ (hr.width - 2 * heroRope.inset()) : w \/ 5;\r\n      m = { x: (W - w) \/ 2, y: H * .48 - h \/ 2, w: w, h: h };\r\n    };\r\n    var hand = function () {\r\n      if (over) return;\r\n      over = true;\r\n      cancelAnimationFrame(raf);\r\n      if (heroRope) heroRope.release(out ? T0 : 0);\r\n      loaded();\r\n      root.classList.remove('intro-hold');\r\n      if (intro.parentNode) intro.parentNode.removeChild(intro);\r\n    };\r\n    var frame = function (now) {\r\n      var t = now - T0, grow = clamp01((t - 150) \/ 1200), k = .17;\r\n      var o = { x: m.x, y: m.y, w: m.w, h: m.h, grow: easeGrow(grow), amp: 0, spin: -t * .00055, lx: .5, ly: .5, beads: -1 };\r\n      if (!out && fontsIn && t > 1550) leave(now);\r\n      if (out) {\r\n        \/\/ Le pont rejoint celui du h\u00e9ros, qui n\u2019a pas encore boug\u00e9\r\n        var p = eio(clamp01((now - out - 80) \/ 1000)), r = heroRope && heroRope.canvas.getBoundingClientRect();\r\n        if (r && r.width) {\r\n          o.x = lerp(m.x, r.left, p); o.y = lerp(m.y, r.top, p); o.w = lerp(m.w, r.width, p); o.h = lerp(m.h, r.height, p);\r\n          o.inset = lerp(0, heroRope.inset(), p); o.grow += (1 - o.grow) * p; k = lerp(k, .075, p);\r\n        } else intro.classList.add('is-lost');\r\n        if (p >= 1) return hand();\r\n      }\r\n      o.amp = Math.min(o.w, o.h) * k;\r\n      g.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      g.clearRect(0, 0, W, H);\r\n      paintBridge(g, o);\r\n      raf = requestAnimationFrame(frame);\r\n    };\r\n    var leave = function (now) {\r\n      if (out) return;\r\n      out = now;\r\n      intro.classList.add('is-out');\r\n      \/\/ Le titre monte quand le pont a presque fini de s\u2019\u00e9tirer\r\n      window.setTimeout(function () { loaded(); root.classList.remove('intro-hold'); }, 860);\r\n    };\r\n    var begin = function () {\r\n      if (T0) return;\r\n      size();\r\n      T0 = performance.now();\r\n      raf = requestAnimationFrame(frame);\r\n    };\r\n    \/\/ On attend que la page ait fini son premier rendu, qui fige une ou deux images\r\n    requestAnimationFrame(function () { requestAnimationFrame(begin); });\r\n    window.setTimeout(begin, 400);\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(function () { fontsIn = true; });\r\n    else fontsIn = true;\r\n    window.setTimeout(function () { fontsIn = true; }, 2600);\r\n    \/\/ Un clic, une touche ou la molette : on file directement vers la page\r\n    var skip = function () { if (T0 && !out && !over) leave(performance.now()); };\r\n    ['pointerdown', 'keydown', 'wheel', 'touchstart'].forEach(function (ev) { window.addEventListener(ev, skip, { passive: true }); });\r\n    window.addEventListener('resize', function () { if (!over) size(); });\r\n    \/\/ Onglet cach\u00e9 ou page d\u00e9j\u00e0 d\u00e9fil\u00e9e : on rend la main tout de suite\r\n    var bail = function () { if (!over) hand(); };\r\n    document.addEventListener('visibilitychange', function () { if (document.hidden) bail(); });\r\n    window.addEventListener('scroll', function () { if (window.scrollY > 40) bail(); }, { passive: true });\r\n    window.setTimeout(bail, 7000);\r\n  })();\r\n  \/* ---------------- Territoires : carte de France ---------------- *\/\r\n  \/\/ La France en points, avec ses cinq d\u00e9partements d\u2019outre-mer en cartouches.\r\n  \/\/ Chaque champ d\u2019action a sa couche : une onde recolore les points, puis les\r\n  \/\/ rep\u00e8res propres \u00e0 la couche s\u2019animent (anneaux des agglom\u00e9rations, r\u00e9seau des\r\n  \/\/ structures de l\u2019ESS reli\u00e9 \u00e0 l\u2019Europe). La l\u00e9gende ne s\u2019allume qu\u2019apr\u00e8s l\u2019onde.\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-terr]');\r\n    if (!box) return;\r\n    var canvas = box.querySelector('canvas'), ctx = canvas.getContext('2d'), stage = canvas.parentElement;\r\n    var items = Array.prototype.slice.call(box.querySelectorAll('.field'));\r\n    var btns = items.map(function (li) { return li.querySelector('.field-btn'); });\r\n    var keys = Array.prototype.slice.call(box.querySelectorAll('.terr-key li'));\r\n    var slots = Array.prototype.slice.call(box.querySelectorAll('.drom li'));\r\n    var count = box.querySelector('[data-terr-count]');\r\n    var TONES = ['#45508a', '#55926f', '#bd9035'], GREY = '#d3dbd7', TAU = 6.2832, WAVE = 900;\r\n    \/\/ Contours simplifi\u00e9s (latitude, longitude)\r\n    var HEX = [[51.09,2.55],[50.95,2.61],[50.82,2.63],[50.7,2.9],[50.77,3.1],[50.7,3.25],[50.52,3.3],[50.47,3.6],[50.35,3.7],[50.33,4.02],[50.13,4.2],[49.98,4.15],[50.02,4.45],[50.17,4.83],[49.97,4.85],[49.8,4.9],[49.7,5.2],[49.55,5.45],[49.53,5.8],[49.47,6.1],[49.47,6.37],[49.35,6.55],[49.2,6.75],[49.2,7],[49.12,7.3],[49.17,7.55],[49.05,7.95],[48.97,8.23],[48.8,8.1],[48.55,7.8],[48.3,7.7],[47.95,7.55],[47.59,7.59],[47.5,7.35],[47.45,7],[47.3,6.95],[47.1,6.75],[46.9,6.45],[46.6,6.15],[46.4,6.1],[46.25,5.97],[46.15,5.96],[46.13,6.15],[46.25,6.3],[46.4,6.5],[46.38,6.8],[46.15,6.85],[45.95,6.95],[45.83,6.86],[45.65,6.95],[45.45,7.1],[45.25,6.9],[45.1,6.7],[44.95,6.75],[44.85,6.95],[44.6,6.95],[44.4,6.9],[44.25,7],[44.15,7.35],[43.95,7.6],[43.78,7.53],[43.7,7.3],[43.55,7.1],[43.52,6.93],[43.42,6.8],[43.27,6.7],[43.2,6.55],[43.08,6.3],[43.02,6.12],[43.07,5.9],[43.2,5.6],[43.22,5.35],[43.33,5.2],[43.4,5],[43.33,4.85],[43.4,4.55],[43.45,4.35],[43.53,4.12],[43.4,3.7],[43.28,3.45],[43.15,3.2],[42.95,3.05],[42.7,3.03],[42.52,3.1],[42.43,3.17],[42.43,2.9],[42.35,2.6],[42.4,2.2],[42.45,1.95],[42.5,1.72],[42.6,1.45],[42.7,1.05],[42.78,0.7],[42.7,0.4],[42.78,0],[42.85,-0.3],[42.95,-0.55],[42.97,-0.9],[43.05,-1.3],[43.2,-1.45],[43.37,-1.78],[43.48,-1.56],[43.7,-1.44],[44.2,-1.28],[44.64,-1.25],[45.1,-1.18],[45.57,-1.06],[45.75,-1.2],[45.95,-1.35],[46.15,-1.25],[46.35,-1.45],[46.45,-1.75],[46.7,-1.95],[46.9,-2.15],[47.05,-2.25],[47.15,-2.12],[47.28,-2.25],[47.3,-2.52],[47.48,-2.85],[47.52,-3.1],[47.62,-3.2],[47.72,-3.45],[47.8,-3.85],[47.85,-4.1],[47.8,-4.37],[48,-4.6],[48.1,-4.72],[48.35,-4.78],[48.6,-4.62],[48.68,-4.3],[48.72,-3.98],[48.73,-3.6],[48.83,-3.45],[48.8,-3.05],[48.55,-2.75],[48.6,-2.45],[48.68,-2.32],[48.65,-2.02],[48.68,-1.85],[48.62,-1.51],[48.84,-1.58],[49.1,-1.6],[49.38,-1.8],[49.72,-1.94],[49.66,-1.62],[49.7,-1.26],[49.58,-1.25],[49.38,-1.15],[49.36,-0.85],[49.34,-0.55],[49.29,-0.25],[49.42,0.2],[49.49,0.1],[49.7,0.2],[49.77,0.4],[49.87,0.75],[49.93,1.08],[50.06,1.37],[50.2,1.58],[50.4,1.56],[50.52,1.58],[50.73,1.6],[50.87,1.58],[50.95,1.85],[51,2.12],[51.05,2.37]];\r\n    var CORSE = [[43.01,9.42],[42.8,9.48],[42.7,9.45],[42.4,9.54],[42.1,9.55],[41.86,9.4],[41.6,9.29],[41.38,9.2],[41.4,9.05],[41.6,8.8],[41.72,8.7],[41.92,8.74],[42.05,8.6],[42.25,8.62],[42.38,8.55],[42.55,8.72],[42.64,8.95],[42.68,9.25],[42.75,9.33],[42.95,9.35]];\r\n    \/\/ Outre-mer, dans l\u2019ordre des cartouches ; `c` est le chef-lieu\r\n    var DOM = [\r\n      { c: [16.24, -61.53], p: [[[16.35,-61.72],[16.3,-61.79],[16.17,-61.8],[16.02,-61.74],[15.96,-61.68],[16,-61.58],[16.1,-61.56],[16.2,-61.57],[16.27,-61.58],[16.34,-61.61]], [[16.51,-61.47],[16.47,-61.35],[16.4,-61.23],[16.33,-61.18],[16.28,-61.25],[16.23,-61.38],[16.22,-61.5],[16.27,-61.54],[16.35,-61.52],[16.45,-61.53]], [[15.99,-61.28],[15.95,-61.2],[15.87,-61.22],[15.86,-61.3],[15.92,-61.34]]] },\r\n      { c: [14.61, -61.07], p: [[[14.88,-61.17],[14.8,-61.23],[14.72,-61.18],[14.63,-61.15],[14.57,-61.1],[14.5,-61.08],[14.45,-60.98],[14.4,-60.88],[14.45,-60.82],[14.55,-60.82],[14.64,-60.86],[14.72,-60.9],[14.76,-60.82],[14.79,-60.92],[14.85,-61.02]]] },\r\n      { c: [4.93, -52.33], p: [[[5.75,-54.02],[5.55,-53.5],[5.25,-52.9],[4.93,-52.3],[4.6,-51.95],[4.25,-51.63],[3.8,-51.7],[3.3,-52.2],[2.6,-52.55],[2.2,-52.9],[2.25,-53.7],[2.2,-54.2],[2.4,-54.55],[3.2,-54.2],[3.7,-54.4],[4.3,-54.45],[5,-54.2],[5.4,-54.1]]] },\r\n      { c: [-20.9, 55.45], p: [[[-20.87,55.4],[-20.88,55.6],[-20.95,55.7],[-21.05,55.8],[-21.2,55.83],[-21.33,55.78],[-21.39,55.62],[-21.37,55.45],[-21.28,55.3],[-21.12,55.22],[-20.98,55.28]]] },\r\n      { c: [-12.78, 45.22], p: [[[-12.64,45.05],[-12.68,45.15],[-12.75,45.19],[-12.88,45.2],[-12.97,45.21],[-13,45.14],[-12.94,45.1],[-12.88,45.05],[-12.8,45.07],[-12.72,45.03]], [[-12.77,45.27],[-12.8,45.3],[-12.83,45.28],[-12.8,45.25]]] }\r\n    ];\r\n    \/\/ Agglom\u00e9rations (poids : \u00e9tendue des quartiers prioritaires)\r\n    var CITIES = [[48.86,2.35,1.35],[43.3,5.37,1],[45.76,4.84,.9],[50.63,3.06,.9],[43.6,1.44,.75],[44.84,-.58,.7],[47.22,-1.55,.65],[48.58,7.75,.65],[43.61,3.88,.65],[43.7,7.27,.6],[49.44,1.1,.6],[45.19,5.72,.55],[45.44,4.39,.55],[48.11,-1.68,.55],[50.43,2.83,.55],[47.75,7.34,.5],[49.26,4.03,.5],[49.49,.11,.5],[43.12,5.93,.5],[43.95,4.81,.5],[43.84,4.36,.5],[49.12,6.18,.5],[50.36,3.52,.5],[49.89,2.3,.45],[48.69,6.18,.45],[47.32,5.04,.45],[45.78,3.08,.45],[47.9,1.9,.45],[47.39,.69,.45],[42.7,2.9,.45],[49.26,2.47,.4],[45.83,1.26,.4],[47.24,6.02,.4],[49.18,-.37,.4],[47.47,-.55,.4],[48,.2,.4],[43.34,3.21,.4],[47.51,6.8,.4],[51.03,2.37,.4],[48.39,-4.49,.35],[43.3,-.37,.35],[46.58,.34,.35],[48.3,4.08,.35],[41.93,8.74,.3],[42.7,9.45,.3]];\r\n    \/\/ Structures de l\u2019ESS accompagn\u00e9es : un semis de villes, Marseille en t\u00eate\r\n    var ESS = [[43.3,5.37],[50.63,3.06],[48.11,-1.68],[47.22,-1.55],[44.84,-.58],[43.6,1.44],[43.61,3.88],[45.76,4.84],[45.19,5.72],[48.58,7.75],[48.69,6.18],[47.32,5.04],[48.86,2.35],[49.44,1.1],[47.39,.69],[45.83,1.26],[45.78,3.08],[43.3,-.37],[43.7,7.27],[41.93,8.74],[48.39,-4.49],[49.89,2.3],[46.58,.34]];\r\n    var TOP = 10;   \/\/ les dix premi\u00e8res agglom\u00e9rations portent un anneau\r\n    var K = Math.cos(46.5 * Math.PI \/ 180);\r\n    var proj = function (ll, k) { return [ll[1] * (k || K), -ll[0]]; };\r\n    var inPoly = function (poly, x, y) {\r\n      for (var c = false, i = 0, j = poly.length - 1; i < poly.length; j = i++) {\r\n        var a = poly[i], b = poly[j];\r\n        if ((a[1] > y) !== (b[1] > y) && x < (b[0] - a[0]) * (y - a[1]) \/ (b[1] - a[1]) + a[0]) c = !c;\r\n      }\r\n      return c;\r\n    };\r\n    var clamp01 = function (v) { return v < 0 ? 0 : v > 1 ? 1 : v; };\r\n    var ease = function (t) { return t < .5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2; };\r\n    var hash = function (n) { var x = Math.sin(n * 127.1) * 43758.5453; return x - Math.floor(x); };\r\n    var segDist = function (p, a, b) {\r\n      var dx = b[0] - a[0], dy = b[1] - a[1], t = clamp01(((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) \/ (dx * dx + dy * dy));\r\n      return Math.hypot(p[0] - a[0] - t * dx, p[1] - a[1] - t * dy);\r\n    };\r\n    \/\/ La grille de l\u2019hexagone, calcul\u00e9e une fois, en unit\u00e9s projet\u00e9es\r\n    var HP = HEX.map(function (p) { return proj(p); }), CP = CORSE.map(function (p) { return proj(p); });\r\n    var all = HP.concat(CP), minX = 1e9, maxX = -1e9, minY = 1e9, maxY = -1e9;\r\n    all.forEach(function (p) { minX = Math.min(minX, p[0]); maxX = Math.max(maxX, p[0]); minY = Math.min(minY, p[1]); maxY = Math.max(maxY, p[1]); });\r\n    var ROWS = 62, STEP = (maxY - minY) \/ ROWS, COLS = Math.ceil((maxX - minX) \/ STEP);\r\n    var cityP = CITIES.map(function (c) { return proj(c); }), essP = ESS.map(function (c) { return proj(c); });\r\n    var diagA = proj([49.6, 5.4]), diagB = proj([43.5, -.8]);\r\n    var FX = [], FY = [], V = [[], [], []];\r\n    for (var j = 0; j < ROWS; j++) for (var i = 0; i < COLS; i++) {\r\n      var x = minX + (i + .5) * STEP, y = minY + (j + .5) * STEP;\r\n      if (!inPoly(HP, x, y) && !inPoly(CP, x, y)) continue;\r\n      var n = FX.length, q = 0, dmin = 1e9;\r\n      FX.push(x); FY.push(y);\r\n      cityP.forEach(function (c, k) {\r\n        var d = Math.hypot(x - c[0], y - c[1]), w = CITIES[k][2];\r\n        q = Math.max(q, w * clamp01(1 - d \/ (.2 + .24 * w)));\r\n        if (w >= .45) dmin = Math.min(dmin, d);\r\n      });\r\n      V[0].push(q > .12 ? Math.min(1, .35 + q) : 0);\r\n      var far = clamp01((dmin - .28) \/ .5), band = Math.exp(-Math.pow(segDist([x, y], diagA, diagB) \/ .9, 2));\r\n      var r = far * (.4 + .6 * band) * (.8 + .2 * hash(n + 1));\r\n      V[1].push(r > .16 ? r : 0);\r\n      var e = 0;\r\n      essP.forEach(function (c) { e = Math.max(e, clamp01(1 - Math.hypot(x - c[0], y - c[1]) \/ .2)); });\r\n      V[2].push(e > .05 ? .25 + .6 * e : 0);\r\n    }\r\n    var NF = FX.length;\r\n    \/\/ Liens du r\u00e9seau : chaque structure vers ses deux voisines les plus proches\r\n    var LINKS = [];\r\n    essP.forEach(function (a, ia) {\r\n      essP.map(function (b, ib) { return [ib, Math.hypot(a[0] - b[0], a[1] - b[1])]; })\r\n        .sort(function (u, v) { return u[1] - v[1]; }).slice(1, 3)\r\n        .forEach(function (nb) { var k = Math.min(ia, nb[0]) + ':' + Math.max(ia, nb[0]); if (LINKS.indexOf(k) < 0) LINKS.push(k); });\r\n    });\r\n    LINKS = LINKS.map(function (k) { return k.split(':').map(Number); });\r\n    var STRAS = 9;   \/\/ Strasbourg : le r\u00e9seau y rejoint l\u2019Europe\r\n    \/\/ Mise en page (px) : points de l\u2019hexagone, puis des cartouches\r\n    var W = 0, H = 0, dpr = 1, pitch = 1, r0 = 1, mk = 1, ox = 0, oy = 0, base = null;\r\n    var PX = [], PY = [], DX = [], DY = [], DS = [], DV = [[], [], []], cityPx = [], essPx = [], eu = [0, 0];\r\n    var toPx = function (p) { return [ox + (p[0] - minX) * pitch \/ STEP, oy + (p[1] - minY) * pitch \/ STEP]; };\r\n    var layout = function () {\r\n      var rect = stage.getBoundingClientRect();\r\n      W = rect.width; H = rect.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      canvas.width = Math.round(W * dpr); canvas.height = Math.round(H * dpr);\r\n      \/\/ Cartouches en colonne \u00e0 gauche, ou en rang\u00e9e dessous (t\u00e9l\u00e9phone)\r\n      var dr = slots[0].parentElement.getBoundingClientRect(), row = dr.width > W \/ 2, pad = row ? 14 : 22;\r\n      var L = row ? pad : dr.right - rect.left + 18, B = row ? rect.bottom - dr.top + 12 : pad;\r\n      pitch = Math.min((W - L - pad) \/ COLS, (H - pad - B) \/ ROWS);\r\n      ox = L + (W - L - pad - COLS * pitch) \/ 2; oy = pad + (H - pad - B - ROWS * pitch) \/ 2;\r\n      r0 = Math.max(1, pitch * .3); mk = Math.max(.7, Math.min(1.3, pitch \/ 8));\r\n      PX = []; PY = [];\r\n      for (var k = 0; k < NF; k++) { var p = toPx([FX[k], FY[k]]); PX.push(p[0]); PY.push(p[1]); }\r\n      cityPx = cityP.slice(0, TOP).map(toPx); essPx = essP.map(toPx);\r\n      eu = [W - 34 * mk - 8, 34 * mk + 8];\r\n      \/\/ Cartouches : chaque \u00eele \u00e0 sa propre \u00e9chelle, points un peu plus serr\u00e9s\r\n      DX = []; DY = []; DS = []; DV = [[], [], []];\r\n      var pp = pitch * .78;\r\n      DOM.forEach(function (d, si) {\r\n        var sr = slots[si].getBoundingClientRect();\r\n        var bx = sr.left - rect.left + 6, by = sr.top - rect.top + 6, bw = sr.width - 12, bh = sr.height - 28;\r\n        var kk = Math.cos(d.c[0] * Math.PI \/ 180), polys = d.p.map(function (poly) { return poly.map(function (q) { return proj(q, kk); }); });\r\n        var x0 = 1e9, x1 = -1e9, y0 = 1e9, y1 = -1e9;\r\n        polys.forEach(function (poly) { poly.forEach(function (q) { x0 = Math.min(x0, q[0]); x1 = Math.max(x1, q[0]); y0 = Math.min(y0, q[1]); y1 = Math.max(y1, q[1]); }); });\r\n        var sc = Math.min(bw \/ (x1 - x0), bh \/ (y1 - y0)), cx = bx + bw \/ 2, cy = by + bh \/ 2;\r\n        var mx = (x0 + x1) \/ 2, my = (y0 + y1) \/ 2, cc = proj(d.c, kk);\r\n        var ccx = cx + (cc[0] - mx) * sc, ccy = cy + (cc[1] - my) * sc;\r\n        var nx = Math.floor(bw \/ pp), ny = Math.floor(bh \/ pp);\r\n        for (var iy = 0; iy < ny; iy++) for (var ix = 0; ix < nx; ix++) {\r\n          var gx = cx + (ix - (nx - 1) \/ 2) * pp, gy = cy + (iy - (ny - 1) \/ 2) * pp;\r\n          var ux = mx + (gx - cx) \/ sc, uy = my + (gy - cy) \/ sc;\r\n          if (!polys.some(function (poly) { return inPoly(poly, ux, uy); })) continue;\r\n          var dc = Math.hypot(gx - ccx, gy - ccy) \/ pp;\r\n          DX.push(gx); DY.push(gy); DS.push(si);\r\n          DV[0].push(dc < 2.2 ? .45 + .5 * (1 - dc \/ 2.2) : 0);\r\n          DV[1].push(.55 + .35 * hash(DX.length));\r\n          DV[2].push(dc < 1.6 ? .4 + .5 * (1 - dc \/ 1.6) : 0);\r\n        }\r\n      });\r\n      \/\/ Couche fixe : tous les points gris\r\n      base = document.createElement('canvas');\r\n      base.width = canvas.width; base.height = canvas.height;\r\n      var b = base.getContext('2d');\r\n      b.scale(dpr, dpr); b.fillStyle = GREY; b.beginPath();\r\n      for (k = 0; k < NF; k++) { b.moveTo(PX[k] + r0, PY[k]); b.arc(PX[k], PY[k], r0, 0, TAU); }\r\n      for (k = 0; k < DX.length; k++) { b.moveTo(DX[k] + r0 * .85, DY[k]); b.arc(DX[k], DY[k], r0 * .85, 0, TAU); }\r\n      b.fill();\r\n      draw(performance.now());\r\n    };\r\n    \/\/ \u00c9tat : couche affich\u00e9e, couche pr\u00e9c\u00e9dente, instant du changement\r\n    var cur = -1, prev = -1, ts = 0, running = false, visible = false, raf = 0, keyTimer = 0;\r\n    var ORIG = [[48.86, 2.35], [45.5, 2.8], [43.3, 5.37]].map(function (o) { return proj(o); });\r\n    var dot = function (x, y, r) { ctx.beginPath(); ctx.arc(x, y, r, 0, TAU); ctx.fill(); };\r\n    var ring = function (x, y, r) { ctx.beginPath(); ctx.arc(x, y, r, 0, TAU); ctx.stroke(); };\r\n    var draw = function (now) {\r\n      if (!base) return;\r\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n      ctx.drawImage(base, 0, 0);\r\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      if (cur < 0) return;\r\n      var t = calm ? 1e9 : now - ts, o = toPx(ORIG[cur]), reach = Math.hypot(W, H);\r\n      \/\/ L\u2019onde : la couche pr\u00e9c\u00e9dente s\u2019\u00e9teint, la nouvelle s\u2019allume, depuis son origine\r\n      var wave = function (x, y) { return ease(clamp01((t - Math.hypot(x - o[0], y - o[1]) \/ reach * WAVE) \/ 520)); };\r\n      var paint = function (px, py, vals, r, k, pd) {\r\n        var p = pd == null ? wave(px, py) : ease(clamp01((t - pd) \/ 520));\r\n        var a = prev >= 0 ? vals[prev][k] * (1 - p) : 0, b = vals[cur][k] * p;\r\n        if (cur === 1 && b) b *= .88 + .12 * Math.sin(now \/ 900 + k);\r\n        if (a > .02) { ctx.globalAlpha = a; ctx.fillStyle = TONES[prev]; dot(px, py, r * (1 + .3 * a)); }\r\n        if (b > .02) { ctx.globalAlpha = b; ctx.fillStyle = TONES[cur]; dot(px, py, r * (1 + .3 * b)); }\r\n      };\r\n      for (var k = 0; k < NF; k++) paint(PX[k], PY[k], V, r0, k);\r\n      for (k = 0; k < DX.length; k++) paint(DX[k], DY[k], DV, r0 * .85, k, WAVE * .45 + DS[k] * 70);\r\n      ctx.globalAlpha = 1;\r\n      \/\/ Rep\u00e8res propres \u00e0 chaque couche, une fois l\u2019onde pass\u00e9e\r\n      var fin = calm ? 1 : clamp01((t - WAVE * .8) \/ 600), out = calm ? 0 : 1 - clamp01((t) \/ 260);\r\n      var layer = function (L, amt) {\r\n        if (amt <= .01) return;\r\n        var tone = TONES[L];\r\n        if (L === 0) {\r\n          cityPx.forEach(function (c, i) {\r\n            if (!calm) {\r\n              var q = ((now + i * 330) % 2800) \/ 2800;\r\n              ctx.globalAlpha = (1 - q) * .55 * amt; ctx.strokeStyle = tone; ctx.lineWidth = 1.2;\r\n              ring(c[0], c[1], (4 + q * 18) * mk);\r\n            }\r\n            ctx.globalAlpha = amt; ctx.fillStyle = '#fff'; dot(c[0], c[1], 3.6 * mk);\r\n            ctx.fillStyle = tone; dot(c[0], c[1], 2.2 * mk);\r\n          });\r\n        }\r\n        if (L === 2) {\r\n          var grow = calm ? 1 : clamp01((t - WAVE * .7) \/ 1100);\r\n          ctx.lineCap = 'round'; ctx.strokeStyle = tone; ctx.lineWidth = 1.3 * mk;\r\n          LINKS.forEach(function (lk, i) {\r\n            var a = essPx[lk[0]], b = essPx[lk[1]], g = ease(clamp01(grow * 1.6 - i \/ LINKS.length * .6));\r\n            if (g <= 0) return;\r\n            ctx.globalAlpha = .5 * amt;\r\n            ctx.beginPath(); ctx.moveTo(a[0], a[1]); ctx.lineTo(a[0] + (b[0] - a[0]) * g, a[1] + (b[1] - a[1]) * g); ctx.stroke();\r\n          });\r\n          \/\/ Changer d\u2019\u00e9chelle : du r\u00e9seau, un fil part vers l\u2019Europe\r\n          var s = essPx[STRAS], ge = calm ? 1 : ease(clamp01((t - WAVE * .7 - 900) \/ 800));\r\n          if (ge > 0) {\r\n            ctx.globalAlpha = .75 * amt; ctx.setLineDash([0, 5 * mk]); ctx.lineWidth = 1.6 * mk;\r\n            ctx.beginPath(); ctx.moveTo(s[0], s[1]); ctx.lineTo(s[0] + (eu[0] - s[0]) * ge, s[1] + (eu[1] - s[1]) * ge); ctx.stroke();\r\n            ctx.setLineDash([]);\r\n            var ea = amt * clamp01(ge * 3 - 2), er = 13 * mk;\r\n            if (ea > 0) {\r\n              ctx.globalAlpha = ea;\r\n              ctx.fillStyle = '#fff'; dot(eu[0], eu[1], er + 3 * mk);\r\n              ctx.fillStyle = '#003399'; dot(eu[0], eu[1], er);\r\n              ctx.fillStyle = '#ffcc00';\r\n              for (var st = 0; st < 12; st++) dot(eu[0] + Math.cos(st * TAU \/ 12) * er * .62, eu[1] + Math.sin(st * TAU \/ 12) * er * .62, 1.1 * mk);\r\n              if (!calm) { var qe = (now % 2400) \/ 2400; ctx.globalAlpha = (1 - qe) * .5 * ea; ctx.strokeStyle = '#003399'; ctx.lineWidth = 1.2; ring(eu[0], eu[1], er + (3 + qe * 14) * mk); }\r\n            }\r\n          }\r\n          \/\/ Des \u00e9clats circulent sur le r\u00e9seau\r\n          if (!calm && grow >= 1) {\r\n            for (var c = 0; c < 3; c++) {\r\n              var cyc = Math.floor((now + c * 700) \/ 2100), lk = LINKS[(cyc * 7 + c * 5) % LINKS.length], u = ease(((now + c * 700) % 2100) \/ 2100);\r\n              var A = essPx[lk[0]], B = essPx[lk[1]];\r\n              if (cyc % 2) { var tmp = A; A = B; B = tmp; }\r\n              ctx.globalAlpha = amt * Math.sin(u * Math.PI); ctx.fillStyle = tone;\r\n              dot(A[0] + (B[0] - A[0]) * u, A[1] + (B[1] - A[1]) * u, 2.6 * mk);\r\n            }\r\n          }\r\n          essPx.forEach(function (p, i) {\r\n            var pop = calm ? 1 : ease(clamp01((t - WAVE * .6 - i * 40) \/ 420)), big = i === 0 ? 1.35 : 1;\r\n            if (pop <= 0) return;\r\n            if (!calm) {\r\n              var q = ((now + i * 410) % 3600) \/ 3600;\r\n              ctx.globalAlpha = (1 - q) * .35 * amt; ctx.strokeStyle = tone; ctx.lineWidth = 1;\r\n              ring(p[0], p[1], (5 + q * 16) * mk * big);\r\n            }\r\n            ctx.globalAlpha = amt * pop;\r\n            ctx.fillStyle = '#fff'; dot(p[0], p[1], 4.4 * mk * big * pop);\r\n            ctx.fillStyle = tone; dot(p[0], p[1], 2.6 * mk * big * pop);\r\n          });\r\n        }\r\n        ctx.globalAlpha = 1;\r\n      };\r\n      if (prev >= 0 && out > 0) layer(prev, out);\r\n      layer(cur, fin);\r\n    };\r\n    var loop = function (now) { draw(now); if (running) raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || running || !visible || cur < 0 || document.hidden) return; running = true; raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    \/\/ Passer \u00e0 une couche : la l\u00e9gende s\u2019\u00e9teint d\u2019un coup, se rallume apr\u00e8s l\u2019onde\r\n    var show = function (L) {\r\n      if (L === cur) return;\r\n      prev = cur; cur = L; ts = performance.now();\r\n      items.forEach(function (li, i) { li.classList.toggle('is-on', i === L); btns[i].setAttribute('aria-pressed', i === L ? 'true' : 'false'); });\r\n      keys.forEach(function (k) { k.classList.remove('is-on'); });\r\n      box.classList.remove('is-dom');\r\n      clearTimeout(keyTimer);\r\n      keyTimer = setTimeout(function () {\r\n        keys[L].classList.add('is-on');\r\n        box.classList.toggle('is-dom', L === 1);\r\n        count.textContent = '0' + (L + 1) + ' \/ 03';\r\n      }, calm ? 0 : WAVE + 150);\r\n      if (calm) draw(performance.now()); else play();\r\n    };\r\n    btns.forEach(function (b, i) { b.addEventListener('click', function () { box.classList.remove('is-auto'); show(i); }); });\r\n    \/\/ Le cycle : la barre du champ actif sert de minuterie\r\n    items.forEach(function (li, i) {\r\n      li.querySelector('.field-bar').addEventListener('animationend', function () { if (box.classList.contains('is-auto')) show((i + 1) % items.length); });\r\n    });\r\n    keys[0].classList.remove('is-on');\r\n    if ('ResizeObserver' in window) new ResizeObserver(layout).observe(stage); else window.addEventListener('resize', layout);\r\n    layout();\r\n    if (calm) { show(0); return; }\r\n    if ('IntersectionObserver' in window) {\r\n      new IntersectionObserver(function (entries) {\r\n        visible = entries[0].isIntersecting;\r\n        box.classList.toggle('is-hold', !visible);\r\n        if (visible) { if (cur < 0) { box.classList.add('is-auto'); show(0); } play(); } else pause();\r\n      }, { threshold: .35 }).observe(stage);\r\n    } else { visible = true; show(0); }\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n  })();\r\n  \/* ---------------- Carte de l\u2019Europe ---------------- *\/\r\n  \/\/ Grille de points pr\u00e9calcul\u00e9e (projection azimutale \u00e9quivalente centr\u00e9e sur\r\n  \/\/ l\u2019Europe, 134 \u00d7 92 cases ; \u00e0 partir de la colonne 111, de la Turquie \u00e0\r\n  \/\/ Chypre, la terre vient de la carte du monde de GeoKit). Chaque bit dit si la\r\n  \/\/ case est sur terre, et si elle est en France. Les lieux sont en unit\u00e9s de case.\r\n  var GRID = {\"cols\":134,\"rows\":92,\"step\":9,\"land\":\"AAAAAEAA\/P\/\/kQb4\/\/\/\/\/z8AAAAAEAD\/\/\/8B8P\/\/\/\/\/\/DwAAAAAAAP\/\/fwD+\/\/\/\/\/\/8DAAAAAADA\/\/8fwP\/\/\/\/\/\/\/wAAAAAEAPz\/\/wP2\/\/\/\/\/\/8\/AAAABAAA\/\/\/\/APz\/\/\/\/\/\/w8AAIA4AAA\/\/g9g\/P\/\/\/\/\/\/AwAAEAcA4If\/AwD\/\/\/\/\/\/\/8AAADoAAD44P8AwP\/\/\/\/\/\/PwAAgPoBABzwP4Lj\/\/\/\/\/\/8PAAAA\/gAAAPyP4P3\/\/\/\/\/\/wMAAMAfAAAg\/iP4\/\/\/\/\/\/\/\/AAAA6AcAAIz\/Af7\/\/\/\/\/\/z8AAAD8AADAwz+A\/\/\/\/\/\/\/\/DwAAQD8AAPDwB+D\/\/\/\/\/\/\/8DAACgDwAAfvwB+P\/\/\/\/\/\/\/wAAwOAHAIAPHwD8\/\/\/\/\/\/8\/AAD4+AEA4KEDgP\/\/\/\/\/\/\/w8AIH5\/AAB47gDA\/\/\/\/\/\/\/\/AwDwHz4AAOwDAPz\/\/\/\/\/\/\/8AAP6DDwAAAwAY\/\/\/\/\/\/\/\/PwCAf+QHAMAdgOf\/\/\/\/\/\/\/8PAIAf8AMAYELw\/\/\/\/\/\/\/\/\/wMA8Af8AAB4DP\/\/\/\/\/\/\/\/\/\/AAD+kR8AAP7\/\/\/\/\/\/\/\/\/\/z8A4D\/8DwDQ\/\/\/\/\/\/\/\/\/\/\/\/DwD4D\/4DwP7\/\/\/\/\/\/\/\/\/\/\/8DAH6A\/wP4\/\/\/\/\/\/\/\/\/\/\/\/\/wAAAPj\/Af\/\/\/\/\/\/\/\/\/\/\/\/8\/AAAA\/3\/g\/\/\/\/\/\/\/\/\/\/\/\/\/w8AAAD\/H\/j\/\/\/\/\/\/\/\/\/\/\/\/\/AwAAgP4B\/\/\/\/\/\/\/\/\/\/\/\/\/\/8AAAD4P8D\/\/\/\/\/\/\/\/\/\/\/\/\/PwAAAP8\/9P\/\/\/\/\/\/\/\/\/\/\/\/8PAADgieP\/\/\/\/\/\/\/\/\/\/\/\/\/\/wMAAAQA\/P\/\/\/\/\/\/\/\/\/\/\/\/\/\/AAAAAAD\/\/\/\/\/\/\/\/\/\/\/\/\/\/z8AAAAAwP\/\/\/\/\/\/\/\/\/\/\/\/\/\/DwAAABD+\/\/\/\/\/\/\/\/\/\/\/\/\/+cDAAAAjP\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/QAAAAD\/\/\/\/\/\/\/\/\/\/\/\/\/\/x8\/AADAx\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/4w8AAOD\/\/\/\/\/\/\/\/\/\/\/\/\/\/z\/wAwAA+P\/\/\/\/\/\/\/\/\/\/\/\/\/+D\/wAAAD4\/\/\/\/\/\/\/\/\/\/\/\/v\/+BPwAAAPj\/\/\/\/\/\/\/\/\/\/\/+Pf+APAAAA\/v\/\/\/\/\/\/\/\/\/\/\/8Ee\/wMAAAD\/\/\/\/\/\/\/\/\/\/\/8\/wH\/+AAAAwP\/\/\/\/\/\/\/\/\/\/\/x\/wBzAAAADw\/\/\/\/\/\/\/\/\/\/\/\/B\/AAAAAAAPD\/\/\/\/\/\/\/\/\/\/\/8BGAAAAAAA\/P\/\/\/\/\/\/\/\/\/\/HwAAAAAAAID\/\/\/\/\/\/\/\/\/\/\/8HAAAAAAAAwP\/\/\/\/\/\/\/\/\/\/\/wEAAAAAAADo\/\/\/\/f\/7\/\/\/9\/AAAAAAAAAP7\/\/\/+H\/v\/\/\/x8AAAAAAACA\/\/\/\/\/2P\/\/\/\/\/AwAAAAAcAOD\/\/\/9\/wP\/\/\/\/8AAAAAwP8A\/P\/\/\/x\/g\/\/\/\/PwAAAADw\/wL\/\/\/\/xD\/j\/\/\/8PAMAEAPz\/5\/\/\/f\/AH+P\/\/\/wMA\/y8A\/\/\/\/\/\/8D\/Afw\/\/\/\/AeD\/D8D\/\/\/8\/eAD+Afj\/\/\/8A\/P8D8P\/\/\/wcIgP8A\/P\/\/\/4H\/\/wD+\/\/\/\/AQDAPwD8\/\/8\/8P8\/AP\/\/\/\/8AwOAfAPz\/\/6H\/\/w\/g\/\/\/\/HwAw8A8A\/v8\/+P\/\/A\/j\/\/\/8HAAz4P4D\/D9D\/\/\/8A\/\/\/\/fwAAA\/wP4P8B\/\/\/\/P8D\/\/\/8HAIAA\/A\/478D\/\/\/8P+P\/\/fwAAIAD8D\/4j8v\/\/\/wP\/\/\/8PAAAcAPyP\/wDw\/\/\/\/QP\/\/\/wEAgAcAPoZ\/AP\/\/\/z\/g\/\/8\/AADgAQAP8T8A\/v\/\/D\/j\/\/weQAHgAAAPwD4D\/\/\/8D\/v\/\/AQYAHADAAfgJ8P\/\/\/4D\/\/38AAYAHAOAA\/A\/w\/\/8\/4P\/\/PwIA4AEAGADGBfz\/\/wn8\/\/8HAAAQAAACIJ8E\/P8fAv\/\/\/wAAAAAAwADgBwD+\/gMA8P8fAAAAAAAYAPSCkD98IAD4\/wcAAAAA7gEAeADgDwIAAP4\/AAAAAIB\/AAAaAIABAACAjw8AAAAAgA8AAAgAAgAHAEAAAAAAAASABwAAAgAA4AAAAAAAAIfEF4ABAAAAAAAcAAAGAOD\/\/\/8HAAAAAKAAAAYAgAMA\/v\/\/\/wAAAADADwAAAADwAfD\/\/\/8fAAAAAAAAAAAAAP4P\/\/\/\/\/w8AAAAAAAAAAACA\/\/\/\/\/\/\/\/BwAAAAAAAAAAAPD\/\/\/\/\/\/\/8BAAAAAAAAAAA=\",\"france\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAwA8AAAAAAAAAAAAAAAAAABD+AwAAAAAAAAAAAAAAAAAAjP8DAAAAAAAAAAAAAAAAAAD\/\/wcAAAAAAAAAAAAAAADAx\/\/\/AwAAAAAAAAAAAAAAAOD\/\/\/8HAAAAAAAAAAAAAAAA+P\/\/\/wAAAAAAAAAAAAAAAAD4\/\/8\/AAAAAAAAAAAAAAAAAPj\/\/w8AAAAAAAAAAAAAAAAA\/v\/\/AwAAAAAAAAAAAAAAAAD\/\/38AAAAAAAAAAAAAAAAAwP\/\/DwAAAAAAAAAAAAAAAADw\/\/8BAAAAAAAAAAAAAAAAAPD\/PwAAAAAAAAAAAAAAAAAA\/P8PAAAAAAAAAAAAAAAAAID\/\/wcAAAAAAAAAAAAAAAAAwP\/\/AwAAAAAAAAAAAAAAAADo\/\/8AAAAAAAAAAAAAAAAAAP7\/PwAAAAAAAAAAAAAAAACA\/\/8HAAAAAAAAAAAAAAAAAOD\/\/wMAAAAAAAAAAAAAAAAA\/P9\/AAAAAAAAAAAAAAAAAAD\/\/z8AAAAAAAAAAAAAAAAA4P\/\/HwAAAAAAAAAAAAAAAADw\/\/8DAAAAAAAAAAAAAAAAAPg\/eAAAAAAAAAAAAAAAAAAA2AcIAAAAAAAAAAAAAAAAAADAAQAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"cities\":{\"sud\":[47.23,62.51],\"oc\":[43.42,61.18],\"pa\":[29.29,60.29],\"idf\":[41.22,42.22],\"ge\":[53.99,43.89],\"pdl\":[31.18,47.01],\"om\":[11.2,46.54],\"ES\":[22.01,70.85],\"IT\":[66.21,65.24],\"GR\":[93.07,75.05],\"IE\":[20.86,23.6],\"TR\":[113.58,68.29],\"NO\":[60.8,3.92],\"BE\":[46.75,36.38],\"NL\":[49.63,30.49],\"PT\":[10.05,71.02],\"DE\":[60.28,34.64],\"RO\":[96.71,50.54],\"EE\":[88.86,5.5],\"SE\":[70.55,4.61],\"LV\":[89.1,11.94],\"PL\":[79.82,30.42],\"CZ\":[71.96,39.26],\"CY\":[126.51,84.5],\"LT\":[88.04,17.88],\"HU\":[82.33,47.74],\"RS\":[87.2,58.74],\"DK\":[57.77,17.64],\"BG\":[99.23,61.8],\"LU\":[50.3,39.77]}};\r\n  \/\/ Quelques exemples de projets financ\u00e9s, d\u2019apr\u00e8s la feuille de la carte des\r\n  \/\/ partenaires : nom, ann\u00e9e, origine, type (c coop\u00e9ration, m mobilit\u00e9, cm les\r\n  \/\/ deux), pays partenaires, \u00e9tat (f financ\u00e9).\r\n  var PROJ = [\r\n    [\"Solidarit\u00e9 Femmes 13\", 2023, \"sud\", \"c\", \"ES\", \"f\"],\r\n    [\"Groupe Dispersion\", 2023, \"sud\", \"c\", \"PL\", \"f\"],\r\n    [\"L\u2019\u0152il du Loup\", 2023, \"sud\", \"c\", \"DK\", \"f\"],\r\n    [\"Le Grand Bleu\", 2025, \"sud\", \"m\", \"GR\", \"f\"],\r\n    [\"La For\u00eat en papier\", 2025, \"sud\", \"c\", \"IT\", \"f\"],\r\n    [\"AJAR\", 2026, \"idf\", \"m\", \"RO ES SE\", \"f\"],\r\n    [\"\u00c9COLE DE LA DEUXI\u00c8ME CHANCE\", 2026, \"pdl\", \"cm\", \"IE\", \"f\"],\r\n    [\"La Ferme d\u2019Uhaldia\", 2026, \"pa\", \"m\", \"ES\", \"f\"]\r\n  ];\r\n  \/\/ La carte se d\u00e9ploie quand elle entre \u00e0 l\u2019\u00e9cran : les points naissent depuis\r\n  \/\/ les villes des structures, puis les ponts se tracent, un par un, chacun vers\r\n  \/\/ la teinte de son pays ; \u00e0 l\u2019arriv\u00e9e, une onde colore les points alentour.\r\n  \/\/ Survoler un projet de la liste, une ville ou un pays isole ses ponts.\r\n  (function () {\r\n    var mapEl = document.getElementById('shl-accueil').querySelector('[data-map]');\r\n    var canvas = mapEl.querySelector('canvas');\r\n    var ctx = canvas.getContext('2d');\r\n    var legend = mapEl.querySelector('[data-legend]');\r\n    var listEl = legend.querySelector('[data-legend-list]');\r\n    var tip = mapEl.querySelector('[data-map-tip]');\r\n    var holder = canvas.parentElement, col = mapEl.querySelector('.atlas-copy'), key = mapEl.querySelector('.map-key');\r\n    \/\/ Le cadrage, en cases : de l\u2019Irlande \u00e0 Chypre, de la Norv\u00e8ge au sud de l\u2019Espagne\r\n    var ROI = [5, 0, 129, 88];\r\n    var COLS = GRID.cols, ROWS = GRID.rows, N = COLS * ROWS;\r\n    var bits = function (b64) {\r\n      var bin = atob(b64), out = new Uint8Array(N);\r\n      for (var i = 0; i < N; i++) out[i] = (bin.charCodeAt(i >> 3) >> (i & 7)) & 1;\r\n      return out;\r\n    };\r\n    var land = bits(GRID.land), france = bits(GRID.france), C = GRID.cities;\r\n    var EN = LANG === 'en';\r\n    \/\/ D\u2019o\u00f9 partent les projets : la ville ou le pays de la structure accompagn\u00e9e\r\n    var ORIG = {\r\n      sud: ['Aix-Marseille', 'Aix-Marseille', 1], pa: ['Pays basque', 'Basque Country', 1],\r\n      idf: ['Paris', 'Paris', 1], pdl: ['Nantes', 'Nantes', 1]\r\n    };\r\n    var NET = [];\r\n    \/\/ Pays partenaires : nom, nom anglais, teinte de la roue (deux voisins n\u2019ont jamais la m\u00eame)\r\n    var CTRY = {\r\n      ES: ['Espagne', 'Spain', 1], PT: ['Portugal', 'Portugal', 4], IT: ['Italie', 'Italy', 5], GR: ['Gr\u00e8ce', 'Greece', 7],\r\n      BE: ['Belgique', 'Belgium', 8], NL: ['Pays-Bas', 'Netherlands', 3], LU: ['Luxembourg', 'Luxembourg', 2], DE: ['Allemagne', 'Germany', 10],\r\n      IE: ['Irlande', 'Ireland', 6], TR: ['Turquie', 'T\u00fcrkiye', 2], RO: ['Roumanie', 'Romania', 3], PL: ['Pologne', 'Poland', 9],\r\n      EE: ['Estonie', 'Estonia', 2], LV: ['Lettonie', 'Latvia', 6], LT: ['Lituanie', 'Lithuania', 1], SE: ['Su\u00e8de', 'Sweden', 3],\r\n      NO: ['Norv\u00e8ge', 'Norway', 9], DK: ['Danemark', 'Denmark', 5], CZ: ['Tch\u00e9quie', 'Czechia', 7], HU: ['Hongrie', 'Hungary', 4],\r\n      RS: ['Serbie', 'Serbia', 10], BG: ['Bulgarie', 'Bulgaria', 1], CY: ['Chypre', 'Cyprus', 6]\r\n    };\r\n    var TONE = ['', '#c86a5e', '#b25f35', '#bd9035', '#8d9b4e', '#55926f', '#6d9b93', '#4b8296', '#45508a', '#8480be', '#92557c'];\r\n    var TONEX = ['', '#af564b', '#ab5b32', '#8c6c20', '#6a7637', '#437c5d', '#4f7871', '#43778b', '#45508a', '#6e6aa8', '#92557c'];\r\n    var LAND = '#d3dbd7', FR = '#7f9b9b', INK = '#16262c', TEAL = '#1f4a4d', TAU = 6.2832;\r\n    var oName = function (o) { return ORIG[o][EN ? 1 : 0]; };\r\n    var cName = function (c) { return CTRY[c][EN ? 1 : 0]; };\r\n    var esc = function (s) { return String(s).replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/\"\/g, '&quot;'); };\r\n    var plural = function (n, one, many) { return n + ' ' + tr(n > 1 ? many : one); };\r\n    \/\/ Projets, et paires origine \u2192 pays : un pont par paire, d\u2019autant plus \u00e9pais qu\u2019il porte de projets\r\n    var projects = PROJ.map(function (p, i) { return { i: i, name: p[0], year: p[1], o: p[2], type: p[3], c: p[4].split(' '), st: p[5] }; });\r\n    var pairs = [], pairAt = {};\r\n    projects.forEach(function (p) {\r\n      p.pairs = p.c.map(function (c) {\r\n        var k = p.o + '>' + c;\r\n        if (!(k in pairAt)) { pairAt[k] = pairs.length; pairs.push({ o: p.o, c: c, n: 0 }); }\r\n        pairs[pairAt[k]].n++;\r\n        return pairAt[k];\r\n      });\r\n    });\r\n    var usedC = Object.keys(CTRY).filter(function (c) { return pairs.some(function (q) { return q.c === c; }); });\r\n    var origins = Object.keys(ORIG).filter(function (o) { return projects.some(function (p) { return p.o === o; }); });\r\n    var perO = {}, perC = {};\r\n    origins.forEach(function (o) { perO[o] = projects.filter(function (p) { return p.o === o; }).length; });\r\n    usedC.forEach(function (c) { perC[c] = projects.filter(function (p) { return p.c.indexOf(c) >= 0; }).length; });\r\n    \/\/ Ordre d\u2019apparition : le hub le plus fourni d\u2019abord, puis du pont le plus court au plus long\r\n    var seq = pairs.map(function (q, i) { return i; }).sort(function (a, b) {\r\n      var A = pairs[a], B = pairs[b];\r\n      if (A.o !== B.o) return perO[B.o] - perO[A.o];\r\n      return Math.hypot(C[A.c][0] - C[A.o][0], C[A.c][1] - C[A.o][1]) - Math.hypot(C[B.c][0] - C[B.o][0], C[B.c][1] - C[B.o][1]);\r\n    });\r\n    seq.forEach(function (k, r) { pairs[k].r = r; });\r\n    var T_DOTS = 1100, T_NET = 900, T_ARC = 1400, GAP = 55, DUR = 1000;\r\n    var T_END = T_ARC + (pairs.length - 1) * GAP + DUR;\r\n    \/\/ Un pays s\u2019allume quand son premier pont arrive\r\n    var landT = {};\r\n    pairs.forEach(function (q) { landT[q.c] = Math.min(landT[q.c] || 1e9, T_ARC + q.r * GAP + DUR); });\r\n    \/\/ Les points de terre, et leur distance au hub le plus proche (en cases)\r\n    var DX = [], DY = [], DF = [], DD = [], EF = [], cellDot = new Int32Array(N).fill(-1), x, y, i;\r\n    var starts = origins.map(function (o) { return C[o]; });\r\n    for (y = 0; y < ROWS; y++) for (x = 0; x < COLS; x++) {\r\n      i = y * COLS + x;\r\n      if (!land[i]) continue;\r\n      cellDot[i] = DX.length;\r\n      DX.push(x + .5); DY.push(y + .5); DF.push(france[i]);\r\n      EF.push(Math.min(1, (y + .5) \/ 7, (COLS - x - .5) \/ 7, (ROWS - y - .5) \/ 6));\r\n      var d0 = 1e9;\r\n      for (var s = 0; s < starts.length; s++) d0 = Math.min(d0, Math.hypot(x + .5 - starts[s][0], y + .5 - starts[s][1]));\r\n      DD.push(d0);\r\n    }\r\n    var D = DX.length, maxD = 0;\r\n    for (i = 0; i < D; i++) if (DD[i] > maxD) maxD = DD[i];\r\n    \/\/ Tri par distance, pour ne dessiner que l\u2019anneau de l\u2019onde\r\n    var order = DD.map(function (d, k) { return k; }).sort(function (a, b) { return DD[a] - DD[b]; });\r\n    var sortedD = order.map(function (k) { return DD[k]; });\r\n    var lowerBound = function (v) { var lo = 0, hi = D; while (lo < hi) { var m = (lo + hi) >> 1; if (sortedD[m] < v) lo = m + 1; else hi = m; } return lo; };\r\n    \/\/ Autour de chaque pays, les points qui prendront sa teinte\r\n    var halos = {};\r\n    usedC.forEach(function (c) {\r\n      var p = C[c], out = [];\r\n      for (var k = 0; k < D; k++) { var d = Math.hypot(DX[k] - p[0], DY[k] - p[1]); if (d < 4.5) out.push([k, 1 - d \/ 4.5]); }\r\n      halos[c] = out;\r\n    });\r\n    var W = 0, H = 0, cell = 1, dpr = 1, r0 = 1, mk = 1, ox = 0, oy = 0, base = null, geo = [];\r\n    var t0 = 0, started = false, running = false, visible = false, ready = false, raf = 0;\r\n    var filter = { k: 'all' }, hot = null, pinned = -1, overMap = null;\r\n    var pa = pairs.map(function () { return .55; }), pt = pa.slice();\r\n    var ca = {}, ct = {}, ha = {}, ht = {};\r\n    usedC.forEach(function (c) { ca[c] = ct[c] = 1; });\r\n    origins.forEach(function (o) { ha[o] = ht[o] = 1; });\r\n    var lens = { x: 0, y: 0, on: false, amt: 0 };\r\n    var ripples = [], comets = [], nextComet = 0;\r\n    var clamp01 = function (v) { return v < 0 ? 0 : v > 1 ? 1 : v; };\r\n    var ease = function (t) { return t < .5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) \/ 2; };\r\n    var backOut = function (s) { s -= 1; return 1 + 2.7 * s * s * s + 1.7 * s * s; };\r\n    var bez = function (g, t) { var u = 1 - t; return [u * u * g.a[0] + 2 * u * t * g.c[0] + t * t * g.b[0], u * u * g.a[1] + 2 * u * t * g.c[1] + t * t * g.b[1]]; };\r\n    var dot = function (px, py, r) { ctx.beginPath(); ctx.arc(px, py, r, 0, TAU); ctx.fill(); };\r\n    var trace = function (g, to) {\r\n      ctx.beginPath(); ctx.moveTo(g.a[0], g.a[1]);\r\n      var n = Math.max(2, Math.ceil(36 * to));\r\n      for (var s = 1; s <= n; s++) { var p = bez(g, to * s \/ n); ctx.lineTo(p[0], p[1]); }\r\n    };\r\n    \/\/ Tous les points, en un seul trac\u00e9 par couleur ; `scale` peut varier par point\r\n    var dots = function (c, fr, color, scale) {\r\n      c.fillStyle = color; c.beginPath();\r\n      for (var k = 0; k < D; k++) {\r\n        if (DF[k] !== fr) continue;\r\n        var s = typeof scale === 'function' ? scale(k) : scale;\r\n        if (s <= 0) continue;\r\n        var px = DX[k] * cell, py = DY[k] * cell;\r\n        c.moveTo(px + r0 * s, py); c.arc(px, py, r0 * s, 0, TAU);\r\n      }\r\n      c.fill();\r\n    };\r\n    \/\/ Points de la grille autour d\u2019un point (en cases), pour les ondes et la loupe\r\n    var around = function (cx, cy, R, fn) {\r\n      var x0 = Math.max(0, Math.floor(cx - R)), x1 = Math.min(COLS - 1, Math.ceil(cx + R));\r\n      var y0 = Math.max(0, Math.floor(cy - R)), y1 = Math.min(ROWS - 1, Math.ceil(cy + R));\r\n      for (var yy = y0; yy <= y1; yy++) for (var xx = x0; xx <= x1; xx++) {\r\n        var k = cellDot[yy * COLS + xx];\r\n        if (k >= 0) fn(k, Math.hypot(DX[k] - cx, DY[k] - cy));\r\n      }\r\n    };\r\n    \/\/ Les bords de la grille s\u2019estompent : sur tr\u00e8s grand \u00e9cran, pas de coupure nette\r\n    var fadeEdges = function (c) {\r\n      var gw = COLS * cell, gh = ROWS * cell, e = 7 * cell, f = 6 * cell;\r\n      c.globalCompositeOperation = 'destination-out';\r\n      [[0, 0, 0, e, 0, 0, gw, e], [gw, 0, gw - e, 0, gw - e, 0, e, gh], [0, gh, 0, gh - f, 0, gh - f, gw, f]].forEach(function (z) {\r\n        var g = c.createLinearGradient(z[0], z[1], z[2], z[3]);\r\n        g.addColorStop(0, '#000'); g.addColorStop(1, 'rgba(0,0,0,0)');\r\n        c.fillStyle = g; c.fillRect(z[4], z[5], z[6], z[7]);\r\n      });\r\n      c.globalCompositeOperation = 'source-over';\r\n    };\r\n    \/* Ce qui est mis en avant : le survol prime sur le filtre choisi *\/\r\n    var matches = function (p, f) {\r\n      if (f.k === 'all') return true;\r\n      if (f.k === 'p') return p.i === f.v;\r\n      if (f.k === 'o') return p.o === f.v;\r\n      if (f.k === 'c') return p.c.indexOf(f.v) >= 0;\r\n      return p.type.indexOf(f.v) >= 0;\r\n    };\r\n    var focusOf = function () { return hot || (pinned >= 0 ? { k: 'p', v: pinned } : filter); };\r\n    var recompute = function () {\r\n      var f = focusOf(), all = f.k === 'all', on = pairs.map(function () { return false; });\r\n      projects.forEach(function (p) {\r\n        if (!matches(p, f)) return;\r\n        p.pairs.forEach(function (k) { if (f.k !== 'c' || pairs[k].c === f.v) on[k] = true; });\r\n      });\r\n      var cOn = {}, oOn = {};\r\n      pairs.forEach(function (q, k) {\r\n        pt[k] = all ? .55 : on[k] ? 1 : .07;\r\n        if (on[k]) { cOn[q.c] = 1; oOn[q.o] = 1; }\r\n      });\r\n      usedC.forEach(function (c) { ct[c] = all || cOn[c] ? 1 : .18; });\r\n      origins.forEach(function (o) { ht[o] = all || oOn[o] || (f.k === 'o' && f.v === o) ? 1 : .35; });\r\n      if (calm) draw(performance.now());\r\n    };\r\n    \/* La l\u00e9gende : la liste des exemples, une ligne par projet avec ses pays partenaires *\/\r\n    var row = function (p) {\r\n      var ctry = p.c.map(function (c) { return '<span style=\"color:' + TONEX[CTRY[c][2]] + '\">' + esc(cName(c)) + '<\/span>'; }).join('<i> \u00b7 <\/i>');\r\n      return '<li><button class=\"pj\" type=\"button\" data-p=\"' + p.i + '\" aria-pressed=\"false\">'\r\n        + '<b class=\"pj-name\">' + esc(p.name) + '<\/b><span class=\"pj-ctry\">' + ctry + '<\/span><\/button><\/li>';\r\n    };\r\n    listEl.innerHTML = projects.map(row).join('');\r\n    var hoverTo = function (h) {\r\n      var same = (h && hot && h.k === hot.k && h.v === hot.v) || (!h && !hot);\r\n      if (same) return;\r\n      hot = h; recompute();\r\n    };\r\n    var pjOf = function (e) { var b = e.target.closest('.pj'); return b ? +b.dataset.p : -1; };\r\n    listEl.addEventListener('pointerover', function (e) { var i = pjOf(e); if (i >= 0 && ready) hoverTo({ k: 'p', v: i }); });\r\n    listEl.addEventListener('pointerleave', function () { hoverTo(null); });\r\n    listEl.addEventListener('focusin', function (e) { var i = pjOf(e); if (i >= 0) hoverTo({ k: 'p', v: i }); });\r\n    listEl.addEventListener('focusout', function () { hoverTo(null); });\r\n    listEl.addEventListener('click', function (e) {\r\n      var i = pjOf(e);\r\n      if (i < 0) return;\r\n      pinned = pinned === i ? -1 : i;\r\n      Array.prototype.forEach.call(listEl.querySelectorAll('.pj'), function (b) {\r\n        var on = +b.dataset.p === pinned;\r\n        b.classList.toggle('is-on', on); b.setAttribute('aria-pressed', String(on));\r\n      });\r\n      recompute();\r\n    });\r\n    var layout = function () {\r\n      var rect = canvas.getBoundingClientRect();\r\n      W = rect.width; H = rect.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, W * H > 1.2e6 ? 1.5 : 2);\r\n      canvas.width = Math.round(W * dpr); canvas.height = Math.round(H * dpr);\r\n      \/\/ Plein cadre, l\u2019Europe commence apr\u00e8s la colonne de texte ; empil\u00e9e, elle remplit son cadre\r\n      var full = getComputedStyle(holder).position === 'absolute';\r\n      var L = full ? col.getBoundingClientRect().right - rect.left + 40 : 6, R = full ? 16 : 6, T = full ? 28 : 6;\r\n      \/\/ En bas, la carte s\u2019arr\u00eate au-dessus de la cl\u00e9 des symboles\r\n      var B = full ? rect.bottom - key.getBoundingClientRect().top + 16 : 6;\r\n      var rw = ROI[2] - ROI[0], rh = ROI[3] - ROI[1];\r\n      cell = Math.min((W - L - R) \/ rw, (H - T - B) \/ rh);\r\n      ox = L + (W - L - R - rw * cell) \/ 2 - ROI[0] * cell;\r\n      oy = T + (H - T - B - rh * cell) \/ 2 - ROI[1] * cell;\r\n      r0 = Math.max(.8, cell * .28);\r\n      mk = Math.max(.6, Math.min(1.5, cell \/ 6));\r\n      \/\/ Couche fixe : tous les points \u00e0 leur taille de repos\r\n      base = document.createElement('canvas');\r\n      base.width = canvas.width; base.height = canvas.height;\r\n      var b = base.getContext('2d');\r\n      b.setTransform(dpr, 0, 0, dpr, ox * dpr, oy * dpr);\r\n      dots(b, 0, LAND, 1); dots(b, 1, FR, 1);\r\n      fadeEdges(b);\r\n      \/\/ G\u00e9om\u00e9trie des ponts : une arche qui monte toujours vers le haut\r\n      geo = pairs.map(function (q) {\r\n        var A = [C[q.o][0] * cell, C[q.o][1] * cell], B = [C[q.c][0] * cell, C[q.c][1] * cell], tone = TONE[CTRY[q.c][2]];\r\n        var dx = B[0] - A[0], dy = B[1] - A[1], len = Math.hypot(dx, dy), nx = -dy \/ len, ny = dx \/ len;\r\n        if (ny > 0) { nx = -nx; ny = -ny; }\r\n        var grad = ctx.createLinearGradient(A[0], A[1], B[0], B[1]);\r\n        grad.addColorStop(0, TEAL); grad.addColorStop(1, tone);\r\n        return { a: A, b: B, c: [(A[0] + B[0]) \/ 2 + nx * len * .3, (A[1] + B[1]) \/ 2 + ny * len * .3], tone: tone, grad: grad, w: 1 + .35 * Math.min(q.n, 6) };\r\n      });\r\n      if (!running) draw(performance.now());\r\n    };\r\n    var draw = function (now) {\r\n      if (!base) return;\r\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n      if (!started) return;\r\n      var t = calm ? 1e9 : now - t0, k, q, n;\r\n      if (t < 0) return;\r\n      var lerp = calm ? 1 : .12;\r\n      for (k = 0; k < pairs.length; k++) pa[k] += (pt[k] - pa[k]) * lerp;\r\n      usedC.forEach(function (c) { ca[c] += (ct[c] - ca[c]) * lerp; });\r\n      origins.forEach(function (o) { ha[o] += (ht[o] - ha[o]) * lerp; });\r\n      \/\/ 1. Les points naissent depuis les hubs, puis restent pos\u00e9s\r\n      if (t < T_DOTS + 500) {\r\n        ctx.setTransform(dpr, 0, 0, dpr, ox * dpr, oy * dpr);\r\n        var born = function (k) { return backOut(clamp01((t - DD[k] \/ maxD * T_DOTS) \/ 500)); };\r\n        dots(ctx, 0, LAND, born); dots(ctx, 1, FR, born);\r\n        fadeEdges(ctx);\r\n      } else {\r\n        ctx.drawImage(base, 0, 0);\r\n        ctx.setTransform(dpr, 0, 0, dpr, ox * dpr, oy * dpr);\r\n      }\r\n      \/\/ 2. Autour de chaque pays reli\u00e9, les points prennent sa teinte\r\n      usedC.forEach(function (c) {\r\n        var since = t - landT[c];\r\n        if (since <= 0) return;\r\n        var rv = ease(clamp01(since \/ 900)) * ca[c];\r\n        ctx.fillStyle = TONE[CTRY[c][2]];\r\n        halos[c].forEach(function (h) {\r\n          ctx.globalAlpha = rv * (.25 + .65 * h[1]);\r\n          dot(DX[h[0]] * cell, DY[h[0]] * cell, r0 * (1 + .45 * h[1] * rv));\r\n        });\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 3. Ondes dans la grille : arriv\u00e9es des ponts et des \u00e9clats\r\n      ripples = ripples.filter(function (rp) {\r\n        var p = (now - rp.t) \/ rp.dur;\r\n        if (p >= 1) return false;\r\n        var R = rp.max * ease(p), band = 1.7, fade = 1 - p;\r\n        ctx.fillStyle = rp.tone;\r\n        around(rp.x, rp.y, R + band, function (k, d) {\r\n          var w = 1 - Math.abs(d - R) \/ band;\r\n          if (w <= 0) return;\r\n          ctx.globalAlpha = w * fade * rp.a * EF[k];\r\n          dot(DX[k] * cell, DY[k] * cell, r0 * (1 + w * fade));\r\n        });\r\n        return true;\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 4. Une onde repart des hubs et traverse l\u2019Europe\r\n      if (!calm && t > T_END) {\r\n        var sp = ((t - T_END) % 6400) \/ 4200;\r\n        if (sp < 1) {\r\n          var R = sp * (maxD + 3), band = 2.4, hi = lowerBound(R + band), fade = 1 - sp;\r\n          ctx.fillStyle = TEAL;\r\n          for (var w0 = lowerBound(R - band); w0 < hi; w0++) {\r\n            k = order[w0];\r\n            var w = 1 - Math.abs(DD[k] - R) \/ band;\r\n            ctx.globalAlpha = w * fade * .45 * EF[k];\r\n            dot(DX[k] * cell, DY[k] * cell, r0 * (1 + .6 * w));\r\n          }\r\n          ctx.globalAlpha = 1;\r\n        }\r\n      }\r\n      \/\/ 5. La loupe : le pointeur grossit les points qu\u2019il survole\r\n      lens.amt += ((lens.on ? 1 : 0) - lens.amt) * .15;\r\n      if (lens.amt > .02) {\r\n        around(lens.x \/ cell, lens.y \/ cell, 6, function (k, d) {\r\n          if (d > 6) return;\r\n          var w = 1 - d \/ 6;\r\n          w = w * w * (3 - 2 * w);\r\n          ctx.globalAlpha = w * lens.amt * EF[k];\r\n          ctx.fillStyle = DF[k] ? TEAL : '#93a6a6';\r\n          dot(DX[k] * cell, DY[k] * cell, r0 * (1 + 1.1 * w * lens.amt));\r\n        });\r\n        ctx.globalAlpha = 1;\r\n      }\r\n      \/\/ 6. Le r\u00e9seau national : les hubs reli\u00e9s entre eux, en pointill\u00e9s\r\n      var net = ease(clamp01((t - T_NET) \/ 800));\r\n      if (net > 0) {\r\n        ctx.lineCap = 'round'; ctx.setLineDash([0, 4 * mk]); ctx.lineWidth = 1.4 * mk; ctx.strokeStyle = 'rgba(31,74,77,.45)';\r\n        NET.forEach(function (e) {\r\n          var a = C[e[0]], b = C[e[1]];\r\n          ctx.beginPath(); ctx.moveTo(a[0] * cell, a[1] * cell);\r\n          ctx.lineTo((a[0] + (b[0] - a[0]) * net) * cell, (a[1] + (b[1] - a[1]) * net) * cell); ctx.stroke();\r\n        });\r\n        ctx.setLineDash([]);\r\n      }\r\n      \/\/ 7. Les ponts : halo, trait en d\u00e9grad\u00e9, t\u00eate qui avance\r\n      ctx.lineCap = 'round';\r\n      for (k = 0; k < pairs.length; k++) {\r\n        var g = geo[k], local = (t - T_ARC - pairs[k].r * GAP) \/ DUR;\r\n        if (local <= 0) continue;\r\n        var prog = ease(Math.min(1, local)), a = pa[k];\r\n        trace(g, prog);\r\n        if (a > .8) { ctx.globalAlpha = .1 * a; ctx.strokeStyle = g.tone; ctx.lineWidth = (g.w + 5) * mk; ctx.stroke(); }\r\n        ctx.globalAlpha = a; ctx.strokeStyle = g.grad; ctx.lineWidth = g.w * mk * (a > .9 ? 1.25 : 1); ctx.stroke();\r\n        if (local < 1) {\r\n          var hd = bez(g, prog);\r\n          ctx.fillStyle = g.tone;\r\n          ctx.globalAlpha = .2; dot(hd[0], hd[1], 6 * mk);\r\n          ctx.globalAlpha = 1; dot(hd[0], hd[1], 2.6 * mk);\r\n          ctx.fillStyle = '#fff'; dot(hd[0], hd[1], 1.1 * mk);\r\n        } else if (!pairs[k].landed) {\r\n          pairs[k].landed = true;\r\n          if (!calm) ripples.push({ x: C[pairs[k].c][0], y: C[pairs[k].c][1], t: now, dur: 1300, max: 7, tone: g.tone, a: .8 });\r\n        }\r\n      }\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 8. Des \u00e9clats circulent sur les ponts mis en avant, dans un sens ou dans l\u2019autre\r\n      if (!calm && t > T_END) {\r\n        if (now > nextComet) {\r\n          var pool = [];\r\n          pairs.forEach(function (q, k) { if (pt[k] > .5) for (var m = 0; m < q.n; m++) pool.push(k); });\r\n          if (pool.length) comets.push({ i: pool[Math.floor(Math.random() * pool.length)], t: now, back: Math.random() < .3 });\r\n          nextComet = now + 520;\r\n        }\r\n        comets = comets.filter(function (cm) {\r\n          var p = (now - cm.t) \/ 1500, g = geo[cm.i], q = pairs[cm.i];\r\n          if (p >= 1) {\r\n            var end = C[cm.back ? q.o : q.c];\r\n            ripples.push({ x: end[0], y: end[1], t: now, dur: 900, max: 4.5, tone: cm.back ? TEAL : g.tone, a: .7 * pa[cm.i] });\r\n            return false;\r\n          }\r\n          var e = ease(p);\r\n          ctx.fillStyle = g.tone;\r\n          for (var s = 8; s >= 0; s--) {\r\n            var u = e - s * .018;\r\n            if (u < 0) continue;\r\n            var pt2 = bez(g, cm.back ? 1 - u : u);\r\n            ctx.globalAlpha = (1 - s \/ 9) * .9 * pa[cm.i];\r\n            dot(pt2[0], pt2[1], (s ? 2.3 - s * .17 : 2.9) * mk);\r\n          }\r\n          var hd2 = bez(g, cm.back ? 1 - e : e);\r\n          ctx.globalAlpha = pa[cm.i]; ctx.fillStyle = '#fff'; dot(hd2[0], hd2[1], 1.1 * mk);\r\n          return true;\r\n        });\r\n        ctx.globalAlpha = 1;\r\n      }\r\n      \/\/ 9. Les pays reli\u00e9s : un disque blanc cercl\u00e9 de leur teinte\r\n      usedC.forEach(function (c) {\r\n        var since = t - landT[c];\r\n        if (since <= 0) return;\r\n        var p = C[c], s = backOut(clamp01(since \/ 500)), tone = TONE[CTRY[c][2]];\r\n        ctx.globalAlpha = Math.max(.25, ca[c]);\r\n        ctx.fillStyle = '#fff'; dot(p[0] * cell, p[1] * cell, 4.6 * mk * s);\r\n        ctx.lineWidth = 1.8 * mk; ctx.strokeStyle = tone; ctx.stroke();\r\n        ctx.fillStyle = tone; dot(p[0] * cell, p[1] * cell, 1.9 * mk * s);\r\n        if (overMap && overMap.k === 'c' && overMap.v === c && !calm) {\r\n          var pq = (now % 1400) \/ 1400;\r\n          ctx.globalAlpha = (1 - pq) * .6; ctx.lineWidth = 1.2;\r\n          ctx.beginPath(); ctx.arc(p[0] * cell, p[1] * cell, (5 + pq * 14) * mk, 0, TAU); ctx.stroke();\r\n        }\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ 10. Les villes des structures, par-dessus tout : un anneau d\u2019encre qui respire\r\n      var hp = clamp01((t - 200) \/ 500);\r\n      origins.forEach(function (o, j) {\r\n        var p = C[o], px = p[0] * cell, py = p[1] * cell, a = hp * Math.max(.3, ha[o]);\r\n        if (!ORIG[o][2]) {\r\n          ctx.globalAlpha = a; ctx.fillStyle = '#fff'; dot(px, py, 3.6 * mk);\r\n          ctx.fillStyle = TEAL; dot(px, py, 2.1 * mk);\r\n          return;\r\n        }\r\n        var br = calm ? .5 : (Math.sin(now \/ 1100 + j * 1.3) + 1) \/ 2;\r\n        var focus = (filter.k === 'o' && filter.v === o) || (hot && hot.k === 'o' && hot.v === o);\r\n        ctx.globalAlpha = a;\r\n        ctx.fillStyle = 'rgba(31,74,77,' + (.1 + .08 * br + (focus ? .1 : 0)) + ')'; dot(px, py, (8 + 3 * br + (focus ? 3 : 0)) * mk);\r\n        ctx.fillStyle = '#fff'; dot(px, py, 6 * mk);\r\n        ctx.lineWidth = 1.8 * mk; ctx.strokeStyle = INK;\r\n        if (o === 'om') ctx.setLineDash([2 * mk, 2 * mk]);\r\n        ctx.beginPath(); ctx.arc(px, py, 5.4 * mk, 0, TAU); ctx.stroke();\r\n        ctx.setLineDash([]);\r\n        ctx.fillStyle = INK; dot(px, py, 2.5 * mk);\r\n      });\r\n      ctx.globalAlpha = 1;\r\n      \/\/ Les libell\u00e9s ne se posent qu\u2019une fois les ponts immobiles\r\n      if (!ready && t >= T_END + 150) { ready = true; legend.classList.add('is-ready'); }\r\n    };\r\n    var loop = function (now) { draw(now); if (running) raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || running || !visible || !started || document.hidden) return; running = true; raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    \/\/ Survol de la carte : la ville ou le pays le plus proche, et son infobulle\r\n    var showTip = function (m) {\r\n      if (!m) { tip.classList.remove('is-on'); return; }\r\n      var p = C[m.v], n = m.k === 'o' ? perO[m.v] : perC[m.v];\r\n      var name = m.k === 'o' ? oName(m.v) : cName(m.v);\r\n      var sub = plural(n, 'projet', 'projets');\r\n      tip.innerHTML = '<b>' + esc(name) + '<\/b><span>' + esc(sub) + '<\/span>';\r\n      tip.style.transform = 'translate(' + (ox + p[0] * cell) + 'px,' + (oy + p[1] * cell) + 'px)';\r\n      tip.classList.add('is-on');\r\n    };\r\n    canvas.addEventListener('pointermove', function (e) {\r\n      var r = canvas.getBoundingClientRect(), px = e.clientX - r.left - ox, py = e.clientY - r.top - oy;\r\n      lens.x = px; lens.y = py; lens.on = !calm;\r\n      if (!ready) return;\r\n      var best = null, bd = Math.max(12, 9 * mk);\r\n      origins.forEach(function (o) { var d = Math.hypot(C[o][0] * cell - px, C[o][1] * cell - py); if (d < bd) { bd = d; best = { k: 'o', v: o }; } });\r\n      usedC.forEach(function (c) { var d = Math.hypot(C[c][0] * cell - px, C[c][1] * cell - py); if (d < bd) { bd = d; best = { k: 'c', v: c }; } });\r\n      canvas.style.cursor = best ? 'pointer' : '';\r\n      if ((best && overMap && best.v === overMap.v) || (!best && !overMap)) return;\r\n      overMap = best; showTip(best); hoverTo(best);\r\n    });\r\n    canvas.addEventListener('pointerleave', function () { lens.on = false; overMap = null; showTip(null); hoverTo(null); });\r\n    if ('ResizeObserver' in window) new ResizeObserver(layout).observe(canvas); else window.addEventListener('resize', layout);\r\n    layout();\r\n    var start = function () { if (!started) { started = true; t0 = performance.now() + 400; } };\r\n    if (calm) { start(); ready = true; legend.classList.add('is-ready'); draw(performance.now()); }\r\n    else if ('IntersectionObserver' in window) {\r\n      new IntersectionObserver(function (entries) {\r\n        visible = entries[0].isIntersecting;\r\n        if (visible) { start(); play(); } else pause();\r\n      }, { threshold: .25 }).observe(canvas);\r\n    } else { visible = true; start(); play(); }\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n  })();\r\n  \/* ---------------- Formats : la salle se recompose ---------------- *\/\r\n  \/\/ Les m\u00eames points changent de salle \u00e0 chaque format : une pl\u00e9ni\u00e8re que\r\n  \/\/ l\u2019intervenant \u00e9claire par vagues, une \u00e9quipe resserr\u00e9e autour d\u2019un\r\n  \/\/ programme cibl\u00e9, une cohorte qui alterne temps collectif et temps\r\n  \/\/ individuel, puis un porteur de projet et son accompagnateur qui tissent\r\n  \/\/ des liens vers des partenaires. Comme pour les territoires, la barre de\r\n  \/\/ l\u2019onglet actif sert de minuterie : le cycle s\u2019arr\u00eate au survol et c\u00e8de la\r\n  \/\/ main au premier clic.\r\n  (function () {\r\n    var box = document.getElementById('shl-accueil').querySelector('[data-studio]');\r\n    if (!box) return;\r\n    var thumb = box.querySelector('.fmt-thumb');\r\n    var tabs = Array.prototype.slice.call(box.querySelectorAll('[role=\"tab\"]'));\r\n    var panels = tabs.map(function (t) { return document.getElementById(t.getAttribute('aria-controls')); });\r\n    var capEl = box.querySelector('[data-stage-cap]'), countEl = box.querySelector('[data-stage-count]');\r\n    var cv = box.querySelector('.stage canvas'), g = cv.getContext('2d');\r\n    var HUES = ['#c86a5e', '#b25f35', '#bd9035', '#8d9b4e', '#55926f', '#6d9b93', '#4b8296', '#45508a', '#8480be', '#92557c'];\r\n    var HUE = [HUES[0], HUES[2], HUES[4], HUES[8]];\r\n    var VW = 640, VH = 440, CX = 320, CY = 220, TAU = 6.2832, INK = '#173540', TABLE = '#eef1ec';\r\n    var N = 37; \/\/ 0 : l\u2019intervenant SHL ; 1 \u00e0 36 : les participants\r\n    var j;\r\n    \/\/ Salle 1 : trois rangs en arc de cercle, face \u00e0 l\u2019intervenant\r\n    var SPK = [CX, 92], ROWS1 = [[112, 6], [176, 8], [240, 8]], seats = [];\r\n    ROWS1.forEach(function (r) {\r\n      for (var s = 0; s < r[1]; s++) { var a = (30 + 120 * s \/ (r[1] - 1)) * Math.PI \/ 180; seats.push([SPK[0] + r[0] * Math.cos(a), SPK[1] + r[0] * Math.sin(a)]); }\r\n    });\r\n    \/\/ Salle 3 : la cohorte en disque (temps collectif), puis en six tables\r\n    var disc = [], tables = [], atelier = [];\r\n    for (j = 0; j < 36; j++) { var rr = 34 + 124 * Math.sqrt(j \/ 35), aa = j * 2.39996; disc.push([CX + rr * Math.cos(aa), CY + rr * Math.sin(aa)]); }\r\n    for (j = 0; j < 6; j++) tables.push([170 + (j % 3) * 150, 138 + Math.floor(j \/ 3) * 164]);\r\n    for (j = 0; j < 36; j++) { var tb = tables[j % 6], an = Math.floor(j \/ 6) * TAU \/ 6 + (j % 6) * .35; atelier.push([tb[0] + 38 * Math.cos(an), tb[1] + 38 * Math.sin(an)]); }\r\n    var A_T = 2400, B_T = 3200, SEANCE = A_T + B_T;\r\n    var cohort = function (lt) {\r\n      var m = lt % SEANCE, n = Math.floor(lt \/ SEANCE);\r\n      return { b: m >= A_T, n: n % 10 + 1, visit: (n * 3 + Math.floor(Math.max(0, m - A_T) \/ (B_T \/ 3))) % 6 };\r\n    };\r\n    \/\/ Salle 4 : dix partenaires possibles, trouv\u00e9s un \u00e0 un\r\n    var MATES = 10, SEQ = [2, 7, 4, 9, 0, 5, 3, 8, 1, 6], M0 = 1100, M_T = 1500, M_DRAW = 950, M_MAX = 6;\r\n    var matches = function (lt) {\r\n      var q = lt - M0, idx = Math.floor(q \/ M_T), p = (q - idx * M_T) \/ M_DRAW;\r\n      var done = q < 0 ? 0 : Math.min(M_MAX, idx + (p >= 1 ? 1 : 0)), set = {};\r\n      for (var s = 0; s < done; s++) set[SEQ[s]] = true;\r\n      return { done: done, cur: q >= 0 && idx < M_MAX && p < 1 ? SEQ[idx] : -1, p: Math.max(0, Math.min(1, p)), set: set };\r\n    };\r\n    var D = [];\r\n    for (j = 0; j < N; j++) D.push({ x: CX, y: CY, vx: 0, vy: 0, s: 0, a: 0, tx: CX, ty: CY, ts: 0, ta: 0, wx: CX, wy: CY, ws: 0, wa: 0, glow: 0, hold: 0, hollow: false, ph: j * 2.39996, tone: j ? HUES[(j * 3 + 1) % 10] : INK });\r\n    var rank = D.map(function (d, k) { return (k * 17) % N; }); \/\/ ordre de d\u00e9part, m\u00e9lang\u00e9\r\n    var active = 0, t0 = 0, last = 0, auto = !calm, visible = false, started = false, running = false, raf = 0;\r\n    var ga = [1, 0, 0, 0], pa = 0, found = 0, ripples = [], capText = '', capTimer = 0;\r\n    var W = 0, H = 0, dpr = 1, sc = 1, ox = 0, oy = 0, k = 1, R0 = 7;\r\n    \/\/ O\u00f9 chaque point veut aller, \u00e0 l\u2019instant lt du format f\r\n    var place = function (f, lt) {\r\n      var d, s;\r\n      for (s = 0; s < N; s++) { d = D[s]; d.wx = d.tx; d.wy = d.ty; d.ws = 0; d.wa = 0; d.hollow = false; }\r\n      var set = function (n, x, y, sz, al) { var e = D[n]; e.wx = x; e.wy = y; e.ws = sz; e.wa = al === undefined ? 1 : al; };\r\n      if (f === 0) {\r\n        set(0, SPK[0], SPK[1], 1.3);\r\n        for (s = 0; s < seats.length; s++) set(s + 1, seats[s][0], seats[s][1], 1);\r\n      } else if (f === 1) {\r\n        for (s = 0; s < 9; s++) { var a = -Math.PI \/ 2 + s * TAU \/ 9 + lt * .00012; set(s, CX + 128 * Math.cos(a), CY + 128 * Math.sin(a), s ? 1.1 : 1.3); }\r\n      } else if (f === 2) {\r\n        var c = cohort(lt), v = c.b ? tables[c.visit] : [CX, CY];\r\n        for (s = 0; s < 36; s++) { var q = c.b ? atelier[s] : disc[s]; set(s + 1, q[0], q[1], 1); }\r\n        set(0, v[0], v[1], 1.3);\r\n      } else {\r\n        var th = lt * .0005, px = 46 * Math.cos(th), py = 22 * Math.sin(th), m = matches(lt);\r\n        set(1, CX - px, CY - py, 1.7);\r\n        set(0, CX + px, CY + py, 1.35);\r\n        for (s = 0; s < MATES; s++) {\r\n          var am = -Math.PI \/ 2 + s * TAU \/ MATES + .31 + lt * .00004, on = m.set[s];\r\n          set(s + 2, CX + 236 * Math.cos(am), CY + 150 * Math.sin(am), on ? 1.05 : .85, on ? 1 : .7);\r\n          D[s + 2].hollow = !on;\r\n        }\r\n      }\r\n    };\r\n    \/\/ Des ressorts un peu souples : la salle se recompose comme une foule\r\n    var step = function (dt, now) {\r\n      var e = 1 - Math.exp(-dt * 7);\r\n      for (var s = 0; s < N; s++) {\r\n        var d = D[s];\r\n        if (now >= d.hold) { d.tx = d.wx; d.ty = d.wy; d.ts = d.ws; d.ta = d.wa; }\r\n        d.vx += ((d.tx - d.x) * 70 - d.vx * 12) * dt; d.vy += ((d.ty - d.y) * 70 - d.vy * 12) * dt;\r\n        d.x += d.vx * dt; d.y += d.vy * dt;\r\n        d.s += (d.ts - d.s) * e; d.a += (d.ta - d.a) * e;\r\n        d.glow *= Math.exp(-dt * 2.2);\r\n      }\r\n    };\r\n    var circle = function (x, y, r) { g.beginPath(); g.arc(x, y, r, 0, TAU); g.fill(); };\r\n    var ring = function (x, y, r) { g.beginPath(); g.arc(x, y, r, 0, TAU); g.stroke(); };\r\n    \/\/ Un lien courbe du porteur vers un partenaire, trac\u00e9 jusqu\u2019\u00e0 `to`\r\n    var link = function (A, B, to, tone, alpha, head) {\r\n      var mx = (A.x + B.x) \/ 2, my = (A.y + B.y) \/ 2, dx = B.x - A.x, dy = B.y - A.y, l = Math.hypot(dx, dy) || 1;\r\n      var nx = -dy \/ l, ny = dx \/ l;\r\n      if ((mx - CX) * nx + (my - CY) * ny < 0) { nx = -nx; ny = -ny; }\r\n      var cx = mx + nx * l * .2, cy = my + ny * l * .2, n = Math.max(2, Math.ceil(28 * to)), x = A.x, y = A.y;\r\n      g.globalAlpha = alpha * ga[3]; g.strokeStyle = tone; g.lineWidth = 1.5 * k;\r\n      g.beginPath(); g.moveTo(A.x, A.y);\r\n      for (var s = 1; s <= n; s++) { var u = to * s \/ n, w = 1 - u; x = w * w * A.x + 2 * w * u * cx + u * u * B.x; y = w * w * A.y + 2 * w * u * cy + u * u * B.y; g.lineTo(x, y); }\r\n      g.stroke();\r\n      if (head) { g.fillStyle = tone; g.globalAlpha = .2 * ga[3]; circle(x, y, 7 * k); g.globalAlpha = ga[3]; circle(x, y, 3 * k); g.fillStyle = '#fff'; circle(x, y, 1.2 * k); }\r\n    };\r\n    var draw = function (lt, now) {\r\n      g.setTransform(1, 0, 0, 1, 0, 0);\r\n      g.clearRect(0, 0, cv.width, cv.height);\r\n      if (!W) return;\r\n      g.setTransform(dpr * sc, 0, 0, dpr * sc, dpr * ox, dpr * oy);\r\n      g.lineCap = 'round';\r\n      var s, p, d, live = !calm;\r\n      \/\/ 1. La pl\u00e9ni\u00e8re : rangs en pointill\u00e9s, vagues qui partent de l\u2019intervenant\r\n      if (ga[0] > .01) {\r\n        g.globalAlpha = ga[0]; g.setLineDash([0, 7]); g.lineWidth = 1.6 * k; g.strokeStyle = 'rgba(23,53,64,.2)';\r\n        ROWS1.forEach(function (r) { g.beginPath(); g.arc(SPK[0], SPK[1], r[0], .44, 2.7); g.stroke(); });\r\n        g.setLineDash([]);\r\n        if (live && active === 0) {\r\n          for (var w = 0; w < 2; w++) {\r\n            var q = lt - 700 - w * 1100;\r\n            if (q < 0) continue;\r\n            p = (q % 2200) \/ 2200;\r\n            var R = 18 + p * 290;\r\n            g.globalAlpha = ga[0] * Math.pow(1 - p, 1.5) * .6; g.strokeStyle = HUE[0]; g.lineWidth = 2 * k;\r\n            g.beginPath(); g.arc(SPK[0], SPK[1], R, .3, 2.84); g.stroke();\r\n            for (s = 1; s <= seats.length; s++) {\r\n              d = D[s];\r\n              var gap = Math.abs(Math.hypot(d.x - SPK[0], d.y - SPK[1]) - R);\r\n              if (gap < 16) d.glow = Math.max(d.glow, 1 - gap \/ 16);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \/\/ 2. L\u2019\u00e9quipe : une table, une cible, un filet entre les membres\r\n      if (ga[1] > .01) {\r\n        g.globalAlpha = ga[1]; g.fillStyle = '#fff'; circle(CX, CY, 82);\r\n        g.strokeStyle = '#e1e6e0'; g.lineWidth = k; ring(CX, CY, 82);\r\n        g.strokeStyle = HUE[1]; g.lineWidth = 1.5 * k;\r\n        [18, 32, 46].forEach(function (r, n) { g.globalAlpha = ga[1] * (.9 - n * .28); ring(CX, CY, r); });\r\n        g.globalAlpha = ga[1]; g.fillStyle = HUE[1]; circle(CX, CY, 7);\r\n        if (live) { p = (lt % 1800) \/ 1800; g.globalAlpha = ga[1] * (1 - p) * .35; ring(CX, CY, 46 + p * 40); }\r\n        g.globalAlpha = ga[1]; g.lineWidth = k; g.strokeStyle = 'rgba(23,53,64,.08)'; g.beginPath();\r\n        for (s = 0; s < 9; s++) for (var t = s + 1; t < 9; t++) { g.moveTo(D[s].x, D[s].y); g.lineTo(D[t].x, D[t].y); }\r\n        g.stroke();\r\n        if (live && active === 1 && lt > 900) {\r\n          for (s = 0; s < 9; s++) {\r\n            p = ((lt - 900 + s * 260) % 1800) \/ 1800;\r\n            var e = p * p * .8;\r\n            g.globalAlpha = ga[1] * Math.sin(Math.PI * p); g.fillStyle = D[s].tone;\r\n            circle(D[s].x + (CX - D[s].x) * e, D[s].y + (CY - D[s].y) * e, 2.8 * k);\r\n          }\r\n        }\r\n      }\r\n      \/\/ 3. La cohorte : un grand cercle, puis six tables ; l\u2019intervenant passe de l\u2019une \u00e0 l\u2019autre\r\n      if (ga[2] > .01) {\r\n        g.globalAlpha = ga[2] * (1 - pa); g.setLineDash([0, 7]); g.strokeStyle = 'rgba(23,53,64,.2)'; g.lineWidth = 1.6 * k;\r\n        ring(CX, CY, 178); g.setLineDash([]);\r\n        if (active === 2 && pa > .01) {\r\n          var v = tables[cohort(lt).visit];\r\n          g.globalAlpha = ga[2] * pa * .12; g.fillStyle = HUE[2]; circle(v[0], v[1], 60);\r\n        }\r\n        g.globalAlpha = ga[2] * pa;\r\n        tables.forEach(function (tb) { g.fillStyle = '#fff'; circle(tb[0], tb[1], 20); g.strokeStyle = '#e1e6e0'; g.lineWidth = k; ring(tb[0], tb[1], 20); });\r\n      }\r\n      \/\/ 4. Le porteur et son accompagnateur, li\u00e9s par une tresse ; les partenaires autour\r\n      if (ga[3] > .01) {\r\n        g.globalAlpha = ga[3]; g.setLineDash([0, 7]); g.strokeStyle = 'rgba(23,53,64,.18)'; g.lineWidth = 1.6 * k;\r\n        g.beginPath(); g.ellipse(CX, CY, 236, 150, 0, 0, TAU); g.stroke(); g.setLineDash([]);\r\n        if (active === 3) {\r\n          var m = matches(lt);\r\n          for (s = 0; s < MATES; s++) if (m.set[s]) link(D[1], D[s + 2], 1, D[s + 2].tone, .5, false);\r\n          if (m.cur >= 0) link(D[1], D[m.cur + 2], m.p, D[m.cur + 2].tone, .9, live);\r\n        }\r\n        var P = D[1], Q = D[0], bx = Q.x - P.x, by = Q.y - P.y, bl = Math.hypot(bx, by) || 1;\r\n        g.lineWidth = 1.6 * k;\r\n        for (s = 0; s < 3; s++) {\r\n          g.globalAlpha = ga[3] * .85; g.strokeStyle = [HUES[8], HUES[4], HUES[0]][s]; g.beginPath();\r\n          for (var n = 0; n <= 24; n++) {\r\n            var u = n \/ 24, off = 9 * Math.sin(Math.PI * u) * Math.sin(u * TAU * 1.5 + s * TAU \/ 3 + lt * .004);\r\n            var x = P.x + bx * u - by \/ bl * off, y = P.y + by * u + bx \/ bl * off;\r\n            n ? g.lineTo(x, y) : g.moveTo(x, y);\r\n          }\r\n          g.stroke();\r\n        }\r\n      }\r\n      \/\/ Ondes d\u2019arriv\u00e9e\r\n      ripples = ripples.filter(function (rp) {\r\n        var q = (now - rp.t) \/ 900;\r\n        if (q >= 1) return false;\r\n        g.globalAlpha = (1 - q) * .6; g.strokeStyle = rp.c; g.lineWidth = 1.5 * k; ring(rp.x, rp.y, 8 + q * 26);\r\n        return true;\r\n      });\r\n      \/\/ Les personnes : les participants, puis l\u2019intervenant par-dessus\r\n      var wob = live ? 1.6 : 0;\r\n      for (var o = 1; o <= N; o++) {\r\n        s = o % N; d = D[s];\r\n        if (d.s < .03 || d.a < .02) continue;\r\n        var dx = d.x + wob * Math.sin(now * .0011 + d.ph), dy = d.y + wob * Math.cos(now * .0013 + d.ph * 1.3), r = R0 * d.s;\r\n        if (d.glow > .02) { g.globalAlpha = d.a * .24 * d.glow; g.fillStyle = d.tone; circle(dx, dy, r * (1.8 + d.glow)); }\r\n        g.globalAlpha = d.a; g.fillStyle = '#fff'; circle(dx, dy, r + 2.2 * k);\r\n        if (d.hollow) { g.strokeStyle = d.tone; g.lineWidth = 1.6 * k; ring(dx, dy, r - .8 * k); }\r\n        else { g.fillStyle = d.tone; circle(dx, dy, r); }\r\n        if (!s) {\r\n          g.fillStyle = '#fff'; circle(dx, dy, r * .36);\r\n          if (live) { p = (now % 2400) \/ 2400; g.globalAlpha = d.a * (1 - p) * .35; g.strokeStyle = INK; g.lineWidth = k; ring(dx, dy, r + 4 + p * 16); }\r\n        }\r\n      }\r\n      g.globalAlpha = 1;\r\n    };\r\n    var pad = function (n) { return (n < 10 ? '0' : '') + n; };\r\n    var caption = function (lt) {\r\n      if (active === 0) return tr('Pl\u00e9ni\u00e8re \u00b7 1 journ\u00e9e');\r\n      if (active === 1) return tr('\u00c9quipe interne \u00b7 programme cibl\u00e9');\r\n      if (active === 2) { var c = cohort(lt); return tr('S\u00e9ance ') + pad(c.n) + ' \u00b7 ' + tr(c.b ? 'temps individuel' : 'temps collectif'); }\r\n      var n = matches(lt).done;\r\n      return n ? n + tr(n > 1 ? ' partenaires trouv\u00e9s' : ' partenaire trouv\u00e9') : tr('Recherche de partenaires');\r\n    };\r\n    var setCap = function (txt) {\r\n      if (txt === capText) return;\r\n      capText = txt;\r\n      if (calm) { capEl.textContent = txt; return; }\r\n      capEl.classList.add('is-swap');\r\n      clearTimeout(capTimer);\r\n      capTimer = setTimeout(function () { capEl.textContent = capText; capEl.classList.remove('is-swap'); }, 220);\r\n    };\r\n    \/\/ Sans animation : chaque salle est pos\u00e9e d\u2019un coup, \u00e0 un instant parlant\r\n    var still = function () {\r\n      var lt = [1800, 2000, A_T + 400, M0 + 3 * M_T + M_DRAW + 100][active];\r\n      place(active, lt);\r\n      D.forEach(function (d) { d.x = d.tx = d.wx; d.y = d.ty = d.wy; d.s = d.ts = d.ws; d.a = d.ta = d.wa; d.vx = d.vy = 0; d.glow = 0; });\r\n      ga = ga.map(function (x, f) { return f === active ? 1 : 0; });\r\n      pa = active === 2 && cohort(lt).b ? 1 : 0;\r\n      draw(lt, 0);\r\n      setCap(caption(lt));\r\n    };\r\n    \/\/ La pastille blanche glisse sous l\u2019onglet actif, comme dans l\u2019en-t\u00eate\r\n    var thumbSet = false;\r\n    var placeThumb = function () {\r\n      var t = tabs[active];\r\n      if (!t.offsetWidth) return;\r\n      if (!thumbSet) thumb.style.transition = 'none';\r\n      thumb.style.width = t.offsetWidth + 'px'; thumb.style.height = t.offsetHeight + 'px';\r\n      thumb.style.transform = 'translate(' + t.offsetLeft + 'px,' + t.offsetTop + 'px)';\r\n      if (!thumbSet) { void thumb.offsetWidth; thumb.style.transition = ''; thumbSet = true; }\r\n    };\r\n    var stopAuto = function () { auto = false; box.classList.remove('is-auto'); };\r\n    var select = function (f) {\r\n      if (f === active) return;\r\n      active = f; found = 0; ripples = [];\r\n      t0 = performance.now();\r\n      box.setAttribute('data-fmt', String(f));\r\n      tabs.forEach(function (t, n) { var on = n === f; t.setAttribute('aria-selected', String(on)); t.tabIndex = on ? 0 : -1; });\r\n      panels.forEach(function (pn, n) { pn.classList.toggle('is-on', n === f); });\r\n      countEl.textContent = pad(f + 1) + ' \/ 04';\r\n      placeThumb();\r\n      D.forEach(function (d, n) { d.hold = t0 + rank[n] * 13; });\r\n      if (calm) still();\r\n    };\r\n    var frame = function (now) {\r\n      var dt = Math.min(.05, Math.max(0, (now - last) \/ 1000));\r\n      last = now;\r\n      var lt = Math.max(0, now - t0), ge = 1 - Math.exp(-dt * 5);\r\n      place(active, lt);\r\n      step(dt, now);\r\n      for (var f = 0; f < 4; f++) ga[f] += ((f === active ? 1 : 0) - ga[f]) * ge;\r\n      pa += ((active === 2 && cohort(lt).b ? 1 : 0) - pa) * ge;\r\n      if (active === 3) {\r\n        var m = matches(lt);\r\n        if (m.done > found) { found = m.done; var pd = D[SEQ[found - 1] + 2]; pd.glow = 1; ripples.push({ x: pd.x, y: pd.y, t: now, c: pd.tone }); }\r\n      }\r\n      draw(lt, now);\r\n      setCap(caption(lt));\r\n    };\r\n    var loop = function (now) { if (!running) return; frame(now); raf = requestAnimationFrame(loop); };\r\n    var play = function () { if (calm || running || !visible || document.hidden) return; running = true; last = performance.now(); raf = requestAnimationFrame(loop); };\r\n    var pause = function () { running = false; cancelAnimationFrame(raf); };\r\n    var start = function () {\r\n      if (started) return;\r\n      started = true;\r\n      t0 = performance.now();\r\n      D.forEach(function (d, n) { d.hold = t0 + 250 + rank[n] * 16; });\r\n      if (auto) box.classList.add('is-auto');\r\n    };\r\n    var layout = function () {\r\n      var r = cv.getBoundingClientRect();\r\n      W = r.width; H = r.height;\r\n      if (!W || !H) return;\r\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\r\n      \/\/ Cadrage sur la zone r\u00e9ellement dessin\u00e9e (environ 485 \u00d7 320 au centre), pas sur tout le rep\u00e8re\r\n      sc = Math.min(W \/ (VW - 100), H \/ (VH - 80)) * .94;\r\n      ox = (W - VW * sc) \/ 2; oy = (H - VH * sc) \/ 2 + 8;\r\n      k = Math.min(1.4, Math.max(1, .7 \/ sc));\r\n      R0 = 7 * k;\r\n      if (calm) still(); else if (!running && started) draw(Math.max(0, last - t0), last);\r\n    };\r\n    tabs.forEach(function (t, n) {\r\n      t.addEventListener('click', function () { stopAuto(); select(n); });\r\n      t.addEventListener('keydown', function (e) {\r\n        var to = { ArrowRight: n + 1, ArrowDown: n + 1, ArrowLeft: n + 3, ArrowUp: n + 3, Home: 0, End: 3 }[e.key];\r\n        if (to === undefined) return;\r\n        e.preventDefault();\r\n        stopAuto(); select(to % 4); tabs[to % 4].focus();\r\n      });\r\n      \/\/ Le cycle : la barre de l\u2019onglet actif sert de minuterie\r\n      t.querySelector('.fmt-timer').addEventListener('animationend', function () { if (auto && n === active) select((n + 1) % tabs.length); });\r\n    });\r\n    box.addEventListener('focusin', stopAuto);\r\n    if ('ResizeObserver' in window) {\r\n      new ResizeObserver(layout).observe(cv);\r\n      new ResizeObserver(placeThumb).observe(box.querySelector('.studio-tabs'));\r\n    } else window.addEventListener('resize', function () { layout(); placeThumb(); });\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(placeThumb);\r\n    placeThumb();\r\n    layout();\r\n    if (calm) { still(); return; }\r\n    if ('IntersectionObserver' in window) {\r\n      new IntersectionObserver(function (en) {\r\n        visible = en[0].isIntersecting;\r\n        box.classList.toggle('is-hold', !visible);\r\n        if (visible) { start(); play(); } else pause();\r\n      }, { threshold: .3 }).observe(cv);\r\n    } else { visible = true; start(); play(); }\r\n    document.addEventListener('visibilitychange', function () { document.hidden ? pause() : play(); });\r\n  })();\r\n})();\r\n\/\/-->\r\n<\/script>\r\n<\/div>","protected":false},"author":64,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-template-blank.php","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"<!-- wp:shortcode -->\n[wpcode id=\"23814271\"]\n<!-- \/wp:shortcode -->","_et_gb_content_width":"","footnotes":""},"class_list":["post-23814269","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Social Hackers Lab - Social Hackers Lab<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/socialhackerslab.com\/en\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Social Hackers Lab - Social Hackers Lab\" \/>\n<meta property=\"og:description\" content=\"404Page you&#039;re looking for might no Exist. Please try to Search below.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/socialhackerslab.com\/en\/\" \/>\n<meta property=\"og:site_name\" content=\"Social Hackers Lab\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61561806211570\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-05T08:39:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Social-Hacker-Lab-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"250\" \/>\n\t<meta property=\"og:image:height\" content=\"140\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/\",\"name\":\"Social Hackers Lab - Social Hackers Lab\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#website\"},\"datePublished\":\"2026-09-25T01:01:53+00:00\",\"dateModified\":\"2026-10-05T08:39:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/socialhackerslab.com\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/socialhackerslab.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Social Hackers Lab\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#website\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/\",\"name\":\"SocialHackersLab\",\"description\":\"Hacking Social pour une soci\u00e9t\u00e9 \u00e9galitaire\",\"publisher\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/socialhackerslab.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#organization\",\"name\":\"Social Hackers Lab\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/socialhackerslab.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/BW-SHL.png\",\"contentUrl\":\"https:\\\/\\\/socialhackerslab.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/BW-SHL.png\",\"width\":3431,\"height\":3431,\"caption\":\"Social Hackers Lab\"},\"image\":{\"@id\":\"https:\\\/\\\/socialhackerslab.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61561806211570\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/socialhackerslab\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Social Hackers Lab - Social Hackers Lab","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/socialhackerslab.com\/en\/","og_locale":"en_GB","og_type":"article","og_title":"Social Hackers Lab - Social Hackers Lab","og_description":"404Page you're looking for might no Exist. Please try to Search below.","og_url":"https:\/\/socialhackerslab.com\/en\/","og_site_name":"Social Hackers Lab","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61561806211570","article_modified_time":"2026-10-05T08:39:31+00:00","og_image":[{"width":250,"height":140,"url":"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/Social-Hacker-Lab-1.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/socialhackerslab.com\/","url":"https:\/\/socialhackerslab.com\/","name":"Social Hackers Lab - Social Hackers Lab","isPartOf":{"@id":"https:\/\/socialhackerslab.com\/#website"},"datePublished":"2026-09-25T01:01:53+00:00","dateModified":"2026-10-05T08:39:31+00:00","breadcrumb":{"@id":"https:\/\/socialhackerslab.com\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/socialhackerslab.com\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/socialhackerslab.com\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/socialhackerslab.com\/"},{"@type":"ListItem","position":2,"name":"Social Hackers Lab"}]},{"@type":"WebSite","@id":"https:\/\/socialhackerslab.com\/#website","url":"https:\/\/socialhackerslab.com\/","name":"SocialHackersLab","description":"Hacking Social pour une soci\u00e9t\u00e9 \u00e9galitaire","publisher":{"@id":"https:\/\/socialhackerslab.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/socialhackerslab.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/socialhackerslab.com\/#organization","name":"Social Hackers Lab","url":"https:\/\/socialhackerslab.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/socialhackerslab.com\/#\/schema\/logo\/image\/","url":"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/BW-SHL.png","contentUrl":"https:\/\/socialhackerslab.com\/wp-content\/uploads\/2024\/10\/BW-SHL.png","width":3431,"height":3431,"caption":"Social Hackers Lab"},"image":{"@id":"https:\/\/socialhackerslab.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61561806211570","https:\/\/www.linkedin.com\/company\/socialhackerslab\/"]}]}},"_links":{"self":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages\/23814269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/users\/64"}],"replies":[{"embeddable":true,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/comments?post=23814269"}],"version-history":[{"count":4,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages\/23814269\/revisions"}],"predecessor-version":[{"id":23814398,"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/pages\/23814269\/revisions\/23814398"}],"wp:attachment":[{"href":"https:\/\/socialhackerslab.com\/en\/wp-json\/wp\/v2\/media?parent=23814269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}