Skip to content

Commit 5a6201b

Browse files
committed
Updates aria-describedby and input handlers to fix double announcements
1 parent 8dfc244 commit 5a6201b

2 files changed

Lines changed: 9 additions & 3 deletions

File tree

app/lib/primer/forms/caption.html.erb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<% if @input.character_limit? %>
2-
<span class="sr-only" data-target="<%= @input.character_limit_target_prefix %>.characterLimitSrElement" aria-live="polite" aria-atomic="true"></span>
3-
<span class="FormControl-caption" data-target="<%= @input.character_limit_target_prefix %>.characterLimitElement" data-max-length="<%= @input.character_limit %>" id="<%= @input.character_limit_id %>">
2+
<span class="sr-only" data-target="<%= @input.character_limit_target_prefix %>.characterLimitSrElement" aria-live="polite" role="status"></span>
3+
<span class="sr-only" id="<%= @input.character_limit_id %>">You can enter up to <%= @input.character_limit %> <%= @input.character_limit == 1 ? 'character' : 'characters' %></span>
4+
<span class="FormControl-caption" data-target="<%= @input.character_limit_target_prefix %>.characterLimitElement" data-max-length="<%= @input.character_limit %>" aria-hidden="true">
45
<span class="FormControl-caption-icon" hidden><%= render(Primer::Beta::Octicon.new(icon: :"alert-fill", size: :xsmall, aria: { hidden: true })) %></span>
56
<span class="FormControl-caption-text"><%= @input.character_limit %> <%= @input.character_limit == 1 ? 'character' : 'characters' %> remaining</span>
67
</span>

app/lib/primer/forms/character_counter.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ export class CharacterCounter {
1717
* Initialize character counting by setting up event listener and initial count
1818
*/
1919
initialize(signal?: AbortSignal): void {
20-
this.inputElement.addEventListener('input', () => this.updateCharacterCount(), signal ? {signal} : undefined)
20+
this.inputElement.addEventListener('keyup', () => this.updateCharacterCount(), signal ? {signal} : undefined) // Keyup used over input for better screen reader support
21+
this.inputElement.addEventListener(
22+
'paste',
23+
() => setTimeout(() => this.updateCharacterCount(), 50), // Gives the pasted content time to register
24+
signal ? {signal} : undefined,
25+
)
2126
this.updateCharacterCount()
2227
this.isInitialLoad = false
2328
}

0 commit comments

Comments
 (0)