From 07756d4404a3456920f1b6d38dbef9d06ddf6120 Mon Sep 17 00:00:00 2001 From: Liu Liu Date: Mon, 20 Jul 2026 12:51:16 -0700 Subject: [PATCH 1/2] aria-pressed --- .changeset/segmented-control-aria-pressed.md | 5 +++++ .../src/SegmentedControl/SegmentedControl.module.css | 6 +++--- .../src/SegmentedControl/SegmentedControl.test.tsx | 10 +++++----- .../src/SegmentedControl/SegmentedControlButton.tsx | 2 +- .../SegmentedControl/SegmentedControlIconButton.tsx | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 .changeset/segmented-control-aria-pressed.md diff --git a/.changeset/segmented-control-aria-pressed.md b/.changeset/segmented-control-aria-pressed.md new file mode 100644 index 00000000000..3b6dfb06cb5 --- /dev/null +++ b/.changeset/segmented-control-aria-pressed.md @@ -0,0 +1,5 @@ +--- +'@primer/react': patch +--- + +Use `aria-pressed` instead of `aria-current` on `SegmentedControl.Button` and `SegmentedControl.IconButton` so JAWS announces the selected state when a segment is activated. diff --git a/packages/react/src/SegmentedControl/SegmentedControl.module.css b/packages/react/src/SegmentedControl/SegmentedControl.module.css index f16cb5c3425..a4127e959bb 100644 --- a/packages/react/src/SegmentedControl/SegmentedControl.module.css +++ b/packages/react/src/SegmentedControl/SegmentedControl.module.css @@ -256,7 +256,7 @@ width: 0; } - &[aria-disabled='true']:not([aria-current='true']) { + &[aria-disabled='true']:not([aria-pressed='true']) { cursor: not-allowed; color: var(--fgColor-disabled); background-color: transparent; @@ -305,7 +305,7 @@ justify-content: center; } -.Button[aria-current='true'] { +.Button[aria-pressed='true'] { padding: 0; font-weight: var(--base-text-weight-semibold); @@ -321,7 +321,7 @@ } } -.Button:not([aria-current='true'], [aria-disabled='true']) { +.Button:not([aria-pressed='true'], [aria-disabled='true']) { &:hover .Content { background-color: var(--controlTrack-bgColor-hover); } diff --git a/packages/react/src/SegmentedControl/SegmentedControl.test.tsx b/packages/react/src/SegmentedControl/SegmentedControl.test.tsx index 351d58a0d22..0903068313b 100644 --- a/packages/react/src/SegmentedControl/SegmentedControl.test.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControl.test.tsx @@ -85,7 +85,7 @@ describe('SegmentedControl', () => { const selectedButton = getByText('Raw').closest('button') - expect(selectedButton?.getAttribute('aria-current')).toBe('true') + expect(selectedButton?.getAttribute('aria-pressed')).toBe('true') }) it('renders with a selected segment - uncontrolled', () => { @@ -101,7 +101,7 @@ describe('SegmentedControl', () => { const selectedButton = getByText('Raw').closest('button') - expect(selectedButton?.getAttribute('aria-current')).toBe('true') + expect(selectedButton?.getAttribute('aria-pressed')).toBe('true') }) it('renders the dropdown variant', () => { @@ -148,7 +148,7 @@ describe('SegmentedControl', () => { const selectedButton = getByText('Preview').closest('button') - expect(selectedButton?.getAttribute('aria-current')).toBe('true') + expect(selectedButton?.getAttribute('aria-pressed')).toBe('true') }) it('renders segments with segment labels that have leading icons', () => { @@ -252,11 +252,11 @@ describe('SegmentedControl', () => { const buttonToClick = getByText('Raw').closest('button') - expect(buttonToClick?.getAttribute('aria-current')).toBe('false') + expect(buttonToClick?.getAttribute('aria-pressed')).toBe('false') if (buttonToClick) { await user.click(buttonToClick) } - expect(buttonToClick?.getAttribute('aria-current')).toBe('true') + expect(buttonToClick?.getAttribute('aria-pressed')).toBe('true') }) it('calls segment button onClick if it is passed', async () => { diff --git a/packages/react/src/SegmentedControl/SegmentedControlButton.tsx b/packages/react/src/SegmentedControl/SegmentedControlButton.tsx index 287099e1d1f..a1896c94d38 100644 --- a/packages/react/src/SegmentedControl/SegmentedControlButton.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControlButton.tsx @@ -50,7 +50,7 @@ const SegmentedControlButton: FCWithSlotMarker