Second step of the visual-redesign (tokens -> primitives -> surfaces): a small set of shared, token-driven primitives in @trails-cool/ui so both apps compose from one styled vocabulary instead of hand-rolling bg-white/text-gray-* per screen. - @trails-cool/ui now ships React components (Button variants+sizes, Badge tones, Card raised/subtle, Input) plus a tiny cn() helper. React is a peer dep; package builds with no bundling step. - Co-located jsdom unit tests (@testing-library/react) assert roles, token classes, variant switching, and behavior — run in the existing Unit Tests gate, cross-platform, no snapshot baseline needed. - Tailwind @source directive in both apps' styles.css so the package's token utility classes get generated. - Dev-only /dev/ui gallery route in the planner renders every primitive in all states — a zero-dependency stand-in for Storybook. Excluded from production builds (NODE_ENV guard in routes.ts). No app surfaces are refactored yet; adopting the primitives in the topbar/sidebar/etc. is the surface task groups. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 lines
744 B
TypeScript
22 lines
744 B
TypeScript
// @vitest-environment jsdom
|
|
import { describe, it, expect, afterEach } from "vitest";
|
|
import { render, screen, cleanup } from "@testing-library/react";
|
|
import { Badge } from "./Badge.tsx";
|
|
|
|
afterEach(cleanup);
|
|
|
|
describe("Badge", () => {
|
|
it("renders neutral tone by default", () => {
|
|
render(<Badge>New</Badge>);
|
|
const badge = screen.getByText("New");
|
|
expect(badge.className).toContain("bg-bg-subtle");
|
|
expect(badge.className).toContain("text-text-md");
|
|
});
|
|
|
|
it("applies the stop tone for overnight markers", () => {
|
|
render(<Badge tone="stop">NIGHT</Badge>);
|
|
const badge = screen.getByText("NIGHT");
|
|
expect(badge.className).toContain("bg-stop-bg");
|
|
expect(badge.className).toContain("text-stop");
|
|
});
|
|
});
|