[Accessibility] Navigation focus handling polish (#39358)

This commit is contained in:
diondiondion authored and GitHub committed 2026-06-10 14:50:49 +00:00
1 parent c6e2e2255c
commit 2994e8543d
27 files changed
+119 -48

No files matched your search

@@ -15,6 +15,7 @@ import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';
import { blockAccount } from 'mastodon/actions/accounts';
import { closeModal } from 'mastodon/actions/modal';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
import { Button } from 'mastodon/components/button';
import { Icon } from 'mastodon/components/icon';
@@ -46,7 +47,9 @@ export const BlockModal = ({ accountId, acct }) => {
</div>
<div>
<h1><FormattedMessage id='block_modal.title' defaultMessage='Block user?' /></h1>
<NavigationFocusTarget as='h1'>
<FormattedMessage id='block_modal.title' defaultMessage='Block user?' />
</NavigationFocusTarget>
<p>@{acct}</p>
</div>
</div>
@@ -7,6 +7,7 @@ import classNames from 'classnames';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import { Button } from 'mastodon/components/button';
import { Icon } from 'mastodon/components/icon';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
import PrivacyDropdown from 'mastodon/features/compose/components/privacy_dropdown';
import { EmbeddedStatus } from 'mastodon/features/notifications_v2/components/embedded_status';
import type { Status, StatusVisibility } from 'mastodon/models/status';
@@ -68,7 +69,7 @@ export const BoostModal: React.FC<{
</div>
<div>
<h1>
<NavigationFocusTarget as='h1'>
{status.get('reblogged') ? (
<FormattedMessage
id='boost_modal.undo_reblog'
@@ -80,7 +81,7 @@ export const BoostModal: React.FC<{
defaultMessage='Boost post?'
/>
)}
</h1>
</NavigationFocusTarget>
<div>
<FormattedMessage
id='boost_modal.combo'
@@ -6,6 +6,7 @@ import classNames from 'classnames';
import { Button } from '@/mastodon/components/button';
import { IconButton } from '@/mastodon/components/icon_button';
import { NavigationFocusTarget } from '@/mastodon/components/navigation_focus_target';
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
export type { BaseConfirmationModalProps as DialogModalProps } from './confirmation_modals/confirmation_modal';
@@ -47,7 +48,9 @@ export const DialogModal: FC<DialogModalProps> = ({
onClick={onClose}
/>
<h1 className='dialog-modal__header__title'>{title}</h1>
<NavigationFocusTarget as='h1' className='dialog-modal__header__title'>
{title}
</NavigationFocusTarget>
</div>
<div className='dialog-modal__content'>
@@ -15,6 +15,7 @@ import { apiRequest } from 'mastodon/api';
import { Button } from 'mastodon/components/button';
import { Icon } from 'mastodon/components/icon';
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
import { ShortNumber } from 'mastodon/components/short_number';
import { useAppDispatch } from 'mastodon/store';
@@ -77,12 +78,12 @@ export const DomainBlockModal: React.FC<{
</div>
<div>
<h1>
<NavigationFocusTarget as='h1'>
<FormattedMessage
id='domain_block_modal.title'
defaultMessage='Block domain?'
/>
</h1>
</NavigationFocusTarget>
<p>{domain}</p>
</div>
</div>
@@ -6,6 +6,7 @@ import { showAlertForError } from 'mastodon/actions/alerts';
import api from 'mastodon/api';
import { Button } from 'mastodon/components/button';
import { CopyPasteText } from 'mastodon/components/copy_paste_text';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
import { useAppDispatch } from 'mastodon/store';
interface OEmbedResponse {
@@ -76,9 +77,9 @@ const EmbedModal: React.FC<{
<Button onClick={onClose}>
<FormattedMessage id='report.close' defaultMessage='Done' />
</Button>
<span className='dialog-modal__header__title'>
<NavigationFocusTarget as='h1' className='dialog-modal__header__title'>
<FormattedMessage id='status.embed' defaultMessage='Get embed code' />
</span>
</NavigationFocusTarget>
<Button secondary onClick={onClose}>
<FormattedMessage
id='confirmation_modal.cancel'
@@ -12,6 +12,7 @@ import { closeModal } from 'mastodon/actions/modal';
import { updateNotificationsPolicy } from 'mastodon/actions/notification_policies';
import { Button } from 'mastodon/components/button';
import { Icon } from 'mastodon/components/icon';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
export const IgnoreNotificationsModal = ({ filterType }) => {
const dispatch = useDispatch();
@@ -57,7 +58,7 @@ export const IgnoreNotificationsModal = ({ filterType }) => {
<div className='modal-root__modal safety-action-modal'>
<div className='safety-action-modal__top'>
<div className='safety-action-modal__header'>
<h1>{title}</h1>
<NavigationFocusTarget as='h1'>{title}</NavigationFocusTarget>
</div>
<ul className='safety-action-modal__bullet-points'>
@@ -18,6 +18,7 @@ import { closeModal } from 'mastodon/actions/modal';
import { Button } from 'mastodon/components/button';
import { CheckBox } from 'mastodon/components/check_box';
import { Icon } from 'mastodon/components/icon';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
import { RadioButton } from 'mastodon/components/radio_button';
const messages = defineMessages({
@@ -84,7 +85,9 @@ export const MuteModal = ({ accountId, acct }) => {
</div>
<div>
<h1><FormattedMessage id='mute_modal.title' defaultMessage='Mute user?' /></h1>
<NavigationFocusTarget as='h1'>
<FormattedMessage id='mute_modal.title' defaultMessage='Mute user?' />
</NavigationFocusTarget>
<p>@{acct}</p>
</div>
</div>
@@ -9,6 +9,7 @@ import { fetchServer } from 'mastodon/actions/server';
import type { ApiCollectionJSON } from 'mastodon/api_types/collections';
import { Button } from 'mastodon/components/button';
import { IconButton } from 'mastodon/components/icon_button';
import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target';
import { useAccount } from 'mastodon/hooks/useAccount';
import { useAppDispatch } from 'mastodon/store';
@@ -23,12 +24,12 @@ const CollectionThanks: React.FC<{
}> = ({ onClose }) => {
return (
<>
<h3 className='report-dialog-modal__title'>
<NavigationFocusTarget as='h1' className='report-dialog-modal__title'>
<FormattedMessage
id='report.thanks.title_actionable'
defaultMessage="Thanks for reporting, we'll look into this."
/>
</h3>
</NavigationFocusTarget>
<div className='flex-spacer' />
@@ -13,6 +13,7 @@ import { Button } from '@/mastodon/components/button';
import { Dropdown } from '@/mastodon/components/dropdown';
import type { SelectItem } from '@/mastodon/components/dropdown_selector';
import { IconButton } from '@/mastodon/components/icon_button';
import { NavigationFocusTarget } from '@/mastodon/components/navigation_focus_target';
import { messages as privacyMessages } from '@/mastodon/features/compose/components/privacy_dropdown';
import { createAppSelector, useAppSelector } from '@/mastodon/store';
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
@@ -217,14 +218,15 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
iconComponent={CloseIcon}
onClick={onClose}
/>
<FormattedMessage
id='visibility_modal.header'
defaultMessage='Visibility and interaction'
<NavigationFocusTarget
as='h1'
className='dialog-modal__header__title'
>
{(chunks) => (
<span className='dialog-modal__header__title'>{chunks}</span>
)}
</FormattedMessage>
<FormattedMessage
id='visibility_modal.header'
defaultMessage='Visibility and interaction'
/>
</NavigationFocusTarget>
</div>
<div className='dialog-modal__content'>
<div className='dialog-modal__content__description'>