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

'Não largo minha favela pelo centro': Heliópolis estreia em Virada Cultural

Kennedy Silva está ansioso para curtir a Virada - André Porto/UOL
Kennedy Silva está ansioso para curtir a Virada Imagem: André Porto/UOL

Beatriz Mazzei

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

27/05/2023 15h59

Pela primeira vez em 18 anos, a Virada Cultural tem palco em Heliópolis, a maior comunidade de São Paulo, com mais de 200 mil habitantes. Durante o sábado (27) e o domingo (28), onze show aram pelos dois palcos com destaques para MC Livinho e Raça Negra.

De camarote: Quem mora na altura do número 530 não precisou nem sair de casa para acompanhar os shows do palco principal. Do alto dos sobrados de tijolos, famílias curtiram os shows com vista privilegiada. Uma descida estreita leva até o segundo palco, que é rodeado de bares, casas e restaurantes.

Kennedy Silva, 27, atendente de lanchonete, defendeu a chegada do evento na região: "Eu adoro a Virada Cultural, então costumava ir até o Centro, mas agora com os assaltos na região não tenho mais vontade. Não troco minha favela para me divertir no Centro, aqui todo mundo se conhece e se respeita", contou.

Ele reforçou, ainda, que até mesmo a comunidade LGBTQIA+ está se sentindo mais à vontade para curtir na comunidade.

"O Centro sempre teve essa fama de ser mais inclusivo, então antes eu reunia a turminha para as festas de lá. Mas agora existe um respeito muito maior. Muitas pessoas trans são referências aqui", completou.

A Virada Cultural de Heliópolis também agita o comércio local. O empreendedor Renato Pacheco, 35, espera duplicar o movimento no seu bar, localizado em frente a um dos palcos. Nascido e criado em Heliópolis, ele também tem um bar no bairro do Ipiranga.

Não moro mais aqui, mas não largo. O faturamento aqui é 70% maior. O movimento é constante todo fim de semana, mas com a Virada vai ser ainda mais.

Virada Cultural 2023

O maior evento cultural da região acontece nos dias 27 e 28 de maio.

A metrópole é palco de uma intensa programação, com mais de 500 atrações gratuitas.

O evento é distribuído em diversos palcos espalhados por todas as regiões da cidade.

Virada Cultural 2023: acompanhe o público e o clima do evento anual que acontece em São Paulo