fix: add an accessible text to the organization dashboard link (#47672)

## Problem

People using screen readers can't find how to navigate back to the
organization dashboard.

## Solution

- Add an invisible label for screen readers
- Add a tooltip for all users

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a tooltip to the home navigation icon on hover (“Back to
organization home”).
* Enhanced app layout dropdowns to accept custom trigger content,
improving accessibility with updated labels for branches, organizations,
and projects.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Gildas Garcia authored and GitHub committed 2026-07-07 11:11:20 +02:00
1 parent 2f5a5e9e78
commit 8f69cfaaae
5 files changed
+39 -20

No files matched your search

@@ -42,7 +42,7 @@ export interface AppLayoutDropdownWithPopoverProps {
commandContent: ReactNode
open: boolean
onOpenChange: (open: boolean) => void
triggerButtonClassName?: string
triggerButton?: ReactNode
}
export function AppLayoutDropdownWithPopover({
@@ -52,7 +52,7 @@ export function AppLayoutDropdownWithPopover({
commandContent,
open,
onOpenChange,
triggerButtonClassName,
triggerButton,
}: AppLayoutDropdownWithPopoverProps) {
return (
<Popover open={open} onOpenChange={onOpenChange} modal={false}>
@@ -60,9 +60,7 @@ export function AppLayoutDropdownWithPopover({
<Link href={linkHref} className={linkClassName}>
{linkContent}
</Link>
<PopoverTrigger asChild>
<AppLayoutDropdownTriggerButton className={triggerButtonClassName} />
</PopoverTrigger>
<PopoverTrigger asChild>{triggerButton}</PopoverTrigger>
</div>
<PopoverContent className="p-0" side="bottom" align="start">
{commandContent}
@@ -2,7 +2,11 @@ import { useParams } from 'common'
import { useState } from 'react'
import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
import { AppLayoutDropdownError, AppLayoutDropdownWithPopover } from './AppLayoutDropdown'
import {
AppLayoutDropdownError,
AppLayoutDropdownTriggerButton,
AppLayoutDropdownWithPopover,
} from './AppLayoutDropdown'
import { BranchBadge } from './BranchBadge'
import { BranchDropdownCommandContent } from './BranchDropdownCommandContent'
import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler'
@@ -108,6 +112,7 @@ export const BranchDropdown = ({
commandContent={commandContent}
open={open}
onOpenChange={handleOpenChange}
triggerButton={<AppLayoutDropdownTriggerButton aria-label="Show project branches" />}
/>
)
}
@@ -5,7 +5,11 @@ import { useState } from 'react'
import { Badge, cn } from 'ui'
import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
import { AppLayoutDropdownError, AppLayoutDropdownWithPopover } from './AppLayoutDropdown'
import {
AppLayoutDropdownError,
AppLayoutDropdownTriggerButton,
AppLayoutDropdownWithPopover,
} from './AppLayoutDropdown'
import { OrganizationDropdownCommandContent } from './OrganizationDropdownCommandContent'
import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler'
import PartnerIcon from '@/components/ui/PartnerIcon'
@@ -92,6 +96,7 @@ export const OrganizationDropdown = ({
commandContent={commandContent}
open={open}
onOpenChange={handleOpenChange}
triggerButton={<AppLayoutDropdownTriggerButton aria-label="Show organizations" />}
/>
)
}
@@ -111,7 +111,12 @@ function ProjectDropdownPlatformView({
<OrganizationProjectSelector
{...selectorProps}
renderTrigger={() => <AppLayoutDropdownTriggerButton className="shrink-0" />}
renderTrigger={() => (
<AppLayoutDropdownTriggerButton
className="shrink-0"
aria-label="Show organization projects"
/>
)}
/>
</div>
)
@@ -1,6 +1,6 @@
import Link from 'next/link'
import { useRouter } from 'next/router'
import { cn } from 'ui'
import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
import { useOrganizationsQuery } from '@/data/organizations/organizations-query'
import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
@@ -29,16 +29,22 @@ export const HomeIcon = ({ className }: { className?: string }) => {
const href = IS_PLATFORM ? getDefaultOrgRedirect() : '/project/default'
return (
<Link
href={href}
onClick={() => track('header_home_logo_clicked')}
className={cn('items-center justify-center shrink-0 flex', className)}
>
<img
alt="Supabase"
src={`${router.basePath}/img/supabase-logo.svg`}
className={largeLogo ? 'h-[20px]' : 'h-[18px]'}
/>
</Link>
<Tooltip>
<TooltipTrigger asChild>
<Link
href={href}
onClick={() => track('header_home_logo_clicked')}
className={cn('items-center justify-center shrink-0 flex', className)}
>
<img
alt="Supabase"
src={`${router.basePath}/img/supabase-logo.svg`}
className={largeLogo ? 'h-[20px]' : 'h-[18px]'}
/>
<span className="sr-only">Back to organization home</span>
</Link>
</TooltipTrigger>
<TooltipContent aria-hidden>Back to organization home</TooltipContent>
</Tooltip>
)
}