coinbase/cds-accessibility
| accessibility props (e.g. accessibilityLabel, accessibilityState), confirming the chosen CDS primitives cover the right assistive technology behavior, and checking usage against official CDS documentation—not generic web ARIA tutorials. Use this skill to review CDS UI for screen reader, keyboard, and labeled control requirements after the code has been written.
npx skills add https://github.com/coinbase/cds --skill cds-accessibility
Use this skill to review CDS UI for accessibility after it has been written: confirm that documented props and patterns from CDS are applied, and that the chosen CDS components have official docs describing the interaction the code needs. Do not use this file as a generic WCAG or ARIA handbook. Whenever you need official CDS documentation, load it with the cds-docs skill, which is the single source for current CDS component docs (the official docs site is cds.coinbase.com). Do not guess aria-* or RN prop names from third-party blogs.
accessibilityLabel, accessibilityHint, accessibilityState, accessibilityRole, and any CDS-specific props) against the component docs.aria-*, as, role, labels, and field patterns as the CDS web component API exposes in the doc.cds-code: that skill covers building CDS layout, tokens, and imports; this skill reviews CDS accessibility consumption and CDS-appropriate component choice for a11y after the build.cds-code skill is the source; this skill reviews the result of that work for accessibility.For a given change, this review is complete when all three dimensions below are true. If any dimension is not met, the review found a gap (or the gap is out of scope for CDS—continue with docs, add verification, or escalate).
alt / accessibilityLabel (or equivalent) requirements.Text (or equivalent typography) for titles, headings, or body/label copy, as (web) and accessibilityRole (RN) match content intent and the Text (typography) doc; do not use heading semantics on non-heading font styles when that would misrepresent structure (per the Text web/mobile doc loaded via cds-docs). If Text is not in the change, this bullet does not apply.FormField, Modal composition) when they affect the feature.| Dimension | The review is complete when |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Props | In-scope components use doc-correct CDS a11y props and patterns for the platform. Focus-managed components (Step 5) match doc for focus when applicable. |
| Selection | Component choices match documented a11y behavior; composites are used when the doc prescribes them for the interaction, not guessed primitives. |
| Docs | Relevant CDS doc content (loaded via cds-docs) and cross-links are read and reflected in the code; any verification gap is stated. Text/typography semantics align with the Text doc when Text is in scope. |
Follow these steps in order when reviewing the accessibility of CDS components in already-written code.
cds-code setup (package discovery) establishes this; keep platform consistent so you load the right docs.You do not need to repeat full setup for every small review; repeat when runtime or major CDS version might have changed.
Box/View, note it—you will compare docs in Step 3.For each component in the list:
FormField or Modal).If the doc is thin for your platform, still do not invent a full generic ARIA layer—follow the published doc and, if the gap is blocking, call out that the behavior is not specified in CDS for that component.
Modal or Select over a hand-built stack).cds-code for overall “which component for layout/visuals”; use this step when assistive technology behavior is the differentiator.accessibilityLabel, accessibilityHint, accessibilityState, accessibilityRole, and any other props the CDS component doc names for the use case are set. Do not accept labels copied from old code without re-checking the current prop table.aria-*, as, role, htmlFor / id / field wiring are used only as the CDS web component API and examples show. Prefer the component’s first-class props (e.g. a dedicated label or slot) over ad hoc ARIA on the wrong element.Icon / Image (or media) guidance in the official CDS doc (loaded via cds-docs) is followed.Text and typography, confirm as (web) / accessibilityRole (React Native) per Part 2, Text (typography) and heading semantics and the Text official doc (loaded via cds-docs); skip if the change has no Text (or equivalent) in scope.When to run this step: only if the Step 1 component list includes at least one focus-managed CDS component per the published official doc (loaded via cds-docs)—typically overlays and floating UI (examples: Modal, Tray, Tooltip; also drawer, popover, or others only if the doc describes focus movement, trap, initial/restore focus, or keyboard dismiss). If the change is only static layout, inline fields, or components whose docs do not define focus management, skip this step and go to Step 6: Verify.
aria behavior, and whether focus moves at all are per component doc. Flag any home-grown tabIndex/listener stack when CDS already documents the path.cds-code flow applies, its visual verification pass still stands; this review does not replace that—it adds CDS a11y API correctness.cds-code workflow was used to build the UI, its visual verification is still in place; this review adds CDS a11y consumption and does not replace layout, styling, or import checks from that skill.These patterns are not a substitute for reading each component’s doc. They tell you what to look for in the doc you loaded via cds-docs for the same component.
The consumer is responsible for pairing visual font styles on CDS Text with correct assistive names and roles so structure matches the real page or screen. Source of truth: the Text web and mobile official docs (loaded via cds-docs)—not generic HTML heading blogs.
Web (React):
Text is used for headings (commonly font values such as display or title when they represent section or page titles), as should be set to the appropriate heading element (h1–h6) so the document outline and screen readers match the authoring intent. Follow the Text official doc and examples for which font values pair with which as.font values meant as non-heading copy—typically body, headline (emphasis, not a document heading), label, caption—as should not be a heading (or other semantic) role when that would misrepresent structure (e.g. body text announced as a heading). If the Text doc is updated, the official CDS doc (loaded via cds-docs) wins over this list.h1 per page” or “every screen must include an h1” unless CDS documentation explicitly requires it for a pattern. Prefer logical heading order and product/IA; do not treat headline font as a heading role without checking the Text doc.React Native:
Text, use accessibilityRole="heading" when the string is a heading—this is the primary way to expose heading semantics for typography. Heading level is weaker than on web; if the mobile Text doc exposes accessibilityLevel (or similar), it should be set per the official Text mobile doc.accessibilityRole="heading" should not be set on body, label, caption, or other non-heading uses when that would mis-announce structure; follow the mobile Text doc for which font values may pair with a heading role.as="h1" patterns ported literally—use the mobile Text doc; accessibilityRole="heading" is the best match available on RN for heading-like Text when a heading is intended.accessibilityLabel, accessibilityHint, accessibilityState, accessibilityRole, accessible, and any CDS-prefixed or forwarded props the doc lists.accessibilityState in combination with the component’s own disabled / value props.View list). For Text, heading vs body treatment is covered in Text (typography) and heading semantics above.as and role on Box and similar when the page needs landmark or widget semantics the doc allows.Text / typography and headings (as for real headings, not body/label/caption as headings): see Text (typography) and heading semantics above.<label>, aria-labelledby, aria-label, or component label / Slot patterns exactly as the form control doc specifies.tabIndex or focus-trap blog recipe.Box + ad hoc when the doc for the composite already specifies semantics, focus, and keyboard for that pattern.aria-describedby or RN equivalents as documented). Errors must not be wired only with color if the doc requires text association or announcements.Icon, image, and media components are used per the official CDS doc: decorative vs informative alternatives, and any alt / accessibilityLabel requirements.as, font, heading semantics on web; accessibilityRole on React Native).cds-codecds-code produces CDS-first UI (layout, StyleProps, theming, imports, visualization, visual verification, package discovery). It is used for how to build the screen and for import correctness.cds-accessibility (this skill) reviews that the CDS components are used with the right accessibility props and component choices as documented for web and mobile, after the code has been written. Typical flow on feature work: build with cds-code, then run this skill’s review workflow for a11y consumption (loading docs via cds-docs).| Concern | React Native (see mobile doc) | Web (see web doc) |
| ------------------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exposed name | Often accessibilityLabel, sometimes with visible Text | accessibilityLabel (when the web doc lists it for name), then aria-label, aria-labelledby, or label / slot props on the field |
| Hint / description | accessibilityHint where doc allows | aria-describedby or description slots per official CDS web doc (loaded via cds-docs) |
| State | accessibilityState + component state props | aria-* state per component table (aria-expanded, aria-selected, etc.) |
| Role / semantics | accessibilityRole and CDS structural components | as, role, semantic elements in doc examples |
| Form errors | Follow CDS form doc | Follow CDS form doc |
Always fill this table from the current CDS component doc (loaded via cds-docs) for the specific component version you use. The table is a search checklist, not a spec.
accessibilityLabel or aria-label strings without reading the current component doc and content guidelines.Box/View when CDS documents a CDS component with defined focus and semantics for that job.cds-code: correct CDS imports, layout, and tokens are still required—this skill does not override missing cds-code requirements.If the official CDS doc (loaded via cds-docs) does not document a behavior you need, do not fabricate a full custom accessibility architecture inside this skill’s name—record the gap, use design/DS follow-up, or external accessibility guidance for non-CDS layers.
Take coinbase/cds-accessibility from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.