@a11y-oracle/axe-bridge 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -49,7 +49,12 @@ const resolved = await resolveAllIncomplete(cdpSession, axeResults);
49
49
  ```typescript
50
50
  const resolved = await resolveAllIncomplete(cdpSession, axeResults, {
51
51
  wcagLevel: 'wcag22aa',
52
- contrast: { threshold: 4.5, largeTextThreshold: 3.0 },
52
+ contrast: {
53
+ threshold: 4.5, // normal text contrast ratio
54
+ largeTextThreshold: 3.0, // large text contrast ratio
55
+ supermajorityPassRatio: 0.75, // auto-pass split decisions when 75%+ pixels pass
56
+ bestCaseMultiplier: 2.0, // auto-pass when best-case CR exceeds 2× threshold
57
+ },
53
58
  focusIndicator: { focusSettleDelay: 150, diffThreshold: 0.2 },
54
59
  skipRules: ['frame-tested'], // skip specific resolvers
55
60
  });
@@ -118,9 +123,14 @@ Orchestrator that pipes results through all 10 resolvers in sequence. Each resol
118
123
 
119
124
  #### `resolveIncompleteContrast(cdp, axeResults, options?)`
120
125
 
121
- Resolves `color-contrast` incomplete entries using CSS halo heuristics and pixel-level screenshot analysis.
126
+ Resolves `color-contrast` incomplete entries using CSS halo heuristics and pixel-level screenshot analysis. Resolved nodes (both passes and violations) are enriched with contrast data in the axe check's `data` field, including `contrastRatio`, `expectedRatio`, `fgColor`, `bgColorLightest`, `bgColorDarkest`, and `algorithm` (`'visual-pixel'` or `'visual-halo'`).
122
127
 
123
- - **Options:** `ContrastResolutionOptions` — `wcagLevel`, `threshold`, `largeTextThreshold`
128
+ - **Options:** `ContrastResolutionOptions`:
129
+ - `wcagLevel` — WCAG conformance level (default: `'wcag22aa'`). Thresholds are derived automatically (AA → 4.5/3.0). Level A has no contrast SC so the resolver is skipped.
130
+ - `threshold` — Override minimum contrast ratio for normal text (overrides `wcagLevel`)
131
+ - `largeTextThreshold` — Override minimum contrast ratio for large text (overrides `wcagLevel`)
132
+ - `supermajorityPassRatio` — During a split decision (one extreme passes, one fails), auto-pass if at least this fraction of pixels pass (default: `0.75`)
133
+ - `bestCaseMultiplier` — During a split decision, auto-pass if the best-case contrast ratio exceeds the threshold multiplied by this value (default: `2.0`)
124
134
  - Automatically detects large text from axe-core's check data (>= 24px or bold >= 18.66px)
125
135
 
126
136
  #### `resolveIdenticalLinksSamePurpose(cdp, axeResults)`
@@ -167,7 +177,7 @@ Resolves `aria-hidden-focus` via a single keyboard Tab traversal across all flag
167
177
 
168
178
  #### `resolveFocusIndicator(cdp, axeResults, options?)`
169
179
 
170
- Resolves `focus-indicator` by pixel-diffing before/after focus screenshots.
180
+ Resolves `focus-indicator` by pixel-diffing before/after focus screenshots. Elements are scrolled into the viewport before capture, ensuring off-screen elements produce valid screenshots. Enables focus emulation via `Emulation.setFocusEmulationEnabled` so focus indicators render even in headless browsers or Cypress AUT iframes.
171
181
 
172
182
  - **Options:** `FocusIndicatorOptions` — `focusSettleDelay` (default: 100), `diffThreshold` (default: 0.1%)
173
183
  - Screenshots are identical → **Violation**; pixels changed → **Pass**
@@ -1 +1 @@
1
- {"version":3,"file":"axe-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/axe-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,KAAK,EACV,UAAU,EAEV,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AA2CpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,UAAU,CAAC,CAgErB"}
1
+ {"version":3,"file":"axe-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/axe-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,KAAK,EACV,UAAU,EAEV,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AA2CpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,UAAU,CAAC,CAoErB"}
@@ -72,7 +72,10 @@ export async function resolveIncompleteContrast(cdp, axeResults, options) {
72
72
  if (!found)
73
73
  return clone;
74
74
  const { index: ccIndex, rule: ccRule } = found;
75
- const analyzer = new VisualContrastAnalyzer(cdp);
75
+ const analyzer = new VisualContrastAnalyzer(cdp, {
76
+ supermajorityPassRatio: options?.supermajorityPassRatio,
77
+ bestCaseMultiplier: options?.bestCaseMultiplier,
78
+ });
76
79
  const passNodes = [];
77
80
  const violationNodes = [];
78
81
  const incompleteNodes = [];
@@ -95,6 +98,7 @@ export async function resolveIncompleteContrast(cdp, axeResults, options) {
95
98
  violationNodes.push(node);
96
99
  break;
97
100
  case 'incomplete':
101
+ enrichNodeWithContrastData(node, result);
98
102
  incompleteNodes.push(node);
99
103
  break;
100
104
  }
@@ -106,6 +106,18 @@ export interface ContrastResolutionOptions {
106
106
  threshold?: number;
107
107
  /** Minimum contrast ratio for large text. Overrides wcagLevel. */
108
108
  largeTextThreshold?: number;
109
+ /**
110
+ * If at least this fraction of pixels pass during a split decision,
111
+ * auto-pass the element (supermajority rule).
112
+ * Default: `0.75`.
113
+ */
114
+ supermajorityPassRatio?: number;
115
+ /**
116
+ * If the best-case extreme CR exceeds the WCAG threshold multiplied
117
+ * by this value, auto-pass regardless of pixel distribution.
118
+ * Default: `2.0`.
119
+ */
120
+ bestCaseMultiplier?: number;
109
121
  }
110
122
  /** Options for the `link-in-text-block` resolver. */
111
123
  export interface LinkInTextBlockOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a11y-oracle/axe-bridge",
3
- "version": "1.1.3",
3
+ "version": "1.2.0",
4
4
  "description": "Axe-core result post-processor that resolves 10 incomplete rules using visual analysis, keyboard interaction, and CDP inspection",
5
5
  "license": "MIT",
6
6
  "author": "a11y-oracle",
@@ -44,10 +44,10 @@
44
44
  "!**/*.tsbuildinfo"
45
45
  ],
46
46
  "dependencies": {
47
- "@a11y-oracle/cdp-types": "1.1.3",
48
- "@a11y-oracle/focus-analyzer": "1.1.3",
49
- "@a11y-oracle/keyboard-engine": "1.1.3",
50
- "@a11y-oracle/visual-engine": "1.1.3",
47
+ "@a11y-oracle/cdp-types": "1.2.0",
48
+ "@a11y-oracle/focus-analyzer": "1.2.0",
49
+ "@a11y-oracle/keyboard-engine": "1.2.0",
50
+ "@a11y-oracle/visual-engine": "1.2.0",
51
51
  "tslib": "^2.3.0"
52
52
  }
53
53
  }