Skip to content

🎨 Palette: [Make file uploads keyboard accessible]#402

Closed
aafre wants to merge 1 commit into
mainfrom
palette/fix-upload-focus-14653616366003206532
Closed

🎨 Palette: [Make file uploads keyboard accessible]#402
aafre wants to merge 1 commit into
mainfrom
palette/fix-upload-focus-14653616366003206532

Conversation

@aafre
Copy link
Copy Markdown
Owner

@aafre aafre commented Mar 20, 2026

💡 What: Replaced the hidden class with sr-only peer on the resume file upload <input>, and added peer-focus-visible focus ring styles to the "Choose File" <label>.

🎯 Why: The hidden class applied display: none to the input, completely removing it from the browser's tab order. This made the file upload button completely inaccessible to keyboard-only users and screen readers, blocking them from using the Resume Parsing feature.

📸 Before/After:

  • Before: Tabbing past "Cancel" would skip the upload button entirely.
  • After: Tabbing past "Cancel" focuses the upload button, displaying a clear blue focus ring around the label, allowing the user to press Enter/Space to open the file dialog.

Accessibility:

  • Restores keyboard focus flow (tabindex="0" natural behavior for the visually hidden input).
  • Provides visual focus indicator for keyboard users navigating the modal.

PR created automatically by Jules for task 14653616366003206532 started by @aafre

Replaces `className="hidden"` with `className="sr-only peer"` on the file input,
allowing it to remain in the tab order for keyboard users. Uses `peer-focus-visible`
classes on the corresponding label to display an accessible focus ring when the
underlying input is active.

Co-authored-by: aafre <8656674+aafre@users.noreply.github.com>
@google-labs-jules
Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the accessibility of the resume file upload feature. By adjusting CSS classes, it ensures that keyboard-only users and screen readers can properly interact with the file input, which was previously inaccessible. The changes also introduce a visible focus indicator, improving the overall user experience for those navigating the interface without a mouse.

Highlights

  • Accessibility Improvement: The file upload input, previously hidden with display: none, is now made keyboard accessible by replacing the hidden class with sr-only peer. This ensures it remains in the tab order for keyboard users and screen readers.
  • Visual Focus Indicator: Added peer-focus-visible styles to the 'Choose File' label. This provides a clear visual focus ring when the associated input is tab-focused, enhancing usability for keyboard navigators.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request correctly improves the accessibility of the file upload component by making it keyboard-focusable. The use of sr-only on the input and peer-focus-visible on the label is a solid, modern approach. I have one suggestion regarding a TypeScript type definition to improve code quality and maintainability.

}: UploadResumeModalProps) {
const { parseResume, parsing, progress, error } = useResumeParser();
const [dragActive, setDragActive] = useState(false);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Instead of disabling the no-explicit-any lint rule, it would be better to fix the underlying issue on the next line. The parseResult state can be properly typed.

The parseResume function returns a Promise<ParseResponse>, so the state should be useState<ParseResponse | null>(null).

To do this, you'll need to:

  1. Export the ParseResponse interface from resume-builder-ui/src/hooks/useResumeParser.ts.
  2. Import ParseResponse into this component.
  3. Update the state declaration on line 26 and remove this eslint-disable comment.

This will improve type safety and make the component easier to maintain.

References
  1. This comment aligns with the principle of improving robustness and type safety in TSX components. Properly typing state variables, similar to using type guards for conditional rendering, prevents potential runtime errors and enhances code maintainability.

@aafre
Copy link
Copy Markdown
Owner Author

aafre commented Apr 11, 2026

Closing: superseded by #442 + #434 (UploadResumeModal + IconManager). Cherry-picked into #457.

@aafre aafre closed this Apr 11, 2026
@google-labs-jules
Copy link
Copy Markdown
Contributor

Closing: superseded by #442 + #434 (UploadResumeModal + IconManager). Cherry-picked into #457.

Understood. Acknowledging that this work has been superseded and cherry-picked into other PRs, and stopping work on this task.

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.

1 participant