feat(site): blocos 3D da marca, novas ofertas e hero mais abrangente
CI / audit (push) Successful in 10m38s
CI / verify (push) Successful in 13m10s
CI / deploy (push) Successful in 1m50s
CI / e2e (push) Successful in 18m48s

Hero e movimento
- cena 3D em tempo real com os blocos da marca (kit feito no Blender, 3d/blocos.py):
  marca, tela, integrações e dados; segue a rolagem, tem vida em repouso, reage ao
  cursor e, parada no topo, passa sozinha pelos estados com legenda
- três níveis de aparelho (full, lite, static); sem WebGL fica o pôster
- título novo: "Sites e sistemas sob medida para o jeito que a sua empresa trabalha."
- faixa de clientes com o ramo, linha do primeiro passo, hero alinhado às seções
- rótulos digitados, entrada dos blocos, cortina de blocos entre páginas e capa
  compartilhada entre a lista de cases e o case

Ofertas
- atendimento no WhatsApp com IA e nota fiscal para a reforma tributária
  (páginas de serviço, cartões da home, formulário e aviso com data de validade)
- página /ia atualizada, com fontes
- peças 3D em loop nos cartões e topos de página (3d/pecas.py)

Design
- hover por papel (bloco nos botões, barra nos links), rótulos sem caixa alta
- um destino por rótulo: "Falar sobre meu projeto" leva ao formulário,
  "Chamar no WhatsApp" abre o WhatsApp
- logo montado em blocos, 404 redesenhado, grades sem célula vazia
- ícones do PWA e manifesto novos

Specs em specs/, contexto de design em DESIGN.md e PRODUCT.md.
This commit is contained in:
evandro committed 2026-11-10 03:48:25 -03:00
1 parent 4671837c44
commit c7d09d63d4
165 files changed
+7940 -3790

No files matched your search

+199 -6
View File
@@ -13,10 +13,12 @@ export type ServiceDiagramKind = "desktop" | "iot" | "arquitetura";
/**
* Rótulos dos botões e links de ação, numa lista só: o contato diz sempre a mesma coisa, e o case também.
* "Falar sobre meu projeto" leva sempre ao formulário; o controle que abre o WhatsApp diz "Chamar no WhatsApp".
* O verde-limão fica só no contato; os demais são contorno ou link de texto.
*/
export const buttonLabels = {
contact: "Falar sobre meu projeto",
whatsapp: "Chamar no WhatsApp",
case: "Ver case",
site: "Abrir o site",
service: "Ver o serviço",
@@ -54,6 +56,8 @@ export interface ServicePageContent {
heroCase?: { id: string; device: HeroDevice };
/** Esquema de fluxo do topo, para o serviço sem case com captura: nunca leva dado real nem logo de cliente. */
diagram?: ServiceDiagramKind;
/** Peça de blocos em loop (`public/3d/peca-<nome>`) ao lado do título, de 1024 px em diante, quando não há capa nem esquema. */
heroLoop?: string;
/** Data (AAAA-MM-DD) da última mudança no conteúdo da página: vira o `lastmod` do mapa do site. Atualize ao mudar o texto. */
updatedAt: string;
/** Por que cada case relacionado interessa a este serviço, em uma frase (chave: id do case). */
@@ -65,6 +69,12 @@ export interface ServicePageContent {
typicalTimeline?: string;
guarantee?: string;
faq?: { question: string; answer: string }[];
/** Regras ou datas tiradas de fonte oficial, cada uma conferível pelos links: o bloco só aparece quando existe. */
official?: {
title: string;
items: string[];
links: { label: string; href: string }[];
};
}
export interface CaseStudyContent {
@@ -251,6 +261,150 @@ export const servicePages: ServicePageContent[] = [
},
],
},
{
slug: "atendimento-whatsapp-ia",
navLabel: offerLabels.whatsapp.name,
whatsappSubject: offerLabels.whatsapp.whatsappSubject,
heroLoop: "whatsapp",
eyebrow: "Atendimento com IA",
metaTitle: "Atendimento no WhatsApp com IA em Joinville",
metaDescription:
"Atendente automático no WhatsApp que responde só com o seu catálogo e chama uma pessoa quando não sabe. Garuva e Joinville (SC), remoto em todo o Brasil.",
headline: offerLabels.whatsapp.name,
answer:
"Monto um atendente automático para o WhatsApp da sua empresa. Ele responde a partir do catálogo, dos preços e dos horários que você fornece. O que não está lá ele não responde: passa a conversa para uma pessoa da sua equipe.",
intro:
"Responda o cliente no WhatsApp na hora, com o que a sua empresa já informa, e chame uma pessoa quando a pergunta sair do catálogo.",
audience: [
"Empresas que atendem e vendem pelo WhatsApp e respondem muitas vezes as mesmas perguntas sobre produtos, preços e horários.",
"Equipes que querem responder na hora sem deixar a IA inventar preço ou prazo.",
],
outcomes: [
"Um atendente que responde só com o catálogo, os preços e os horários da empresa.",
"Passagem para uma pessoa da equipe quando a pergunta sai do que foi fornecido.",
],
process: [
"Entendemos o atendimento de hoje: quem responde, o que o cliente pergunta e onde estão o catálogo, os preços e os horários.",
"Definimos o que o atendente pode responder e em que momento ele passa a conversa para uma pessoa.",
"Ligamos o atendente pela API oficial do WhatsApp para empresas e testamos as conversas antes de abrir para os clientes.",
"Você acompanha o registro das conversas e atualiza o catálogo quando algo muda.",
],
examples: [
"O cliente pergunta o preço de um item da tabela: o atendente responde com o valor que está na tabela.",
"O cliente pergunta o horário de sábado: o atendente responde com o horário que você informou.",
"O cliente pede um desconto ou pergunta algo que não está no catálogo: o atendente não responde por conta própria e chama uma pessoa da equipe na mesma conversa.",
],
technicalDetails: [
"A ligação é feita pela API oficial do WhatsApp para empresas.",
"As respostas saem só do catálogo, dos preços e dos horários fornecidos pela empresa. Pergunta sem resposta nessas fontes vai para uma pessoa.",
"Cada conversa fica registrada, com o que foi informado ao cliente.",
],
stack: ["API oficial do WhatsApp", "IA", "Banco de dados"],
relatedCaseIds: [],
updatedAt: "2026-11-09",
caseRelevance: {},
official: {
title: "Regras do WhatsApp para empresas",
items: [
"A política do WhatsApp para empresas permite responder com automação, desde que o cliente tenha um caminho para falar com uma pessoa.",
"A janela de 24 horas abre e recomeça a cada mensagem do cliente. Fora dela, a empresa só pode enviar mensagem de modelo aprovado.",
"O que o atendente informa ao cliente é informado em nome da empresa.",
],
links: [
{
label: "Política do WhatsApp para empresas (em inglês)",
href: "https://whatsappbusiness.com/policy/",
},
],
},
faq: [
{
question: "A IA responde sobre qualquer assunto?",
answer:
"Não. Ela responde só com o que está no catálogo, nos preços e nos horários que você fornece. O resto vai para uma pessoa da sua equipe.",
},
{
question: "Quem responde pelo que o atendente diz?",
answer:
"A empresa. O que o atendente informa ao cliente é informado em nome dela. Por isso ele fica limitado ao que você fornece e cada conversa fica registrada.",
},
],
},
{
slug: "nota-fiscal-reforma-tributaria",
navLabel: offerLabels.fiscal.name,
whatsappSubject: offerLabels.fiscal.whatsappSubject,
heroLoop: "fiscal",
eyebrow: "Reforma tributária",
metaTitle: "Nota fiscal com IBS e CBS em Joinville e SC",
metaDescription:
"Ajuste dos campos de IBS e CBS na nota que o seu sistema emite, com teste em homologação. Garuva e Joinville (SC), remoto em todo o Brasil.",
headline: offerLabels.fiscal.name,
answer:
"Se o seu sistema ou a sua integração emite nota fiscal, vejo por onde a nota sai, ajusto os campos de IBS e CBS no leiaute novo e testo a emissão em homologação antes de mudar a produção. Classificação fiscal e alíquotas continuam com o seu contador.",
intro:
"Ajuste os campos de IBS e CBS da nota que o seu sistema emite e teste a emissão antes de o prazo chegar.",
audience: [
"Empresas cujo sistema próprio ou integração emite NF-e, NFC-e ou NFS-e.",
"Optantes do Simples Nacional com sistema que emite nota: a data deles é 1º de janeiro de 2027.",
],
outcomes: [
"Campos de IBS e CBS no leiaute novo da nota.",
"Emissão testada em homologação antes de mudar a produção.",
],
process: [
"Levantamos o que o seu sistema emite hoje e por onde a nota sai.",
"Ajustamos os campos de IBS e CBS no leiaute novo da nota.",
"Testamos a emissão em ambiente de homologação antes de mudar a produção.",
"Entregamos a lista do que depende do seu contador, como classificação fiscal e alíquotas.",
],
examples: [
"Um sistema de vendas que emite NF-e ou NFC-e e precisa dos campos novos.",
"Uma integração que emite NFS-e e precisa seguir o leiaute novo.",
"Uma empresa do Simples Nacional que quer testar a emissão antes de 1º de janeiro de 2027.",
],
technicalDetails: [
"Os campos de IBS e CBS entram no leiaute da NF-e, da NFC-e ou da NFS-e, conforme o documento que o sistema emite.",
"O teste é feito em ambiente de homologação, antes de qualquer mudança na produção.",
"O trabalho é técnico e não substitui o contador: classificação fiscal e alíquotas são definidas por ele.",
],
stack: ["NF-e", "NFC-e", "NFS-e", "Integração de sistemas"],
relatedCaseIds: [],
updatedAt: "2026-11-09",
caseRelevance: {},
official: {
title: "As datas do Ato Conjunto RFB/CGIBS nº 4/2026",
items: [
"NF-e e NFC-e: desde 3 de agosto de 2026.",
"NFS-e da maior parte dos serviços: desde 1º de outubro de 2026.",
"NFS-e de plataformas digitais, de processamento e hospedagem de dados (subitem 1.03), de licenciamento de software (1.05), de conteúdo de áudio e vídeo pela internet (1.09), de locações, de condomínios e dos demais casos listados no ato: a partir de 1º de dezembro de 2026.",
"Optantes do Simples Nacional: a partir de 1º de janeiro de 2027.",
],
links: [
{
label:
"Texto oficial do Ato Conjunto RFB/CGIBS nº 4, de 30 de julho de 2026 (PDF)",
href: "https://www.cgibs.gov.br/upload/arquivos/202607/31091735-20260730-16h30-ato-conjunto-rfb-cgibs-na-c2-ba-4-260731-090909.pdf",
},
{
label: "Nota da Receita Federal sobre o cronograma",
href: "https://www.gov.br/receitafederal/pt-br/assuntos/noticias/2026/julho/receita-federal-e-comite-gestor-do-ibs-publicam-o-cronograma-de-implementacao-dos-documentos-fiscais-eletronicos-da-reforma-tributaria-do-consumo",
},
],
},
faq: [
{
question: "O trabalho substitui o contador?",
answer:
"Não. O trabalho é técnico: ajustar e testar a emissão. Classificação fiscal e alíquotas são do seu contador.",
},
{
question: "Qual é a data do meu caso?",
answer:
"Depende do documento que você emite e do regime da empresa. As datas do Ato Conjunto RFB/CGIBS nº 4/2026 estão nesta página, com o link para o texto oficial.",
},
],
},
{
slug: "consultoria-nextjs",
navLabel: "Consultoria em Next.js",
@@ -909,7 +1063,7 @@ export const pageUpdatedAt = {
} as const;
export interface ServiceOffer {
id: "site" | "sistema" | "revisao";
id: keyof typeof offerLabels;
/** Nome da oferta, o mesmo da home, da página da oferta, dos dados estruturados e do WhatsApp. */
name: string;
/** Assunto da conversa de WhatsApp, em minúsculas e com artigo, para a frase "Quero conversar sobre {assunto}.". */
@@ -920,7 +1074,7 @@ export interface ServiceOffer {
href: string;
/** O que a pessoa recebe, em 3 ou 4 itens, só com o que os cases ou a página da oferta já sustentam. A home e a página da oferta mostram esta lista. */
deliverables: string[];
/** Primeiro passo: uma conversa e, depois dela, o escopo e a proposta por escrito (sem prazo nem preço). A página da oferta mostra esta frase; a home, que serve às três, mostra `generalFirstStep`. */
/** Primeiro passo: uma conversa e, depois dela, o escopo e a proposta por escrito (sem prazo nem preço). A página da oferta mostra esta frase; a home, que serve a todas, mostra `generalFirstStep`. */
firstStep: string;
/** Onde ver a oferta funcionando: o texto que abre a linha, os cases (links) e uma observação opcional. */
proof: { label: string; caseIds: string[]; note?: string };
@@ -929,12 +1083,13 @@ export interface ServiceOffer {
/** O que vem depois da primeira conversa: o mesmo em cada oferta e na frase geral da home. */
const FIRST_STEP_NEXT = "Depois, escopo e proposta por escrito.";
/** O primeiro passo da home, que vale para as três ofertas: igual ao de cada uma, só sem dizer o que se entende na conversa. */
/** O primeiro passo da home, que vale para todas as ofertas: igual ao de cada uma, só sem dizer o que se entende na conversa. */
export const generalFirstStep = `Primeira conversa para entender o seu caso. ${FIRST_STEP_NEXT}`;
/**
* As três ofertas da home, na ordem do H1, com o mesmo nome. Cada texto só diz o que os cases citados, a experiência
* profissional ou a página /ia já sustentam; sem prazo nem preço.
* As cinco ofertas, com o mesmo nome em todo o site; a home mostra as quatro primeiras em cartões e a da nota fiscal numa
* faixa datada. Cada texto só diz o que os cases citados, a experiência profissional, a página /ia ou a página da oferta
* (com as fontes oficiais) já sustentam; sem prazo nem preço.
*/
export const serviceOffers: ServiceOffer[] = [
{
@@ -974,6 +1129,25 @@ export const serviceOffers: ServiceOffer[] = [
note: "Na Apolo Energia, desde 2022, desenvolvo aplicações web e mobile para rotinas internas, APIs e painéis de operação. Por serem sistemas de uso interno, não há link nem detalhes públicos.",
},
},
{
id: "whatsapp",
...offerLabels.whatsapp,
summary:
"Um atendente automático que responde só com o que está no seu catálogo e na sua tabela de preços, chama uma pessoa quando não sabe e guarda o registro de cada conversa.",
href: "/servicos/atendimento-whatsapp-ia",
deliverables: [
"Respostas limitadas ao seu catálogo, aos seus preços e aos seus horários.",
"Passagem para uma pessoa da sua equipe na mesma conversa, quando o atendente não sabe responder.",
"Registro de cada conversa e do que foi informado ao cliente.",
"Ligação pela API oficial do WhatsApp para empresas.",
],
firstStep: `Primeira conversa para entender o atendimento de hoje. ${FIRST_STEP_NEXT}`,
proof: {
label: "Veja como funciona",
caseIds: [],
note: "Ainda não há case público deste serviço. A página do serviço mostra o que o atendente pode e não pode responder e as regras do WhatsApp para empresas.",
},
},
{
id: "revisao",
...offerLabels.revisao,
@@ -990,7 +1164,26 @@ export const serviceOffers: ServiceOffer[] = [
proof: {
label: "Veja como funciona",
caseIds: [],
note: "A página da revisão mostra o que você recebe, três episódios públicos com plataformas de apps feitos com IA e os cuidados com dados pessoais (LGPD).",
note: "A página da revisão mostra o que você recebe, cinco episódios públicos com plataformas de apps feitos com IA e os cuidados com dados pessoais (LGPD).",
},
},
{
id: "fiscal",
...offerLabels.fiscal,
summary:
"Se o seu sistema ou a sua integração emite nota, ajusto os campos de IBS e CBS e testo a emissão antes de o prazo chegar.",
href: "/servicos/nota-fiscal-reforma-tributaria",
deliverables: [
"Levantamento do que o seu sistema emite hoje e por onde a nota sai.",
"Campos de IBS e CBS no leiaute novo da nota.",
"Teste de emissão em ambiente de homologação antes de mudar a produção.",
"Lista do que depende do seu contador, como classificação fiscal e alíquotas.",
],
firstStep: `Primeira conversa para entender como a nota é emitida hoje. ${FIRST_STEP_NEXT}`,
proof: {
label: "Veja as datas",
caseIds: [],
note: "Ainda não há case público deste serviço. A página do serviço traz as datas do Ato Conjunto RFB/CGIBS nº 4/2026, com o link para o texto oficial.",
},
},
];