& {
+ color?: string;
hideLabel?: boolean;
hideIndicator?: boolean;
indicator?: "line" | "dot" | "dashed";
@@ -201,7 +203,7 @@ const ChartTooltipContent = React.forwardRef<
return (
svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",
indicator === "dot" && "items-center",
@@ -293,7 +295,8 @@ const ChartLegend = RechartsPrimitive.Legend;
const ChartLegendContent = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> &
- Pick & {
+ Pick & {
+ payload?: readonly RechartsPrimitive.LegendPayload[];
hideIcon?: boolean;
nameKey?: string;
}
diff --git a/webapp/src/pages/MembersPage.tsx b/webapp/src/pages/MembersPage.tsx
index 7dfb87a9a..f742f3f52 100644
--- a/webapp/src/pages/MembersPage.tsx
+++ b/webapp/src/pages/MembersPage.tsx
@@ -110,7 +110,7 @@ export default function MembersPage() {
const parsed = emailSchema.safeParse(email.trim());
if (!parsed.success) {
- setError(parsed.error.errors[0].message);
+ setError(parsed.error.issues[0].message);
return;
}
setError(null);
diff --git a/webapp/tests/components/experiment-bar-chart.test.tsx b/webapp/tests/components/experiment-bar-chart.test.tsx
index 18a903f53..a95da0bec 100644
--- a/webapp/tests/components/experiment-bar-chart.test.tsx
+++ b/webapp/tests/components/experiment-bar-chart.test.tsx
@@ -1,15 +1,18 @@
-import { describe, it, expect, vi } from "vitest";
+import { describe, it, expect, vi, beforeAll, afterAll } from "vitest";
import { render, screen } from "@testing-library/react";
import ExperimentsBarChart from "@/components/experiment-bar-chart";
-// Recharts uses ResizeObserver / canvas — silence them in jsdom.
-class NoopResizeObserver {
- observe() {}
- unobserve() {}
- disconnect() {}
-}
-// @ts-expect-error -- jsdom doesn't have it
-globalThis.ResizeObserver = NoopResizeObserver;
+// Recharts 3 renders nothing inside a zero-sized ResponsiveContainer, and
+// jsdom measures every element as 0x0 — give the container a size.
+beforeAll(() => {
+ vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockReturnValue({
+ width: 800,
+ height: 450,
+ } as DOMRect);
+});
+afterAll(() => {
+ vi.restoreAllMocks();
+});
describe("ExperimentsBarChart", () => {
it("renders 'No data available' when given an empty report list", () => {
diff --git a/webapp/tests/components/runs-scatter-chart.test.tsx b/webapp/tests/components/runs-scatter-chart.test.tsx
index c027b1507..44fca2e3a 100644
--- a/webapp/tests/components/runs-scatter-chart.test.tsx
+++ b/webapp/tests/components/runs-scatter-chart.test.tsx
@@ -1,13 +1,25 @@
-import { describe, it, expect, vi, beforeEach } from "vitest";
+import {
+ describe,
+ it,
+ expect,
+ vi,
+ beforeEach,
+ beforeAll,
+ afterAll,
+} from "vitest";
import { render, screen } from "@testing-library/react";
-class NoopResizeObserver {
- observe() {}
- unobserve() {}
- disconnect() {}
-}
-// @ts-expect-error -- jsdom doesn't have it
-globalThis.ResizeObserver = NoopResizeObserver;
+// Recharts 3 renders nothing inside a zero-sized ResponsiveContainer, and
+// jsdom measures every element as 0x0 — give the container a size.
+beforeAll(() => {
+ vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockReturnValue({
+ width: 800,
+ height: 450,
+ } as DOMRect);
+});
+afterAll(() => {
+ vi.restoreAllMocks();
+});
const getRunEmissionsByExperimentMock = vi.hoisted(() => vi.fn());
vi.mock("@/api/runs", () => ({