/* global React */
const { useState, useEffect, useRef } = React;
/* ======================================================
ABOUT
====================================================== */
function About() {
const clients = [
'Marcas em crescimento', 'Startups e produtos digitais', 'Instituições culturais',
'Editoras', 'Universidades', 'Organizações de impacto',
'Empresas de capital aberto', 'Organizações ESG',
];
return (
Estratégia antes da estética.
Significado antes de visibilidade.
Sistema antes da arte.
Acreditamos que o design vai além da estética. Como ferramenta de
pensamento, estratégia e construção de valor, ele conecta
criatividade, cultura e inovação para desenvolver marcas e
sistemas de comunicação com consistência, relevância e impacto
duradouro.
Who we work with
Organizações que acreditam no poder do design para construir
valor, relevância e legado.
{clients.map((c, i) => (
- —{c}
))}
);
}
/* ======================================================
CASES
====================================================== */
const CASES = [
{ num: '/01', title: 'Empório da Terra', meta: ['Strategy', 'Brand Design', 'Digital Experience'], year: '2025', sw: '#C9C2B2', swFg: '#0A0A0A', kind: 'poster', short: 'Empório', subtitle: 'da Terra', tag: 'BRAND / 2025', img: 'assets/case-emporio.jpg' },
{ num: '/02', title: 'Black Fish Brasil', meta: ['Strategy', 'Brand Design', 'Digital Experience', 'Content & Social Systems'], year: '2024', sw: '#0F1B2A', swFg: '#FAFAFA', kind: 'poster', short: 'Black Fish', subtitle: 'Brasil', tag: 'BRAND / 2024', img: 'assets/case-blackfish.jpg' },
{ num: '/03', title: 'Rancho Thands', meta: ['Strategy', 'Brand Design', 'Digital Experience', 'Content & Social Systems'], year: '2025', sw: '#E2D3BD', swFg: '#0A0A0A', kind: 'type', short: 'Rancho', subtitle: 'Thands', tag: 'BRAND / 2025', img: 'assets/case-rancho.jpg' },
{ num: '/04', title: 'Engenho de Ideias', meta: ['Digital Experience'], year: '2024', sw: '#1A1A1A', swFg: '#FAFAFA', kind: 'grid', short: 'Engenho', subtitle: 'de Ideias', tag: 'DIGITAL', img: 'assets/case-engenho.jpg' },
];
function Cases() {
return (
/04
Work
Projetos
selecionados
que mostram como estratégia, design e
comunicação se conectam para gerar valor.
{CASES.map((c, i) => (
{c.title}
{c.meta.map((m, j) => {m})}
Coming soon ↗
))}
);
}
function PreviewArt({ c }) {
const metaRow = (
{c.tag}
{c.year}
);
switch (c.kind) {
case 'type':
return (
<>
— {c.subtitle}
{c.short}.
{metaRow}
>
);
case 'grid':
return (
<>
/01
/02
/03
/04
/05
/06
/07
/08
/09
{metaRow}
>
);
case 'spread':
return (
<>
{metaRow}
>
);
case 'app':
return (
<>
{c.short}●●●
Saldo disponível
R$ 12.480,00
{metaRow}
>
);
case 'poster':
return (
<>
— {c.subtitle}
{c.short}.
{metaRow}
>
);
case 'circle':
return (
<>
{c.subtitle}{c.tag}
{c.short}.
{metaRow}
>
);
default: return null;
}
}
/* ======================================================
FOUNDER
====================================================== */
function Founder() {
return (
Thiago Dalmas Affonso é fundador da Morse e atua há mais de 25
anos na construção de marcas, narrativas e sistemas de
comunicação.
Formado em Publicidade e Propaganda pela PUCRS, desenvolveu
projetos para empresas do varejo, indústria e serviços, além de
instituições públicas e governamentais de diferentes portes e
contextos.
Sua trajetória foi construída conectando estratégia, comunicação
e design para transformar complexidade em clareza, posicionamentos
em significado e ideias em experiências capazes de gerar valor
duradouro.
Hoje, lidera a Morse com a mesma convicção que orienta sua
prática: o design é uma ferramenta de pensamento, capaz de
construir relevância, fortalecer conexões e ampliar o impacto de
organizações e iniciativas.
LinkedIn /thiago-dalmas-affonso ↗
);
}
/* ======================================================
CONTACT
====================================================== */
function ContactTransmit() {
// M O R S E — real Morse timing, identical to the hero signal
const WORD = [
['dash', 'dash'], // M
['dash', 'dash', 'dash'], // O
['dot', 'dash', 'dot'], // R
['dot', 'dot', 'dot'], // S
['dot'], // E
];
const symbols = [];
WORD.forEach((letter, li) => letter.forEach((t) => symbols.push({ type: t, li })));
const [active, setActive] = React.useState(-1);
React.useEffect(() => {
const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (reduce) { setActive(-1); return; }
const unit = 135;
let idx = 0;
let timer;
const run = () => {
const sym = symbols[idx];
setActive(idx);
const onDur = sym.type === 'dash' ? unit * 3 : unit;
timer = setTimeout(() => {
setActive(-1);
const next = symbols[idx + 1];
let gap = unit; // inter-symbol
if (!next) gap = unit * 7; // word reset
else if (next.li !== sym.li) gap = unit * 3; // inter-letter
timer = setTimeout(() => {
idx = (idx + 1) % symbols.length;
run();
}, gap);
}, onDur);
};
run();
return () => clearTimeout(timer);
}, []);
let gi = -1;
return (
Transmitting
{WORD.map((letter, li) => (
{letter.map((t) => {
gi += 1;
const cur = gi;
return (
);
})}
))}
M · O · R · S · E
);
}
function Contact() {
return (
/07
Let's build something with intention
);
}
/* ======================================================
OUTRO + FOOTER
====================================================== */
function Outro() {
const wordRef = useRef(null);
useEffect(() => {
const word = wordRef.current;
if (!word) return;
const wrap = word.closest('.wrap');
let inkRatio = null;
const measureInkRatio = () => {
const cs = getComputedStyle(word);
const probe = 300;
const ls = -0.06 * probe;
const c = document.createElement('canvas');
c.width = Math.ceil(probe * 5.5); c.height = Math.ceil(probe * 1.4);
const ctx = c.getContext('2d');
ctx.fillStyle = '#000'; ctx.fillRect(0, 0, c.width, c.height);
ctx.fillStyle = '#fff'; ctx.textBaseline = 'middle';
ctx.font = `${cs.fontWeight} ${probe}px ${cs.fontFamily}`;
let x = 0;
for (const ch of 'MORSE') { ctx.fillText(ch, x, c.height / 2); x += ctx.measureText(ch).width + ls; }
const img = ctx.getImageData(0, 0, c.width, c.height).data;
let minX = c.width, maxX = 0;
for (let y = 0; y < c.height; y++) for (let xx = 0; xx < c.width; xx++) if (img[(y * c.width + xx) * 4] > 40) { if (xx < minX) minX = xx; if (xx > maxX) maxX = xx; }
return (maxX - minX) / probe;
};
const fit = () => {
if (!inkRatio) inkRatio = measureInkRatio();
if (!inkRatio || inkRatio < 0.1) return;
const cs = getComputedStyle(wrap);
const inner = wrap.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight);
word.style.fontSize = (inner / inkRatio) + 'px';
};
const ro = new ResizeObserver(fit);
ro.observe(wrap);
if (document.fonts && document.fonts.ready) document.fonts.ready.then(() => { inkRatio = null; fit(); });
fit();
return () => ro.disconnect();
}, []);
return (
MORSE
—— ——— ·—· ··· ·
Craft Design
);
}
function Footer() {
return (
);
}
window.About = About;
window.Cases = Cases;
window.Founder = Founder;
window.Contact = Contact;
window.Outro = Outro;
window.Footer = Footer;