Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add visible label and ARIA label to Dropdown widget #1845

Merged
merged 23 commits into from
Dec 2, 2024

Conversation

daniellewhyte
Copy link
Contributor

@daniellewhyte daniellewhyte commented Nov 12, 2024

Summary:

This commit adds two new fields to the Dropdown widget: ariaLabel and visibleLabel.

Issue: LIT-1424

Test plan:

Screen reader walkthrough with visibleLabel:

Dropdown.visible.label.mov

Screen reader walkthrough with ariaLabel only:
(This will probably be most instances as the dropdown widget is mostly used inline, and the visible label makes things too cramped.)

Dropdown.ARIA.label.mov

Updates to widget editor:

Screenshot 2024-11-27 at 3 37 07 PM

You can also see examples in the course editor on this ZND: https://prod-znd-241122-danielle-dw2.khanacademy.org/devadmin/content/articles/dropdown-with-labels/x56e2ea23d30e405c

@daniellewhyte daniellewhyte self-assigned this Nov 12, 2024
Copy link
Contributor

github-actions bot commented Nov 12, 2024

npm Snapshot: Published

Good news!! We've packaged up the latest commit from this PR (4840dc0) and published it to npm. You
can install it using the tag PR1845.

Example:

yarn add @khanacademy/perseus@PR1845

If you are working in Khan Academy's webapp, you can run:

./dev/tools/bump_perseus_version.sh -t PR1845

Copy link
Contributor

github-actions bot commented Nov 12, 2024

Size Change: +395 B (+0.03%)

Total Size: 1.29 MB

Filename Size Change
packages/perseus-editor/dist/es/index.js 698 kB +134 B (+0.02%)
packages/perseus/dist/es/index.js 422 kB +246 B (+0.06%)
packages/perseus/dist/es/strings.js 3.7 kB +15 B (+0.41%)
ℹ️ View Unchanged
Filename Size
packages/kas/dist/es/index.js 39 kB
packages/keypad-context/dist/es/index.js 760 B
packages/kmath/dist/es/index.js 4.27 kB
packages/math-input/dist/es/index.js 77.9 kB
packages/math-input/dist/es/strings.js 1.79 kB
packages/perseus-core/dist/es/index.js 1.48 kB
packages/perseus-linter/dist/es/index.js 22.2 kB
packages/pure-markdown/dist/es/index.js 3.66 kB
packages/simple-markdown/dist/es/index.js 12.5 kB

compressed-size-action

@daniellewhyte daniellewhyte marked this pull request as ready for review November 25, 2024 17:04
@daniellewhyte daniellewhyte requested a review from a team November 25, 2024 17:04
@khan-actions-bot
Copy link
Contributor

khan-actions-bot commented Nov 25, 2024

Gerald

Required Reviewers
  • @Khan/perseus for changes to .changeset/hot-chairs-sell.md, packages/perseus/src/perseus-types.ts, packages/perseus/src/strings.ts, packages/perseus/src/__testdata__/renderer.testdata.ts, packages/perseus/src/__tests__/extract-perseus-data.test.ts, packages/perseus/src/__tests__/renderer.test.tsx, packages/perseus-editor/src/styles/perseus-editor.less, packages/perseus-editor/src/widgets/dropdown-editor.tsx, packages/perseus/src/__tests__/__snapshots__/renderer.test.tsx.snap, packages/perseus/src/widget-ai-utils/dropdown/dropdown-ai-utils.test.ts, packages/perseus/src/widgets/dropdown/dropdown.stories.tsx, packages/perseus/src/widgets/dropdown/dropdown.test.ts, packages/perseus/src/widgets/dropdown/dropdown.testdata.ts, packages/perseus/src/widgets/dropdown/dropdown.tsx, packages/perseus-editor/src/widgets/__stories__/dropdown-editor.stories.tsx, packages/perseus/src/util/parse-perseus-json/perseus-parsers/dropdown-widget.ts, packages/perseus/src/widgets/dropdown/__snapshots__/dropdown.test.ts.snap, packages/perseus/src/util/parse-perseus-json/regression-tests/__snapshots__/parse-perseus-json-snapshot.test.ts.snap

Don't want to be involved in this pull request? Comment #removeme and we won't notify you of further changes.

>
this article. If left blank, the value will
default to "Select an answer".
</a>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIT: Perhaps linking the article this way:

Please see this
<a
    href="https://www.w3.org/WAI/tips/designing/#ensure-that-form-elements-include-clearly-associated-labels"
    target="_blank"
>
    article on writing accessible labels
</a>
for more information. If left blank, the value will default to "Select an answer".

</SingleSelect>
</div>
<UniqueIDProvider scope="dropdown-widget" mockOnFirstRender={true}>
{(ids) => (
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While we still have code that hasn't yet been converted, we are moving towards using React's useId hook. Example usage.

this.props.ariaLabel ||
this.context.strings.selectAnAnswer
}
aria-labelledby={ids.get("dropdown-label")}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if this should be moved into the aria-label logic. In the case where both a visible label and an aria label are specified, the visible label would be read instead of the aria label (since aria-labelledby takes precedence). Perhaps aria-label could be changed to:

aria-label={
    this.props.ariaLabel ||
    this.props.visibleLabel ||
    this.context.strings.selectAnAnswer
}

/>
<InfoTip>
<p>Optional visible label</p>
</InfoTip>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tooltip icons seem oddly placed (being below the input field instead of after the label text). Instead of using <LabeledTextField>, would it be possible to have a separate label, followed by the <InfoTip> and then a regular <TextField>?

Tooltip Placement

Copy link
Contributor

@mark-fitzgerald mark-fitzgerald left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much for getting this accessible! Just a few comments.

@daniellewhyte daniellewhyte merged commit 066daab into main Dec 2, 2024
15 checks passed
@daniellewhyte daniellewhyte deleted the add-dropdown-labels branch December 2, 2024 18:46
@handeyeco
Copy link
Contributor

Webapp PR that adds support for labels: https://github.com/Khan/webapp/pull/27222

daniellewhyte added a commit that referenced this pull request Dec 3, 2024
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @khanacademy/[email protected]

### Major Changes

- [#1930](#1930)
[`834bd8bfb`](834bd8b)
Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Remove
PerseusExampleWidgetOptions, PerseusSimpleMarkdownTesterWidgetOptions,
and PerseusExampleWidgetOptions types - widgets no longer exist

### Minor Changes

- [#1845](#1845)
[`066daab0e`](066daab)
Thanks [@daniellewhyte](https://github.com/daniellewhyte)! - Add labels
to Dropdown widget

### Patch Changes

- [#1904](#1904)
[`83b1beab8`](83b1bea)
Thanks [@mark-fitzgerald](https://github.com/mark-fitzgerald)! - Upgrade
Storybook to v8.x


- [#1925](#1925)
[`89244ccc0`](89244cc)
Thanks [@handeyeco](https://github.com/handeyeco)! - Remove some uses of
findDOMNode

- Updated dependencies
\[[`83b1beab8`](83b1bea)]:
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Minor Changes

- [#1845](#1845)
[`066daab0e`](066daab)
Thanks [@daniellewhyte](https://github.com/daniellewhyte)! - Add labels
to Dropdown widget

### Patch Changes

- [#1904](#1904)
[`83b1beab8`](83b1bea)
Thanks [@mark-fitzgerald](https://github.com/mark-fitzgerald)! - Upgrade
Storybook to v8.x


- [#1893](#1893)
[`3d777d1c1`](3d777d1)
Thanks [@catandthemachines](https://github.com/catandthemachines)! -
Removing usage of createReactClass from several component files.

- Updated dependencies
\[[`83b1beab8`](83b1bea),
[`066daab0e`](066daab),
[`834bd8bfb`](834bd8b),
[`89244ccc0`](89244cc)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

- [#1904](#1904)
[`83b1beab8`](83b1bea)
Thanks [@mark-fitzgerald](https://github.com/mark-fitzgerald)! - Upgrade
Storybook to v8.x

## @khanacademy/[email protected]

### Patch Changes

- [#1904](#1904)
[`83b1beab8`](83b1bea)
Thanks [@mark-fitzgerald](https://github.com/mark-fitzgerald)! - Upgrade
Storybook to v8.x


- [#1904](#1904)
[`83b1beab8`](83b1bea)
Thanks [@mark-fitzgerald](https://github.com/mark-fitzgerald)! - Upgrade
Storybook to v8.x

- Updated dependencies
\[[`83b1beab8`](83b1bea)]:
    -   @khanacademy/[email protected]
daniellewhyte added a commit that referenced this pull request Dec 11, 2024
## Summary:
This PR contains two fixes for the aria-label in the dropdown widget: 
1. Change the logic of the aria label
Follow up from Mark's comment on #1845 
This commit ensures that the visible label does not override the aria label. 
Motivation: There may be additional info for the screen reader in the aria label that may not be in the visible label.

This changes also removes the aria-labelledby from the Dropdown which was causing the screen reader output to be garbled in Safari. 

2. Pass in a space `(" ")` for empty placeholder.
Wonder Blocks adds a nbsp when an empty string is passed in as one of the option items. This does not work well with screen readers. When testing with Voice Over on Safari and Firefox, it reads out the space and the aria label as a series of characters (instead of words). 

https://github.com/user-attachments/assets/6ed58cfe-e849-4c96-a661-7d8c25f25617

The root cause for this should be fixed in Wonder Blocks and I’ve started a discussion with the WB team [here](https://khanacademy.slack.com/archives/C4PE1QM5Y/p1733761447231789) (I haven't been able to find a solution in WB yet). Given that this bug exists on prod in webapp, it feels appropriate to go ahead and implement this fix in Perseus. 

Issue: LIT-1476, LIT-1482

## Test plan:

Test with the new [Dropdown with empty placeholder story](http://localhost:6007/?path=/story/perseus-widgets-dropdown--dropdown-with-empty-placeholder)
- Dropdown displays inline when nothing is selected
- Screen reader does not say "space" when no option is selected. And does not spell out aria-label

https://github.com/user-attachments/assets/b4ee0524-50e7-4000-a66e-2bb0590d5c3f

Author: daniellewhyte

Reviewers: mark-fitzgerald, catandthemachines

Required Reviewers:

Approved By: mark-fitzgerald

Checks: ✅ Publish npm snapshot (ubuntu-latest, 20.x), ✅ Check builds for changes in size (ubuntu-latest, 20.x), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ✅ Lint, Typecheck, Format, and Test (ubuntu-latest, 20.x), ✅ Cypress (ubuntu-latest, 20.x), ✅ Publish Storybook to Chromatic (ubuntu-latest, 20.x), ✅ .github/dependabot.yml

Pull Request URL: #1953
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants