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

Demitido do Lyon, Sylvinho largou time olímpico e deu lugar a filho de Tite

Sylvinho, auxiliar-técnico de Tite, durante treino da seleção brasileira - Lucas Figueiredo/CBF
Sylvinho, auxiliar-técnico de Tite, durante treino da seleção brasileira Imagem: Lucas Figueiredo/CBF

Danilo Lavieri e Pedro Lopes

Do UOL, em São Paulo

08/10/2019 04h00

Demitido ontem do Lyon, Sylvinho renunciou a uma posição bastante privilegiada na seleção brasileira para realizar o sonho de ser treinador. Número 2 na comissão de Tite, ele seria o técnico da equipe sub-23 em caso de classificação para a disputa das Olimpíadas, mas preferiu deixar tudo para trás às vésperas da Copa América no Brasil.

O espaço deixado por ele foi ocupado por Matheus Bacchi, filho de Tite. Por conta disso, ele deixou o posto de observação que ocupava das tribunas nos dias do jogo para sentar-se ao lado de seu pai no banco de reservas. Na "linha de comando", ele só ficou atrás de Cléber Xavier, que é o principal auxiliar do treinador.

A escolha por Matheus, aliás, virou motivo de discussão na CBF, na imprensa e entre torcedores. É bom lembrar que a entidade precisou até alterar o seu código de ética para permitir que Matheus tivesse um cargo na comissão.

Nas últimas duas datas Fifa, a comissão técnica recebeu o reforço de César Sampaio como auxiliar pontual. A princípio, ele não viraria funcionário fixo da comissão, mas os seus dois chamados seguidos chamaram a atenção pelo ineditismo no histórico recente de "convidados".

Na seleção olímpica, o escolhido para o lugar vazio foi André Jardine. Muito elogiado até aqui na CBF, ele dificilmente seria trocado no atual momento, mas Sylvinho certamente vira uma sombra para o atual comandante em caso de algum tropeço na briga por uma vaga no Japão em 2020.

Até agora, a seleção brasileira ainda não contratou ninguém para ocupar o espaço deixado por ele. Apesar de ser bastante querido por Tite e todos da comissão, é difícil imaginar que o retorno seja possível porque isso significaria um o atrás no projeto de se tornar um treinador.

Ao chegar no Lyon, Sylvinho não imaginava que poderia ser demitido de maneira tão rápida. Comandado pelo diretor esportivo, Juninho Pernambucano, ele teve carta branca para indicações para contratações como as de Jean Lucas e Thiago Mendes. Por pouco, não convenceu Filipe Luís de continuar por pelo menos mais uma temporada na Europa para defender o clube francês.

A princípio, o ex-lateral deve continuar morando na Europa. Ele tem residência em Milão, na Itália, e sempre aproveitou a "posição estratégica" para ser um braço da comissão na observação de jogos e relacionamento com atletas.