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

Objetos e móveis de madeira são criados à moda antiga em formas livres

O marceneiro Ricardo Graham em seu ateliê, em Nova Friburgo (RJ) - Salvador Canto/Divulgação
O marceneiro Ricardo Graham em seu ateliê, em Nova Friburgo (RJ)
Imagem: Salvador Canto/Divulgação

Carol Scolforo

Colaboração para Nossa

26/01/2021 04h00

Ricardo Graham

Ricardo Graham

QUEM É

É marceneiro em Nova Friburgo, RJ, onde está à frente da marca O Ebanista, que produz objetos e móveis autorais e artesanais

Liberdade e método: a madeira exige que as mãos sejam guiadas por esse caminho para criar um móvel autoral que brilhe. O marceneiro Ricardo Graham aprendeu que seu trabalho flui assim, em livre inspiração, mas com disciplina e técnica.

Após cursar duas escolas artesanais na Itália e na França, ele voltou da Europa como ebanista formado. Há 14 anos esse é o título que expressa seu ofício artesanal, em Nova Friburgo, RJ.

Minha entrada no mundo da marcenaria aconteceu por amor mesmo. Eu não tinha um histórico familiar de marceneiros, mas meus pais sempre gostaram de objetos, móveis e brinquedos de madeira e eu gostava muito de construir coisas"

Ricardo voltou ao Brasil depois aprender o ofício na Itália e na França - Salvador Canto/Divulgação - Salvador Canto/Divulgação
Ricardo voltou ao Brasil depois aprender o ofício na Itália e na França
Imagem: Salvador Canto/Divulgação

O caminho artesanal

Com o jeito de fazer artesanal, Ricardo resolveu se dedicar à criação de móveis autorais, como poltronas, cadeiras, mesas que revelam encaixes preciosos e cores naturais, vindas das espécies tropicais de manejo florestal ou demolições.

O ebanista é aquele profissional que trabalha com madeira - Salvador Canto/Divulgação - Salvador Canto/Divulgação
odo o processo de produção da O Ebanista é artesanal
Imagem: Salvador Canto/Divulgação
O ebanista -  - Salvador Canto/Divulgação - Salvador Canto/Divulgação
Ricardo se encarrega desde a escolha das madeiras até a divulgação
Imagem: Salvador Canto/Divulgação

"Desde a escolha das madeiras ando pela secagem delas, o desenho à mão do que farei e a fabricação, tudo é artesanal, assim como a divulgação, os eventos, as vendas", diz sobre o trabalho que envolve oito horas de seu dia.

o ebanista - divulgação - divulgação
Imagem: divulgação
o ebanista - Divulgação - Divulgação
Imagem: Divulgação

Com o tempo ele deixou de lado os desafiadores móveis planejados sob medida — segundo ele, algo mais complexo, que produzia no início. Agora, Ricardo se lança a objetos menores — veja os vasos de madeira e se apaixone pela pureza de linhas.

Coloco na minha arte uma qualidade que as pessoas possam sentir e levar consigo por meio das peças"

@s que me inspiram

@morito.ebine

O marceneiro japonês faz móveis de encaixe e tem um trabalho na marcenaria que iro muito.

@biancagrahamferreira

Minha irmã Bianca, estilista, que tem um trabalho lindo e artesanal utilizando linho natural e cores me inspira muito.