Agent skill

Angular Accessibility

by fmflurry in fmflurry/settings-opencode

Audit and fix common accessibility issues in Angular templates and Angular Material components.

MITAuto-check passedFrontend & Design

Install Angular Accessibility

skills CLI
$ npx skills add fmflurry/settings-opencode --skill angular-accessibility -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install fmflurry/settings-opencode angular-accessibility --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/fmflurry/settings-opencode.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/angular-accessibility .claude/skills/angular-accessibility && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
angular-accessibility
GitHub stars
171
Token cost
~2.7k tokens
SKILL.md length
939 words
Files
1
Skills in repo
20
Repo updated
First seen
Licence
MIT

At a glance

Audit and fix common accessibility issues in Angular templates and Angular Material components.

  • Works in 8 steps: Icon-only buttons - missing accessible… → Form controls - missing programmatic label → Checkboxes without labels → …
  • The user mentions Lighthouse
  • SKILL.md covers When To Activate, Default Post-Development Trigger, Hard Rules and Audit Workflow, plus 4 more sections
  • Calls npx

What it does

Angular Accessibility is an agent skill from fmflurry/settings-opencode. Audit and fix common accessibility issues in Angular templates and Angular Material components. Use when the user mentions Lighthouse, axe, screen readers, keyboard navigation, ARIA, asks to fix a11y issues in Angular HTML templates, or after any feature, bug fix, or refactor that changed Angular templates.

Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Frontend & Design, covering Accessibility. It works with Angular. The repository describes itself as: Custom OpenCode settings. The licence is MIT.

When your agent uses it

  • The user mentions Lighthouse
  • Keyboard navigation
  • Asks to fix a11y issues in Angular HTML templates
  • After any feature

Example prompts

  • “/angular-accessibility”

Requirements

  • Node.js

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Icon-only buttons - missing accessible name
  2. Form controls - missing programmatic label
  3. Checkboxes without labels
  4. Non-semantic interactive elements
  5. Viewport blocks zoom
  6. Missing landmark
  7. Spinners and loading states
  8. Dialogs, drawers, and disclosure controls

What it can do on your machine

Read from SKILL.md and the folder at commit 0e6c33c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Angular Accessibility loads about 2.7k tokens when it runs. Until then it costs about 83 tokens; SKILL.md has 939 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~83
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from fmflurry/settings-opencode at commit 0e6c33c, republished under its MIT licence (© fmflurry). 939 words, ~2,739 tokens.

Download SKILL.mdSave it as .claude/skills/angular-accessibility/SKILL.md (or your agent's skills folder).
name
angular-accessibility
description
Audit and fix common accessibility issues in Angular templates and Angular Material components. Use when the user mentions Lighthouse, axe, screen readers, keyboard navigation, ARIA, asks to fix a11y issues in Angular HTML templates, or after any feature, bug fix, or refactor that changed Angular templates.

Angular Accessibility (a11y)

When To Activate

  • After any development touching Angular templates, including a new feature, bug fix, or refactor
  • After updating Angular Material markup, control structure, labels, dialogs, tables, forms, or navigation UI
  • Fixing Lighthouse, axe, or ESLint accessibility findings
  • Auditing Angular templates or Angular Material screens
  • Debugging keyboard navigation, focus order, or screen reader output
  • Refactoring interactive UI in Angular HTML templates

Default Post-Development Trigger

Run this skill as a final verification step whenever the implementation modified .html templates or materially changed rendered UI structure, even if the original task did not mention accessibility.

Typical triggers:

  • New feature that introduces or changes template markup
  • Bug fix that changes form controls, buttons, tables, dialogs, drawers, or navigation
  • Refactor that restructures conditionals, loops, landmarks, headings, or interactive elements
  • Angular Material component replacement or reconfiguration affecting labels, focus, or keyboard behavior

Hard Rules

  • Prefer semantic HTML first: native <button>, <a>, <label>, <main>, <table>, and <th> before ARIA workarounds
  • Prefer visible labels, <label for>, <mat-label>, or aria-labelledby before aria-label
  • Use ARIA to fill missing semantics, not to replace native semantics
  • For native elements, bind ARIA with [attr.aria-*]
  • For Angular Material components that expose dedicated inputs, prefer [aria-label] or [aria-labelledby] without attr.
  • Do not add redundant roles to native controls (role="button" on <button>, role="checkbox" on <input type="checkbox">, etc.)
  • All user-facing accessible text must be translated with Transloco. Never hard-code text in templates
  • After each fix, verify keyboard and focus behavior, not just lint output

Audit Workflow

  1. Run the ESLint accessibility check first:
    bash
    npx eslint "src/app/<feature>/**/*.html"
  2. Run an automated audit on the affected screen:
    • Lighthouse
    • axe DevTools or equivalent
  3. Perform a keyboard-only smoke test:
    • Tab / Shift+Tab reaches all interactive controls in a logical order
    • Enter / Space activates buttons, toggles, and checkboxes
    • Escape closes dialogs, menus, or drawers where applicable
    • Focus remains visible throughout the flow
  4. Spot-check the changed flow with a screen reader
  5. Fix issues systematically using the patterns below
  6. Re-run lint and the automated audit on the affected screen

Common Issues & Fixes

1. Icon-only buttons - missing accessible name

Any <button> whose only content is a <mat-icon> or similar icon has no accessible name.

Fix: add a translated accessible name and mark the icon as decorative.

html
<!-- ❌ Before -->
<button type="button" (click)="onClose()">
  <mat-icon>close</mat-icon>
</button>

<!-- ✅ After -->
<button
  type="button"
  [attr.aria-label]="t('scope.key.close-btn-aria')"
  (click)="onClose()"
>
  <mat-icon aria-hidden="true">close</mat-icon>
</button>

Same pattern applies to pagination, toggle, toolbar, and other icon-only actions.


2. Form controls - missing programmatic label

Prefer a visible label first. Use aria-label only when a visible label or aria-labelledby is not practical.

Standard forms: use <label for> or <mat-label>.

html
<!-- ✅ Preferred in a regular form -->
<mat-form-field>
  <mat-label>{{ t('scope.key.amount') }}</mat-label>
  <input matInput id="amount" type="number" />
</mat-form-field>

Dense table/grid cells: use row-level context so each control is uniquely identifiable.

html
<!-- ❌ Before -->
<input matInput type="number" [value]="row.amount" />
<mat-select [value]="row.type"></mat-select>

<!-- ✅ After -->
<input
  matInput
  type="number"
  [value]="row.amount"
  [attr.aria-label]="t('scope.key.amount-aria', { invoiceNumber: row.invoiceNumber })"
/>

<mat-select
  [value]="row.type"
  [aria-label]="t('scope.key.type-aria', { invoiceNumber: row.invoiceNumber })"
>
</mat-select>

3. Checkboxes without labels

Empty mat-checkbox components with no projected text need an accessible name.

html
<!-- ❌ Before -->
<mat-checkbox
  [checked]="allSelected()"
  (change)="onToggleAll($event.checked)"
/>

<!-- ✅ After - header (select-all) -->
<mat-checkbox
  [aria-label]="t('scope.key.select-all-aria')"
  [checked]="allSelected()"
  (change)="onToggleAll($event.checked)"
/>

<!-- ✅ After - row (select one) -->
<mat-checkbox
  [aria-label]="t('scope.key.select-row-aria', { invoiceNumber: row.invoiceNumber })"
  [checked]="row.selected"
  (change)="onToggleItem(row.id, $event.checked)"
/>

4. Non-semantic interactive elements

Clickable <div> and <span> elements break keyboard and assistive technology behavior.

Fix: replace them with native interactive elements whenever possible.

html
<!-- ❌ Before -->
<div class="close-action" (click)="onClose()">
  <mat-icon>close</mat-icon>
</div>

<!-- ✅ After -->
<button
  type="button"
  class="close-action"
  [attr.aria-label]="t('scope.key.close-btn-aria')"
  (click)="onClose()"
>
  <mat-icon aria-hidden="true">close</mat-icon>
</button>

Use <a> for navigation and <button> for in-page actions.


5. Viewport blocks zoom

maximum-scale or user-scalable=no in the viewport meta tag prevents low-vision users from magnifying the page.

Fix (src/index.html): keep only width=device-width, initial-scale=1.0.

html
<!-- ❌ Before -->
<meta
  name="viewport"
  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>

<!-- ✅ After -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

6. Missing <main> landmark

Screen readers use landmarks to jump between page regions. A page must have exactly one <main> element.

In this project the layout can render two conditional branches (mobile / desktop). Each branch should expose its content wrapper as <main>. Since they are mutually exclusive, only one <main> is in the DOM at a time.

html
<!-- mobile: main.component.html -->
<!-- ❌ Before: <div class="main-container"> -->
<main class="main-container" cdkVirtualScrollingElement>
  <gc-sub-header />
  <router-outlet />
</main>

<!-- desktop: page.component.html -->
<!-- ❌ Before: <div class="desktop-page-content"> -->
<main class="desktop-page-content">
  <router-outlet />
</main>

SCSS that targets .main-container or .desktop-page-content keeps working when only the element tag changes.


Show full SKILL.md (377 more words)Show less
7. Spinners and loading states

mat-progress-spinner already follows the ARIA progressbar pattern. Do not replace it with role="status".

Fix:

  • keep the component's default semantics
  • add an accessible name if the spinner would otherwise be ambiguous
  • use a nearby aria-live="polite" message only when the loading state itself must be announced
html
<!-- ✅ Spinner keeps its default progressbar semantics -->
<mat-progress-spinner
  [attr.aria-label]="t('shared.loading-aria')"
  mode="indeterminate"
  diameter="32"
/>

<!-- ✅ Optional live region when the loading state should be announced -->
@if (isLoading()) {
<span aria-live="polite">{{ t('shared.loading-aria') }}</span>
}

8. Dialogs, drawers, and disclosure controls

Interactive overlays and expandable sections must expose state and preserve focus behavior.

Verify:

  • the trigger has an accessible name
  • expandable controls expose aria-expanded when they show or hide related content
  • dialogs have a visible title and, when needed, a description
  • focus moves into the dialog when opened and returns to the trigger when closed
html
<button
  type="button"
  aria-controls="filters-panel"
  [attr.aria-expanded]="isFiltersOpen()"
  (click)="toggleFilters()"
>
  {{ t('scope.key.filters') }}
</button>

@if (isFiltersOpen()) {
<section id="filters-panel">...</section>
}

For Angular Material dialogs, keep the built-in focus management unless there is a concrete need to change it.


Translation Convention

All accessible names and descriptions must use translated strings via Transloco. Never hard-code French or any other language directly in templates.

  • In templates, follow the existing t('scope.key') pattern
  • Key naming: append -aria to accessible-name keys and -description when the text is used for extra context
  • Add keys to the feature's scoped fr-FR.json
  • Use contextual params when the label must uniquely identify a row or control

Example JSON additions:

json
{
  "table": {
    "select-all-aria": "Sélectionner toutes les échéances",
    "select-row-aria": "Sélectionner l'échéance {{invoiceNumber}}",
    "discount-amount-aria": "Montant escompte pour la facture {{invoiceNumber}}"
  },
  "pagination": {
    "previous-aria": "Page précédente",
    "next-aria": "Page suivante"
  },
  "selection-detail": {
    "close-btn-aria": "Fermer le volet de détails"
  }
}

Validation Checklist

After fixing, verify:

  • Viewport meta tag has no maximum-scale or user-scalable=no
  • Page has exactly one <main> landmark
  • All icon-only buttons have an accessible name
  • Decorative icons inside labelled controls use aria-hidden="true"
  • Form controls have a visible label, aria-labelledby, or aria-label as appropriate
  • Empty mat-checkbox components have [aria-label] or [aria-labelledby]
  • Clickable div and span elements were replaced with semantic controls
  • Expand/collapse controls expose aria-expanded when applicable
  • Dialogs and drawers keep correct focus entry and focus return behavior
  • Loading indicators keep correct semantics and use a live region only when announcement is needed
  • Informative images have meaningful alt; decorative images use empty alt=""
  • Keyboard-only navigation works end-to-end and focus stays visible
  • All accessible text uses translated strings
  • ESLint passes: npx eslint "src/app/<feature>/**/*.html"
  • Automated audit was re-run on the affected screen

Known Limits

  • This skill covers common template and component-level accessibility issues, not full WCAG certification
  • Color contrast, timing, motion, content wording, and design-system token changes may require separate design or product decisions
  • Complex screen reader behavior should be validated on the real user flow, not assumed from lint output alone

© fmflurry, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/angular-accessibility of fmflurry/settings-opencode.

Open the folder on GitHubat commit 0e6c33c

Compare with similar skills

Angular Accessibility next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Angular Accessibility compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Angular Accessibility this skillfmflurry/settings-opencode171—~2.7kAutomated safety check: PassMIT
Generate Swimlane Swim Solutionswimlane/ngx-ui735—~3.4kAutomated safety check: PassMIT
BeeqEndava/BEEQ163—~5.6kAutomated safety check: PassApache-2.0
Kb Web ScanningCommunity-Access/accessibility-agents422—~1.2kAutomated safety check: PassMIT
A11y Auditalirezarezvani/claude-skills28k—~2.4kAutomated safety check: PassMIT
Angular Developeraffaan-m/ECC275k—~2.1kAutomated safety check: PassMIT

Similar skills

  • Generate Swimlane Lit Element Solution (CDN). An agent skill from swimlane/ngx-ui.

    735 GitHub stars~3.4k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Beeq

    Endava/BEEQ

    Builds, styles, and reviews UI with BEEQ, Endava's web-component design system.

    163 GitHub stars~5.6k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Kb Web Scanning

    Community-Access/accessibility-agents

    Reference data, not a reviewer. An agent skill from Community-Access/accessibility-agents.

    422 GitHub stars~1.2k tokensUpdated 14 days ago
    Frontend & DesignAuto-check passed
  • A11y Audit

    alirezarezvani/claude-skills

    Accessibility audit skill for scanning, fixing, and verifying WCAG 2.2 Level A and AA compliance across React, Next.js, Vue, Angular, Svelte, and plain HTML codebases.

    28k GitHub stars~2.4k tokensUpdated 1 mo ago
    Frontend & DesignAuto-check passed
  • Angular Developer

    affaan-m/ECC

    Angular コードを生成し、アーキテクチャ ガイダンスを提供します。プロジェクトの作成、コンポーネント、またはサービスを作成するとき、または反応性(シグナル、linkedSignal、リソース)、フォーム、依存性注入、ルーティング、SSR、アクセシビリティ(ARIA)、アニメーション、スタイリング(コンポーネント スタイル、Tailwind CSS)、テスト、または CLI…

    275k GitHub stars~2.1k tokensUpdated 3 days ago
    Frontend & DesignAuto-check passed
  • A11y Audit

    ricneves-ai/flowgrammers-skills

    Skill de auditoria de acessibilidade para escanear, corrigir e verificar a conformidade WCAG 2.2 Nível A e AA em codebases React, Next.js, Vue, Angular, Svelte e HTML puro.

    115 GitHub stars~2.7k tokensUpdated 12 days ago
    Frontend & DesignAuto-check passed

More from fmflurry/settings-opencode

All 20 skills in this repo
  • Show Your Work

    fmflurry/settings-opencode

    Keep a reviewable decision trail for long-running or unattended work: a TSV log with one row per decision (what, why, evidence, result).

    171 GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Playwright E2E Authoring

    fmflurry/settings-opencode

    Scaffold and extend Playwright E2E tests for the gc.platform suite (tests/playwright), wiring every artifact to the real frontend (localhost:4200) + real .NET backend — never mocks.

    171 GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • Why

    fmflurry/settings-opencode

    A skill your agent uses for 'why does X work this way', 'why we picked Y', design rationale, regressions, postmortems, or data-backed thresholds.

    171 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Angular Clean Architecture

    fmflurry/settings-opencode

    Scaffolds and extends Angular standalone feature MODULES under src/app/modules/{name} using Clean Architecture layering (presentation/application/core/infrastructure), a self-registering module…

    171 GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Angular Cop

    fmflurry/settings-opencode

    Pre-merge code review for Angular + TypeScript pull requests.

    171 GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • API Spec Openapi

    fmflurry/settings-opencode

    Generate OpenAPI 3.1 specs that follow the Zalando RESTful API Guidelines (kebab-case naming, cursor pagination, RFC 9457 problem+json errors, URL versioning, idempotency), one YAML file per bounded…

    171 GitHub stars~3.8k tokensUpdated today
    Auto-check passed

Works with

Questions about Angular Accessibility

What does Angular Accessibility do?

Audit and fix common accessibility issues in Angular templates and Angular Material components. Angular Accessibility is an agent skill from fmflurry/settings-opencode. Audit and fix common accessibility issues in Angular templates and Angular Material components.

When should I use Angular Accessibility?

Angular Accessibility fits situations like: the user mentions Lighthouse; keyboard navigation; asks to fix a11y issues in Angular HTML templates; after any feature.

How do I install Angular Accessibility in Claude Code?

Run `npx skills add fmflurry/settings-opencode --skill angular-accessibility -a claude-code`. Or copy the skill folder (skills/angular-accessibility in fmflurry/settings-opencode) into .claude/skills/angular-accessibility in your project. Claude Code loads it when a task matches its description.

How do I install Angular Accessibility in Codex?

Run `npx skills add fmflurry/settings-opencode --skill angular-accessibility -a codex`. Or copy the skill folder (skills/angular-accessibility in fmflurry/settings-opencode) into .agents/skills/angular-accessibility in your project. Codex loads it when a task matches its description.

Can I use Angular Accessibility in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add fmflurry/settings-opencode --skill angular-accessibility -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/angular-accessibility, .gemini/skills/angular-accessibility, .github/skills/angular-accessibility and .opencode/skills/angular-accessibility in your project.

What does Angular Accessibility need to run?

Going by SKILL.md and its folder, Angular Accessibility needs the command-line tools its instructions call (npx). Our summary lists: Node.js.

Does Angular Accessibility access the network?

SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Angular Accessibility safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Angular Accessibility use?

Angular Accessibility is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Angular Accessibility use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Angular Accessibility?

Skills that share tags, products or a category with Angular Accessibility: Generate Swimlane Swim Solution (swimlane/ngx-ui, 735 stars), Beeq (Endava/BEEQ, 163 stars), Kb Web Scanning (Community-Access/accessibility-agents, 422 stars) and A11y Audit (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Angular Accessibility?

fmflurry (a GitHub user) maintains it in fmflurry/settings-opencode, which has 171 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 7, 2026.

Source: fmflurry/settings-opencode on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.