From 5cc03462841663f1cead07d3a0801ea1ddb32795 Mon Sep 17 00:00:00 2001 From: ololadedavidvictor-bit Date: Tue, 28 Jul 2026 17:13:06 +0000 Subject: [PATCH] feat: add LatencyChart page with HelpPopover for P95 metric explanation - Create src/pages/LatencyChart.tsx with responsive bar chart and stat cards - Integrate HelpPopover next to chart title explaining P95 latency for first-time users - Add className prop to HelpPopover for layout alignment flexibility - Include LatencyChart.test.tsx with focused accessibility and rendering tests - Update HelpPopover.test.tsx to cover className forwarding - Add page-specific CSS and focus-visible styles in index.css and focus.css - Register /latency-chart route in main.tsx --- src/components/HelpPopover.test.tsx | 10 ++ src/components/HelpPopover.tsx | 8 +- src/index.css | 141 +++++++++++++++++++++++++ src/main.tsx | 6 ++ src/pages/LatencyChart.test.tsx | 94 +++++++++++++++++ src/pages/LatencyChart.tsx | 158 ++++++++++++++++++++++++++++ src/styles/focus.css | 9 ++ 7 files changed, 425 insertions(+), 1 deletion(-) create mode 100644 src/pages/LatencyChart.test.tsx create mode 100644 src/pages/LatencyChart.tsx diff --git a/src/components/HelpPopover.test.tsx b/src/components/HelpPopover.test.tsx index 5d34028..e08c063 100644 --- a/src/components/HelpPopover.test.tsx +++ b/src/components/HelpPopover.test.tsx @@ -109,4 +109,14 @@ describe("HelpPopover", () => { const btn = screen.getByRole("button", { name: "Help" }); expect(btn.className).toContain("help-popover-trigger"); }); + + it("forwards an additional className to the trigger button", () => { + render( + + ); + + const btn = screen.getByRole("button", { name: "Help" }); + expect(btn.className).toContain("help-popover-trigger"); + expect(btn.className).toContain("custom-class"); + }); }); diff --git a/src/components/HelpPopover.tsx b/src/components/HelpPopover.tsx index 601beed..e4f056e 100644 --- a/src/components/HelpPopover.tsx +++ b/src/components/HelpPopover.tsx @@ -54,12 +54,18 @@ type HelpPopoverProps = { * @default 300 */ hoverDelayMs?: number; + /** + * Additional CSS class forwarded to the trigger button. + * Useful for layout alignment in page headers (e.g. LatencyChart). + */ + className?: string; }; export default function HelpPopover({ content, ariaLabel = "Help", hoverDelayMs = 300, + className, }: HelpPopoverProps): JSX.Element { const labelId = useId(); @@ -67,7 +73,7 @@ export default function HelpPopover({