/**
 * WS Booster - Process Steps
 */
.ws-ps {
    --ws-ps-accent: #6366f1;
    --ws-ps-line-bg: #e5e7eb;
    --ws-ps-line-w: 2px;
    --ws-ps-marker: 52px;
    --ws-ps-marker-bg: #ffffff;
    --ws-ps-marker-text: #0f172a;
    --ws-ps-entry-dur: 0.7s;
    --ws-ps-entry-stag: 0.15s;
    position: relative;
    width: 100%;
}

.ws-ps__list {
    display: flex;
    gap: 24px;
    position: relative;
    z-index: 1;
}

.ws-ps__item {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 14px;
}

.ws-ps__marker {
    width: var(--ws-ps-marker);
    height: var(--ws-ps-marker);
    border-radius: 50%;
    background: var(--ws-ps-marker-bg, #fff);
    border: 2px solid var(--ws-ps-accent);
    color: var(--ws-ps-marker-text, var(--ws-ps-accent));
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    font-size: calc(var(--ws-ps-marker) * 0.32);
    box-shadow: 0 0 0 6px rgba(99, 102, 241, 0.12);
    flex-shrink: 0;
    z-index: 2;
    transition: background 0.3s ease, color 0.3s ease, transform 0.3s ease;
}

/* Square marker */
.ws-ps-marker-square .ws-ps__marker {
    border-radius: 8px;
}

/* Pulse dot */
.ws-ps__dot--pulse {
    position: relative;
}
.ws-ps__dot--pulse::before {
    content: "";
    position: absolute;
    inset: -50%;
    border-radius: 50%;
    background: var(--ws-ps-accent);
    opacity: 0.45;
    animation: ws-ps-pulse 1.6s ease-out infinite;
}
@keyframes ws-ps-pulse {
    0%   { transform: scale(0.6); opacity: 0.5; }
    100% { transform: scale(1.6); opacity: 0; }
}

.ws-ps__marker svg { width: 45%; height: 45%; fill: currentColor; }

.ws-ps__dot {
    width: 40%;
    height: 40%;
    border-radius: 50%;
    background: var(--ws-ps-accent);
}

.ws-ps__title {
    margin: 0 0 4px;
    font-size: 18px;
    font-weight: 600;
    color: #0f172a;
}

.ws-ps__text {
    margin: 0;
    color: #6b7280;
    font-size: 14px;
    line-height: 1.5;
    max-width: 260px;
}

/* Ligne de connexion - HORIZONTAL */
.ws-ps-horizontal .ws-ps__line {
    position: absolute;
    top: calc(var(--ws-ps-marker) / 2);
    left: 8%;
    right: 8%;
    height: var(--ws-ps-line-w, 2px);
    background: var(--ws-ps-line-bg);
    z-index: 0;
}

.ws-ps-horizontal .ws-ps__line::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(to right, var(--ws-ps-accent), color-mix(in srgb, var(--ws-ps-accent) 50%, transparent));
    transform: scaleX(0);
    transform-origin: left;
    transition: transform 1.2s ease;
}

.ws-ps-horizontal.ws-ps-animated .ws-ps__line::after {
    transform: scaleX(1);
}

/* VERTICAL */
.ws-ps-vertical .ws-ps__list {
    flex-direction: column;
    gap: 32px;
}

.ws-ps-vertical .ws-ps__item {
    flex-direction: row;
    align-items: flex-start;
    text-align: left;
    gap: 20px;
    width: 100%;
}

.ws-ps-vertical .ws-ps__text { max-width: 100%; }

.ws-ps-vertical .ws-ps__line {
    position: absolute;
    top: var(--ws-ps-marker);
    bottom: var(--ws-ps-marker);
    left: calc(var(--ws-ps-marker) / 2);
    width: var(--ws-ps-line-w, 2px);
    background: var(--ws-ps-line-bg);
    z-index: 0;
}

.ws-ps-vertical .ws-ps__line::after {
    content: "";
    position: absolute;
    inset: 0;
    background: var(--ws-ps-accent);
    transform: scaleY(0);
    transform-origin: top;
    transition: transform 1.5s ease;
}

.ws-ps-vertical.ws-ps-animated .ws-ps__line::after {
    transform: scaleY(1);
}

.ws-ps-vertical .ws-ps__content { flex: 1; padding-top: 8px; }

/* Auto-animate au scroll via IntersectionObserver helper ou en fallback CSS */
.ws-ps { transition: none; }

/* Si IO non disponible : on anime toujours */
@supports not (selector(:has(> :focus))) {
    .ws-ps.ws-ps-horizontal .ws-ps__line::after { transform: scaleX(1); }
    .ws-ps.ws-ps-vertical .ws-ps__line::after { transform: scaleY(1); }
}

/* Responsive */
@media (max-width: 768px) {
    .ws-ps-horizontal .ws-ps__list {
        flex-direction: column;
        gap: 24px;
    }
    .ws-ps-horizontal .ws-ps__item {
        flex-direction: row;
        align-items: flex-start;
        text-align: left;
    }
    .ws-ps-horizontal .ws-ps__line { display: none; }
    .ws-ps-horizontal .ws-ps__text { max-width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
    .ws-ps__line::after {
        transition: none !important;
        transform: none !important;
    }
}

/* === ANIMATIONS D'ARRIVEE === */
[class*="ws-ps-entry-"]:not(.ws-ps-entry-none) .ws-ps__item {
    animation: var(--ws-ps-entry-dur, 0.7s) ease both;
    animation-delay: calc(var(--ws-ps-entry-i, 0) * var(--ws-ps-entry-stag, 0.15s));
}
.ws-ps-entry-fade-up    .ws-ps__item { animation-name: wsPsFadeUp; }
.ws-ps-entry-fade-down  .ws-ps__item { animation-name: wsPsFadeDown; }
.ws-ps-entry-fade-left  .ws-ps__item { animation-name: wsPsFadeLeft; }
.ws-ps-entry-fade-right .ws-ps__item { animation-name: wsPsFadeRight; }
.ws-ps-entry-zoom-in    .ws-ps__item { animation-name: wsPsZoomIn; }
.ws-ps-entry-flip-up    .ws-ps__item { animation-name: wsPsFlipUp; }
.ws-ps-entry-rotate-in  .ws-ps__item { animation-name: wsPsRotateIn; }

.ws-ps-entry-draw-line .ws-ps__item { animation-name: wsPsFadeUp; }
.ws-ps-entry-draw-line .ws-ps__line {
    animation: wsPsDrawLine var(--ws-ps-entry-dur, 0.7s) ease both;
    transform-origin: left center;
}

@keyframes wsPsFadeUp    { from { opacity: 0; transform: translateY(24px); }  to { opacity: 1; transform: translateY(0); } }
@keyframes wsPsFadeDown  { from { opacity: 0; transform: translateY(-24px); } to { opacity: 1; transform: translateY(0); } }
@keyframes wsPsFadeLeft  { from { opacity: 0; transform: translateX(-32px); } to { opacity: 1; transform: translateX(0); } }
@keyframes wsPsFadeRight { from { opacity: 0; transform: translateX(32px); }  to { opacity: 1; transform: translateX(0); } }
@keyframes wsPsZoomIn    { from { opacity: 0; transform: scale(0.7); }        to { opacity: 1; transform: scale(1); } }
@keyframes wsPsFlipUp    { from { opacity: 0; transform: perspective(800px) rotateX(-60deg); } to { opacity: 1; transform: perspective(800px) rotateX(0); } }
@keyframes wsPsRotateIn  { from { opacity: 0; transform: rotate(-15deg) scale(0.85); } to { opacity: 1; transform: rotate(0) scale(1); } }
@keyframes wsPsDrawLine  { from { transform: scaleX(0); } to { transform: scaleX(1); } }

@media (prefers-reduced-motion: reduce) {
    [class*="ws-ps-entry-"] .ws-ps__item,
    .ws-ps-entry-draw-line .ws-ps__line,
    .ws-ps__dot--pulse::before {
        animation: none !important;
    }
}

/* ==========================================================================
   FORME DU MARKER (controle marker_shape)
   round / square / rounded : juste le border-radius (le contour accent + le
   halo restent). hexagon / diamond : clip-path -> le contour et le halo sont
   clippes, donc on remplit le marker en couleur accent (badge plein).
   ========================================================================== */
.ws-ps-shape-round   .ws-ps__marker { border-radius: 50%; }
.ws-ps-shape-square  .ws-ps__marker { border-radius: 0; }
.ws-ps-shape-rounded .ws-ps__marker { border-radius: 14px; }

.ws-ps-shape-hexagon .ws-ps__marker,
.ws-ps-shape-diamond .ws-ps__marker {
    border: 0;
    border-radius: 0;
    box-shadow: none;
    background: var(--ws-ps-accent);
    color: #fff;
}
.ws-ps-shape-hexagon .ws-ps__marker {
    clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
}
.ws-ps-shape-diamond .ws-ps__marker {
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}

/* ==========================================================================
   DISPOSITION ALTERNEE (controle step_disposition = alternate)
   Les markers restent alignes sur la ligne centrale ; le contenu se decale
   en quinconce de part et d'autre (haut/bas en horizontal, gauche/droite en
   vertical) via grille 3 zones + nth-child(even).
   ========================================================================== */
/* --- Horizontal : contenu en haut (impair) / en bas (pair) --- */
.ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__item {
    display: grid;
    grid-template-rows: 1fr auto 1fr;
    align-items: center;
    gap: 0;
}
.ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__marker {
    grid-row: 2;
    margin: 14px auto;
}
.ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__content {
    grid-row: 1;
    align-self: end;
}
.ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__item:nth-child(even) .ws-ps__content {
    grid-row: 3;
    align-self: start;
}
.ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__line {
    top: 50%;
    transform: translateY(-50%);
}

/* --- Vertical : contenu a gauche (impair) / a droite (pair) --- */
.ws-ps-disp-alternate.ws-ps-vertical .ws-ps__item {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: center;
    gap: 0;
}
.ws-ps-disp-alternate.ws-ps-vertical .ws-ps__marker {
    grid-column: 2;
    margin: 0 16px;
}
.ws-ps-disp-alternate.ws-ps-vertical .ws-ps__content {
    grid-column: 1;
    text-align: right;
    padding-top: 0;
}
.ws-ps-disp-alternate.ws-ps-vertical .ws-ps__item:nth-child(even) .ws-ps__content {
    grid-column: 3;
    text-align: left;
}
.ws-ps-disp-alternate.ws-ps-vertical .ws-ps__line {
    left: 50%;
    transform: translateX(-50%);
}

/* Sur mobile, l'alternee horizontale repasse en pile simple (lisibilite) */
@media (max-width: 768px) {
    .ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__item {
        display: flex;
        flex-direction: row;
        align-items: flex-start;
        text-align: left;
    }
    .ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__content,
    .ws-ps-disp-alternate.ws-ps-horizontal .ws-ps__item:nth-child(even) .ws-ps__content {
        grid-row: auto;
        align-self: auto;
    }
}

/* ==========================================================================
   STYLE DU TRAIT (controle line_style = dashed / dotted)
   Motif repete pour la ligne de base + la partie active (::after). La partie
   active est revelee via clip-path (et non scaleX, qui etirerait le motif).
   ========================================================================== */
/* --- Horizontal --- */
.ws-ps-line-dashed.ws-ps-horizontal .ws-ps__line {
    background: repeating-linear-gradient(to right, var(--ws-ps-line-bg) 0 9px, transparent 9px 16px);
}
.ws-ps-line-dotted.ws-ps-horizontal .ws-ps__line {
    background: repeating-linear-gradient(to right, var(--ws-ps-line-bg) 0 3px, transparent 3px 9px);
}
.ws-ps-line-dashed.ws-ps-horizontal .ws-ps__line::after,
.ws-ps-line-dotted.ws-ps-horizontal .ws-ps__line::after {
    transform: none;
    clip-path: inset(0 100% 0 0);
    transition: clip-path 1.2s ease;
}
.ws-ps-line-dashed.ws-ps-horizontal .ws-ps__line::after {
    background: repeating-linear-gradient(to right, var(--ws-ps-accent) 0 9px, transparent 9px 16px);
}
.ws-ps-line-dotted.ws-ps-horizontal .ws-ps__line::after {
    background: repeating-linear-gradient(to right, var(--ws-ps-accent) 0 3px, transparent 3px 9px);
}
.ws-ps-line-dashed.ws-ps-horizontal.ws-ps-animated .ws-ps__line::after,
.ws-ps-line-dotted.ws-ps-horizontal.ws-ps-animated .ws-ps__line::after {
    clip-path: inset(0 0 0 0);
}

/* --- Vertical --- */
.ws-ps-line-dashed.ws-ps-vertical .ws-ps__line {
    background: repeating-linear-gradient(to bottom, var(--ws-ps-line-bg) 0 9px, transparent 9px 16px);
}
.ws-ps-line-dotted.ws-ps-vertical .ws-ps__line {
    background: repeating-linear-gradient(to bottom, var(--ws-ps-line-bg) 0 3px, transparent 3px 9px);
}
.ws-ps-line-dashed.ws-ps-vertical .ws-ps__line::after,
.ws-ps-line-dotted.ws-ps-vertical .ws-ps__line::after {
    transform: none;
    clip-path: inset(0 0 100% 0);
    transition: clip-path 1.5s ease;
}
.ws-ps-line-dashed.ws-ps-vertical .ws-ps__line::after {
    background: repeating-linear-gradient(to bottom, var(--ws-ps-accent) 0 9px, transparent 9px 16px);
}
.ws-ps-line-dotted.ws-ps-vertical .ws-ps__line::after {
    background: repeating-linear-gradient(to bottom, var(--ws-ps-accent) 0 3px, transparent 3px 9px);
}
.ws-ps-line-dashed.ws-ps-vertical.ws-ps-animated .ws-ps__line::after,
.ws-ps-line-dotted.ws-ps-vertical.ws-ps-animated .ws-ps__line::after {
    clip-path: inset(0 0 0 0);
}

@media (prefers-reduced-motion: reduce) {
    .ws-ps-line-dashed .ws-ps__line::after,
    .ws-ps-line-dotted .ws-ps__line::after {
        transition: none !important;
        clip-path: inset(0 0 0 0) !important;
    }
}

/* ==========================================================================
   DISPOSITION BULLES (step_disposition = bubbles)
   Ligne horizontale + noeuds numerotes + bulles en quinconce + fleches.
   Interactif : l'etape active (.is-active) remplit la ligne jusqu'a son noeud
   (largeur posee par le JS via --ws-ps-fill). Toujours horizontal.
   ========================================================================== */
.ws-ps-disp-bubbles .ws-ps__viewport {
    display: flex;
    align-items: center;
    gap: 14px;
}

.ws-ps-disp-bubbles .ws-ps__track {
    position: relative;
    flex: 1;
    min-width: 0;
}

/* Liste toujours en rangee, items egaux (override orientation verticale) */
.ws-ps-disp-bubbles .ws-ps__list {
    flex-direction: row !important;
    align-items: stretch;
}

/* Item = grille 3 lignes : bulle haut / marker / bulle bas */
.ws-ps-disp-bubbles .ws-ps__item {
    display: grid;
    grid-template-rows: 1fr auto 1fr;
    align-items: center;
    gap: 0;
    text-align: center;
}

.ws-ps-disp-bubbles .ws-ps__marker {
    grid-row: 2;
    margin: 16px auto;
    cursor: pointer;
    background: var(--ws-ps-accent);
    color: #ffffff;
    border-color: transparent;
    box-shadow: 0 6px 16px -6px var(--ws-ps-accent);
}

/* Noeud actif : halo + leger zoom */
.ws-ps-disp-bubbles .ws-ps__item.is-active .ws-ps__marker {
    box-shadow: 0 0 0 8px color-mix(in srgb, var(--ws-ps-accent) 22%, transparent);
    transform: scale(1.08);
}

/* Bulle : item impair -> dessous, item pair -> dessus (1ere bulle dessous) */
.ws-ps-disp-bubbles .ws-ps__content {
    grid-row: 3;
    align-self: start;
    position: relative;
    background: #ffffff;
    border: 2px solid transparent;
    border-radius: 14px;
    padding: 16px 18px;
    margin-top: 12px;
    box-shadow: 0 12px 30px -14px rgba(15, 23, 42, 0.3);
}
.ws-ps-disp-bubbles .ws-ps__item:nth-child(even) .ws-ps__content {
    grid-row: 1;
    align-self: end;
    margin-top: 0;
    margin-bottom: 12px;
}

/* Pointe de la bulle (carre tourne, meme fond que la bulle) */
.ws-ps-disp-bubbles .ws-ps__content::after {
    content: "";
    position: absolute;
    left: 50%;
    width: 14px;
    height: 14px;
    background: inherit;
    transform: translateX(-50%) rotate(45deg);
    top: -7px;
}
.ws-ps-disp-bubbles .ws-ps__item:nth-child(even) .ws-ps__content::after {
    top: auto;
    bottom: -7px;
}

/* Bulle active : bordure accent */
.ws-ps-disp-bubbles .ws-ps__item.is-active .ws-ps__content {
    border-color: var(--ws-ps-accent);
}

/* Ligne : pleine largeur du track, centree verticalement */
.ws-ps-disp-bubbles .ws-ps__line {
    position: absolute;
    top: 50%;
    left: 0;
    right: 0;
    bottom: auto;
    width: auto;
    height: var(--ws-ps-line-w, 4px);
    transform: translateY(-50%);
    background: var(--ws-ps-line-bg);
    border-radius: 999px;
    z-index: 0;
}

/* Remplissage jusqu'au noeud actif : largeur posee par le JS (--ws-ps-fill) */
.ws-ps-disp-bubbles .ws-ps__line::after {
    content: "";
    position: absolute;
    left: 0;
    right: auto;
    top: 0;
    bottom: auto;
    height: 100%;
    width: var(--ws-ps-fill, 0px);
    transform: none;
    background: linear-gradient(to right, var(--ws-ps-accent), color-mix(in srgb, var(--ws-ps-accent) 65%, #ffffff));
    border-radius: inherit;
    transition: width 0.5s cubic-bezier(0.65, 0, 0.35, 1);
}

/* Fleches precedent / suivant */
.ws-ps__arrow {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: #94a3b8;
    cursor: pointer;
    transition: color 0.2s ease, background 0.2s ease, opacity 0.2s ease;
}
.ws-ps__arrow:hover {
    color: var(--ws-ps-accent);
    background: color-mix(in srgb, var(--ws-ps-accent) 12%, transparent);
}
.ws-ps__arrow:disabled {
    opacity: 0.35;
    cursor: default;
    background: transparent;
    color: #94a3b8;
}
.ws-ps__arrow svg {
    width: 22px;
    height: 22px;
}

/* Bulles sur mobile : empilage vertical, fleches masquees */
@media (max-width: 768px) {
    .ws-ps-disp-bubbles .ws-ps__viewport {
        display: block;
    }
    .ws-ps-disp-bubbles .ws-ps__arrow {
        display: none;
    }
    .ws-ps-disp-bubbles .ws-ps__list {
        flex-direction: column !important;
        gap: 28px;
    }
    .ws-ps-disp-bubbles .ws-ps__item {
        display: flex;
        flex-direction: row;
        align-items: flex-start;
        text-align: left;
        gap: 16px;
    }
    .ws-ps-disp-bubbles .ws-ps__content,
    .ws-ps-disp-bubbles .ws-ps__item:nth-child(even) .ws-ps__content {
        grid-row: auto;
        align-self: auto;
        margin: 0;
        flex: 1;
    }
    .ws-ps-disp-bubbles .ws-ps__content::after {
        display: none;
    }
    .ws-ps-disp-bubbles .ws-ps__marker {
        margin: 0;
    }
    .ws-ps-disp-bubbles .ws-ps__line {
        display: none;
    }
}

@media (prefers-reduced-motion: reduce) {
    .ws-ps-disp-bubbles .ws-ps__line::after,
    .ws-ps-disp-bubbles .ws-ps__marker {
        transition: none !important;
    }
}

/* ==========================================================================
   DISPOSITION EDITORIALE (v4.9.149)
   1 etape = grille 2 colonnes : [ bulle + image ]  |  [ titre + texte ]
   Connecteur decoratif entre items (trait, pointille, fleche, courbe SVG,
   separateur vertical |). Animations separees pour bulle / titre / texte.
   ========================================================================== */
.ws-ps-disp-editorial .ws-ps__list {
    display: flex;
    flex-direction: row;
    align-items: stretch;
    flex-wrap: nowrap;
}
.ws-ps-disp-editorial .ws-ps__line { display: none; }

.ws-ps-disp-editorial .ws-ps__item {
    flex: 1 1 0;
    display: grid;
    grid-template-columns: auto 1fr;
    align-items: flex-start;
    column-gap: 24px;
    text-align: left;
    position: relative;
    background: transparent;
}

/* Bloc gauche (bulle + image), structure verticale par defaut */
.ws-ps-disp-editorial .ws-ps__edi-left {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
    flex-shrink: 0;
}
/* Variante : image a cote */
.ws-ps-edi-img-beside .ws-ps-disp-editorial .ws-ps__edi-left,
.ws-ps-edi-img-beside.ws-ps-disp-editorial .ws-ps__edi-left {
    flex-direction: row;
    align-items: center;
}

.ws-ps-disp-editorial .ws-ps__edi-img {
    line-height: 0;
    overflow: hidden;
    flex-shrink: 0;
}
.ws-ps-disp-editorial .ws-ps__edi-img img {
    display: block;
    width: 100%;
    height: auto;
    object-fit: contain;
}

.ws-ps-disp-editorial .ws-ps__content {
    align-self: flex-start;
    padding-top: 4px;
}

/* ===== Connecteurs ===== */
.ws-ps-disp-editorial .ws-ps__edi-conn {
    flex: 0 0 auto;
    align-self: stretch;
    position: relative;
    min-width: 40px;
    color: var(--ws-ps-conn-color, #9ca3af);
}

/* line / dashed / dotted */
.ws-ps-disp-editorial .ws-ps__edi-conn--line::before,
.ws-ps-disp-editorial .ws-ps__edi-conn--dashed::before,
.ws-ps-disp-editorial .ws-ps__edi-conn--dotted::before {
    content: "";
    position: absolute;
    left: 50%;
    top: var(--ws-ps-conn-y, 35%);
    width: var(--ws-ps-conn-len, 70%);
    height: var(--ws-ps-conn-w, 2px);
    background: currentColor;
    transform: translateX(-50%);
}
.ws-ps-disp-editorial .ws-ps__edi-conn--dashed::before {
    background: transparent;
    border-top: var(--ws-ps-conn-w, 2px) dashed currentColor;
    height: 0;
}
.ws-ps-disp-editorial .ws-ps__edi-conn--dotted::before {
    background: transparent;
    border-top: var(--ws-ps-conn-w, 2px) dotted currentColor;
    height: 0;
}

/* arrow + arrow-dashed */
.ws-ps-disp-editorial .ws-ps__edi-conn--arrow .ws-ps__edi-conn-line,
.ws-ps-disp-editorial .ws-ps__edi-conn--arrow-dashed .ws-ps__edi-conn-line {
    position: absolute;
    left: 50%;
    top: var(--ws-ps-conn-y, 35%);
    width: var(--ws-ps-conn-len, 70%);
    height: var(--ws-ps-conn-w, 2px);
    background: currentColor;
    transform: translateX(-50%);
}
.ws-ps-disp-editorial .ws-ps__edi-conn--arrow-dashed .ws-ps__edi-conn-line {
    background: transparent;
    border-top: var(--ws-ps-conn-w, 2px) dashed currentColor;
    height: 0;
}
.ws-ps-disp-editorial .ws-ps__edi-conn--arrow .ws-ps__edi-conn-tip,
.ws-ps-disp-editorial .ws-ps__edi-conn--arrow-dashed .ws-ps__edi-conn-tip {
    position: absolute;
    left: calc(50% + var(--ws-ps-conn-len, 70%) / 2);
    top: var(--ws-ps-conn-y, 35%);
    width: 0;
    height: 0;
    transform: translate(-2px, -50%);
    border-top: 6px solid transparent;
    border-bottom: 6px solid transparent;
    border-left: 9px solid currentColor;
}

/* curve : SVG */
.ws-ps-disp-editorial .ws-ps__edi-conn--curve {
    display: flex;
    align-items: center;
    justify-content: center;
}
.ws-ps-disp-editorial .ws-ps__edi-conn--curve svg {
    width: var(--ws-ps-conn-len, 70%);
    height: 50%;
    margin-top: calc(var(--ws-ps-conn-y, 35%) - 25%);
    overflow: visible;
}
.ws-ps-disp-editorial .ws-ps__edi-conn--curve svg path {
    stroke-width: var(--ws-ps-conn-w, 2px);
}

/* bar : separateur vertical */
.ws-ps-disp-editorial .ws-ps__edi-conn--bar {
    display: flex;
    align-items: center;
    justify-content: center;
}
.ws-ps-disp-editorial .ws-ps__edi-conn--bar::before {
    content: "";
    display: block;
    width: var(--ws-ps-conn-w, 2px);
    height: var(--ws-ps-conn-bar-h, 60px);
    background: currentColor;
    border-radius: 999px;
    margin-top: calc(var(--ws-ps-conn-y, 50%) - var(--ws-ps-conn-bar-h, 60px) / 2);
}

/* Responsive editorial : sous 900px on empile verticalement */
@media (max-width: 900px) {
    .ws-ps-disp-editorial .ws-ps__list {
        flex-direction: column;
        gap: 32px;
    }
    .ws-ps-disp-editorial .ws-ps__item { width: 100%; }
    .ws-ps-disp-editorial .ws-ps__edi-conn {
        min-height: 50px;
        min-width: 0;
        align-self: center;
        width: 100%;
    }
    .ws-ps-disp-editorial .ws-ps__edi-conn--line::before,
    .ws-ps-disp-editorial .ws-ps__edi-conn--dashed::before,
    .ws-ps-disp-editorial .ws-ps__edi-conn--dotted::before,
    .ws-ps-disp-editorial .ws-ps__edi-conn--arrow .ws-ps__edi-conn-line,
    .ws-ps-disp-editorial .ws-ps__edi-conn--arrow-dashed .ws-ps__edi-conn-line {
        width: var(--ws-ps-conn-w, 2px);
        height: 50px;
        left: 50%;
        top: 0;
        transform: translateX(-50%);
        background: currentColor;
        border-top: 0;
    }
    .ws-ps-disp-editorial .ws-ps__edi-conn--dashed::before { background: transparent; border-left: var(--ws-ps-conn-w, 2px) dashed currentColor; width: 0; }
    .ws-ps-disp-editorial .ws-ps__edi-conn--dotted::before { background: transparent; border-left: var(--ws-ps-conn-w, 2px) dotted currentColor; width: 0; }
    .ws-ps-disp-editorial .ws-ps__edi-conn--arrow .ws-ps__edi-conn-tip,
    .ws-ps-disp-editorial .ws-ps__edi-conn--arrow-dashed .ws-ps__edi-conn-tip {
        left: 50%;
        top: 50px;
        transform: translate(-50%, -2px) rotate(90deg);
    }
    .ws-ps-disp-editorial .ws-ps__edi-conn--curve svg {
        height: 50px;
        width: 60%;
        margin: 0;
        transform: rotate(90deg);
    }
}

/* ===== Animations editoriales separees (marker / titre / texte) ===== */
.ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-disp-editorial .ws-ps__edi-img,
.ws-ps-disp-editorial .ws-ps__title,
.ws-ps-disp-editorial .ws-ps__text {
    animation: var(--ws-ps-edi-anim-dur, 0.7s) ease both;
    animation-name: none;
}

/* Marker + image group */
.ws-ps-edi-anim-marker-fade-up    .ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-edi-anim-marker-fade-up    .ws-ps-disp-editorial .ws-ps__edi-img    { animation-name: wsPsEdiFadeUp; }
.ws-ps-edi-anim-marker-fade-down  .ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-edi-anim-marker-fade-down  .ws-ps-disp-editorial .ws-ps__edi-img    { animation-name: wsPsEdiFadeDown; }
.ws-ps-edi-anim-marker-fade-left  .ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-edi-anim-marker-fade-left  .ws-ps-disp-editorial .ws-ps__edi-img    { animation-name: wsPsEdiFadeLeft; }
.ws-ps-edi-anim-marker-fade-right .ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-edi-anim-marker-fade-right .ws-ps-disp-editorial .ws-ps__edi-img    { animation-name: wsPsEdiFadeRight; }
.ws-ps-edi-anim-marker-zoom-in    .ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-edi-anim-marker-zoom-in    .ws-ps-disp-editorial .ws-ps__edi-img    { animation-name: wsPsEdiZoomIn; }
.ws-ps-edi-anim-marker-rotate-in  .ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-edi-anim-marker-rotate-in  .ws-ps-disp-editorial .ws-ps__edi-img    { animation-name: wsPsEdiRotateIn; }

/* Title */
.ws-ps-edi-anim-title-fade-up    .ws-ps-disp-editorial .ws-ps__title { animation-name: wsPsEdiFadeUp; }
.ws-ps-edi-anim-title-fade-down  .ws-ps-disp-editorial .ws-ps__title { animation-name: wsPsEdiFadeDown; }
.ws-ps-edi-anim-title-fade-left  .ws-ps-disp-editorial .ws-ps__title { animation-name: wsPsEdiFadeLeft; }
.ws-ps-edi-anim-title-fade-right .ws-ps-disp-editorial .ws-ps__title { animation-name: wsPsEdiFadeRight; }
.ws-ps-edi-anim-title-zoom-in    .ws-ps-disp-editorial .ws-ps__title { animation-name: wsPsEdiZoomIn; }
.ws-ps-edi-anim-title-rotate-in  .ws-ps-disp-editorial .ws-ps__title { animation-name: wsPsEdiRotateIn; }

/* Text */
.ws-ps-edi-anim-text-fade-up    .ws-ps-disp-editorial .ws-ps__text { animation-name: wsPsEdiFadeUp; }
.ws-ps-edi-anim-text-fade-down  .ws-ps-disp-editorial .ws-ps__text { animation-name: wsPsEdiFadeDown; }
.ws-ps-edi-anim-text-fade-left  .ws-ps-disp-editorial .ws-ps__text { animation-name: wsPsEdiFadeLeft; }
.ws-ps-edi-anim-text-fade-right .ws-ps-disp-editorial .ws-ps__text { animation-name: wsPsEdiFadeRight; }
.ws-ps-edi-anim-text-zoom-in    .ws-ps-disp-editorial .ws-ps__text { animation-name: wsPsEdiZoomIn; }
.ws-ps-edi-anim-text-rotate-in  .ws-ps-disp-editorial .ws-ps__text { animation-name: wsPsEdiRotateIn; }

/* Delays : cumule stagger item (--ws-ps-entry-i) + per-element delay */
.ws-ps-disp-editorial .ws-ps__item {
    --ws-ps-edi-base-delay: calc(var(--ws-ps-entry-i, 0) * var(--ws-ps-edi-item-stag, 0.2s));
}
.ws-ps-disp-editorial .ws-ps__marker,
.ws-ps-disp-editorial .ws-ps__edi-img {
    animation-delay: calc(var(--ws-ps-edi-base-delay) + var(--ws-ps-edi-marker-delay, 0s));
}
.ws-ps-disp-editorial .ws-ps__title {
    animation-delay: calc(var(--ws-ps-edi-base-delay) + var(--ws-ps-edi-title-delay, 0.15s));
}
.ws-ps-disp-editorial .ws-ps__text {
    animation-delay: calc(var(--ws-ps-edi-base-delay) + var(--ws-ps-edi-text-delay, 0.3s));
}

/* Keyframes dedies au mode editorial */
@keyframes wsPsEdiFadeUp    { from { opacity: 0; transform: translateY(24px); }    to { opacity: 1; transform: translateY(0); } }
@keyframes wsPsEdiFadeDown  { from { opacity: 0; transform: translateY(-24px); }   to { opacity: 1; transform: translateY(0); } }
@keyframes wsPsEdiFadeLeft  { from { opacity: 0; transform: translateX(-32px); }   to { opacity: 1; transform: translateX(0); } }
@keyframes wsPsEdiFadeRight { from { opacity: 0; transform: translateX(32px); }    to { opacity: 1; transform: translateX(0); } }
@keyframes wsPsEdiZoomIn    { from { opacity: 0; transform: scale(0.7); }          to { opacity: 1; transform: scale(1); } }
@keyframes wsPsEdiRotateIn  { from { opacity: 0; transform: rotate(-15deg) scale(0.85); } to { opacity: 1; transform: rotate(0) scale(1); } }

@media (prefers-reduced-motion: reduce) {
    .ws-ps-disp-editorial .ws-ps__marker,
    .ws-ps-disp-editorial .ws-ps__edi-img,
    .ws-ps-disp-editorial .ws-ps__title,
    .ws-ps-disp-editorial .ws-ps__text {
        animation: none !important;
    }
}
