diff --git a/apps/web/src/components/usage/UsageLimitsPooled.browser.test.tsx b/apps/web/src/components/usage/UsageLimitsPooled.browser.test.tsx index ab114fbbd6f21..1f04f1a218010 100644 --- a/apps/web/src/components/usage/UsageLimitsPooled.browser.test.tsx +++ b/apps/web/src/components/usage/UsageLimitsPooled.browser.test.tsx @@ -6,6 +6,7 @@ import { } from "@t3tools/contracts"; import { CHATGPT_USAGE_URL } from "@t3tools/shared/usageLimits"; import { describe, expect, it } from "vite-plus/test"; +import { page, userEvent } from "vite-plus/test/browser"; import { render } from "../../../test/render"; import { UsageLimitsPooled } from "./UsageLimitsPooled"; @@ -63,3 +64,51 @@ describe("UsageLimitsPooled ChatGPT usage card", () => { .toBeVisible(); }); }); + +describe("UsageLimitsPooled account popover", () => { + it("exposes each detail as its own label and value to screen readers", async () => { + const now = "2026-11-12T14:00:00.000Z"; + const claude: ServerProvider = { + ...managedChatGpt("claude", "Claude"), + driver: ProviderDriverKind.make("claudeAgent"), + auth: { status: "authenticated", label: "Claude Pro Subscription" }, + usageLimits: { + checkedAt: now, + windows: [ + { + id: "weekly", + kind: "weekly", + label: "Weekly", + usedPercent: 0, + resetsAt: "2026-11-18T12:00:00.000Z", + windowDurationMins: 10_080, + }, + ], + }, + }; + const presentations = new Map([ + [ + EnvironmentId.make("desk"), + { entry: { target: { label: "Desk" } }, serverConfig: { providers: [claude] } }, + ], + ]); + await using screen = await render( + , + ); + + await userEvent.click(screen.getByRole("button", { name: /% left/ })); + const popover = page.getByRole("dialog"); + for (const [label, value] of [ + ["Plan", "Claude Pro Subscription"], + ["Signed in", "Desk"], + ["Left", "100%"], + ] as const) { + await expect + .element(popover.getByRole("term").getByText(label, { exact: true })) + .toBeVisible(); + await expect + .element(popover.getByRole("definition").getByText(value, { exact: true })) + .toBeVisible(); + } + }); +}); diff --git a/apps/web/src/components/usage/UsageLimitsPooled.tsx b/apps/web/src/components/usage/UsageLimitsPooled.tsx index d5f46398fa31c..29bd125ff3a0c 100644 --- a/apps/web/src/components/usage/UsageLimitsPooled.tsx +++ b/apps/web/src/components/usage/UsageLimitsPooled.tsx @@ -122,8 +122,8 @@ function AccountName({ function Row({ label, children }: { readonly label: string; readonly children: ReactNode }) { return (
- {label} - {children} +
{label}
+
{children}
); } @@ -174,13 +174,13 @@ function SegmentPopover({ /> ) : null} -
+
{account.plan ? {account.plan} : null} {where ? ( 0 ? "Signed in" : "Via"}>{where} ) : null} -
-
+ +
{remaining}% {window.resetsAt ? ( @@ -192,7 +192,7 @@ function SegmentPopover({ {reset && reset.restoresPercent > 0 ? ( +{reset.restoresPercent}% of pool ) : null} -
+ {choices.length > 0 && redeem ? (
{choices.map((choice) => (