;(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

São Paulo

Renovação de Luan segue travada mesmo com atuações de destaque no São Paulo

Luan comemora gol marcado pelo São Paulo sobre o Botafogo-SP em jogo do Paulistão - Thiago Calil/AGIF
Luan comemora gol marcado pelo São Paulo sobre o Botafogo-SP em jogo do Paulistão Imagem: Thiago Calil/AGIF

Colaboração para o UOL, em São Paulo

06/03/2023 04h00

O próprio Luan quer, Rogério Ceni quer, mas a renovação do volante com o São Paulo ainda não está definida. O jogador tem contrato até o fim deste ano, o que significa que a partir do fim de junho já pode um pré-acordo com qualquer outro clube e deixar o Tricolor de graça em 2024.

A permanência de Luan sempre foi pauta no Morumbi, mas voltou à tona após o jogador de 23 anos, revelado em Cotia, acumular boas atuações, sobretudo na vitória do São Paulo por 3 a 1 contra o Botafogo-SP, ontem (5), quando marcou um golaço que abriu caminho para o Tricolor garantir a primeira colocação do Grupo B do Campeonato Paulista.

Luan conviveu com inúmeras lesões nos últimos anos, mas agora tem conseguido espaço na equipe e almeja se firmar novamente entre os titulares do São Paulo. O volante ou por altos e baixos na temporada, demorou a atingir a melhor condição física, na avaliação de Ceni. Questionado sobre a situação contratual do jogador, o treinador deu detalhes da negociação e deixou claro: quer que ele fique.

"São jogadores da base que sustentam o clube. Infelizmente nós perdemos alguns jogadores da base por tempo de contrato, caso do Igor Gomes, do Luizão, e outros. Isso a gente lamenta. O clube forma e é de direito ter esse retorno. O caso do Luan: é um jogador que a gente gostaria de renovar, tê-lo no elenco futuro. Não sei em que pé anda, não vou me intrometer para não falar besteira, mas parece que a diretoria já fez uma proposta, três anos de contrato, não chegaram ainda a um acordo. É uma questão financeira que não tenho como intervir. Tecnicamente falando, é um jogador que para a gente seria interessante que renovasse", opinou Ceni.

Luan adotou um discurso menos detalhista, mas também revelou o desejo de permanecer. A declaração do volante, no entanto, foi seguida de uma observação:

"Sempre quis ficar no São Paulo, tem que ver se tem pessoas que querem que eu fique aqui", afirmou.

Na atual temporada, Luan atuou em nove partidas, sendo duas delas como titular, e marcou dois gols.

São Paulo