Harden accessibility: ARIA roles, semantic buttons, alt text, form labels

- Replace clickable divs with semantic <button> elements (NoteCard, SearchView)
- Add role="dialog", aria-modal, aria-labelledby on all modals (Login, Quote, Zap, Lightbox)
- Add role="presentation" on overlay backdrops (NoteCard menu, emoji pickers)
- Add aria-label to all icon-only buttons (close, nav arrows, context menu)
- Add aria-expanded to context menu toggle
- Add meaningful alt text to all 35+ images (avatars, covers, thumbnails, media)
- Add aria-label to form inputs (search, onboarding login)
This commit is contained in:
Jure
2026-04-02 17:01:02 +02:00
parent f1781691c5
commit 1fd613425d
27 changed files with 75 additions and 54 deletions

View File

@@ -56,7 +56,7 @@ function ConvRow({
}`}
>
{profile?.picture ? (
<img src={profile.picture} alt="" className="w-8 h-8 rounded-sm object-cover shrink-0"
<img src={profile.picture} alt={`${name}'s avatar`} className="w-8 h-8 rounded-sm object-cover shrink-0"
onError={(e) => { (e.target as HTMLImageElement).style.display = "none"; }} />
) : (
<div className="w-8 h-8 rounded-sm bg-bg-raised border border-border flex items-center justify-center text-text-dim text-xs shrink-0">
@@ -177,7 +177,7 @@ function ThreadPanel({
{/* Header */}
<div className="border-b border-border px-4 py-2.5 flex items-center gap-3 shrink-0">
{profile?.picture && (
<img src={profile.picture} alt="" className="w-7 h-7 rounded-sm object-cover" />
<img src={profile.picture} alt={`${name}'s avatar`} className="w-7 h-7 rounded-sm object-cover" />
)}
<button
onClick={() => openProfile(partnerPubkey)}