fix(ui): show focus indicator on Card when used as a link

Card's focus-ring CSS keys off data-focus-visible on the
bui-CardTrigger, but Link (the trigger when href is set) wasn't
emitting it because useLink does not track focus-visible state.
Compose useFocusRing in Link so keyboard focus is now properly
indicated on Card href=... and any other Link styled via
[data-focus-visible].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Emma Indal <emma.indahl@gmail.com>
This commit is contained in:
Emma Indal
2026-05-04 17:18:52 +02:00
parent 1004d7bd10
commit 5b85902ede
2 changed files with 9 additions and 2 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/ui': patch
---
Fix `Card href=...` not showing a focus indicator on keyboard navigation. `Link` now composes `useFocusRing` and emits `data-focus-visible`, so the Card's existing focus-ring CSS matches when the trigger is focused.
+4 -2
View File
@@ -15,7 +15,7 @@
*/
import { forwardRef, useRef } from 'react';
import { useLink } from 'react-aria';
import { mergeProps, useFocusRing, useLink } from 'react-aria';
import type { LinkProps } from './types';
import { useDefinition } from '../../hooks/useDefinition';
import { useResolvedHref } from '../../hooks/useResolvedHref';
@@ -33,6 +33,7 @@ const LinkInternal = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {
const linkRef = (ref || internalRef) as React.RefObject<HTMLAnchorElement>;
const { linkProps } = useLink(restProps, linkRef);
const { isFocusVisible, focusProps } = useFocusRing();
const resolvedHref = useResolvedHref(restProps.href);
const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
@@ -48,13 +49,14 @@ const LinkInternal = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {
return (
<a
{...linkProps}
{...mergeProps(linkProps, focusProps)}
{...dataAttributes}
{...(restProps as React.AnchorHTMLAttributes<HTMLAnchorElement>)}
href={resolvedHref}
ref={linkRef}
title={title}
className={classes.root}
data-focus-visible={isFocusVisible || undefined}
onClick={handleClick}
>
{children}