/* /neoo-switch-odoo dans le style de la home V29 « lumière » et de /solutions/crm-ventes (2026-10-10).
   Se charge après neoo-home-v29.css (jetons, en-tête, pied de page, boutons, titres, entrées) et neoo-solutions-v29.css
   (hero, situations, parcours, FAQ, autres pages) ; n’ajoute que les sections propres à la page (préfixe v29sw-).
   Plan : docs/switch-odoo-v29/DESIGN.md. Généré par scripts/generate-neoo-switch-odoo-v29.mjs ; pilotes :
   neoo-home-v29.js (.is-in sur [data-v29-scene]) et neoo-switch-odoo-v29.js (html.v29sw-motion, .is-live,
   démonstration data-step="0..5").
   Règle du mouvement : toute animation et tout état initial masqué vivent sous html.v29sw-motion, posée seulement si
   prefers-reduced-motion est faux ; sans JavaScript ou en mouvement réduit, chaque schéma montre son état final.
   Aucune boucle infinie : chaque répétition a un nombre fini d’itérations. */

.v29-switch [hidden] { display: none !important; }

/* ---------- Hero ---------- */
.v29sw-hero > .v29-plate img { object-position: 66% 40%; }
.v29sw-hero .v29s-hero__title { font-size: clamp(42px, 4.4vw, 72px); }

/* ---------- 01 Le constat : le nœud qui se démêle ---------- */
.v29sw-knot { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr) minmax(0, 1fr); margin: 56px 0 0; padding: clamp(28px, 3.6vw, 48px) clamp(22px, 3.6vw, 52px) clamp(26px, 3vw, 40px); border-radius: 14px; background: var(--v29-glass); box-shadow: 0 30px 70px -40px rgba(60, 40, 10, .45), 0 0 0 1px rgba(21, 23, 46, .05); }
.v29sw-knot__col { display: grid; grid-template-rows: 32px 256px; min-width: 0; }
.v29sw-knot__col .v29-micro { align-self: start; font-size: 12px; letter-spacing: .14em; }
.v29sw-knot__col--to .v29-micro { text-align: left; }
.v29sw-knot__col--from .v29-micro { text-align: right; }
.v29sw-knot__col ul { display: grid; grid-template-rows: repeat(4, 64px); margin: 0; padding: 0; list-style: none; }
.v29sw-knot__col li { align-self: center; display: inline-flex; align-items: center; gap: 8px; max-width: 100%; padding: 10px 16px; border-radius: 999px; background: var(--v29-paper); box-shadow: 0 0 0 1px var(--v29-line), 0 10px 22px -18px rgba(30, 25, 40, .45); font-size: 16px; line-height: 1.2; }
.v29sw-knot__col--from li { justify-self: end; color: var(--v29-muted); }
.v29sw-knot__col--to li { justify-self: start; color: #17824e; background: #f2faf5; box-shadow: 0 0 0 1px rgba(34, 165, 101, .3), 0 10px 22px -18px rgba(34, 165, 101, .6); transition: opacity .6s var(--v29-ease) calc(2.3s + var(--i) * .12s), transform .7s var(--v29-ease) calc(2.3s + var(--i) * .12s); }
.v29sw-knot__col--to li span { color: var(--v29-ink); }
.v29sw-knot__col--to .v29-i { flex: none; font-size: 15px; }
.v29sw-knot__wires { display: block; width: 100%; height: 256px; margin-top: 32px; overflow: visible; }
.v29sw-knot__wires path { fill: none; stroke-width: 2; stroke-linecap: round; stroke-dasharray: 1 1; stroke-dashoffset: 0; }
.v29sw-knot__tangle { stroke: rgba(21, 23, 46, .3); opacity: 0; }
.v29sw-knot__line { stroke: var(--v29-accent); opacity: .7; }
.v29sw-knot__caption { grid-column: 1 / -1; justify-self: center; max-width: 52ch; margin-top: 22px; color: var(--v29-ink); font-size: 17px; line-height: 1.45; text-align: center; }
.v29sw-pain .v29s-pain__fix strong { font-weight: 500; }

html.v29sw-motion .v29sw-knot:not(.is-in) .v29sw-knot__tangle { opacity: 1; stroke-dashoffset: 1; }
html.v29sw-motion .v29sw-knot:not(.is-in) .v29sw-knot__line { stroke-dashoffset: 1; }
html.v29sw-motion .v29sw-knot:not(.is-in) .v29sw-knot__col--to li { opacity: 0; transform: translateX(-14px); }
html.v29sw-motion .v29sw-knot:not(.is-in) .v29sw-knot__caption { opacity: 0; }
html.v29sw-motion .v29sw-knot.is-in .v29sw-knot__tangle { animation: v29sw-untangle 2.6s var(--v29-ease-io) calc(.2s + var(--i) * .12s) both; }
html.v29sw-motion .v29sw-knot.is-in .v29sw-knot__line { animation: v29sw-draw 1.1s var(--v29-ease) calc(1.7s + var(--i) * .14s) both; }
html.v29sw-motion .v29sw-knot.is-in .v29sw-knot__col--from li { animation: v29sw-tug .5s ease-in-out calc(.5s + var(--i) * .1s) 2 alternate both; }
html.v29sw-motion .v29sw-knot.is-in .v29sw-knot__caption { animation: v29sw-fade .8s var(--v29-ease) 2.8s both; }

/* ---------- 02 Démonstration « Switch Map » ---------- */
.v29sw-demo { position: relative; overflow: hidden; isolation: isolate; padding: clamp(110px, 14vh, 160px) 0 clamp(80px, 11vh, 120px); }
.v29sw-demo__plate { -webkit-mask-image: linear-gradient(transparent 0, #000 18%, #000 70%, transparent); mask-image: linear-gradient(transparent 0, #000 18%, #000 70%, transparent); }
.v29sw-demo__plate img { object-position: 50% 30%; }
.v29sw-demo__head > * { max-width: 860px; }
.v29sw-demo__stage { display: grid; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); align-items: start; gap: 28px; margin-top: 56px; }
.v29sw-studio { margin: 0; overflow: hidden; border-radius: 14px; background: var(--v29-glass); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); box-shadow: 0 34px 80px -38px rgba(60, 40, 10, .55), 0 0 0 1px rgba(21, 23, 46, .06); transition: box-shadow .6s var(--v29-ease); }
.v29sw-studio__bar { display: flex; align-items: center; gap: 7px; padding: 14px 20px; border-bottom: 1px solid var(--v29-line); background: rgba(255, 253, 249, .7); }
.v29sw-studio__bar > span:not(.v29sw-studio__tag) { width: 10px; height: 10px; border-radius: 50%; background: rgba(21, 23, 46, .14); }
.v29sw-studio__bar p { margin: 0 0 0 10px; font-size: 15px; font-weight: 500; }
.v29sw-studio__tag { margin-left: auto; padding: 4px 10px; border-radius: 999px; background: rgba(75, 46, 242, .08); color: var(--v29-accent); font-size: 12px; letter-spacing: .06em; }
.v29sw-studio__body { display: grid; gap: 10px; padding: 22px 24px 24px; }
.v29sw-studio__heads, .v29sw-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .8fr) minmax(0, 1fr); align-items: center; }
.v29sw-studio__head { display: flex; align-items: center; gap: 9px; margin: 0; color: var(--v29-soft); font-size: 12px; letter-spacing: .14em; text-transform: uppercase; }
.v29sw-studio__head:nth-child(2) { justify-content: center; }
.v29sw-studio__head b { display: grid; flex: none; place-items: center; width: 22px; height: 22px; border-radius: 50%; background: rgba(75, 46, 242, .1); color: var(--v29-accent); font-size: 11px; font-weight: 500; letter-spacing: 0; }
.v29sw-rows { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.v29sw-row__from, .v29sw-row__to { display: grid; gap: 2px; min-width: 0; padding: 9px 13px; border-radius: 9px; background: var(--v29-paper); box-shadow: 0 0 0 1px var(--v29-line), 0 10px 22px -20px rgba(30, 25, 40, .45); font-size: 15px; line-height: 1.25; transition: opacity .5s var(--v29-ease) calc(var(--i) * .16s), transform .6s var(--v29-ease) calc(var(--i) * .16s), box-shadow .4s; }
.v29sw-row__from > span, .v29sw-row__to > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v29sw-row em { display: inline-flex; align-items: center; gap: 4px; color: #17824e; font-size: 11px; font-style: normal; letter-spacing: .05em; text-transform: uppercase; transition: opacity .4s var(--v29-ease) calc(var(--i) * .22s), transform .5s var(--v29-ease) calc(var(--i) * .22s); }
.v29sw-row em .v29-i { font-size: 12px; }
.v29sw-row--gap .v29sw-row__to { box-shadow: inset 0 0 0 1.5px rgba(75, 46, 242, .45); }
.v29sw-row--gap .v29sw-row__to em { color: var(--v29-accent); }
.v29sw-row__lane { position: relative; display: block; height: 40px; margin: 0 10px; }
.v29sw-row__track { position: absolute; left: 0; right: 0; top: 50%; height: 2px; margin-top: -1px; border-radius: 2px; background: linear-gradient(90deg, rgba(75, 46, 242, .25), var(--v29-accent)); transform-origin: 0 50%; transition: transform .7s var(--v29-ease) calc(var(--i) * .18s); }
.v29sw-row__track::after { content: ""; position: absolute; right: -2px; top: -4px; width: 0; height: 0; border-left: 7px solid var(--v29-accent); border-top: 5px solid transparent; border-bottom: 5px solid transparent; }
.v29sw-row__packet { position: absolute; left: 0; right: 12px; top: 50%; height: 0; opacity: 0; }
.v29sw-row__packet::before { content: ""; position: absolute; left: 0; top: -6px; width: 12px; height: 12px; border-radius: 3px; background: var(--v29-accent); box-shadow: 0 0 0 4px rgba(75, 46, 242, .16); }
.v29sw-row__lane small { position: absolute; left: 0; right: 0; top: 0; color: var(--v29-soft); font-size: 11px; letter-spacing: .08em; text-align: center; text-transform: uppercase; transition: opacity .4s; }
.v29sw-studio__foot { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 14px 24px; margin-top: 12px; padding-top: 18px; border-top: 1px solid var(--v29-line); }
.v29sw-cover { display: grid; gap: 9px; min-width: 0; }
.v29sw-cover p { margin: 0; color: var(--v29-soft); font-size: 12px; letter-spacing: .12em; text-transform: uppercase; }
.v29sw-cover__bar { display: flex; gap: 3px; height: 10px; }
.v29sw-cover__part { flex: 0 0 calc(var(--w) * 1% - 2px); border-radius: 5px; transform-origin: 0 50%; transition: transform .8s var(--v29-ease); }
.v29sw-cover__part--1, .v29sw-cover__key--1 i, .v29sw-ring__key--1 i { background: var(--v29-green); }
.v29sw-cover__part--2, .v29sw-cover__key--2 i, .v29sw-ring__key--2 i { background: var(--v29-accent); }
.v29sw-cover__part--3, .v29sw-cover__key--3 i, .v29sw-ring__key--3 i { background: #a99bff; }
.v29sw-cover__part--2 { transition-delay: .25s; }
.v29sw-cover__part--3 { transition-delay: .5s; }
.v29sw-cover__legend { display: flex; flex-wrap: wrap; gap: 4px 16px; color: var(--v29-muted); font-size: 13px; }
.v29sw-cover__key { display: inline-flex; align-items: center; gap: 6px; }
.v29sw-cover__key i { width: 8px; height: 8px; border-radius: 50%; }
.v29sw-cutover { display: inline-flex; align-items: center; gap: 9px; margin: 0; padding: 8px 14px; border-radius: 999px; background: rgba(34, 165, 101, .12); color: #17824e; font-size: 14px; transition: background-color .5s, color .5s; }
.v29sw-cutover i { flex: none; width: 9px; height: 9px; border-radius: 50%; background: var(--v29-green); box-shadow: 0 0 0 4px rgba(34, 165, 101, .18); transition: background-color .5s, box-shadow .5s; }
.v29sw-cutover__off { display: none; }

.v29sw-chapters { display: grid; gap: 14px; }
.v29sw-chapters__list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.v29sw-chapter button { position: relative; display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 12px; width: 100%; padding: 13px 16px 15px; overflow: hidden; border: 0; border-radius: 10px; background: rgba(255, 253, 249, .62); color: var(--v29-ink); font: inherit; text-align: left; cursor: pointer; box-shadow: inset 0 0 0 1px var(--v29-line); transition: background-color .3s, box-shadow .3s; }
.v29sw-chapter button:disabled { cursor: default; }
.v29sw-chapter button:not(:disabled):hover { box-shadow: inset 0 0 0 1.5px rgba(75, 46, 242, .4); }
.v29sw-chapter button:focus-visible, .v29sw-pause:focus-visible { outline: 2px solid var(--v29-accent); outline-offset: 3px; }
.v29sw-chapter__n { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 50%; background: rgba(75, 46, 242, .1); color: var(--v29-accent); font-size: 14px; transition: background-color .3s, color .3s; }
.v29sw-chapter__copy { display: grid; gap: 3px; }
.v29sw-chapter__copy strong { font-size: 17px; font-weight: 500; }
.v29sw-chapter__copy small { color: var(--v29-muted); font-size: 13px; line-height: 1.4; }
.v29sw-chapter__meter { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: var(--v29-accent); transform: scaleX(0); transform-origin: 0 50%; }
.v29sw-chapter button[aria-current="step"] { background: var(--v29-paper); box-shadow: 0 14px 30px -20px rgba(60, 40, 10, .6), inset 0 0 0 1.5px rgba(75, 46, 242, .45); }
.v29sw-chapter button[aria-current="step"] .v29sw-chapter__n { background: var(--v29-accent); color: #fff; }
.v29sw-pause { justify-self: start; display: inline-grid; place-items: center; width: 44px; height: 44px; border: 0; border-radius: 50%; background: var(--v29-paper); color: var(--v29-ink); cursor: pointer; box-shadow: inset 0 0 0 1px var(--v29-line); }
.v29sw-pause .v29-i { font-size: 16px; }
.v29sw-pause .v29-i--fill:last-child { display: none; }
.v29sw-demo__stage.is-paused .v29sw-pause .v29-i--fill:first-child { display: none; }
.v29sw-demo__stage.is-paused .v29sw-pause .v29-i--fill:last-child { display: block; }

/* États de la démonstration (seulement pendant que le pilote joue : sans data-step = état final). */
html.v29sw-motion .v29sw-studio.is-resetting * { transition: none !important; }
html.v29sw-motion .v29sw-studio[data-step="0"] .v29sw-row__from { opacity: .45; }
html.v29sw-motion .v29sw-studio[data-step="0"] .v29sw-row__from em { opacity: 0; transform: scale(.6); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"]) .v29sw-row__track { transform: scaleX(0); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"]) .v29sw-row__to { opacity: 0; transform: translateX(-12px); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"]) .v29sw-row__lane small { opacity: 0; }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"], [data-step="3"]) .v29sw-row__to em { opacity: 0; transform: scale(.6); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"], [data-step="3"]) .v29sw-cover__part { transform: scaleX(0); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"], [data-step="3"], [data-step="4"]) .v29sw-cutover { background: rgba(21, 23, 46, .06); color: var(--v29-muted); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"], [data-step="3"], [data-step="4"]) .v29sw-cutover i { background: rgba(21, 23, 46, .25); box-shadow: 0 0 0 4px rgba(21, 23, 46, .06); }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"], [data-step="3"], [data-step="4"]) .v29sw-cutover__off { display: inline; }
html.v29sw-motion .v29sw-studio:is([data-step="0"], [data-step="1"], [data-step="2"], [data-step="3"], [data-step="4"]) .v29sw-cutover__on { display: none; }
html.v29sw-motion .v29sw-studio[data-step="1"] .v29sw-row__from { animation: v29sw-flash .7s var(--v29-ease) calc(var(--i) * .22s) both; }
html.v29sw-motion .v29sw-studio[data-step="1"] .v29sw-studio__head:nth-child(1) b,
html.v29sw-motion .v29sw-studio:is([data-step="2"], [data-step="3"]) .v29sw-studio__head:nth-child(2) b,
html.v29sw-motion .v29sw-studio:is([data-step="4"], [data-step="5"]) .v29sw-studio__head:nth-child(3) b { background: var(--v29-accent); color: #fff; }
html.v29sw-motion .v29sw-studio[data-step="3"] .v29sw-row__packet { animation: v29sw-travel 1.2s var(--v29-ease-io) calc(var(--i) * .14s) 2 both; }
html.v29sw-motion .v29sw-studio[data-step="4"] .v29sw-row__to { animation: v29sw-flash-green .8s var(--v29-ease) calc(var(--i) * .22s) both; }
html.v29sw-motion .v29sw-studio[data-step="5"] { box-shadow: 0 34px 80px -38px rgba(60, 40, 10, .55), 0 0 0 2px rgba(34, 165, 101, .45); }
html.v29sw-motion .v29sw-studio[data-step="5"] .v29sw-cutover { animation: v29sw-pulse-green 1.2s var(--v29-ease) .2s 2 both; }
html.v29sw-motion .v29sw-chapter button[aria-current="step"] .v29sw-chapter__meter { animation: v29sw-meter var(--dur, 2.4s) linear both; }
html.v29sw-motion .v29sw-demo__stage.is-paused .v29sw-chapter__meter,
html.v29sw-motion .v29sw-demo__stage.is-paused .v29sw-studio * { animation-play-state: paused !important; }

/* ---------- 03 Rôles d’automatisation ---------- */
.v29sw-bots__grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(16px, 2vw, 26px); margin-top: 56px; }
.v29sw-bot { display: grid; align-content: start; gap: 10px; padding: 28px 26px 30px; border-radius: 14px; background: var(--v29-paper); box-shadow: 0 26px 60px -40px rgba(60, 40, 10, .5), 0 0 0 1px rgba(21, 23, 46, .06); transition: transform .45s var(--v29-ease), box-shadow .45s var(--v29-ease); }
.v29sw-bot:hover { transform: translateY(-4px); box-shadow: 0 34px 70px -40px rgba(60, 40, 10, .6), 0 0 0 1px rgba(75, 46, 242, .18); }
.v29sw-bot__art { display: grid; place-items: start; margin-bottom: 8px; padding-bottom: 18px; border-bottom: 1px solid var(--v29-line); }
.v29sw-bot .v29-micro { color: var(--v29-accent); letter-spacing: .14em; }
.v29sw-bot h3 { margin: 0; font-size: clamp(24px, 2vw, 30px); font-weight: 300; letter-spacing: -.045em; line-height: 1.06; }
.v29sw-bot p:not(.v29-micro) { margin: 0; color: var(--v29-muted); font-size: 16px; line-height: 1.5; }
.v29sw-glyph { display: block; width: 88px; height: 88px; overflow: visible; }
.v29sw-glyph * { fill: none; stroke: var(--v29-accent); stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }
.v29sw-glyph__sheet, .v29sw-glyph__box, .v29sw-glyph__shield { fill: rgba(75, 46, 242, .07); }
.v29sw-glyph__row, .v29sw-glyph__track, .v29sw-glyph__orbit, .v29sw-glyph__base { stroke: rgba(75, 46, 242, .4); }
.v29sw-glyph__orbit { stroke-dasharray: 4 7; }
.v29sw-glyph__lens circle { fill: rgba(255, 253, 249, .85); }
.v29sw-glyph__packet, .v29sw-glyph__dot { fill: var(--v29-accent); stroke: none; }
.v29sw-glyph__box--to { fill: rgba(34, 165, 101, .14); stroke: var(--v29-green); }
.v29sw-glyph__tick { stroke: var(--v29-green); stroke-width: 3.2; stroke-dasharray: 1 1; }
.v29sw-glyph__star { fill: rgba(75, 46, 242, .14); }
.v29sw-glyph__lens, .v29sw-glyph__packet, .v29sw-glyph__star, .v29sw-glyph__shield { transform-box: fill-box; transform-origin: center; }
.v29sw-glyph__dot { transform-box: view-box; transform-origin: 60px 51px; }
html.v29sw-motion .v29sw-bots__grid:not(.is-in) .v29sw-glyph__tick { stroke-dashoffset: 1; }
html.v29sw-motion .v29sw-bots__grid:not(.is-in) .v29sw-glyph__row { opacity: 0; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__row { animation: v29sw-fade .7s var(--v29-ease) .5s both; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__tick { animation: v29sw-draw .9s var(--v29-ease) .9s both; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__lens { animation: v29sw-scan 3.2s var(--v29-ease-io) .8s 4 both; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__packet { animation: v29sw-shuttle 2.4s var(--v29-ease-io) .8s 5 both; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__shield { animation: v29sw-beat 2.6s ease-in-out 1.8s 4 both; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__star { animation: v29sw-twinkle 2.8s ease-in-out 1s 4 both; }
html.v29sw-motion .v29sw-bots__grid.is-in .v29sw-glyph__dot { animation: v29sw-orbit 5.6s linear 1s 2 both; }
html.v29sw-motion .v29sw-bots__grid .v29sw-glyph * { animation-play-state: paused; }
html.v29sw-motion .v29sw-bots__grid.is-live .v29sw-glyph * { animation-play-state: running; }

/* ---------- 04 neoo.forge ---------- */
.v29sw-forge .v29s-lead { max-width: 820px; }
.v29sw-forge__cta { margin-top: 38px; padding-top: 26px; border-top: 1px solid var(--v29-line); }

/* ---------- 05 Switch Map : anneau et correspondances ---------- */
.v29sw-map__grid { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); align-items: center; gap: clamp(40px, 6vw, 96px); margin-top: 56px; }
.v29sw-ring { display: grid; justify-items: center; gap: 30px; margin: 0; }
.v29sw-ring__art { position: relative; width: min(100%, 300px); }
.v29sw-ring__art svg { display: block; width: 100%; height: auto; }
.v29sw-ring__track { fill: none; stroke: rgba(21, 23, 46, .07); stroke-width: 16; }
.v29sw-ring__arc { fill: none; stroke-width: 16; stroke-dasharray: calc(var(--len) - 1.2) 100; stroke-dashoffset: var(--off); transform: rotate(-90deg); transform-box: fill-box; transform-origin: center; transition: stroke-dasharray 1s var(--v29-ease) calc(.4s + var(--i) * .45s); }
.v29sw-ring__arc--1 { stroke: var(--v29-green); }
.v29sw-ring__arc--2 { stroke: var(--v29-accent); }
.v29sw-ring__arc--3 { stroke: #a99bff; }
.v29sw-ring__badge { position: absolute; top: 50%; left: 50%; padding: 5px 12px; border-radius: 999px; background: rgba(75, 46, 242, .08); color: var(--v29-accent); font-size: 12px; letter-spacing: .08em; text-transform: uppercase; white-space: nowrap; transform: translate(-50%, -50%); }
.v29sw-ring figcaption { width: 100%; }
.v29sw-ring__legend { display: grid; gap: 12px; margin: 0; padding: 0; list-style: none; }
.v29sw-ring__key { display: grid; grid-template-columns: 10px auto minmax(0, 1fr); align-items: baseline; gap: 12px; padding-top: 12px; border-top: 1px solid var(--v29-line); transition: opacity .6s var(--v29-ease) calc(.5s + var(--i) * .45s); }
.v29sw-ring__key i { width: 10px; height: 10px; border-radius: 50%; }
.v29sw-ring__key strong { font-size: 30px; font-weight: 300; letter-spacing: -.04em; line-height: 1; font-variant-numeric: tabular-nums; }
.v29sw-ring__key span { color: var(--v29-muted); font-size: 16px; line-height: 1.4; }
.v29sw-pairs { padding: clamp(26px, 3vw, 38px); border-radius: 14px; background: var(--v29-glass); box-shadow: 0 30px 70px -40px rgba(60, 40, 10, .45), 0 0 0 1px rgba(21, 23, 46, .05); }
.v29sw-pairs__head, .v29sw-pair { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr); gap: 20px; }
.v29sw-pairs__head { margin: 0 0 6px; color: var(--v29-soft); font-size: 12px; letter-spacing: .14em; text-transform: uppercase; }
.v29sw-pairs__head span:last-child { padding-left: 44px; }
.v29sw-pairs dl { margin: 0; }
.v29sw-pair { padding: 13px 0; border-top: 1px solid var(--v29-line); font-size: 17px; line-height: 1.35; transition: opacity .5s var(--v29-ease) calc(.3s + var(--i) * .09s), transform .6s var(--v29-ease) calc(.3s + var(--i) * .09s); }
.v29sw-pair dt { color: var(--v29-muted); }
.v29sw-pair dd { display: flex; align-items: center; gap: 14px; margin: 0; color: var(--v29-ink); }
.v29sw-pair__arrow { position: relative; flex: none; width: 30px; height: 2px; border-radius: 2px; background: var(--v29-accent); transform-origin: 0 50%; transition: transform .5s var(--v29-ease) calc(.55s + var(--i) * .09s); }
.v29sw-pair__arrow::after { content: ""; position: absolute; right: -2px; top: -4px; border-left: 7px solid var(--v29-accent); border-top: 5px solid transparent; border-bottom: 5px solid transparent; }
html.v29sw-motion .v29sw-map__grid:not(.is-in) .v29sw-ring__arc { stroke-dasharray: 0 100; }
html.v29sw-motion .v29sw-map__grid:not(.is-in) .v29sw-ring__key { opacity: 0; }
html.v29sw-motion .v29sw-map__grid:not(.is-in) .v29sw-pair { opacity: 0; transform: translateY(10px); }
html.v29sw-motion .v29sw-map__grid:not(.is-in) .v29sw-pair__arrow { transform: scaleX(0); }

/* ---------- 06 Vous gardez la main ---------- */
.v29sw-serenity__grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(18px, 2.2vw, 30px); margin-top: 56px; }
.v29sw-cond { display: grid; align-content: start; gap: 12px; padding: 28px 28px 32px; border-radius: 14px; background: var(--v29-paper); box-shadow: 0 26px 60px -40px rgba(60, 40, 10, .5), 0 0 0 1px rgba(21, 23, 46, .06); }
.v29sw-cond--decide { background: linear-gradient(180deg, #fff, #f2faf5); box-shadow: 0 30px 70px -40px rgba(34, 165, 101, .5), 0 0 0 1.5px rgba(34, 165, 101, .3); }
.v29sw-cond__top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.v29sw-cond__icon { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 12px; background: rgba(75, 46, 242, .08); color: var(--v29-accent); }
.v29sw-cond__icon .v29-i { font-size: 24px; }
.v29sw-cond h3 { margin: 0; font-size: clamp(24px, 2vw, 30px); font-weight: 300; letter-spacing: -.045em; line-height: 1.06; }
.v29sw-cond p { margin: 0; color: var(--v29-muted); font-size: 16px; line-height: 1.5; }
.v29sw-toggle { position: relative; display: block; width: 52px; height: 30px; border-radius: 999px; background: var(--v29-green); box-shadow: inset 0 0 0 1px rgba(21, 23, 46, .08); transition: background-color .5s var(--v29-ease) 1.2s; }
.v29sw-toggle i { position: absolute; top: 3px; left: 3px; width: 24px; height: 24px; border-radius: 50%; background: #fff; box-shadow: 0 3px 8px rgba(21, 23, 46, .25); transform: translateX(22px); transition: transform .5s cubic-bezier(.3, 1.4, .5, 1) 1.2s; }
.v29sw-serenity__cta { display: flex; flex-wrap: wrap; align-items: center; gap: 18px 32px; margin-top: 44px; }
.v29sw-serenity__cta .v29s-note { margin: 0; }
html.v29sw-motion .v29sw-serenity__grid:not(.is-in) .v29sw-toggle { background: rgba(21, 23, 46, .18); }
html.v29sw-motion .v29sw-serenity__grid:not(.is-in) .v29sw-toggle i { transform: translateX(0); }

/* ---------- Appel final ---------- */
.v29sw-final .v29-kicker { margin-bottom: 18px; }
.v29sw-final__alt { margin: 22px 0 0; }

/* ---------- Images clés ---------- */
@keyframes v29sw-untangle { 0% { opacity: 1; stroke-dashoffset: 1; } 35% { opacity: 1; stroke-dashoffset: 0; } 60% { opacity: 1; stroke-dashoffset: 0; } 100% { opacity: 0; stroke-dashoffset: -1; } }
@keyframes v29sw-draw { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }
@keyframes v29sw-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes v29sw-tug { from { transform: translateX(0); } to { transform: translateX(6px); } }
@keyframes v29sw-flash { 0% { box-shadow: 0 0 0 1px var(--v29-line); } 40% { box-shadow: 0 0 0 2px var(--v29-accent), 0 12px 24px -16px rgba(75, 46, 242, .8); } 100% { box-shadow: 0 0 0 1px var(--v29-line), 0 10px 22px -20px rgba(30, 25, 40, .45); } }
@keyframes v29sw-flash-green { 0% { box-shadow: 0 0 0 1px var(--v29-line); } 40% { box-shadow: 0 0 0 2px var(--v29-green), 0 12px 24px -16px rgba(34, 165, 101, .8); } 100% { box-shadow: 0 0 0 1px var(--v29-line), 0 10px 22px -20px rgba(30, 25, 40, .45); } }
@keyframes v29sw-travel { 0% { opacity: 0; transform: translateX(0); } 12% { opacity: 1; } 85% { opacity: 1; transform: translateX(100%); } 100% { opacity: 0; transform: translateX(100%); } }
@keyframes v29sw-pulse-green { 0% { box-shadow: 0 0 0 0 rgba(34, 165, 101, .45); } 100% { box-shadow: 0 0 0 14px rgba(34, 165, 101, 0); } }
@keyframes v29sw-meter { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes v29sw-scan { 0%, 100% { transform: translate(0, 0); } 30% { transform: translate(-30px, -26px); } 60% { transform: translate(-12px, -8px); } }
@keyframes v29sw-shuttle { 0%, 100% { transform: translateX(0); opacity: 1; } 45% { transform: translateX(20px); opacity: 1; } 55% { transform: translateX(20px); opacity: 0; } 56% { transform: translateX(0); opacity: 0; } 70% { opacity: 1; } }
@keyframes v29sw-beat { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.06); } }
@keyframes v29sw-twinkle { 0%, 100% { transform: scale(1) rotate(0); } 50% { transform: scale(1.12) rotate(12deg); } }
@keyframes v29sw-orbit { from { transform: rotate(0); } to { transform: rotate(360deg); } }

/* ---------- Responsive ---------- */
@media (max-width: 1180px) {
  .v29sw-demo__stage { grid-template-columns: minmax(0, 1fr); }
  .v29sw-chapters__list { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .v29sw-chapter button { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  .v29sw-chapter__copy small { display: none; }
  .v29sw-bots__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v29sw-forge .v29s-flow__steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v29sw-forge .v29s-flow__step:nth-child(3)::after { display: block; }
  .v29sw-forge .v29s-flow__step:nth-child(2)::after { display: none; }
  .v29sw-map__grid { grid-template-columns: minmax(0, 1fr); }
  .v29sw-ring { grid-template-columns: minmax(0, 220px) minmax(0, 1fr); align-items: center; justify-items: stretch; }
  .v29sw-serenity__grid { grid-template-columns: minmax(0, 1fr); max-width: 720px; }
}
@media (max-width: 860px) {
  .v29sw-hero > .v29-plate img { object-position: 70% 40%; }
  .v29sw-knot { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0 14px; margin-top: 40px; padding: 22px 16px 24px; }
  .v29sw-knot__wires { display: none; }
  .v29sw-knot__col { grid-template-rows: 28px auto; }
  .v29sw-knot__col ul { grid-template-rows: repeat(4, 56px); }
  .v29sw-knot__col .v29-micro { font-size: 11px; letter-spacing: .1em; }
  .v29sw-knot__col--from .v29-micro { text-align: left; }
  .v29sw-knot__col li { padding: 8px 12px; font-size: 14px; }
  .v29sw-knot__col--from li { justify-self: start; }
  .v29sw-knot__col--to li { transition-delay: calc(.6s + var(--i) * .12s); }
  .v29sw-knot__caption { font-size: 15px; }
  .v29sw-studio__tag { display: none; }
  .v29sw-studio__body { padding: 16px 14px 18px; }
  .v29sw-studio__heads, .v29sw-row { grid-template-columns: minmax(0, 1fr) 34px minmax(0, 1fr); }
  .v29sw-studio__head { font-size: 10px; letter-spacing: .08em; gap: 6px; }
  .v29sw-studio__head:nth-child(2) { visibility: hidden; }
  .v29sw-row__from, .v29sw-row__to { padding: 8px 9px; font-size: 13px; }
  .v29sw-row__from > span, .v29sw-row__to > span { white-space: normal; overflow-wrap: anywhere; }
  .v29sw-row em { font-size: 9.5px; letter-spacing: .03em; }
  .v29sw-row__lane { margin: 0 4px; }
  .v29sw-row__lane small { display: none; }
  .v29sw-studio__foot { grid-template-columns: minmax(0, 1fr); }
  .v29sw-cutover { justify-self: start; font-size: 13px; }
  .v29sw-chapters__list { grid-template-columns: minmax(0, 1fr); }
  .v29sw-chapter button { grid-template-columns: 26px minmax(0, 1fr); gap: 10px; padding: 10px 12px 12px; }
  .v29sw-chapter__n { width: 26px; height: 26px; font-size: 13px; }
  .v29sw-chapter__copy strong { font-size: 15px; }
  .v29sw-bot { padding: 22px 20px 24px; }
  .v29sw-ring { grid-template-columns: minmax(0, 1fr); justify-items: center; }
  .v29sw-ring__art { width: min(100%, 240px); }
  .v29sw-pairs { padding: 20px 16px; }
  .v29sw-pairs__head, .v29sw-pair { gap: 12px; }
  .v29sw-pairs__head span:last-child { padding-left: 34px; }
  .v29sw-pair { font-size: 15px; }
  .v29sw-pair dd { gap: 10px; }
  .v29sw-pair__arrow { width: 22px; }
  .v29sw-cond { padding: 22px 20px 26px; }
  .v29sw-forge .v29s-flow__steps { grid-template-columns: minmax(0, 1fr); }
  .v29sw-forge .v29s-flow__step:nth-child(2)::after { display: block; }
}
@media (max-width: 560px) {
  .v29sw-bots__grid { grid-template-columns: minmax(0, 1fr); }
  .v29sw-cover__legend { flex-direction: column; }
}
