{"id":1762843936,"date":"2025-12-18T14:06:39","date_gmt":"2025-12-18T14:06:39","guid":{"rendered":"https:\/\/www.veloexotique.fr\/?page_id=1762843936"},"modified":"2026-05-18T20:26:26","modified_gmt":"2026-05-18T20:26:26","slug":"configurator","status":"publish","type":"page","link":"https:\/\/www.veloexotique.fr\/en\/configurateur\/","title":{"rendered":"Configurator"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section section_has_divider et_pb_bottom_divider\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_0 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\">[velo_configurateur]<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_1 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_1 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_1 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Configurateur VeloExotique<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow+Condensed:wght@700;800&family=DM+Sans:wght@400;500;600&display=swap\" rel=\"stylesheet\">\n\n<!-- \u2550\u2550 GOOGLE ANALYTICS \u2014 remplacez \u2550\u2550 -->\n<script async src=\"https:\/\/www.googletagmanager.com\/gtag\/js?id=G-XXXXXXXXXX\"><\/script>\n<script>\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-6310288920');\n\nfunction trackEvent(action, category, label, value){\n  if(typeof gtag !== 'function') return;\n  gtag('event', action, {\n    event_category: category,\n    event_label:    label,\n    value:          value || 0,\n  });\n}\n<\/script>\n\n<style>\n\/* \u2500\u2500 RESET \u2500\u2500 *\/\n.vrc *,.vrc *::before,.vrc *::after{box-sizing:border-box!important}\n.vrc{font-family:'DM Sans',sans-serif;color:#0d0d0d;\n  --g:#1db954;--gd:#159140;--gl:#e8f8ef;--bk:#0d0d0d;\n  --wh:#fff;--gr:#f5f5f3;--gm:#e0dedd;--mu:#888;\n  --fh:'Barlow Condensed',sans-serif;--fb:'DM Sans',sans-serif}\n.vrc a{text-decoration:none!important}\n.vrc p{margin:0 0 .8em;line-height:1.6}\n.vrc p:last-child{margin-bottom:0}\n\n\n\/* Fix largeur sur mobile *\/\n.vrc {\n    width: 100% !important;\n    max-width: 100% !important;\n    overflow-x: hidden !important;\n}\n\nhtml, body {\n    width: 100%;\n    max-width: 100%;\n    overflow-x: hidden;\n}\n\n\n\/* \u2500\u2500 HERO \u2500\u2500 *\/\n.vrc-hero{background:var(--bk);padding:44px 20px 36px;text-align:center;position:relative;overflow:hidden}\n.vrc-hero::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 80% 50% at 50% 120%,rgba(29,185,84,.18),transparent);pointer-events:none}\n.vrc-hero-in{position:relative;max-width:640px;margin:0 auto}\n.vrc-badge{display:inline-block;background:rgba(29,185,84,.12);color:var(--g);border:1px solid rgba(29,185,84,.3);font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;padding:4px 14px;border-radius:20px;margin-bottom:14px}\n.vrc-hero h1{font-family:var(--fh);font-size:clamp(34px,6vw,60px);font-weight:800;color:#fff;line-height:1;margin:0 0 10px}\n.vrc-hero h1 em{font-style:normal;color:var(--g)}\n.vrc-hero p{font-size:14px;color:rgba(255,255,255,.5);margin:0}\n\n\/* \u2500\u2500 FILTRE TYPE (GRAVEL \/ ROUTE) \u2500\u2500 *\/\n.vrc-type-bar{background:#111;border-bottom:1px solid rgba(255,255,255,.06);padding:10px 20px}\n.vrc-type-inner{max-width:860px;margin:0 auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.vrc-type-label{font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:rgba(255,255,255,.4);white-space:nowrap;flex-shrink:0}\n.vrc-type-btn{font-family:var(--fh);font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;padding:6px 18px;border-radius:20px;border:1.5px solid rgba(255,255,255,.15);background:transparent;color:rgba(255,255,255,.6);cursor:pointer;transition:all .2s;white-space:nowrap;display:flex;align-items:center;gap:6px}\n.vrc-type-btn:hover{border-color:rgba(255,255,255,.4);color:#fff}\n.vrc-type-btn.active.route{background:#378ADD;border-color:#378ADD;color:#fff;box-shadow:0 2px 10px rgba(55,138,221,.35)}\n.vrc-type-btn.active.gravel{background:#b36200;border-color:#b36200;color:#fff;box-shadow:0 2px 10px rgba(179,98,0,.35)}\n.vrc-type-hint{font-size:11px;color:rgba(255,255,255,.3);font-style:italic}\n\n\/* Badge type sur les cartes *\/\n.vrc-type-tag{display:inline-block;font-family:var(--fh);font-size:9px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:2px 7px;border-radius:3px;margin-bottom:5px}\n.vrc-type-tag.route{background:#e8f0ff;color:#1a4cb8;border:1px solid #b8c8f5}\n.vrc-type-tag.gravel{background:#fff9e6;color:#b36200;border:1px solid #ffd97a}\n.vrc-type-tag.both{background:#f5f5f3;color:#666;border:1px solid #e0dedd}\n\n\/* \u2500\u2500 FILTRE MARQUE GLOBAL \u2500\u2500 *\/\n.vrc-brands{background:var(--bk);border-bottom:1px solid rgba(255,255,255,.08);padding:12px 20px}\n.vrc-brands-inner{max-width:860px;margin:0 auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.vrc-brands-label{font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:rgba(255,255,255,.4);white-space:nowrap;flex-shrink:0}\n.vrc-brand-btn{font-family:var(--fh);font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;padding:5px 14px;border-radius:20px;border:1.5px solid rgba(255,255,255,.15);background:transparent;color:rgba(255,255,255,.6);cursor:pointer;transition:all .2s;white-space:nowrap}\n.vrc-brand-btn:hover{border-color:rgba(255,255,255,.4);color:#fff}\n.vrc-brand-btn.active{background:var(--g);border-color:var(--g);color:#fff;box-shadow:0 2px 10px rgba(29,185,84,.3)}\n.vrc-brands-reset{font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;background:none;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:rgba(255,255,255,.35);padding:4px 10px;cursor:pointer;transition:all .15s;white-space:nowrap;display:none}\n.vrc-brands-reset.show{display:block}\n.vrc-brands-reset:hover{border-color:rgba(255,255,255,.3);color:rgba(255,255,255,.7)}\n.vrc-brand-hint{font-size:11px;color:rgba(255,255,255,.3);font-style:italic}\n\n\/* \u2500\u2500 FILTRE BUDGET PAR CAT\u00c9GORIE \u2500\u2500 *\/\n.vrc-cat-budget{display:flex;align-items:center;gap:10px;background:var(--gr);border:1px solid var(--gm);border-radius:8px;padding:10px 14px;margin-bottom:14px;flex-wrap:wrap}\n.vrc-cat-budget-label{font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;color:var(--mu);white-space:nowrap;flex-shrink:0}\n.vrc-cat-budget input[type=range]{flex:1;min-width:100px;accent-color:var(--g);cursor:pointer;height:4px}\n.vrc-cat-budget-val{font-family:var(--fh);font-size:15px;font-weight:700;color:var(--g);white-space:nowrap;min-width:80px;text-align:right}\n.vrc-cat-budget-reset{font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;background:none;border:1px solid var(--gm);border-radius:4px;color:var(--mu);padding:3px 8px;cursor:pointer;white-space:nowrap;transition:all .15s;flex-shrink:0}\n.vrc-cat-budget-reset:hover{border-color:#999;color:var(--bk)}\n\n\/* \u2500\u2500 PROGRESSION \u2500\u2500 *\/\n.vrc-prog{background:var(--wh);border-bottom:1px solid var(--gm);display:flex;overflow-x:auto;scrollbar-width:none;position:sticky;top:0;z-index:100}\n.vrc-prog::-webkit-scrollbar{display:none}\n.vrc-ps{display:flex;align-items:center;gap:5px;padding:9px 13px;font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:.7px;text-transform:uppercase;color:var(--mu);cursor:pointer;border-bottom:3px solid transparent;white-space:nowrap;flex-shrink:0;transition:all .15s}\n.vrc-ps:hover{color:var(--bk)}\n.vrc-ps.done{color:var(--gd)}\n.vrc-ps.done .vrc-pn{background:var(--g);color:#fff;border-color:var(--g)}\n.vrc-ps.current{color:var(--bk);border-bottom-color:var(--gm)}\n.vrc-pn{width:17px;height:17px;border-radius:50%;border:2px solid var(--gm);display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;flex-shrink:0;transition:all .15s;font-family:var(--fh)}\n\n\/* \u2500\u2500 CAT\u00c9GORIE \u2500\u2500 *\/\n.vrc-cat{padding:22px 20px 0}\n.vrc-cat-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px;gap:10px;flex-wrap:wrap}\n.vrc-cat-name{font-family:var(--fh);font-size:22px;font-weight:700}\n.vrc-cat-sel{font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;background:var(--gl);color:var(--gd);padding:3px 9px;border-radius:4px;white-space:nowrap}\n.vrc-cat-desc{font-size:12px;color:var(--mu);margin-bottom:12px;line-height:1.5}\n\n.vrc-cat-brand-active{display:inline-flex;align-items:center;gap:6px;font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;background:rgba(29,185,84,.1);color:var(--gd);border:1px solid rgba(29,185,84,.25);padding:3px 10px;border-radius:4px}\n.vrc-cat-no-results{text-align:center;padding:20px;color:var(--mu);font-size:13px;background:var(--gr);border-radius:8px;margin-bottom:16px}\n\n\/* \u2500\u2500 MODE COMPARAISON \u2500\u2500 *\/\n.vrc-cmp-bar{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}\n.vrc-cmp-btn{font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;padding:5px 12px;border-radius:5px;border:1.5px solid var(--gm);background:var(--wh);color:var(--mu);cursor:pointer;transition:all .15s}\n.vrc-cmp-btn.active{background:var(--bk);color:#fff;border-color:var(--bk)}\n.vrc-cmp-btn:hover{border-color:#999}\n.vrc-cmp-hint{font-size:11px;color:var(--mu)}\n\n\/* \u2500\u2500 COMPARATEUR \u2500\u2500 *\/\n.vrc-cmp-table{background:var(--wh);border:1.5px solid var(--gm);border-radius:10px;overflow:hidden;margin-bottom:14px;display:none}\n.vrc-cmp-table.show{display:block}\n.vrc-cmp-table table{width:100%;border-collapse:collapse}\n.vrc-cmp-table th{font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;color:var(--mu);padding:10px 12px;background:var(--gr);text-align:left;border-bottom:1px solid var(--gm)}\n.vrc-cmp-table td{padding:9px 12px;border-bottom:1px solid var(--gm);font-size:12px;vertical-align:middle}\n.vrc-cmp-table tr:last-child td{border-bottom:none}\n.vrc-cmp-table .win{color:var(--gd);font-weight:700}\n\n\/* \u2500\u2500 GRILLE PRODUITS \u2500\u2500 *\/\n.vrc-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:20px}\n@media(max-width:640px){.vrc-grid{grid-template-columns:1fr 1fr}}\n\n\/* \u2500\u2500 CARTE \u2014 s\u00e9lectionnable au clic \u2500\u2500 *\/\n\n@media (max-width:420px) and (pointer:coarse) {\n  .vrc-grid {\n    grid-template-columns: 1fr !important;\n  }\n}\n\n\n.vrc-card{background:var(--wh);border:2px solid var(--gm);border-radius:10px;overflow:hidden;cursor:pointer;position:relative;display:flex;flex-direction:column;opacity:1;transition:opacity .2s,transform .15s,border-color .15s,box-shadow .15s;user-select:none}\n.vrc-card.muted{opacity:.3;pointer-events:none}\n.vrc-card.muted .vrc-card-over-budget{display:flex}\n.vrc-card-over-budget{display:none;position:absolute;inset:0;background:rgba(255,255,255,.88);align-items:center;justify-content:center;font-family:var(--fh);font-size:12px;font-weight:700;color:#c00;text-transform:uppercase;letter-spacing:.8px;z-index:3;pointer-events:none}\n.vrc-card.brand-hidden{display:none}\n.vrc-card.type-hidden{display:none}\n.vrc-card:not(.muted):hover{border-color:#bbb;transform:translateY(-2px);box-shadow:0 6px 20px rgba(0,0,0,.08)}\n.vrc-card.sel{border-color:var(--g);background:#f7fefb;box-shadow:0 4px 20px rgba(29,185,84,.15)}\n.vrc-card.cmp-picked{border-color:#888;background:#fafafa}\n\n\/* Ripple au clic *\/\n.vrc-card:not(.muted):active{transform:scale(.98)}\n\n.vrc-check{position:absolute;top:8px;right:8px;width:22px;height:22px;border-radius:50%;background:var(--g);color:#fff;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s,transform .2s;z-index:2;transform:scale(.5)}\n.vrc-card.sel .vrc-check{opacity:1;transform:scale(1)}\n\n\/* Badge qualit\u00e9 *\/\n.vrc-qbadge{position:absolute;top:8px;left:8px;font-family:var(--fh);font-size:9px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:2px 7px;border-radius:3px;z-index:2}\n.qb-best{background:#fff9e6;color:#b36200;border:1px solid #ffd97a}\n.qb-premium{background:#f0eeff;color:#5b44c0;border:1px solid #c4b8f5}\n.qb-budget{background:#e8f8ef;color:var(--gd);border:1px solid #a8d5b8}\n.qb-promo{background:#fff0f0;color:#c00;border:1px solid #fcc}\n\n\n.vrc-img {\n    height: 260px; \/* mobile-friendly *\/\n}\n\n@media(min-width:700px){\n    .vrc-img {\n        height: 400px;\n    }\n}\n.vrc-img img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .3s}\n.vrc-card:not(.muted):hover .vrc-img img{transform:scale(1.04)}\n\/* Overlay \"clic pour s\u00e9lectionner\" au survol *\/\n.vrc-img-hint{position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.5);color:#fff;font-family:var(--fh);font-size:9px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;text-align:center;padding:4px;opacity:0;transition:opacity .2s;pointer-events:none}\n.vrc-card:not(.muted):not(.sel):hover .vrc-img-hint{opacity:1}\n.vrc-card.sel .vrc-img-hint{display:none}\n\n.vrc-body{padding:10px;flex:1;display:flex;flex-direction:column}\n.vrc-name{font-family:var(--fh);font-size:15px;font-weight:700;margin-bottom:3px;line-height:1.1}\n.vrc-brand-tag{display:inline-block;font-family:var(--fh);font-size:9px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;background:var(--gr);color:var(--mu);border:1px solid var(--gm);padding:1px 6px;border-radius:3px;margin-bottom:4px}\n.vrc-tags-row{display:flex;gap:4px;align-items:center;flex-wrap:wrap;margin-bottom:4px}\n.vrc-avis{font-size:11px;color:#555;line-height:1.4;margin-bottom:7px;font-style:italic}\n.vrc-meta{display:flex;gap:6px;margin-bottom:7px;align-items:center;flex-wrap:wrap}\n.vrc-price{font-size:14px;font-weight:700;color:var(--bk)}\n.vrc-price-old{font-size:11px;color:#aaa;text-decoration:line-through}\n.vrc-weight{font-size:11px;color:var(--mu);background:var(--gr);padding:2px 6px;border-radius:4px}\n.vrc-links{display:flex;gap:4px;flex-wrap:wrap;margin-bottom:9px}\n.vrc-links a{font-size:10px;font-weight:600;padding:2px 7px;border-radius:4px;background:var(--gr);color:#444;border:1px solid var(--gm);transition:background .12s}\n.vrc-links a:hover{background:var(--gm)}\n.vrc-links a.ali{background:#fff0f0;color:#c00;border-color:#fcc}\n.vrc-links a.site{background:#e8f0ff;color:#1a4cb8;border-color:#b8c8f5}\n\n\/* Badge promo code vendeur *\/\n.vrc-promo-vendor{display:flex;align-items:center;gap:6px;background:#fffbe6;border:1.5px dashed #f0c040;border-radius:6px;padding:6px 9px;margin-bottom:8px;cursor:default}\n.vrc-promo-vendor-icon{font-size:13px;flex-shrink:0}\n.vrc-promo-vendor-body{flex:1;min-width:0}\n.vrc-promo-vendor-label{font-size:10px;color:#a07000;font-weight:600;line-height:1.3;margin-bottom:1px}\n.vrc-promo-vendor-code{display:inline-flex;align-items:center;gap:5px;font-family:var(--fh);font-size:13px;font-weight:700;letter-spacing:1px;color:#7a5000;background:#fff3b0;border:1px solid #e8c040;border-radius:4px;padding:2px 8px;cursor:pointer;transition:background .15s;user-select:all}\n.vrc-promo-vendor-code:hover{background:#ffe88a}\n.vrc-promo-vendor-copy{font-size:9px;color:#a07000;opacity:.7;white-space:nowrap;cursor:pointer;font-weight:600;flex-shrink:0}\n.vrc-promo-vendor-copy:hover{opacity:1}\n\n\/* Bouton add *\/\n.vrc-add{margin-top:auto;width:100%;padding:10px 8px;font-family:var(--fh);font-size:14px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;border:none;border-radius:7px;cursor:pointer;transition:all .15s;display:flex;align-items:center;justify-content:center;gap:5px;background:#1a1a1a;color:#fff}\n.vrc-add:hover{background:#333;transform:scale(1.01)}\n.vrc-add:active{transform:scale(.98)}\n.vrc-card.sel .vrc-add{background:var(--g);box-shadow:0 4px 14px rgba(29,185,84,.35)}\n.vrc-card.sel .vrc-add:hover{background:var(--gd)}\n.vrc-add-cmp{margin-top:8px;width:100%;padding:6px;font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;border:1.5px solid var(--gm);border-radius:5px;cursor:pointer;background:var(--wh);color:var(--mu);transition:all .15s}\n.vrc-add-cmp:hover{border-color:#888;color:var(--bk)}\n.vrc-card.cmp-picked .vrc-add-cmp{background:var(--bk);color:#fff;border-color:var(--bk)}\n\n\/* \u2500\u2500 SCROLL AUTO \u2500\u2500 *\/\n.vrc-next-cat{display:none;align-items:center;gap:8px;margin:0 20px 16px;padding:10px 16px;background:var(--gl);border:1px solid rgba(29,185,84,.25);border-radius:8px;cursor:pointer;font-family:var(--fh);font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--gd);transition:background .15s;width:calc(100% - 40px)}\n.vrc-next-cat:hover{background:#c8edd8}\n.vrc-next-cat.show{display:flex}\n.vrc-next-cat-arrow{font-size:16px;margin-left:auto}\n\n\/* \u2500\u2500 BARRES DE STATS \u2500\u2500 *\/\n.vrc-bike-panel{background:var(--wh);border-top:1px solid var(--gm);padding:14px 20px}\n.vrc-bike-inner{max-width:860px;margin:0 auto;display:flex;align-items:stretch;gap:24px;flex-wrap:wrap}\n.vrc-bike-stats{flex:1;min-width:160px;display:flex;gap:24px;flex-wrap:wrap}\n.vrc-bike-stat{min-width:120px;flex:1}\n.vrc-bike-stat-label{font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--mu);margin-bottom:4px}\n.vrc-bike-stat-bar{height:6px;background:var(--gr);border-radius:3px;overflow:hidden}\n.vrc-bike-stat-fill{height:100%;border-radius:3px;background:var(--g);transition:width .4s ease}\n.vrc-bike-stat-val{font-family:var(--fh);font-size:12px;font-weight:700;color:var(--gd);margin-top:3px}\n\n\/* \u2500\u2500 S\u00c9PARATEUR \u2500\u2500 *\/\n.vrc-sep{height:1px;background:var(--gm);margin:0 20px}\n\n\/* \u2500\u2500 STICKY BAR \u2500\u2500 *\/\n.vrc-sticky{position:sticky;bottom:0;background:var(--bk);border-top:2px solid var(--g);padding:10px 20px;z-index:200}\n.vrc-sticky-in{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;max-width:860px;margin:0 auto}\n.vrc-sc{text-align:center}\n.vrc-sl{font-family:var(--fh);font-size:9px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:rgba(255,255,255,.4)}\n.vrc-sv{font-family:var(--fh);font-size:20px;font-weight:700;color:#fff;line-height:1}\n.vrc-sv.grn{color:var(--g)}\n.vrc-sct{font-family:var(--fh);font-size:11px;font-weight:700;text-transform:uppercase;color:rgba(255,255,255,.35)}\n.vrc-sbtns{display:flex;gap:7px;flex-wrap:wrap}\n.vrc-sbtns button{font-family:var(--fh);font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;padding:9px 14px;border-radius:6px;border:none;cursor:pointer;transition:background .15s;white-space:nowrap}\n.vrc-sbp{background:var(--g);color:#fff}.vrc-sbp:hover{background:var(--gd)}\n.vrc-sbs{background:rgba(255,255,255,.1);color:rgba(255,255,255,.75);border:1px solid rgba(255,255,255,.15)!important}.vrc-sbs:hover{background:rgba(255,255,255,.15)}\n\n\/* \u2500\u2500 R\u00c9CAP \u2500\u2500 *\/\n.vrc-recap{background:var(--wh);border-top:1px solid var(--gm);padding:28px 20px 44px}\n.vrc-recap h2{font-family:var(--fh);font-size:26px;font-weight:700;margin-bottom:4px}\n.vrc-recap-sub{font-size:13px;color:var(--mu);margin-bottom:20px}\n.vrc-empty{text-align:center;padding:28px 20px;color:var(--mu);font-size:13px}\n.vrc-empty span{display:block;font-size:36px;margin-bottom:8px}\ntable.vrc-rt{width:100%;border-collapse:collapse}\ntable.vrc-rt th{font-family:var(--fh);font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--mu);text-align:left;padding:8px 10px;border-bottom:2px solid var(--gm);background:var(--gr)}\ntable.vrc-rt td{padding:9px 10px;border-bottom:1px solid var(--gm);font-size:12px;vertical-align:middle}\ntable.vrc-rt tr:last-child td{border-bottom:none}\n.vrc-rthumb{width:36px;height:36px;border-radius:6px;overflow:hidden;flex-shrink:0}\n.vrc-rthumb img{width:100%;height:100%;object-fit:cover}\n.vrc-rtname{font-weight:600;font-size:13px}\n.vrc-rtcat{font-family:var(--fh);font-size:10px;font-weight:700;text-transform:uppercase;color:var(--mu)}\n.vrc-rtp{font-weight:700;font-size:13px;white-space:nowrap}\n.vrc-rtw{color:var(--mu);white-space:nowrap}\n.vrc-rtl a{font-size:10px;font-weight:600;padding:2px 6px;border-radius:3px;background:var(--gr);color:#444;margin-right:3px;text-decoration:none}\n.vrc-rtl a.ali{background:#fff0f0;color:#c00}\n.vrc-rtl a.site{background:#e8f0ff;color:#1a4cb8}\ntr.vrc-tot td{background:var(--bk);color:#fff;font-family:var(--fh);font-size:15px;font-weight:700;border:none!important;padding:14px 10px!important}\ntr.vrc-tot .grn{color:var(--g)}\n.vrc-ract{display:flex;gap:8px;margin-top:16px;flex-wrap:wrap}\n.vrc-ract button{font-family:var(--fh);font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;padding:10px 18px;border-radius:6px;cursor:pointer;transition:background .15s}\n.vra-p{background:var(--g);color:#fff;border:none}.vra-p:hover{background:var(--gd)}\n.vra-s{background:var(--gr);color:var(--bk);border:1px solid var(--gm)}.vra-s:hover{background:var(--gm)}\n.vra-m{background:var(--bk);color:#fff;border:none}.vra-m:hover{background:#222}\n\n\/* \u2500\u2500 MODAL MAIL \u2500\u2500 *\/\n.vrc-modal-bg{display:none;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9999;align-items:center;justify-content:center;padding:20px}\n.vrc-modal-bg.open{display:flex}\n.vrc-modal{background:var(--wh);border-radius:12px;padding:28px;width:100%;max-width:420px;position:relative}\n.vrc-modal h3{font-family:var(--fh);font-size:22px;font-weight:700;margin-bottom:6px}\n.vrc-modal p{font-size:13px;color:var(--mu);margin-bottom:16px;line-height:1.6}\n.vrc-modal label{font-size:12px;font-weight:600;display:block;margin-bottom:4px}\n.vrc-modal input{width:100%;padding:10px 12px;border:1.5px solid var(--gm);border-radius:6px;font-size:14px;font-family:'DM Sans',sans-serif;margin-bottom:14px;outline:none;transition:border .15s}\n.vrc-modal input:focus{border-color:var(--g)}\n.vrc-modal-btns{display:flex;gap:8px}\n.vrc-modal-send{flex:1;background:var(--g);color:#fff;font-family:var(--fh);font-size:14px;font-weight:700;letter-spacing:.7px;text-transform:uppercase;padding:11px;border:none;border-radius:6px;cursor:pointer;transition:background .15s}\n.vrc-modal-send:hover{background:var(--gd)}\n.vrc-modal-cancel{background:var(--gr);color:var(--bk);font-family:var(--fh);font-size:14px;font-weight:700;padding:11px 16px;border:1px solid var(--gm);border-radius:6px;cursor:pointer}\n.vrc-modal-x{position:absolute;top:12px;right:14px;background:none;border:none;font-size:18px;cursor:pointer;color:var(--mu);line-height:1}\n.vrc-toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%);background:var(--bk);color:#fff;font-family:var(--fh);font-size:12px;font-weight:700;letter-spacing:.6px;padding:9px 18px;border-radius:8px;border:1px solid var(--g);opacity:0;transition:opacity .3s;pointer-events:none;white-space:nowrap;z-index:9998}\n.vrc-toast.show{opacity:1}\n\n@media(max-width:480px){\n  .vrc-sbtns button{font-size:10px;padding:7px 10px}\n  .vrc-brands-inner{gap:6px}\n  .vrc-brand-btn{font-size:10px;padding:4px 10px}\n}\n\n\/* === SUPPRESSION DES MARGES LAT\u00c9RALES === *\/\n\n\/* Conteneur principal : plein \u00e9cran *\/\n.vrc {\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n\/* Sections internes : largeur 100% *\/\n.vrc-hero-in,\n.vrc-type-inner,\n.vrc-brands-inner,\n.vrc-sticky-in,\n.vrc-bike-inner {\n    max-width: 100% !important;\n    width: 100% !important;\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n    margin: 0 !important;\n}\n\n\/* Cat\u00e9gories et cartes *\/\n.vrc-cat {\n    padding-left: 10px !important;\n    padding-right: 10px !important;\n}\n\n\/* Grille produits : marge r\u00e9duite *\/\n.vrc-grid {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n}\n\n\/* Supprime le centrage auto *\/\n.vrc-type-inner,\n.vrc-brands-inner,\n.vrc-bike-inner,\n.vrc-sticky-in {\n    margin: 0 !important;\n}\n\n\/* Sur mobile : 100% bord \u00e0 bord *\/\n@media (max-width: 640px){\n    .vrc-cat {\n        padding-left: 5px !important;\n        padding-right: 5px !important;\n    }\n    .vrc-grid {\n        gap: 6px !important;\n    }\n}\n\n<\/style>\n\n<div class=\"vrc\" id=\"vrc-app\">\n\n<!-- HERO -->\n<div class=\"vrc-hero\">\n  <div class=\"vrc-hero-in\">\n    <div class=\"vrc-badge\">Configurateur VeloExotique<\/div>\n    <h1>V\u00e9lo de route <em>carbone<\/em><\/h1>\n    <p>S\u00e9lectionnez un produit par cat\u00e9gorie \u00b7 Budget, poids et r\u00e9cap en temps r\u00e9el<\/p>\n  <\/div>\n<\/div>\n\n<!-- FILTRE TYPE GRAVEL \/ ROUTE -->\n<div class=\"vrc-type-bar\">\n  <div class=\"vrc-type-inner\">\n    <span class=\"vrc-type-label\">Type de v\u00e9lo<\/span>\n    <button class=\"vrc-type-btn route\" id=\"vrc-type-route\" onclick=\"selectType('route')\">&#x1f6b4; Route<\/button>\n    <button class=\"vrc-type-btn gravel\" id=\"vrc-type-gravel\" onclick=\"selectType('gravel')\">&#x1faa8; Gravel<\/button>\n    <button class=\"vrc-type-btn\" id=\"vrc-type-all\" onclick=\"selectType(null)\" style=\"display:none\">\u2715 Tous types<\/button>\n    <span class=\"vrc-type-hint\" id=\"vrc-type-hint\">Filtrez les composants par type de pratique<\/span>\n  <\/div>\n<\/div>\n\n<!-- FILTRE MARQUE GLOBAL -->\n<div class=\"vrc-brands\">\n  <div class=\"vrc-brands-inner\">\n    <span class=\"vrc-brands-label\">Filtrer par marque<\/span>\n    <div id=\"vrc-brand-btns\"><\/div>\n    <button class=\"vrc-brands-reset\" id=\"vrc-brands-reset\" onclick=\"resetBrand()\">\u2715 Toutes les marques<\/button>\n    <span class=\"vrc-brand-hint\" id=\"vrc-brand-hint\">S\u00e9lectionnez une marque pour filtrer<\/span>\n  <\/div>\n<\/div>\n\n<!-- PROGRESSION (sticky) -->\n<div class=\"vrc-prog\" id=\"vrc-prog\"><\/div>\n\n<!-- CAT\u00c9GORIES -->\n<div id=\"vrc-cats\"><\/div>\n\n<!-- BARRES DE STATS -->\n<div class=\"vrc-bike-panel\">\n  <div class=\"vrc-bike-inner\">\n    <div class=\"vrc-bike-stats\">\n      <div class=\"vrc-bike-stat\">\n        <div class=\"vrc-bike-stat-label\">Poids estim\u00e9<\/div>\n        <div class=\"vrc-bike-stat-bar\"><div class=\"vrc-bike-stat-fill\" id=\"vbs-poids\" style=\"width:0%\"><\/div><\/div>\n        <div class=\"vrc-bike-stat-val\" id=\"vbs-poids-val\">\u2014 g<\/div>\n      <\/div>\n      <div class=\"vrc-bike-stat\">\n        <div class=\"vrc-bike-stat-label\">Budget total<\/div>\n        <div class=\"vrc-bike-stat-bar\"><div class=\"vrc-bike-stat-fill\" id=\"vbs-budget\" style=\"width:0%;background:#378ADD\"><\/div><\/div>\n        <div class=\"vrc-bike-stat-val\" id=\"vbs-budget-val\">\u2014 \u20ac<\/div>\n      <\/div>\n      <div class=\"vrc-bike-stat\">\n        <div class=\"vrc-bike-stat-label\">Composants<\/div>\n        <div class=\"vrc-bike-stat-bar\"><div class=\"vrc-bike-stat-fill\" id=\"vbs-comp\" style=\"width:0%;background:#EF9F27\"><\/div><\/div>\n        <div class=\"vrc-bike-stat-val\" id=\"vbs-comp-val\">0 \/ 14<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- R\u00c9CAP -->\n<div class=\"vrc-recap\">\n  <h2>R\u00e9capitulatif de votre configuration<\/h2>\n  <p class=\"vrc-recap-sub\">Tous vos composants s\u00e9lectionn\u00e9s \u2014 prix, poids et liens d'achat directs.<\/p>\n  <div id=\"vrc-recap\"><\/div>\n<\/div>\n\n<!-- STICKY -->\n<div class=\"vrc-sticky\">\n  <div class=\"vrc-sticky-in\">\n    <div class=\"vrc-sct\" id=\"vrc-sct\">0 \/ 14 composants<\/div>\n    <div style=\"display:flex;gap:16px\">\n      <div class=\"vrc-sc\">\n        <div class=\"vrc-sl\">Budget<\/div>\n        <div class=\"vrc-sv grn\" id=\"vrc-sprice\">0 \u20ac<\/div>\n      <\/div>\n      <div class=\"vrc-sc\">\n        <div class=\"vrc-sl\">Poids<\/div>\n        <div class=\"vrc-sv\" id=\"vrc-sweight\">0 g<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"vrc-sbtns\">\n      <button class=\"vrc-sbp\" onclick=\"scrollRecap()\">Voir le r\u00e9cap \u2193<\/button>\n      <button class=\"vrc-sbs\" onclick=\"openModal()\">&#x2709; Envoyer<\/button>\n      <button class=\"vrc-sbs\" onclick=\"resetAll()\">R\u00e9initialiser<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<\/div><!-- fin .vrc -->\n\n<!-- MODAL -->\n<div class=\"vrc-modal-bg\" id=\"vrc-modal\">\n  <div class=\"vrc-modal\">\n    <button class=\"vrc-modal-x\" onclick=\"closeModal()\">\u2715<\/button>\n    <h3>Envoyer ma config<\/h3>\n    <p>Recevez le r\u00e9capitulatif complet \u2014 composants, prix, poids et liens d'achat \u2014 dans votre bo\u00eete mail.<\/p>\n    <label>Votre adresse e-mail<\/label>\n    <input type=\"email\" id=\"vrc-mail-in\" placeholder=\"votre@email.com\">\n    <div class=\"vrc-modal-btns\">\n      <button class=\"vrc-modal-cancel\" onclick=\"closeModal()\">Annuler<\/button>\n      <button class=\"vrc-modal-send\" onclick=\"sendMail()\">&#x2709; Envoyer<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n<div class=\"vrc-toast\" id=\"vrc-toast\"><\/div>\n\n<script>\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\/\/  NOTE : Les codes promo sont des informations \u00e9ditoriales\n\/\/  \u00e0 renseigner directement sur chaque produit via le champ\n\/\/  promo: { code: 'VELO10', label: '-10% sur le site vendeur' }\n\/\/  Ils sont affich\u00e9s sur la vignette pour que le visiteur\n\/\/  les utilise directement sur le site du vendeur.\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\/\/  DONN\u00c9ES\n\/\/  type: 'route' | 'gravel' | 'both'\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nconst CATS = [\n  {\n    id:\"Cadre\", name:\"Kit cadre et fourche\",\n    desc:\"Cadres carbone route et gravel des meilleures marques chinoises.\",\n    products:[\n      { id:\"ican-0\", brand:\"ICAN\", name:\"Flyee\", price:782, weight:867, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/Flyee_road_bike_disc_frame_6.jpg?v=1735996776\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"https:\/\/icancycling.com\/products\/flyee-eu?ref=VELOEXOTIQUE&utm_source=affiliate&variant=49848211341590\", cls:\"site\"}]\n      },\n      { id:\"ican-1\", brand:\"ICAN\", name:\"A9\", price:635, weight:1090, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/IMG_0537.jpg?v=1768890148\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"https:\/\/icancycling.com\/products\/disc-road-bike-frame-a9?ref=VELOEXOTIQUE&utm_source=affiliate\", cls:\"site\"}]\n      },\n      { id:\"ican-2\", brand:\"ICAN\", name:\"A22\", price:635, weight:1058, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/products\/AERODiscRoadFrame-A22_6.jpg?v=1735999119\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"https:\/\/fr.icancycling.com\/products\/aero-disc-road-frame?ref=VELOEXOTIQUE&utm_source=affiliate&variant=39246347272270\", cls:\"site\"}]\n      },\n      { id:\"ican-3\", brand:\"ICAN\", name:\"Graro\", price:782, weight:1095, type:\"gravel\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/Graro_1.jpg?v=1773821908\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"https:\/\/fr.icancycling.com\/products\/gravel-bike-frame-graro?ref=VELOEXOTIQUE&utm_source=affiliate&variant=51110323192086\", cls:\"site\"}]\n      },\n      { id:\"ican-4\", brand:\"ICAN\", name:\"Xgravel\", price:712, weight:1260, type:\"gravel\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/products\/IMG_1451.jpg?v=1736003148\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"https:\/\/fr.icancycling.com\/products\/upgraded-internal-routing-x-gravel-bike-frame?ref=VELOEXOTIQUE&utm_source=affiliate&variant=45393344037142\", cls:\"site\"}]\n      },\n      { id:\"spcycle-11\", brand:\"Spcycle\", name:\"SP-R088 Carbon Road Frameset\", price:520, weight:1170, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/6230\/product\/20241123\/IMG_0607_%E6%8B%B7%E8%B4%9D.jpg\",\n        avis:\"Spcycle - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Spcycle\", u:\"https:\/\/www.sp-cycle.com\/Spcycle-2025-New-R088-Carbon-Road-Bike-Frame-Disc-Brake-Full-Hidden-Cable-UDH-Hanger-Lightweight-Road-Bicycle-Frameset-p6081415.html\", cls:\"site\"}]\n      },\n      { id:\"spcycle-12\", brand:\"Spcycle\", name:\"SP-R065 Aero Carbon Road Frameset\", price:572, weight:1460, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/6230\/product\/20240226\/Spcycle_2024_New_R065_T1000_Full_Carbon_AERO_Road_Disc_Brake_Frameset_1708915705199_0.jpg\",\n        avis:\"Spcycle - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Spcycle\", u:\"https:\/\/www.sp-cycle.com\/Spcycle-2024-New-R065-T1000-Full-Carbon-AERO-Road-Disc-Brake-Frameset-p5521433.html\", cls:\"site\"}]\n      },\n      { id:\"spcycle-13\", brand:\"Spcycle\", name:\"SP-G069 Aero Carbon Gravel Frameset\", price:598, weight:1100, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/6230\/product\/20250426\/Spcycle_G069_Aero_Carbon_Gravel_Bike_Frame_Full_integrated_cable_UDH_hanger_Race_Gravel_bicycle_frameset_with_handlebar_1745647242883_0.jpg\",\n        avis:\"Spcycle - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Spcycle\", u:\"https:\/\/www.sp-cycle.com\/Spcycle-G069-Aero-Carbon-Gravel-Bike-Frame-Full-integrated-cable-UDH-hanger-Race-Gravel-bicycle-frameset-with-handlebar-p6434189.html\", cls:\"site\"}]\n      },\n      { id:\"spcycle-14\", brand:\"Spcycle\", name:\"SP-G026 Carbon Gravel Frameset 2026\", price:511, weight:1100, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/6230\/product\/20251024\/Spcycle_G026_Full_Internal_Cable_Carbon_Gravel_Bike_Frame_2026_New_Down_Tube_Storage_Box_UDH_Hanger_Gravel_Bicycle_Frameset_1761266701262_1.jpg_w540.jpg\",\n        avis:\"Spcycle - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Spcycle\", u:\"https:\/\/www.sp-cycle.com\/Spcycle-G026-Full-Internal-Cable-Carbon-Gravel-Bike-Frame-2026-New-Down-Tube-Storage-Box-UDH-Hanger-Gravel-Bicycle-Frameset-p6791366.html\", cls:\"site\"}]\n      },\n      { id:\"velobuild-15\", brand:\"Velobuild\", name:\"VB-R-268 Aero Carbon Road Frameset\", price:434, weight:1360, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ueeshop.ly200-cdn.com\/u_file\/UPBA\/UPBA916\/2312\/27\/products\/c1077aed1c.jpg\",\n        avis:\"Velobuild - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Velobuild\", u:\"https:\/\/www.velobuild.com\/products\/velobuild-2024-vb-r-268-carbon-fiber-aero-road-frame-disc-integrated-cables\", cls:\"site\"}]\n      },\n      { id:\"velobuild-16\", brand:\"Velobuild\", name:\"VB-R-177 Super Light Carbon Road Frameset\", price:503, weight:1300, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ueeshop.ly200-cdn.com\/u_file\/UPBA\/UPBA916\/2312\/28\/products\/0cb6e697bc.jpg\",\n        avis:\"Velobuild - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Velobuild\", u:\"https:\/\/www.velobuild.com\/products\/2020-vb-r-177-super-light-carbon-fiber-road-frame-disc-version-hidden-cables-custom-paint\", cls:\"site\"}]\n      },\n      { id:\"velobuild-17\", brand:\"Velobuild\", name:\"VB-R-368 AeroTrace Carbon Road Frameset 2026\", price:460, weight:950, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ueeshop.ly200-cdn.com\/u_file\/UPBA\/UPBA916\/2512\/27\/products\/BLACKCHAMELEONCARBONRAODFRAMEAERO6-1051050bef.jpg?x-oss-process=image\/format,webp\/quality,q_100\/resize,m_lfit,h_1000,w_1000\",\n        avis:\"Velobuild - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Velobuild\", u:\"https:\/\/www.velobuild.com\/products\/2026-vb-r-368-carbon-fiber-aero-road-bike-frame-disc-brake\", cls:\"site\"}]\n      },\n      { id:\"velobuild-18\", brand:\"Velobuild\", name:\"VB Racing Gravel Carbon Frameset 2025\", price:416, weight:1050, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ueeshop.ly200-cdn.com\/u_file\/UPBA\/UPBA916\/2504\/23\/products\/carbonfibergravelbikeframe1.jpg?x-oss-process=image\/format,webp\/quality,q_100\/resize,m_lfit,h_800,w_800\",\n        avis:\"Velobuild - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Velobuild\", u:\"https:\/\/www.velobuild.com\/products\/2025-velobuild-carbon-fiber-racing-gravel-bike-frame\", cls:\"site\"}]\n      },\n      { id:\"lightcarbon-19\", brand:\"LightCarbon\", name:\"LCR018-D Endurance Aero Road Frameset\", price:565, weight:1481, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.lightcarbon.com\/js\/htmledit\/kindeditor\/attached\/20250626\/20250626155151_33192.jpg\",\n        avis:\"LightCarbon - S\u00e9lection VeloExotique.\",\n        links:[{l:\"LightCarbon\", u:\"https:\/\/www.lightcarbon.com\/lightcarbon-aero-endurance-disc-brake-road-carbon-frameset-with-integrated-handlebar_p268.html\", cls:\"site\"}]\n      },\n      { id:\"voicevelo-22\", brand:\"VoiceVelo\", name:\"VoiceVelo VFV ECHO VH Aero Road Frameset\", price:1217, weight:1100, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.pandapodium.cc\/wp-content\/uploads\/2025\/11\/VO2-The-Abyss-black-600x600.jpg\",\n        avis:\"VoiceVelo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"VoiceVelo\", u:\"https:\/\/www.pandapodium.cc\/product\/voicevelo-vfv-echo-aero-road-bike-frameset\/\", cls:\"site\"}]\n      },\n      { id:\"voicevelo-23\", brand:\"VoiceVelo\", name:\"VoiceVelo VFV ECHO VO Aero Road Frameset\", price:1391, weight:975, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/cdn.ecommercedns.uk\/files\/5\/263995\/4\/55373564\/vh1-champion-yellow-600x600.png\",\n        avis:\"VoiceVelo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"VoiceVelo\", u:\"https:\/\/www.offthefront.cc\/voice-velo-echo-vo\", cls:\"site\"}]\n      },\n      { id:\"voicevelo-24\", brand:\"VoiceVelo\", name:\"VoiceVelo VFV G-Major Gravel Frameset\", price:1826, weight:800, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.pandapodium.cc\/wp-content\/uploads\/2023\/12\/VG7-600x600.png\",\n        avis:\"VoiceVelo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"VoiceVelo\", u:\"https:\/\/www.pandapodium.cc\/product\/voicevelo-g-major-disc-brake-gravel-frameset\/\", cls:\"site\"}]\n      },\n      { id:\"yoeleo-25\", brand:\"Yoeleo\", name:\"Yoeleo R12 Carbon Road Frameset\", price:0, weight:980, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.yoeleo.com\/cdn\/shop\/files\/01_1_26c49667-560c-4993-9d84-85dd62662b43.jpg?v=1757683368&width=1000\",\n        avis:\"Yoeleo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Yoeleo\", u:\"https:\/\/www.yoeleo.com\", cls:\"site\"}]\n      },\n      { id:\"tantan\/seraph-26\", brand:\"Tantan\/Seraph\", name:\"Seraph TT-R18 Super Light Carbon Road Frameset\", price:477, weight:1643, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/10515\/product\/20241114\/20241114165650730739.webp\",\n        avis:\"Tantan\/Seraph - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Tantan\/Seraph\", u:\"https:\/\/www.seraphbikes.com\/Super-Light-Carbon-Fiber-T1000-Disc-Road-Bike-Frame-TT-R18-UDH-Hanger-T47-Thread-Max-Tire-32C-p5908204.html\", cls:\"site\"}]\n      },\n      { id:\"tantan\/seraph-27\", brand:\"Tantan\/Seraph\", name:\"Seraph TT-X68 Superlight 836g Road Frameset\", price:547, weight:1366, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/10515\/product\/20241023\/Superlight_Disc_Road_Bike_Frame_TT_X68_BSA_Bottom_Bracket_Max_Tire_700_28C_With_Integrated_Handlebar_1729675603434_0.jpg\",\n        avis:\"Tantan\/Seraph - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Tantan\/Seraph\", u:\"https:\/\/www.seraphbikes.com\/\", cls:\"site\"}]\n      },\n      { id:\"tantan\/seraph-28\", brand:\"Tantan\/Seraph\", name:\"Seraph GR201 Carbon Gravel Frameset\", price:503, weight:1100, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/10515\/product\/20260105\/Custom_Paint_Full_Internal_Cable_Disc_Brake_Gravel_Bike_Frame_GR201_UDH_Hanger_T47_Thread_Bottom_Bracket_Max_Tire_700_50C_1767582389239_1.JPG_w360.jpg\",\n        avis:\"Tantan\/Seraph - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Tantan\/Seraph\", u:\"https:\/\/www.seraphbikes.com\/Full-Internal-Cable-Disc-Brake-Gravel-Bike-Frame-GR201-UDH-Hanger-T47-Thread-Bottom-Bracket-Max-Tire-70050C-p6441263.html\", cls:\"site\"}]\n      },\n      { id:\"tantan\/seraph-29\", brand:\"Tantan\/Seraph\", name:\"Seraph GR208 Carbon Gravel Frameset 2025\", price:590, weight:1050, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/usaimages.oss-us-west-1.aliyuncs.com\/10515\/product\/20250918\/Custom_Paint_Carbon_Fiber_Disc_Gravel_Bike_Frame_GR208_Max_Tire_700_50C_UDH_Dropout_With_31_6mm_Seatpost_1758162225264_1.JPG_w720.jpg\",\n        avis:\"Tantan\/Seraph - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Tantan\/Seraph\", u:\"https:\/\/www.seraphbikes.com\/Custom-Paint-Carbon-Fiber-Disc-Gravel-Bike-Frame-GR208-Max-Tire-70050C-UDH-Dropout-With-316mm-Seatpost-p6751135.html\", cls:\"site\"}]\n      },\n      { id:\"trifox-30\", brand:\"Trifox\", name:\"Trifox X18 Carbon Road Frameset\", price:477, weight:1150, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S83c442cdf8b041e0adc66ab1882c99daY.jpg_960x960q75.jpg_.avif\",\n        avis:\"Trifox - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Trifox\", u:\"https:\/\/www.trifoxbike.com\/lightweight-disc-brake-carbon-road-bike-frame-x18\", cls:\"site\"}]\n      },\n      { id:\"elves bike-42\", brand:\"Elves Bike\", name:\"Amanyar\", price:1653, weight:2120, type:\"triathlon\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202409\/1726185991512541501.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"elves bike-43\", brand:\"Elves Bike\", name:\"Falath Exp\", price:1044, weight:1160, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202504\/1744580338770339768.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"elves bike-44\", brand:\"Elves Bike\", name:\"Falath evo+\", price:957, weight:1005, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202412\/1733162022792204024.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"elves bike-45\", brand:\"Elves Bike\", name:\"Eglath\", price:957, weight:980, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202601\/1769041420281563630.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"elves bike-46\", brand:\"Elves Bike\", name:\"Avari\", price:868, weight:980, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202404\/1712101810902387150.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"elves bike-47\", brand:\"Elves Bike\", name:\"Vanyar\", price:859, weight:750, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202309\/1694565820233594163.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"elves bike-48\", brand:\"Elves Bike\", name:\"Mori aerox\", price:868, weight:960, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/elvesbike.com\/attach\/202412\/1734998921675968051.jpg\",\n        avis:\"Elves Bike - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Elves Bike\", u:\"https:\/\/store.elvesbike.com\/collections\/frame\", cls:\"site\"}]\n      },\n      { id:\"winspace-49\", brand:\"Winspace\", name:\"T1600\", price:2400, weight:900, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/73c1a5b3-a4ff-4769-b802-33eb49209a46.jpg?v=1747621745&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n      { id:\"winspace-50\", brand:\"Winspace\", name:\"M6\", price:1499, weight:900, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/chameleon_white.png?v=1772243400&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n      { id:\"winspace-51\", brand:\"Winspace\", name:\"Agile\", price:1180, weight:850, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/Agile-4_575c5ba9-0587-4764-859a-efd3f8ab2ccd.jpg?v=1748507166&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n      { id:\"winspace-52\", brand:\"Winspace\", name:\"SLC5\", price:2800, weight:705, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/5.jpg?v=1771156924&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n      { id:\"winspace-53\", brand:\"Winspace\", name:\"C5 Aero\", price:1480, weight:900, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/C5-Aero.jpg?v=1740310304&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n      { id:\"winspace-54\", brand:\"Winspace\", name:\"G3\", price:1480, weight:950, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/5_08824f1e-9fc7-4b4a-9ab4-23668d14a079.jpg?v=1753683304&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n    ]\n  },\n  {\n    id:\"Roues\", name:\"Roues\",\n    desc:\"Carbone disque ou patins. Jantes 38 \u00e0 60mm selon votre usage.\",\n    products:[\n      { id:\"ican-5\", brand:\"ICAN\", name:\"AERO Disc Road 38mm\", price:674, weight:1324, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/ICAN-AERO-38-Disc_1_d3531586-d04f-4c0b-b125-228ddad0b7bc.jpg?v=1736005354\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"ICAN AERO Disc Series Road Bike Wheels EU Warehouse \u2013 ICAN Cycling\", cls:\"site\"}]\n      },\n      { id:\"ican-6\", brand:\"ICAN\", name:\"AERO Disc Road 40mm\", price:674, weight:1342, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/ICAN_AERO_40_Plus_disc_road_bike_wheels_1.jpg?v=1736000908\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"ICAN AERO Disc Series Road Bike Wheels EU Warehouse \u2013 ICAN Cycling\", cls:\"site\"}]\n      },\n      { id:\"ican-7\", brand:\"ICAN\", name:\"AERO Disc Road 52mm\", price:687, weight:1426, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/ICAN-AERO-52-Disc_1_a1982643-1b3b-41b9-8d7d-19decf336dfb.jpg?v=1736005352\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"ICAN AERO Disc Series Road Bike Wheels EU Warehouse \u2013 ICAN Cycling\", cls:\"site\"}]\n      },\n      { id:\"ican-8\", brand:\"ICAN\", name:\"G25 sl\", price:582, weight:1352, type:\"gravel\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/G25_SL_1.jpg?v=1760692486\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"Paire de roues gravel en carbone ICAN 700C G25 \u2013 ICAN Cycling\", cls:\"site\"}]\n      },\n      { id:\"ican-9\", brand:\"ICAN\", name:\"G50\", price:634, weight:1373, type:\"gravel\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/ICAN_G50_gravel_wheels_1.jpg?v=1761299476\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"Paire de roues gravel en carbone ICAN 700C G50 \u2013 ICAN Cycling\", cls:\"site\"}]\n      },\n      { id:\"csc-20\", brand:\"CSC\", name:\"CSC 50mm Carbon Disc Wheelset\", price:452, weight:1620, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"nan\",\n        avis:\"CSC - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3NPLAix\", cls:\"ali\"}]\n      },\n      { id:\"csc-21\", brand:\"CSC\", name:\"CSC 38 mm\", price:287, weight:1470, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S56768aabfd6a4a0abe482f66b339e52eQ.jpg_960x960q75.jpg_.avif\",\n        avis:\"CSC - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3NPLAix\", cls:\"ali\"}]\n      },\n      { id:\"winspace-55\", brand:\"Winspace\", name:\"Route de Lun\", price:530, weight:1561, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/Lun-Road-60mm-Disc-Brake-Wheelset_01_08e31304-9441-4b5b-b50e-14475a05e74c.jpg?v=1735786032&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n      { id:\"winspace-56\", brand:\"Winspace\", name:\"L\u00fan MEGA\", price:2262, weight:1375, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/www.winspace.cc\/cdn\/shop\/files\/D45_6a0fcdbe-eea9-41f3-a96c-aebf666d6aed.jpg?v=1749783843&width=1800\",\n        avis:\"Winspace - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Winspace\", u:\"https:\/\/www.winspace.cc\/fr?srsltid=AfmBOopftN9ov1qdMrGoAlItAVxmEq53GfHpUH2-BOXtp4xTba08RtPN\", cls:\"site\"}]\n      },\n    ]\n  },\n  {\n    id:\"Groupe\", name:\"Groupes\",\n    desc:\"Trouvez votre prochain groupe, \u00e9lectrique ou m\u00e9canique?\",\n    products:[\n      { id:\"shimano-57\", brand:\"Shimano\", name:\"Shimano Ultegra Di2\", price:1299, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/product-cdn-frz.alltricks.com\/hd\/617\/79617\/3079617\/6696203\",\n        avis:\"Shimano - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Shimano\", u:\"https:\/\/www.alltricks.fr\/F-46287-groupes\/P-3245125-groupe_shimano_ultegra_di2_r8170_2x12v___50_34_dents___11_34_dents__avec_partie_electrique\", cls:\"site\"}]\n      },\n      { id:\"sram-58\", brand:\"Sram\", name:\"Force AXS\", price:1349, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/product-cdn-frz.alltricks.com\/hd\/905\/830905\/2830905\/6259028\",\n        avis:\"Sram - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Sram\", u:\"https:\/\/www.alltricks.fr\/F-46287-groupes\/P-3085846-groupe_sram_force_axs_e1_2x12v\", cls:\"site\"}]\n      },\n      { id:\"sram-59\", brand:\"Sram\", name:\"Force eTap\", price:1499, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/product-cdn-frz.alltricks.com\/hd\/337\/463337\/2463337\/4754054\",\n        avis:\"Sram - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Sram\", u:\"https:\/\/www.alltricks.fr\/F-46287-groupes\/P-2534593-groupe_sram_force_etap_axs_d2_2x12v\", cls:\"site\"}]\n      },\n      { id:\"sram-60\", brand:\"Sram\", name:\"Red\", price:1784, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/product-cdn-frz.alltricks.com\/hd\/813\/224813\/2224813\/4108113\",\n        avis:\"Sram - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Sram\", u:\"https:\/\/www.alltricks.fr\/F-46287-groupes\/P-2138408-groupe_sram_red_etap_axs_hydraulique_disc_6_trous_2x12v\", cls:\"site\"}]\n      },\n      { id:\"campagnolo-61\", brand:\"Campagnolo\", name:\"Super Record\", price:1999, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/product-cdn-frz.alltricks.com\/large\/555\/997555\/2997555\/6648787\",\n        avis:\"Campagnolo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Campagnolo\", u:\"https:\/\/www.alltricks.fr\/F-46287-groupes\/P-3216122-groupe_campagnolo_super_record_1x13v__avec_batterie\", cls:\"site\"}]\n      },\n      { id:\"campagnolo-62\", brand:\"Campagnolo\", name:\"Super Record wireless\", price:2487, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/product-cdn-frz.alltricks.com\/large\/211\/911211\/2911211\/6205589\",\n        avis:\"Campagnolo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"Campagnolo\", u:\"https:\/\/www.alltricks.fr\/F-46287-groupes\/P-3071664-groupe_campagnolo_super_record_wireless_2x12v___48_32_dents___10_29_dents___bb386_pf86_5__avec_partie_electrique\", cls:\"site\"}]\n      },\n      { id:\"wheeltop-63\", brand:\"WheelTop\", name:\"EDS TX\", price:659, weight:0, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/wheeltop.com\/cdn\/shop\/files\/TX7800-daily.jpg?v=1766736267\",\n        avis:\"WheelTop - S\u00e9lection VeloExotique.\",\n        links:[{l:\"WheelTop\", u:\"https:\/\/wheeltop.com\/fr\/products\/eds-bicycle-derailleur\", cls:\"site\"}]\n      },\n      { id:\"wheeltop-64\", brand:\"WheelTop\", name:\"EDS GeX\", price:599, weight:0, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/wheeltop.com\/cdn\/shop\/files\/6700-daily.jpg?v=1766736267\",\n        avis:\"WheelTop - S\u00e9lection VeloExotique.\",\n        links:[{l:\"WheelTop\", u:\"https:\/\/wheeltop.com\/fr\/products\/wheel-top-eds-gex\", cls:\"site\"}]\n      },\n    ]\n  },\n  {\n    id:\"Guidon\", name:\"Guidon\",\n    desc:\"Carbone int\u00e9gr\u00e9 ou cintre classique. D\u00e9finit votre position sur le v\u00e9lo.\",\n    products:[\n      { id:\"ican-10\", brand:\"ICAN\", name:\"Blade-G\", price:172, weight:375, type:\"route\",\n        badge:\"best\", badgeLabel:\"Code -20%\",\n        promo:{ code:\"LEBOURDONNECMIC\", label:\"Prix promo jusqu'a -20%\" },\n        img:\"https:\/\/icancycling.com\/cdn\/shop\/files\/ICANIntegraedhandlebarBlade-G_6.jpg?v=1755675948\",\n        avis:\"ICAN - S\u00e9lection VeloExotique.\",\n        links:[{l:\"ICAN\", u:\"Guidon int\u00e9gr\u00e9 Blade-G EU \u2013 ICAN Cycling\", cls:\"site\"}]\n      },\n      { id:\"kocevlo-31\", brand:\"Kocevlo\", name:\"Cintre route\", price:45, weight:380, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/Sff831a7a106a4b0e9214dba2ac078e570.jpg_960x960q75.jpg_.avif\",\n        avis:\"Kocevlo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c4ExgwlH\", cls:\"ali\"}]\n      },\n      { id:\"toseek-35\", brand:\"Toseek\", name:\"Cintre int\u00e9gr\u00e9\", price:81, weight:385, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/Sb6430e2c87e34d6381a8968af80e7c3aL.jpg\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c4rRiw0x\", cls:\"ali\"}]\n      },\n      { id:\"toseek-37\", brand:\"Toseek\", name:\"TR30\", price:38, weight:260, type:\"route\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S83504b5637d54435bdf8a54d71f94654z.jpg_960x960q75.jpg_.avif\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c2JGVf9Z\", cls:\"ali\"}]\n      },\n      { id:\"toseek-40\", brand:\"Toseek\", name:\"Cintre\", price:41, weight:240, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S227205186bac4467ab4df605a3a28a56o.jpg_960x960q75.jpg_.avif\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3p5V6Cb\", cls:\"ali\"}]\n      },\n    ]\n  },\n  {\n    id:\"Potence\", name:\"Potence\",\n    desc:\"Potence pour votre v\u00e9lo\",\n    products:[\n      { id:\"toseek-36\", brand:\"Toseek\", name:\"Potence\", price:40, weight:150, type:\"gravel\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/Sd11bbaa62ec44419b80ba03ffdfb2b6fZ.jpg\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3YAq9dZ\", cls:\"ali\"}]\n      },\n    ]\n  },\n  {\n    id:\"Tige de selle\", name:\"Tige de selle\",\n    desc:\"Tige de selle pour votre v\u00e9lo\",\n    products:[\n      { id:\"toseek-38\", brand:\"Toseek\", name:\"ZF-one\", price:18, weight:200, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S0ee5f9f4d8704cab9ce4be53e89fdadcH.jpg_960x960q75.jpg_.avif\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3MpuApN\", cls:\"ali\"}]\n      },\n      { id:\"toseek-39\", brand:\"Toseek\", name:\"tige de selle\", price:25, weight:200, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/Se1a4c6213b794a6cb3406a968d3364ecA.jpg_960x960q75.jpg_.avif\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c45bS5Hv\", cls:\"ali\"}]\n      },\n    ]\n  },\n  {\n    id:\"Selle\", name:\"Selle\",\n    desc:\"Selles pour votre v\u00e9lo\",\n    products:[\n      { id:\"kocevlo-33\", brand:\"Kocevlo\", name:\"RO 3D\", price:32, weight:165, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S1144ef49e5604b2d89fb19312d995aa4O.jpg\",\n        avis:\"Kocevlo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c4lr791t\", cls:\"ali\"}]\n      },\n      { id:\"kocevlo-34\", brand:\"Kocevlo\", name:\"m5\", price:19, weight:125, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S493f51e0353a411cac26248390678a9bh.jpg_960x960q75.jpg_.avif\",\n        avis:\"Kocevlo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c4VdJK4F\", cls:\"ali\"}]\n      },\n      { id:\"toseek-41\", brand:\"Toseek\", name:\"Selle\", price:18, weight:221, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/S4ea06bac481d438aac681c267816e0ebR.jpg_960x960q75.jpg_.avif\",\n        avis:\"Toseek - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3fkkPhD\", cls:\"ali\"}]\n      },\n    ]\n  },\n  {\n    id:\"Porte bidon\", name:\"Porte bidon\",\n    desc:\"Porte bidon pour votre v\u00e9lo\",\n    products:[\n      { id:\"kocevlo-32\", brand:\"Kocevlo\", name:\"RXL\", price:7, weight:22, type:\"both\",\n        \n        promo:{ code:\"\", label:\"\" },\n        img:\"https:\/\/ae-pic-a1.aliexpress-media.com\/kf\/Sea3e0aafe875499883e6411c0207578eU.jpg\",\n        avis:\"Kocevlo - S\u00e9lection VeloExotique.\",\n        links:[{l:\"AliExpress\", u:\"https:\/\/s.click.aliexpress.com\/e\/_c3hOlR0n\", cls:\"ali\"}]\n      },\n    ]\n  },\n];\n\nconst CAT_BUDGET_RANGE = {\n  cadre:[200,2000,50],roues:[100,1500,50],chambre:[5,30,1],pneu:[20,120,5],\n  potence:[20,300,10],guidon:[50,500,10],tige:[30,250,10],selle:[30,300,10],\n  portebid:[10,80,5],groupe:[300,2500,50],cassette:[30,300,10],\n  pedalier:[80,600,20],pedales:[30,250,10],guidoline:[10,60,5],\n};\n\n\/\/ \u2500\u2500 \u00c9TAT \u2500\u2500\nconst SEL      = {};\nconst CMP      = {};\nconst CMP_MODE = {};\nconst BUDGETS  = {};\nlet   BRAND    = null;\nlet   TYPE_FILTER = null; \/\/ 'route' | 'gravel' | null\n\n\/\/ \u2500\u2500 UTILITAIRES \u2500\u2500\nconst fmt  = n => n.toLocaleString('fr-FR');\nconst fmtW = g => g >= 1000 ? (g\/1000).toFixed(2).replace('.',',')+' kg' : g+' g';\n\nfunction totalPrice()  { return Object.values(SEL).reduce((s,p)=>s+p.price, 0); }\nfunction totalWeight() { return Object.values(SEL).reduce((s,p)=>s+p.weight, 0); }\nfunction selCount()    { return Object.keys(SEL).length; }\n\nfunction allBrands(){\n  const set = new Set();\n  CATS.forEach(c => c.products.forEach(p => { if(p.brand) set.add(p.brand); }));\n  return [...set].sort();\n}\n\n\n\n\/\/ \u2500\u2500 SAVE \/ RESTORE \u2500\u2500\nfunction save(){\n  try{\n    const data = {};\n    Object.entries(SEL).forEach(([k,p])=>{ data[k]=p.id; });\n    localStorage.setItem('vrc_sel',      JSON.stringify(data));\n    localStorage.setItem('vrc_budgets',  JSON.stringify(BUDGETS));\n    localStorage.setItem('vrc_brand',    BRAND || '');\n    localStorage.setItem('vrc_type',     TYPE_FILTER || '');\n  }catch(e){}\n}\nfunction restore(){\n  try{\n    const rawB = localStorage.getItem('vrc_budgets');\n    if(rawB) Object.assign(BUDGETS, JSON.parse(rawB));\n    const rawBrand = localStorage.getItem('vrc_brand');\n    if(rawBrand) BRAND = rawBrand || null;\n    const rawType = localStorage.getItem('vrc_type');\n    if(rawType) TYPE_FILTER = rawType || null;\n    const raw = localStorage.getItem('vrc_sel');\n    if(!raw) return;\n    const data = JSON.parse(raw);\n    Object.entries(data).forEach(([cid,pid])=>{\n      const cat  = CATS.find(c=>c.id===cid);\n      if(!cat) return;\n      const prod = cat.products.find(p=>p.id===pid);\n      if(prod) SEL[cid] = prod;\n    });\n    if(Object.keys(SEL).length) showToast('\u2713 Configuration restaur\u00e9e');\n  }catch(e){}\n}\n\n\/\/ \u2500\u2500 SCROLL AUTO \u2500\u2500\nlet scrollTimeout = null;\nfunction scrollToNextCat(currentCatId){\n  const idx = CATS.findIndex(c=>c.id===currentCatId);\n  if(idx < 0 || idx >= CATS.length - 1) return;\n  const nextCat = CATS[idx + 1];\n  const nextEl  = document.getElementById('sec-'+nextCat.id);\n  if(!nextEl) return;\n  clearTimeout(scrollTimeout);\n  scrollTimeout = setTimeout(()=>{\n    const top = nextEl.getBoundingClientRect().top + window.scrollY - 56;\n    window.scrollTo({ top, behavior:'smooth' });\n  }, 350);\n}\n\n\/\/ \u2500\u2500 FILTRE TYPE \u2500\u2500\nfunction selectType(type){\n  TYPE_FILTER = type;\n  save();\n  renderTypeFilter();\n  renderCats();\n  renderProg();\n}\n\nfunction renderTypeFilter(){\n  const btnRoute  = document.getElementById('vrc-type-route');\n  const btnGravel = document.getElementById('vrc-type-gravel');\n  const btnAll    = document.getElementById('vrc-type-all');\n  const hint      = document.getElementById('vrc-type-hint');\n  if(!btnRoute) return;\n  btnRoute.classList.toggle('active', TYPE_FILTER === 'route');\n  btnGravel.classList.toggle('active', TYPE_FILTER === 'gravel');\n  btnAll.style.display = TYPE_FILTER ? 'inline-flex' : 'none';\n  hint.style.display   = TYPE_FILTER ? 'none' : 'inline';\n}\n\n\/\/ \u2500\u2500 FILTRE MARQUE \u2500\u2500\nfunction renderBrandFilter(){\n  const brands = allBrands();\n  const wrap  = document.getElementById('vrc-brand-btns');\n  const reset = document.getElementById('vrc-brands-reset');\n  const hint  = document.getElementById('vrc-brand-hint');\n  if(!wrap) return;\n  wrap.innerHTML = brands.map(b=>`\n    <button class=\"vrc-brand-btn ${BRAND===b?'active':''}\"\n      onclick=\"selectBrand('${b}')\">${b}<\/button>\n  `).join('');\n  reset.classList.toggle('show', !!BRAND);\n  hint.style.display = BRAND ? 'none' : 'inline';\n}\n\nfunction selectBrand(brand){\n  BRAND = (BRAND === brand) ? null : brand;\n  if(BRAND) trackEvent('filtre_marque', 'Configurateur', brand);\n  save(); renderBrandFilter(); renderCats(); renderProg();\n}\nfunction resetBrand(){\n  BRAND = null; save(); renderBrandFilter(); renderCats(); renderProg();\n}\n\n\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\/\/  RENDU\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nfunction render(){\n  renderBrandFilter();\n  renderTypeFilter();\n  renderProg();\n  renderCats();\n  renderRecap();\n  renderSticky();\n  renderStats();\n}\n\nfunction renderProg(){\n  document.getElementById('vrc-prog').innerHTML = CATS.map((c,i)=>{\n    const done = !!SEL[c.id];\n    return `<div class=\"vrc-ps ${done?'done':''}\" onclick=\"scrollCat('${c.id}')\">\n      <span class=\"vrc-pn\">${done?'\u2713':i+1}<\/span>${c.name}\n    <\/div>`;\n  }).join('');\n}\n\nfunction renderCats(){\n  document.getElementById('vrc-cats').innerHTML = CATS.map(c=>{\n    const s        = SEL[c.id];\n    const cmpOn    = CMP_MODE[c.id];\n    const cmpItems = CMP[c.id] || [];\n    const range    = CAT_BUDGET_RANGE[c.id] || [10, 2000, 50];\n    const maxPrice = Math.max(...c.products.map(p=>p.price));\n    const sliderMax  = Math.max(range[1], maxPrice);\n    const budgetVal  = BUDGETS[c.id] || null;\n    const sliderVal  = budgetVal || sliderMax;\n    const budgetLabel = budgetVal ? fmt(budgetVal)+' \u20ac' : 'Sans limite';\n\n    \/\/ Filtres visibilit\u00e9\n    const visibleProds = c.products.filter(p => {\n      const brandOk = !BRAND || p.brand === BRAND;\n      const typeOk  = !TYPE_FILTER || p.type === TYPE_FILTER || p.type === 'both';\n      return brandOk && typeOk;\n    });\n    const hasVisible = visibleProds.length > 0;\n\n    const brandBadge = BRAND && hasVisible\n      ? `<span class=\"vrc-cat-brand-active\">&#x1f3f7; ${BRAND}<\/span>`\n      : BRAND && !hasVisible\n      ? `<span class=\"vrc-cat-brand-active\" style=\"opacity:.5\">Aucun produit ${BRAND}<\/span>`\n      : '';\n\n    const nextIdx = CATS.indexOf(c);\n    const nextCat = CATS[nextIdx + 1];\n    const nextBtn = s && nextCat\n      ? `<button class=\"vrc-next-cat show\" onclick=\"scrollCat('${nextCat.id}')\">\n           \u00c9tape suivante : ${nextCat.name}\n           <span class=\"vrc-next-cat-arrow\">\u2193<\/span>\n         <\/button>`\n      : '';\n\n    const noResultsMsg = (BRAND || TYPE_FILTER) && !hasVisible\n      ? `<div class=\"vrc-cat-no-results\">Aucun produit correspondant aux filtres actifs dans cette cat\u00e9gorie.<\/div>`\n      : '';\n\n    return `\n      <div class=\"vrc-cat\" id=\"sec-${c.id}\">\n        <div class=\"vrc-cat-hd\">\n          <div class=\"vrc-cat-name\">${c.name}<\/div>\n          <div style=\"display:flex;gap:8px;align-items:center;flex-wrap:wrap\">\n            ${brandBadge}\n            ${s?`<span class=\"vrc-cat-sel\">\u2713 ${s.name}<\/span>`:''}\n          <\/div>\n        <\/div>\n        <div class=\"vrc-cat-desc\">${c.desc}<\/div>\n        <div class=\"vrc-cat-budget\">\n          <span class=\"vrc-cat-budget-label\">Budget max<\/span>\n          <input type=\"range\" min=\"${range[0]}\" max=\"${sliderMax}\" step=\"${range[2]}\"\n            value=\"${sliderVal}\" data-cat=\"${c.id}\" oninput=\"onBudgetChange(this)\">\n          <span class=\"vrc-cat-budget-val\" id=\"bval-${c.id}\">${budgetLabel}<\/span>\n          ${budgetVal?`<button class=\"vrc-cat-budget-reset\" onclick=\"resetBudget('${c.id}')\">\u21ba R\u00e9initialiser<\/button>`:''}\n        <\/div>\n        <div class=\"vrc-cmp-bar\">\n          <button class=\"vrc-cmp-btn ${cmpOn?'active':''}\" onclick=\"toggleCmp('${c.id}')\">\n            ${cmpOn?'\u2715 Fermer comparaison':'\u21c4 Comparer 2 produits'}\n          <\/button>\n          ${cmpOn?'<span class=\"vrc-cmp-hint\">Cochez jusqu\\'\u00e0 2 produits \u00e0 comparer<\/span>':''}\n        <\/div>\n        ${cmpOn && cmpItems.length===2 ? renderCmpTable(c, cmpItems) : ''}\n        ${noResultsMsg}\n        <div class=\"vrc-grid\">\n          ${c.products.map(p=>renderCard(c.id, p, cmpOn, cmpItems, visibleProds)).join('')}\n        <\/div>\n      <\/div>\n      ${nextBtn}\n      <div class=\"vrc-sep\"><\/div>`;\n  }).join('');\n\n  \/\/ \u2500\u2500 Events clics sur la carte enti\u00e8re (s\u00e9lection au clic) \u2500\u2500\n  document.querySelectorAll('.vrc-card').forEach(card => {\n    card.addEventListener('click', e => {\n      \/\/ Ne pas d\u00e9clencher si on clique sur un lien, un input, un bouton interne autre que add\n      if(e.target.closest('a')) return;\n      if(e.target.closest('input')) return;\n      if(e.target.closest('.vrc-add-cmp')) return;\n      if(e.target.closest('.vrc-promo-vendor')) return;\n      const cid  = card.dataset.c;\n      const pid  = card.dataset.p;\n      const cat  = CATS.find(c=>c.id===cid);\n      const prod = cat.products.find(p=>p.id===pid);\n      const wasSelected = SEL[cid] && SEL[cid].id===pid;\n      if(wasSelected){\n        delete SEL[cid];\n        trackEvent('retrait_produit','Configurateur',`${cat.name} \u2014 ${prod.name}`,prod.price);\n      } else {\n        SEL[cid] = prod;\n        trackEvent('ajout_produit','Configurateur',`${cat.name} \u2014 ${prod.name}`,prod.price);\n        scrollToNextCat(cid);\n      }\n      save(); render();\n    });\n  });\n\n  \/\/ \u2500\u2500 Events boutons add (stop propagation pour \u00e9viter double d\u00e9clenchement) \u2500\u2500\n  document.querySelectorAll('.vrc-add').forEach(btn=>{\n    btn.addEventListener('click', e=>{\n      e.stopPropagation();\n      const cid  = btn.dataset.c;\n      const pid  = btn.dataset.p;\n      const cat  = CATS.find(c=>c.id===cid);\n      const prod = cat.products.find(p=>p.id===pid);\n      const wasSelected = SEL[cid] && SEL[cid].id===pid;\n      if(wasSelected){\n        delete SEL[cid];\n        trackEvent('retrait_produit','Configurateur',`${cat.name} \u2014 ${prod.name}`,prod.price);\n      } else {\n        SEL[cid] = prod;\n        trackEvent('ajout_produit','Configurateur',`${cat.name} \u2014 ${prod.name}`,prod.price);\n        scrollToNextCat(cid);\n      }\n      save(); render();\n    });\n  });\n\n  \/\/ \u2500\u2500 Events boutons comparaison \u2500\u2500\n  document.querySelectorAll('.vrc-add-cmp').forEach(btn=>{\n    btn.addEventListener('click', e=>{\n      e.stopPropagation();\n      const cid = btn.dataset.c, pid = btn.dataset.p;\n      if(!CMP[cid]) CMP[cid]=[];\n      const idx = CMP[cid].indexOf(pid);\n      if(idx>=0){ CMP[cid].splice(idx,1); }\n      else if(CMP[cid].length<2){ CMP[cid].push(pid); }\n      else { CMP[cid]=[CMP[cid][1],pid]; }\n      render();\n    });\n  });\n\n  \/\/ \u2500\u2500 COMPARAISON \u2500\u2500\n  document.querySelectorAll('.vrc-links a').forEach(a=>{\n    a.addEventListener('click', ()=>{\n      trackEvent('clic_lien_achat','Configurateur',`${a.textContent.trim()} \u2014 ${a.href}`);\n    });\n  });\n}\n\nfunction renderCard(cid, p, cmpOn, cmpItems, visibleProds){\n  const isSel      = SEL[cid] && SEL[cid].id===p.id;\n  const isCmp      = cmpItems.includes(p.id);\n  const catBudget  = BUDGETS[cid] || null;\n  const overBudget = catBudget && p.price > catBudget;\n  const isHidden   = !visibleProds.includes(p);\n  const wStr       = fmtW(p.weight);\n\n  const links = p.links.map(l=>\n    `<a class=\"${l.cls||''}\" href=\"${l.u}\" target=\"_blank\"\n       onclick=\"event.stopPropagation()\">${l.l}<\/a>`\n  ).join('');\n\n  const badgeMap = {best:'qb-best',premium:'qb-premium',budget:'qb-budget',promo:'qb-promo'};\n  const oldPriceHtml = p.oldprice\n    ? `<span class=\"vrc-price-old\">${fmt(p.oldprice)} \u20ac<\/span>`\n    : '';\n  const brandTag = p.brand ? `<span class=\"vrc-brand-tag\">${p.brand}<\/span>` : '';\n\n  \/\/ Badge type\n  const typeLabels = { route:'&#x1f6b4; Route', gravel:'&#x1faa8; Gravel', both:'&#x1f6b4; Route \u00b7 &#x1faa8; Gravel' };\n  const typeClass  = { route:'route', gravel:'gravel', both:'both' };\n  const typeBadge  = p.type\n    ? `<span class=\"vrc-type-tag ${typeClass[p.type]||'both'}\">${typeLabels[p.type]||''}<\/span>`\n    : '';\n\n  \/\/ Badge code promo \u00e9ditorial \u2014 information pour le visiteur, \u00e0 utiliser sur le site vendeur\n  const promoVendor = p.promo\n    ? `<div class=\"vrc-promo-vendor\" onclick=\"event.stopPropagation();copyPromoCode('${p.promo.code}')\">\n         <span class=\"vrc-promo-vendor-icon\">&#x1f3f7;<\/span>\n         <div class=\"vrc-promo-vendor-body\">\n           <div class=\"vrc-promo-vendor-label\">${p.promo.label}<\/div>\n           <span class=\"vrc-promo-vendor-code\">${p.promo.code}<\/span>\n         <\/div>\n         <span class=\"vrc-promo-vendor-copy\">Copier<\/span>\n       <\/div>`\n    : '';\n\n  return `\n    <div class=\"vrc-card ${isSel?'sel':''} ${isCmp?'cmp-picked':''} ${overBudget?'muted':''} ${isHidden?'brand-hidden type-hidden':''}\"\n         data-c=\"${cid}\" data-p=\"${p.id}\">\n      <span class=\"vrc-check\">\u2713<\/span>\n      ${p.badge?`<span class=\"vrc-qbadge ${badgeMap[p.badge]||'qb-best'}\">${p.badgeLabel}<\/span>`:''}\n      <div class=\"vrc-card-over-budget\">Hors budget<\/div>\n      <div class=\"vrc-img\">\n        <img decoding=\"async\" src=\"${p.img}\" alt=\"${p.name}\" loading=\"lazy\">\n        <div class=\"vrc-img-hint\">Cliquer pour s\u00e9lectionner<\/div>\n      <\/div>\n      <div class=\"vrc-body\">\n        <div class=\"vrc-tags-row\">\n          ${brandTag}\n          ${typeBadge}\n        <\/div>\n        <div class=\"vrc-name\">${p.name}<\/div>\n        ${p.avis?`<div class=\"vrc-avis\">\"${p.avis}\"<\/div>`:''}\n        <div class=\"vrc-meta\">\n          <span class=\"vrc-price\">${fmt(p.price)} \u20ac<\/span>\n          ${oldPriceHtml}\n          <span class=\"vrc-weight\">&#x2696; ${wStr}<\/span>\n        <\/div>\n        ${promoVendor}\n        <div class=\"vrc-links\">${links}<\/div>\n        <button class=\"vrc-add\" data-c=\"${cid}\" data-p=\"${p.id}\">\n          ${isSel?'\u2713 S\u00e9lectionn\u00e9':'+ Ajouter \u00e0 ma config'}\n        <\/button>\n        ${cmpOn?`<button class=\"vrc-add-cmp\" data-c=\"${cid}\" data-p=\"${p.id}\">\n          ${isCmp?'\u2715 Retirer':'\u21c4 Comparer'}\n        <\/button>`:''}\n      <\/div>\n    <\/div>`;\n}\n\nfunction renderCmpTable(cat, ids){\n  const prods = ids.map(id=>cat.products.find(p=>p.id===id)).filter(Boolean);\n  if(prods.length<2) return '';\n  const [a,b] = prods;\n  const rows = [\n    ['Prix',  fmt(a.price)+' \u20ac', fmt(b.price)+' \u20ac', a.price<b.price?0:1],\n    ['Poids', fmtW(a.weight),    fmtW(b.weight),    a.weight<b.weight?0:1],\n  ];\n  return `\n    <div class=\"vrc-cmp-table show\">\n      <table>\n        <thead><tr><th>Crit\u00e8re<\/th><th>${a.name}<\/th><th>${b.name}<\/th><\/tr><\/thead>\n        <tbody>\n          ${rows.map(([label,va,vb,win])=>`\n            <tr>\n              <td>${label}<\/td>\n              <td class=\"${win===0?'win':''}\">${va}<\/td>\n              <td class=\"${win===1?'win':''}\">${vb}<\/td>\n            <\/tr>`).join('')}\n        <\/tbody>\n      <\/table>\n    <\/div>`;\n}\n\nfunction renderSticky(){\n  const tp=totalPrice(), tw=totalWeight(), cnt=selCount();\n  document.getElementById('vrc-sprice').textContent  = fmt(tp)+' \u20ac';\n  document.getElementById('vrc-sweight').textContent = fmtW(tw);\n  document.getElementById('vrc-sct').textContent     = cnt+' \/ '+CATS.length+' composants';\n}\n\nfunction renderStats(){\n  const tp=totalPrice(), tw=totalWeight(), cnt=selCount();\n  const maxP=6000, maxW=12000, maxC=CATS.length;\n  const pct=(v,m)=>Math.min(100,Math.round(v\/m*100));\n  const setBar=(id,p)=>{ const el=document.getElementById(id); if(el) el.style.width=p+'%'; };\n  setBar('vbs-poids',  pct(tw,maxW));\n  setBar('vbs-budget', pct(tp,maxP));\n  setBar('vbs-comp',   pct(cnt,maxC));\n  const setVal=(id,v)=>{ const el=document.getElementById(id); if(el) el.textContent=v; };\n  setVal('vbs-poids-val',  tw ? fmtW(tw)      : '\u2014 g');\n  setVal('vbs-budget-val', tp ? fmt(tp)+' \u20ac'  : '\u2014 \u20ac');\n  setVal('vbs-comp-val',   cnt+' \/ '+maxC);\n}\n\nfunction renderRecap(){\n  const el    = document.getElementById('vrc-recap');\n  const items = CATS.map(c=>({c,p:SEL[c.id]})).filter(x=>x.p);\n  if(!items.length){\n    el.innerHTML = `<div class=\"vrc-empty\"><span>&#x1f6b2;<\/span>S\u00e9lectionnez vos composants ci-dessus pour construire votre r\u00e9cap.<\/div>`;\n    return;\n  }\n  const tp=totalPrice(), tw=totalWeight();\n  const rows = items.map(({c,p})=>{\n    const promoInfo = p.promo\n      ? `<span style=\"display:block;font-size:10px;color:#a07000;font-weight:600;margin-top:2px\">&#x1f3f7; Code : ${p.promo.code} \u2014 ${p.promo.label}<\/span>`\n      : '';\n    return `<tr>\n      <td><div style=\"display:flex;align-items:center;gap:10px\">\n        <div class=\"vrc-rthumb\"><img decoding=\"async\" src=\"${p.img}\" alt=\"${p.name}\"><\/div>\n        <div>\n          <div class=\"vrc-rtcat\">${c.name}<\/div>\n          <div class=\"vrc-rtname\">${p.name}<\/div>\n          ${p.brand?`<div style=\"font-size:10px;color:var(--mu)\">${p.brand}<\/div>`:''}\n          ${promoInfo}\n        <\/div>\n      <\/div><\/td>\n      <td class=\"vrc-rtp\">${fmt(p.price)} \u20ac<\/td>\n      <td class=\"vrc-rtw\">&#x2696; ${fmtW(p.weight)}<\/td>\n      <td class=\"vrc-rtl\">\n        ${p.links.map(l=>`<a class=\"${l.cls||''}\" href=\"${l.u}\" target=\"_blank\"\n          onclick=\"trackEvent('clic_recap_achat','Configurateur','${l.l} \u2014 ${p.name}')\">${l.l} \u2192<\/a>`).join('')}\n      <\/td>\n    <\/tr>`;\n  }).join('');\n  el.innerHTML = `\n    <table class=\"vrc-rt\">\n      <thead><tr><th>Composant<\/th><th>Prix<\/th><th>Poids<\/th><th>Acheter<\/th><\/tr><\/thead>\n      <tbody>${rows}<\/tbody>\n      <tfoot><tr class=\"vrc-tot\">\n        <td>TOTAL \u2014 ${items.length} composant${items.length>1?'s':''}<\/td>\n        <td class=\"grn\">${fmt(tp)} \u20ac<\/td>\n        <td>${fmtW(tw)}<\/td>\n        <td><\/td>\n      <\/tr><\/tfoot>\n    <\/table>\n    <div class=\"vrc-ract\">\n      <button class=\"vra-p\" onclick=\"copyConfig()\">&#x1f4cb; Copier<\/button>\n      <button class=\"vra-s\" onclick=\"window.print()\">&#x1f5a8;&#xfe0f; Imprimer<\/button>\n      <button class=\"vra-m\" onclick=\"openModal()\">&#x2709; Envoyer par mail<\/button>\n      <button class=\"vra-s\" onclick=\"resetAll()\">&#x1f5d1; R\u00e9initialiser<\/button>\n    <\/div>`;\n}\n\n\/\/ \u2500\u2500 BUDGET PAR CAT\u00c9GORIE \u2500\u2500\nfunction onBudgetChange(input){\n  const cid      = input.dataset.cat;\n  const range    = CAT_BUDGET_RANGE[cid] || [10, 2000, 50];\n  const maxPrice = Math.max(...CATS.find(c=>c.id===cid).products.map(p=>p.price));\n  const sliderMax = Math.max(range[1], maxPrice);\n  const v = parseInt(input.value);\n  if(v >= sliderMax){ delete BUDGETS[cid]; }\n  else { BUDGETS[cid] = v; trackEvent('filtre_budget','Configurateur',cid,v); }\n  const label = document.getElementById('bval-'+cid);\n  if(label) label.textContent = BUDGETS[cid] ? fmt(BUDGETS[cid])+' \u20ac' : 'Sans limite';\n  save(); render();\n}\nfunction resetBudget(cid){ delete BUDGETS[cid]; save(); render(); }\n\n\/\/ \u2500\u2500 COMPARAISON \u2500\u2500\nfunction toggleCmp(cid){\n  CMP_MODE[cid] = !CMP_MODE[cid];\n  if(!CMP_MODE[cid]) delete CMP[cid];\n  render();\n}\n\n\/\/ \u2500\u2500 UTILS \u2500\u2500\nfunction scrollCat(id){\n  const el = document.getElementById('sec-'+id);\n  if(!el) return;\n  const top = el.getBoundingClientRect().top + window.scrollY - 56;\n  window.scrollTo({ top, behavior:'smooth' });\n  trackEvent('navigation_categorie','Configurateur',id);\n}\nfunction scrollRecap(){\n  document.querySelector('.vrc-recap')?.scrollIntoView({behavior:'smooth'});\n  trackEvent('scroll_recap','Configurateur','sticky_bar');\n}\n\nfunction buildText(){\n  const items = CATS.map(c=>({c,p:SEL[c.id]})).filter(x=>x.p);\n  if(!items.length) return '';\n  const tp=totalPrice(), tw=totalWeight();\n  let t = 'Ma configuration VeloExotique \u2014 V\u00e9lo de route carbone\\n\\n';\n  items.forEach(({c,p})=>{\n    t += `\u2022 ${c.name} : ${p.name} (${p.brand||''}) \u2014 ${fmt(p.price)} \u20ac \u2014 ${fmtW(p.weight)}\\n`;\n    if(p.promo) t += `  &#x1f3f7; Code promo : ${p.promo.code} \u2014 ${p.promo.label}\\n`;\n    p.links.forEach(l=>{ t += `  \u2192 ${l.l} : ${l.u}\\n`; });\n    t += '\\n';\n  });\n  t += `TOTAL : ${fmt(tp)} \u20ac | ${fmtW(tw)}\\n\\nCr\u00e9\u00e9 avec VeloExotique.fr \u2014 https:\/\/www.veloexotique.fr\/configurateur\/`;\n  return t;\n}\n\nfunction copyConfig(){\n  const t = buildText();\n  if(!t){ showToast('Aucun composant s\u00e9lectionn\u00e9'); return; }\n  navigator.clipboard?.writeText(t).then(()=>{\n    showToast('\u2713 Configuration copi\u00e9e !');\n    trackEvent('copie_config','Configurateur','clipboard');\n  });\n}\n\nfunction resetAll(){\n  if(!confirm('R\u00e9initialiser toute la configuration ?')) return;\n  Object.keys(SEL).forEach(k=>delete SEL[k]);\n  Object.keys(CMP).forEach(k=>delete CMP[k]);\n  Object.keys(CMP_MODE).forEach(k=>delete CMP_MODE[k]);\n  Object.keys(BUDGETS).forEach(k=>delete BUDGETS[k]);\n  BRAND = null; TYPE_FILTER = null;\n  try{\n    ['vrc_sel','vrc_budgets','vrc_brand','vrc_type'].forEach(k=>localStorage.removeItem(k));\n  }catch(e){}\n  trackEvent('reinitialisation','Configurateur','reset_all');\n  render();\n}\n\nfunction copyPromoCode(code){\n  navigator.clipboard?.writeText(code).then(()=>{\n    showToast('&#x1f3f7; Code \"'+code+'\" copi\u00e9 !');\n    trackEvent('copie_code_promo','Configurateur',code);\n  });\n}\n\nfunction openModal(){\n  if(!selCount()){ showToast('S\u00e9lectionnez au moins un composant'); return; }\n  document.getElementById('vrc-modal').classList.add('open');\n  document.getElementById('vrc-mail-in').value = '';\n  setTimeout(()=>document.getElementById('vrc-mail-in').focus(), 100);\n  trackEvent('ouverture_modal_mail','Configurateur','sticky_bar');\n}\nfunction closeModal(){ document.getElementById('vrc-modal').classList.remove('open'); }\n\nfunction sendMail(){\n  const email = document.getElementById('vrc-mail-in').value.trim();\n  if(!email || !email.includes('@')){ showToast('Adresse e-mail invalide'); return; }\n  const sub  = encodeURIComponent('Ma configuration VeloExotique \u2014 V\u00e9lo de route');\n  const body = encodeURIComponent(buildText());\n  window.location.href = `mailto:${email}?subject=${sub}&body=${body}`;\n  closeModal();\n  showToast('\u2713 Ouverture de votre client mail...');\n  trackEvent('envoi_mail_config','Configurateur',email.split('@')[1]);\n}\n\nfunction showToast(msg){\n  const t = document.getElementById('vrc-toast');\n  t.textContent = msg; t.classList.add('show');\n  setTimeout(()=>t.classList.remove('show'), 2800);\n}\n\n\/\/ \u2500\u2500 INIT \u2500\u2500\nrestore();\nrender();\ntrackEvent('ouverture_configurateur','Configurateur','page_load');\n<\/script>\n'<\/div><\/div>\n\n<div class=\"et_pb_code_2 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow+Condensed:wght@700;800&family=DM+Sans:wght@400;500;600&display=swap\" rel=\"stylesheet\">\n\n<style>\n\/* \u2500\u2500 RESET \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.ve-page *, .ve-page *::before, .ve-page *::after {\n  box-sizing: border-box !important;\n  font-family: inherit;\n}\n.ve-page { font-family: 'DM Sans', sans-serif; color: #0d0d0d; }\n.ve-page a { text-decoration: none !important; }\n.ve-page ul { list-style: none !important; margin: 0 !important; padding: 0 !important; }\n.ve-page p { margin: 0 0 1em; line-height: 1.7; }\n.ve-page p:last-child { margin-bottom: 0; }\n\n\/* \u2500\u2500 VARIABLES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.ve-page {\n  --g:   #1db954;\n  --gd:  #159140;\n  --gl:  #e8f8ef;\n  --bk:  #0d0d0d;\n  --wh:  #ffffff;\n  --gr:  #f5f5f3;\n  --gm:  #e0dedd;\n  --mu:  #888888;\n  --fh:  'Barlow Condensed', sans-serif;\n  --fb:  'DM Sans', sans-serif;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   HERO\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-hero {\n  background: var(--bk);\n  padding: 80px 24px 72px;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n.ve-hero::before {\n  content: '';\n  position: absolute;\n  inset: 0;\n  background: radial-gradient(ellipse 80% 60% at 50% 110%, rgba(29,185,84,.18), transparent);\n  pointer-events: none;\n}\n.ve-hero-inner { position: relative; max-width: 680px; margin: 0 auto; }\n.ve-hero-badge {\n  display: inline-block;\n  background: rgba(29,185,84,.12);\n  color: var(--g);\n  border: 1px solid rgba(29,185,84,.3);\n  font-family: var(--fh);\n  font-size: 11px; font-weight: 700;\n  letter-spacing: 1.4px; text-transform: uppercase;\n  padding: 5px 16px; border-radius: 20px;\n  margin-bottom: 24px;\n}\n.ve-hero h1 {\n  font-family: var(--fh);\n  font-size: clamp(44px, 7vw, 76px);\n  font-weight: 800; line-height: 1;\n  color: var(--wh);\n  letter-spacing: -.5px;\n  margin: 0 0 16px;\n}\n.ve-hero h1 em { font-style: normal; color: var(--g); }\n.ve-hero-sub {\n  font-size: 17px; line-height: 1.6;\n  color: rgba(255,255,255,.6);\n  margin: 0 auto 40px;\n  max-width: 520px;\n}\n.ve-hero-steps {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-wrap: wrap;\n  gap: 0;\n}\n.ve-step {\n  display: flex; align-items: center; gap: 8px;\n  font-family: var(--fh);\n  font-size: 12px; font-weight: 700;\n  letter-spacing: 1px; text-transform: uppercase;\n  color: rgba(255,255,255,.45);\n  padding: 6px 14px;\n}\n.ve-step .n {\n  width: 24px; height: 24px; border-radius: 50%;\n  background: rgba(29,185,84,.15);\n  border: 1px solid rgba(29,185,84,.4);\n  color: var(--g);\n  font-size: 12px; font-weight: 700;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.ve-step-sep {\n  width: 20px; height: 1px;\n  background: rgba(255,255,255,.12);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SECTION UTILITAIRE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-section {\n  padding: 64px 24px;\n  max-width: 900px;\n  margin: 0 auto;\n}\n.ve-section-full {\n  padding: 64px 24px;\n  width: 100%;\n}\n.ve-section-label {\n  font-family: var(--fh);\n  font-size: 11px; font-weight: 700;\n  letter-spacing: 1.4px; text-transform: uppercase;\n  color: var(--mu);\n  text-align: center;\n  margin-bottom: 12px;\n  display: block;\n}\n.ve-section-title {\n  font-family: var(--fh);\n  font-size: clamp(28px, 4vw, 40px);\n  font-weight: 700; line-height: 1.1;\n  text-align: center;\n  margin-bottom: 12px;\n}\n.ve-section-sub {\n  text-align: center;\n  color: var(--mu);\n  font-size: 15px; line-height: 1.6;\n  max-width: 540px;\n  margin: 0 auto 40px;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CARTES CONFIGURATEUR\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-cards {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 20px;\n  max-width: 820px;\n  margin: 0 auto 16px;\n}\n.ve-card {\n  background: var(--bk);\n  border-radius: 12px;\n  overflow: hidden;\n  position: relative;\n  transition: transform .2s, box-shadow .2s;\n  border: 1px solid rgba(255,255,255,.06);\n}\n.ve-card:hover {\n  transform: translateY(-4px);\n  box-shadow: 0 24px 48px rgba(0,0,0,.25);\n}\n.ve-card-img {\n  height: 180px;\n  background: #111;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 72px;\n  position: relative;\n  overflow: hidden;\n}\n.ve-card-img img {\n  width: 100%; height: 100%;\n  object-fit: cover;\n  opacity: .7;\n}\n.ve-card-img::after {\n  content: '';\n  position: absolute; inset: 0;\n  background: linear-gradient(to bottom, transparent 30%, rgba(0,0,0,.75));\n}\n.ve-card-badge {\n  position: absolute; top: 12px; left: 12px;\n  background: var(--g); color: var(--wh);\n  font-family: var(--fh);\n  font-size: 10px; font-weight: 700;\n  letter-spacing: 1px; text-transform: uppercase;\n  padding: 3px 10px; border-radius: 4px;\n  z-index: 2;\n}\n.ve-card-body { padding: 22px; }\n.ve-card-type {\n  font-family: var(--fh);\n  font-size: 11px; font-weight: 700;\n  letter-spacing: 1.2px; text-transform: uppercase;\n  color: var(--g);\n  margin-bottom: 6px;\n}\n.ve-card-title {\n  font-family: var(--fh);\n  font-size: 26px; font-weight: 700;\n  color: var(--wh);\n  line-height: 1.1;\n  margin-bottom: 10px;\n}\n.ve-card-desc {\n  font-size: 13px;\n  color: rgba(255,255,255,.5);\n  line-height: 1.6;\n  margin-bottom: 16px;\n}\n.ve-card-tags {\n  display: flex; gap: 6px; flex-wrap: wrap;\n  margin-bottom: 18px;\n}\n.ve-tag {\n  font-size: 11px; font-weight: 500;\n  background: rgba(255,255,255,.07);\n  color: rgba(255,255,255,.55);\n  padding: 3px 10px; border-radius: 4px;\n}\n.ve-card-btn {\n  display: flex; align-items: center; justify-content: center;\n  gap: 6px;\n  background: var(--g) !important;\n  color: var(--wh) !important;\n  font-family: var(--fh) !important;\n  font-size: 14px !important; font-weight: 700 !important;\n  letter-spacing: .8px; text-transform: uppercase;\n  padding: 11px 20px !important;\n  border-radius: 6px !important;\n  transition: background .15s;\n  border: none !important;\n}\n.ve-card-btn:hover { background: var(--gd) !important; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   BLOC TEXTE INTRO (SEO)\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-intro {\n  background: var(--wh);\n  border-top: 1px solid var(--gm);\n  border-bottom: 1px solid var(--gm);\n  padding: 64px 24px;\n}\n.ve-intro-inner {\n  max-width: 780px;\n  margin: 0 auto;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 48px;\n  align-items: start;\n}\n.ve-intro h2 {\n  font-family: var(--fh);\n  font-size: 36px; font-weight: 700;\n  line-height: 1.1;\n  margin-bottom: 16px;\n  grid-column: 1 \/ -1;\n}\n.ve-intro h2 em { font-style: normal; color: var(--g); }\n.ve-intro p {\n  font-size: 15px; line-height: 1.8;\n  color: #444;\n}\n.ve-intro strong { color: var(--bk); font-weight: 600; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   COMMENT \u00c7A MARCHE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-how {\n  background: var(--gr);\n  padding: 64px 24px;\n}\n.ve-how-steps {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 24px;\n  max-width: 820px;\n  margin: 0 auto;\n}\n.ve-how-step { text-align: center; padding: 0 8px; }\n.ve-how-n {\n  width: 44px; height: 44px; border-radius: 50%;\n  background: var(--gl);\n  border: 2px solid var(--g);\n  color: var(--gd);\n  font-family: var(--fh);\n  font-size: 20px; font-weight: 700;\n  display: flex; align-items: center; justify-content: center;\n  margin: 0 auto 14px;\n}\n.ve-how-title {\n  font-family: var(--fh);\n  font-size: 17px; font-weight: 700;\n  margin-bottom: 8px;\n}\n.ve-how-desc {\n  font-size: 13px; color: var(--mu);\n  line-height: 1.6;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   ARGUMENTS DE CONFIANCE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-args {\n  background: var(--wh);\n  border-top: 1px solid var(--gm);\n  padding: 64px 24px;\n}\n.ve-args-grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 20px;\n  max-width: 820px;\n  margin: 0 auto;\n}\n.ve-arg {\n  border: 1px solid var(--gm);\n  border-radius: 10px;\n  padding: 24px;\n}\n.ve-arg-icon { font-size: 28px; margin-bottom: 12px; }\n.ve-arg-title {\n  font-family: var(--fh);\n  font-size: 18px; font-weight: 700;\n  margin-bottom: 8px;\n}\n.ve-arg-desc { font-size: 13px; color: var(--mu); line-height: 1.6; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   BLOC TEXTE SEO LONG\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-seo {\n  background: var(--gr);\n  border-top: 1px solid var(--gm);\n  padding: 64px 24px;\n}\n.ve-seo-inner {\n  max-width: 780px;\n  margin: 0 auto;\n}\n.ve-seo h2 {\n  font-family: var(--fh);\n  font-size: 34px; font-weight: 700;\n  margin-bottom: 20px;\n  line-height: 1.15;\n}\n.ve-seo h3 {\n  font-family: var(--fh);\n  font-size: 22px; font-weight: 700;\n  margin: 36px 0 10px;\n  color: var(--bk);\n}\n.ve-seo p {\n  font-size: 15px; line-height: 1.8;\n  color: #444;\n  margin-bottom: 16px;\n}\n.ve-seo strong { color: var(--bk); font-weight: 600; }\n.ve-seo-highlight {\n  background: var(--gl);\n  border-left: 4px solid var(--g);\n  border-radius: 0 8px 8px 0;\n  padding: 16px 20px;\n  margin: 24px 0;\n  font-size: 15px; line-height: 1.7;\n  color: #2a2a2a;\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   FAQ\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-faq {\n  background: var(--wh);\n  border-top: 1px solid var(--gm);\n  padding: 64px 24px;\n}\n.ve-faq-inner {\n  max-width: 780px;\n  margin: 0 auto;\n}\n.ve-faq h2 {\n  font-family: var(--fh);\n  font-size: 34px; font-weight: 700;\n  margin-bottom: 8px;\n}\n.ve-faq-sub {\n  color: var(--mu); font-size: 14px;\n  margin-bottom: 36px; line-height: 1.6;\n}\n.ve-faq-item {\n  border-bottom: 1px solid var(--gm);\n  overflow: hidden;\n}\n.ve-faq-item:first-of-type { border-top: 1px solid var(--gm); }\n.ve-faq-q {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  padding: 20px 4px;\n  cursor: pointer;\n  user-select: none;\n}\n.ve-faq-q-text {\n  font-family: var(--fh);\n  font-size: 18px; font-weight: 700;\n  line-height: 1.2;\n  flex: 1;\n}\n.ve-faq-icon {\n  width: 28px; height: 28px; border-radius: 50%;\n  background: var(--gr);\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n  font-size: 18px; line-height: 1;\n  color: var(--g);\n  font-weight: 700;\n  transition: background .15s, transform .25s;\n}\n.ve-faq-item.ve-open .ve-faq-icon {\n  background: var(--gl);\n  transform: rotate(45deg);\n}\n.ve-faq-a {\n  display: none;\n  padding: 0 4px 20px;\n  font-size: 14px; line-height: 1.8;\n  color: #555;\n}\n.ve-faq-item.ve-open .ve-faq-a { display: block; }\n.ve-faq-a strong { color: var(--bk); font-weight: 600; }\n.ve-faq-a a { color: var(--gd); text-decoration: underline !important; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CTA FINAL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.ve-cta {\n  background: var(--bk);\n  padding: 72px 24px;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n.ve-cta::before {\n  content: '';\n  position: absolute; inset: 0;\n  background: radial-gradient(ellipse 60% 80% at 50% -20%, rgba(29,185,84,.2), transparent);\n  pointer-events: none;\n}\n.ve-cta-inner { position: relative; max-width: 560px; margin: 0 auto; }\n.ve-cta h2 {\n  font-family: var(--fh);\n  font-size: clamp(32px, 5vw, 52px);\n  font-weight: 700; line-height: 1.1;\n  color: var(--wh);\n  margin-bottom: 12px;\n}\n.ve-cta h2 em { font-style: normal; color: var(--g); }\n.ve-cta p {\n  font-size: 15px; line-height: 1.7;\n  color: rgba(255,255,255,.5);\n  margin-bottom: 32px;\n}\n.ve-cta-btns {\n  display: flex;\n  justify-content: center;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.ve-cta-btns a {\n  font-family: var(--fh) !important;\n  font-size: 15px !important; font-weight: 700 !important;\n  letter-spacing: .8px; text-transform: uppercase;\n  padding: 13px 26px !important;\n  border-radius: 6px !important;\n  transition: background .15s;\n  display: inline-block;\n}\n.ve-btn-p {\n  background: var(--g) !important;\n  color: var(--wh) !important;\n}\n.ve-btn-p:hover { background: var(--gd) !important; }\n.ve-btn-s {\n  background: rgba(255,255,255,.07) !important;\n  color: rgba(255,255,255,.75) !important;\n  border: 1px solid rgba(255,255,255,.15) !important;\n}\n.ve-btn-s:hover { background: rgba(255,255,255,.12) !important; }\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   RESPONSIVE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media (max-width: 680px) {\n  .ve-cards { grid-template-columns: 1fr; }\n  .ve-intro-inner { grid-template-columns: 1fr; gap: 0; }\n  .ve-intro h2 { grid-column: 1; }\n  .ve-how-steps { grid-template-columns: 1fr 1fr; }\n  .ve-args-grid { grid-template-columns: 1fr; }\n}\n<\/style>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     HERO\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"ve-page\">\n<section class=\"ve-hero\">\n  <div class=\"ve-hero-inner\">\n    <div class=\"ve-hero-badge\">Outil exclusif VeloExotique<\/div>\n    <h1>Construisez<br>votre <em>v\u00e9lo id\u00e9al<\/em><\/h1>\n    <p class=\"ve-hero-sub\">Cadre carbone, roues, groupe, cockpit \u2014 composez pi\u00e8ce par pi\u00e8ce depuis les meilleures marques exotiques asiatiques, sans interm\u00e9diaire.<\/p>\n    <div class=\"ve-hero-steps\">\n      <div class=\"ve-step\"><span class=\"n\">1<\/span>Choisissez le cadre<\/div>\n      <div class=\"ve-step-sep\"><\/div>\n      <div class=\"ve-step\"><span class=\"n\">2<\/span>Ajoutez les roues<\/div>\n      <div class=\"ve-step-sep\"><\/div>\n      <div class=\"ve-step\"><span class=\"n\">3<\/span>Compl\u00e9tez le build<\/div>\n      <div class=\"ve-step-sep\"><\/div>\n      <div class=\"ve-step\"><span class=\"n\">4<\/span>Commandez direct<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     INTRO TEXTE SEO\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"ve-intro\">\n  <div class=\"ve-intro-inner\">\n    <h2>Pourquoi assembler son v\u00e9lo<br>plut\u00f4t qu'en acheter un <em>tout fait<\/em>&nbsp;?<\/h2>\n    <div>\n      <p>Un v\u00e9lo complet achet\u00e9 chez un distributeur traditionnel, c'est un compromis. Le cadre est choisi par la marque, les composants sont s\u00e9lectionn\u00e9s pour tenir un budget de gamme, et vous payez autant le marketing que la mati\u00e8re premi\u00e8re.<\/p>\n      <p>En assemblant vous-m\u00eame votre v\u00e9lo depuis des <strong>marques carbone exotiques<\/strong> \u2014 Winspace, ICAN Cycling, Elves, Trifox, Tavelo \u2014 vous choisissez exactement ce dont vous avez besoin. Un cadre T800, les roues qui correspondent \u00e0 votre pratique, le groupe qui correspond \u00e0 votre budget.<\/p>\n    <\/div>\n    <div>\n      <p>Notre configurateur est le seul outil francophone qui r\u00e9unit les meilleures marques asiatiques v\u00e9rifi\u00e9es en un seul endroit. <strong>Pas de publicit\u00e9, pas de commission cach\u00e9e<\/strong> \u2014 chaque produit est s\u00e9lectionn\u00e9 pour son rapport qualit\u00e9-prix r\u00e9el, valid\u00e9 par notre \u00e9quipe et la communaut\u00e9.<\/p>\n      <p>Le r\u00e9sultat&nbsp;? Un v\u00e9lo carbone de comp\u00e9tition pour <strong>1 500 \u00e0 3 000&nbsp;\u20ac<\/strong> l\u00e0 o\u00f9 les grandes marques vous demanderaient le double. Sans compromis sur la qualit\u00e9, avec les m\u00eames mat\u00e9riaux fibres Toray que les v\u00e9los \u00e0 8 000&nbsp;\u20ac.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     COMMENT \u00c7A MARCHE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"ve-how\">\n  <div style=\"max-width:820px; margin:0 auto;\">\n    <span class=\"ve-section-label\">Mode d'emploi<\/span>\n    <h2 class=\"ve-section-title\">Comment fonctionne<br>le configurateur&nbsp;?<\/h2>\n    <p class=\"ve-section-sub\">En quatre \u00e9tapes simples, composez votre v\u00e9lo id\u00e9al et retrouvez directement les offres chez les vendeurs.<\/p>\n    <div class=\"ve-how-steps\">\n      <div class=\"ve-how-step\">\n        <div class=\"ve-how-n\">1<\/div>\n        <div class=\"ve-how-title\">Choisissez le cadre<\/div>\n        <div class=\"ve-how-desc\">Parcourez notre s\u00e9lection de cadres carbone route ou gravel, filtr\u00e9s par marque, taille et budget. Chaque cadre est document\u00e9 avec ses caract\u00e9ristiques r\u00e9elles.<\/div>\n      <\/div>\n      <div class=\"ve-how-step\">\n        <div class=\"ve-how-n\">2<\/div>\n        <div class=\"ve-how-title\">S\u00e9lectionnez les roues<\/div>\n        <div class=\"ve-how-desc\">Filtrez par hauteur de jante, type de freinage (disque ou patins) et marque. Nos recommandations tiennent compte de votre pratique et de vos conditions de roulage.<\/div>\n      <\/div>\n      <div class=\"ve-how-step\">\n        <div class=\"ve-how-n\">3<\/div>\n        <div class=\"ve-how-title\">Compl\u00e9tez le build<\/div>\n        <div class=\"ve-how-desc\">Groupe, cockpit, tige de selle, p\u00e9riph\u00e9riques \u2014 ajoutez chaque pi\u00e8ce \u00e0 votre wish list. Le configurateur calcule votre budget total au fur et \u00e0 mesure.<\/div>\n      <\/div>\n      <div class=\"ve-how-step\">\n        <div class=\"ve-how-n\">4<\/div>\n        <div class=\"ve-how-title\">Commandez direct<\/div>\n        <div class=\"ve-how-desc\">Votre wish list vous renvoie directement vers chaque vendeur. Pas d'interm\u00e9diaire suppl\u00e9mentaire&nbsp;: vous commandez au prix le plus bas, aupr\u00e8s de vendeurs v\u00e9rifi\u00e9s.<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     ARGUMENTS DE CONFIANCE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"ve-args\">\n  <div style=\"max-width:820px; margin:0 auto;\">\n    <span class=\"ve-section-label\">Pourquoi nous faire confiance<\/span>\n    <h2 class=\"ve-section-title\">Un outil ind\u00e9pendant,<br>fait par des cyclistes<\/h2>\n    <div class=\"ve-args-grid\" style=\"margin-top:36px;\">\n      <div class=\"ve-arg\">\n        <div class=\"ve-arg-icon\">&#x1f512;<\/div>\n        <div class=\"ve-arg-title\">100&nbsp;% ind\u00e9pendant<\/div>\n        <div class=\"ve-arg-desc\">Aucun fabricant ne nous r\u00e9mun\u00e8re pour figurer dans le configurateur. Chaque marque est s\u00e9lectionn\u00e9e uniquement sur ses m\u00e9rites r\u00e9els et les avis de la communaut\u00e9.<\/div>\n      <\/div>\n      <div class=\"ve-arg\">\n        <div class=\"ve-arg-icon\">&#x2705;<\/div>\n        <div class=\"ve-arg-title\">Marques v\u00e9rifi\u00e9es<\/div>\n        <div class=\"ve-arg-desc\">Nous ne r\u00e9f\u00e9ren\u00e7ons que des marques avec un historique d'avis r\u00e9els, des certifications mat\u00e9riaux v\u00e9rifiables et un service apr\u00e8s-vente document\u00e9 par des acheteurs r\u00e9els.<\/div>\n      <\/div>\n      <div class=\"ve-arg\">\n        <div class=\"ve-arg-icon\">&#x1f4b0;<\/div>\n        <div class=\"ve-arg-title\">Prix directs usine<\/div>\n        <div class=\"ve-arg-desc\">Les marques exotiques asiatiques vendent directement, sans distributeur europ\u00e9en. R\u00e9sultat&nbsp;: un cadre carbone T800 \u00e0 600&nbsp;\u20ac l\u00e0 o\u00f9 les grandes marques facturent 2&nbsp;500&nbsp;\u20ac.<\/div>\n      <\/div>\n      <div class=\"ve-arg\">\n        <div class=\"ve-arg-icon\">&#x1f6e0;&#xfe0f;<\/div>\n        <div class=\"ve-arg-title\">Test\u00e9s et document\u00e9s<\/div>\n        <div class=\"ve-arg-desc\">Chaque produit r\u00e9f\u00e9renc\u00e9 a \u00e9t\u00e9 test\u00e9 par notre \u00e9quipe ou valid\u00e9 par plusieurs membres de la communaut\u00e9. Nous publions les vraies mesures, pas les donn\u00e9es marketing.<\/div>\n      <\/div>\n      <div class=\"ve-arg\">\n        <div class=\"ve-arg-icon\">&#x1f52c;<\/div>\n        <div class=\"ve-arg-title\">Expertise mat\u00e9riaux<\/div>\n        <div class=\"ve-arg-desc\">Fibre Toray T700, T800, T1000 \u2014 notre guide exclusif sur les fibres carbone vous aide \u00e0 comprendre ce que vous achetez r\u00e9ellement et \u00e0 \u00e9viter les arnaques.<\/div>\n      <\/div>\n      <div class=\"ve-arg\">\n        <div class=\"ve-arg-icon\">&#x1f4ac;<\/div>\n        <div class=\"ve-arg-title\">Communaut\u00e9 active<\/div>\n        <div class=\"ve-arg-desc\">Des centaines de cyclistes partagent leurs builds, leurs retours d'exp\u00e9rience et leurs conseils. La communaut\u00e9 VeloExotique est la r\u00e9f\u00e9rence francophone sur le v\u00e9lo carbone exotique.<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     TEXTE SEO LONG\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"ve-seo\">\n  <div class=\"ve-seo-inner\">\n\n    <h2>Le guide complet pour assembler un v\u00e9lo carbone exotique en 2026<\/h2>\n\n    <p>Le march\u00e9 du v\u00e9lo carbone a profond\u00e9ment \u00e9volu\u00e9 ces derni\u00e8res ann\u00e9es. Si les grandes marques europ\u00e9ennes et am\u00e9ricaines ont longtemps domin\u00e9 le secteur, une nouvelle g\u00e9n\u00e9ration de fabricants asiatiques \u2014 principalement bas\u00e9s \u00e0 Ta\u00efwan et dans la r\u00e9gion de Wenling en Chine \u2014 propose d\u00e9sormais des produits de niveau \u00e9quivalent \u00e0 des prix incomparablement inf\u00e9rieurs.<\/p>\n\n    <p>Ces marques que nous appelons <strong>\"marques exotiques\"<\/strong> ne sont pas des copies. Elles utilisent les m\u00eames usines, les m\u00eames fibres carbone Toray, parfois les m\u00eames \u00e9quipes d'ing\u00e9nieurs que certains sous-traitants des grandes marques. La diff\u00e9rence&nbsp;? L'absence de budget marketing, de r\u00e9seau de distribution et de marges de revendeur.<\/p>\n\n    <div class=\"ve-seo-highlight\">\n      Un cadre carbone T800 de qualit\u00e9 comp\u00e9tition co\u00fbte entre 400 et 800&nbsp;\u20ac en direct d'une marque exotique s\u00e9rieuse. Le m\u00eame niveau de qualit\u00e9 chez Trek, Specialized ou Canyon d\u00e9passerait facilement les 2&nbsp;000 \u00e0 3&nbsp;500&nbsp;\u20ac. La diff\u00e9rence ne vient pas de la mati\u00e8re premi\u00e8re, mais des couches interm\u00e9diaires.\n    <\/div>\n\n    <h3>Choisir son cadre carbone&nbsp;: les crit\u00e8res essentiels<\/h3>\n\n    <p>Le cadre est la pi\u00e8ce ma\u00eetresse de votre configuration. C'est lui qui d\u00e9termine la g\u00e9om\u00e9trie, le comportement sur route et la compatibilit\u00e9 avec vos composants. Pour un v\u00e9lo de route, vous regarderez principalement la <strong>g\u00e9om\u00e9trie (race vs endurance)<\/strong>, le type de freinage (disque ou patins), la compatibilit\u00e9 du bo\u00eetier de p\u00e9dalier et les standards de direction.<\/p>\n\n    <p>Pour un gravel, les crit\u00e8res s'\u00e9largissent&nbsp;: clairance pneus (peut-il accepter du 40mm&nbsp;? du 50mm&nbsp;?), pr\u00e9sence de points d'ancrage pour sacoches, compatibilit\u00e9 1x ou 2x. Les marques comme <strong>Winspace, Elves ou Trifox<\/strong> publient ces donn\u00e9es pr\u00e9cis\u00e9ment \u2014 ce que nous v\u00e9rifions syst\u00e9matiquement avant r\u00e9f\u00e9rencement.<\/p>\n\n    <h3>Roues carbone&nbsp;: la jante qui change tout<\/h3>\n\n    <p>Apr\u00e8s le cadre, les roues sont le deuxi\u00e8me poste budg\u00e9taire le plus impactant \u2014 et le plus impactant sur les performances ressenties. Une paire de roues carbone l\u00e9g\u00e8res transforme litt\u00e9ralement la sensation de p\u00e9dalage, surtout en c\u00f4te.<\/p>\n\n    <p>Pour la route, une hauteur de jante entre <strong>38 et 50mm<\/strong> offre le meilleur compromis a\u00e9rodynamisme\/maniabilit\u00e9 pour la plupart des cyclistes. Au-del\u00e0 de 60mm, les roues deviennent sensibles au vent lat\u00e9ral. Pour le gravel, des jantes larges (25mm int\u00e9rieur minimum) permettent d'accueillir des pneus volumeux avec une pression r\u00e9duite pour plus de confort sur les chemins.<\/p>\n\n    <h3>Le groupe&nbsp;: Shimano, SRAM ou L-TWOO&nbsp;?<\/h3>\n\n    <p>Le choix du groupe est souvent le plus complexe. <strong>Shimano 105 R7000\/R7100<\/strong> reste la r\u00e9f\u00e9rence pour son rapport fiabilit\u00e9\/prix imbattable. <strong>SRAM Force eTap AXS<\/strong> s\u00e9duira les amateurs de sans-fil et de performances a\u00e9ro. Mais une troisi\u00e8me voie \u00e9merge avec les groupes chinois comme <strong>L-TWOO R9<\/strong>, qui offrent des prestations tr\u00e8s proches de Shimano Ultegra \u00e0 prix Shimano 105.<\/p>\n\n    <p>Notre configurateur int\u00e8gre des recommandations de compatibilit\u00e9 pour chaque groupe avec chaque cadre r\u00e9f\u00e9renc\u00e9, vous \u00e9vitant les mauvaises surprises de montage.<\/p>\n\n  <\/div>\n<\/section>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     FAQ\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"ve-faq\">\n  <div class=\"ve-faq-inner\">\n    <h2>Questions fr\u00e9quentes<\/h2>\n    <p class=\"ve-faq-sub\">Tout ce que vous devez savoir avant de configurer votre premier v\u00e9lo carbone exotique.<\/p>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Qu'est-ce qu'un v\u00e9lo carbone \"exotique\" exactement&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>Le terme \"exotique\" d\u00e9signe les marques de v\u00e9los carbone qui vendent directement depuis leur pays de fabrication \u2014 principalement Ta\u00efwan et la Chine \u2014 sans passer par un r\u00e9seau de distribution traditionnel en Europe. Ces marques sont peu connues du grand public, mais elles utilisent des mat\u00e9riaux et des processus de fabrication comparables aux grandes marques, parfois dans les m\u00eames usines. <strong>Winspace, ICAN Cycling, Elves, Trifox, Tavelo<\/strong> en sont les repr\u00e9sentants les plus reconnus sur le march\u00e9 francophone.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Combien co\u00fbte un v\u00e9lo route carbone assembl\u00e9 avec des marques exotiques&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>Le budget total d'un v\u00e9lo route carbone assembl\u00e9 depuis des marques exotiques varie entre <strong>1 200 et 3 500&nbsp;\u20ac<\/strong> selon les composants choisis. Un exemple concret&nbsp;: cadre carbone T800 (~600\u20ac) + roues carbone disque 50mm (~500\u20ac) + groupe Shimano 105 R7100 (~650\u20ac) + cockpit carbone (~150\u20ac) = environ <strong>1 900&nbsp;\u20ac<\/strong> pour un v\u00e9lo de niveau comp\u00e9tition. Le m\u00eame niveau de performances chez Trek ou Specialized d\u00e9passerait les 4 500&nbsp;\u20ac.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Les marques carbone asiatiques sont-elles fiables&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>Oui \u2014 \u00e0 condition de choisir les bonnes marques. C'est pr\u00e9cis\u00e9ment pour cela que VeloExotique existe. <strong>Les marques que nous r\u00e9f\u00e9ren\u00e7ons<\/strong> ont toutes un historique document\u00e9 d'avis r\u00e9els, des certifications mat\u00e9riaux v\u00e9rifiables et un service apr\u00e8s-vente accessible. Nous avons d\u00e9velopp\u00e9 notre propre <a href=\"https:\/\/www.veloexotique.fr\/indice-confiance-aliexpress-ica\/\">Indice de Confiance AliExpress (ICA)<\/a> pour aider les cyclistes \u00e0 distinguer les vendeurs s\u00e9rieux des opportunistes. Une marque comme Winspace ou ICAN compte des milliers de clients satisfaits en Europe depuis plusieurs ann\u00e9es.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Peut-on assembler un v\u00e9lo gravel complet sous 2&nbsp;000&nbsp;\u20ac&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>Oui, c'est tout \u00e0 fait r\u00e9alisable. Un exemple de build gravel \u00e0 moins de 2&nbsp;000&nbsp;\u20ac&nbsp;: cadre gravel carbone (~550\u20ac) + roues carbone 700C 35mm (~480\u20ac) + groupe SRAM Apex 1x (~420\u20ac) + cockpit carbone (~130\u20ac) + p\u00e9riph\u00e9riques (~200\u20ac) = environ <strong>1 780&nbsp;\u20ac<\/strong>. Notre <a href=\"https:\/\/www.veloexotique.fr\/configurateur\/configurateur-de-velo-de-gravel\/\">configurateur gravel<\/a> vous guide pas \u00e0 pas pour rester dans votre budget tout en optimisant les performances.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Quelle diff\u00e9rence entre un v\u00e9lo route et un v\u00e9lo gravel&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>Un <strong>v\u00e9lo de route<\/strong> est optimis\u00e9 pour l'asphalte&nbsp;: g\u00e9om\u00e9trie agressive, pneus fins (25-32mm), cadre rigide pour transmettre au maximum l'effort. Un <strong>v\u00e9lo gravel<\/strong> est polyvalent&nbsp;: g\u00e9om\u00e9trie plus confortable, pneus larges (38-50mm), souvent des points d'ancrage pour sacoches et une clairance suffisante pour les chemins. Si vous roulez exclusivement sur route, choisissez le configurateur route. Si vous m\u00e9langez routes et chemins, ou si vous faites du bikepacking, le gravel sera plus adapt\u00e9.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Comment fonctionne la wish list du configurateur&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>La wish list vous permet de <strong>sauvegarder votre s\u00e9lection de composants<\/strong> au fil de votre navigation. Chaque produit ajout\u00e9 appara\u00eet dans votre liste avec son prix indicatif. La wish list est persistante \u2014 vous pouvez revenir dessus plus tard. Elle ne constitue pas un panier d'achat&nbsp;: chaque lien vous renvoie directement vers le vendeur concern\u00e9 (AliExpress, site de la marque, revendeur officiel) pour passer commande au meilleur prix.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Quelle marque choisir entre Winspace, ICAN et Elves&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p><strong>Winspace<\/strong> est la r\u00e9f\u00e9rence haut de gamme parmi les marques exotiques \u2014 finitions excellentes, g\u00e9om\u00e9tries peaufin\u00e9es, id\u00e9al pour les cyclistes exigeants avec un budget de 700 \u00e0 1 200&nbsp;\u20ac pour le cadre. <strong>ICAN Cycling<\/strong> offre le meilleur rapport qualit\u00e9-prix sur les roues carbone \u2014 leur gamme de roues disque est particuli\u00e8rement bien document\u00e9e. <strong>Elves<\/strong> se distingue par des designs tr\u00e8s a\u00e9rodynamiques, avec notamment des cadres int\u00e9gr\u00e9s qui n'ont rien \u00e0 envier aux meilleurs v\u00e9los europ\u00e9ens. Consultez nos <a href=\"https:\/\/www.veloexotique.fr\/fabricants\/\">pages d\u00e9di\u00e9es \u00e0 chaque fabricant<\/a> pour une comparaison d\u00e9taill\u00e9e.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"ve-faq-item\">\n      <div class=\"ve-faq-q\">\n        <span class=\"ve-faq-q-text\">Y a-t-il un risque \u00e0 commander un cadre carbone directement depuis l'Asie&nbsp;?<\/span>\n        <span class=\"ve-faq-icon\">+<\/span>\n      <\/div>\n      <div class=\"ve-faq-a\">\n        <p>Il existe des risques, comme pour tout achat en ligne \u2014 et nous en parlons honn\u00eatement. Les principaux&nbsp;: d\u00e9lais de livraison plus longs (2 \u00e0 6 semaines), service apr\u00e8s-vente parfois moins r\u00e9actif qu'un distributeur local, et dans de rares cas des produits ne correspondant pas \u00e0 la description. C'est pourquoi nous avons cr\u00e9\u00e9 notre <a href=\"https:\/\/www.veloexotique.fr\/indice-confiance-aliexpress-ica\/\">Indice de Confiance AliExpress<\/a> et ne r\u00e9f\u00e9ren\u00e7ons que des <strong>vendeurs v\u00e9rifi\u00e9s avec un historique d'avis r\u00e9els<\/strong>. En suivant nos recommandations, les milliers de membres de notre communaut\u00e9 ont eu des exp\u00e9riences tr\u00e8s largement positives.<\/p>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/section>\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     CTA FINAL\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section class=\"ve-cta\">\n  <div class=\"ve-cta-inner\">\n    <h2>Pr\u00eat \u00e0 construire<br>votre <em>v\u00e9lo id\u00e9al&nbsp;?<\/em><\/h2>\n    <p>Rejoignez les cyclistes qui ont d\u00e9j\u00e0 compos\u00e9 leur machine depuis les meilleures marques carbone exotiques \u2014 sans compromis, sans interm\u00e9diaire.<\/p>\n    <div class=\"ve-cta-btns\">\n      <a class=\"ve-btn-p\" href=\"https:\/\/www.veloexotique.fr\/configurateur\/configurateur-de-velo-de-route\/\">&#x2699; Configurateur Route<\/a>\n      <a class=\"ve-btn-p\" href=\"https:\/\/www.veloexotique.fr\/configurateur\/configurateur-de-velo-de-gravel\/\">&#x2699; Configurateur Gravel<\/a>\n      <a class=\"ve-btn-s\" href=\"https:\/\/www.veloexotique.fr\/fabricants\/\">Voir les marques<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n\n<\/div><!-- fin .ve-page -->\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     JAVASCRIPT \u2014 FAQ accord\u00e9on\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<script>\n(function () {\n  document.querySelectorAll('.ve-faq-item').forEach(function (item) {\n    item.querySelector('.ve-faq-q').addEventListener('click', function () {\n      var isOpen = item.classList.toggle('ve-open');\n      if (isOpen) {\n        document.querySelectorAll('.ve-faq-item.ve-open').forEach(function (other) {\n          if (other !== item) other.classList.remove('ve-open');\n        });\n      }\n    });\n  });\n})();\n<\/script>\n<\/div><\/div>\n<\/div>\n<\/div>\n<div class=\"et_pb_bottom_inside_divider et-no-transition\"><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1762843936","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Configurateur - VeloExotique.fr<\/title>\n<meta name=\"description\" content=\"Cadre, transmission, roues, cockpit, p\u00e9riph\u00e9riques\u2026 chaque composant a son importance. Gr\u00e2ce \u00e0 notre s\u00e9lection de marques exotiques reconnues pour leur innovation, leur performance et leur excellent rapport qualit\u00e9-prix, vous pouvez assembler un v\u00e9lo parfaitement adapt\u00e9 \u00e0 votre pratique, \u00e0 votre style et \u00e0 vos ambitions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.veloexotique.fr\/en\/configurator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configurateur - VeloExotique.fr\" \/>\n<meta property=\"og:description\" content=\"Cadre, transmission, roues, cockpit, p\u00e9riph\u00e9riques\u2026 chaque composant a son importance. Gr\u00e2ce \u00e0 notre s\u00e9lection de marques exotiques reconnues pour leur innovation, leur performance et leur excellent rapport qualit\u00e9-prix, vous pouvez assembler un v\u00e9lo parfaitement adapt\u00e9 \u00e0 votre pratique, \u00e0 votre style et \u00e0 vos ambitions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.veloexotique.fr\/en\/configurator\/\" \/>\n<meta property=\"og:site_name\" content=\"VeloExotique.fr\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-18T20:26:26+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/configurateur\\\/\",\"url\":\"https:\\\/\\\/www.veloexotique.fr\\\/configurateur\\\/\",\"name\":\"Configurateur - VeloExotique.fr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/#website\"},\"datePublished\":\"2025-12-18T14:06:39+00:00\",\"dateModified\":\"2026-05-18T20:26:26+00:00\",\"description\":\"Cadre, transmission, roues, cockpit, p\u00e9riph\u00e9riques\u2026 chaque composant a son importance. Gr\u00e2ce \u00e0 notre s\u00e9lection de marques exotiques reconnues pour leur innovation, leur performance et leur excellent rapport qualit\u00e9-prix, vous pouvez assembler un v\u00e9lo parfaitement adapt\u00e9 \u00e0 votre pratique, \u00e0 votre style et \u00e0 vos ambitions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/configurateur\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.veloexotique.fr\\\/configurateur\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/configurateur\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.veloexotique.fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configurateur\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/#website\",\"url\":\"https:\\\/\\\/www.veloexotique.fr\\\/\",\"name\":\"VeloExotique.fr\",\"description\":\"Le meilleur d&#039;ailleurs\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.veloexotique.fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/#organization\",\"name\":\"VeloExotique.fr\",\"url\":\"https:\\\/\\\/www.veloexotique.fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.veloexotique.fr\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/ChatGPT-Image-26-aout-2025-09_42_31.png\",\"contentUrl\":\"https:\\\/\\\/www.veloexotique.fr\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/ChatGPT-Image-26-aout-2025-09_42_31.png\",\"width\":1024,\"height\":1024,\"caption\":\"VeloExotique.fr\"},\"image\":{\"@id\":\"https:\\\/\\\/www.veloexotique.fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCizB2T3L7pbW-QG5BALTPRg\",\"https:\\\/\\\/www.instagram.com\\\/veloexotique.fr\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Configurator - VeloExotique.fr","description":"Frame, drivetrain, wheels, cockpit, peripherals... every component matters. Thanks to our selection of exotic brands known for their innovation, performance, and excellent value for money, you can build a bike perfectly tailored to your riding style, preferences, and ambitions.","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:\/\/www.veloexotique.fr\/en\/configurator\/","og_locale":"en_US","og_type":"article","og_title":"Configurateur - VeloExotique.fr","og_description":"Cadre, transmission, roues, cockpit, p\u00e9riph\u00e9riques\u2026 chaque composant a son importance. Gr\u00e2ce \u00e0 notre s\u00e9lection de marques exotiques reconnues pour leur innovation, leur performance et leur excellent rapport qualit\u00e9-prix, vous pouvez assembler un v\u00e9lo parfaitement adapt\u00e9 \u00e0 votre pratique, \u00e0 votre style et \u00e0 vos ambitions.","og_url":"https:\/\/www.veloexotique.fr\/en\/configurator\/","og_site_name":"VeloExotique.fr","article_modified_time":"2026-05-18T20:26:26+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.veloexotique.fr\/configurateur\/","url":"https:\/\/www.veloexotique.fr\/configurateur\/","name":"Configurator - VeloExotique.fr","isPartOf":{"@id":"https:\/\/www.veloexotique.fr\/#website"},"datePublished":"2025-12-18T14:06:39+00:00","dateModified":"2026-05-18T20:26:26+00:00","description":"Frame, drivetrain, wheels, cockpit, peripherals... every component matters. Thanks to our selection of exotic brands known for their innovation, performance, and excellent value for money, you can build a bike perfectly tailored to your riding style, preferences, and ambitions.","breadcrumb":{"@id":"https:\/\/www.veloexotique.fr\/configurateur\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.veloexotique.fr\/configurateur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.veloexotique.fr\/configurateur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.veloexotique.fr\/"},{"@type":"ListItem","position":2,"name":"Configurateur"}]},{"@type":"WebSite","@id":"https:\/\/www.veloexotique.fr\/#website","url":"https:\/\/www.veloexotique.fr\/","name":"VeloExotique.fr","description":"The best of elsewhere","publisher":{"@id":"https:\/\/www.veloexotique.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.veloexotique.fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.veloexotique.fr\/#organization","name":"VeloExotique.fr","url":"https:\/\/www.veloexotique.fr\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.veloexotique.fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.veloexotique.fr\/wp-content\/uploads\/2025\/08\/ChatGPT-Image-26-aout-2025-09_42_31.png","contentUrl":"https:\/\/www.veloexotique.fr\/wp-content\/uploads\/2025\/08\/ChatGPT-Image-26-aout-2025-09_42_31.png","width":1024,"height":1024,"caption":"VeloExotique.fr"},"image":{"@id":"https:\/\/www.veloexotique.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.youtube.com\/channel\/UCizB2T3L7pbW-QG5BALTPRg","https:\/\/www.instagram.com\/veloexotique.fr\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/pages\/1762843936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/comments?post=1762843936"}],"version-history":[{"count":16,"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/pages\/1762843936\/revisions"}],"predecessor-version":[{"id":1762848022,"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/pages\/1762843936\/revisions\/1762848022"}],"wp:attachment":[{"href":"https:\/\/www.veloexotique.fr\/en\/wp-json\/wp\/v2\/media?parent=1762843936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}