
WebGL entra como progressive enhancement sem se tornar obrigatório para acessar o conteúdo.
Projeto demonstrativo · Front-end · WebGL · UX
O que este experimento demonstra
Case de front-end que combina SSR, interação WebGL, cardápio orientado por dados e validação de reserva em uma experiência gastronômica demonstrativa.
Experiência digital demonstrativa para restaurante contemporâneo, com prato 3D interativo, cardápio orientado por dados e fluxo de reserva validado localmente.
Superfícies, arquitetura e dados organizados em planos visuais.
Fluxos mostram a sequência entre entrada, decisão, execução e resultado.
Seção ativa, foco e interação reforçam a informação relevante sem mover o layout.
Experimento em ação
A demo mostra a superfície implementada e o case explica as decisões de SSR, WebGL, validação, acessibilidade e performance por trás dela.

WebGL entra como progressive enhancement sem se tornar obrigatório para acessar o conteúdo.
Imagens reais usadas no projeto demonstrativo. A coleção visual sustenta a galeria em profundidade sem representar um restaurante ou cardápio comercial real.
01
02
03
04
05
06
07
08
09
10SSR entrega conteúdo e imagem; Three.js entra apenas no cliente.
Movimento reduzido, pixel ratio limitado e descarte de recursos WebGL.
Zod valida regras localmente sem enviar ou persistir dados pessoais.
Contexto e abordagem
A arquitetura e os fluxos apresentados neste case partem deste contexto e das restrições reais do produto.
Desafio
Adicionar uma camada visual 3D a uma experiência comercial sem comprometer SSR, acessibilidade, movimento reduzido, responsividade ou manutenção. Ao mesmo tempo, o projeto precisava deixar claro que cardápio, restaurante e reserva são demonstrativos e que nenhum dado pessoal é realmente enviado.
Abordagem
A rota mantém conteúdo e navegação disponíveis desde o HTML, enquanto o prato 3D é carregado apenas no cliente com fallback fotográfico. O cardápio foi separado da interface em uma estrutura tipada, e a reserva usa regras puras com Zod para validar nome, data, horário, ocupação e telefone antes de apresentar uma confirmação local.
Responsabilidade
Escopo real de atuação no projeto, separado de funcionalidades ou decisões que pertencem a fornecedores e sistemas externos.
Projetar uma experiência 3D que funcione como progressive enhancement e não como pré-requisito para acessar o conteúdo.
Integrar Three.js ao ciclo de vida React com import dinâmico, resize responsivo e descarte explícito de recursos WebGL.
Separar dados do cardápio da composição visual para reduzir acoplamento e preparar uma futura origem por CMS ou API.
Criar regras de reserva independentes da interface e validar entradas com Zod sem simular persistência ou confirmação real.
Tratar movimento reduzido, navegação responsiva, labels de formulário e fallback visual como parte da implementação.
Documentar arquitetura, decisões e trade-offs para que o projeto possa ser avaliado como case técnico.
Implementação técnica
Tecnologias e estruturas descritas a partir do código, da configuração e da documentação dos projetos — não por barras subjetivas de habilidade.
3D
Cena com câmera, renderer, fotografia 1:1, anéis, partículas e estados conectados a um vetor de profundidade compartilhado entre DOM e WebGL.
Profundidade
Dez camadas CSS independentes, plate transform e atmosfera WebGL respondem em profundidades diferentes ao cursor ou ao movimento do dispositivo.
Performance
Coarse-pointer reduz DPR, partículas e segmentos; IntersectionObserver evita renderização contínua fora do viewport.
SSR
WebGL fica restrito ao navegador e a experiência mantém imagem estática enquanto a camada 3D não está disponível.
Validação
Nome, data, horário, ocupação e telefone são validados fora do JSX antes da confirmação demonstrativa.
Acessibilidade
Movimento reduzido desativa o loop contínuo e formulários/navegação preservam labels e estados acessíveis.
Qualidade
O projeto inclui scripts explícitos para validação estática, testes de regras e build de produção.
Fluxos principais
Cada fluxo é mostrado junto de uma representação visual do produto, para que arquitetura e comportamento sejam compreendidos sem depender apenas de documentação textual.
3D como progressive enhancement
Fluxo 01
SSR → imagem fallback → ClientOnly → Three.js → interação
O conteúdo principal chega sem depender de WebGL. No navegador, o componente carrega Three.js e substitui progressivamente a representação estática por uma superfície interativa.
Cardápio orientado por dados
Fluxo 02
Dados tipados → categoria ativa → composição React → preço formatado
Itens e categorias ficam fora do JSX da rota, permitindo manutenção do conteúdo sem misturar estrutura de interface e dados gastronômicos.
Reserva demonstrativa
Fluxo 03
Formulário → Zod → regras de data/ocupação → confirmação local
A interface valida a intenção de reserva e comunica o resultado sem enviar nome, telefone ou qualquer outro dado para um servidor.
Em vez de uma lista isolada, as decisões estruturais aparecem intercaladas com imagens e representações do sistema.
TanStack Start, React 19 e TypeScript estruturam a aplicação e a rota principal.
Three.js é importado dinamicamente e executado somente no cliente dentro de ClientOnly.
A experiência 3D usa PerspectiveCamera e WebGLRenderer para apresentar a fotografia original integralmente em um plano 1:1, conectada a 10 camadas CSS de profundidade com amplitudes independentes.
src/hooks/use-depth-motion.ts centraliza parallax por ponteiro e Device Orientation, escreve CSS variables diretamente no hero e evita rerender da rota a cada frame.
HeroDepthLayers mantém 10 superfícies compositor-friendly; o prato e a atmosfera Three.js recebem o mesmo vetor por ref.
No mobile, o canvas é passivo para toque, o scroll vertical tem prioridade e a cena reduz DPR, partículas, segmentos geométricos e taxa de renderização.
src/data/menu.ts mantém o cardápio como estrutura tipada independente da interface.
src/lib/reservation.ts concentra regras puras de validação com Zod; ReservationForm traduz o resultado para UX.
Bun executa testes das regras de reserva; typecheck, lint e build completam o fluxo local de qualidade.
Regras que impedem o sistema de depender apenas da interface para manter isolamento, confiabilidade ou publicação correta dos dados.
O formulário é deliberadamente local: nenhum nome, telefone ou pedido de reserva é enviado ou persistido.
Restaurante, cardápio, horários e preços são dados fictícios e estão identificados como demonstração.
O projeto não contém credenciais, endpoint de reservas real ou integração administrativa.
A confirmação da interface representa apenas uma validação local e não uma reserva efetivada.
O que é verificado antes de tratar uma alteração como pronta para integração, publicação ou produção.
TypeScript em modo strict valida contratos e estado da aplicação.
Testes Bun cobrem reserva válida, data passada, horário fora da janela e ocupação inválida.
ESLint e build de produção fazem parte do comando agregado de check.
O componente Three.js limita pixel ratio, reduz custo em coarse-pointer e libera geometria, materiais, textura, renderer e contexto WebGL no unmount.
IntersectionObserver evita renderização contínua quando a cena sai do viewport.
No mobile, canvas e host WebGL permanecem passivos para toque e preservam touch-action: pan-y para não bloquear a rolagem.
prefers-reduced-motion neutraliza parallax, impede sensor e reduz animações para usuários que solicitam menos movimento.
Decisões que mudam comportamento, risco operacional ou capacidade de evolução — e não apenas preferências de estilo de código.
Usar Three.js como camada progressiva em vez de renderizar WebGL como requisito para a página.
Preservar a fotografia original como plano 1:1 em vez de recortá-la dentro de outro prato 3D; profundidade física real exigiria um asset 3D próprio, como GLTF ou fotogrametria.
Separar cardápio em dados tipados para permitir futura troca por CMS/API sem reescrever a composição principal.
Manter a reserva local e explicitamente demonstrativa em vez de criar um backend fictício apenas para aparentar completude.
O benefício de uma decisão técnica sempre vem acompanhado de custo, restrição ou dependência. Estes são os compromissos mais importantes.
A fotografia em plano preserva integralmente o material visual e mantém a interação leve, mas não pretende reproduzir profundidade física como um modelo fotogramétrico.
O import dinâmico diminui o impacto do Three.js no caminho inicial, mas a primeira ativação da experiência 3D depende do carregamento do chunk no cliente.
Não persistir reservas limita a demonstração comercial, porém evita representar um fluxo operacional que o case não implementa.
O projeto prioriza uma única experiência visual forte; uma produção real exigiria otimização específica para catálogo maior de modelos e dispositivos.
Competências demonstradas pelas decisões, implementação e validação apresentadas neste case.
Demonstra integração de WebGL e Three.js dentro de uma aplicação React com SSR sem acoplar a renderização do servidor ao contexto gráfico.
Transforma fallback, movimento reduzido, descarte de recursos e responsividade em decisões explícitas da experiência 3D.
Separa dados, validação e apresentação em módulos avaliáveis individualmente.
Oferece uma demonstração pública navegável sem fingir que existe restaurante, disponibilidade ou backend de reservas reais.
Projeto demonstrativo criado para avaliação técnica. Restaurante, cardápio, horários, preços e reserva são fictícios; nenhum dado do formulário é enviado ou armazenado.