Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TextInput: Refactor TextInputInnerAction to use the default icon button tooltip #4733

Merged
merged 2 commits into from
Jul 23, 2024
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
Loading