import React, { StrictMode, useEffect, useRef, useState } from 'react';
import { createRoot } from 'react-dom/client';
import brandLogo from '../img/logos-03.svg';
import heroDesignImage from '../img/hero-design-studio.png';
import './styles.css';
const WHATSAPP_NUMBER = '5511993955093';
const SECTION_IDS = ['inicio', 'sobre', 'servicos', 'contato'];
const BRAND_PURPLE = '#CEA9FF';
const NEUTRAL_DARK = '#252525';
/* Project data removed from the public presentation.
{
id: 'ardox-web',
index: '01',
title: 'Ardo-X',
category: 'digital',
image: ardoImage,
accent: BRAND_PURPLE,
tone: NEUTRAL_DARK,
type: { pt: 'Experiência digital', en: 'Digital experience', es: 'Experiencia digital' },
description: {
pt: 'Uma presença digital que transforma tecnologia térmica em uma jornada clara e contemporânea.',
en: 'A digital presence that turns thermal technology into a clear, contemporary journey.',
es: 'Una presencia digital que transforma la tecnología térmica en una experiencia clara y contemporánea.'
},
summary: {
pt: 'Estratégia, interface e direção de arte para aproximar uma marca técnica das pessoas.',
en: 'Strategy, interface and art direction bringing a technical brand closer to people.',
es: 'Estrategia, interfaz y dirección de arte para acercar una marca técnica a las personas.'
},
tags: ['UX/UI', 'Web design', 'Direção de arte']
},
{
id: 'golden-beard',
index: '02',
title: 'Golden Beard',
category: 'branding',
image: goldenImage,
accent: BRAND_PURPLE,
tone: NEUTRAL_DARK,
type: { pt: 'Identidade visual', en: 'Visual identity', es: 'Identidad visual' },
description: {
pt: 'Uma marca de presença marcante, com códigos visuais inspirados no cuidado e na tradição.',
en: 'A bold brand with visual codes inspired by care and tradition.',
es: 'Una marca con carácter y códigos visuales inspirados en el cuidado y la tradición.'
},
summary: {
pt: 'Uma identidade criada para fazer cada ponto de contato parecer parte do mesmo ritual.',
en: 'An identity designed to make every touchpoint feel part of the same ritual.',
es: 'Una identidad concebida para que cada punto de contacto parezca parte del mismo ritual.'
},
tags: ['Branding', 'Identidade', 'Aplicações']
},
{
id: 'prof-monique',
index: '03',
title: 'Professora Monique',
category: 'branding',
image: moniqueImage,
accent: BRAND_PURPLE,
tone: NEUTRAL_DARK,
type: { pt: 'Identidade visual', en: 'Visual identity', es: 'Identidad visual' },
description: {
pt: 'Identidade acolhedora para uma educadora que ensina de forma próxima e humana.',
en: 'A welcoming identity for an educator who teaches with closeness and humanity.',
es: 'Una identidad acogedora para una educadora que enseña con cercanía y humanidad.'
},
summary: {
pt: 'Um sistema gráfico flexível para comunicar conteúdo, confiança e proximidade.',
en: 'A flexible graphic system that communicates content, trust and closeness.',
es: 'Un sistema gráfico flexible para comunicar contenido, confianza y cercanía.'
},
tags: ['Branding', 'Estratégia', 'Social']
},
{
id: 'haaram',
index: '04',
title: 'Haaram',
category: 'branding',
image: haaramImage,
accent: BRAND_PURPLE,
tone: NEUTRAL_DARK,
type: { pt: 'Identidade visual', en: 'Visual identity', es: 'Identidad visual' },
description: {
pt: 'Uma linguagem visual contemporânea, criada para uma marca de atitude singular.',
en: 'A contemporary visual language for a brand with a singular attitude.',
es: 'Un lenguaje visual contemporáneo para una marca con una actitud singular.'
},
summary: {
pt: 'Tipografia, cor e detalhes gráficos criando reconhecimento sem perder espontaneidade.',
en: 'Typography, colour and graphic details building recognition without losing spontaneity.',
es: 'Tipografía, color y detalles gráficos que crean reconocimiento sin perder espontaneidad.'
},
tags: ['Naming', 'Identidade', 'Direção de arte']
},
{
id: 'ardox-social',
index: '05',
title: 'Ardo-X Social',
category: 'social',
image: socialImage,
accent: BRAND_PURPLE,
tone: NEUTRAL_DARK,
type: { pt: 'Conteúdo social', en: 'Social content', es: 'Contenido social' },
description: {
pt: 'Peças que aproximam produto, informação e audiência em uma linguagem fácil de reconhecer.',
en: 'Pieces that connect product, information and audience in a recognisable language.',
es: 'Piezas que acercan producto, información y audiencia en un lenguaje reconocible.'
},
summary: {
pt: 'Um kit de comunicação contínua pensado para informar, conectar e manter a marca ativa.',
en: 'An always-on communication kit designed to inform, connect and keep the brand active.',
es: 'Un kit de comunicación continua pensado para informar, conectar y mantener activa la marca.'
},
tags: ['Social media', 'Campanha', 'Conteúdo']
},
{
id: 'decorlyne',
index: '06',
title: 'Decorlyne',
category: 'digital',
image: decorlyneImage,
accent: BRAND_PURPLE,
tone: NEUTRAL_DARK,
type: { pt: 'Desenvolvimento web', en: 'Web development', es: 'Desarrollo web' },
description: {
pt: 'Um site institucional que valoriza projetos sob medida e inspira novos ambientes.',
en: 'An institutional website that showcases tailor-made projects and inspires new spaces.',
es: 'Un sitio institucional que valora proyectos a medida e inspira nuevos espacios.'
},
summary: {
pt: 'Arquitetura de informação e estética para fazer o portfólio trabalhar a favor do negócio.',
en: 'Information architecture and aesthetics that make the portfolio work for the business.',
es: 'Arquitectura de información y estética para que el portafolio trabaje para el negocio.'
},
tags: ['Web design', 'UX/UI', 'Conteúdo']
}
*/
const copy = {
pt: {
navigation: [
['inicio', 'Início'],
['sobre', 'Estúdio'],
['servicos', 'Serviços'],
['contato', 'Contato']
],
menu: 'Abrir menu',
closeMenu: 'Fechar menu',
themeToLight: 'Usar tema claro',
themeToDark: 'Usar tema escuro',
language: 'Idioma',
hero: {
overline: 'Gui Ortiz · Designer gráfico',
titleStart: 'Design que faz',
titleAccent: 'marcas ganharem',
titleEnd: 'vida própria.',
text: 'Identidades, experiências digitais e sistemas visuais para negócios que querem ocupar espaço na memória das pessoas.',
primary: 'Conhecer serviços',
secondary: 'Iniciar conversa',
detail: 'Direção de arte · Branding · Digital',
scroll: 'Role para explorar'
},
metrics: [
['10+', 'anos de repertório'],
['03', 'frentes de atua\u00e7\u00e3o'],
['01', 'parceria de cada vez']
],
about: {
label: 'O estúdio',
title: 'Mais clareza para a marca. Mais vontade de escolher você.',
text: 'Sou Guilherme Ortiz, designer gráfico e professor de Design. Há mais de uma década, transformo contextos complexos em marcas com personalidade, consistência e intenção.',
textSecond: 'O trabalho nasce da escuta, ganha direção e termina pronto para viver em todos os seus pontos de contato.',
link: 'Conhecer o processo',
cardLabel: 'Princípio de trabalho',
cardTitle: 'Estratégia não precisa parecer séria para ser levada a sério.',
cardText: 'Toda decisão visual deve ter um porquê — e uma energia impossível de ignorar.'
},
/* Portfolio content removed from the public presentation.
portfolio: {
label: 'Projetos selecionados',
title: 'Um portfólio para explorar, não só para olhar.',
text: 'Escolha uma disciplina, abra um projeto e veja como ideia, estética e propósito se encontram.',
filters: { all: 'Tudo', branding: 'Identidade', digital: 'Digital', social: 'Social' },
results: 'projetos',
open: 'Abrir projeto',
empty: 'Ainda não há projetos nessa seleção.'
}, */
services: {
label: 'Em que posso somar',
title: 'Do primeiro rabisco à presença que permanece.',
text: 'Escolha um território para ver o que ele pode destravar para a sua marca.',
items: [
{
id: 'branding',
number: '01',
title: 'Identidade visual',
short: 'Uma marca reconhecível antes mesmo de ser explicada.',
detail: 'Posicionamento, identidade, direção de arte e aplicações para fazer a marca nascer com sistema e personalidade.',
deliverables: ['Diagnóstico', 'Sistema visual', 'Guia de uso']
},
{
id: 'digital',
number: '02',
title: 'Experiências digitais',
short: 'Interfaces que conduzem, informam e convencem.',
detail: 'Estratégia de conteúdo, UX/UI e design responsivo para transformar uma visita em uma relação com a marca.',
deliverables: ['Estrutura', 'UX/UI', 'Protótipo']
},
{
id: 'social',
number: '03',
title: 'Conteúdo & editorial',
short: 'Consistência para a marca continuar interessante todos os dias.',
detail: 'Campanhas, sistemas para social media e materiais editoriais que organizam a mensagem sem tirar sua força.',
deliverables: ['Campanha', 'Templates', 'Direção criativa']
}
]
},
process: {
label: 'Um processo com ritmo',
title: 'Criar junto, com espaço para pensar.',
steps: [
['01', 'Escutar', 'Entender onde a marca está, o que ela quer mover e com quem precisa falar.'],
['02', 'Dar direção', 'Transformar descobertas em um território visual que faça sentido e dê vontade de seguir.'],
['03', 'Construir', 'Refinar cada detalhe até que o sistema funcione com consistência na vida real.'],
['04', 'Colocar no mundo', 'Entregar materiais organizados e uma marca pronta para continuar crescendo.']
]
},
contact: {
label: 'Vamos criar alguma coisa boa',
title: 'Seu próximo capítulo de marca pode começar por aqui.',
text: 'Me conte por onde você quer começar. Eu preparo a conversa; você chega com a ideia.',
question: 'Qual é o foco do seu projeto?',
options: [
['branding', 'Identidade visual'],
['digital', 'Site ou produto digital'],
['social', 'Conteúdo e social media'],
['other', 'Ainda estou descobrindo']
],
selected: 'Selecionado:',
cta: 'Levar essa ideia ao WhatsApp',
hint: 'Sem formulário perdido. A conversa continua direto no WhatsApp.'
},
modal: {
close: 'Fechar detalhes',
label: 'Projeto selecionado',
scope: 'Escopo',
talk: 'Quero algo nessa direção',
next: 'Próximo projeto'
},
footer: 'Direção de arte, identidades visuais e comunicação digital.',
backToTop: 'Voltar ao topo',
whatsapp: 'Falar no WhatsApp',
ariaProjects: 'Lista de projetos',
message: (focus) => `Olá, Gui! Gostaria de conversar sobre ${focus || 'um novo projeto'}.`
},
en: {
navigation: [
['inicio', 'Home'],
['sobre', 'Studio'],
['servicos', 'Services'],
['contato', 'Contact']
],
menu: 'Open menu',
closeMenu: 'Close menu',
themeToLight: 'Use light theme',
themeToDark: 'Use dark theme',
language: 'Language',
hero: {
overline: 'Gui Ortiz · Graphic designer',
titleStart: 'Design that makes',
titleAccent: 'brands take on',
titleEnd: 'a life of their own.',
text: 'Identities, digital experiences and visual systems for businesses that want to live in people’s minds.',
primary: 'Explore services',
secondary: 'Start a conversation',
detail: 'Art direction · Branding · Digital',
scroll: 'Scroll to explore'
},
metrics: [
['10+', 'years of experience'],
['03', 'core services'],
['01', 'partnership at a time']
],
about: {
label: 'The studio',
title: 'More clarity for your brand. More reasons to choose it.',
text: 'I’m Guilherme Ortiz, a graphic designer and Design teacher. For more than a decade, I’ve turned complex contexts into brands with personality, consistency and intent.',
textSecond: 'The work starts with listening, gains direction and ends ready to live at every touchpoint.',
link: 'See the process',
cardLabel: 'Working principle',
cardTitle: 'Strategy does not need to look serious to be taken seriously.',
cardText: 'Every visual decision needs a reason — and an energy that is impossible to ignore.'
},
/* Portfolio content removed from the public presentation.
portfolio: {
label: 'Selected work',
title: 'A portfolio to explore, not just look at.',
text: 'Pick a discipline, open a project and see where idea, aesthetics and purpose meet.',
filters: { all: 'All work', branding: 'Branding', digital: 'Digital', social: 'Social' },
results: 'projects',
open: 'Open project',
empty: 'There are no projects in this selection yet.'
}, */
services: {
label: 'How I can help',
title: 'From first sketch to a presence that endures.',
text: 'Choose a territory to see what it can unlock for your brand.',
items: [
{ id: 'branding', number: '01', title: 'Visual identity', short: 'A brand recognised before it has to explain itself.', detail: 'Positioning, identity, art direction and applications to make the brand start with a system and personality.', deliverables: ['Discovery', 'Visual system', 'Guidelines'] },
{ id: 'digital', number: '02', title: 'Digital experiences', short: 'Interfaces that guide, inform and persuade.', detail: 'Content strategy, UX/UI and responsive design turning a visit into a relationship with the brand.', deliverables: ['Structure', 'UX/UI', 'Prototype'] },
{ id: 'social', number: '03', title: 'Content & editorial', short: 'Consistency that keeps a brand interesting every day.', detail: 'Campaigns, social systems and editorial pieces that organise the message without losing its strength.', deliverables: ['Campaign', 'Templates', 'Creative direction'] }
]
},
process: {
label: 'A process with rhythm',
title: 'Creating together, with room to think.',
steps: [
['01', 'Listen', 'Understand where the brand is, what it wants to move and who it needs to speak to.'],
['02', 'Set direction', 'Turn discoveries into a visual territory that makes sense and invites action.'],
['03', 'Build', 'Refine every detail until the system works consistently in real life.'],
['04', 'Put it into the world', 'Deliver organised materials and a brand ready to keep growing.']
]
},
contact: {
label: 'Let’s make something good',
title: 'Your brand’s next chapter can start here.',
text: 'Tell me where you want to start. I’ll prepare the conversation; you bring the idea.',
question: 'What is the focus of your project?',
options: [['branding', 'Visual identity'], ['digital', 'Website or digital product'], ['social', 'Content and social media'], ['other', 'I’m still figuring it out']],
selected: 'Selected:',
cta: 'Take this idea to WhatsApp',
hint: 'No lost forms. The conversation continues straight on WhatsApp.'
},
modal: { close: 'Close details', label: 'Selected project', scope: 'Scope', talk: 'I want something in this direction', next: 'Next project' },
footer: 'Art direction, visual identities and digital communication.',
backToTop: 'Back to top',
whatsapp: 'Talk on WhatsApp',
ariaProjects: 'Project list',
message: (focus) => `Hi, Gui! I’d like to talk about ${focus || 'a new project'}.`
},
es: {
navigation: [
['inicio', 'Inicio'],
['sobre', 'Estudio'],
['servicos', 'Servicios'],
['contato', 'Contacto']
],
menu: 'Abrir menú',
closeMenu: 'Cerrar menú',
themeToLight: 'Usar tema claro',
themeToDark: 'Usar tema oscuro',
language: 'Idioma',
hero: {
overline: 'Gui Ortiz · Diseñador gráfico',
titleStart: 'Diseño que hace que',
titleAccent: 'las marcas cobren',
titleEnd: 'vida propia.',
text: 'Identidades, experiencias digitales y sistemas visuales para negocios que quieren ocupar un lugar en la memoria de las personas.',
primary: 'Conocer servicios',
secondary: 'Iniciar conversación',
detail: 'Dirección de arte · Branding · Digital',
scroll: 'Desplázate para explorar'
},
metrics: [
['10+', 'años de experiencia'],
['03', 'servicios principales'],
['01', 'alianza a la vez']
],
about: {
label: 'El estudio',
title: 'Más claridad para la marca. Más ganas de elegirte.',
text: 'Soy Guilherme Ortiz, diseñador gráfico y profesor de Diseño. Desde hace más de una década, transformo contextos complejos en marcas con personalidad, consistencia e intención.',
textSecond: 'El trabajo nace de la escucha, gana dirección y termina listo para vivir en cada punto de contacto.',
link: 'Conocer el proceso',
cardLabel: 'Principio de trabajo',
cardTitle: 'La estrategia no necesita parecer seria para ser tomada en serio.',
cardText: 'Cada decisión visual necesita un porqué y una energía imposible de ignorar.'
},
/* Portfolio content removed from the public presentation.
portfolio: {
label: 'Proyectos seleccionados',
title: 'Un portafolio para explorar, no solo para mirar.',
text: 'Elige una disciplina, abre un proyecto y descubre dónde se encuentran idea, estética y propósito.',
filters: { all: 'Todo', branding: 'Identidad', digital: 'Digital', social: 'Social' },
results: 'proyectos',
open: 'Abrir proyecto',
empty: 'Aún no hay proyectos en esta selección.'
}, */
services: {
label: 'Cómo puedo ayudar',
title: 'Del primer boceto a una presencia que perdura.',
text: 'Elige un territorio para ver lo que puede desbloquear para tu marca.',
items: [
{ id: 'branding', number: '01', title: 'Identidad visual', short: 'Una marca reconocible antes de tener que explicarse.', detail: 'Posicionamiento, identidad, dirección de arte y aplicaciones para que la marca nazca con sistema y personalidad.', deliverables: ['Diagnóstico', 'Sistema visual', 'Guía de uso'] },
{ id: 'digital', number: '02', title: 'Experiencias digitales', short: 'Interfaces que guían, informan y convencen.', detail: 'Estrategia de contenido, UX/UI y diseño responsivo para convertir una visita en una relación con la marca.', deliverables: ['Estructura', 'UX/UI', 'Prototipo'] },
{ id: 'social', number: '03', title: 'Contenido y editorial', short: 'Consistencia para que la marca siga siendo interesante cada día.', detail: 'Campañas, sistemas de social media y piezas editoriales que organizan el mensaje sin quitarle fuerza.', deliverables: ['Campaña', 'Plantillas', 'Dirección creativa'] }
]
},
process: {
label: 'Un proceso con ritmo',
title: 'Crear juntos, con espacio para pensar.',
steps: [
['01', 'Escuchar', 'Entender dónde está la marca, qué quiere mover y con quién necesita hablar.'],
['02', 'Dar dirección', 'Transformar hallazgos en un territorio visual que tenga sentido e invite a avanzar.'],
['03', 'Construir', 'Refinar cada detalle hasta que el sistema funcione con consistencia en la vida real.'],
['04', 'Llevar al mundo', 'Entregar materiales organizados y una marca lista para seguir creciendo.']
]
},
contact: {
label: 'Vamos a crear algo bueno',
title: 'El próximo capítulo de tu marca puede empezar aquí.',
text: 'Cuéntame por dónde quieres comenzar. Yo preparo la conversación; tú llegas con la idea.',
question: '¿Cuál es el foco de tu proyecto?',
options: [['branding', 'Identidad visual'], ['digital', 'Sitio o producto digital'], ['social', 'Contenido y social media'], ['other', 'Aún lo estoy descubriendo']],
selected: 'Seleccionado:',
cta: 'Llevar esta idea a WhatsApp',
hint: 'Sin formularios perdidos. La conversación sigue directo en WhatsApp.'
},
modal: { close: 'Cerrar detalles', label: 'Proyecto seleccionado', scope: 'Alcance', talk: 'Quiero algo en esta dirección', next: 'Siguiente proyecto' },
footer: 'Dirección de arte, identidades visuales y comunicación digital.',
backToTop: 'Volver arriba',
whatsapp: 'Hablar por WhatsApp',
ariaProjects: 'Lista de proyectos',
message: (focus) => `Hola, Gui. Me gustaría conversar sobre ${focus || 'un nuevo proyecto'}.`
}
};
function Arrow({ direction = 'right' }) {
return ;
}
function useStoredState(key, defaultValue) {
const [value, setValue] = useState(() => {
try {
return window.localStorage.getItem(key) || defaultValue;
} catch {
return defaultValue;
}
});
useEffect(() => {
try {
window.localStorage.setItem(key, value);
} catch {
// Persisting the preference is optional when storage is unavailable.
}
}, [key, value]);
return [value, setValue];
}
function useScrollSpy(sectionIds) {
const [active, setActive] = useState(sectionIds[0]);
useEffect(() => {
const observed = sectionIds
.map((id) => document.getElementById(id))
.filter(Boolean);
const observer = new IntersectionObserver(
(entries) => {
const visible = entries
.filter((entry) => entry.isIntersecting)
.sort((a, b) => b.intersectionRatio - a.intersectionRatio);
if (visible[0]) setActive(visible[0].target.id);
},
{ rootMargin: '-28% 0px -58% 0px', threshold: [0.01, 0.25, 0.6] }
);
observed.forEach((section) => observer.observe(section));
return () => observer.disconnect();
}, [sectionIds]);
return active;
}
function Reveal({ as: Element = 'section', className = '', children, ...props }) {
const ref = useRef(null);
const [visible, setVisible] = useState(false);
useEffect(() => {
const node = ref.current;
if (!node) return undefined;
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setVisible(true);
observer.disconnect();
}
},
{ threshold: 0.12 }
);
observer.observe(node);
return () => observer.disconnect();
}, []);
return {t.hero.overline} {t.hero.text} {t.about.label} Gui Ortiz {t.portfolio.label} {t.portfolio.text} {t.portfolio.empty} {t.services.label} {t.services.text} {activeService.detail} {t.process.label} {text} {t.contact.label} {t.contact.text} {t.contact.question} {t.contact.selected} {selected[1]}
{t.hero.titleStart}
{t.hero.titleAccent}
{t.hero.titleEnd}
{t.about.title}
Designer independente{t.portfolio.title}
{t.services.title}
{activeService.short}
{activeService.deliverables.map((item) =>
{t.process.title}
{t.process.steps.map(([number, title, text]) => (
{title}
{t.contact.title}
{t.modal.label}
{project.type[t.__language]}{project.summary[t.__language]}