;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Fluminense

Samuel Xavier supera obstáculos em início no Fluminense e ganha sequência

Samuel Xavier, lateral-direito do Fluminense - Lucas Merçon / Fluminense F.C.
Samuel Xavier, lateral-direito do Fluminense Imagem: Lucas Merçon / Fluminense F.C.

Do UOL, no Rio de Janeiro (RJ)

12/06/2021 04h00

Primeira contratação do Fluminense para a temporada, o lateral-direito Samuel Xavier teve de superar a covid-19, e as graves consequências da doença, antes de estrear. O camisa 2, porém, mostrou as credenciais ao técnico Roger Machado e, recentemente, se tornou o titular do setor, que até então tinha Calegari, cria da base, como dono.

A sequência de Xavier na equipe inicial começou no duelo com o River Plate, na Argentina, pela Libertadores. De lá para cá, esteve entre os 11 nos jogos contra São Paulo e Cuiabá, pelo Brasileiro, e os dois contra o Red Bull Bragantino, pela Copa do Brasil.

No Brasileiro, segundo o footstats, é o líder de es certos, com média de 88,64%, além de ser o segundo em desarmes e lançamentos. Já na Copa do Brasil, ainda de acordo com o site, é o líder em "interceptações certas", e o terceiro em es certos, com 30,5% de média — atrás de Martinelli, com 39,5%, e Egídio, com 36%.

A série acontece depois de um início de caminhada complicado nas Laranjeiras. Logo que chegou, Samuel Xavier contraiu covid-19, o que atrasou um pouco os planos, inclusive a apresentação. Mais do que isso, a doença teve consequências mais graves, como o fato de comprometer 25% do pulmão do atleta.

"Eu fiquei com 25% do pulmão comprometido, deu pneumonia, falta de ar, foi bem difícil, mas eu dou graças a Deus porque não tive nenhuma sequela. As duas primeiras semanas foram bem difíceis para mim, eu treinava, mas chegava em casa sentindo um pouco de falta de ar, com muita dor no peito", disse, em entrevista ao PPV do Campeonato Carioca, em abril.

Até a partida contra o River, no dia 25 do mês ado, o lateral havia estado em campo em quatro oportunidades — contra Botafogo, Madureira e nos dois jogos da semifinal contra a Portuguesa-RJ —, todas pelo Estadual, e foi titular em três.

Um outro obstáculo superado foi a concorrência. Experiente, Samuel foi contratado para uma posição que contava com o jovem Calegari como titular. Cria da base, se consolidou no time na última temporada e foi alvo de elogios por parte da torcida e comissão técnica. Quando chegou, o camisa 2 salientou que o calendário seria apertado e, com isso, haveria a possibilidade de Roger dar oportunidade a todos no elenco.

"Respeitando meus companheiros, a gente está sempre querendo atuar. Vai ser um ano de muitos jogos, então, acredito que todos vão ter oportunidades. Espero que quando eu tiver a minha, possa ajudar a equipe e meus companheiros. Isso é o mais importante para o Fluminense", disse, na ocasião.

Fluminense