commit 1d684d1b1216cbbc566e7ba68bd22587702a14f1
parent 2aa903a3c6a19c9247be9fa6338dbeb2bb3cd887
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 24 Sep 2026 19:21:36 -0400
channels: the section rule travels with a pinned group header
Audit finding (desktop grouped-scrolled): the group header row drew its
2px top rule as the <tr>'s border-t-2. Tailwind's preflight collapses
table borders, and a collapsed border belongs to the table grid, not to
the sticky cell — so pinned under the thead, the th moved and the rule
stayed behind as a gap the rows scrolling under showed through.
The rule is now the th's own inset shadow, painted by the cell and
carried with it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/editor/app/channels/components/ChannelGroupHeaderRow.tsx b/editor/app/channels/components/ChannelGroupHeaderRow.tsx
@@ -29,7 +29,12 @@ export function ChannelGroupHeaderRow({
const { group, channels } = section;
const name = group.name || group.id;
return (
- <tr className="border-t-2 border-border">
+ // THE SECTION RULE IS THE CELL'S SHADOW, NOT THE ROW'S BORDER. Tailwind's
+ // preflight collapses table borders, and a collapsed border belongs to the
+ // table grid, not to the sticky cell — so pinned under the thead, the th
+ // moved and its 2px top rule stayed behind as a gap the rows showed
+ // through. An inset shadow is painted by the th and travels with it.
+ <tr>
<th
colSpan={colSpan}
scope="rowgroup"
@@ -44,6 +49,7 @@ export function ChannelGroupHeaderRow({
// (RACK_LAYERS — a tie with the identity cells is what let the Slug
// band paint over the station buttons).
"px-2 py-1.5 text-left font-normal align-top bg-muted " +
+ "shadow-[inset_0_2px_0_var(--color-border)] " +
`md:sticky md:top-[var(--thead-h,2.25rem)] ${RACK_LAYERS.groupHeader}`
}
>