@1doc/1ds-react 2.12.2 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/components/Breadcrumb/Breadcrumb.css +50 -0
  3. package/dist/components/Breadcrumb/Breadcrumb.d.ts +9 -0
  4. package/dist/components/Breadcrumb/Breadcrumb.js +11 -2
  5. package/dist/components/Button/Button.css +6 -1
  6. package/dist/components/Button/Button.d.ts +11 -2
  7. package/dist/components/Button/Button.js +15 -3
  8. package/dist/components/Counter/Counter.css +43 -0
  9. package/dist/components/Counter/Counter.d.ts +57 -0
  10. package/dist/components/Counter/Counter.js +99 -0
  11. package/dist/components/Dropdown/Dropdown.css +2 -0
  12. package/dist/components/Dropdown/Dropdown.d.ts +9 -0
  13. package/dist/components/Dropdown/Dropdown.js +20 -2
  14. package/dist/components/List/List.css +47 -0
  15. package/dist/components/List/ListItem.d.ts +10 -0
  16. package/dist/components/List/ListItem.js +1 -1
  17. package/dist/components/StatCard/StatCard.css +57 -2
  18. package/dist/components/StatCard/StatCard.d.ts +12 -6
  19. package/dist/components/StatCard/StatCard.js +6 -2
  20. package/dist/components/Tooltip/Tooltip.css +3 -0
  21. package/dist/components/Tooltip/Tooltip.js +33 -2
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +1 -0
  24. package/dist/teste/BreadcrumbTruncado.test.d.ts +1 -0
  25. package/dist/teste/BreadcrumbTruncado.test.js +40 -0
  26. package/dist/teste/PedidosMatheus.test.d.ts +1 -0
  27. package/dist/teste/PedidosMatheus.test.js +91 -0
  28. package/dist/teste/StatCardTamanhoSm.test.js +8 -0
  29. package/package.json +2 -2
  30. package/src/index.ts +2 -0
  31. package/src/teste/BreadcrumbTruncado.test.tsx +52 -0
  32. package/src/teste/PedidosMatheus.test.tsx +129 -0
  33. package/src/teste/StatCardTamanhoSm.test.tsx +9 -0
@@ -0,0 +1,129 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { act, fireEvent, render, screen } from "@testing-library/react";
3
+ import Button from "../components/Button/Button";
4
+ import Counter from "../components/Counter/Counter";
5
+ import Dropdown from "../components/Dropdown/Dropdown";
6
+ import ListItem from "../components/List/ListItem";
7
+ import StatCard from "../components/StatCard/StatCard";
8
+
9
+ describe("Counter", () => {
10
+ it("sem animação mostra o valor final formatado em pt-BR", () => {
11
+ const { container } = render(<Counter value={1284} disableAnimation />);
12
+ expect(container.querySelector(".umds-counter__numero")).toHaveTextContent("1.284");
13
+ expect(container.querySelector(".umds-counter__numero")).toHaveAttribute("aria-hidden", "true");
14
+ expect(container.querySelector(".umds-counter__leitura")).toHaveTextContent("1.284");
15
+ });
16
+
17
+ it("casas decimais seguem o value; prefixo e sufixo entram no texto", () => {
18
+ const { container } = render(
19
+ <>
20
+ <Counter value={22.31} suffix="%" disableAnimation />
21
+ <Counter value={15890.5} prefix="R$ " decimals={2} disableAnimation />
22
+ </>,
23
+ );
24
+ const leituras = container.querySelectorAll(".umds-counter__leitura");
25
+ expect(leituras[0]).toHaveTextContent("22,31%");
26
+ expect(leituras[1].textContent).toBe("R$ 15.890,50");
27
+ });
28
+
29
+ it("conta do from até o valor e termina no valor exato", async () => {
30
+ vi.useFakeTimers();
31
+ const { container } = render(<Counter value={500} duration={100} />);
32
+ const numero = () => container.querySelector(".umds-counter__numero")!.textContent;
33
+ expect(numero()).toBe("0");
34
+ await act(async () => {
35
+ vi.advanceTimersByTime(500);
36
+ });
37
+ expect(numero()).toBe("500");
38
+ // A reserva e a leitura já nascem com o valor final.
39
+ expect(container.querySelector(".umds-counter__leitura")).toHaveTextContent("500");
40
+ vi.useRealTimers();
41
+ });
42
+ });
43
+
44
+ describe("ListItem · actions", () => {
45
+ it("as ações ficam no li, fora do elemento clicável", () => {
46
+ const { container } = render(
47
+ <ul>
48
+ <ListItem href="#doc" title="Memorando" actions={<button type="button">Mais</button>} />
49
+ </ul>,
50
+ );
51
+ const acao = screen.getByRole("button", { name: "Mais" });
52
+ expect(acao.closest("a")).toBeNull();
53
+ expect(acao.parentElement).toHaveClass("umds-list-item__actions");
54
+ expect(container.querySelector("li > a")).toHaveAttribute("href", "#doc");
55
+ });
56
+ });
57
+
58
+ describe("Button · href", () => {
59
+ it("com href é um link; desabilitado volta a ser botão", () => {
60
+ render(
61
+ <>
62
+ <Button href="#inbox">Inbox</Button>
63
+ <Button href="#cal" target="_blank">Calendário</Button>
64
+ <Button href="#fila" disabled>Fila</Button>
65
+ </>,
66
+ );
67
+ expect(screen.getByRole("link", { name: "Inbox" })).toHaveAttribute("href", "#inbox");
68
+ expect(screen.getByRole("link", { name: "Calendário" })).toHaveAttribute("rel", "noopener noreferrer");
69
+ expect(screen.getByRole("button", { name: "Fila" })).toBeDisabled();
70
+ });
71
+
72
+ it("loading segura a navegação do link", () => {
73
+ render(<Button href="#inbox" loading loadingPosition="start">Inbox</Button>);
74
+ const link = screen.getByRole("link", { name: "Inbox" });
75
+ const evento = new MouseEvent("click", { bubbles: true, cancelable: true });
76
+ link.dispatchEvent(evento);
77
+ expect(evento.defaultPrevented).toBe(true);
78
+ });
79
+ });
80
+
81
+ describe("Dropdown · href", () => {
82
+ it("item com href vira <a role=menuitem>, e o onSelect continua", async () => {
83
+ const onSelect = vi.fn();
84
+ render(
85
+ <Dropdown
86
+ ariaLabel="Ações"
87
+ onSelect={onSelect}
88
+ items={[
89
+ { key: "assinar", label: "Assinar", href: "#assinar" },
90
+ { key: "arquivar", label: "Arquivar" },
91
+ ]}
92
+ >
93
+ <button type="button">Abrir</button>
94
+ </Dropdown>,
95
+ );
96
+ fireEvent.click(screen.getByRole("button", { name: "Abrir" }));
97
+ const assinar = await screen.findByRole("menuitem", { name: "Assinar" });
98
+ expect(assinar.tagName).toBe("A");
99
+ expect(assinar).toHaveAttribute("href", "#assinar");
100
+ expect(screen.getByRole("menuitem", { name: "Arquivar" }).tagName).toBe("BUTTON");
101
+ fireEvent.click(assinar);
102
+ expect(onSelect).toHaveBeenCalledWith(expect.objectContaining({ key: "assinar" }));
103
+ });
104
+ });
105
+
106
+ describe("StatCard · loading e secondaryTone", () => {
107
+ it("loading troca os números por Skeleton e marca aria-busy", () => {
108
+ const { container } = render(
109
+ <StatCard value="22,31%" label="Qualidade" secondaryValue="14,11%" trendLabel="+2%" trend="up" loading />,
110
+ );
111
+ const cartao = container.querySelector(".umds-stat-card")!;
112
+ expect(cartao).toHaveAttribute("aria-busy", "true");
113
+ expect(cartao.textContent).not.toContain("22,31%");
114
+ expect(cartao.textContent).not.toContain("14,11%");
115
+ expect(cartao.textContent).not.toContain("+2%");
116
+ expect(cartao.textContent).toContain("Qualidade");
117
+ });
118
+
119
+ it("secondaryTone escreve a classe; default não", () => {
120
+ const { container } = render(
121
+ <>
122
+ <StatCard value="1" secondaryValue="2" secondaryTone="positive" />
123
+ <StatCard value="1" secondaryValue="2" secondaryTone="default" />
124
+ </>,
125
+ );
126
+ expect(container.children[0]).toHaveClass("umds-stat-card--secundario-positive");
127
+ expect(container.children[1].className).not.toContain("secundario-");
128
+ });
129
+ });
@@ -33,6 +33,15 @@ describe("StatCard · size", () => {
33
33
  expect(container.firstElementChild).toHaveClass("umds-stat-card--sm", "umds-stat-card--rotulo-topo");
34
34
  });
35
35
 
36
+ it("a segunda medida tem o mesmo tamanho e peso do número, no sm e no rótulo no topo", () => {
37
+ const sm = bloco(".umds-stat-card.umds-stat-card--sm .umds-stat-card__valor-secundario");
38
+ expect(sm).toMatch(/font-size:\s*1\.125rem/);
39
+ expect(sm).toMatch(/font-weight:\s*var\(--umds-primitive-font-weight-extrabold\)/);
40
+ const topo = bloco(".umds-stat-card--rotulo-topo .umds-stat-card__valor-secundario");
41
+ expect(topo).toMatch(/font-size:\s*var\(--umds-primitive-font-size-lg\)/);
42
+ expect(topo).toMatch(/font-weight:\s*var\(--umds-primitive-font-weight-extrabold\)/);
43
+ });
44
+
36
45
  it("o número continua antes do rótulo no HTML", () => {
37
46
  const { container } = render(<StatCard value={44} label="Não lidos" size="sm" />);
38
47
  const valor = container.querySelector(".umds-stat-card__valor") as HTMLElement;