Osiris

Type Concept

Role Direction & Design

Year 2020

be_cd-dinamico-1

Logótipo

Com o objetivo de materializar e visualizar uma identidade de Conan Osiris ♫ - dono de alguma imprevisibilidade e risco na maneira de como se apresenta, surge esta tentativa de reaproximar o artista uma das primeiras influências documentadas - o Japão. 

Objetivando-se uma cara para uma nova tour, fizeram-se peças de merchandising e, o principal, um album (em CD e vinil) que reúne as 2 últimas obras de Conan. 

Crl me foda estes custom styles

be_logo2
be_logo

Com o objetivo de materializar e visualizar uma identidade de
Conan Osiris ♫ - dono de alguma imprevisibilidade e risco na maneira de como se apresenta, surge esta tentativa
de reaproximar o artista uma das primeiras influências documentadas - o Japão. 

Objetivando-se uma cara para uma nova tour, fizeram-se peças de merchandising e, o principal, um album (em CD e vinil) que reúne as 2 últimas obras de Conan. 

cover_osiris
cd-semreflexo
be_vinyl-com-disco
be_poster
be_chapeu
be_shirt

marcelonunes.pt

© Marcelo Nunes 2024

View
// Array de palavras e cores para o efeito const palavrasFlutuntes = [ { texto: "creative", cor: "#FF6B6B" }, { texto: "ambitious", cor: "#4ECDC4" }, { texto: "curious", cor: "#45B7D1" }, { texto: "bold", cor: "#96CEB4" }, { texto: "visionary", cor: "#FFEAA7" }, { texto: "innovative", cor: "#DDA0DD" }, { texto: "passionate", cor: "#FF7675" }, { texto: "dynamic", cor: "#74B9FF" } ];// Função para criar uma palavra flutuante function criarPalavraFlutuante(x, y) { const container = document.getElementById('floating-words-container'); if (!container) return;// Seleciona palavra e cor aleatórias const item = palavrasFlutuntes[Math.floor(Math.random() * palavrasFlutuntes.length)]; // Cria o elemento const palavra = document.createElement('div'); palavra.className = 'floating-word'; palavra.textContent = item.texto; palavra.style.backgroundColor = item.cor; // Posicionamento baseado no cursor const offsetX = (Math.random() - 0.5) * 100; // -50px a +50px const offsetY = (Math.random() - 0.5) * 80; // -40px a +40px palavra.style.left = `${x + offsetX}px`; palavra.style.top = `${y + offsetY}px`; // Rotação aleatória const rotacao = (Math.random() - 0.5) * 20; // -10deg a +10deg palavra.style.setProperty('--rotation', `${rotacao}deg`); container.appendChild(palavra); // Animar entrada setTimeout(() => { palavra.classList.add('show'); }, 50); // Animar saída setTimeout(() => { palavra.classList.remove('show'); palavra.classList.add('fade-out'); }, 1500); // Remover da DOM setTimeout(() => { if (palavra.parentNode) { palavra.parentNode.removeChild(palavra); } }, 2100); }// Aplicar o efeito a todos os botões com a classe document.addEventListener('DOMContentLoaded', function() { const botoes = document.querySelectorAll('.hover-floating-words'); botoes.forEach(botao => { let intervalo = null; botao.addEventListener('mouseenter', function() { // Criar palavras imediatamente ao entrar const rect = this.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; criarPalavraFlutuante(x, y); // Continuar criando palavras durante o hover intervalo = setInterval(() => { const rect = this.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; criarPalavraFlutuante(x, y); }, 300); }); botao.addEventListener('mouseleave', function() { // Parar de criar novas palavras if (intervalo) { clearInterval(intervalo); intervalo = null; } }); // Efeito adicional no movimento do rato botao.addEventListener('mousemove', function(e) { // Criar palavras ocasionalmente durante o movimento if (Math.random() < 0.1) { // 10% de chance criarPalavraFlutuante(e.clientX, e.clientY); } }); }); });