/** * ds-accessibility-report.js * Accessibility audit report using axe-core via MCP browser tools */ import toolBridge from '../../services/tool-bridge.js'; import { ComponentHelpers } from '../../utils/component-helpers.js'; class DSAccessibilityReport extends HTMLElement { constructor() { super(); this.auditResult = null; this.selector = null; this.isRunning = false; } connectedCallback() { this.render(); this.setupEventListeners(); } setupEventListeners() { const runBtn = this.querySelector('#a11y-run-btn'); if (runBtn) { runBtn.addEventListener('click', () => this.runAudit()); } const selectorInput = this.querySelector('#a11y-selector'); if (selectorInput) { selectorInput.addEventListener('change', (e) => { this.selector = e.target.value.trim() || null; }); } } async runAudit() { if (this.isRunning) return; this.isRunning = true; const content = this.querySelector('#a11y-content'); const runBtn = this.querySelector('#a11y-run-btn'); if (!content) { this.isRunning = false; return; } if (runBtn) { runBtn.disabled = true; runBtn.textContent = 'Running Audit...'; } content.innerHTML = ComponentHelpers.renderLoading('Running accessibility audit with axe-core...'); try { const result = await toolBridge.runAccessibilityAudit(this.selector); if (result) { this.auditResult = result; this.renderResults(); } else { content.innerHTML = ComponentHelpers.renderEmpty('No audit results returned', '🔍'); } } catch (error) { console.error('Failed to run accessibility audit:', error); content.innerHTML = ComponentHelpers.renderError('Failed to run accessibility audit', error); } finally { this.isRunning = false; if (runBtn) { runBtn.disabled = false; runBtn.textContent = '▶ Run Audit'; } } } getSeverityIcon(impact) { const icons = { critical: '🔴', serious: '🟠', moderate: '🟡', minor: '🔵' }; return icons[impact] || '⚪'; } getSeverityBadge(impact) { const types = { critical: 'error', serious: 'error', moderate: 'warning', minor: 'info' }; return ComponentHelpers.createBadge(impact.toUpperCase(), types[impact] || 'info'); } renderResults() { const content = this.querySelector('#a11y-content'); if (!content || !this.auditResult) return; const violations = this.auditResult.violations || []; const passes = this.auditResult.passes || []; const incomplete = this.auditResult.incomplete || []; const inapplicable = this.auditResult.inapplicable || []; const totalViolations = violations.length; const totalPasses = passes.length; const totalTests = totalViolations + totalPasses + incomplete.length + inapplicable.length; if (totalViolations === 0) { content.innerHTML = `
All ${totalPasses} accessibility tests passed.
Click "Run Audit" to scan for WCAG violations using axe-core.