{"id":1602,"date":"2025-06-26T21:22:46","date_gmt":"2025-06-27T01:22:46","guid":{"rendered":"https:\/\/dmcc-series.com\/live-bracket-pro\/"},"modified":"2026-06-20T00:36:25","modified_gmt":"2026-06-20T04:36:25","slug":"live-bracket-pro","status":"publish","type":"page","link":"https:\/\/dmcc-series.com\/en\/live-bracket-pro\/","title":{"rendered":"Live Bracket &#8211; Pro"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1602\" class=\"elementor elementor-1602 elementor-1598\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-5713e69 e-flex e-con-boxed e-con e-parent\" data-id=\"5713e69\" 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-079a62e elementor-widget__width-inherit elementor-widget elementor-widget-n-accordion\" data-id=\"079a62e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;default_state&quot;:&quot;all_collapsed&quot;,&quot;max_items_expended&quot;:&quot;multiple&quot;,&quot;n_accordion_animation_duration&quot;:{&quot;unit&quot;:&quot;ms&quot;,&quot;size&quot;:400,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-accordion.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-accordion\" aria-label=\"Accordion. Open links with Enter or Space, close with Escape, and navigate with Arrow Keys\">\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-7970\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"1\" tabindex=\"0\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-7970\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> Qualifying score <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" role=\"region\" aria-labelledby=\"e-n-accordion-item-7970\" class=\"elementor-element elementor-element-0b2dada e-flex e-con-boxed e-con e-child\" data-id=\"0b2dada\" 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-7845e42 elementor-widget elementor-widget-html\" data-id=\"7845e42\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================================================\r\n     CLUB CLASH \u2014 Widget Scoring via Firebase (Elementor HTML)\r\n     ============================================================ --><style>#dmmc-scoring *{box-sizing:border-box;margin:0;padding:0;}\r\n#dmmc-scoring{font-family:'Arial Narrow',Arial,sans-serif;width:100%;overflow-x:auto;}\r\n#dmmc-scoring .hdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;}\r\n#dmmc-scoring .hdr-title{font-size:12px;font-weight:700;letter-spacing:0.12em;text-transform:uppercase;color:#999;}\r\n#dmmc-scoring .live-badge{display:flex;align-items:center;gap:5px;font-size:11px;color:#999;}\r\n#dmmc-scoring .dot{width:7px;height:7px;border-radius:50%;background:#16a34a;animation:blink2 1.4s infinite;}\r\n#dmmc-scoring .updated{font-size:10px;color:#bbb;margin-bottom:8px;}\r\n@keyframes blink2{0%,100%{opacity:1}50%{opacity:0.25}}\r\n#dmmc-scoring table{width:100%;border-collapse:collapse;font-size:13px;min-width:700px;}\r\n#dmmc-scoring thead tr{background:#111;}\r\n#dmmc-scoring thead th{padding:8px;text-align:right;font-size:9px;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#aaa;white-space:nowrap;}\r\n#dmmc-scoring thead th.left{text-align:left;}\r\n#dmmc-scoring .sub-hdr{background:#1a1a1a;}\r\n#dmmc-scoring .sub-hdr th{font-size:8px;color:#555;padding:3px 8px;}\r\n#dmmc-scoring tbody tr{border-bottom:1px solid #eee;}\r\n#dmmc-scoring tbody tr:nth-child(even){background:#f9f9f9;}\r\n#dmmc-scoring tbody tr:hover{background:#f0f0f0;}\r\n#dmmc-scoring td{padding:7px 8px;text-align:right;color:#333;font-size:13px;}\r\n#dmmc-scoring .td-pos{font-weight:700;color:#111;text-align:left;}\r\n#dmmc-scoring .td-pos.p1{color:#d97706;}\r\n#dmmc-scoring .td-pos.p2{color:#64748b;}\r\n#dmmc-scoring .td-pos.p3{color:#b45309;}\r\n#dmmc-scoring .td-num{color:#aaa;font-size:11px;text-align:left;}\r\n#dmmc-scoring .td-name{font-weight:700;color:#111;text-align:left;white-space:nowrap;}\r\n#dmmc-scoring .td-sub{color:#aaa;font-size:12px;}\r\n#dmmc-scoring .score-pill{display:inline-block;background:#111;color:#fff;border-radius:3px;padding:2px 7px;font-size:12px;font-weight:700;min-width:28px;text-align:center;}\r\n#dmmc-scoring .score-pill.zero{background:#ddd;color:#999;}\r\n#dmmc-scoring .td-best{font-weight:700;color:#d97706;font-size:14px;}\r\n#dmmc-scoring .loading{text-align:center;padding:32px;color:#aaa;font-size:13px;}\r\n<\/style><div id=\"dmmc-scoring\"><div class=\"hdr\"><span class=\"hdr-title\">Pointage qualification<\/span><span class=\"live-badge\"><span class=\"dot\"><\/span>Live<\/span><\/div><div class=\"updated\" id=\"dmmc-scoring-updated\"><\/div><div id=\"dmmc-scoring-body\"><div class=\"loading\">Connexion Firebase...<\/div><\/div><\/div><script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-app-compat.js\"><\/script><script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-database-compat.js\"><\/script><script>(function(){\r\n  const FIREBASE_URL = 'https:\/\/dmcc-contender-default-rtdb.firebaseio.com';\r\n\r\n    if (!window._dmccproShared) {\r\n    window._dmccproShared = firebase.initializeApp({ databaseURL: FIREBASE_URL }, 'dmccpro-shared');\r\n  }\r\n  const db = firebase.database(window._dmccproShared);\r\n\r\n  function pill(val) {\r\n    const n = Number(val);\r\n    return `<span class=\"score-pill${n===0?' zero':''}\">${n}<\/span>`;\r\n  }\r\n\r\n  function render(rows) {\r\n    if (!rows || !rows.length) {\r\n      document.getElementById('dmmc-scoring-body').innerHTML = '<div class=\"loading\">Aucune donn\u00e9e.<\/div>';\r\n      return;\r\n    }\r\n    let html = '<table><thead>';\r\n    html += '<tr>';\r\n    html += '<th class=\"left\">POS<\/th><th class=\"left\">#<\/th><th class=\"left\">PILOTE<\/th>';\r\n    html += '<th colspan=\"5\" style=\"text-align:center;border-left:2px solid #333;\">RUN 1<\/th>';\r\n    html += '<th colspan=\"5\" style=\"text-align:center;border-left:2px solid #333;\">RUN 2<\/th>';\r\n    html += '<th style=\"border-left:2px solid #333;\">MEILLEUR<\/th>';\r\n    html += '<\/tr>';\r\n    html += '<tr class=\"sub-hdr\">';\r\n    html += '<th class=\"left\"><\/th><th class=\"left\"><\/th><th class=\"left\"><\/th>';\r\n    html += '<th style=\"border-left:2px solid #222;\">Style<\/th><th>Angle<\/th><th>Line<\/th><th>Speed<\/th><th>Total<\/th>';\r\n    html += '<th style=\"border-left:2px solid #222;\">Style<\/th><th>Angle<\/th><th>Line<\/th><th>Speed<\/th><th>Total<\/th>';\r\n    html += '<th style=\"border-left:2px solid #222;\"><\/th>';\r\n    html += '<\/tr><\/thead><tbody>';\r\n\r\n    rows.forEach(r => {\r\n      const posClass = r.pos==1?'td-pos p1':r.pos==2?'td-pos p2':r.pos==3?'td-pos p3':'td-pos';\r\n      html += '<tr>';\r\n      html += `<td class=\"${posClass}\">${r.pos}<\/td>`;\r\n      html += `<td class=\"td-num\">${r.num}<\/td>`;\r\n      html += `<td class=\"td-name\">${r.name}<\/td>`;\r\n      html += `<td class=\"td-sub\" style=\"border-left:2px solid #eee;\">${r.style1}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.angle1}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.line1}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.speed1}<\/td>`;\r\n      html += `<td>${pill(r.run1)}<\/td>`;\r\n      html += `<td class=\"td-sub\" style=\"border-left:2px solid #eee;\">${r.style2}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.angle2}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.line2}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.speed2}<\/td>`;\r\n      html += `<td>${pill(r.run2)}<\/td>`;\r\n      html += `<td class=\"td-best\" style=\"border-left:2px solid #eee;\">${r.overallBest}<\/td>`;\r\n      html += '<\/tr>';\r\n    });\r\n\r\n    html += '<\/tbody><\/table>';\r\n    document.getElementById('dmmc-scoring-body').innerHTML = html;\r\n  }\r\n\r\n  db.ref('\/dmccpro\/scoring').on('value', snap => {\r\n    const data = snap.val();\r\n    if (data) render(data);\r\n  });\r\n\r\n  db.ref('\/dmccpro\/updatedAt').on('value', snap => {\r\n    const t = snap.val();\r\n    if (t) {\r\n      const d = new Date(t);\r\n      document.getElementById('dmmc-scoring-updated').textContent =\r\n        'Mis \u00e0 jour : ' + d.toLocaleTimeString('fr-CA');\r\n    }\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-7971\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"2\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-7971\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> Qualifying results <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" role=\"region\" aria-labelledby=\"e-n-accordion-item-7971\" class=\"elementor-element elementor-element-b2be25a e-con-full e-flex e-con e-child\" data-id=\"b2be25a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cc8a07c elementor-widget elementor-widget-html\" data-id=\"cc8a07c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================================================\r\n     CLUB CLASH \u2014 Widget Qualifs via Firebase (Elementor HTML)\r\n     ============================================================ --><style>#dmmc-qualifs *{box-sizing:border-box;margin:0;padding:0;}\r\n#dmmc-qualifs{font-family:'Arial Narrow',Arial,sans-serif;width:100%;}\r\n#dmmc-qualifs .hdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;}\r\n#dmmc-qualifs .hdr-title{font-size:12px;font-weight:700;letter-spacing:0.12em;text-transform:uppercase;color:#999;}\r\n#dmmc-qualifs .live-badge{display:flex;align-items:center;gap:5px;font-size:11px;color:#999;}\r\n#dmmc-qualifs .dot{width:7px;height:7px;border-radius:50%;background:#16a34a;animation:blink 1.4s infinite;}\r\n#dmmc-qualifs .updated{font-size:10px;color:#bbb;margin-bottom:8px;}\r\n@keyframes blink{0%,100%{opacity:1}50%{opacity:0.25}}\r\n#dmmc-qualifs table{width:100%;border-collapse:collapse;font-size:13px;}\r\n#dmmc-qualifs thead tr{background:#111;color:#fff;}\r\n#dmmc-qualifs thead th{padding:8px;text-align:right;font-size:9px;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#aaa;}\r\n#dmmc-qualifs thead th.left{text-align:left;}\r\n#dmmc-qualifs tbody tr{border-bottom:1px solid #eee;}\r\n#dmmc-qualifs tbody tr:nth-child(even){background:#f9f9f9;}\r\n#dmmc-qualifs tbody tr:hover{background:#f0f0f0;}\r\n#dmmc-qualifs td{padding:7px 8px;text-align:right;color:#333;font-size:13px;}\r\n#dmmc-qualifs .td-pos{font-weight:700;color:#111;text-align:left;}\r\n#dmmc-qualifs .td-pos.p1{color:#d97706;}\r\n#dmmc-qualifs .td-pos.p2{color:#64748b;}\r\n#dmmc-qualifs .td-pos.p3{color:#b45309;}\r\n#dmmc-qualifs .td-num{color:#aaa;font-size:11px;text-align:left;}\r\n#dmmc-qualifs .td-name{font-weight:700;color:#111;text-align:left;}\r\n#dmmc-qualifs .td-sub{color:#aaa;font-size:12px;}\r\n#dmmc-qualifs .td-score{font-weight:700;color:#111;}\r\n#dmmc-qualifs .pts-pill{display:inline-block;background:#111;color:#fff;border-radius:3px;padding:1px 7px;font-size:11px;font-weight:700;}\r\n#dmmc-qualifs .pts-pill.zero{background:#ddd;color:#999;}\r\n#dmmc-qualifs .ko-sep{border-top:2px solid #cc0000!important;}\r\n#dmmc-qualifs .loading{text-align:center;padding:32px;color:#aaa;font-size:13px;}\r\n<\/style><div id=\"dmmc-qualifs\"><div class=\"hdr\"><span class=\"hdr-title\"><\/span><span class=\"live-badge\"><span class=\"dot\"><\/span>Live<\/span><\/div><div class=\"updated\" id=\"dmmc-qualifs-updated\"><\/div><div id=\"dmmc-qualifs-body\"><div class=\"loading\">Connexion Firebase...<\/div><\/div><\/div><script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-app-compat.js\"><\/script><script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-database-compat.js\"><\/script><script>(function(){\r\n  const FIREBASE_URL = 'https:\/\/dmcc-contender-default-rtdb.firebaseio.com';\r\n\r\n  if (!window._dmccproShared) {\r\n    window._dmccproShared = firebase.initializeApp({ databaseURL: FIREBASE_URL }, 'dmccpro-shared');\r\n  }\r\n  const db = firebase.database(window._dmccproShared);\r\n\r\n  function pill(val, hasPts) {\r\n    const n = Number(val);\r\n    if (hasPts) return `<span class=\"pts-pill${n===0?' zero':''}\">${n}<\/span>`;\r\n    return n;\r\n  }\r\n\r\n  function render(rows) {\r\n    if (!rows || !rows.length) {\r\n      document.getElementById('dmmc-qualifs-body').innerHTML = '<div class=\"loading\">Aucune donn\u00e9e.<\/div>';\r\n      return;\r\n    }\r\n    let html = '<table><thead><tr>';\r\n    html += '<th class=\"left\">POS<\/th><th class=\"left\">#<\/th><th class=\"left\">PILOTE<\/th>';\r\n    html += '<th>SCORE<\/th><th>STYLE<\/th><th>ANGLE<\/th><th>LINE<\/th><th>PTS<\/th>';\r\n    html += '<\/tr><\/thead><tbody>';\r\n\r\n    rows.forEach((r, i) => {\r\n      const isKO = i === 12;\r\n      const posClass = r.pos==1?'td-pos p1':r.pos==2?'td-pos p2':r.pos==3?'td-pos p3':'td-pos';\r\n      html += `<tr${isKO?' class=\"ko-sep\"':''}>`;\r\n      html += `<td class=\"${posClass}\">${r.pos}<\/td>`;\r\n      html += `<td class=\"td-num\">${r.num}<\/td>`;\r\n      html += `<td class=\"td-name\">${r.name}<\/td>`;\r\n      html += `<td class=\"td-score\">${r.score}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.style}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.angle}<\/td>`;\r\n      html += `<td class=\"td-sub\">${r.line}<\/td>`;\r\n      html += `<td>${pill(r.pts, true)}<\/td>`;\r\n      html += '<\/tr>';\r\n    });\r\n\r\n    html += '<\/tbody><\/table>';\r\n    document.getElementById('dmmc-qualifs-body').innerHTML = html;\r\n  }\r\n\r\n  db.ref('\/dmccpro\/qualifs').on('value', snap => {\r\n    const data = snap.val();\r\n    if (data) render(data);\r\n  });\r\n\r\n  db.ref('\/dmccpro\/updatedAt').on('value', snap => {\r\n    const t = snap.val();\r\n    if (t) {\r\n      const d = new Date(t);\r\n      document.getElementById('dmmc-qualifs-updated').textContent =\r\n        'Mis \u00e0 jour : ' + d.toLocaleTimeString('fr-CA');\r\n    }\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-7972\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"3\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-7972\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> Top 16 <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-minus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t\t<span class='e-closed'><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-plus\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"><\/path><\/svg><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" role=\"region\" aria-labelledby=\"e-n-accordion-item-7972\" class=\"elementor-element elementor-element-2ca363f e-flex e-con-boxed e-con e-child\" data-id=\"2ca363f\" 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-a7a61d8 elementor-widget elementor-widget-html\" data-id=\"a7a61d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- DMCC PRO \u2014 Bracket Top16 (sans badge provisoire, texte noir) -->\r\n<style>\r\n#dmmc-bracket *{box-sizing:border-box;margin:0;padding:0;}\r\n#dmmc-bracket{font-family:'Arial Narrow',Arial,sans-serif;background:#fff;padding:16px;overflow-x:auto;}\r\n#dmmc-bracket .hdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;}\r\n#dmmc-bracket .hdr-title{font-size:12px;font-weight:700;letter-spacing:0.12em;text-transform:uppercase;color:#999;}\r\n#dmmc-bracket .live-badge{display:flex;align-items:center;gap:5px;font-size:11px;color:#999;}\r\n#dmmc-bracket .dot{width:7px;height:7px;border-radius:50%;background:#16a34a;animation:blk 1.4s infinite;}\r\n#dmmc-bracket .updated{font-size:10px;color:#bbb;margin-bottom:12px;}\r\n@keyframes blk{0%,100%{opacity:1}50%{opacity:0.25}}\r\n#dmmc-bracket .loading{text-align:center;padding:40px;color:#aaa;font-size:13px;}\r\n<\/style>\r\n\r\n<div id=\"dmmc-bracket\">\r\n  <div class=\"hdr\">\r\n    <span class=\"hdr-title\">Bracket \u2014 Top 16<\/span>\r\n    <span class=\"live-badge\"><span class=\"dot\"><\/span>Live<\/span>\r\n  <\/div>\r\n  <div class=\"updated\" id=\"dmmc-bracket-updated\"><\/div>\r\n  <div id=\"dmmc-bracket-body\"><div class=\"loading\">Connexion Firebase...<\/div><\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-app-compat.js\"><\/script>\r\n<script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.23.0\/firebase-database-compat.js\"><\/script>\r\n<script>\r\n(function(){\r\n  const FIREBASE_URL = 'https:\/\/dmcc-contender-default-rtdb.firebaseio.com';\r\n  if (!window._dmccproShared) {\r\n    try {\r\n      window._dmccproShared = firebase.initializeApp({ databaseURL: FIREBASE_URL }, 'dmccpro-shared');\r\n    } catch(e) {\r\n      window._dmccproShared = firebase.app('dmccpro-shared');\r\n    }\r\n  }\r\n  const db = firebase.database(window._dmccproShared);\r\n\r\n  const SLOT_H = 30, GAP = 2, MATCH_H = SLOT_H*2+GAP;\r\n  const COL_W = 160, CONN_W = 28, TOP_PAD = 36, L_PAD = 16;\r\n  const MATCH_GAP = 18;\r\n  const FF = \"'Arial Narrow',Arial,sans-serif\";\r\n\r\n  function ns(tag){ return document.createElementNS('http:\/\/www.w3.org\/2000\/svg',tag); }\r\n\r\n  function makeSlot(svg, x, y, driver, isWinner, isTbd) {\r\n    const rect = ns('rect');\r\n    rect.setAttribute('x',x); rect.setAttribute('y',y);\r\n    rect.setAttribute('width',COL_W); rect.setAttribute('height',SLOT_H);\r\n    rect.setAttribute('rx',3);\r\n    rect.setAttribute('fill', isTbd?'#fafafa': isWinner?'#111':'#f5f5f5');\r\n    rect.setAttribute('stroke','#e0e0e0'); rect.setAttribute('stroke-width','0.5');\r\n    svg.appendChild(rect);\r\n\r\n    if (!isTbd && driver) {\r\n      const seed = ns('text');\r\n      seed.setAttribute('x',x+7); seed.setAttribute('y',y+SLOT_H\/2+5);\r\n      seed.setAttribute('font-size','10');\r\n      seed.setAttribute('fill', isWinner?'#888':'#666');\r\n      seed.setAttribute('font-family',FF);\r\n      seed.textContent = driver.seed;\r\n      svg.appendChild(seed);\r\n\r\n      const name = ns('text');\r\n      name.setAttribute('x',x+22); name.setAttribute('y',y+SLOT_H\/2+5);\r\n      name.setAttribute('font-size','12');\r\n      name.setAttribute('fill', isWinner?'#fff':'#111');\r\n      name.setAttribute('font-weight', isWinner?'700':'400');\r\n      name.setAttribute('font-family',FF);\r\n      const maxChars = Math.floor((COL_W-28)\/7);\r\n      name.textContent = driver.name.length > maxChars ? driver.name.slice(0,maxChars-1)+'\u2026' : driver.name;\r\n      svg.appendChild(name);\r\n    } else {\r\n      const tbd = ns('text');\r\n      tbd.setAttribute('x',x+10); tbd.setAttribute('y',y+SLOT_H\/2+5);\r\n      tbd.setAttribute('font-size','11'); tbd.setAttribute('fill','#ccc');\r\n      tbd.setAttribute('font-style','italic'); tbd.setAttribute('font-family',FF);\r\n      tbd.textContent = 'TBD';\r\n      svg.appendChild(tbd);\r\n    }\r\n  }\r\n\r\n  function makeMatchup(svg, x, y, match) {\r\n    const dA = match ? match.a : null;\r\n    const dB = match ? match.b : null;\r\n    makeSlot(svg, x, y,             dA, dA&&dA.winner, !dA);\r\n    makeSlot(svg, x, y+SLOT_H+GAP, dB, dB&&dB.winner, !dB);\r\n    return { leftX: x, rightX: x+COL_W, cy: y+MATCH_H\/2 };\r\n  }\r\n\r\n  function makeConnLeft(svg, x1, cy1, cy2, x2) {\r\n    const midX = x1 + CONN_W\/2;\r\n    const p = ns('path');\r\n    p.setAttribute('fill','none'); p.setAttribute('stroke','#ccc'); p.setAttribute('stroke-width','1.5');\r\n    p.setAttribute('d',`M${x1} ${cy1} H${midX} V${cy2} M${midX} ${(cy1+cy2)\/2} H${x2}`);\r\n    svg.insertBefore(p, svg.firstChild);\r\n  }\r\n\r\n  function makeConnRight(svg, x1, cy1, cy2, x2) {\r\n    const midX = x1 - CONN_W\/2;\r\n    const p = ns('path');\r\n    p.setAttribute('fill','none'); p.setAttribute('stroke','#ccc'); p.setAttribute('stroke-width','1.5');\r\n    p.setAttribute('d',`M${x1} ${cy1} H${midX} V${cy2} M${midX} ${(cy1+cy2)\/2} H${x2}`);\r\n    svg.insertBefore(p, svg.firstChild);\r\n  }\r\n\r\n  function makeLine(svg, x1, y1, x2) {\r\n    const p = ns('path');\r\n    p.setAttribute('fill','none'); p.setAttribute('stroke','#ccc'); p.setAttribute('stroke-width','1.5');\r\n    p.setAttribute('d',`M${x1} ${y1} H${x2}`);\r\n    svg.insertBefore(p, svg.firstChild);\r\n  }\r\n\r\n  function makeLabel(svg, x, y, text) {\r\n    const t = ns('text');\r\n    t.setAttribute('x',x); t.setAttribute('y',y);\r\n    t.setAttribute('font-size','10'); t.setAttribute('fill','#bbb');\r\n    t.setAttribute('letter-spacing','1'); t.setAttribute('font-family',FF);\r\n    t.setAttribute('text-anchor','middle');\r\n    t.textContent = text.toUpperCase();\r\n    svg.appendChild(t);\r\n  }\r\n\r\n  function makeBox(svg, x, y, w, title, titleColor, items, useMedal) {\r\n    const pad=10, rowH=26, titleH=20;\r\n    const boxH = titleH + items.length*rowH + pad*2;\r\n    const bg = ns('rect');\r\n    bg.setAttribute('x',x); bg.setAttribute('y',y);\r\n    bg.setAttribute('width',w); bg.setAttribute('height',boxH);\r\n    bg.setAttribute('rx',4); bg.setAttribute('fill','#f8f8f8');\r\n    bg.setAttribute('stroke','#e5e5e5'); bg.setAttribute('stroke-width','0.5');\r\n    svg.appendChild(bg);\r\n\r\n    const tt = ns('text');\r\n    tt.setAttribute('x',x+pad); tt.setAttribute('y',y+pad+10);\r\n    tt.setAttribute('font-size','9'); tt.setAttribute('fill',titleColor||'#aaa');\r\n    tt.setAttribute('letter-spacing','1'); tt.setAttribute('font-family',FF);\r\n    tt.textContent = title;\r\n    svg.appendChild(tt);\r\n\r\n    const medals = ['#f59e0b','#94a3b8','#c2692a','#4a9d8f'];\r\n\r\n    items.forEach((item,i) => {\r\n      const ry = y+pad+titleH+i*rowH;\r\n      if (useMedal) {\r\n        const c = ns('circle');\r\n        c.setAttribute('cx',x+pad+9); c.setAttribute('cy',ry+12);\r\n        c.setAttribute('r',9); c.setAttribute('fill',medals[i]||'#aaa');\r\n        svg.appendChild(c);\r\n        const pt = ns('text');\r\n        pt.setAttribute('x',x+pad+9); pt.setAttribute('y',ry+16);\r\n        pt.setAttribute('text-anchor','middle'); pt.setAttribute('font-size','9');\r\n        pt.setAttribute('fill','#fff'); pt.setAttribute('font-weight','700');\r\n        pt.setAttribute('font-family',FF); pt.textContent = item.pos;\r\n        svg.appendChild(pt);\r\n        const nt = ns('text');\r\n        nt.setAttribute('x',x+pad+24); nt.setAttribute('y',ry+16);\r\n        nt.setAttribute('font-size','12'); nt.setAttribute('fill','#333');\r\n        nt.setAttribute('font-family',FF); nt.textContent = item.name;\r\n        svg.appendChild(nt);\r\n      } else {\r\n        const dr = ns('rect');\r\n        dr.setAttribute('x',x+pad); dr.setAttribute('y',ry+1);\r\n        dr.setAttribute('width',w-pad*2); dr.setAttribute('height',SLOT_H);\r\n        dr.setAttribute('rx',2);\r\n        dr.setAttribute('fill',item.winner?'#111':'#eee');\r\n        dr.setAttribute('stroke','#ddd'); dr.setAttribute('stroke-width','0.5');\r\n        svg.appendChild(dr);\r\n        const sd = ns('text');\r\n        sd.setAttribute('x',x+pad+6); sd.setAttribute('y',ry+SLOT_H\/2+6);\r\n        sd.setAttribute('font-size','10'); sd.setAttribute('fill',item.winner?'#888':'#666');\r\n        sd.setAttribute('font-family',FF); sd.textContent = item.seed;\r\n        svg.appendChild(sd);\r\n        const nm = ns('text');\r\n        nm.setAttribute('x',x+pad+20); nm.setAttribute('y',ry+SLOT_H\/2+6);\r\n        nm.setAttribute('font-size','12');\r\n        nm.setAttribute('fill',item.winner?'#fff':'#111');\r\n        nm.setAttribute('font-weight',item.winner?'700':'400');\r\n        nm.setAttribute('font-family',FF); nm.textContent = item.name;\r\n        svg.appendChild(nm);\r\n      }\r\n    });\r\n    return boxH;\r\n  }\r\n\r\n  function renderBracket(data) {\r\n    const t16L = data.top16Left   || [];\r\n    const t16R = data.top16Right  || [];\r\n    const t8L  = data.top8Left    || [];\r\n    const t8R  = data.top8Right   || [];\r\n    const f4L  = data.final4Left  || [];\r\n    const f4R  = data.final4Right || [];\r\n    const fin  = data.finale      || [];\r\n    const p3   = data.place3      || [];\r\n    const res  = data.resultat    || [];\r\n\r\n    const nCols = 7;\r\n    const bottomPad = 150;\r\n    const matchRows = 4;\r\n    const bracketH = TOP_PAD + matchRows*(MATCH_H+MATCH_GAP);\r\n    const totalH = bracketH + bottomPad;\r\n    const totalW = L_PAD*2 + nCols*COL_W + 6*CONN_W;\r\n\r\n    const svg = ns('svg');\r\n    svg.setAttribute('viewBox',`0 0 ${totalW} ${totalH}`);\r\n    svg.setAttribute('width', totalW);\r\n    svg.setAttribute('height', totalH);\r\n\r\n    const colX = [];\r\n    let cx = L_PAD;\r\n    for (let i=0;i<nCols;i++) {\r\n      colX.push(cx);\r\n      cx += COL_W + (i<nCols-1?CONN_W:0);\r\n    }\r\n\r\n    const labels = ['Top 16','Top 8','Final 4','Finale','Final 4','Top 8','Top 16'];\r\n    labels.forEach((l,i) => makeLabel(svg, colX[i]+COL_W\/2, TOP_PAD-14, l));\r\n\r\n    function getY(matchIdx, total) {\r\n      const available = bracketH - TOP_PAD;\r\n      const sp = available \/ total;\r\n      return TOP_PAD + matchIdx*sp + (sp-MATCH_H)\/2;\r\n    }\r\n\r\n    function drawRoundLeft(colIdx, matches, total) {\r\n      const arr = matches.length ? matches : Array(total).fill(null);\r\n      return arr.map((m,i) => {\r\n        const y = getY(i, total);\r\n        return makeMatchup(svg, colX[colIdx], y, m);\r\n      });\r\n    }\r\n\r\n    function drawRoundRight(colIdx, matches, total) {\r\n      const arr = matches.length ? matches : Array(total).fill(null);\r\n      return arr.map((m,i) => {\r\n        const y = getY(i, total);\r\n        return makeMatchup(svg, colX[colIdx], y, m);\r\n      });\r\n    }\r\n\r\n    const c16L = drawRoundLeft(0, t16L, 4);\r\n    const c8L  = drawRoundLeft(1, t8L,  2);\r\n    const c4L  = drawRoundLeft(2, f4L,  1);\r\n    const cFin = drawRoundLeft(3, fin,  1);\r\n    const c4R  = drawRoundRight(4, f4R,  1);\r\n    const c8R  = drawRoundRight(5, t8R,  2);\r\n    const c16R = drawRoundRight(6, t16R, 4);\r\n\r\n    [0,1].forEach(i => {\r\n      if(c16L[i*2] && c16L[i*2+1]) makeConnLeft(svg, c16L[i*2].rightX, c16L[i*2].cy, c16L[i*2+1].cy, colX[1]);\r\n    });\r\n    if(c8L.length>=2 && c8L[0] && c8L[1]) makeConnLeft(svg, c8L[0].rightX, c8L[0].cy, c8L[1].cy, colX[2]);\r\n    if(c4L.length && c4L[0]) makeLine(svg, c4L[0].rightX, c4L[0].cy, colX[3]);\r\n\r\n    if(cFin.length && cFin[0]) makeLine(svg, cFin[0].rightX, cFin[0].cy, colX[4]);\r\n    if(c4R.length && c8R.length>=2 && c8R[0] && c8R[1] && c4R[0]) makeConnRight(svg, colX[5], c8R[0].cy, c8R[1].cy, c4R[0].rightX);\r\n    [0,1].forEach(i => {\r\n      if(c16R[i*2] && c16R[i*2+1]) makeConnRight(svg, colX[6], c16R[i*2].cy, c16R[i*2+1].cy, c8R[i] ? c8R[i].rightX : colX[5]+COL_W);\r\n    });\r\n\r\n    const byBase = bracketH + 14;\r\n    const boxW = 210;\r\n    const totalBoxW = boxW*2 + 20;\r\n    const startX = totalW\/2 - totalBoxW\/2;\r\n\r\n    if (p3.length) {\r\n      const m = p3[0];\r\n      const items = [m.a, m.b].filter(Boolean);\r\n      makeBox(svg, startX, byBase, boxW, '3E PLACE BATTLE', '#f59e0b', items, false);\r\n    }\r\n\r\n    if (res.length) {\r\n      makeBox(svg, startX+boxW+20, byBase, boxW, 'RESULTAT FINALE', '#aaa', res, true);\r\n    }\r\n\r\n    document.getElementById('dmmc-bracket-body').innerHTML = '';\r\n    document.getElementById('dmmc-bracket-body').appendChild(svg);\r\n  }\r\n\r\n  db.ref('\/dmccpro\/top16').on('value', snap => {\r\n    const data = snap.val();\r\n    if (data) renderBracket(data);\r\n  });\r\n\r\n  db.ref('\/dmccpro\/updatedAt').on('value', snap => {\r\n    const t = snap.val();\r\n    if (t) {\r\n      const d = new Date(t);\r\n      document.getElementById('dmmc-bracket-updated').textContent =\r\n        'Mis a jour : ' + d.toLocaleTimeString('fr-CA');\r\n    }\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t<\/div>\n\t\t\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>Qualifying score Pointage qualificationLiveConnexion Firebase&#8230; Qualifying results LiveConnexion Firebase&#8230; Top 16 Bracket \u2014 Top 16 Live Connexion Firebase&#8230; Pointage qualificationLiveConnexion Firebase&#8230; LiveConnexion Firebase&#8230; Bracket \u2014 Top 16 Live Connexion Firebase&#8230;<\/p>\n","protected":false},"author":233903676,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":""},"class_list":["post-1602","page","type-page","status-publish","hentry"],"acf":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/Pgl5nb-pQ","jetpack-related-posts":[{"id":1596,"url":"https:\/\/dmcc-series.com\/en\/live-bracket-pro-am\/","url_meta":{"origin":1602,"position":0},"title":"Live Bracket &#8211; Pro-Am","author":"C\u00e9dric Mallette","date":"June 26, 2025","format":false,"excerpt":"Qualifying score qualificationLiveConnexion Firebase... Qualifying results LiveConnexion Firebase... TOP 16 Bracket \u2014 Top 16 Live Connexion Firebase... qualificationLiveConnexion Firebase... LiveConnexion Firebase... Bracket \u2014 Top 16 Live Connexion Firebase...","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1592,"url":"https:\/\/dmcc-series.com\/live-bracket-pro-am\/","url_meta":{"origin":1602,"position":1},"title":"Live Bracket &#8211; Pro-Am","author":"C\u00e9dric Mallette","date":"June 26, 2025","format":false,"excerpt":"Pointage de Qualification qualification Live Connexion Firebase... R\u00e9sultats de Qualifications Live Connexion Firebase... TOP 16 Bracket \u2014 Top 16 Live Connexion Firebase... qualification Live Connexion Firebase... Live Connexion Firebase... Bracket \u2014 Top 16 Live Connexion Firebase...","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1598,"url":"https:\/\/dmcc-series.com\/live-bracket-pro\/","url_meta":{"origin":1602,"position":2},"title":"Live Bracket &#8211; Pro","author":"C\u00e9dric Mallette","date":"June 26, 2025","format":false,"excerpt":"Pointage de Qualification Pointage qualification Live Connexion Firebase... R\u00e9sultats de Qualifications Live Connexion Firebase... Top 16 Bracket \u2014 Top 16 Live Connexion Firebase... Pointage qualification Live Connexion Firebase... Live Connexion Firebase... Bracket \u2014 Top 16 Live Connexion Firebase...","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3255,"url":"https:\/\/dmcc-series.com\/contender-top-16\/","url_meta":{"origin":1602,"position":3},"title":"Contender Top 16","author":"C\u00e9dric Mallette","date":"May 7, 2026","format":false,"excerpt":"Bracket \u2014 Top 16 Live Connexion Firebase...","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3267,"url":"https:\/\/dmcc-series.com\/en\/contender-top-16\/","url_meta":{"origin":1602,"position":4},"title":"Contender Top 16","author":"C\u00e9dric Mallette","date":"May 7, 2026","format":false,"excerpt":"Bracket \u2014 Top 16 Live Connexion Firebase...","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1525,"url":"https:\/\/dmcc-series.com\/en\/top-16-pro\/","url_meta":{"origin":1602,"position":5},"title":"Top 16 &#8211; Pro","author":"C\u00e9dric Mallette","date":"May 29, 2025","format":false,"excerpt":"Last update: 0s Loading...","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/pages\/1602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/users\/233903676"}],"replies":[{"embeddable":true,"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/comments?post=1602"}],"version-history":[{"count":42,"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/pages\/1602\/revisions"}],"predecessor-version":[{"id":3804,"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/pages\/1602\/revisions\/3804"}],"wp:attachment":[{"href":"https:\/\/dmcc-series.com\/en\/wp-json\/wp\/v2\/media?parent=1602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}