Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/modern-carrots-check.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@primer/react": patch
---

TextInput: Refactor TextInputInnerAction to use the default icon button tooltip (No changes in the behaviour or DOM is expected)
36 changes: 30 additions & 6 deletions packages/react/src/internal/components/TextInputInnerAction.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,16 @@ const ConditionalTooltip: React.FC<

const TextInputAction = forwardRef<HTMLButtonElement, TextInputActionProps>(
(
{'aria-label': ariaLabel, tooltipDirection, children, icon, sx: sxProp, variant = 'invisible', ...rest},
{
'aria-label': ariaLabel,
'aria-labelledby': ariaLabelledBy,
tooltipDirection,
children,
icon,
sx: sxProp,
variant = 'invisible',
...rest
},
forwardedRef,
) => {
const sx =
Expand All @@ -92,13 +101,28 @@ const TextInputAction = forwardRef<HTMLButtonElement, TextInputActionProps>(
console.warn('Use the `aria-label` prop to provide an accessible label for assistive technology')
}

const accessibleLabel = ariaLabel
? {'aria-label': ariaLabel}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This gives priority to aria-label over aria-labelledby which is opposite of what browsers do. Is that intentional?

aria-labelledby takes precedence over all other methods of providing an accessible name, including aria-label
Ref: https://arc.net/l/quote/ksytdmqp

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, kind of.

Because aria-label is a prop on the TextInputInnerAction component and it is used to provide tooltip text as well.

If there is aria-labelledby, the tooltip wiring needs to be manually. So to my understanding, aria-label is encouraged and preferred.

Let me know if you have any concerns or anything I am missing here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see!

: ariaLabelledBy
? {'aria-labelledby': ariaLabelledBy}
: {
'aria-label': '',
}

return (
<Box as="span" className="TextInput-action" marginLeft={1} marginRight={1} lineHeight="0">
{icon && !children ? (
<Tooltip direction={tooltipDirection ?? 's'} text={ariaLabel ?? ''} type="label">
{/* @ts-ignore we intentionally do add aria-label to IconButton because Tooltip v2 adds an aria-labelledby instead. */}
<IconButton variant={variant} type="button" icon={icon} size="small" sx={sx} {...rest} ref={forwardedRef} />
</Tooltip>
{icon && !children && ariaLabel ? (
<IconButton
{...accessibleLabel}
tooltipDirection={tooltipDirection ?? 's'}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sparkle @joshblack for helping me fix this obscure type issue ✨

variant={variant}
type="button"
icon={icon}
size="small"
sx={sx}
{...rest}
ref={forwardedRef}
/>
) : (
<ConditionalTooltip aria-label={ariaLabel}>
<Button variant={variant} type="button" sx={sx} {...rest} ref={forwardedRef}>
Expand Down