Skip to content

Commit 07fef3c

Browse files
DylanMerigaudclaude
andcommitted
Make the invoice queue's scrollability discoverable on macOS
macOS hides overlay scrollbars by default, so the 11-row queue looked complete when ~2 rows (including the quantity-mismatch edge case) were below the fold and undiscoverable. Add two cues: a bottom fade-out gradient ("more below", purely visual / pointer-events-none so it never blocks row clicks) and an always-visible slim scrollbar (scrollbar-width + ::-webkit-scrollbar). Verified by screenshot at top and scrolled positions; e2e 3/3 and all gates green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 63d502e commit 07fef3c

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

app/globals.css

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,29 @@ body {
2626
.ring-line {
2727
box-shadow: inset 0 0 0 1px theme("colors.line");
2828
}
29+
30+
/* Always-visible slim scrollbar. macOS hides overlay scrollbars by default,
31+
so a long list looks deceptively complete — this keeps a discreet track
32+
visible (paired with a bottom fade) so it's obvious the list scrolls. */
33+
.scrollbar-slim {
34+
scrollbar-width: thin; /* Firefox */
35+
scrollbar-color: #d1d5db transparent;
36+
}
37+
.scrollbar-slim::-webkit-scrollbar {
38+
width: 8px;
39+
}
40+
.scrollbar-slim::-webkit-scrollbar-thumb {
41+
background-color: #d1d5db;
42+
border-radius: 9999px;
43+
border: 2px solid transparent;
44+
background-clip: content-box;
45+
}
46+
.scrollbar-slim::-webkit-scrollbar-thumb:hover {
47+
background-color: #9ca3af;
48+
}
49+
.scrollbar-slim::-webkit-scrollbar-track {
50+
background: transparent;
51+
}
2952
}
3053

3154
/* The trace timeline streams in step-by-step; fade each new step in so the

components/dashboard.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ export function Dashboard({ queue }: { queue: QueueItem[] }) {
4242
<CardTitle>Invoice queue</CardTitle>
4343
<span className="text-[11px] text-muted tnum">{queue.length} invoices</span>
4444
</CardHeader>
45-
<ul className="min-h-0 flex-1 divide-y divide-line overflow-y-auto">
45+
{/* relative wrapper so the bottom fade can overlay the scroll area —
46+
on macOS the overlay scrollbar is hidden, so the fade is the cue that
47+
the list continues below. */}
48+
<div className="relative min-h-0 flex-1">
49+
<ul className="scrollbar-slim h-full divide-y divide-line overflow-y-auto">
4650
{queue.map((item) => {
4751
const isSelected = item.id === selectedId;
4852
// The pill reflects the live run only for the selected row; others
@@ -93,7 +97,13 @@ export function Dashboard({ queue }: { queue: QueueItem[] }) {
9397
</li>
9498
);
9599
})}
96-
</ul>
100+
</ul>
101+
{/* "more below" fade — purely visual, never blocks row clicks. */}
102+
<div
103+
aria-hidden
104+
className="pointer-events-none absolute inset-x-0 bottom-0 h-8 bg-gradient-to-t from-surface to-transparent"
105+
/>
106+
</div>
97107
</Card>
98108

99109
{/* RIGHT — trace */}

0 commit comments

Comments
 (0)