Skip to content

Commit 8a16336

Browse files
authoredAug 22, 2024··
When hiding a Spinner, also hide its screen reader text (#3021)
1 parent 399a50f commit 8a16336

File tree

7 files changed

+45
-10
lines changed

7 files changed

+45
-10
lines changed
 

‎.changeset/neat-pumpkins-appear.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@primer/view-components': patch
3+
---
4+
5+
When hiding a `Spinner`, also hide its screen reader text
+8-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
<%= render Primer::BaseComponent.new(**@system_arguments) do %>
2-
<circle cx="8" cy="8" r="7" stroke="currentColor" stroke-opacity="0.25" stroke-width="2" vector-effect="non-scaling-stroke" fill="none" />
3-
<path d="M15 8a7.002 7.002 0 00-7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" vector-effect="non-scaling-stroke" />
4-
<% end %>
5-
<% if no_aria_label? %>
6-
<span class="spinner-screenreader-text sr-only"><%= @sr_text %></span>
1+
<%= render(Primer::BaseComponent.new(tag: :span, hidden: @hidden, data: { target: @target })) do %>
2+
<%= render Primer::BaseComponent.new(**@system_arguments) do %>
3+
<circle cx="8" cy="8" r="7" stroke="currentColor" stroke-opacity="0.25" stroke-width="2" vector-effect="non-scaling-stroke" fill="none" />
4+
<path d="M15 8a7.002 7.002 0 00-7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" vector-effect="non-scaling-stroke" />
5+
<% end %>
6+
<% if no_aria_label? %>
7+
<span class="sr-only"><%= @sr_text %></span>
8+
<% end %>
79
<% end %>

‎app/components/primer/beta/spinner.rb

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ def initialize(size: DEFAULT_SIZE, style: DEFAULT_STYLE, sr_text: DEFAULT_SR_TEX
4040
else
4141
@system_arguments[:role] = "img"
4242
end
43+
44+
@target = extract_data(:target, @system_arguments)
45+
@hidden = @system_arguments.delete(:hidden)
4346
end
4447

4548
def no_aria_label?

‎app/lib/primer/attributes_helper.rb

+10
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ def data(val, system_arguments)
1414
system_arguments[:"data-#{val}"] || system_arguments.dig(:data, val.to_sym)
1515
end
1616

17+
def extract_data(val, system_arguments)
18+
if system_arguments.include?(:"data-#{val}")
19+
system_arguments.delete(:"data-#{val}")
20+
else
21+
if system_arguments.include?(:data) && system_arguments[:data][val.to_sym]
22+
system_arguments[:data].delete(val.to_sym)
23+
end
24+
end
25+
end
26+
1727
# Merges hashes that contain "aria-*" keys and nested aria: hashes. Removes keys from
1828
# each hash and returns them in the new hash.
1929
#

‎lib/primer/forms/primer_text_field.ts

-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ declare global {
1111
}
1212
}
1313

14-
const SCREENREADER_TEXT_CLASSNAME = 'spinner-screenreader-text'
1514
@controller
1615
export class PrimerTextFieldElement extends HTMLElement {
1716
@target inputElement: HTMLInputElement
@@ -99,13 +98,11 @@ export class PrimerTextFieldElement extends HTMLElement {
9998

10099
showLeadingSpinner(): void {
101100
this.leadingSpinner?.removeAttribute('hidden')
102-
this.leadingSpinner?.querySelector(SCREENREADER_TEXT_CLASSNAME)?.removeAttribute('hidden')
103101
this.leadingVisual?.setAttribute('hidden', '')
104102
}
105103

106104
hideLeadingSpinner(): void {
107105
this.leadingSpinner?.setAttribute('hidden', '')
108-
this.leadingSpinner?.querySelector(SCREENREADER_TEXT_CLASSNAME)?.setAttribute('hidden', '')
109106
this.leadingVisual?.removeAttribute('hidden')
110107
}
111108
}

‎test/components/alpha/text_field_test.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def test_renders_a_spinner
9292
Primer::Alpha::TextField.new(**@default_params, leading_visual: { icon: :search }, leading_spinner: true)
9393
)
9494

95-
assert_selector "svg[data-target='primer-text-field.leadingSpinner']", visible: :hidden
95+
assert_selector "[data-target='primer-text-field.leadingSpinner']", visible: :hidden
9696
end
9797

9898
def test_enforces_leading_visual_when_spinner_requested

‎test/system/alpha/text_field_test.rb

+18
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,23 @@ def test_show_and_hide_leading_spinner
8080
assert_selector "[data-target='primer-text-field.leadingVisual']"
8181
refute_selector "[data-target='primer-text-field.leadingSpinner']"
8282
end
83+
84+
def test_shows_and_hides_screenreader_text
85+
visit_preview(:playground, leading_spinner: true)
86+
87+
evaluate_multiline_script(<<~JS)
88+
const textField = document.querySelector('primer-text-field')
89+
textField.showLeadingSpinner()
90+
JS
91+
92+
assert_selector "[data-target='primer-text-field.leadingSpinner'] .sr-only", text: "Loading"
93+
94+
evaluate_multiline_script(<<~JS)
95+
const textField = document.querySelector('primer-text-field')
96+
textField.hideLeadingSpinner()
97+
JS
98+
99+
refute_selector "[data-target='primer-text-field.leadingSpinner'] .sr-only"
100+
end
83101
end
84102
end

0 commit comments

Comments
 (0)
Please sign in to comment.