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

O Último Samba: saga de Dani Alves na Copa do Mundo vai virar série

Thiago Arantes

Colaboração para o UOL, de Barcelona

18/11/2022 14h30

Classificação e Jogos

No domingo, 6 de novembro, véspera da convocação da seleção brasileira para a Copa do Mundo, Daniel Alves estava na praia. O lateral-direito não estava relaxando com a família, jogando futevôlei ou tomando uma caipirinha. Ao lado do fisioterapeuta Rommel Nunes, o veterano de 39 anos fazia um treinamento de força e mobilidade.

Imagens cedidas com exclusividade ao UOL mostram Dani Alves treinando no fim de tarde em Gavà, a 20 km de Barcelona. Era o penúltimo dia de uma rotina que ele definiu em entrevista ao UOL Esporte como "treinar como um animal", tendo por objetivo disputar no Qatar o terceiro Mundial da carreira. Além dos treinos particulares, a rotina incluiu atividades com o time B do Barcelona.

As imagens fazem parte da segunda temporada de uma série documental sobre o jogador, com lançamento programado para 2023. Os últimos treinos antes da convocação, a preparação com a seleção em Turim e a Copa do Mundo serão o fio condutor da narrativa, que tem como nome provisório "The Last Samba" ("O Último Samba", em português).

Dani Alves, Barcelona - Juanjo Ubeda/Quality Sport Images/Getty Images - Juanjo Ubeda/Quality Sport Images/Getty Images
Dani Alves, do Barcelona, durante jogo contra o Betis pelo Campeonato Espanhol
Imagem: Juanjo Ubeda/Quality Sport Images/Getty Images

A primeira temporada da série, "Crazy Dream", tem 6 capítulos e está disponível na plataforma Fifa+ e mostra a saga do lateral direito em sua agem pelo São Paulo, o retorno ao Barcelona no fim de 2021 e a aventura na Liga Mexicana. A série é uma produção Maracanã Media, com direção é de Ulisses Neto, com Thiago Slovinski e o próprio Dani Alves na produção executiva.

"O fato de ter o Dani como um dos produtores do projeto nos ajuda a ter vários os a lugares e a pessoas", afirma Ulisses Neto. "Nessas séries, a gente tem um conceito de "fly on the wall" (mosca na parede, em português) que nos coloca dentro das situações que ele viveu. É muito difícil ver isso em outras produções", explica Slovinski.

O o total a lugares em que as câmeras normalmente não chegam é o grande trunfo da primeira temporada. Nela, o espectador vê a conversa telefônica de Daniel com Xavi, técnico do Barcelona, em que ambos falam sobre a volta ao clube catalão; e há, também, o outro lado da moeda, como o diálogo em que o brasileiro percebe que não terá o contrato renovado.

Isolamento na convocação

Para a segunda temporada, a ideia dos criadores da série é manter os os a lugares considerados inalcançáveis, mesmo no complicado ambiente de Copa do Mundo. Uma exceção na narrativa será será a tarde do dia 7 de novembro, no momento da convocação, por opção de Daniel Alves.

Ao contrário do que aconteceu com a maioria dos convocados, não há registro em vídeo das reações do veterano ao chamado por Tite -nem feito por ele mesmo, com o celular, nem pela equipe da série. Sem saber se estaria ou não na lista de 26 jogadores, o lateral-direito preferiu viver o momento sozinho, em casa.

Apesar do isolamento do protagonista no momento do anúncio, a convocação vai entrar no roteiro da segunda temporada de outras formas. Na expectativa dos dias anteriores, na festa horas depois e, também, com as críticas da imprensa ao nome do veterano de 39 anos na lista de Tite. "As críticas são uma parte muito importante da história", explica o diretor Ulisses Neto.