{
  "id": "F105",
  "rulePrefix": "F105",
  "variant": null,
  "ruleType": "w3c-failure",
  "scanScope": "specimen",
  "synthetic": false,
  "status": "current",
  "title": "Failure of Success Criterion 2.5.1 due to providing functionality via a path-based gesture without simple pointer alternative",
  "summary": "providing functionality via a path-based gesture without simple pointer alternative",
  "whyItFails": "This page reproduces the F105 failure pattern so auditors can verify detection against 2.5.1, 2.1.1, 2.5.2.",
  "principles": [
    "operable"
  ],
  "guidelines": [
    "2.5",
    "2.1"
  ],
  "successCriteria": [
    {
      "id": "2.5.1",
      "name": "Pointer Gestures",
      "level": "A",
      "slug": "pointer-gestures"
    },
    {
      "id": "2.1.1",
      "name": "Keyboard",
      "level": "A",
      "slug": "keyboard"
    },
    {
      "id": "2.5.2",
      "name": "Pointer Cancellation",
      "level": "A",
      "slug": "pointer-cancellation"
    }
  ],
  "versions": [
    "2.0",
    "2.1",
    "2.2"
  ],
  "automatable": "partial",
  "requires": [
    "html",
    "css",
    "js"
  ],
  "isolated": true,
  "pairWith": [],
  "w3c": {
    "understanding": [
      "https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures",
      "https://www.w3.org/WAI/WCAG22/Understanding/keyboard",
      "https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation"
    ],
    "quickref": [
      "https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures",
      "https://www.w3.org/WAI/WCAG22/quickref/#keyboard",
      "https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation"
    ],
    "technique": "https://www.w3.org/WAI/WCAG22/Techniques/failures/F105"
  },
  "specimen": {
    "html": "<p>Draw a check mark on the pad to submit — no single-pointer alternative.</p>\n<canvas id=\"f105-canvas\" class=\"f105-canvas\" width=\"200\" height=\"120\"></canvas>",
    "css": ".f105-canvas { border: 1px solid #999; touch-action: none; }",
    "js": "(() => {\n  const c = document.getElementById('f105-canvas');\n  if (!c) return;\n  const ctx = c.getContext('2d');\n  let drawing = false;\n  const draw = (x, y) => { ctx.lineTo(x, y); ctx.stroke(); };\n  c.addEventListener('pointerdown', (e) => { drawing = true; ctx.beginPath(); ctx.moveTo(e.offsetX, e.offsetY); });\n  c.addEventListener('pointermove', (e) => { if (drawing) draw(e.offsetX, e.offsetY); });\n  c.addEventListener('pointerup', () => { drawing = false; });\n})();",
    "assets": [],
    "demoHint": "Draw on the canvas — submission requires a path-based pointer gesture with no simple tap alternative."
  },
  "expectedFindings": [
    {
      "sc": "2.5.1",
      "outcome": "fail",
      "note": "Specimen demonstrates failure of 2.5.1."
    },
    {
      "sc": "2.1.1",
      "outcome": "fail",
      "note": "Specimen demonstrates failure of 2.1.1."
    },
    {
      "sc": "2.5.2",
      "outcome": "fail",
      "note": "Specimen demonstrates failure of 2.5.2."
    }
  ],
  "mustNotFlag": [],
  "manualCheck": "Confirm the specimen demonstrates the documented F105 failure in isolation.",
  "generated": {
    "url": "https://wcagfail.patternd.io/specimens/F105/",
    "lastmod": "2026-10-08"
  }
}
