agentleFS
DesquaredDesquared/agents-rules-skills/skills/accessibility-annotations/SKILL.md

accessibility-annotations

Skill4 starsChanged 3 months agoMITView on GitHub

Annotate Figma UI screens with accessibility annotations — reading order, tab/focus order, Button, Image alt, Role/Value/Label and More info callouts — using the annotation library configured for the project. Use when asked for accessibility annotations, AX annotations, a11y markup in Figma, reading or focus order, screen reader labels for designs, or to continue an accessibility annotation handoff.

The file

Show its rules and text

We split this skill into the rules it gives an agent

16 rules. About 0 are common, 11 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈11

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If the library names components differently (for example Focus Order instead of Order), map them once and record the mapping in the handoff.

    line 24
  2. Distinctive:

    Read the project handoff if one exists — it is the canonical status and lists signed-off templates.

    line 29
  3. Distinctive:

    After the user corrects something, inspect their nodes before touching siblings — their edit is the new source of truth.

    line 50
  4. Very specific:

    If the brand font blocks appendChild or text edits: swap the text to a safe font (for example Inter) → reparent/edit → restore original …

    line 52
  5. Distinctive:

    Prefer less clutter. Never stack annotations on top of each other.

    line 55
  6. Very specific:

    Never put Alt="" on a Button.

    line 66
  7. Distinctive:

    Never pair Button + Role on the same control.

    line 73
  8. Distinctive:

    Default: markers in a side gutter.

    line 79
  9. Very specific:

    Keep Info to one short sentence (for example Entire card is one tappable element.).

    line 92
  10. Distinctive:

    Keep callouts next to their targets.

    line 96
  11. Very specific:

    Keep Button/Image/Role callouts off screen content when they would hide UI.

    line 98
  12. Distinctive:

    No homemade highlight rectangles, and no library rectangles either unless the user asks.

    line 99
  13. Distinctive:

    No documentation-only More info notes.

    line 100
  14. Distinctive:

    When the card is the whole request: no order markers, no rectangle, no note card.

    line 151
  15. Distinctive:

    Do not rely on toast notifications.

    line 157
  16. Distinctive:

    Do not rely on variable/brand fonts loading successfully for text property writes.

    line 158

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Accessibility Annotations

Annotate Figma screens with accessibility (AX) annotations so engineers know the reading order, focus order, roles, labels, and alt text for every element.

Work is Figma-first: use the annotation library configured for the project. Never invent components or draw homemade highlight shapes.

Project configuration

This skill is design-system agnostic. Resolve these values before the first write, from the project handoff, the repo, or by asking once:

SettingHow to resolveFallback
Annotation libraryHandoff Annotation library field, or the AX library already published to the target Figma fileAsk the user for the library name/URL
Component namesInspect the library's component sets in the fileOrder, Button, Image, Role Value Label, More info
Brand fontThe font used by the library's text layersDetect at runtime; see figma-tooling.md for the font-swap fallback
AX regionHandoff AX region, or the page/section holding the annotated screensAsk which section to annotate
Signed-off templatesHandoff template tableThe user's most recently corrected screen

If the library names components differently (for example Focus Order instead of Order), map them once and record the mapping in the handoff. Everything else in this skill stays the same.

Before you start

  1. Load your environment's Figma write skill (for example figma-use) before every Figma write call.
  2. Read the project handoff if one exists — it is the canonical status and lists signed-off templates. See handoff-template.md.
  3. Confirm the section/screen to annotate. Prefer one screen at a time; wait for user QA before applying to sibling screens.
  4. Open the matching user-corrected pattern (see patterns.md) and clone from it. Do not invent denser layouts.

Workflow

Task progress:
- [ ] Identify section + screens
- [ ] Pick pattern (A–I) from the signed-off template
- [ ] Inspect target nodes (texts, controls, existing AX)
- [ ] Clone library / canvas instances (never homemade shapes)
- [ ] Place orders + callouts (gutters, no stacking)
- [ ] Screenshot-verify
- [ ] Update handoff status
- [ ] Stop for user QA

Process rules

  1. Sequential Figma writes only — never run parallel write calls on the same file.
  2. After the user corrects something, inspect their nodes before touching siblings — their edit is the new source of truth.
  3. Clone pre-labeled instances instead of editing text properties on a fresh library instance.
  4. If the brand font blocks appendChild or text edits: swap the text to a safe font (for example Inter) → reparent/edit → restore original fills.
  5. Parent annotations to the section (or a stable overlay), not deep inside screen chrome, when overlays get messy.
  6. Sibling state screens can be leaner — only annotate what is new; shared chrome lives on the primary screen.
  7. Prefer less clutter. Never stack annotations on top of each other.

Critical rules (non-negotiable)

Image ≠ Button

Use caseComponentLabel
Real controls (Back, Close, CTAs, Filters…)ButtonButton label= "…"
Logos / hero / decorative / empty illustrationsImageAlt="" (or a filled alt)
  • Never put Alt="" on a Button.
  • Image/Button label text must keep its original fill colour after any font swap.

Button ≠ Role (no doubles)

  • Button = named actions (Close, Back, Clear filters, Try again, …).
  • Role = richer traits (accordion, tappable teaser, first card in a grid, filter/checkbox/radio/dismiss chips) and no Button on that control.
  • Never pair Button + Role on the same control.

Order markers

  • Reading order (gray) = text only. Tab order (red) = reading + focus.
  • One continuous number stream across reading and tab markers.
  • Default: markers in a side gutter. On-element only when side placement is ambiguous (for example chip grids).
  • A single element gets no order markers at all — there is nothing to sequence. Add orders only when the target holds several elements to sequence, or when the user asks for order explicitly.

Single element (component docs)

Annotating one component or card is not annotating a screen. Keep it to the semantics of that element:

IncludeSkip
Image Alt="" on every decorative icon or logo inside itReading and tab/focus order markers
One Role, Value, Label box: Role, Label, short Info, AX HintHighlight rectangles around the element, even library ones
—Note/comment cards that restate what the Role box already says

Keep Info to one short sentence (for example Entire card is one tappable element.). State wording such as out of stock or disabled belongs in the Label, not in Info.

Placement

  • Keep callouts next to their targets; Callout Direction must point at the real control.
  • Roles in side gutters; if the left is tight, use the right. Stagger Y.
  • Keep Button/Image/Role callouts off screen content when they would hide UI.
  • No homemade highlight rectangles, and no library rectangles either unless the user asks. Never use one to group a single element.
  • No documentation-only More info notes. Exception: Pattern H Shimmer.

Loading / shimmer (Pattern H)

One More info table — not per-skeleton order markers:

PropValue
TypeMore Info
StateCollapsed
Callout DirectionLeft (box to the right of the skeleton)
HeadingShimmer
DescriptionLabel : "Content is loading"

Pattern picker (quick)

Screen typePatternClone mindset
Simple content + CTAs / dialogsAReading on title/body + Tab on CTAs + Button
Onboarding / stories stepBStories chrome + content + Back/Next Buttons
Feed / long scrollCFilters/chips get Tab; logos are Image; no carousel chrome orders
List + logosDBack Button; row Tabs; logo Image; one Role on the first row
Card grid subpageE / E+Back; title Reading; one Tab per card; Role on first card; hero Image if present
Card / detail sheetFSide orders; Buttons for CTAs; Role only for accordion
Whole teaser cardGOne Role (Direction Left, Value off); logo Images; no separate CTA Button
Loading skeletonHMore info Shimmer only
Filter sheets / search chipsIChip/checkbox/radio/dismiss Roles; CTA Buttons; no highlight rectangles

Pattern detail: patterns.md. Component kit and tooling gotchas: figma-tooling.md. Handoff format for multi-session work: handoff-template.md.

Role label recipes (filters)

ControlRoleLabel exampleValueHint
Toggle filter chipButtonOne out of seven. <Filter name>Selected / UnselectedDouble tap to select / unselect
Category chipButtonOne out of five. <Category>Selected / UnselectedDouble tap to toggle
Sort accordionButtonSort byCollapsed / ExpandedDouble tap to expand / collapse
Checkbox rowCheck boxOne out of four. <Option>Checked / Not checkedDouble tap to toggle
Radio rowRadio ButtonOne out of four. <Option>Selected / UnselectedDouble tap to toggle
Dismissible chipButtonOne out of three. <Value>. Delete icon.-Double tap to dismiss

Teaser card (Pattern G) checklist

  1. The whole card is one Role — not a separate CTA Button.
  2. Direction Left; Value off.
  3. Label is the full spoken string (title, price/summary, every tag, in visual order).
  4. Info is one short sentence, for example Entire card is one tappable element.
  5. Hint is Double tap to activate.
  6. Logos and tag icons inside the card → Image Alt=""; skip +N overflow chips.
  7. When the card is the whole request: no order markers, no rectangle, no note card.

Figma plugin constraints

  • Switch pages with the async page API only, and at most one page switch per call.
  • Failed scripts are atomic — diagnose and fix, then retry. Do not blind-retry.
  • Do not rely on toast notifications; always return the IDs of created or mutated nodes.
  • Do not rely on variable/brand fonts loading successfully for text property writes.

Done criteria (per screen)

  • Correct pattern applied; cloned from the signed-off template when one exists
  • Image vs Button correct; no Button+Role doubles
  • Orders continuous; gutters clean; no stacking
  • Callouts close to targets with the correct Direction
  • Screenshot looks clean next to neighbouring screens
  • Handoff updated; waiting on user QA before siblings

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.