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

Ana Paula Xongani

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

'Discurso para vestir': a roupa que uso também é símbolo de resistência

Cristina Mendonça, mãe de Ana Paula Xongani, recria a líder quilombola Tereza de Benguela - Acervo pessoal
Cristina Mendonça, mãe de Ana Paula Xongani, recria a líder quilombola Tereza de Benguela Imagem: Acervo pessoal

Colunista de Universa

29/07/2021 04h00

Certa vez, disseram que a minha marca, o Ateliê Xongani, faz "discursos para vestir". Eu amei. É a definição perfeita para uma marca criada e liderada por duas mulheres negras que adoram falar, claro, mas também amam expressar e ressignificar as suas existências a partir da moda.

Há mais de dez anos, quando minha mãe, Cristina Mendonça, e eu criamos o Ateliê, inspiradas pelos tecidos que encontrei em uma viagem à Moçambique, chamadas capulanas, sabíamos que era a hora de levar essa imagem para mais mulheres. Queríamos mostrar aquilo que a moda sempre foi para a gente: um lugar de expressão, de cuidado, de beleza. O nome "Xongani" significa isso, inclusive: "se enfeite, fique bonita!".

Antes de pensarmos em entrar no mercado da moda, minha mãe já me mostrava os papéis desempenhados pelas vestimentas — às vezes escudo, às vezes palco.

Quando ela criava minhas roupas e órios, era para deixar bonita toda a minha corporalidade negra e fortalecer as minhas subjetividades a partir da autoestima

Quando ela cortou o cabelo alisado, muito antes da "transição capilar" e o "big shop" virar um movimento importante, era para que eu crescesse vendo todos os dias um cabelo igual ao meu ser cuidado, enfeitado. Era para me ensinar, apesar dos padrões dizendo o contrário, a ver beleza nos cabelos crespos naturais.

É por isso que, para a gente, é tão emocionante recomeçar o Ateliê Xongani, que estava parado há mais de um ano, em razão da pandemia. Considero um renascimento, porque a volta sustenta não apenas o Ateliê em si, mas também as subjetividades da minha existência, da existência da minha mãe e de todas as mulheres que, também através da moda que a gente produz, enxergam beleza nelas mesmas.

Mulheres como a Klaryssa Keize, uma jovem na casa dos vinte, e a Cleide Nascimento, mais velha, na casa dos 50, que estão com a gente diariamente no Ateliê, se dedicaram muito para entregarmos a coleção Tereza. Ela é inspirada na mulher negra e quilombola Tereza de Benguela, baseada nos pilares de criação, consciência e resistência. Recriamos a figura de Tereza a partir da imagem da minha mãe, aos 63 anos, como uma rainha com vestida e adornada com órios.

Para este renascimento, firmamos uma parceria com Marcha das Mulheres Negras, movimento incansável na garantia do bem viver de pessoas negras, e uma nossas peças tem parte do lucro revertido para as ações deste movimento.

Tudo que eu faço é sobre isso. Seja nesta coluna, nos meus canais pessoais ou no Ateliê Xongani, meu trabalho é inspirado pela nossa força, beleza e complexidades. Acredito em uma moda ível e inclusiva, pensada e modelada para nós, para a diversidade dos nossos corpos; pronta para vestir tudo o que somos e nosso corpo carrega. Por nós, por todas nós, pelo bem viver.