Skip to content

a11y(frontend): keep unavailable export actions discoverable - #997

Open
seonghobae wants to merge 10 commits into
mainfrom
fix/discoverable-unavailable-export-actions-clean
Open

a11y(frontend): keep unavailable export actions discoverable#997
seonghobae wants to merge 10 commits into
mainfrom
fix/discoverable-unavailable-export-actions-clean

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Buyer-visible outcome

Temporarily unavailable export and access-management actions remain discoverable to keyboard and screen-reader users. Each unavailable action stays in sequential focus order, exposes aria-disabled="true", references its visible prerequisite through aria-describedby, remains visually distinguishable, and is inert for pointer, Enter, and Space activation.

Clean replacement scope

This PR was reconstructed directly from protected main@8dc746920c12988f082e914879d95e13c9693535. The current exact head is 68896adafd73a9299f10e99a8c8bc512fcdfae3c.

The bounded diff contains only the intended accessibility surface, focused evidence, and required changelogs:

  • CHANGELOG.md;
  • docs/doctoring/discoverable-unavailable-export-actions.md;
  • frontend/CHANGELOG.md;
  • frontend/src/accessibility.css;
  • frontend/src/components/modals/ExportModal.test.tsx;
  • frontend/src/components/modals/ExportModal.tsx;
  • frontend/src/main.tsx.

It contains no dependency or lockfile change, package-manager migration, App/search-polling change, deleted existing regression evidence, or agent-memory edit.

Executable contract

  • all eight unavailable export formats remain focusable;
  • each has a unique visible prerequisite description;
  • click, Enter, and Space cannot call an unavailable callback;
  • enabled actions omit aria-disabled and execute exactly once per activation;
  • aria-disabled buttons in the Export Modal retain the existing visual disabled tokens without disabling pointer receipt or keyboard focus;
  • the access-management placeholder follows the same focusable, described, visually unavailable, inert contract;
  • export permissions, serialization, downloads, share-link behavior, and data readiness are unchanged.

Review repair

Fresh Devin review found two valid gaps on the initial clean head: loss of the native :disabled visual style after adopting aria-disabled, and omission of frontend/CHANGELOG.md. Both are fixed. A later informational review correctly noted that a global selector could style future or library-rendered buttons; the selector is now scoped to .exportModal. Another informational note confirmed the callback gate already blocks pointer, Enter, and Space, so no unnecessary handler change was made. The style is loaded through the production entry point, while focused component tests remain authoritative for focusability, descriptive association, and callback suppression. No dependency or suppression was added.

Traceability

The doctoring note records WAI-ARIA 1.2 as the normative baseline, tracks WAI-ARIA 1.3 only as a working draft, and bounds the cited user study to the broader discoverability rationale rather than claiming it directly validates this implementation.

Verification and merge boundary

Only exact-head checks on 68896adafd73a9299f10e99a8c8bc512fcdfae3c are authoritative. Do not merge until every live required context is terminal-success, all valid review threads are resolved, and a qualifying independent non-author approval exists. No administrative bypass or predecessor evidence transfer is permitted.

Supersedes the useful intent of #698, #991, #985, and #970 without inheriting their branch pollution or duplicate history.

@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 33 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2e92e50d-2eb8-44cd-81a9-e078a61aa739

📥 Commits

Reviewing files that changed from the base of the PR and between 8dc7469 and 65c8d00.

📒 Files selected for processing (7)
  • CHANGELOG.md
  • docs/doctoring/discoverable-unavailable-export-actions.md
  • frontend/CHANGELOG.md
  • frontend/src/accessibility.css
  • frontend/src/components/modals/ExportModal.test.tsx
  • frontend/src/components/modals/ExportModal.tsx
  • frontend/src/main.tsx

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent

Please perform a bounded independent review of exact head 68896adafd73a9299f10e99a8c8bc512fcdfae3c. The clean seven-file accessibility delta has terminal-success repository, security, Semgrep, supply-chain, and opencode-review checks; all Devin findings are resolved. Verify focusability, visible/accessible prerequisite descriptions, pointer/Enter/Space inertness, Export-Modal-scoped visual disabled styling, and absence of unrelated dependency/tooling changes. Do not update the branch or merge.

@seonghobae
seonghobae enabled auto-merge (squash) August 27, 2026 13:11
devin-ai-integration[bot]

This comment was marked as resolved.

@opencode-agent
opencode-agent Bot disabled auto-merge August 27, 2026 14:07
devin-ai-integration[bot]

This comment was marked as resolved.

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