Skip to content
Open
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
4 changes: 4 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@
## 2024-05-17 - Generic Visual Text Buttons and ARIA Context
**Learning:** Components frequently use generic visual text buttons like `[hide]`, `[show]`, `[edit]`, or `[delete]` within lists or loops. Screen readers read these buttons without surrounding visual context, confusing users.
**Action:** Always provide a contextual `aria-label` (e.g., `aria-label="Hide ${title}"`) for generic visual text buttons so screen reader users have proper context.

## 2024-06-26 - Generic Action Buttons Require Specific Context
**Learning:** Adding aria-labels to generic interactive text links like `[edit]`, `[delete]`, `[share]`, and `[clear]` is particularly critical in dynamic repeated UI elements (like a list of citations). Screen readers announce the label without visual context, so the action must include what is being interacted with.
**Action:** Ensure that buttons performing operations on list items generate their aria-label from item context rather than using static strings (e.g., `aria-label={\`Edit \${citation.fields?.title}\`}`).
7 changes: 7 additions & 0 deletions src/components/wiki/sortable-citation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -383,20 +383,23 @@ export function SortableCitation({
<button
onClick={startEditing}
className="text-wiki-link text-sm hover:underline focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Edit ${citation.fields?.title || "this citation"}`}
>
[edit]
</button>
{onShare && (
<button
onClick={() => onShare(citation.id)}
className="text-wiki-link text-sm hover:underline focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Share ${citation.fields?.title || "this citation"}`}
>
[share]
</button>
)}
<button
onClick={() => onDelete(citation.id)}
className="text-wiki-link text-sm hover:underline focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Delete ${citation.fields?.title || "this citation"}`}
>
[delete]
</button>
Expand Down Expand Up @@ -446,6 +449,7 @@ export function SortableCitation({
setEditingNotes(true);
}}
className="text-wiki-link text-xs hover:underline focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Edit notes for ${citation.fields?.title || "this citation"}`}
>
[edit]
</button>
Expand All @@ -456,6 +460,7 @@ export function SortableCitation({
if (confirm(`Clear notes for "${label}"?`)) onSaveNotes(citation.id, "");
}}
className="text-wiki-link text-xs hover:underline focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Clear notes for ${citation.fields?.title || "this citation"}`}
>
[clear]
</button>
Expand Down Expand Up @@ -515,6 +520,7 @@ export function SortableCitation({
setQuotesDraft(quotesDraft.filter((_, idx) => idx !== i))
}
className="text-wiki-link text-xs hover:underline pt-1 focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Remove quote ${i + 1}`}
>
[remove]
</button>
Expand Down Expand Up @@ -563,6 +569,7 @@ export function SortableCitation({
setEditingQuotes(true);
}}
className="text-wiki-link text-xs hover:underline focus-visible:outline-dotted focus-visible:outline-1 focus-visible:outline-wiki-text"
aria-label={`Edit quotes for ${citation.fields?.title || "this citation"}`}
>
[edit]
</button>
Expand Down
Loading