@font-face { font-family: '365 Sans'; src: url('/wp-content/uploads/fonts/365-Sans-Regular.otf') format('opentype'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: '365 Sans'; src: url('/wp-content/uploads/fonts/365-Sans-Bold.otf') format('opentype'); font-weight: 700; font-style: normal; font-display: swap; } #scores-article-template { --primary: #3B82F6; --primary-hover: #2563EB; --page-bg: #ffffff; --surface-bg: #ffffff; --card-bg: #ffffff; --border: #F3F4F6; --text: #111827; --muted: #4B5563; --soft: #F3F4F6; --soft-hover: #E5E7EB; --shadow: rgba(15, 23, 42, 0.12); --overlay: rgba(0, 0, 0, 0.52); font-family: '365 Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important; background: var(--page-bg) !important; color: var(--text) !important; min-height: 100vh !important; scroll-behavior: smooth; position: relative; z-index: 1; line-height: 1.5; } #scores-article-template.scores-dark { --page-bg: #020617; --surface-bg: #0F172A; --card-bg: #111827; --border: #1F2937; --text: #F9FAFB; --muted: #D1D5DB; --soft: #1F2937; --soft-hover: #374151; --shadow: rgba(0, 0, 0, 0.42); --overlay: rgba(0, 0, 0, 0.75); } #scores-article-template * { box-sizing: border-box !important; } #scores-article-template .scores-header { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; z-index: 99999 !important; background: var(--surface-bg); border-bottom: 1px solid var(--border); box-shadow: 0 2px 10px var(--shadow); } button.scores-next-button { width: 145px; background-color: #3b82f6; color: white; border-radius: 15px; margin-top: 30px; min-height: 40px; } .scores-header-inner { max-width: 1280px; margin: 0 auto; padding: 14px 16px; display: flex; align-items: center; gap: 16px; } .scores-nav { display: flex; gap: 8px; overflow-x: auto; flex: 1; scrollbar-width: none; } .scores-nav::-webkit-scrollbar { display: none; } .scores-nav-button { min-width: 40px; height: 40px; padding: 0 13px; border-radius: 999px; background: var(--soft); color: var(--muted); font-weight: 600; border: none; cursor: pointer; white-space: nowrap; transition: none; } .scores-nav-button.is-active { background: var(--primary); color: #fff !important; } .scores-hero { min-height: 72vh; position: relative; display: flex; align-items: center; justify-content: center; padding: 112px 16px 52px; text-align: left; color: #fff !important; background-color: #020617; overflow: hidden; } .scores-hero::after { content: ''; position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(2, 6, 23, 0.50) 0%, rgba(2, 6, 23, 0.28) 46%, rgba(2, 6, 23, 0.58) 100%); } .scores-hero-bg { position: absolute; inset: 0; background-size: cover; background-position: center 28%; z-index: 0; opacity: 1; transform: scale(1.02); overflow: hidden; } .scores-hero-bg-img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: center 28%; } .scores-hero-content { position: relative; z-index: 2; width: 100%; max-width: 1180px; display: grid; grid-template-columns: minmax(0, 1.12fr) minmax(320px, 0.88fr); gap: 34px; align-items: center; } .scores-hero-text { min-width: 0; } .scores-hero-kicker { display: inline-flex; align-items: center; width: max-content; max-width: 100%; margin-bottom: 14px; padding: 7px 12px; border-radius: 999px; background: rgba(59, 130, 246, 0.24); border: 1px solid rgba(147, 197, 253, 0.5); color: #DBEAFE !important; font-size: 12px; font-weight: 800; line-height: 1; letter-spacing: 0.08em; text-transform: uppercase; } .scores-hero-title { font-size: clamp(34px, 6.8vw, 68px) !important; font-weight: 800; margin: 0 0 14px; color: #fff !important; line-height: 1.05 !important; text-wrap: balance; } .scores-hero-subtitle { margin: 0 0 18px; font-size: clamp(18px, 2.3vw, 24px); font-weight: 700!important; color: #fff !important; text-shadow: 0 0 20px rgba(59, 130, 246, 0.85), 0 2px 10px rgba(0, 0, 0, 0.5); } .scores-hero-copy p { max-width: 720px; margin: 0; color: #E5E7EB !important; font-size: clamp(16px, 1.9vw, 19px); line-height: 1.65; } .scores-hero-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 24px; } .scores-start-button, .scores-hero-secondary-button { min-height: 46px; padding: 12px 24px; border-radius: 999px; border: 1px solid transparent; font-weight: 800; cursor: pointer; line-height: 1; } .scores-start-button { background: var(--primary); color: #fff !important; box-shadow: 0 12px 24px rgba(37, 99, 235, 0.32); } .scores-hero-secondary-button { background: rgba(255, 255, 255, 0.12); color: #fff !important; border-color: rgba(255, 255, 255, 0.26); } .scores-hero-preview { width: 100%; padding: 18px; border-radius: 24px; background: rgba(15, 23, 42, 0.72); border: 1px solid rgba(255, 255, 255, 0.18); box-shadow: 0 24px 60px rgba(0, 0, 0, 0.34); backdrop-filter: blur(12px); } .scores-hero-preview-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 14px; color: #DBEAFE !important; } .scores-hero-preview-head span { font-size: 13px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; } .scores-hero-preview-head strong { color: #fff !important; font-size: 13px; font-weight: 800; white-space: nowrap; } .scores-hero-preview-list { display: grid; gap: 10px; } .scores-hero-preview-item { width: 100%; display: grid; grid-template-columns: 58px minmax(0, 1fr); gap: 12px; align-items: center; padding: 10px; border: 1px solid rgba(255, 255, 255, 0.14); border-radius: 16px; background: rgba(2, 6, 23, 0.56); color: #fff !important; text-align: left; cursor: pointer; } .scores-hero-preview-item:hover { background: rgba(59, 130, 246, 0.22); } .scores-hero-preview-thumb, .scores-hero-preview-rank-chip { width: 58px; height: 48px; border-radius: 12px; overflow: hidden; background: rgba(59, 130, 246, 0.26); } .scores-hero-preview-thumb img { width: 100%; height: 100%; object-fit: cover; object-position: center 22%; display: block; } .scores-hero-preview-rank-chip { display: flex; align-items: center; justify-content: center; color: #fff !important; font-weight: 800; font-size: 18px; } .scores-hero-preview-text { min-width: 0; display: grid; gap: 3px; } .scores-hero-preview-rankline { color: #93C5FD !important; font-size: 12px; font-weight: 800; line-height: 1.1; } .scores-hero-preview-name { color: #fff !important; font-size: 15px; font-weight: 800; line-height: 1.2; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } @media (max-width: 760px) { .scores-hero { min-height: auto; padding: 96px 14px 34px; } .scores-hero::after { background: linear-gradient(180deg, rgba(2, 6, 23, 0.92) 0%, rgba(2, 6, 23, 0.84) 54%, rgba(2, 6, 23, 0.96) 100%); } .scores-hero-bg { opacity: 0.36; background-position: center top; } .scores-hero-content { grid-template-columns: 1fr; gap: 22px; } .scores-hero-title { font-size: clamp(30px, 9vw, 46px) !important; } .scores-hero-subtitle { font-size: 18px; margin-bottom: 14px; } .scores-hero-actions { gap: 10px; margin-top: 20px; } .scores-start-button, .scores-hero-secondary-button { flex: 1 1 150px; padding-left: 16px; padding-right: 16px; } .scores-hero-preview { padding: 14px; border-radius: 20px; } .scores-hero-preview-item { grid-template-columns: 52px minmax(0, 1fr); padding: 9px; } .scores-hero-preview-thumb, .scores-hero-preview-rank-chip { width: 52px; height: 44px; } .scores-hero-preview-name { font-size: 14px; } .scores-hero-preview-item:nth-child(n+4) { display: none; } } .scores-section-shell { min-height: 100vh; scroll-margin-top: 80px; } .scores-card { max-width: 800px; margin: 90px auto; background: var(--card-bg); border-radius: 24px; border: 1px solid var(--border); box-shadow: 0 10px 30px var(--shadow); overflow: hidden; } .scores-card-header { padding: 30px 30px 12px; border-bottom: 0; } .scores-card-header h2 { margin: 0; font-size: 28px; font-weight: 800; } .scores-card-body { padding: 10px 30px 30px; color: var(--muted); font-size: 18px; line-height: 1.7; } .scores-card-body > p:first-child { margin-top: 0; } .scores-image-wrap { width: 100%; height: 250px; background: #eee; margin: 20px 0; border-radius: 12px; overflow: hidden; } .scores-image-wrap img { width: 100%; height: 100%; object-fit: cover; object-position: var(--image-position, center 22%); } .scores-stats-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 15px; margin-top: 25px; align-items: stretch; } .scores-stats-grid.is-empty { display: none; } .scores-stats-count-1 { grid-template-columns: minmax(0, 260px); justify-content: center; } .scores-stats-count-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .scores-stats-count-3 .scores-stat:last-child { grid-column: 1 / -1; justify-self: center; width: min(100%, 260px); } .scores-stat { min-width: 0; padding: 18px 12px; background: var(--soft); border-radius: 16px; text-align: center; border: 1px solid var(--border); display: flex; flex-direction: column; align-items: center; justify-content: center; } .scores-stat-icon { width: 32px; height: 32px; margin: 0 auto 10px; color: var(--primary); display: flex; align-items: center; justify-content: center; flex: 0 0 auto; } .scores-stat-icon img { width: 100%; height: 100%; object-fit: contain; } .scores-stat.no-icon .scores-stat-value { margin-top: 0; } .scores-stat-value { font-size: 24px; font-weight: 800; color: var(--text); line-height: 1.15; margin-bottom: 4px; overflow-wrap: anywhere; } .scores-stat-label { font-size: 11px; color: var(--muted); text-transform: uppercase; font-weight: 700; letter-spacing: 0.05em; line-height: 1.3; } @media (max-width: 599px) { .scores-card { margin: 56px 12px; border-radius: 20px; } .scores-card-header { padding: 22px 18px 14px; } .scores-card-header h2 { font-size: 24px; line-height: 1.2; } .scores-card-body { padding: 8px 18px 24px; font-size: 16px; line-height: 1.65; } .scores-image-wrap { height: 230px; margin: 18px 0; } .scores-stats-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin-top: 22px; } .scores-stats-count-1 { grid-template-columns: minmax(0, 1fr); } .scores-stats-count-3 .scores-stat:last-child { grid-column: 1 / -1; justify-self: center; width: min(100%, 260px); } .scores-stat { min-height: 118px; padding: 14px 10px; } .scores-stat-icon { width: 28px; height: 28px; margin-bottom: 8px; } .scores-stat-value { font-size: 20px; line-height: 1.15; } .scores-stat-label { font-size: 10px; line-height: 1.3; } button.scores-next-button { width: 100%; margin-top: 24px; } } @media (min-width: 600px) { .scores-stats-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .scores-stats-count-1 { grid-template-columns: minmax(0, 260px); justify-content: center; } .scores-stats-count-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 520px; margin-left: auto; margin-right: auto; } .scores-stats-count-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 690px; margin-left: auto; margin-right: auto; } .scores-stats-count-3 .scores-stat:last-child { grid-column: auto; justify-self: stretch; width: auto; } .scores-stats-count-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); max-width: none; } .scores-image-wrap { height: 400px; } } .scores-icon-button { background: var(--soft); border: none; width: 40px; height: 40px; border-radius: 20px; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--text); } .scores-toc-drawer { position: fixed; top: 0; right: 0; bottom: 0; width: 300px; background: var(--surface-bg); z-index: 100000; transform: translateX(100%); transition: transform 0.3s ease; padding: 20px; box-shadow: -5px 0 15px var(--shadow); overflow-y: auto; } .scores-toc-drawer.is-open { transform: translateX(0); } .scores-toc-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 99999; display: none; } .scores-toc-overlay.is-open { display: block; } .scores-hero-first-item { width: 100%; padding: 18px; border-radius: 24px; background: rgba(15, 23, 42, 0.78); border: 1px solid rgba(255, 255, 255, 0.18); box-shadow: 0 24px 60px rgba(0, 0, 0, 0.34); backdrop-filter: blur(12px); color: #fff !important; } .scores-hero-first-kicker { display: inline-flex; margin-bottom: 10px; padding: 6px 10px; border-radius: 999px; background: rgba(59, 130, 246, 0.26); color: #DBEAFE !important; font-size: 12px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; } .scores-hero-first-title { margin: 0 0 12px; color: #fff !important; font-size: clamp(22px, 3vw, 32px); font-weight: 800; line-height: 1.12; } .scores-hero-first-image { width: 100%; height: 230px; margin: 12px 0 14px; border-radius: 18px; overflow: hidden; background: rgba(255,255,255,0.1); } .scores-hero-first-image img { width: 100%; height: 100%; object-fit: cover; object-position: var(--image-position, center 22%); display: block; } .scores-hero-first-copy { display: grid; gap: 10px; } .scores-hero-first-copy p { margin: 0; color: #E5E7EB !important; font-size: 15px; line-height: 1.55; } .scores-hero-first-copy p:nth-child(2) { color: #CBD5E1 !important; } .scores-hero-first-actions { margin-top: 16px; display: flex; gap: 10px; flex-wrap: wrap; } .scores-hero-first-actions .scores-next-button { margin-top: 0; } @media (max-width: 760px) { .scores-hero-first-item { padding: 14px; border-radius: 20px; } .scores-hero-first-image { height: 190px; border-radius: 16px; } .scores-hero-first-title { font-size: 23px; } .scores-hero-first-copy p { font-size: 14px; line-height: 1.5; } } /* Traditional first-item landing variant */ .scores-hero { min-height: auto; align-items: flex-start; justify-content: center; padding: 104px 16px 56px; text-align: center; } .scores-hero::after { background: linear-gradient(180deg, rgba(2, 6, 23, 0.38) 0%, rgba(2, 6, 23, 0.30) 45%, rgba(2, 6, 23, 0.48) 100%); } .scores-hero-bg { opacity: 1; background-position: center top; } .scores-hero-bg-img { opacity: 1; } .scores-hero-content { max-width: 860px; display: flex; flex-direction: column; gap: 20px; align-items: stretch; } .scores-hero-text { text-align: center; } .scores-hero-kicker { margin-left: auto; margin-right: auto; margin-bottom: 12px; } .scores-hero-title { max-width: 820px; margin: 0 auto 12px; font-size: clamp(30px, 5.2vw, 54px) !important; line-height: 1.08 !important; } .scores-hero-copy p { max-width: 760px; margin: 0 auto; font-size: clamp(15px, 1.7vw, 18px); line-height: 1.55; } .scores-hero-actions { justify-content: center; margin-top: 2px; } .scores-hero-first-item { width: 100%; padding: 0; border-radius: 24px; background: var(--card-bg); border: 1px solid var(--border); box-shadow: 0 18px 42px rgba(0, 0, 0, 0.28); backdrop-filter: none; color: var(--text) !important; overflow: hidden; text-align: left; } .scores-hero-first-kicker { margin: 28px 30px 8px; background: rgba(59, 130, 246, 0.12); color: var(--primary) !important; } .scores-hero-first-title { margin: 0 30px 10px; color: var(--text) !important; font-size: clamp(23px, 3.2vw, 32px); line-height: 1.16; } .scores-hero-first-copy { display: block; padding: 0 30px; } .scores-hero-first-copy p { margin: 0 0 16px; color: var(--muted) !important; font-size: 17px; line-height: 1.65; } .scores-hero-first-copy p:nth-child(2) { color: var(--muted) !important; } .scores-hero-first-image { width: auto; height: 360px; margin: 16px 30px 18px; border-radius: 16px; background: #E5E7EB; } .scores-hero-first-actions { margin: 18px 30px 30px; } @media (max-width: 760px) { .scores-hero { padding: 88px 12px 34px; } .scores-hero-content { gap: 16px; } .scores-hero-title { font-size: clamp(28px, 8.4vw, 40px) !important; } .scores-hero-copy p { font-size: 15px; line-height: 1.5; } .scores-hero-first-item { border-radius: 20px; } .scores-hero-first-kicker { margin: 20px 18px 8px; } .scores-hero-first-title { margin: 0 18px 10px; font-size: 22px; line-height: 1.18; } .scores-hero-first-copy { padding: 0 18px; } .scores-hero-first-copy p { font-size: 15px; line-height: 1.55; margin-bottom: 14px; } .scores-hero-first-image { height: 210px; margin: 14px 18px 16px; border-radius: 14px; } .scores-hero-actions { display: grid; grid-template-columns: 1fr; width: 100%; } .scores-start-button, .scores-hero-secondary-button { width: 100%; } } /* Align the featured landing item title with the regular article-card layout */ .scores-hero-first-title { display: block !important; margin: 0 0 10px !important; padding: 0 30px !important; width: 100% !important; box-sizing: border-box !important; } .scores-hero-first-copy { padding-left: 30px !important; padding-right: 30px !important; } @media (max-width: 599px) { .scores-hero-first-kicker { margin: 22px 18px 8px !important; } .scores-hero-first-title { padding-left: 18px !important; padding-right: 18px !important; margin-bottom: 10px !important; font-size: 24px !important; line-height: 1.2 !important; } .scores-hero-first-copy { padding-left: 18px !important; padding-right: 18px !important; } } /* 365Scores brand blue for metric values */ .scores-stat-value, .scores-stat-card .scores-stat-value { color: #179BFF !important; } /* Prevent long metric values from looking compressed */ .scores-stat-value, .scores-stat-card .scores-stat-value { white-space: normal !important; overflow-wrap: normal !important; word-break: normal !important; hyphens: none !important; line-height: 1.12 !important; max-width: 100%; } .scores-stat-label, .scores-stat-card .scores-stat-label { white-space: normal !important; overflow-wrap: normal !important; word-break: normal !important; hyphens: none !important; } .scores-stat-value { font-size: clamp(17px, 4.4vw, 25px) !important; } @media (min-width: 700px) { .scores-stat-value { font-size: clamp(18px, 2vw, 26px) !important; } } ☰ Continuar Lendo Conteúdo × let scoresProgrammaticScroll = false; let scoresScrollSettleTimer = null; let scoresProgrammaticFallbackTimer = null; function setActiveNavButton(id) { const activeId = String(id); const nav = document.getElementById('js-nav'); if (!nav) return; nav.querySelectorAll('.scores-nav-button').forEach(button => { button.classList.toggle('is-active', button.dataset.articleId === activeId || button.textContent.trim() === activeId); }); } function finishProgrammaticScroll() { scoresProgrammaticScroll = false; if (scoresScrollSettleTimer) window.clearTimeout(scoresScrollSettleTimer); if (scoresProgrammaticFallbackTimer) window.clearTimeout(scoresProgrammaticFallbackTimer); scoresScrollSettleTimer = null; scoresProgrammaticFallbackTimer = null; } window.addEventListener('scroll', function() { if (!scoresProgrammaticScroll) return; if (scoresScrollSettleTimer) window.clearTimeout(scoresScrollSettleTimer); scoresScrollSettleTimer = window.setTimeout(finishProgrammaticScroll, 180); }, { passive: true }); function scrollToSection(id) { scoresProgrammaticScroll = true; setActiveNavButton(id); if (scoresProgrammaticFallbackTimer) window.clearTimeout(scoresProgrammaticFallbackTimer); scoresProgrammaticFallbackTimer = window.setTimeout(finishProgrammaticScroll, 2200); const el = document.getElementById(`article-item-${id}`); if (el) { const offset = 80; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } } document.addEventListener('DOMContentLoaded', function() { const data = { "logo": "365Scores", "hero": { "title": "Power Rankings da Ligue 1: Análise dos times do Campeonato Francês", "subtitle": "", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/hero_image_ligue1", "copy": "A Ligue 1 retorna neste fim de semana, e após um verão de grandes transferências, mudanças de treinadores e muita incerteza, o equilíbrio de forças mudou. Com a temporada 2026/27 prestes a começar, aqui estão nossos power rankings da Ligue 1, analisando todos os 18 clubes, de candidatos ao rebaixamento a favoritos ao título." }, "items": [ { "id": 18, "name": "Le Mans", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/le-mans", "imagePosition": "center 22%", "textTop": "O Le Mans retorna à Ligue 1 após promoções consecutivas, uma conquista construída sobre a disciplina coletiva em vez de brilhantismo individual. Essa fórmula agora enfrenta seu teste mais rigoroso. O time de Patrick Videira possui o menor orçamento da liga e adicionou principalmente agentes livres, empréstimos e jogadores úteis de rotação. Louis Mafouta oferece experiência no ataque, mas o salto geral de qualidade é enorme.", "textBottom": "Sua contratação cautelosa reflete a realidade financeira, mas deixa pouca margem para lesões ou má fase. Billal Brahimi, Rayan Bamba e Daouda Traoré podem adicionar energia, mas nenhum transforma o teto do elenco. A sobrevivência exigiria uma organização excepcional, um retrospecto forte em casa e vários jogadores superando as expectativas simultaneamente. O romance da ascensão é inegável, mas a perspectiva competitiva é muito mais dura.", "stats": [ { "icon": "", "value": "2º na Ligue 2", "label": "Posição na última temporada" }, { "icon": "", "value": "€20,65m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Louis Mafouta", "label": "Artilheiro projetado" } ] }, { "id": 17, "name": "Troyes", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/troyes", "imagePosition": "center 22%", "textTop": "O Troyes retorna como campeão da Ligue 2, mas sua promoção foi seguida pela perda de Mathys Detourbet, o jovem criador que elevava o jogo ofensivo da equipe. Patrick Beach representa a principal contratação após uma impressionante Copa do Mundo com a Austrália. Seu vigor físico e as defesas devem render pontos, embora um goleiro só consiga absorver até certo ponto a pressão.", "textBottom": "O restante do elenco ainda parece carente de uma qualidade estabelecida para a Ligue 1. O Troyes fez pequenas adições e recuperou vários emprestados, mas sua profundidade no ataque e criação de chances continuam sendo preocupações. Stéphane Dumont precisará de linhas defensivas compactas, transições eficientes e uma adaptação imediata de seus jogadores mais jovens. Beach pode fornecer segurança lá atrás, enquanto Renaud Ripart oferece experiência, mas os campeões entram na campanha com uma luta pela sobrevivência os aguardando.", "stats": [ { "icon": "", "value": "1º na Ligue 2", "label": "Posição na última temporada" }, { "icon": "", "value": "€31,05m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Renaud Ripart", "label": "Artilheiro projetado" } ] }, { "id": 16, "name": "Le Havre", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/le-havre", "imagePosition": "center 22%", "textTop": "O Le Havre sobreviveu graças à resiliência na temporada passada, mas outra campanha exigente se aproxima após as saídas de Arouna Sangante e Issa Soumaré. A autoridade de Sangante ancorava a defesa, enquanto Soumaré oferecia corridas diretas e uma valiosa contribuição ofensiva. Perder ambos remove duas das qualidades que tornavam a equipe de Didier Digard tão difícil de ser batida, apesar dos recursos limitados.", "textBottom": "O recrutamento novamente se concentrou em oportunidades acessíveis. Josh Maja oferece instinto de área, Junior Mwanga traz versatilidade e Amir Richardson pode adicionar presença física, se for mantido. Esses movimentos oferecem potencial em vez de certeza, particularmente depois que vários jogadores experientes também saíram. O Le Havre entende de batalhas contra o rebaixamento e raramente perde sua estrutura, mas substituir liderança, confiabilidade defensiva e força ofensiva no mesmo verão coloca uma pressão enorme sobre um grupo relativamente jovem.", "stats": [ { "icon": "", "value": "14º", "label": "Posição na última temporada" }, { "icon": "", "value": "€50,65m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Josh Maja", "label": "Artilheiro projetado" } ] }, { "id": 15, "name": "Auxerre", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/auxerre", "imagePosition": "center 22%", "textTop": "O Auxerre terminou uma posição acima do play-off de rebaixamento, e o verão trouxe outra reformulação significativa. A saída de Lassine Sinayoko remove sua principal referência no ataque, enquanto as mudanças na linha de defesa perturbam ainda mais uma estrutura já frágil. Suas perspectivas de sobrevivência dependerão da rapidez com que uma coleção de adições intrigantes se tornará uma equipe coerente na Ligue 1.", "textBottom": "Danny Namaso fornece mobilidade e qualidade técnica na frente, com Mamadou Diop e Arthur Piedfort adicionando mais potencial. O novo técnico Will Still tem intensidade suficiente para construir um time agressivo e enérgico, mas ele herda pouca continuidade e poucos artilheiros comprovados. O Auxerre deve ter mais variedade ofensiva do que alguns rivais diretos, embora essa ambição deva ser equilibrada por um maior controle. Outra campanha decidida por margens estreitas parece provável.", "stats": [ { "icon": "", "value": "15º", "label": "Posição na última temporada" }, { "icon": "", "value": "€87,25m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Danny Namaso", "label": "Artilheiro projetado" } ] }, { "id": 14, "name": "Angers", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/Angers", "imagePosition": "center 22%", "textTop": "O Angers garantiu a sobrevivência com um modesto saldo de gols e uma disposição para tornar as partidas desconfortáveis. A transferência de Sidiki Chérif para o Fenerbahçe remove seu jovem atacante mais valioso, deixando um fardo substancial de criação e finalização para trás. Mesmo assim, este continua sendo um elenco com experiência defensiva, competitividade física e disciplina tática suficientes para ficar acima dos três últimos colocados.", "textBottom": "As chegadas de Amine El Ouazzani, Branco van den Boomen e Jim Allevinah devem ajudar a redistribuir a responsabilidade. El Ouazzani pode liderar o ataque, enquanto Van den Boomen oferece o passe e as cobranças de bola parada necessárias para criar chances em jogos acirrados. É improvável que o Angers domine a posse de bola regularmente, mas possui um conhecimento mais claro da Ligue 1 do que os clubes promovidos. Se suas novas peças se adaptarem rapidamente, uma campanha de sobrevivência funcional e equilibrada é alcançável.", "stats": [ { "icon": "", "value": "13º", "label": "Posição na última temporada" }, { "icon": "", "value": "€73,20m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Amine El Ouazzani", "label": "Artilheiro projetado" } ] }, { "id": 13, "name": "Lorient", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/Lorient", "imagePosition": "center 22%", "textTop": "A temporada de retorno confortável do Lorient foi impulsionada por um ataque que resgatou pontos repetidamente, tornando as perdas de Pablo Pagis e Bamba Dieng especialmente prejudiciais. Pagis fornecia invenção e gols entre as linhas, enquanto Dieng esticava as defesas com sua velocidade. Suas saídas deixam um time que marcou à vontade na temporada passada em busca de uma nova identidade ofensiva sob o comando de Alexandre Dujeux.", "textBottom": "Souleymane Faye é a solução mais intrigante. Sua aceleração e objetividade podem animar as transições, mas pedir a ele para substituir uma produção estabelecida de imediato traz riscos. O Lorient também perdeu figuras experientes em outras áreas e parece mais leve em várias posições. Sua qualidade técnica ainda deve criar bons momentos, especialmente em casa, mas a ausência de um ponto focal confiável pode transformar os empates e vitórias apertadas da temporada passada em derrotas.", "stats": [ { "icon": "", "value": "10º", "label": "Posição na última temporada" }, { "icon": "", "value": "€82,05m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Souleymane Faye", "label": "Artilheiro projetado" } ] }, { "id": 12, "name": "Nice", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/nice", "imagePosition": "center 22%", "textTop": "O Nice enfrentou uma campanha desastrosa no campeonato, terminando em 16º antes de vencer de forma decisiva o play-off de rebaixamento. Seu elenco rendeu muito abaixo do seu nível de talento, produzindo um futebol desarticulado e sofrendo 60 gols. Esse colapso não deve apagar a qualidade que ainda está disponível, e uma mudança no comando técnico com Olivier Pantaloni oferece a oportunidade de restaurar a estrutura, a confiança e a competência defensiva básica.", "textBottom": "O clube perdeu vários jogadores experientes, mas Laurent Abergel adiciona controle no meio-campo e Terem Moffi retorna como uma potencial referência de ataque. Mohamed-Ali Cho e Gauthier Hein podem fornecer criatividade ao seu redor. O Nice não precisa de uma reinvenção tática espetacular para melhorar substancialmente; competência representaria um grande passo à frente. O teto deles permanece incerto, mas outra temporada no limite do rebaixamento constituiria um sério fracasso.", "stats": [ { "icon": "", "value": "16º", "label": "Posição na última temporada" }, { "icon": "", "value": "€131,90m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Terem Moffi", "label": "Artilheiro projetado" } ] }, { "id": 11, "name": "Brest", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/Brest", "imagePosition": "center 22%", "textTop": "O Brest tem resistido ao tipo de reformulação que muitas vezes desestabiliza clubes que operam com recursos limitados. A base principal permanece intacta, incluindo Bradley Locko, Kamory Doumbia e Joris Chotard, três jogadores com desempenho comprovado na Ligue 1 que dão à equipe ritmo, invenção e inteligência no meio-campo. Essa continuidade é importante em uma metade inferior congestionada, onde vários rivais estão passando por grandes reconstruções.", "textBottom": "A preocupação é se a estabilidade pode produzir gols suficientes e se os jogadores-chave permanecerão após o fechamento da janela de transferências. O Brest não tem o poder financeiro para repor adequadamente uma grande saída tardia, mas suas combinações estabelecidas reduzem o tempo de adaptação. Romain Del Castillo continua sendo a fonte mais provável de gols e passes decisivos. Este elenco não é glamoroso nem especialmente profundo, mas tem equilíbrio e experiência suficientes na primeira divisão para evitar ser consumido pela batalha contra o rebaixamento.", "stats": [ { "icon": "", "value": "12º", "label": "Posição na última temporada" }, { "icon": "", "value": "€61,60m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Romain Del Castillo", "label": "Artilheiro projetado" } ] }, { "id": 10, "name": "Toulouse", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/Toulouse", "imagePosition": "center 22%", "textTop": "O Toulouse terminou em nono com um time positivo e enérgico, capaz de incomodar adversários mais fortes. A transferência de Charlie Cresswell para o Rennes é um grande revés porque seu domínio aéreo, agressividade e personalidade davam à defesa um ponto de referência claro. A saída de Emersonn reduz ainda mais suas opções ofensivas, colocando maior pressão sobre um grupo que, de outra forma, é promissor, mas instável.", "textBottom": "Substituir a influência de Cresswell exigirá um ajuste coletivo em vez de uma imitação direta. Sion Oppong traz potencial, enquanto o Toulouse ainda possui mobilidade e qualidade técnica suficientes para jogar um futebol progressivo. Jacen Russell-Rowe deve receber maior responsabilidade no ataque após chegar durante a campanha anterior. O modelo de desenvolvimento do clube continua a produzir jogadores interessantes, embora sua rotatividade constante torne difícil a luta sustentada por vagas europeias. Uma temporada competitiva de meio de tabela continua sendo o resultado mais realista.", "stats": [ { "icon": "", "value": "9º", "label": "Posição na última temporada" }, { "icon": "", "value": "€122,40m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Jacen Russell-Rowe", "label": "Artilheiro projetado" } ] }, { "id": 9, "name": "Strasbourg", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/Strasbourg", "imagePosition": "center 22%", "textTop": "O jovem time do Strasbourg entregou um futebol atraente e um oitavo lugar, mas o verão tirou várias figuras centrais. Valentín Barco e Emanuel Emegha saíram, enquanto a lesão de longo prazo de Joaquín Panichelli remove outra grande ameaça ofensiva. Essas ausências reduzem a qualidade individual que antes transformava sua posse de bola corajosa em um produto final consistente.", "textBottom": "A esteira de desenvolvimento continua impressionante, com Giovanni Reyna, Diogo Sousa e jovens promessas em retorno fornecendo mais uma leva de talento técnico. Sékou Mara agora tem uma oportunidade significativa para liderar o ataque. O Strasbourg deve continuar pressionando, passando de forma corajosa e dando responsabilidade aos jovens jogadores, tornando-se um dos times mais agradáveis de se assistir na liga. Sua profundidade pode sustentar outro desafio na metade superior da tabela, mas perder tanto talento decisivo os deixa um pouco distantes de uma busca convincente por vagas europeias.", "stats": [ { "icon": "", "value": "8º", "label": "Posição na última temporada" }, { "icon": "", "value": "€333,05m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Sékou Mara", "label": "Artilheiro projetado" } ] }, { "id": 8, "name": "Paris FC", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/paris-fc", "imagePosition": "center 22%", "textTop": "A ascensão do Paris FC da promoção para o 11º lugar demonstrou a rapidez com que o projeto pode progredir. A resposta deles foi outra janela ambiciosa liderada por Pablo Pagis, Patrick Zabi e Diego Coppola. Pagis traz produção comprovada na Ligue 1, Zabi oferece enorme potencial de desenvolvimento e Coppola fortalece uma defesa que exigia maior autoridade e vigor físico.", "textBottom": "Esse investimento parece direcionado em vez de imprudente. Lassine Sinayoko adiciona força e flexibilidade no ataque, enquanto Liam Rosenior herda um elenco adequado a um futebol moderno e proativo. O Paris FC agora possui profundidade suficiente para sobreviver a lesões e juventude suficiente para melhorar ao longo da campanha. A qualificação europeia pode chegar um pouco cedo demais, mas o apetite financeiro e o recrutamento coerente do clube mudaram as expectativas. A consolidação não é mais o limite; um final firme na metade superior da tabela deve ser o objetivo.", "stats": [ { "icon": "", "value": "11º", "label": "Posição na última temporada" }, { "icon": "", "value": "€175,40m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Pablo Pagis", "label": "Artilheiro projetado" } ] }, { "id": 7, "name": "Olympique Marseille", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/marseille", "imagePosition": "center 22%", "textTop": "O Marseille entra na temporada envolvido por uma grave crise financeira e institucional. A resposta deles foi uma venda extraordinária de verão projetada para evitar danos mais profundos. Mason Greenwood, Facundo Medina, Pierre-Emerick Aubameyang e Gerónimo Rulli já partiram, com outras saídas possíveis. Consequentemente, a equipe que ficou em quinto perdeu grande parte de sua capacidade de fazer gols, agressividade defensiva e nomes de peso.", "textBottom": "O elenco restante ainda carrega qualidade suficiente para competir, mas seu rumo depende de quem sobreviver à janela. Amine Gouiri pode liderar o ataque se for mantido, enquanto Timothy Weah e os jogadores que retornam oferecem opções úteis. Bruno Genesio enfrenta a difícil tarefa de construir coesão em meio à incerteza contínua e às exigências europeias. O nome do Marseille, o apoio e o talento residual criam uma base respeitável; mas sua profundidade cada vez menor e a instabilidade financeira colocam um teto firme na campanha.", "stats": [ { "icon": "", "value": "5º", "label": "Posição na última temporada" }, { "icon": "", "value": "€224,00m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Amine Gouiri", "label": "Artilheiro projetado" } ] }, { "id": 6, "name": "Lens", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/lens", "imagePosition": "center 22%", "textTop": "O Lens produziu uma temporada magnífica, terminando em segundo e erguendo a Copa da França através de intensidade, convicção defensiva e crença coletiva. Repetir essa conquista já seria difícil, mas a saída de Pierre Sage torna o desafio significativamente maior. Sage foi central para o sucesso do Lens, estabelecendo a estrutura tática, a mentalidade agressiva e a identidade coletiva que lhes permitiu superar as expectativas. Perder o arquiteto dessa campanha cria incertezas justo quando o clube se prepara para o futebol da Liga dos Campeões.", "textBottom": "O elenco também sofreu baixas significativas, particularmente com as saídas de Mamadou Sangaré e Malang Sarr. Dino Toppmöller herda, portanto, uma equipe que enfrenta dois desafios simultaneamente: substituir jogadores importantes e manter a identidade criada por Sage, tudo isso enquanto lida com as exigências adicionais da Liga dos Campeões. Franjo Ivanović, Thorgan Hazard e Yacine Titraoui fornecem qualidade, e o Lens mantém uma atmosfera caseira excepcional, mas reproduzir a campanha extraordinária da temporada passada parece improvável. A qualificação europeia ainda representaria uma excelente temporada.", "stats": [ { "icon": "", "value": "2º", "label": "Posição na última temporada" }, { "icon": "", "value": "€187,45m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Franjo Ivanović", "label": "Artilheiro projetado" } ] }, { "id": 5, "name": "Monaco", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/monaco", "imagePosition": "center 22%", "textTop": "Treinado agora pelo ex-Flamengo Filipe Luís, o Monaco perdeu dois jovens talentos excepcionais, com Maghnes Akliouche indo para o PSG e Aladji Bamba se transferindo para o Newcastle. Suas saídas removem criatividade, progressão de bola e um enorme potencial, mas o elenco segue repleto de jogadores prontos para assumir maiores responsabilidades.", "textBottom": "Matthis Abline chega como um atacante versátil, enquanto o empréstimo de Mathys Detourbet do Manchester City adiciona imaginação atrás do ataque. Folarin Balogun agora parece mais propenso a ficar, dando ao Monaco uma ameaça central comprovada. Muito ainda depende de Lamine Camara, cuja influência no meio-campo seria extremamente difícil de substituir se um clube maior fizer um movimento tardio. Há riscos na rotatividade, mas o preparo físico, a profundidade e o talento em desenvolvimento permanecem fortes o suficiente para sustentar um desafio na Liga dos Campeões.", "stats": [ { "icon": "", "value": "7º", "label": "Posição na última temporada" }, { "icon": "", "value": "€327,30m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Folarin Balogun", "label": "Artilheiro projetado" } ] }, { "id": 4, "name": "Rennes", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/rennes", "imagePosition": "center 22%", "textTop": "O Rennes montou um dos elencos mais equilibrados da liga depois de terminar em sexto. Charlie Cresswell fortalece a defesa, Eliezer Mayenda adiciona força e mobilidade na frente, Issa Soumaré oferece corridas diretas no ataque, enquanto a chegada de Adrien Thomasson traz experiência comprovada na Ligue 1, criatividade e inteligência para o meio-campo. Jérémy Jacquet é a única saída verdadeiramente prejudicial, dando a Franck Haise consideravelmente mais continuidade do que vários dos rivais europeus do Rennes desfrutam.", "textBottom": "O ataque deve girar em torno de Estéban Lepaul, cuja movimentação e finalização podem se traduzir em outra campanha prolífica. Mayenda alivia o fardo físico no ataque, enquanto Thomasson deve fornecer outra fonte confiável de chances e controle atrás dos atacantes. O Rennes recrutou para necessidades identificáveis sem desmontar o núcleo do elenco. A combinação de profundidade, experiência e a clareza tática de Haise faz deles um dos candidatos mais fortes para entrar nas vagas da Liga dos Campeões.", "stats": [ { "icon": "", "value": "6º", "label": "Posição na última temporada" }, { "icon": "", "value": "€275,60m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Estéban Lepaul", "label": "Artilheiro projetado" } ] }, { "id": 3, "name": "Lyon", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/lyon", "imagePosition": "center 22%", "textTop": "O Lyon perdeu Afonso Moreira, um de seus jovens atacantes mais empolgantes, mas respondeu arriscando de forma calculada em Loïs Openda. Sua forma recente ficou aquém dos padrões que estabeleceu no Lens e no RB Leipzig, mas sua velocidade e movimento instintivo permanecem idealmente adequados a um time capaz de criar espaço através de combinações no meio-campo.", "textBottom": "Openda se junta a um grupo construído mais na experiência do que no glamour. Tyler Morton, Corentin Tolisso e Mads Bidstrup dão a Paulo Fonseca inteligência, controle e maturidade competitiva, enquanto Julien Duranville fornece potencial explosivo. A profundidade do Lyon em várias competições merece ser analisada, mas o time titular tem poucas fraquezas óbvias. Se Openda redescobrir sua confiança e o núcleo sênior permanecer saudável, esta equipe tem a estrutura e a capacidade de marcar gols para desafiar o topo.", "stats": [ { "icon": "", "value": "4º", "label": "Posição na última temporada" }, { "icon": "", "value": "€278,45m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Loïs Openda", "label": "Artilheiro projetado" } ] }, { "id": 2, "name": "Lille", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/lille", "imagePosition": "center 22%", "textTop": "O Lille pode perder Ayyoub Bouaddi para o Manchester City, uma transferência que removeria o meio-campista de controle em torno do qual sua próxima era parecia pronta para se desenvolver. Mesmo com essa incerteza, o elenco continua rico em talento. Başar Önal, chegando do NEC, junta-se a Nathan Ngoy, Hákon Haraldsson, Matias Fernandez-Pardo e Ethan Mbappé em um excelente núcleo jovem capaz de dar mais um passo à frente nesta temporada.", "textBottom": "A presença de Olivier Giroud, Alexsandro e Nabil Bentaleb dá a essas promessas uma valiosa camada de experiência. Giroud continua sendo um ponto focal natural, capaz de converter cruzamentos, conectar ataques e guiar atacantes mais jovens em partidas difíceis. O Lille possui uma mistura atraente de jogadores se aproximando de seu auge, jovens promessas e veteranos que entendem de futebol de alta pressão. Perder Bouaddi sem dúvida machucaria, mas a qualidade geral e a profundidade do elenco ainda fazem do Lille o adversário mais forte do PSG nesta temporada.", "stats": [ { "icon": "", "value": "3º", "label": "Posição na última temporada" }, { "icon": "", "value": "€317,10m", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Olivier Giroud", "label": "Artilheiro projetado" } ] }, { "id": 1, "name": "Paris Saint-Germain", "img": "https://imagescache.365scores.com/image/upload/c_limit,q_auto:eco/Magazines/Premium/EN/psg", "imagePosition": "center 22%", "textTop": "O PSG começa com o elenco mais forte da liga, a maior avaliação de mercado e a mais clara infraestrutura vencedora. Eles conquistaram outro campeonato na temporada passada e continuam operando em uma escala competitiva diferente de todos os rivais domésticos. O sistema estabelecido de Luis Enrique, a profundidade de elite e a qualidade técnica implacável tornam uma inconsistência prolongada difícil de imaginar ao longo de uma campanha de 34 jogos.", "textBottom": "Maghnes Akliouche adiciona outro atacante inteligente e versátil a um grupo que já conta com Ousmane Dembélé, Désiré Doué e Bradley Barcola. Mesmo após várias saídas de alto valor, o PSG pode rodar o elenco sem perder controle ou criatividade. Os compromissos europeus podem ocasionalmente abrir a porta para uma zebra, mas nenhum adversário possui uma combinação comparável de profundidade, continuidade tática e talento para vencer jogos. Dembélé continua sendo o artilheiro mais provável em um ataque capaz de sobrecarregar os adversários através de várias rotas diferentes.", "stats": [ { "icon": "", "value": "1º", "label": "Posição na última temporada" }, { "icon": "", "value": "€1,39 bi", "label": "Valor de mercado do elenco" }, { "icon": "", "value": "Ousmane Dembélé", "label": "Artilheiro projetado" } ] } ] }; const nav = document.getElementById('js-nav'); const sections = document.getElementById('js-sections'); const tocList = document.getElementById('js-toc-list'); // Init Hero document.getElementById('js-hero-title').textContent = data.hero.title; const heroBg = document.getElementById('js-hero-bg'); const heroImg = document.getElementById('js-hero-img'); if (heroBg) heroBg.style.backgroundImage = data.hero.img ? `url("${data.hero.img}")` : 'none'; if (heroImg) { if (data.hero.img) { heroImg.src = data.hero.img; heroImg.style.display = 'block'; } else { heroImg.removeAttribute('src'); heroImg.style.display = 'none'; } } document.getElementById('js-hero-copy').innerHTML = data.hero.copy ? `${data.hero.copy}` : ''; const heroSection = document.querySelector('.scores-hero'); const firstItem = data.items && data.items.length ? data.items[0] : null; if (heroSection && firstItem) heroSection.id = `article-item-${firstItem.id}`; const heroFirstItem = document.getElementById('js-hero-first-item'); if (heroFirstItem) { if (firstItem) { const secondItem = data.items[1] || null; const visibleStats = (firstItem.stats || []).filter(s => s && ( String(s.icon || '').trim() || String(s.value || '').trim() || String(s.label || '').trim() )); const statsHtml = visibleStats.map(s => { const hasIcon = Boolean(String(s.icon || '').trim()); const iconHtml = hasIcon ? `` : ''; return ` ${iconHtml} ${s.value || ''} ${s.label || ''} `; }).join(''); heroFirstItem.innerHTML = ` ${firstItem.id}. ${firstItem.name || ''} ${firstItem.textTop ? `${firstItem.textTop}` : ''} ${firstItem.img ? `` : ''} ${firstItem.textBottom ? `${firstItem.textBottom}` : ''} ${visibleStats.length ? `${statsHtml}` : ''} `; } else { heroFirstItem.style.display = 'none'; } } // Build article items data.items.forEach((d, index) => { const nextDriver = data.items[index + 1]; const nextId = nextDriver ? nextDriver.id : null; // Nav button const btn = document.createElement('button'); btn.className = 'scores-nav-button'; btn.textContent = d.id; btn.dataset.articleId = String(d.id); btn.onclick = () => scrollToSection(d.id); nav.appendChild(btn); // ToC entry const tocBtn = document.createElement('button'); tocBtn.style = 'display:block; width:100%; text-align:left; padding:12px; margin-bottom:8px; border:none; background:var(--soft); cursor:pointer; border-radius:12px; font-weight:700; color:var(--text);'; tocBtn.textContent = `${d.id}. ${d.name}`; tocBtn.onclick = () => { scrollToSection(d.id); toggleToC(false); }; tocList.appendChild(tocBtn); if (index === 0) return; // Stats HTML const visibleStats = (d.stats || []).filter(s => s && ( String(s.icon || '').trim() || String(s.value || '').trim() || String(s.label || '').trim() )); const statsHtml = visibleStats.map(s => { const hasIcon = Boolean(String(s.icon || '').trim()); const iconHtml = hasIcon ? `` : ''; return ` ${iconHtml} ${s.value || ''} ${s.label || ''} `; }).join(''); // Card const sect = document.createElement('section'); sect.className = 'scores-section-shell'; sect.id = `article-item-${d.id}`; sect.innerHTML = ` ${d.id}. ${d.name} ${d.textTop} ${d.img ? `` : ''} ${d.textBottom} ${visibleStats.length ? `${statsHtml}` : ''} ${nextId ? `Próximo ›` : ''} `; sections.appendChild(sect); }); // ToC controls function toggleToC(open) { document.getElementById('js-toc-drawer').classList.toggle('is-open', open); document.getElementById('js-toc-overlay').classList.toggle('is-open', open); } document.getElementById('js-toc-open').onclick = () => toggleToC(true); document.getElementById('js-toc-close').onclick = () => toggleToC(false); document.getElementById('js-toc-overlay').onclick = () => toggleToC(false); document.getElementById('js-start').onclick = () => { if (data.items.length > 1) scrollToSection(data.items[1].id); else if (data.items.length) scrollToSection(data.items[0].id); }; // Active nav highlight for manual scrolling only. Clicks set the active state immediately. const observer = new IntersectionObserver((entries) => { if (scoresProgrammaticScroll) return; entries.forEach(entry => { if (entry.isIntersecting) { const id = entry.target.id.replace('article-item-', ''); setActiveNavButton(id); } }); }, { rootMargin: '-20% 0px -70% 0px' }); const observedHero = document.querySelector('.scores-hero[id^="article-item-"]'); if (observedHero) observer.observe(observedHero); document.querySelectorAll('.scores-section-shell').forEach(s => observer.observe(s)); });