{"id":63512,"date":"2026-09-11T10:30:32","date_gmt":"2026-09-11T08:30:32","guid":{"rendered":"https:\/\/cyclingceramic.com\/?page_id=63512"},"modified":"2026-09-11T14:02:00","modified_gmt":"2026-09-11T12:02:00","slug":"ospw-matrix-compatibility","status":"publish","type":"page","link":"https:\/\/cyclingceramic.com\/fr\/ospw-matrix-compatibility\/","title":{"rendered":"OSPW Matrix Compatibility"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"63512\" class=\"elementor elementor-63512\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-08e7648 e-flex e-con-boxed e-con e-parent\" data-id=\"08e7648\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fb9970a elementor-widget elementor-widget-html\" data-id=\"fb9970a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"ccodc-wrap\" id=\"ccodc\">\r\n<style>\r\n  .ccodc-wrap{\r\n    --ccodc-night:#ffffff;        \/* fond blanc *\/\r\n    --ccodc-night-2:#f5f7fa;      \/* panel \u2014 blanc froid *\/\r\n    --ccodc-night-3:#eef1f6;      \/* card *\/\r\n    --ccodc-line:#dde3ec;         \/* hairline gris clair *\/\r\n    --ccodc-gold:#b08d4d;         \/* dor\u00e9 (lisible sur blanc) *\/\r\n    --ccodc-gold-soft:#96733a;\r\n    --ccodc-ice:#0d1420;          \/* texte bleu nuit *\/\r\n    --ccodc-steel:#5b6a80;        \/* gris m\u00e9tallis\u00e9 *\/\r\n    --ccodc-steel-2:#8a97aa;\r\n    font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;\r\n    background:var(--ccodc-night);\r\n    color:var(--ccodc-ice);\r\n    max-width:1080px;margin:0 auto;padding:48px 28px 40px;\r\n    box-sizing:border-box;\r\n  }\r\n  .ccodc-wrap *,.ccodc-wrap *::before,.ccodc-wrap *::after{box-sizing:border-box;margin:0;padding:0;}\r\n\r\n  \/* ---------- header ---------- *\/\r\n  .ccodc-kicker{display:flex;align-items:center;gap:12px;font-size:11px;font-weight:600;\r\n    letter-spacing:.28em;text-transform:uppercase;color:var(--ccodc-gold);}\r\n  .ccodc-kicker::after{content:\"\";flex:1;height:1px;background:linear-gradient(90deg,var(--ccodc-gold),transparent);opacity:.5;}\r\n  .ccodc-title{font-size:clamp(26px,4vw,38px);font-weight:800;letter-spacing:-.02em;margin-top:14px;}\r\n  .ccodc-title em{font-style:normal;color:var(--ccodc-gold);}\r\n  .ccodc-sub{margin-top:10px;font-size:15px;line-height:1.6;color:var(--ccodc-steel);max-width:640px;}\r\n\r\n  \/* ---------- new range strip ---------- *\/\r\n  .ccodc-new{margin-top:30px;border:1px solid var(--ccodc-gold);background:var(--ccodc-night-2);padding:20px 22px;}\r\n  .ccodc-new-head{display:flex;align-items:center;gap:12px;font-size:11px;font-weight:700;\r\n    letter-spacing:.24em;text-transform:uppercase;color:var(--ccodc-gold);}\r\n  .ccodc-new-head::after{content:\"\";flex:1;height:1px;background:linear-gradient(90deg,var(--ccodc-gold),transparent);opacity:.5;}\r\n  .ccodc-new-sub{margin-top:8px;font-size:13px;line-height:1.55;color:var(--ccodc-steel);max-width:620px;}\r\n  .ccodc-new-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:10px;margin-top:16px;}\r\n  .ccodc-new-card{appearance:none;text-align:left;cursor:pointer;font-family:inherit;width:100%;\r\n    background:var(--ccodc-night);border:1px solid var(--ccodc-line);padding:16px 18px;\r\n    color:var(--ccodc-ice);transition:border-color .2s,transform .15s;}\r\n  .ccodc-new-card:hover{border-color:var(--ccodc-gold);transform:translateY(-1px);}\r\n  .ccodc-new-name{font-size:16px;font-weight:800;letter-spacing:-.01em;}\r\n  .ccodc-new-spec{margin-top:6px;font-size:11.5px;line-height:1.5;color:var(--ccodc-steel);}\r\n  .ccodc-new-cta{margin-top:10px;font-size:11px;font-weight:600;letter-spacing:.08em;\r\n    text-transform:uppercase;color:var(--ccodc-gold);}\r\n  .ccodc-new-cta::after{content:\" \u2192\";}\r\n\r\n  \/* ---------- discipline tabs ---------- *\/\r\n  .ccodc-tabs{display:flex;gap:8px;margin-top:34px;border-bottom:1px solid var(--ccodc-line);flex-wrap:wrap;}\r\n  .ccodc-tab{appearance:none;background:none;border:none;cursor:pointer;\r\n    font-family:inherit;font-size:13px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;\r\n    color:var(--ccodc-steel-2);padding:12px 18px 14px;position:relative;transition:color .2s;}\r\n  .ccodc-tab:hover{color:var(--ccodc-steel);}\r\n  .ccodc-tab.is-active{color:var(--ccodc-ice);}\r\n  .ccodc-tab.is-active::after{content:\"\";position:absolute;left:14px;right:14px;bottom:-1px;height:2px;background:var(--ccodc-gold);}\r\n\r\n  \/* ---------- step labels ---------- *\/\r\n  .ccodc-step{display:flex;align-items:baseline;gap:10px;margin:30px 0 16px;flex-wrap:wrap;}\r\n  .ccodc-step-n{font-size:12px;font-weight:700;color:var(--ccodc-gold);letter-spacing:.1em;}\r\n  .ccodc-step-t{font-size:15px;font-weight:600;color:var(--ccodc-ice);}\r\n  .ccodc-step-h{font-size:13px;color:var(--ccodc-steel-2);}\r\n\r\n  \/* ---------- search ---------- *\/\r\n  .ccodc-search{position:relative;max-width:420px;}\r\n  .ccodc-search input{width:100%;background:var(--ccodc-night-2);border:1px solid var(--ccodc-line);\r\n    padding:12px 16px 12px 42px;font-family:inherit;font-size:14px;color:var(--ccodc-ice);\r\n    outline:none;transition:border-color .2s;}\r\n  .ccodc-search input:focus{border-color:var(--ccodc-gold);}\r\n  .ccodc-search input::placeholder{color:var(--ccodc-steel-2);}\r\n  .ccodc-search svg{position:absolute;left:14px;top:50%;transform:translateY(-50%);width:16px;height:16px;\r\n    stroke:var(--ccodc-steel-2);fill:none;stroke-width:2;pointer-events:none;}\r\n\r\n  \/* ---------- derailleur grid ---------- *\/\r\n  .ccodc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:10px;margin-top:16px;}\r\n  .ccodc-rd{appearance:none;text-align:left;cursor:pointer;font-family:inherit;\r\n    background:var(--ccodc-night-2);border:1px solid var(--ccodc-line);\r\n    padding:14px 16px;color:var(--ccodc-ice);transition:border-color .2s,transform .15s,background .2s;}\r\n  .ccodc-rd:hover{border-color:var(--ccodc-steel-2);transform:translateY(-1px);}\r\n  .ccodc-rd.is-active{border-color:var(--ccodc-gold);background:var(--ccodc-night-3);}\r\n  .ccodc-group{grid-column:1\/-1;display:flex;align-items:center;gap:12px;margin-top:10px;\r\n    font-size:11px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;color:var(--ccodc-steel);}\r\n  .ccodc-group:first-child{margin-top:0;}\r\n  .ccodc-group::after{content:\"\";flex:1;height:1px;background:var(--ccodc-line);}\r\n  .ccodc-rd-name{font-size:15px;font-weight:700;letter-spacing:-.01em;line-height:1.3;}\r\n  .ccodc-rd.is-active .ccodc-rd-name{color:var(--ccodc-gold-soft);}\r\n  .ccodc-rd-spec{margin-top:5px;font-size:11.5px;color:var(--ccodc-steel);letter-spacing:.02em;}\r\n  .ccodc-rd-cap{margin-top:7px;font-size:10.5px;line-height:1.45;color:var(--ccodc-steel-2);}\r\n  .ccodc-empty{display:none;margin-top:16px;font-size:13.5px;color:var(--ccodc-steel);}\r\n  .ccodc-empty.is-visible{display:block;}\r\n  .ccodc-empty a{color:var(--ccodc-gold);text-decoration:none;}\r\n\r\n  \/* ---------- result panel ---------- *\/\r\n  .ccodc-result{display:none;margin-top:8px;}\r\n  .ccodc-result.is-visible{display:block;animation:ccodcIn .3s ease;}\r\n  @keyframes ccodcIn{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}\r\n  .ccodc-result-head{display:flex;align-items:center;gap:22px;margin-bottom:16px;\r\n    background:var(--ccodc-night-2);border:1px solid var(--ccodc-line);padding:16px 20px;}\r\n  .ccodc-result-txt{min-width:0;}\r\n  .ccodc-result-rd{display:block;font-size:20px;font-weight:800;color:var(--ccodc-gold);letter-spacing:-.01em;}\r\n  .ccodc-result-spec{display:block;margin-top:4px;font-size:12.5px;color:var(--ccodc-steel);}\r\n  @media (max-width:560px){.ccodc-result-head{gap:14px;padding:12px 14px;}}\r\n\r\n  .ccodc-cages{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px;}\r\n  .ccodc-cage{background:var(--ccodc-night-3);border:1px solid var(--ccodc-line);\r\n    padding:18px 18px 16px;display:flex;flex-direction:column;gap:4px;position:relative;overflow:hidden;}\r\n  .ccodc-cage::before{content:\"\";position:absolute;top:0;left:0;right:0;height:2px;\r\n    background:linear-gradient(90deg,var(--ccodc-gold),transparent 70%);opacity:.7;}\r\n  .ccodc-cage-img{height:150px;margin:-4px -4px 12px;background:#fff;border:1px solid var(--ccodc-line);\r\n    display:flex;align-items:center;justify-content:center;padding:10px;}\r\n  .ccodc-cage-img img{max-width:100%;max-height:100%;object-fit:contain;display:block;\r\n    filter:drop-shadow(0 5px 12px rgba(13,20,32,.14));}\r\n  @media (max-width:560px){.ccodc-cage-img{height:170px;}}\r\n  .ccodc-cage-family{font-size:10.5px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--ccodc-steel);}\r\n  .ccodc-cage-name{font-size:15.5px;font-weight:700;margin-top:2px;line-height:1.3;}\r\n  .ccodc-cage-spec{font-size:11.5px;color:var(--ccodc-steel-2);margin-top:4px;}\r\n  .ccodc-cage-sku{margin-top:10px;font-size:12px;color:var(--ccodc-steel);}\r\n  .ccodc-cage-sku b{color:var(--ccodc-ice);font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.01em;}\r\n  .ccodc-cage a{margin-top:12px;align-self:flex-start;font-size:12px;font-weight:600;letter-spacing:.08em;\r\n    text-transform:uppercase;color:var(--ccodc-gold);text-decoration:none;display:inline-flex;align-items:center;gap:6px;}\r\n  .ccodc-cage a::after{content:\"\u2192\";transition:transform .2s;}\r\n  .ccodc-cage a:hover::after{transform:translateX(3px);}\r\n  .ccodc-cage-note{margin-top:14px;font-size:12.5px;line-height:1.55;color:var(--ccodc-steel);}\r\n  .ccodc-cage-note a{color:var(--ccodc-gold);text-decoration:none;}\r\n\r\n  \/* ---------- service strip ---------- *\/\r\n  .ccodc-serv{margin-top:44px;}\r\n  .ccodc-serv-head{font-size:11px;font-weight:600;letter-spacing:.28em;text-transform:uppercase;\r\n    color:var(--ccodc-gold);display:flex;align-items:center;gap:12px;}\r\n  .ccodc-serv-head::after{content:\"\";flex:1;height:1px;background:linear-gradient(90deg,var(--ccodc-gold),transparent);opacity:.5;}\r\n  .ccodc-serv-sub{margin-top:8px;font-size:13px;color:var(--ccodc-steel);max-width:620px;}\r\n  .ccodc-serv-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));gap:10px;margin-top:16px;}\r\n  .ccodc-serv-card{display:flex;align-items:center;gap:14px;background:var(--ccodc-night-2);\r\n    border:1px solid var(--ccodc-line);padding:12px 16px;text-decoration:none;\r\n    transition:border-color .2s,transform .15s;}\r\n  .ccodc-serv-card:hover{border-color:var(--ccodc-gold);transform:translateY(-1px);}\r\n  .ccodc-serv-card img{width:52px;height:52px;object-fit:contain;background:#fff;padding:3px;flex:0 0 auto;}\r\n  .ccodc-serv-name{font-size:13.5px;font-weight:700;color:var(--ccodc-ice);}\r\n  .ccodc-serv-use{margin-top:2px;font-size:11px;color:var(--ccodc-steel-2);}\r\n\r\n  \/* ---------- reassurance footer ---------- *\/\r\n  .ccodc-foot{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1px;\r\n    background:var(--ccodc-line);border:1px solid var(--ccodc-line);overflow:hidden;margin-top:40px;}\r\n  .ccodc-foot-item{background:var(--ccodc-night-2);padding:18px 20px;}\r\n  .ccodc-foot-item h4{font-size:11px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--ccodc-gold);}\r\n  .ccodc-foot-item p{margin-top:6px;font-size:12.5px;line-height:1.55;color:var(--ccodc-steel);}\r\n  .ccodc-foot-item p a{color:var(--ccodc-gold-soft);text-decoration:none;}\r\n\r\n  @media (max-width:560px){\r\n    .ccodc-wrap{padding:34px 18px 30px;}\r\n    .ccodc-tab{padding:10px 12px 12px;font-size:12px;}\r\n    .ccodc-new{padding:16px 16px;}\r\n  }\r\n<\/style>\r\n\r\n  <p class=\"ccodc-kicker\" id=\"ccodcKicker\"><\/p>\r\n  <h2 class=\"ccodc-title\" id=\"ccodcTitle\"><\/h2>\r\n  <p class=\"ccodc-sub\" id=\"ccodcSub\"><\/p>\r\n\r\n  <div class=\"ccodc-new\">\r\n    <p class=\"ccodc-new-head\" id=\"ccodcNewHead\"><\/p>\r\n    <p class=\"ccodc-new-sub\" id=\"ccodcNewSub\"><\/p>\r\n    <div class=\"ccodc-new-row\" id=\"ccodcNewRow\"><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"ccodc-tabs\" role=\"tablist\" id=\"ccodcTabs\"><\/div>\r\n\r\n  <div id=\"ccodcFinder\">\r\n    <div class=\"ccodc-step\">\r\n      <span class=\"ccodc-step-n\">01<\/span>\r\n      <span class=\"ccodc-step-t\" id=\"ccodcStep1T\"><\/span>\r\n      <span class=\"ccodc-step-h\" id=\"ccodcStep1H\"><\/span>\r\n    <\/div>\r\n    <div class=\"ccodc-search\">\r\n      <svg viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"7\"><\/circle><line x1=\"21\" y1=\"21\" x2=\"16.5\" y2=\"16.5\"><\/line><\/svg>\r\n      <input type=\"text\" id=\"ccodcSearch\" autocomplete=\"off\">\r\n    <\/div>\r\n    <div class=\"ccodc-grid\" id=\"ccodcGrid\"><\/div>\r\n    <p class=\"ccodc-empty\" id=\"ccodcEmpty\"><\/p>\r\n\r\n    <div class=\"ccodc-result\" id=\"ccodcResult\">\r\n      <div class=\"ccodc-step\">\r\n        <span class=\"ccodc-step-n\">02<\/span>\r\n        <span class=\"ccodc-step-t\" id=\"ccodcStep2T\"><\/span>\r\n      <\/div>\r\n      <div class=\"ccodc-result-head\">\r\n        <div class=\"ccodc-result-txt\">\r\n          <span class=\"ccodc-result-rd\" id=\"ccodcResRd\"><\/span>\r\n          <span class=\"ccodc-result-spec\" id=\"ccodcResSpec\"><\/span>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"ccodc-cages\" id=\"ccodcCages\"><\/div>\r\n      <p class=\"ccodc-cage-note\" id=\"ccodcNote\"><\/p>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"ccodc-serv\">\r\n    <p class=\"ccodc-serv-head\" id=\"ccodcServHead\"><\/p>\r\n    <p class=\"ccodc-serv-sub\" id=\"ccodcServSub\"><\/p>\r\n    <div class=\"ccodc-serv-row\" id=\"ccodcServRow\"><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"ccodc-foot\" id=\"ccodcFoot\"><\/div>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/* ==========================================================================\r\n     LANGUAGE \u2014 the only line to change between the three pages.\r\n     \"en\" on \/oversized-cage-compatibility-matrix\/\r\n     \"fr\" on \/fr\/\u2026   \"es\" on \/es\/\u2026\r\n     ========================================================================== *\/\r\n  var LANG = \"en\";\r\n\r\n  \/* ==========================================================================\r\n     PERMALINKS per language. FR\/ES slugs come from the site's own hreflang\r\n     tags (TranslatePress), not guessed.\r\n     The four Off-Road products are private (B2B) until 8 October 2026, so\r\n     their translated slugs are not readable yet \u2014 they fall back to the EN\r\n     permalink. Replace them here once the products go public.\r\n     ========================================================================== *\/\r\n  var URLS = {\r\n    en: {\r\n      shimPro:\"\/product\/ospw-pro-for-shimano-ultegra-dura-ace\/\",\r\n      shimRace:\"\/product\/ospw-race-4-spoke-for-shimano-ultegra-dura-ace\/\",\r\n      shimAero:\"\/product\/shimano-ultegra-dura-ace-oversized-derailleur-aero-cage-14-19t\/\",\r\n      shim105Pro:\"\/product\/ospw-pro-for-shimano-105\/\",\r\n      shim105Race:\"\/product\/ospw-race-4-spoke-for-shimano-105\/\",\r\n      shim105Aero:\"\/product\/shimano-105-di2-r7100-50-12s-105-r7000-11s-12s-oversized-derailleur-aero-cage-14-19t\/\",\r\n      shimClassic:\"\/product\/oversized-derailleur-cage-shimano-9000-6800\/\",\r\n      shimGrx:\"\/product\/shimano-grx-rx-11-12sp-max-36t-double-oversized-derailleur-cage-gravel-14-19t\/\",\r\n      sramPro:\"\/product\/sram-axs-12s-rival-force-red-oversized-derailleur-cage-14-19t\/\",\r\n      sramRace:\"\/product\/ospw-race-for-sram-red-force-axs\/\",\r\n      sramAero:\"\/product\/sram-axs-12s-rival-force-red-oversized-derailleur-aero-cage-14-19t-12-speed-sram\/\",\r\n      sramXplr:\"\/product\/sram-axs-xplr-12s-rival-force-red\/\",\r\n      sramApex:\"\/product\/odc-for-sram-apex-1\/\",\r\n      sramEtap:\"\/product\/odc-for-sram-etap-11-speed\/\",\r\n      sramMech:\"\/product\/oversized-derailleur-cage-sram-mechanical\/\",\r\n      campa:\"\/product\/campagnolo-12s-eps-oversized-derailleur-cage-14-19t\/\",\r\n      xplr13:\"\/product\/sram-ospw-xplr-13-speed\/\",\r\n      ttype:\"\/product\/sram-ospw-t-type\/\",\r\n      stype:\"\/product\/sram-ospw-s-type\/\",\r\n      oil:\"\/product\/pulley-wheels-oil\/\",\r\n      pw1419:\"\/product\/oversized-pulley-wheels-14-19-tooth\/\",\r\n      pw1420:\"\/product\/oversized-pulley-wheels-14-20-t-off-road\/\",\r\n      cleaner:\"\/product\/cleaner-bearings\/\",\r\n      servicekit:\"\/product\/ospw-pw-service-kit\/\",\r\n      servicekitOR:\"\/product\/ospw-pw-off-road-service-kit\/\",\r\n      grease:\"\/product\/long-life-time-grease\/\",\r\n      contact:\"\/contact-us\/\",\r\n      support:\"\/support\/support-for-oversized-cage-cyclingceramic\/how-to-install-an-oversized-cage-cyclingceramic\/\"\r\n    },\r\n    fr: {\r\n      shimPro:\"\/fr\/produit\/ospw-pro-pour-shimano-ultegra-dura-ace\/\",\r\n      shimRace:\"\/fr\/produit\/ospw-race-4-rayons-pour-shimano-ultegra-dura-ace\/\",\r\n      shimAero:\"\/fr\/produit\/cage-de-derailleur-oversized-shimano-ultegra-dura-ace-aero-14-19-dents\/\",\r\n      shim105Pro:\"\/fr\/produit\/ospw-pro-pour-shimano-105\/\",\r\n      shim105Race:\"\/fr\/produit\/ospw-race-4-rayons-pour-shimano-105\/\",\r\n      shim105Aero:\"\/fr\/produit\/shimano-105-di2-r7100-50-12v-105-r7000-11v-12v-derailleur-a-grande-cage-aerodynamique-14-19t\/\",\r\n      shimClassic:\"\/fr\/produit\/cage-de-derailleur-surdimensionnee-shimano-9000-6800\/\",\r\n      shimGrx:\"\/fr\/produit\/cage-de-derailleur-shimano-grx-rx-11-12-vitesses-double-oversize-pour-cassette-36t-gravel-14-19t\/\",\r\n      sramPro:\"\/fr\/produit\/cage-surdimensionnee-pour-derailleur-sram-axs-12v-rival-force-red-14-19t\/\",\r\n      sramRace:\"\/fr\/produit\/ospw-course-pour-sram-red-force-axs\/\",\r\n      sramAero:\"\/fr\/produit\/cage-surdimensionnee-sram-axs-12v-rival-force-red-14-19t-12-vitesses-sram\/\",\r\n      sramXplr:\"\/fr\/produit\/sram-axs-xplr-12v-rival-force-red\/\",\r\n      sramApex:\"\/fr\/produit\/odc-pour-sram-apex-2\/\",\r\n      sramEtap:\"\/fr\/produit\/odc-pour-sram-etap-11-vitesses\/\",\r\n      sramMech:\"\/fr\/produit\/cage-de-derailleur-surdimensionnee-sram-mecanique\/\",\r\n      campa:\"\/fr\/produit\/cage-de-derailleur-surdimensionnee-campagnolo-12s-eps-14-19t\/\",\r\n      oil:\"\/fr\/produit\/roues-de-poulie-huile\/\",\r\n      pw1419:\"\/fr\/produit\/oversized-pulley-wheels-14-19-tooth\/\",\r\n      cleaner:\"\/fr\/produit\/roulements-propres\/\",\r\n      servicekit:\"\/fr\/produit\/kit-de-service-ospw-pw\/\",\r\n      servicekitOR:\"\/fr\/produit\/ospw-pw-off-road-service-kit\/\",\r\n      grease:\"\/fr\/produit\/graisse-longue-duree\/\",\r\n      contact:\"\/fr\/nous-contacter\/\",\r\n      support:\"\/fr\/soutien\/support-pour-cyclisme-en-cage-surdimensionnee-ceramique\/comment-installer-une-cage-surdimensionnee-pour-velo-en-ceramique\/\"\r\n    },\r\n    es: {\r\n      shimPro:\"\/es\/producto\/ospw-pro-para-shimano-ultegra-dura-ace\/\",\r\n      shimRace:\"\/es\/producto\/ospw-race-4-radios-para-shimano-ultegra-dura-ace\/\",\r\n      shimAero:\"\/es\/producto\/jaula-sobredimensionada-de-desviador-aero-shimano-ultegra-dura-ace-14-19t\/\",\r\n      shim105Pro:\"\/es\/producto\/ospw-pro-para-shimano-105\/\",\r\n      shim105Race:\"\/es\/producto\/ospw-race-4-radios-para-shimano-105\/\",\r\n      shim105Aero:\"\/es\/producto\/shimano-105-di2-r7100-50-12v-105-r7000-11v-12v-caja-de-cambio-sobredimensionada-aero-14-19t\/\",\r\n      shimClassic:\"\/es\/producto\/jaula-de-cambio-sobredimensionada-shimano-9000-6800\/\",\r\n      shimGrx:\"\/es\/producto\/caja-de-cambio-delantera-oversized-doble-shimano-grx-rx-11-12v-max-36t-para-gravel-14-19t\/\",\r\n      sramPro:\"\/es\/producto\/sram-axs-12s-rival-force-red-caja-de-transmision-sobredimensionada-14-19t\/\",\r\n      sramRace:\"\/es\/producto\/ospw-race-para-sram-red-force-axs\/\",\r\n      sramAero:\"\/es\/producto\/caja-de-desviador-sobredimensionada-sram-axs-12v-rival-force-red-aero-14-19t-sram-12-velocidades\/\",\r\n      sramXplr:\"\/es\/producto\/sram-axs-xplr-12-velocidades-rival-force-red\/\",\r\n      sramApex:\"\/es\/producto\/odc-para-sram-apex-1\/\",\r\n      sramEtap:\"\/es\/producto\/odc-para-sram-etap-11-velocidades\/\",\r\n      sramMech:\"\/es\/producto\/jaula-de-desviador-sobredimensionada-sram-mecanica\/\",\r\n      campa:\"\/es\/producto\/cambio-campagnolo-12s-eps-caja-sobredimensionada-14-19t\/\",\r\n      oil:\"\/es\/producto\/ruedas-de-polea-aceite\/\",\r\n      pw1419:\"\/es\/producto\/oversized-pulley-wheels-14-19-tooth\/\",\r\n      cleaner:\"\/es\/producto\/rodamientos-limpios\/\",\r\n      servicekit:\"\/es\/producto\/kit-de-servicio-ospw-pw\/\",\r\n      servicekitOR:\"\/es\/producto\/ospw-pw-off-road-service-kit\/\",\r\n      grease:\"\/es\/producto\/grasa-de-larga-duracion\/\",\r\n      contact:\"\/es\/contactanos\/\",\r\n      support:\"\/es\/soporte\/soporte-para-ciclismo-de-caja-sobredimensionada-ceramico\/como-instalar-una-jaula-sobredimensionada-de-ciclismo-ceramico\/\"\r\n    }\r\n  };\r\n\r\n  function U(key){\r\n    var m = URLS[LANG] || URLS.en;\r\n    return m[key] || URLS.en[key];\r\n  }\r\n\r\n  \/* ==========================================================================\r\n     UI COPY\r\n     ========================================================================== *\/\r\n  var T = {\r\n    en: {\r\n      kicker:\"Tech Sheet\", titleA:\"Find your \", titleB:\"Oversized Cage\",\r\n      sub:\"Select your rear derailleur \u2014 we tell you exactly which CyclingCeramic oversized derailleur cage fits, its pulley configuration and its reference.\",\r\n      newHead:\"Off-Road range\",\r\n      newSub:\"Three cages on the 14\/20T oversized pulley platform, for 13-speed gravel and SRAM MTB: XPLR 13, Eagle T-Type and Eagle AXS S-Type.\",\r\n      tabs:[\"Road\",\"Gravel\",\"MTB\"],\r\n      step1:\"Your rear derailleur\", step1h:\"\u2014 filter by groupset, model or reference\",\r\n      placeholder:\"e.g. R9250, AXS, GRX, XPLR, Eagle\u2026\",\r\n      empty:'No match. Not sure about your derailleur? <a href=\"'+\"@contact\"+'\">Ask us<\/a> \u2014 we answer fast.',\r\n      step2:\"Your cage\",\r\n      pulleys:\"{p} pulleys\", ref:\"Ref.\", view:\"View product\", seeCompat:\"See compatibility\",\r\n      notes:{\r\n        road:'Not sure which generation you run? The reference is engraved on the derailleur cage. <a href=\"@contact\">Ask us<\/a> if in doubt.',\r\n        gravel:'Gravel cages use an off-road grease and sealing specification. Respect the published maximum sprocket \u2014 a larger cassette will not clear the cage.',\r\n        mtb:'Check the mount before ordering: T-Type is UDH full-mount only, S-Type fits standard-hanger Eagle AXS derailleurs. The two are not interchangeable \u2014 <a href=\"@support\">see the installation guide<\/a>.'\r\n      },\r\n      servHead:\"Service it right\",\r\n      servSub:\"Pulley bearings are the fastest-wearing part of a drivetrain. Re-oil them regularly, and replace the wheels rather than the whole cage when they are worn.\",\r\n      serv:{oil:[\"Pulley Wheels Oil\",\"Every service\"],\r\n            pw1419:[\"Pulley Wheels 14\/19T\",\"Road &amp; gravel cages\"],\r\n            pw1420:[\"Pulley Wheels 14\/20T\",\"Off-Road cages\"],\r\n            servicekit:[\"OSPW Service Kit\",\"Road &amp; gravel cages\"],\r\n            servicekitOR:[\"Off-Road Service Kit\",\"XPLR 13 \u00b7 T-Type \u00b7 S-Type\"],\r\n            grease:[\"Long Life Grease\",\"Recommended off-road\"],\r\n            cleaner:[\"Cleaner\",\"Before re-oiling\"]},\r\n      foot:[[\"4-year warranty\",\"Every CyclingCeramic oversized cage is covered for 4 years.\"],\r\n            [\"Hand-assembled in France\",\"Assembled and individually tested in our workshop before shipping.\"],\r\n            [\"Ceramic bearing core\",\"Aluminium pulleys, aluminium and carbon cage, low-friction sealing system.\"],\r\n            [\"Install &amp; service\",'<a href=\"@support\">Installation guide<\/a> and maintenance videos for every cage.']]\r\n    },\r\n\r\n    fr: {\r\n      kicker:\"Fiche technique\", titleA:\"Trouvez votre \", titleB:\"chape oversize\",\r\n      sub:\"S\u00e9lectionnez votre d\u00e9railleur arri\u00e8re \u2014 nous vous indiquons la chape oversize CyclingCeramic compatible, sa configuration de galets et sa r\u00e9f\u00e9rence.\",\r\n      newHead:\"Gamme Off-Road\",\r\n      newSub:\"Trois chapes sur la plateforme de galets oversize 14\/20T, pour le gravel 13 vitesses et le VTT SRAM : XPLR 13, Eagle T-Type et Eagle AXS S-Type.\",\r\n      tabs:[\"Route\",\"Gravel\",\"VTT\"],\r\n      step1:\"Votre d\u00e9railleur arri\u00e8re\", step1h:\"\u2014 filtrez par groupe, mod\u00e8le ou r\u00e9f\u00e9rence\",\r\n      placeholder:\"ex. R9250, AXS, GRX, XPLR, Eagle\u2026\",\r\n      empty:'Aucun r\u00e9sultat. Un doute sur votre d\u00e9railleur ? <a href=\"@contact\">\u00c9crivez-nous<\/a> \u2014 on r\u00e9pond vite.',\r\n      step2:\"Votre chape\",\r\n      pulleys:\"galets {p}\", ref:\"R\u00e9f.\", view:\"Voir le produit\", seeCompat:\"Voir la compatibilit\u00e9\",\r\n      notes:{\r\n        road:'Un doute sur votre g\u00e9n\u00e9ration ? La r\u00e9f\u00e9rence est grav\u00e9e sur la chape du d\u00e9railleur. <a href=\"@contact\">\u00c9crivez-nous<\/a> si besoin.',\r\n        gravel:'Les chapes gravel utilisent une graisse et une \u00e9tanch\u00e9it\u00e9 sp\u00e9cifiques tout-terrain. Respectez le pignon maximum indiqu\u00e9 \u2014 une cassette plus grande ne passera pas.',\r\n        mtb:'V\u00e9rifiez la fixation avant de commander : la T-Type est exclusivement full mount UDH, la S-Type se monte sur les d\u00e9railleurs Eagle AXS \u00e0 patte standard. Les deux ne sont pas interchangeables \u2014 <a href=\"@support\">voir la notice de montage<\/a>.'\r\n      },\r\n      servHead:\"Entretien\",\r\n      servSub:\"Les roulements de galets sont la pi\u00e8ce qui s'use le plus vite sur une transmission. Relubrifiez-les r\u00e9guli\u00e8rement et remplacez les galets plut\u00f4t que la chape enti\u00e8re lorsqu'ils sont us\u00e9s.\",\r\n      serv:{oil:[\"Huile pour galets\",\"\u00c0 chaque entretien\"],\r\n            pw1419:[\"Galets 14\/19T\",\"Chapes route &amp; gravel\"],\r\n            pw1420:[\"Galets 14\/20T\",\"Chapes Off-Road\"],\r\n            servicekit:[\"Kit d'entretien OSPW\",\"Chapes route &amp; gravel\"],\r\n            servicekitOR:[\"Kit d'entretien Off-Road\",\"XPLR 13 \u00b7 T-Type \u00b7 S-Type\"],\r\n            grease:[\"Graisse Longue Dur\u00e9e\",\"Recommand\u00e9e en tout-terrain\"],\r\n            cleaner:[\"Nettoyant\",\"Avant relubrification\"]},\r\n      foot:[[\"Garantie 4 ans\",\"Chaque chape oversize CyclingCeramic est garantie 4 ans.\"],\r\n            [\"Assembl\u00e9e en France\",\"Assembl\u00e9e et test\u00e9e individuellement dans notre atelier avant exp\u00e9dition.\"],\r\n            [\"C\u0153ur roulement c\u00e9ramique\",\"Galets aluminium, chape aluminium et carbone, syst\u00e8me d'\u00e9tanch\u00e9it\u00e9 basse friction.\"],\r\n            [\"Montage &amp; entretien\",'<a href=\"@support\">Notice de montage<\/a> et vid\u00e9os d\\'entretien pour chaque chape.']]\r\n    },\r\n\r\n    es: {\r\n      kicker:\"Ficha t\u00e9cnica\", titleA:\"Encuentra tu \", titleB:\"jaula oversize\",\r\n      sub:\"Selecciona tu cambio trasero \u2014 te indicamos qu\u00e9 jaula oversize CyclingCeramic encaja, su configuraci\u00f3n de poleas y su referencia.\",\r\n      newHead:\"Gama Off-Road\",\r\n      newSub:\"Tres jaulas sobre la plataforma de poleas oversize 14\/20T, para gravel de 13 velocidades y MTB SRAM: XPLR 13, Eagle T-Type y Eagle AXS S-Type.\",\r\n      tabs:[\"Carretera\",\"Gravel\",\"MTB\"],\r\n      step1:\"Tu cambio trasero\", step1h:\"\u2014 filtra por grupo, modelo o referencia\",\r\n      placeholder:\"p. ej. R9250, AXS, GRX, XPLR, Eagle\u2026\",\r\n      empty:'Sin resultados. \u00bfDudas con tu cambio? <a href=\"@contact\">Escr\u00edbenos<\/a> \u2014 respondemos r\u00e1pido.',\r\n      step2:\"Tu jaula\",\r\n      pulleys:\"poleas {p}\", ref:\"Ref.\", view:\"Ver producto\", seeCompat:\"Ver compatibilidad\",\r\n      notes:{\r\n        road:'\u00bfNo sabes qu\u00e9 generaci\u00f3n llevas? La referencia va grabada en la jaula del cambio. <a href=\"@contact\">Escr\u00edbenos<\/a> si tienes dudas.',\r\n        gravel:'Las jaulas gravel llevan grasa y sellado espec\u00edficos para uso off-road. Respeta el pi\u00f1\u00f3n m\u00e1ximo indicado \u2014 un casete mayor no pasar\u00e1.',\r\n        mtb:'Comprueba el anclaje antes de pedir: la T-Type es exclusivamente full mount UDH y la S-Type monta en cambios Eagle AXS con patilla est\u00e1ndar. No son intercambiables \u2014 <a href=\"@support\">consulta el manual de montaje<\/a>.'\r\n      },\r\n      servHead:\"Mantenimiento\",\r\n      servSub:\"Los rodamientos de las poleas son la pieza que m\u00e1s r\u00e1pido se desgasta de una transmisi\u00f3n. Lubr\u00edcalos con regularidad y sustituye las poleas en lugar de la jaula completa cuando est\u00e9n gastadas.\",\r\n      serv:{oil:[\"Aceite para poleas\",\"En cada mantenimiento\"],\r\n            pw1419:[\"Poleas 14\/19T\",\"Jaulas carretera y gravel\"],\r\n            pw1420:[\"Poleas 14\/20T\",\"Jaulas Off-Road\"],\r\n            servicekit:[\"Kit de mantenimiento OSPW\",\"Jaulas carretera y gravel\"],\r\n            servicekitOR:[\"Kit de mantenimiento Off-Road\",\"XPLR 13 \u00b7 T-Type \u00b7 S-Type\"],\r\n            grease:[\"Grasa de Larga Duraci\u00f3n\",\"Recomendada en off-road\"],\r\n            cleaner:[\"Limpiador\",\"Antes de lubricar\"]},\r\n      foot:[[\"Garant\u00eda de 4 a\u00f1os\",\"Todas las jaulas oversize CyclingCeramic tienen 4 a\u00f1os de garant\u00eda.\"],\r\n            [\"Ensamblada en Francia\",\"Ensamblada y probada una a una en nuestro taller antes del env\u00edo.\"],\r\n            [\"N\u00facleo de rodamiento cer\u00e1mico\",\"Poleas de aluminio, jaula de aluminio y carbono, sistema de sellado de baja fricci\u00f3n.\"],\r\n            [\"Montaje y mantenimiento\",'<a href=\"@support\">Manual de montaje<\/a> y v\u00eddeos de mantenimiento para cada jaula.']]\r\n    }\r\n  };\r\n\r\n  \/* ==========================================================================\r\n     CAGES \u2014 reference, photo, pulley config. One entry per product.\r\n     family\/name translations live in CAGE_TXT below.\r\n     ========================================================================== *\/\r\n  var CAGES = {\r\n    xplr13: {key:\"xplr13\", pulley:\"14\/20T\", weight:\"\", sku:\"CCODCSRAMXPLR13BLK \/ SLV\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2026\/08\/CyclingCeramic-Off-Road-XPLR13BLK.png\"},\r\n    ttype:  {key:\"ttype\",  pulley:\"14\/20T\", weight:\"\", sku:\"CCODCSRAMTTYPEBLK \/ SLV\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2026\/08\/CyclingCeramic-Off-Road-TTYPE-BLK.png\"},\r\n    stype:  {key:\"stype\",  pulley:\"14\/20T\", weight:\"\", sku:\"CCODCSRAMEAGLEBLK \/ SLV\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2026\/08\/CyclingCeramic-OSPWEAGLE-2.png\"},\r\n\r\n    shimPro:     {key:\"shimPro\", pulley:\"14\/19T\", weight:\"125 g\", sku:\"CCODCSHIMPRO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/CyclingCeramic-OSPW-PRO-1.png\"},\r\n    shimRace:    {key:\"shimRace\", pulley:\"14\/19T\", weight:\"105 g\", sku:\"CCODCSHIMRACE\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/Cycling_Ceramic-OSPW-SHIM-RACE-4.png\"},\r\n    shimAero:    {key:\"shimAero\", pulley:\"14\/19T\", weight:\"137 g\", sku:\"CCODCSHIMAERO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/02\/CyclingCeramic-CCODCSHIMAERO-1.png\"},\r\n    shim105Pro:  {key:\"shim105Pro\", pulley:\"14\/19T\", weight:\"125 g\", sku:\"CCODCSHIM105PRO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/CyclingCeramic-OSPW-PRO-1.png\"},\r\n    shim105Race: {key:\"shim105Race\", pulley:\"14\/19T\", weight:\"105 g\", sku:\"CCODCSHIM105RACE\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/Cycling_Ceramic-OSPW-SHIM-RACE-4.png\"},\r\n    shim105Aero: {key:\"shim105Aero\", pulley:\"14\/19T\", weight:\"137 g\", sku:\"CCODCSHIM105AERO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/02\/CyclingCeramic-CCODCSHIMAERO-1.png\"},\r\n    shimClassic: {key:\"shimClassic\", pulley:\"16\/16T\", weight:\"105 g\", sku:\"CCODCSHIM\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2020\/02\/CCODCSHIMB.png\"},\r\n    shimGrx:     {key:\"shimGrx\", pulley:\"14\/19T\", weight:\"125 g\", sku:\"CCODCSHIMGRXPRO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/CyclingCeramic-OSPW-PRO-1.png\"},\r\n\r\n    sramPro:     {key:\"sramPro\", pulley:\"14\/19T\", weight:\"125 g\", sku:\"CCODCSRAMAXSPRO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/CyclingCeramic-OSPW-PRO-3.png\"},\r\n    sramRace:    {key:\"sramRace\", pulley:\"14\/19T\", weight:\"105 g\", sku:\"CCODCSRAMAXSRACE\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/CCODCSRAMAXSRACEBLK-scaled.jpg\"},\r\n    sramAero:    {key:\"sramAero\", pulley:\"14\/19T\", weight:\"137 g\", sku:\"CCODCSRAM12AERO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2024\/04\/Cycling-Ceramic-Chape-2-fond-blanc.jpg\"},\r\n    sramEtap:    {key:\"sramEtap\", pulley:\"14\/19T\", weight:\"105 g\", sku:\"CCODCSRAMETAP\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2022\/11\/CCODCSRAMETAPB.jpg\"},\r\n    sramMech:    {key:\"sramMech\", pulley:\"16\/16T\", weight:\"105 g\", sku:\"CCODCSRAM\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2020\/09\/CCODCSRAMB.png\"},\r\n    sramXplr:    {key:\"sramXplr\", pulley:\"14\/19T\", weight:\"125 g\", sku:\"CCODCSRAMXPLRPRO\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/01\/CyclingCeramic-OSPW-PRO-3.png\"},\r\n    sramApex:    {key:\"sramApex\", pulley:\"14\/19T\", weight:\"105 g\", sku:\"CCODCSRAMAPEX1\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2022\/11\/CCODCSRAMAPEX1B.jpg\"},\r\n    campa:       {key:\"campa\", pulley:\"14\/19T\", weight:\"105 g\", sku:\"CCODCCAMPA\",\r\n      img:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2022\/11\/CCODCCAMPA11-BLK.png\"}\r\n  };\r\n\r\n  \/* family + name per language: [family, name] *\/\r\n  var CAGE_TXT = {\r\n    en:{\r\n      xplr13:[\"OSPW Off-Road\",\"SRAM XPLR 13 Speed\"], ttype:[\"OSPW Off-Road\",\"SRAM Eagle T-Type\"],\r\n      stype:[\"OSPW Off-Road\",\"SRAM Eagle AXS S-Type\"],\r\n      shimPro:[\"OSPW Pro\",\"Shimano Ultegra &amp; Dura-Ace\"], shimRace:[\"OSPW Race 4-Spoke\",\"Shimano Ultegra &amp; Dura-Ace\"],\r\n      shimAero:[\"AERO Cage\",\"Shimano Ultegra &amp; Dura-Ace\"],\r\n      shim105Pro:[\"OSPW Pro\",\"Shimano 105\"], shim105Race:[\"OSPW Race 4-Spoke\",\"Shimano 105\"],\r\n      shim105Aero:[\"AERO Cage\",\"Shimano 105 Di2\"],\r\n      shimClassic:[\"Oversized Cage\",\"Shimano 9000 \/ 6800 generation\"],\r\n      shimGrx:[\"OSPW Pro Gravel\",\"Shimano GRX\"],\r\n      sramPro:[\"OSPW Pro\",\"SRAM Red \/ Force \/ Rival AXS\"], sramRace:[\"OSPW Race\",\"SRAM Red \/ Force \/ Rival AXS\"],\r\n      sramAero:[\"AERO Cage\",\"SRAM AXS 12s\"], sramEtap:[\"Oversized Cage\",\"SRAM eTap 11s\"],\r\n      sramMech:[\"Oversized Cage\",\"SRAM Mech 11s\"], sramXplr:[\"OSPW Pro Gravel\",\"SRAM AXS XPLR 12s\"],\r\n      sramApex:[\"Oversized Cage Gravel\",\"SRAM Apex 1 \/ Rival 1 \/ Force 1\"],\r\n      campa:[\"Oversized Cage\",\"Campagnolo 11 \/ 12s EPS &amp; Mech\"]\r\n    },\r\n    fr:{\r\n      xplr13:[\"OSPW Off-Road\",\"SRAM XPLR 13 vitesses\"], ttype:[\"OSPW Off-Road\",\"SRAM Eagle T-Type\"],\r\n      stype:[\"OSPW Off-Road\",\"SRAM Eagle AXS S-Type\"],\r\n      shimPro:[\"OSPW Pro\",\"Shimano Ultegra &amp; Dura-Ace\"], shimRace:[\"OSPW Race 4 rayons\",\"Shimano Ultegra &amp; Dura-Ace\"],\r\n      shimAero:[\"Chape AERO\",\"Shimano Ultegra &amp; Dura-Ace\"],\r\n      shim105Pro:[\"OSPW Pro\",\"Shimano 105\"], shim105Race:[\"OSPW Race 4 rayons\",\"Shimano 105\"],\r\n      shim105Aero:[\"Chape AERO\",\"Shimano 105 Di2\"],\r\n      shimClassic:[\"Chape Oversize\",\"Shimano g\u00e9n\u00e9ration 9000 \/ 6800\"],\r\n      shimGrx:[\"OSPW Pro Gravel\",\"Shimano GRX\"],\r\n      sramPro:[\"OSPW Pro\",\"SRAM Red \/ Force \/ Rival AXS\"], sramRace:[\"OSPW Race\",\"SRAM Red \/ Force \/ Rival AXS\"],\r\n      sramAero:[\"Chape AERO\",\"SRAM AXS 12v\"], sramEtap:[\"Chape Oversize\",\"SRAM eTap 11v\"],\r\n      sramMech:[\"Chape Oversize\",\"SRAM m\u00e9ca 11v\"], sramXplr:[\"OSPW Pro Gravel\",\"SRAM AXS XPLR 12v\"],\r\n      sramApex:[\"Chape Oversize Gravel\",\"SRAM Apex 1 \/ Rival 1 \/ Force 1\"],\r\n      campa:[\"Chape Oversize\",\"Campagnolo 11 \/ 12v EPS &amp; m\u00e9ca\"]\r\n    },\r\n    es:{\r\n      xplr13:[\"OSPW Off-Road\",\"SRAM XPLR 13 velocidades\"], ttype:[\"OSPW Off-Road\",\"SRAM Eagle T-Type\"],\r\n      stype:[\"OSPW Off-Road\",\"SRAM Eagle AXS S-Type\"],\r\n      shimPro:[\"OSPW Pro\",\"Shimano Ultegra y Dura-Ace\"], shimRace:[\"OSPW Race 4 radios\",\"Shimano Ultegra y Dura-Ace\"],\r\n      shimAero:[\"Jaula AERO\",\"Shimano Ultegra y Dura-Ace\"],\r\n      shim105Pro:[\"OSPW Pro\",\"Shimano 105\"], shim105Race:[\"OSPW Race 4 radios\",\"Shimano 105\"],\r\n      shim105Aero:[\"Jaula AERO\",\"Shimano 105 Di2\"],\r\n      shimClassic:[\"Jaula Oversize\",\"Shimano generaci\u00f3n 9000 \/ 6800\"],\r\n      shimGrx:[\"OSPW Pro Gravel\",\"Shimano GRX\"],\r\n      sramPro:[\"OSPW Pro\",\"SRAM Red \/ Force \/ Rival AXS\"], sramRace:[\"OSPW Race\",\"SRAM Red \/ Force \/ Rival AXS\"],\r\n      sramAero:[\"Jaula AERO\",\"SRAM AXS 12v\"], sramEtap:[\"Jaula Oversize\",\"SRAM eTap 11v\"],\r\n      sramMech:[\"Jaula Oversize\",\"SRAM mec\u00e1nico 11v\"], sramXplr:[\"OSPW Pro Gravel\",\"SRAM AXS XPLR 12v\"],\r\n      sramApex:[\"Jaula Oversize Gravel\",\"SRAM Apex 1 \/ Rival 1 \/ Force 1\"],\r\n      campa:[\"Jaula Oversize\",\"Campagnolo 11 \/ 12v EPS y mec\u00e1nico\"]\r\n    }\r\n  };\r\n\r\n  \/* ==========================================================================\r\n     DERAILLEURS \u2014 names are manufacturer designations, never translated.\r\n     spec + max sprocket live in SPECS, per language.\r\n     ========================================================================== *\/\r\n  var DATA = {\r\n    road: [\r\n      {group:\"Shimano\"},\r\n      {id:\"da12\",  name:\"Dura-Ace R9250 \u00b7 Ultegra R8150\", find:\"9200 9250 8100 8150 di2 dura ace ultegra\", cages:[\"shimPro\",\"shimRace\",\"shimAero\"]},\r\n      {id:\"da11\",  name:\"Dura-Ace R9100 \/ R9150 \u00b7 Ultegra R8000 \/ R8050\", find:\"9100 9150 8000 8050 dura ace ultegra\", cages:[\"shimPro\",\"shimRace\",\"shimAero\"]},\r\n      {id:\"s10512\",name:\"105 R7100 \u00b7 105 Di2 R7150\", find:\"7100 7150 105 di2\", cages:[\"shim105Pro\",\"shim105Race\",\"shim105Aero\"]},\r\n      {id:\"s10511\",name:\"105 R7000\", find:\"7000 105\", cages:[\"shim105Pro\",\"shim105Race\",\"shim105Aero\"]},\r\n      {id:\"shimold\",name:\"Dura-Ace 9000 \/ 9070 \u00b7 Ultegra 6800 \/ 6870\", find:\"9000 9070 6800 6870 7900 7970 6700 6770\", cages:[\"shimClassic\"]},\r\n\r\n      {group:\"SRAM\"},\r\n      {id:\"axs\",   name:\"Red \u00b7 Force \u00b7 Rival AXS\", find:\"axs etap red force rival 12\", cages:[\"sramPro\",\"sramRace\",\"sramAero\"]},\r\n      {id:\"etap11\",name:\"Red eTap\", find:\"etap 11 red\", cages:[\"sramEtap\"]},\r\n      {id:\"sram22\",name:\"Red 22 \u00b7 Force 22 \u00b7 Rival 22\", find:\"red 22 force rival mech mecanique mecanico\", cages:[\"sramMech\"]},\r\n\r\n      {group:\"Campagnolo\"},\r\n      {id:\"campa\", name:\"Super Record \u00b7 Record \u00b7 Chorus\", find:\"campagnolo campa super record chorus eps\", cages:[\"campa\"]}\r\n    ],\r\n\r\n    gravel: [\r\n      {group:\"SRAM\"},\r\n      {id:\"xplr13\",name:\"Red XPLR \u00b7 Force XPLR \u00b7 Rival XPLR\", short:\"SRAM XPLR 13\",\r\n       find:\"xplr13 xplr 13 e1 red force rival axs gravel udh garbaruk\", cages:[\"xplr13\"]},\r\n      {id:\"xplr12\",name:\"Red \u00b7 Force \u00b7 Rival XPLR AXS\", find:\"xplr 12 axs gravel\", cages:[\"sramXplr\"]},\r\n      {id:\"apex1\", name:\"Apex 1 \u00b7 Rival 1 \u00b7 Force 1\", find:\"apex rival force 1x 11 gravel\", cages:[\"sramApex\"]},\r\n\r\n      {group:\"Shimano\"},\r\n      {id:\"grx12\", name:\"GRX RX820 \/ RX825\", find:\"grx 820 825 12 gravel\", cages:[\"shimGrx\"]},\r\n      {id:\"grx11\", name:\"GRX RX810 \/ RX815\", find:\"grx 810 815 800 805 11 gravel\", cages:[\"shimGrx\"]}\r\n    ],\r\n\r\n    mtb: [\r\n      {groupKey:\"ttypeGroup\"},\r\n      {id:\"ttype\", name:\"Eagle T-Type XX SL \u00b7 XX \u00b7 X0 \u00b7 GX \u00b7 Eagle 90 \u00b7 Eagle 70\", short:\"SRAM Eagle T-Type\",\r\n       find:\"eagle ttype t-type transmission xx x0 gx 90 70 mtb udh full mount\", cages:[\"ttype\"]},\r\n\r\n      {groupKey:\"stypeGroup\"},\r\n      {id:\"stype\", name:\"XX1 Eagle AXS \u00b7 X01 Eagle AXS \u00b7 GX Eagle AXS\", short:\"SRAM Eagle AXS S-Type\",\r\n       find:\"eagle axs s-type stype xx1 x01 gx mtb hanger patte patilla\", cages:[\"stype\"]}\r\n    ]\r\n  };\r\n\r\n  \/* [spec, max sprocket] per derailleur, per language *\/\r\n  var SPECS = {\r\n    en:{\r\n      da12:[\"Di2 \u00b7 12-speed\",\"Max 36T sprocket\"],\r\n      da11:[\"Mech &amp; Di2 \u00b7 11-speed\",\"Max 36T sprocket\"],\r\n      s10512:[\"Mech &amp; Di2 \u00b7 12-speed\",\"Max 36T sprocket\"],\r\n      s10511:[\"Mech \u00b7 11-speed \u00b7 GS &amp; SS\",\"Max 36T sprocket\"],\r\n      shimold:[\"Mech &amp; Di2 \u00b7 11-speed\",\"Max 36T sprocket\"],\r\n      axs:[\"eTap AXS \u00b7 12-speed road\",\"Max 36T sprocket\"],\r\n      etap11:[\"eTap \u00b7 11-speed\",\"Max 32T sprocket\"],\r\n      sram22:[\"Mechanical \u00b7 11-speed\",\"Max 32T sprocket\"],\r\n      campa:[\"EPS &amp; Mech \u00b7 11 and 12-speed\",\"Max 34T sprocket\"],\r\n      xplr13:[\"AXS E1 \u00b7 13-speed\",\"Max 46T stock \u00b7 52T with Garbaruk \u00b7 UDH frames only\"],\r\n      xplr12:[\"AXS \u00b7 12-speed\",\"Max 44T sprocket\"],\r\n      apex1:[\"Mechanical &amp; AXS \u00b7 1\u00d711\",\"Max 42T sprocket\"],\r\n      grx12:[\"Mech &amp; Di2 \u00b7 12-speed\",\"Max 36T \u2014 double\"],\r\n      grx11:[\"Mech &amp; Di2 \u00b7 11-speed\",\"Max 36T \u2014 double\"],\r\n      ttype:[\"Transmission \u00b7 12-speed\",\"Max 52T \u00b7 UDH frames only\"],\r\n      stype:[\"Eagle AXS \u00b7 12-speed\",\"Max 52T \u00b7 not for T-Type \/ UDH full mount\"],\r\n      ttypeGroup:\"SRAM Transmission \u2014 UDH full mount\", stypeGroup:\"SRAM Eagle AXS \u2014 standard hanger\"\r\n    },\r\n    fr:{\r\n      da12:[\"Di2 \u00b7 12 vitesses\",\"Pignon max 36T\"],\r\n      da11:[\"M\u00e9ca &amp; Di2 \u00b7 11 vitesses\",\"Pignon max 36T\"],\r\n      s10512:[\"M\u00e9ca &amp; Di2 \u00b7 12 vitesses\",\"Pignon max 36T\"],\r\n      s10511:[\"M\u00e9ca \u00b7 11 vitesses \u00b7 GS &amp; SS\",\"Pignon max 36T\"],\r\n      shimold:[\"M\u00e9ca &amp; Di2 \u00b7 11 vitesses\",\"Pignon max 36T\"],\r\n      axs:[\"eTap AXS \u00b7 12 vitesses route\",\"Pignon max 36T\"],\r\n      etap11:[\"eTap \u00b7 11 vitesses\",\"Pignon max 32T\"],\r\n      sram22:[\"M\u00e9canique \u00b7 11 vitesses\",\"Pignon max 32T\"],\r\n      campa:[\"EPS &amp; m\u00e9ca \u00b7 11 et 12 vitesses\",\"Pignon max 34T\"],\r\n      xplr13:[\"AXS E1 \u00b7 13 vitesses\",\"46T d'origine \u00b7 52T avec Garbaruk \u00b7 cadres UDH uniquement\"],\r\n      xplr12:[\"AXS \u00b7 12 vitesses\",\"Pignon max 44T\"],\r\n      apex1:[\"M\u00e9canique &amp; AXS \u00b7 1\u00d711\",\"Pignon max 42T\"],\r\n      grx12:[\"M\u00e9ca &amp; Di2 \u00b7 12 vitesses\",\"Pignon max 36T \u2014 double\"],\r\n      grx11:[\"M\u00e9ca &amp; Di2 \u00b7 11 vitesses\",\"Pignon max 36T \u2014 double\"],\r\n      ttype:[\"Transmission \u00b7 12 vitesses\",\"Pignon max 52T \u00b7 cadres UDH uniquement\"],\r\n      stype:[\"Eagle AXS \u00b7 12 vitesses\",\"Pignon max 52T \u00b7 pas pour T-Type \/ UDH full mount\"],\r\n      ttypeGroup:\"SRAM Transmission \u2014 full mount UDH\", stypeGroup:\"SRAM Eagle AXS \u2014 patte standard\"\r\n    },\r\n    es:{\r\n      da12:[\"Di2 \u00b7 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 36T\"],\r\n      da11:[\"Mec\u00e1nico y Di2 \u00b7 11 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 36T\"],\r\n      s10512:[\"Mec\u00e1nico y Di2 \u00b7 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 36T\"],\r\n      s10511:[\"Mec\u00e1nico \u00b7 11 velocidades \u00b7 GS y SS\",\"Pi\u00f1\u00f3n m\u00e1x. 36T\"],\r\n      shimold:[\"Mec\u00e1nico y Di2 \u00b7 11 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 36T\"],\r\n      axs:[\"eTap AXS \u00b7 12 velocidades carretera\",\"Pi\u00f1\u00f3n m\u00e1x. 36T\"],\r\n      etap11:[\"eTap \u00b7 11 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 32T\"],\r\n      sram22:[\"Mec\u00e1nico \u00b7 11 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 32T\"],\r\n      campa:[\"EPS y mec\u00e1nico \u00b7 11 y 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 34T\"],\r\n      xplr13:[\"AXS E1 \u00b7 13 velocidades\",\"46T de origen \u00b7 52T con Garbaruk \u00b7 solo cuadros UDH\"],\r\n      xplr12:[\"AXS \u00b7 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 44T\"],\r\n      apex1:[\"Mec\u00e1nico y AXS \u00b7 1\u00d711\",\"Pi\u00f1\u00f3n m\u00e1x. 42T\"],\r\n      grx12:[\"Mec\u00e1nico y Di2 \u00b7 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 36T \u2014 doble\"],\r\n      grx11:[\"Mec\u00e1nico y Di2 \u00b7 11 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 36T \u2014 doble\"],\r\n      ttype:[\"Transmission \u00b7 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 52T \u00b7 solo cuadros UDH\"],\r\n      stype:[\"Eagle AXS \u00b7 12 velocidades\",\"Pi\u00f1\u00f3n m\u00e1x. 52T \u00b7 no para T-Type \/ UDH full mount\"],\r\n      ttypeGroup:\"SRAM Transmission \u2014 full mount UDH\", stypeGroup:\"SRAM Eagle AXS \u2014 patilla est\u00e1ndar\"\r\n    }\r\n  };\r\n\r\n  \/* ========================================================================== *\/\r\n\r\n  var t  = T[LANG] || T.en;\r\n  var sp = SPECS[LANG] || SPECS.en;\r\n  var ct = CAGE_TXT[LANG] || CAGE_TXT.en;\r\n\r\n  var TABKEYS = [\"road\",\"gravel\",\"mtb\"];\r\n  var current = \"road\";\r\n\r\n  function esc(s){ return String(s == null ? \"\" : s); }\r\n  function links(html){ return String(html).replace(\/@contact\/g, U(\"contact\")).replace(\/@support\/g, U(\"support\")); }\r\n  function spec(id){ return (sp[id] || [\"\",\"\"])[0]; }\r\n  function pulleyTxt(p){ return esc(t.pulleys).replace(\"{p}\", esc(p)); }\r\n  function cap(id){  return (sp[id] || [\"\",\"\"])[1]; }\r\n\r\n  var tabsEl   = document.getElementById(\"ccodcTabs\");\r\n  var gridEl   = document.getElementById(\"ccodcGrid\");\r\n  var searchEl = document.getElementById(\"ccodcSearch\");\r\n  var emptyEl  = document.getElementById(\"ccodcEmpty\");\r\n  var resultEl = document.getElementById(\"ccodcResult\");\r\n  var resRd    = document.getElementById(\"ccodcResRd\");\r\n  var resSpec  = document.getElementById(\"ccodcResSpec\");\r\n  var cagesEl  = document.getElementById(\"ccodcCages\");\r\n  var noteEl   = document.getElementById(\"ccodcNote\");\r\n  var newRow   = document.getElementById(\"ccodcNewRow\");\r\n\r\n  \/* ---------- static copy ---------- *\/\r\n  document.getElementById(\"ccodcKicker\").textContent  = t.kicker;\r\n  document.getElementById(\"ccodcTitle\").innerHTML     = esc(t.titleA) + \"<em>\" + esc(t.titleB) + \"<\/em>\";\r\n  document.getElementById(\"ccodcSub\").textContent     = t.sub;\r\n  document.getElementById(\"ccodcNewHead\").textContent = t.newHead;\r\n  document.getElementById(\"ccodcNewSub\").textContent  = t.newSub;\r\n  document.getElementById(\"ccodcStep1T\").textContent  = t.step1;\r\n  document.getElementById(\"ccodcStep1H\").textContent  = t.step1h;\r\n  document.getElementById(\"ccodcStep2T\").textContent  = t.step2;\r\n  document.getElementById(\"ccodcServHead\").textContent= t.servHead;\r\n  document.getElementById(\"ccodcServSub\").textContent = t.servSub;\r\n  searchEl.placeholder = t.placeholder;\r\n  emptyEl.innerHTML    = links(t.empty);\r\n\r\n  \/* Service strip \u2014 the consumables shown follow the active discipline.\r\n     Road never shows the Off-Road kit or the 14\/20T wheels; off-road tabs add\r\n     the long-life grease. *\/\r\n  var SERV_IMGS = {\r\n    oil:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2020\/02\/CCPWOIL.jpg\",\r\n    pw1419:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2022\/11\/CCPWSRAMNRW12B-scaled.jpg\",\r\n    pw1420:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2026\/09\/CyclingCeramic-Off-Road-14-20-pulleys.png\",\r\n    servicekit:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2025\/02\/Design-sans-titre-8.png\",\r\n    servicekitOR:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2026\/09\/CyclingCeramic-PW-service-Kit-Off-Road-1.png\",\r\n    grease:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2023\/09\/CCGREASELIFE-scaled.jpg\",\r\n    cleaner:\"https:\/\/cyclingceramic.com\/wp-content\/uploads\/2023\/09\/CCCLEANER.jpg\"\r\n  };\r\n  var SERV_BY_TAB = {\r\n    road:   [\"oil\",\"pw1419\",\"servicekit\",\"cleaner\"],\r\n    gravel: [\"oil\",\"pw1419\",\"pw1420\",\"servicekitOR\",\"grease\",\"cleaner\"],\r\n    mtb:    [\"oil\",\"pw1420\",\"servicekitOR\",\"grease\",\"cleaner\"]\r\n  };\r\n  var servRow = document.getElementById(\"ccodcServRow\");\r\n\r\n  function renderServ(){\r\n    servRow.innerHTML = (SERV_BY_TAB[current] || SERV_BY_TAB.road).map(function(key){\r\n      var s = t.serv[key];\r\n      if (!s) return \"\";\r\n      return '<a class=\"ccodc-serv-card\" href=\"' + U(key) + '\">' +\r\n        '<img src=\"' + SERV_IMGS[key] + '\" alt=\"' + esc(s[0]) + '\" loading=\"lazy\" decoding=\"async\">' +\r\n        '<span><span class=\"ccodc-serv-name\">' + s[0] + '<\/span><br>' +\r\n        '<span class=\"ccodc-serv-use\">' + s[1] + '<\/span><\/span><\/a>';\r\n    }).join(\"\");\r\n  }\r\n\r\n  document.getElementById(\"ccodcFoot\").innerHTML = t.foot.map(function(f){\r\n    return '<div class=\"ccodc-foot-item\"><h4>' + f[0] + '<\/h4><p>' + links(f[1]) + '<\/p><\/div>';\r\n  }).join(\"\");\r\n\r\n  \/* ---------- tabs ---------- *\/\r\n  TABKEYS.forEach(function(key, i){\r\n    var b = document.createElement(\"button\");\r\n    b.className = \"ccodc-tab\" + (key === current ? \" is-active\" : \"\");\r\n    b.setAttribute(\"role\",\"tab\");\r\n    b.textContent = t.tabs[i];\r\n    b.addEventListener(\"click\", function(){ setTab(key); });\r\n    tabsEl.appendChild(b);\r\n  });\r\n\r\n  function setTab(key){\r\n    current = key;\r\n    [].forEach.call(tabsEl.children, function(b, i){ b.classList.toggle(\"is-active\", TABKEYS[i] === key); });\r\n    searchEl.value = \"\";\r\n    renderGrid(\"\");\r\n    renderServ();\r\n    resultEl.classList.remove(\"is-visible\");\r\n    emptyEl.classList.remove(\"is-visible\");\r\n  }\r\n\r\n  \/* tag rows with their discipline so a cross-tab search knows which note to show *\/\r\n  TABKEYS.forEach(function(key){\r\n    DATA[key].forEach(function(r){ if (!r.group && !r.groupKey) r.disc = key; });\r\n  });\r\n\r\n  function haystack(r){\r\n    return (r.name + \" \" + spec(r.id) + \" \" + cap(r.id) + \" \" + (r.find || \"\")).toLowerCase();\r\n  }\r\n\r\n  \/* ---------- grid ----------\r\n     No query: the active discipline. Query: every discipline is searched,\r\n     so typing \"GRX\" from the Road tab still returns the GRX rows. *\/\r\n  function rowsToShow(q){\r\n    if (!q) return DATA[current];\r\n    var out = [];\r\n    TABKEYS.forEach(function(key, i){\r\n      var hits = DATA[key].filter(function(r){ return r.id && haystack(r).indexOf(q) !== -1; });\r\n      if (hits.length){ out.push({group: t.tabs[i]}); out = out.concat(hits); }\r\n    });\r\n    return out;\r\n  }\r\n\r\n  function renderGrid(q){\r\n    gridEl.innerHTML = \"\";\r\n    rowsToShow(q || \"\").forEach(function(row){\r\n      if (row.group || row.groupKey){\r\n        var g = document.createElement(\"div\");\r\n        g.className = \"ccodc-group\";\r\n        g.textContent = row.groupKey ? sp[row.groupKey] : row.group;\r\n        gridEl.appendChild(g);\r\n        return;\r\n      }\r\n      var b = document.createElement(\"button\");\r\n      b.className = \"ccodc-rd\";\r\n      b.dataset.id = row.id;\r\n      b.innerHTML =\r\n        '<div class=\"ccodc-rd-name\">' + esc(row.name) + '<\/div>' +\r\n        '<div class=\"ccodc-rd-spec\">' + spec(row.id) + '<\/div>' +\r\n        (cap(row.id) ? '<div class=\"ccodc-rd-cap\">' + cap(row.id) + '<\/div>' : '');\r\n      b.addEventListener(\"click\", function(){ select(row, b); });\r\n      gridEl.appendChild(b);\r\n    });\r\n  }\r\n\r\n  searchEl.addEventListener(\"input\", function(){\r\n    var q = searchEl.value.trim().toLowerCase();\r\n    renderGrid(q);\r\n    emptyEl.classList.toggle(\"is-visible\", q !== \"\" && gridEl.querySelectorAll(\".ccodc-rd\").length === 0);\r\n  });\r\n\r\n  \/* ---------- selection ---------- *\/\r\n  function select(row, btn){\r\n    [].forEach.call(gridEl.querySelectorAll(\".ccodc-rd\"), function(el){ el.classList.remove(\"is-active\"); });\r\n    if (btn) btn.classList.add(\"is-active\");\r\n\r\n    resRd.innerHTML   = esc(row.name);\r\n    resSpec.innerHTML = spec(row.id) + (cap(row.id) ? \" \u00b7 \" + cap(row.id) : \"\");\r\n\r\n    cagesEl.innerHTML = \"\";\r\n    row.cages.forEach(function(key){\r\n      var c = CAGES[key];\r\n      if (!c) return;\r\n      var txt = ct[key] || CAGE_TXT.en[key] || [\"\",\"\"];\r\n      var d = document.createElement(\"div\");\r\n      d.className = \"ccodc-cage\";\r\n      d.innerHTML =\r\n        (c.img ? '<div class=\"ccodc-cage-img\"><img src=\"' + c.img + '\" alt=\"' + esc(txt[0]) + ' \u2014 ' + esc(txt[1]) +\r\n                 '\" loading=\"lazy\" decoding=\"async\"><\/div>' : '') +\r\n        '<div class=\"ccodc-cage-family\">' + txt[0] + '<\/div>' +\r\n        '<div class=\"ccodc-cage-name\">' + txt[1] + '<\/div>' +\r\n        (c.pulley || c.weight\r\n          ? '<div class=\"ccodc-cage-spec\">' + (c.pulley ? pulleyTxt(c.pulley) : '') +\r\n            (c.pulley && c.weight ? ' \u00b7 ' : '') + (c.weight ? esc(c.weight) : '') + '<\/div>'\r\n          : '') +\r\n        '<div class=\"ccodc-cage-sku\">' + esc(t.ref) + ' <b>' + esc(c.sku) + '<\/b><\/div>' +\r\n        '<a href=\"' + U(c.key) + '\">' + esc(t.view) + '<\/a>';\r\n      cagesEl.appendChild(d);\r\n    });\r\n\r\n    noteEl.innerHTML = links(t.notes[row.disc || current] || \"\");\r\n    resultEl.classList.add(\"is-visible\");\r\n    if (resultEl.scrollIntoView) resultEl.scrollIntoView({behavior:\"smooth\", block:\"nearest\"});\r\n  }\r\n\r\n  \/* ---------- new-range shortcuts ---------- *\/\r\n  [{tab:\"gravel\", id:\"xplr13\"}, {tab:\"mtb\", id:\"ttype\"}, {tab:\"mtb\", id:\"stype\"}].forEach(function(ref){\r\n    var row = DATA[ref.tab].filter(function(r){ return r.id === ref.id; })[0];\r\n    if (!row) return;\r\n    var c = CAGES[row.cages[0]];\r\n    var b = document.createElement(\"button\");\r\n    b.className = \"ccodc-new-card\";\r\n    b.innerHTML =\r\n      '<div class=\"ccodc-new-name\">' + esc(row.short || row.name) + '<\/div>' +\r\n      '<div class=\"ccodc-new-spec\">' + spec(row.id) +\r\n        (c.pulley ? ' \u00b7 ' + pulleyTxt(c.pulley) : '') +\r\n        '<br>' + esc(t.ref) + ' ' + esc(c.sku) + '<\/div>' +\r\n      '<div class=\"ccodc-new-cta\">' + esc(t.seeCompat) + '<\/div>';\r\n    b.addEventListener(\"click\", function(){\r\n      setTab(ref.tab);\r\n      select(row, gridEl.querySelector('.ccodc-rd[data-id=\"' + ref.id + '\"]'));\r\n    });\r\n    newRow.appendChild(b);\r\n  });\r\n\r\n  renderGrid(\"\");\r\n  renderServ();\r\n})();\r\n<\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>01 02<\/p>","protected":false},"author":1065,"featured_media":63040,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"wpai_generated_summary":"","footnotes":""},"class_list":["post-63512","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/pages\/63512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/users\/1065"}],"replies":[{"embeddable":true,"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/comments?post=63512"}],"version-history":[{"count":3,"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/pages\/63512\/revisions"}],"predecessor-version":[{"id":63541,"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/pages\/63512\/revisions\/63541"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/media\/63040"}],"wp:attachment":[{"href":"https:\/\/cyclingceramic.com\/fr\/wp-json\/wp\/v2\/media?parent=63512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}