Back to list
joe-watkins

web-standards

by joe-watkins

0🍴 0📅 Jan 19, 2026

SKILL.md


name: web-standards description: Static HTML/CSS/ARIA analysis without requiring a browser. Use this skill when analyzing code for semantic HTML issues, ARIA validity, landmark structure, heading hierarchy, form labeling, or any accessibility problems detectable from source code. Queries aria-mcp for ARIA rules and wcag-mcp for success criteria mapping. Part of the a11y-orchestrator workflow.

Web Standards Analyzer

Static accessibility analysis of HTML, CSS, and ARIA without browser execution.

Analysis Categories

Work through each category, noting any issues found.

1. Semantic HTML

Check for proper semantic element usage:

CheckIssue PatternFix Direction
Buttons<div onclick>, <span onclick>, <a role="button">Use <button>
Links<span onclick> for navigation, <button> with href behaviorUse <a href>
Headings<div class="title">, skipped levels (h1→h3)Use <h1>-<h6> in order
ListsSeries of <div> for list itemsUse <ul>/<ol> with <li>
Tables<div> grids for tabular dataUse <table> with proper headers
Nav<div class="nav">Use <nav> landmark
MainContent without <main>Wrap primary content in <main>
FormsInputs without associated labelsAdd <label for="">

2. ARIA Validity

Query aria-mcp for authoritative ARIA rules:

  • get-role("button") → Returns role requirements
  • validate-role-attributes("button", ["aria-pressed"]) → Validates ARIA usage
  • get-prohibited-attributes("button") → Returns disallowed attributes

Check for:

Invalid ARIA on semantic elements:

  • <button role="button"> — redundant
  • <a role="link"> — redundant
  • <a role="button"> — misuse (use <button> instead)

Missing required ARIA:

  • Custom widgets without appropriate roles
  • Interactive elements without accessible names
  • Dynamic content without live regions

Invalid ARIA combinations:

  • aria-checked on non-checkbox/switch roles
  • aria-expanded on elements without expandable content
  • aria-selected outside selection contexts

Query aria-mcp for role-specific requirements when custom widgets are found:

  • get-required-attributes("tabpanel") → Returns required attributes
  • get-required-context("tab") → Returns required parent context
  • suggest-role("dropdown menu") → Suggests appropriate role

3. Landmark Structure

Check page has appropriate landmarks:

LandmarkExpectedIssue If Missing
<main> or role="main"One per pageNo main landmark
<nav> or role="navigation"For navigationNavigation not identified
<header> or role="banner"Top-level headerNo banner landmark
<footer> or role="contentinfo"Top-level footerNo content info

Watch for:

  • Multiple <main> elements
  • Landmarks inside landmarks of same type
  • Overuse of landmarks (every section doesn't need one)

4. Heading Hierarchy

Verify heading structure:

  1. Page should have exactly one <h1>
  2. Headings should not skip levels (h1→h2→h3, not h1→h3)
  3. Headings should reflect content hierarchy
  4. Visual headings should be semantic headings

Query wcag-mcp: get-criterion("1.3.1") for Info and Relationships

5. Form Accessibility

Check all form controls:

ElementRequiredCheck
<input>LabelHas <label for=""> or aria-label
<select>LabelHas associated label
<textarea>LabelHas associated label
Required fieldsIndicationrequired or aria-required
ErrorsAssociationaria-describedby to error message
GroupsLabeling<fieldset>/<legend> for radio/checkbox groups

Invalid patterns:

  • Placeholder as only label
  • Label not programmatically associated
  • Hidden label without accessible alternative

6. Image Accessibility

Check all images and graphics:

ElementCheckIssue
<img>Has alt attributeMissing alt
Informative <img>alt describes contentEmpty alt on meaningful image
Decorative <img>alt=""Descriptive alt on decorative image
<svg>Has accessible name or aria-hiddenSVG not labeled or hidden
Icon fontsHas text alternativeIcon-only with no text

Query wcag-mcp: get-criterion("1.1.1") for Non-text Content

7. Keyboard Accessibility

Static checks for keyboard support:

CheckIssue Pattern
tabindex > 0Disrupts natural tab order
tabindex="-1" on interactiveRemoves from tab order
onclick without keyboard handlerMouse-only interaction
Non-focusable interactiveCustom widget without tabindex="0"

Query wcag-mcp: get-criterion("2.1.1") for Keyboard

8. Text and Contrast (CSS)

Check CSS for potential issues:

CheckIssue Pattern
outline: noneRemoves focus indicator
outline: 0Removes focus indicator
Fixed font sizesMay prevent text resize
user-select: noneMay prevent text selection

Query wcag-mcp: get-criterion("2.4.7") for Focus Visible, get-criterion("1.4.4") for Resize Text

Output Format

Report issues in this structure:

## Static Analysis Results

Found X accessibility issues:

### Issue 1: [Brief description]

- **Location:** [file:line or element path]
- **Category:** [Semantic HTML/ARIA/Landmarks/etc.]
- **Severity:** [Critical/Serious/Moderate/Minor]
- **WCAG:** [Success criterion from wcag-mcp]
- **Code:**

```html
[problematic code]
```
  • Problem: [What's wrong]

Severity Guidelines

SeverityCriteria
CriticalBlocks access entirely (no keyboard, no name)
SeriousMajor barrier (skipped headings, no labels)
ModerateDegrades experience (redundant ARIA, poor semantics)
MinorBest practice violation (optimization opportunities)

MCP Server Queries

When you encounter these situations, query the referenced MCP server:

SituationQuery MCPExample Tool
Custom ARIA widgetaria-mcpget-required-attributes("dialog")
WCAG criterion detailswcag-mcpget-techniques-for-criterion("1.3.1")
Correct implementationmagentaa11y-mcpget_component_developer_notes("modal")

Score

Total Score

50/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon