Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions client/src/pages/UsagePage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ function ProviderQuotaCard({ quota, onRefresh, refreshing, disabled }) {
title={`Refresh ${quota.label} usage`}
aria-label={`Refresh ${quota.label} usage`}
>
<RefreshCw size={14} className={`w-3 h-3 sm:w-3.5 sm:h-3.5 ${refreshing ? 'animate-spin' : ''}`} />
{/* `will-change-transform` — see the section-level Refresh button's
comment on the compositor-layer artifact this avoids. */}
<RefreshCw size={14} className={`w-3 h-3 sm:w-3.5 sm:h-3.5 will-change-transform ${refreshing ? 'animate-spin' : ''}`} />
</button>
</div>
</div>
Expand Down Expand Up @@ -309,7 +311,11 @@ function ProviderQuotaSection() {
className="flex items-center gap-1.5 px-2 sm:px-3 py-1.5 text-xs sm:text-sm text-gray-400 hover:text-white disabled:opacity-50"
title="Refresh every provider's usage"
>
<RefreshCw size={15} className={loading ? 'animate-spin' : ''} /> Refresh all
{/* `will-change-transform` promotes the icon to its own compositor
layer before `animate-spin` starts — without it this button's
continuous rotate restarts each poll and can leave a stale
rasterized frame behind the live one on some GPUs. */}
<RefreshCw size={15} className={`will-change-transform ${loading ? 'animate-spin' : ''}`} /> Refresh all
</button>
</div>

Expand Down