feat(a11y): landmark regions, skip link, dialog labels, icon button labels
C-3: nav/main landmark roles in ClientLayout (nav + main areas) C-4: Skip-to-main-content link in ClientLayout (visually hidden, focusable) H-2: aria-labelledby on LeaveRoomPrompt and RoomTopicViewer dialogs C-1: aria-label on ~15 icon-only buttons (back, menu, close, folder, account) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -7,9 +7,29 @@ type ClientLayoutProps = {
|
||||
};
|
||||
export function ClientLayout({ nav, children }: ClientLayoutProps) {
|
||||
return (
|
||||
<Box grow="Yes">
|
||||
<Box shrink="No">{nav}</Box>
|
||||
<Box grow="Yes">{children}</Box>
|
||||
</Box>
|
||||
<>
|
||||
<a
|
||||
href="#main-content"
|
||||
style={{
|
||||
position: 'absolute',
|
||||
top: '-40px',
|
||||
left: 0,
|
||||
padding: '8px 16px',
|
||||
background: '#000',
|
||||
color: '#fff',
|
||||
zIndex: 9999,
|
||||
borderRadius: '0 0 4px 0',
|
||||
transition: 'top 0.1s',
|
||||
}}
|
||||
onFocus={(e) => { (e.currentTarget as HTMLElement).style.top = '0'; }}
|
||||
onBlur={(e) => { (e.currentTarget as HTMLElement).style.top = '-40px'; }}
|
||||
>
|
||||
Skip to main content
|
||||
</a>
|
||||
<Box grow="Yes">
|
||||
<Box shrink="No" as="nav" aria-label="Room navigation">{nav}</Box>
|
||||
<Box grow="Yes" as="main" id="main-content">{children}</Box>
|
||||
</Box>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user