feat(site): blocos 3D da marca, novas ofertas e hero mais abrangente
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:
1 parent
4671837c44
commit
c7d09d63d4
165 files changed
+7940
-3790
No files matched your search
+199
-6
@@ -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.",
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
Reference in new issue
Block a user