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

OPINIÃO

Ludmilla arrasou no Lollapalooza Brasil e temos aqui 6 provas

Ludmilla no Lollapalooza Brasil 2023 - Mariana Pekin/UOL
Ludmilla no Lollapalooza Brasil 2023 Imagem: Mariana Pekin/UOL

Yolanda Reis

de São Paulo, para Splash

25/03/2023 16h09

Ludmilla deu uma volta grande e reinventou a carreira. Hoje, a cantora se apresentou no Lollapalooza 2023, e provou algo: sabe ser artista de verdade, e consegue trazer qualidade à cena musical brasileira.

A artista estava quase perdida no line-up deste sábado, 25. O Autódromo de Interlagos, em São Paulo, recebeu um público bastante diferente do de Lud, por conta das outras atrações do dia: Pitty, Yungblud, Wallows, Tame Impala e Twenty One Pilots (que entrou no lugar do Blink-182). O pagode-pop dela ficou descolado dos outros artistas. Mas isso não importou, não. Fez um ótimo trabalho.

Músicas

Lud levou ao palco do Lolla uma reunião dos excelentes trabalhos que construiu nos últimos anos: Lud Sessions, Numanice, e agora Vilã (disco lançado ontem). Musicalmente, ela fez um bom mix de estilos, e conseguiu entreter muito o público, que dançava e cantava junto. Até comentou: "Fiz o Lollapalooza inteiro cantar pagode."

Espetáculo

Outro fator importante de destacar é a construção espetacular do show. Não é novidade que Ludmilla capricha - no Rock in Rio, o show custou mais de R$ 2 milhões. Ela repetiu o padrão de qualidade no Lolla, e apresentou um palco visualmente interessante e equilibrado, e uma apresentação cativante.

Público

O público, com boa tarde ostentando camisetas das bandas de rock que marcam o dia, não decepcionou a cantora. Acompanharam Lud com alegria, curtindo o pagode e o funk, dançando o pop e o melódico. E esse é o lado ótimo de um festival: curtir bandas tão diferentes em tão pouco tempo.

Consagração

Nos últimos shows, e agora mais ainda no Lolla, Ludmilla encontrou sua consagração. O bom gosto e capricho das produções trouxeram glamour e destaque à artista - e a descolou muito da menina que cantava "A danada sou eu." Mostra a evolução dela como artista, como pessoa e como mulher. Não há muito espaço para dúvidas quando pensamos na evolução musical e artística dela.

Fazendo o dela

Ludmilla lançou ontem, 24, o disco Vilã. Uma ótima estratégia: não apenas ela sabia que poderia apresentar o disco ao vivo para a plateia, sabia que o show dela estava sendo transmitido ao vivo pelo Multishow. Aproveitou o momento para uma autopropaganda, e pediu para todo mundo entrar no Spotify para conhecer o novo disco.

Amor

Durante a apresentação de "Maldivas", Ludmilla aproveitou para celebrar o amor: chamou a esposa, Brunna Gonçalves, e cantaram juntas. Ela contou a história de como fez essa faixa para a mulher. E rolou até beijinho no palco - enfatizando o sentimento de liberdade sexual do Lolla.