fix(channels): address R13 S3 review findings

- ActionMenu: skip disabled items in roving keyboard nav (plumb
  disabledIndices through the AnchoredPopover platform); a pending
  action no longer strands focus on an unfocusable button.
- ActionMenu + ChannelStatsPopover: add type="button" to the popover
  triggers so they can't submit an enclosing form.
- ChannelStatsPopover: restore the per-stat explanations as a native
  title on each row — the guidance the old inline stats showed is back.
- i18n: drop the now-dead channels.tags.yourTags / .manage keys (en+hu);
  the stats *Hint keys are live again via the restored row titles.
- test: cover ActionMenu (open/select/close/disabled) and
  ChannelStatsPopover (rows, conditional ETA row, per-row hint title).
This commit is contained in:
2026-08-15 04:09:30 +02:00
parent a26d96630d
commit bb2d6999fd
7 changed files with 221 additions and 9 deletions
+10 -1
View File
@@ -31,10 +31,19 @@ export default function ActionMenu({
trigger?: ReactNode;
}) {
const [open, setOpen] = useState(false);
const pop = useAnchoredPopover({ open, onOpenChange: setOpen, placement: "bottom-end" });
// A disabled item (a mutation already in flight) can't take DOM focus, so roving keyboard nav must
// SKIP it — otherwise ArrowUp/Down strands the highlight on an inert button. The platform handles it.
const disabledIndices = items.flatMap((it, i) => (it.disabled ? [i] : []));
const pop = useAnchoredPopover({
open,
onOpenChange: setOpen,
placement: "bottom-end",
disabledIndices,
});
return (
<>
<button
type="button"
ref={pop.refs.setReference}
{...pop.getReferenceProps()}
aria-label={ariaLabel}