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
@@ -12,10 +12,11 @@ import { ServiceHero } from "./ServiceHero";
|
||||
import type { ServiceHeroData } from "./service-page";
|
||||
|
||||
/**
|
||||
* Testes de caminhos-base de ServiceHero (CC 6, contado à mão: as cinco escolhas do JSX):
|
||||
* hasHeroSide (classe do topo: compacto ou não), hasHeroSide (grade de duas colunas), hasCaseCards (botão "Ver projetos
|
||||
* parecidos"), diagram (esquema ou capa) e heroCase (a frase da capa).
|
||||
* Os dois filhos que desenham a coluna ao lado (esquema e capa) são trocados por dublês que mostram o que receberam.
|
||||
* Testes de caminhos-base de ServiceHero (CC 7, contado à mão: as seis escolhas do JSX):
|
||||
* hasHeroSide (classe do topo: compacto ou não), hasHeroSide ou heroLoop (grade de duas colunas), hasCaseCards (botão
|
||||
* "Ver projetos parecidos"), diagram (esquema ou o resto), heroLoop sem coluna ao lado (peça em loop ou capa) e
|
||||
* heroCase (a frase da capa).
|
||||
* Os filhos que desenham a coluna ao lado (esquema, peça e capa) são trocados por dublês que mostram o que receberam.
|
||||
*/
|
||||
|
||||
jest.mock("./ServiceDiagram", () => ({
|
||||
@@ -23,6 +24,11 @@ jest.mock("./ServiceDiagram", () => ({
|
||||
<div data-testid="diagram">{kind}</div>
|
||||
),
|
||||
}));
|
||||
jest.mock("@/app/components/PagePiece", () => ({
|
||||
PagePiece: ({ loop }: { loop: string }) => (
|
||||
<div data-testid="piece">{loop}</div>
|
||||
),
|
||||
}));
|
||||
jest.mock("./ServiceHeroCover", () => ({
|
||||
ServiceHeroCover: (props: {
|
||||
caseStudy?: { id: string };
|
||||
@@ -123,6 +129,36 @@ describe("ServiceHero", () => {
|
||||
expect(screen.queryByTestId("cover")).toBeNull();
|
||||
});
|
||||
|
||||
it("path: a loop and no side column -> the low strip stays, the grid comes in and the loop piece takes the side column", () => {
|
||||
const { container } = render(
|
||||
<ServiceHero
|
||||
service={service("atendimento-whatsapp-ia")}
|
||||
hero={noSide}
|
||||
/>,
|
||||
);
|
||||
|
||||
for (const token of compactHero.split(/\s+/).filter(Boolean))
|
||||
expect(section(container)).toHaveClass(token);
|
||||
for (const token of heroWithMediaGrid.split(/\s+/).filter(Boolean))
|
||||
expect(shell(container)).toHaveClass(token);
|
||||
expect(screen.getByTestId("piece")).toHaveTextContent("whatsapp");
|
||||
expect(screen.queryByTestId("cover")).toBeNull();
|
||||
// sem rótulo sobre o título: a trilha já diz o nome do serviço
|
||||
expect(section(container).querySelector(".ds-eyebrow")).toBeNull();
|
||||
});
|
||||
|
||||
it("path: a loop and a side column -> the side column wins and the loop is not mounted", () => {
|
||||
render(
|
||||
<ServiceHero
|
||||
service={service("nota-fiscal-reforma-tributaria")}
|
||||
hero={{ ...noSide, diagram: "desktop", hasHeroSide: true }}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.getByTestId("diagram")).toBeInTheDocument();
|
||||
expect(screen.queryByTestId("piece")).toBeNull();
|
||||
});
|
||||
|
||||
it("path: a cover case -> the cover gets the case, the device and the service's sentence about that case", () => {
|
||||
const lavacao = service();
|
||||
render(
|
||||
@@ -174,7 +210,7 @@ describe("ServiceHero", () => {
|
||||
render(<ServiceHero service={sistemas} hero={noSide} />);
|
||||
|
||||
const button = screen.getByRole("link", {
|
||||
name: /falar sobre meu projeto/i,
|
||||
name: /chamar no whatsapp/i,
|
||||
});
|
||||
const message = new URL(button.getAttribute("href") ?? "").searchParams.get(
|
||||
"text",
|
||||
|
||||
Reference in new issue
Block a user