diff --git a/src/components/provider-card.test.tsx b/src/components/provider-card.test.tsx
index ed2f965..8827d89 100644
--- a/src/components/provider-card.test.tsx
+++ b/src/components/provider-card.test.tsx
@@ -5,6 +5,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"
import { openUrl } from "@tauri-apps/plugin-opener"
import { ProviderCard } from "@/components/provider-card"
import { groupLinesByType } from "@/lib/group-lines-by-type"
+import { formatResetTooltipText } from "@/lib/reset-tooltip"
import { REFRESH_COOLDOWN_MS } from "@/lib/settings"
import { formatFixedPrecisionNumber } from "@/lib/utils"
@@ -260,9 +261,32 @@ describe("ProviderCard", () => {
/>
)
expect(screen.getByText("Resets in 1h 5m")).toBeInTheDocument()
+ expect(screen.getByText(formatResetTooltipText("2026-02-02T01:05:00.000Z")!)).toBeInTheDocument()
vi.useRealTimers()
})
+ it("does not render reset tooltip for invalid reset timestamps", () => {
+ render(
+
+ )
+
+ expect(screen.getByText("100% cap")).toBeInTheDocument()
+ expect(screen.queryByText(/^Next reset:/)).not.toBeInTheDocument()
+ })
+
it("shows 'Resets soon' when reset is under 5 minutes away", () => {
vi.useFakeTimers()
const now = new Date("2026-02-02T00:00:00.000Z")
@@ -386,6 +410,7 @@ describe("ProviderCard", () => {
)
const resetButton = screen.getByRole("button", { name: /^Resets today at / })
expect(resetButton).toBeInTheDocument()
+ expect(screen.getByText(formatResetTooltipText(resetsAt)!)).toBeInTheDocument()
fireEvent.click(resetButton)
expect(onToggle).toHaveBeenCalledTimes(1)
vi.useRealTimers()
diff --git a/src/components/provider-card.tsx b/src/components/provider-card.tsx
index b26e8f5..b555086 100644
--- a/src/components/provider-card.tsx
+++ b/src/components/provider-card.tsx
@@ -15,6 +15,7 @@ import { groupLinesByType } from "@/lib/group-lines-by-type"
import { clamp01, formatCountNumber, formatFixedPrecisionNumber } from "@/lib/utils"
import { calculateDeficit, calculatePaceStatus, type PaceStatus } from "@/lib/pace-status"
import { buildPaceDetailText, formatCompactDuration, formatDeficitText, formatRunsOutText, getPaceStatusText } from "@/lib/pace-tooltip"
+import { formatResetTooltipText } from "@/lib/reset-tooltip"
interface ProviderCardProps {
name: string
@@ -423,6 +424,7 @@ function MetricLineRenderer({
? formatResetAt(now, line.resetsAt)
: formatResetIn(now, line.resetsAt)
: null
+ const resetTooltipText = line.resetsAt ? formatResetTooltipText(line.resetsAt) : null
const secondaryText =
resetLabel ??
@@ -494,7 +496,29 @@ function MetricLineRenderer({
{primaryText}
{secondaryText && (
- resetLabel && onResetTimerDisplayModeToggle ? (
+ resetTooltipText ? (
+
+
+ resetLabel && onResetTimerDisplayModeToggle ? (
+
+ ) : (
+
+ {secondaryText}
+
+ )
+ }
+ />
+ {resetTooltipText}
+
+ ) : resetLabel && onResetTimerDisplayModeToggle ? (