···4848 const hasDetail = score && score.state !== "unknown";
49495050 // Opacity fades covered talks into the background.
5151- // Range: 1.0 at intensity 1 → 0.2 at intensity 0, with a quadratic curve so
5252- // low-glow (heavily covered) talks fall off fast — at glow 0.3 the card is
5353- // already near 0.27 opacity, at glow 0.7 it's at 0.59. Combined with the
5454- // translucent bg below, this lets covered cards visually recede into the
5555- // page background while missed talks stay vivid. The wider range and steeper
5656- // curve are deliberate: the previous linear 0.5–1.0 range left even fully
5757- // covered cards too solid to read as "faded."
5858- const opacity = 0.2 + glow * glow * 0.8;
5151+ // Range: 1.0 at intensity 1 → 0.1 at intensity 0, with a cubic curve so the
5252+ // covered zone (low glow) crashes hard while missed talks stay near full
5353+ // opacity. Sample points: glow 0.3 → 0.12, glow 0.5 → 0.21, glow 0.7 → 0.41,
5454+ // glow 0.9 → 0.76, glow 1.0 → 1.0. The cubic is deliberate — the previous
5555+ // quadratic at floor 0.2 still left mid-coverage cards too readable to feel
5656+ // like they had visually receded.
5757+ const opacity = 0.1 + glow * glow * glow * 0.9;
59586059 return (
6160 <div
···7372 ? "border-primary-fixed-dim/50"
7473 : "border-primary-fixed-dim/20",
7574 "transition-[box-shadow,border-color,opacity] duration-500",
7575+ // Direct hover/focus/active recovery for when LumeCard is used
7676+ // standalone (no wrapping focusable ancestor).
7677 "hover:biolume-glow-strong hover:!opacity-100",
7777- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-fixed",
7878+ // Recover via a `group/card` ancestor — typically the wrapping
7979+ // <Link> in ScoredTalksGrid. Keyboard focus lands on the Link
8080+ // (not on this div), so without the named-group plumbing covered
8181+ // cards at the cubic floor (~0.10 opacity) would be unreadable
8282+ // for keyboard and touch users. group-hover/card duplicates the
8383+ // pointer hover path (since hovering the Link also hovers this
8484+ // div in practice, but explicit is clearer); group-focus-visible
8585+ // /card handles Tab navigation; group-active/card handles touch
8686+ // taps where :hover doesn't apply.
8787+ "group-hover/card:biolume-glow-strong group-hover/card:!opacity-100",
8888+ "group-focus-visible/card:biolume-glow-strong group-focus-visible/card:!opacity-100",
8989+ "group-active/card:!opacity-100",
7890 isUnderstory ? "animate-breathe" : "",
7991 className,
8092 ].join(" ")}
···107119 "px-5 pb-3 pt-0",
108120 // Mobile: always visible (no hover capability)
109121 "max-h-12 opacity-100",
110110- // Desktop (sm+): hidden by default, revealed on hover via group-hover
122122+ // Desktop (sm+): hidden by default, revealed on hover/focus.
123123+ // group-hover targets this LumeCard (the unnamed group);
124124+ // group-hover/card and group-focus-visible/card target the
125125+ // wrapping Link so keyboard tab also reveals the strip.
111126 "sm:max-h-0 sm:overflow-hidden sm:opacity-0",
112127 "sm:transition-all sm:duration-300",
113128 "sm:group-hover:max-h-12 sm:group-hover:opacity-100",
129129+ "sm:group-hover/card:max-h-12 sm:group-hover/card:opacity-100",
130130+ "sm:group-focus-visible/card:max-h-12 sm:group-focus-visible/card:opacity-100",
114131 ].join(" ")}
115132 >
116133 <div className="border-t border-primary-fixed-dim/20 pt-2">