133feff75d
6 chantiers v1 sur 7 livrés (DataTable refonte reportée car nécessite 2-3j en propre — TanStack Table + virtualisation + filter builder). v1-A — Tests (4 → 22 fichiers) : - Avatar, AvatarGroup, UserCard, MetricCard, ProfileHeader, Tooltip, Sheet, Drawer, Slider, ToggleGroup, Tabs, Pagination, Accordion, Switch, Badge, ConfirmDialog, Popover, Menu, Text, PricingCard, FeatureCard, Toast — chacun avec render + clavier + axe-core. v1-B — Storybook (7 → 23 fichiers) : - Avatar, UserCard, ProfileHeader, MetricCard, PricingCard, FeatureCard, Sheet (4 sides), HoverCard, Slider, ToggleGroup, Menu+ContextMenu, Toast (avec démo "Empiler 5"), Tabs, Pagination, Accordion, Badge. v1-D — Visual regression Playwright : - playwright.config.ts (light + dark, threshold strict 0.2) - e2e/visual.spec.ts (20 stories critiques) - Step CI + upload report en cas de fail v1-E — Site doc Starlight rempli : - 11 pages composants détaillées (Button, Input, Tooltip, Dialog, Toast, Avatar, ThemePicker, MetricCard, PricingCard, ToggleGroup, Slider) avec API, anatomie, do/don't, A11y. v1-F — Publishing Verdaccio : - verdaccio/config.yaml, docker-compose.verdaccio.yml, .npmrc - README setup local + déploiement prod + backups + sécurité v1-G — Gouvernance : - LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md - CODEOWNERS, PR template, 3 issue templates (bug/feature/rfc) Bug fix bonus : tooltip dark mode (text-primary comme bg + text-inverse comme texte → blanc-sur-blanc invisible). Remplacé par neutral-900/0 en light + bg-raised/text-primary en dark. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { render, screen } from "@testing-library/react";
|
|
import userEvent from "@testing-library/user-event";
|
|
import { axe } from "vitest-axe";
|
|
import { useState } from "react";
|
|
import { ToggleGroup } from "./ToggleGroup";
|
|
|
|
const ITEMS = [
|
|
{ value: "list", label: "Liste" },
|
|
{ value: "grid", label: "Grille" },
|
|
{ value: "kanban", label: "Kanban" },
|
|
];
|
|
|
|
function Single() {
|
|
const [v, setV] = useState<string | undefined>("list");
|
|
return (
|
|
<ToggleGroup type="single" value={v} onValueChange={setV} ariaLabel="Vue" items={ITEMS} />
|
|
);
|
|
}
|
|
function Multiple() {
|
|
const [v, setV] = useState<string[]>(["list", "grid"]);
|
|
return (
|
|
<ToggleGroup type="multiple" value={v} onValueChange={setV} ariaLabel="Filtres" items={ITEMS} />
|
|
);
|
|
}
|
|
|
|
describe("ToggleGroup", () => {
|
|
it("rend tous les items en single", () => {
|
|
render(<Single />);
|
|
expect(screen.getAllByRole("radio")).toHaveLength(3);
|
|
});
|
|
|
|
it("clic toggle l'item en single", async () => {
|
|
const user = userEvent.setup();
|
|
render(<Single />);
|
|
await user.click(screen.getByRole("radio", { name: "Grille" }));
|
|
expect(screen.getByRole("radio", { name: "Grille" })).toHaveAttribute("data-state", "on");
|
|
});
|
|
|
|
it("rend en mode multiple plusieurs actifs", () => {
|
|
render(<Multiple />);
|
|
const buttons = screen.getAllByRole("button");
|
|
expect(buttons.filter((b) => b.getAttribute("data-state") === "on")).toHaveLength(2);
|
|
});
|
|
|
|
it("a11y axe-core", async () => {
|
|
const { container } = render(<Single />);
|
|
expect(await axe(container)).toHaveNoViolations();
|
|
});
|
|
});
|