@a13y/devtools 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/runtime/warnings/warning-system.ts","../../../src/runtime/warnings/warning-types.ts","../../../src/runtime/validators/aria-validator.ts","../../../src/runtime/validators/focus-validator.ts","../../../src/runtime/validators/keyboard-validator.ts"],"names":["isDevelopment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @a13y/devtools - Warning System\n * Structured warning system with styled console output\n */\n\nimport type { AccessibilityWarning, WarningSeverity } from './warning-types';\n\n/**\n * Console styling for warnings\n */\nconst Styles = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n\n // Colors\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n\n // Backgrounds\n bgRed: '\\x1b[41m',\n bgYellow: '\\x1b[43m',\n bgBlue: '\\x1b[44m',\n} as const;\n\n/**\n * Format a message with console styling\n */\nconst style = (text: string, ...styles: string[]): string => {\n return `${styles.join('')}${text}${Styles.reset}`;\n};\n\n/**\n * Configuration for warning system\n */\nexport interface WarningSystemConfig {\n /**\n * Enable/disable warnings\n * @default true in development\n */\n enabled?: boolean;\n\n /**\n * Minimum severity to show\n * @default 'warn'\n */\n minSeverity?: WarningSeverity;\n\n /**\n * Show element in console\n * @default true\n */\n showElement?: boolean;\n\n /**\n * Show stack traces for errors\n * @default true\n */\n showStackTrace?: boolean;\n\n /**\n * Deduplicate warnings\n * @default true\n */\n deduplicate?: boolean;\n\n /**\n * Custom warning handler\n */\n onWarning?: (warning: AccessibilityWarning) => void;\n}\n\n/**\n * Warning system class\n */\nclass WarningSystemClass {\n private config: Required<WarningSystemConfig> = {\n enabled: true,\n minSeverity: 'warn',\n showElement: true,\n showStackTrace: true,\n deduplicate: true,\n onWarning: () => {},\n };\n\n private warningCache = new Set<string>();\n\n /**\n * Configure the warning system\n */\n configure(config: WarningSystemConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Emit a warning\n */\n warn(warning: AccessibilityWarning): void {\n if (!this.config.enabled) {\n return;\n }\n\n // Check severity threshold\n const severityLevel = { info: 0, warn: 1, error: 2 };\n if (severityLevel[warning.severity] < severityLevel[this.config.minSeverity]) {\n return;\n }\n\n // Deduplicate\n if (this.config.deduplicate) {\n const key = this.getWarningKey(warning);\n if (this.warningCache.has(key)) {\n return;\n }\n this.warningCache.add(key);\n }\n\n // Custom handler\n if (this.config.onWarning) {\n this.config.onWarning(warning);\n }\n\n // Console output\n this.printWarning(warning);\n }\n\n /**\n * Clear warning cache\n */\n clearCache(): void {\n this.warningCache.clear();\n }\n\n /**\n * Generate a unique key for a warning\n */\n private getWarningKey(warning: AccessibilityWarning): string {\n const parts = [warning.code, warning.message];\n\n if (warning.element) {\n // Use element's tag, id, and classes for uniqueness\n const tag = warning.element.tagName.toLowerCase();\n const id = warning.element.id;\n const classes = Array.from(warning.element.classList).join('.');\n parts.push(`${tag}#${id}.${classes}`);\n }\n\n return parts.join('|');\n }\n\n /**\n * Print warning to console\n */\n private printWarning(warning: AccessibilityWarning): void {\n const { severity, code, category, message, element, wcag, fixes } = warning;\n\n // Severity badge\n const badge = this.getSeverityBadge(severity);\n\n // Header\n console.group(\n `${badge} ${style(code, Styles.bold, Styles.cyan)} ${style(category, Styles.dim)}`\n );\n\n // Message\n console.log(style(message, Styles.bold));\n\n // Element\n if (element && this.config.showElement) {\n console.log(style('\\nElement:', Styles.bold));\n console.log(element);\n }\n\n // WCAG info\n if (wcag) {\n console.log(style('\\nWCAG:', Styles.bold), `${wcag.criterion} (Level ${wcag.level})`);\n console.log(style('Learn more:', Styles.blue), wcag.url);\n }\n\n // Fix suggestions\n if (fixes.length > 0) {\n console.log(style('\\nHow to fix:', Styles.bold, Styles.cyan));\n fixes.forEach((fix, index) => {\n console.log(`${index + 1}. ${fix.description}`);\n\n if (fix.example) {\n console.log(style('\\n Example:', Styles.dim));\n console.log(style(` ${fix.example}`, Styles.dim, Styles.gray));\n }\n\n if (fix.learnMoreUrl) {\n console.log(style(' Learn more:', Styles.blue), fix.learnMoreUrl);\n }\n });\n }\n\n // Stack trace for errors\n if (severity === 'error' && this.config.showStackTrace) {\n console.log(style('\\nStack trace:', Styles.dim));\n console.trace();\n }\n\n console.groupEnd();\n console.log(''); // Empty line for spacing\n }\n\n /**\n * Get severity badge for console\n */\n private getSeverityBadge(severity: WarningSeverity): string {\n switch (severity) {\n case 'error':\n return style(' ERROR ', Styles.bold, Styles.bgRed);\n case 'warn':\n return style(' WARN ', Styles.bold, Styles.bgYellow);\n case 'info':\n return style(' INFO ', Styles.bold, Styles.bgBlue);\n }\n }\n}\n\n/**\n * Singleton warning system\n */\nexport const WarningSystem = new WarningSystemClass();\n\n/**\n * Helper to create a warning\n */\nexport const createWarning = (\n partial: Omit<AccessibilityWarning, 'fixes'> & {\n fixes?: AccessibilityWarning['fixes'];\n }\n): AccessibilityWarning => {\n return {\n fixes: [],\n ...partial,\n };\n};\n","/**\n * @a13y/devtools - Warning Types\n * Type definitions for accessibility warnings\n */\n\n/**\n * Warning severity level\n */\nexport type WarningSeverity = 'error' | 'warn' | 'info';\n\n/**\n * WCAG level for the violation\n */\nexport type WCAGLevel = 'A' | 'AA' | 'AAA';\n\n/**\n * Category of accessibility issue\n */\nexport type WarningCategory =\n | 'focus-management'\n | 'keyboard-navigation'\n | 'aria-usage'\n | 'accessible-name'\n | 'semantic-html'\n | 'wcag-compliance'\n | 'performance';\n\n/**\n * Fix suggestion for a warning\n */\nexport interface FixSuggestion {\n /**\n * Description of how to fix the issue\n */\n description: string;\n\n /**\n * Code example showing the fix\n */\n example?: string;\n\n /**\n * Link to documentation\n */\n learnMoreUrl?: string;\n}\n\n/**\n * Accessibility warning\n */\nexport interface AccessibilityWarning {\n /**\n * Unique warning code (e.g., \"A13Y001\")\n */\n code: string;\n\n /**\n * Severity level\n */\n severity: WarningSeverity;\n\n /**\n * Category of the issue\n */\n category: WarningCategory;\n\n /**\n * Human-readable message\n */\n message: string;\n\n /**\n * Element that caused the warning\n */\n element?: Element;\n\n /**\n * WCAG criterion violated\n */\n wcag?: {\n criterion: string;\n level: WCAGLevel;\n url: string;\n };\n\n /**\n * Suggestions for fixing the issue\n */\n fixes: FixSuggestion[];\n\n /**\n * Additional context\n */\n context?: Record<string, unknown>;\n}\n\n/**\n * Warning code definitions\n */\nexport const WarningCodes = {\n // Focus Management (001-099)\n FOCUS_LOST: 'A13Y001',\n FOCUS_NOT_VISIBLE: 'A13Y002',\n FOCUS_TRAP_BROKEN: 'A13Y003',\n FOCUS_ORDER_INVALID: 'A13Y004',\n FOCUS_NOT_RESTORED: 'A13Y005',\n\n // Keyboard Navigation (100-199)\n NOT_KEYBOARD_ACCESSIBLE: 'A13Y100',\n MISSING_KEYBOARD_HANDLER: 'A13Y101',\n INVALID_TABINDEX: 'A13Y102',\n ROVING_TABINDEX_BROKEN: 'A13Y103',\n MISSING_ESC_HANDLER: 'A13Y104',\n\n // Accessible Name (200-299)\n MISSING_ACCESSIBLE_NAME: 'A13Y200',\n EMPTY_ACCESSIBLE_NAME: 'A13Y201',\n DUPLICATE_ID: 'A13Y202',\n INVALID_LABELLEDBY: 'A13Y203',\n PLACEHOLDER_AS_LABEL: 'A13Y204',\n\n // ARIA Usage (300-399)\n INVALID_ARIA_ROLE: 'A13Y300',\n INVALID_ARIA_ATTRIBUTE: 'A13Y301',\n CONFLICTING_ARIA: 'A13Y302',\n REDUNDANT_ARIA: 'A13Y303',\n MISSING_REQUIRED_ARIA: 'A13Y304',\n INVALID_ARIA_VALUE: 'A13Y305',\n\n // Semantic HTML (400-499)\n DIV_BUTTON: 'A13Y400',\n DIV_LINK: 'A13Y401',\n MISSING_LANDMARK: 'A13Y402',\n INVALID_NESTING: 'A13Y403',\n\n // WCAG Compliance (500-599)\n CONTRAST_INSUFFICIENT: 'A13Y500',\n TARGET_SIZE_TOO_SMALL: 'A13Y501',\n ANIMATION_NO_REDUCE_MOTION: 'A13Y502',\n\n // Performance (600-699)\n TOO_MANY_LIVE_REGIONS: 'A13Y600',\n EXCESSIVE_ANNOUNCEMENTS: 'A13Y601',\n} as const;\n\n/**\n * WCAG criterion URLs\n */\nexport const WCAGUrls = {\n '1.3.1': 'https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html',\n '1.4.3': 'https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html',\n '2.1.1': 'https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html',\n '2.1.2': 'https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html',\n '2.4.3': 'https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html',\n '2.4.7': 'https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html',\n '2.5.5': 'https://www.w3.org/WAI/WCAG22/Understanding/target-size.html',\n '4.1.2': 'https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html',\n '4.1.3': 'https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html',\n} as const;\n","/**\n * @a13y/devtools - ARIA Validator\n * Validates ARIA attributes and usage\n */\n\nimport { isDevelopment } from '@a13y/core/runtime/env';\nimport { createWarning, WarningSystem } from '../warnings/warning-system';\nimport { WarningCodes, WCAGUrls } from '../warnings/warning-types';\n\n/**\n * Valid ARIA roles\n */\nconst VALID_ROLES = new Set([\n 'alert',\n 'alertdialog',\n 'application',\n 'article',\n 'banner',\n 'button',\n 'cell',\n 'checkbox',\n 'columnheader',\n 'combobox',\n 'complementary',\n 'contentinfo',\n 'definition',\n 'dialog',\n 'directory',\n 'document',\n 'feed',\n 'figure',\n 'form',\n 'grid',\n 'gridcell',\n 'group',\n 'heading',\n 'img',\n 'link',\n 'list',\n 'listbox',\n 'listitem',\n 'log',\n 'main',\n 'marquee',\n 'math',\n 'menu',\n 'menubar',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'navigation',\n 'none',\n 'note',\n 'option',\n 'presentation',\n 'progressbar',\n 'radio',\n 'radiogroup',\n 'region',\n 'row',\n 'rowgroup',\n 'rowheader',\n 'scrollbar',\n 'search',\n 'searchbox',\n 'separator',\n 'slider',\n 'spinbutton',\n 'status',\n 'switch',\n 'tab',\n 'table',\n 'tablist',\n 'tabpanel',\n 'term',\n 'textbox',\n 'timer',\n 'toolbar',\n 'tooltip',\n 'tree',\n 'treegrid',\n 'treeitem',\n]);\n\n/**\n * Required ARIA attributes for specific roles\n */\nconst REQUIRED_ARIA_PROPS: Record<string, string[]> = {\n checkbox: ['aria-checked'],\n combobox: ['aria-expanded', 'aria-controls'],\n gridcell: ['aria-colindex'],\n heading: ['aria-level'],\n listbox: ['aria-orientation'],\n option: ['aria-selected'],\n progressbar: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax'],\n radio: ['aria-checked'],\n scrollbar: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax', 'aria-controls'],\n separator: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax'],\n slider: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax'],\n spinbutton: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax'],\n switch: ['aria-checked'],\n tab: ['aria-selected'],\n tabpanel: ['aria-labelledby'],\n textbox: ['aria-multiline'],\n treegrid: ['aria-multiselectable'],\n};\n\n/**\n * Global ARIA attributes (can be used on any element)\n */\nconst GLOBAL_ARIA_ATTRS = new Set([\n 'aria-atomic',\n 'aria-busy',\n 'aria-controls',\n 'aria-current',\n 'aria-describedby',\n 'aria-details',\n 'aria-disabled',\n 'aria-dropeffect',\n 'aria-errormessage',\n 'aria-flowto',\n 'aria-grabbed',\n 'aria-haspopup',\n 'aria-hidden',\n 'aria-invalid',\n 'aria-keyshortcuts',\n 'aria-label',\n 'aria-labelledby',\n 'aria-live',\n 'aria-owns',\n 'aria-relevant',\n 'aria-roledescription',\n]);\n\n/**\n * ARIA validator class\n */\nexport class AriaValidator {\n /**\n * Validate ARIA attributes on an element\n */\n validateElement(element: Element): void {\n if (!isDevelopment()) {\n return;\n }\n\n const role = element.getAttribute('role');\n const ariaAttrs = this.getAriaAttributes(element);\n\n // Validate role\n if (role) {\n this.validateRole(element, role);\n }\n\n // Validate ARIA attributes\n ariaAttrs.forEach((attr) => {\n this.validateAriaAttribute(element, attr, role);\n });\n\n // Check for required ARIA props\n if (role && REQUIRED_ARIA_PROPS[role]) {\n this.validateRequiredProps(element, role);\n }\n\n // Check for redundant ARIA\n this.checkRedundantAria(element, role);\n\n // Check for conflicting ARIA\n this.checkConflictingAria(element, ariaAttrs);\n }\n\n /**\n * Validate accessible name\n */\n validateAccessibleName(element: Element, context?: string): void {\n if (!isDevelopment()) {\n return;\n }\n\n // Import at runtime to avoid circular deps\n import('@a13y/core/runtime/aria')\n .then(({ getAccessibleName }) => {\n const name = getAccessibleName(element);\n\n if (!name || name.trim().length === 0) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.MISSING_ACCESSIBLE_NAME,\n severity: 'error',\n category: 'accessible-name',\n message: `Element is missing an accessible name${context ? ` in ${context}` : ''}`,\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: 'Add aria-label',\n example: `<${element.tagName.toLowerCase()} aria-label=\"Description\">`,\n },\n {\n description: 'Add text content',\n example: `<${element.tagName.toLowerCase()}>Button text</${element.tagName.toLowerCase()}>`,\n },\n {\n description: 'Use aria-labelledby',\n example: `<${element.tagName.toLowerCase()} aria-labelledby=\"label-id\">`,\n },\n ],\n })\n );\n }\n\n // Warn if using placeholder as label\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const placeholder = element.placeholder;\n if (placeholder && (!name || name === placeholder)) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.PLACEHOLDER_AS_LABEL,\n severity: 'warn',\n category: 'accessible-name',\n message: 'Using placeholder as accessible name is not recommended',\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: 'Add a visible label',\n example: `<label for=\"input-id\">Label text</label>\n<input id=\"input-id\" placeholder=\"Example\">`,\n },\n {\n description: 'Add aria-label',\n example: `<input aria-label=\"Label text\" placeholder=\"Example\">`,\n },\n ],\n })\n );\n }\n }\n })\n .catch(() => {\n // Silently fail if @a13y/core is not available\n });\n }\n\n /**\n * Validate role attribute\n */\n private validateRole(element: Element, role: string): void {\n if (!VALID_ROLES.has(role)) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.INVALID_ARIA_ROLE,\n severity: 'error',\n category: 'aria-usage',\n message: `Invalid ARIA role: \"${role}\"`,\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: 'Use a valid ARIA role from the specification',\n learnMoreUrl: 'https://www.w3.org/TR/wai-aria-1.2/#role_definitions',\n },\n {\n description: 'Remove the role attribute if not needed',\n },\n ],\n })\n );\n }\n }\n\n /**\n * Validate ARIA attribute\n */\n private validateAriaAttribute(element: Element, attr: string, role: string | null): void {\n // Check if attribute name is valid (starts with aria-)\n if (!attr.startsWith('aria-')) {\n return;\n }\n\n // Extract value\n const value = element.getAttribute(attr);\n\n // Validate boolean attributes\n if (\n [\n 'aria-atomic',\n 'aria-busy',\n 'aria-disabled',\n 'aria-hidden',\n 'aria-multiline',\n 'aria-multiselectable',\n 'aria-readonly',\n 'aria-required',\n ].includes(attr)\n ) {\n if (value !== 'true' && value !== 'false') {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.INVALID_ARIA_VALUE,\n severity: 'warn',\n category: 'aria-usage',\n message: `ARIA attribute \"${attr}\" must be \"true\" or \"false\", got \"${value}\"`,\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: 'Use \"true\" or \"false\"',\n example: `<element ${attr}=\"true\">`,\n },\n ],\n })\n );\n }\n }\n\n // Validate ID references\n if (['aria-labelledby', 'aria-describedby', 'aria-controls', 'aria-owns'].includes(attr)) {\n this.validateIdReferences(element, attr, value);\n }\n\n // Validate that attribute is appropriate for role\n if (role && !GLOBAL_ARIA_ATTRS.has(attr)) {\n // This is simplified - full validation would need role-specific allowed attrs\n // For now, we just ensure it's not obviously wrong\n }\n }\n\n /**\n * Validate ID references in ARIA attributes\n */\n private validateIdReferences(element: Element, attr: string, value: string | null): void {\n if (!value) return;\n\n const ids = value.split(/\\s+/);\n\n ids.forEach((id) => {\n const referencedElement = document.getElementById(id);\n\n if (!referencedElement) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.INVALID_LABELLEDBY,\n severity: 'warn',\n category: 'aria-usage',\n message: `${attr} references non-existent element with id=\"${id}\"`,\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: 'Ensure the referenced element exists',\n example: `<div id=\"${id}\">Label text</div>\n<button ${attr}=\"${id}\">Button</button>`,\n },\n {\n description: 'Use aria-label instead',\n example: `<button aria-label=\"Button text\">Button</button>`,\n },\n ],\n })\n );\n }\n });\n\n // Check for duplicate IDs in the document\n const allElements = document.querySelectorAll(`[id]`);\n const idCounts = new Map<string, number>();\n\n allElements.forEach((el) => {\n const id = el.id;\n idCounts.set(id, (idCounts.get(id) || 0) + 1);\n });\n\n ids.forEach((id) => {\n if ((idCounts.get(id) || 0) > 1) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.DUPLICATE_ID,\n severity: 'error',\n category: 'aria-usage',\n message: `Duplicate id=\"${id}\" found in document`,\n element,\n wcag: {\n criterion: '4.1.1',\n level: 'A',\n url: 'https://www.w3.org/WAI/WCAG22/Understanding/parsing.html',\n },\n fixes: [\n {\n description: 'Ensure all IDs are unique',\n example: `<!-- Make sure each ID is used only once -->\n<div id=\"unique-id-1\">First</div>\n<div id=\"unique-id-2\">Second</div>`,\n },\n ],\n })\n );\n }\n });\n }\n\n /**\n * Validate required ARIA props for a role\n */\n private validateRequiredProps(element: Element, role: string): void {\n const requiredProps = REQUIRED_ARIA_PROPS[role] || [];\n\n requiredProps.forEach((prop) => {\n if (!element.hasAttribute(prop)) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.MISSING_REQUIRED_ARIA,\n severity: 'error',\n category: 'aria-usage',\n message: `Role \"${role}\" requires \"${prop}\" attribute`,\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: `Add the required ${prop} attribute`,\n example: `<${element.tagName.toLowerCase()} role=\"${role}\" ${prop}=\"value\">`,\n learnMoreUrl: `https://www.w3.org/TR/wai-aria-1.2/#${role}`,\n },\n ],\n })\n );\n }\n });\n }\n\n /**\n * Check for redundant ARIA\n */\n private checkRedundantAria(element: Element, role: string | null): void {\n const tagName = element.tagName.toLowerCase();\n\n // Check for redundant role on semantic elements\n const implicitRoles: Record<string, string> = {\n button: 'button',\n a: 'link',\n nav: 'navigation',\n main: 'main',\n header: 'banner',\n footer: 'contentinfo',\n article: 'article',\n aside: 'complementary',\n section: 'region',\n };\n\n if (role && implicitRoles[tagName] === role) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.REDUNDANT_ARIA,\n severity: 'info',\n category: 'aria-usage',\n message: `Role \"${role}\" is redundant on <${tagName}>`,\n element,\n fixes: [\n {\n description: 'Remove the redundant role attribute',\n example: `<${tagName}> (role=\"${role}\" is implicit)`,\n },\n ],\n })\n );\n }\n }\n\n /**\n * Check for conflicting ARIA attributes\n */\n private checkConflictingAria(element: Element, ariaAttrs: string[]): void {\n // Check for aria-label and aria-labelledby together\n if (ariaAttrs.includes('aria-label') && ariaAttrs.includes('aria-labelledby')) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.CONFLICTING_ARIA,\n severity: 'warn',\n category: 'aria-usage',\n message: 'Element has both aria-label and aria-labelledby (labelledby takes precedence)',\n element,\n fixes: [\n {\n description: 'Remove aria-label and keep aria-labelledby',\n example: `<element aria-labelledby=\"label-id\">`,\n },\n {\n description: 'Remove aria-labelledby and keep aria-label',\n example: `<element aria-label=\"Label text\">`,\n },\n ],\n })\n );\n }\n\n // Check for aria-hidden=\"true\" on focusable element\n if (element.getAttribute('aria-hidden') === 'true') {\n const isFocusable =\n element instanceof HTMLButtonElement ||\n element instanceof HTMLAnchorElement ||\n element instanceof HTMLInputElement ||\n (element.hasAttribute('tabindex') &&\n parseInt(element.getAttribute('tabindex') || '0', 10) >= 0);\n\n if (isFocusable) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.CONFLICTING_ARIA,\n severity: 'error',\n category: 'aria-usage',\n message: 'Focusable element has aria-hidden=\"true\"',\n element,\n wcag: {\n criterion: '4.1.2',\n level: 'A',\n url: WCAGUrls['4.1.2'],\n },\n fixes: [\n {\n description: 'Remove aria-hidden',\n example: `<button>Visible button</button>`,\n },\n {\n description: 'Make element non-focusable',\n example: `<div aria-hidden=\"true\" tabindex=\"-1\">Hidden content</div>`,\n },\n ],\n })\n );\n }\n }\n }\n\n /**\n * Get all ARIA attributes from an element\n */\n private getAriaAttributes(element: Element): string[] {\n return Array.from(element.attributes)\n .filter((attr) => attr.name.startsWith('aria-'))\n .map((attr) => attr.name);\n }\n}\n\n/**\n * Singleton ARIA validator\n */\nexport const ariaValidator = new AriaValidator();\n","/**\n * @a13y/devtools - Focus Validator\n * Validates focus management and visual focus indicators\n */\n\nimport { isDevelopment } from '@a13y/core/runtime/env';\nimport { createWarning, WarningSystem } from '../warnings/warning-system';\nimport { WarningCodes, WCAGUrls } from '../warnings/warning-types';\n\n/**\n * Focus validator class\n */\nexport class FocusValidator {\n private focusHistory: Element[] = [];\n private isActive = false;\n\n /**\n * Start monitoring focus changes\n */\n start(): void {\n if (!isDevelopment() || this.isActive) {\n return;\n }\n\n document.addEventListener('focusin', this.handleFocusIn);\n document.addEventListener('focusout', this.handleFocusOut);\n\n this.isActive = true;\n }\n\n /**\n * Stop monitoring focus changes\n */\n stop(): void {\n if (!this.isActive) {\n return;\n }\n\n document.removeEventListener('focusin', this.handleFocusIn);\n document.removeEventListener('focusout', this.handleFocusOut);\n\n this.isActive = false;\n this.focusHistory = [];\n }\n\n /**\n * Validate that focus is visible\n */\n validateFocusVisible(element: Element): void {\n if (!isDevelopment()) {\n return;\n }\n\n if (!(element instanceof HTMLElement)) {\n return;\n }\n\n // Check if element has visible focus indicator\n const computedStyle = window.getComputedStyle(element);\n const outline = computedStyle.outline;\n const outlineWidth = computedStyle.outlineWidth;\n\n const hasFocusIndicator = outline !== 'none' && outlineWidth !== '0px' && outlineWidth !== '0';\n\n if (!hasFocusIndicator) {\n // Check for custom focus styles (data-focus-visible-added or :focus-visible support)\n const hasCustomFocus =\n element.hasAttribute('data-focus-visible-added') || element.matches(':focus-visible');\n\n if (!hasCustomFocus) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.FOCUS_NOT_VISIBLE,\n severity: 'warn',\n category: 'focus-management',\n message: 'Focused element has no visible focus indicator',\n element,\n wcag: {\n criterion: '2.4.7',\n level: 'AA',\n url: WCAGUrls['2.4.7'],\n },\n fixes: [\n {\n description: 'Add a visible outline or border on focus',\n example: `.my-element:focus {\n outline: 2px solid blue;\n outline-offset: 2px;\n}`,\n },\n {\n description: 'Use :focus-visible for keyboard-only focus indicators',\n example: `.my-element:focus-visible {\n outline: 2px solid blue;\n}`,\n },\n {\n description: 'Use FocusVisible from @a13y/core',\n example: `import { FocusVisible } from '@a13y/core/runtime/focus';\nFocusVisible.init();\n\n// Then in CSS:\n[data-focus-visible-added] {\n outline: 2px solid blue;\n}`,\n },\n ],\n })\n );\n }\n }\n }\n\n /**\n * Validate focus trap\n */\n validateFocusTrap(container: Element, expectedTrapped: boolean): void {\n if (!isDevelopment()) {\n return;\n }\n\n // Simulate Tab key to check if focus escapes\n const focusableElements = this.getFocusableElements(container);\n\n if (focusableElements.length === 0) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.FOCUS_TRAP_BROKEN,\n severity: 'error',\n category: 'focus-management',\n message: 'Focus trap container has no focusable elements',\n element: container,\n wcag: {\n criterion: '2.1.2',\n level: 'A',\n url: WCAGUrls['2.1.2'],\n },\n fixes: [\n {\n description: 'Add at least one focusable element inside the container',\n example: `<div role=\"dialog\">\n <button>Close</button>\n</div>`,\n },\n {\n description: 'Make container focusable with tabindex=\"-1\"',\n example: `<div role=\"dialog\" tabindex=\"-1\">\n Content\n</div>`,\n },\n ],\n })\n );\n }\n\n if (expectedTrapped && focusableElements.length > 0) {\n const lastElement = focusableElements[focusableElements.length - 1];\n\n // Check if Tab from last element returns to first\n if (document.activeElement === lastElement) {\n // This is a simplified check - in real usage, we'd need to simulate Tab\n // For now, we'll just warn if the setup looks suspicious\n const hasTabHandler = container.getAttribute('data-focus-trap') === 'true';\n\n if (!hasTabHandler) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.FOCUS_TRAP_BROKEN,\n severity: 'warn',\n category: 'focus-management',\n message: 'Focus trap may not be working correctly',\n element: container,\n wcag: {\n criterion: '2.1.2',\n level: 'A',\n url: WCAGUrls['2.1.2'],\n },\n fixes: [\n {\n description: 'Use createFocusTrap from @a13y/core',\n example: `import { createFocusTrap } from '@a13y/core/runtime/focus';\n\nconst trap = createFocusTrap(container);\ntrap.activate();`,\n },\n ],\n })\n );\n }\n }\n }\n }\n\n /**\n * Validate focus order\n */\n validateFocusOrder(container: Element): void {\n if (!isDevelopment()) {\n return;\n }\n\n const focusableElements = this.getFocusableElements(container);\n\n // Check for positive tabindex (creates confusing tab order)\n focusableElements.forEach((element) => {\n const tabindex = element.getAttribute('tabindex');\n if (tabindex && parseInt(tabindex, 10) > 0) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.FOCUS_ORDER_INVALID,\n severity: 'warn',\n category: 'focus-management',\n message: `Positive tabindex (${tabindex}) creates confusing focus order`,\n element,\n wcag: {\n criterion: '2.4.3',\n level: 'A',\n url: WCAGUrls['2.4.3'],\n },\n fixes: [\n {\n description: 'Remove positive tabindex and restructure DOM',\n example: `<!-- Instead of using tabindex to change order -->\n<div tabindex=\"2\">Second</div>\n<div tabindex=\"1\">First</div>\n\n<!-- Restructure DOM to match desired order -->\n<div tabindex=\"0\">First</div>\n<div tabindex=\"0\">Second</div>`,\n },\n ],\n })\n );\n }\n });\n\n // Check for non-sequential visual order\n // This would require measuring element positions - simplified for now\n }\n\n /**\n * Track focus restoration after actions\n */\n expectFocusRestoration(expectedElement: Element, action: string): void {\n if (!isDevelopment()) {\n return;\n }\n\n // Wait for async operations to complete\n setTimeout(() => {\n if (document.activeElement !== expectedElement) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.FOCUS_NOT_RESTORED,\n severity: 'warn',\n category: 'focus-management',\n message: `Focus was not restored after ${action}`,\n element: expectedElement,\n wcag: {\n criterion: '2.4.3',\n level: 'A',\n url: WCAGUrls['2.4.3'],\n },\n fixes: [\n {\n description: 'Restore focus to the expected element',\n example: `// Save focus before action\nconst returnElement = document.activeElement;\n\n// Perform action\nperformAction();\n\n// Restore focus\nreturnElement?.focus();`,\n },\n {\n description: 'Use FocusManager.saveFocus()',\n example: `import { FocusManager } from '@a13y/core/runtime/focus';\n\nconst restore = FocusManager.saveFocus();\nperformAction();\nrestore();`,\n },\n ],\n })\n );\n }\n }, 100);\n }\n\n private handleFocusIn = (event: FocusEvent): void => {\n const target = event.target as Element;\n\n if (target && target !== document.body) {\n this.focusHistory.push(target);\n\n // Keep history limited\n if (this.focusHistory.length > 10) {\n this.focusHistory.shift();\n }\n\n // Validate focus visible\n this.validateFocusVisible(target);\n }\n };\n\n private handleFocusOut = (_event: FocusEvent): void => {\n // Track focus changes\n };\n\n private getFocusableElements(container: Element): HTMLElement[] {\n const selector = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',');\n\n return Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n }\n}\n\n/**\n * Singleton focus validator\n */\nexport const focusValidator = new FocusValidator();\n","/**\n * @a13y/devtools - Keyboard Validator\n * Validates keyboard accessibility\n */\n\nimport { isDevelopment } from '@a13y/core/runtime/env';\nimport { createWarning, WarningSystem } from '../warnings/warning-system';\nimport { WarningCodes, WCAGUrls } from '../warnings/warning-types';\n\n/**\n * Interactive element that should be keyboard accessible\n */\ninterface InteractiveElement {\n element: Element;\n hasClickHandler: boolean;\n hasKeyHandler: boolean;\n isFocusable: boolean;\n}\n\n/**\n * Keyboard validator class\n */\nexport class KeyboardValidator {\n /**\n * Validate that interactive elements are keyboard accessible\n */\n validateInteractiveElement(element: Element): void {\n if (!isDevelopment()) {\n return;\n }\n\n const info = this.analyzeElement(element);\n\n // Check if element has click handler but no keyboard access\n if (info.hasClickHandler && !info.isFocusable) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.NOT_KEYBOARD_ACCESSIBLE,\n severity: 'error',\n category: 'keyboard-navigation',\n message: 'Interactive element is not keyboard accessible',\n element,\n wcag: {\n criterion: '2.1.1',\n level: 'A',\n url: WCAGUrls['2.1.1'],\n },\n fixes: [\n {\n description: 'Use a semantic button element',\n example: `<button onClick={handleClick}>Click me</button>`,\n },\n {\n description: 'Add tabindex=\"0\" and keyboard handlers',\n example: `<div\n tabindex=\"0\"\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }}\n>\n Click me\n</div>`,\n },\n ],\n })\n );\n }\n\n // Check if element has click but no keyboard handler\n if (info.hasClickHandler && info.isFocusable && !info.hasKeyHandler) {\n // Only warn for non-semantic elements\n const isSemanticInteractive =\n element instanceof HTMLButtonElement ||\n (element instanceof HTMLAnchorElement && element.hasAttribute('href')) ||\n element instanceof HTMLInputElement;\n\n if (!isSemanticInteractive) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.MISSING_KEYBOARD_HANDLER,\n severity: 'warn',\n category: 'keyboard-navigation',\n message: 'Element has click handler but no keyboard event handler',\n element,\n wcag: {\n criterion: '2.1.1',\n level: 'A',\n url: WCAGUrls['2.1.1'],\n },\n fixes: [\n {\n description: 'Add onKeyDown handler for Enter and Space keys',\n example: `element.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n // Trigger click or custom action\n }\n});`,\n },\n ],\n })\n );\n }\n }\n\n // Check for divs/spans styled as buttons\n this.checkForDivButton(element);\n }\n\n /**\n * Validate that a container's children are reachable via keyboard\n */\n validateContainer(container: Element): void {\n if (!isDevelopment()) {\n return;\n }\n\n const interactiveElements = this.findInteractiveElements(container);\n\n interactiveElements.forEach((info) => {\n if (info.hasClickHandler && !info.isFocusable) {\n this.validateInteractiveElement(info.element);\n }\n });\n }\n\n /**\n * Validate roving tabindex implementation\n */\n validateRovingTabindex(container: Element): void {\n if (!isDevelopment()) {\n return;\n }\n\n const items = Array.from(container.children);\n const tabindexValues = items.map((item) =>\n item.hasAttribute('tabindex') ? parseInt(item.getAttribute('tabindex') || '0', 10) : null\n );\n\n // Check if exactly one item has tabindex=\"0\" and others have tabindex=\"-1\"\n const zeroCount = tabindexValues.filter((v) => v === 0).length;\n const negativeOneCount = tabindexValues.filter((v) => v === -1).length;\n\n if (zeroCount !== 1 || negativeOneCount !== items.length - 1) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.ROVING_TABINDEX_BROKEN,\n severity: 'warn',\n category: 'keyboard-navigation',\n message: 'Roving tabindex pattern is not correctly implemented',\n element: container,\n wcag: {\n criterion: '2.1.1',\n level: 'A',\n url: WCAGUrls['2.1.1'],\n },\n fixes: [\n {\n description: 'Set exactly one item to tabindex=\"0\" and all others to tabindex=\"-1\"',\n example: `<!-- Correct roving tabindex -->\n<div role=\"toolbar\">\n <button tabindex=\"0\">First (active)</button>\n <button tabindex=\"-1\">Second</button>\n <button tabindex=\"-1\">Third</button>\n</div>`,\n },\n {\n description: 'Use RovingTabindexManager from @a13y/core',\n example: `import { RovingTabindexManager } from '@a13y/core/runtime/keyboard';\n\nconst manager = new RovingTabindexManager(toolbar, {\n orientation: 'horizontal',\n});\nmanager.init();`,\n },\n ],\n })\n );\n }\n }\n\n /**\n * Check for escape key handler in dialogs/modals\n */\n validateEscapeHandler(container: Element, shouldHaveEscape: boolean): void {\n if (!isDevelopment() || !shouldHaveEscape) {\n return;\n }\n\n // Check if container or any child has keydown listener\n // This is a simplified check - in practice, we'd need to track listeners\n const hasEscapeAttr = container.hasAttribute('data-escape-closes');\n\n if (!hasEscapeAttr) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.MISSING_ESC_HANDLER,\n severity: 'warn',\n category: 'keyboard-navigation',\n message: 'Dialog/Modal should close on Escape key',\n element: container,\n wcag: {\n criterion: '2.1.2',\n level: 'A',\n url: WCAGUrls['2.1.2'],\n },\n fixes: [\n {\n description: 'Add Escape key handler',\n example: `container.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n closeDialog();\n }\n});`,\n },\n {\n description: 'Use createFocusTrap with onEscape callback',\n example: `import { createFocusTrap } from '@a13y/core/runtime/focus';\n\nconst trap = createFocusTrap(dialog, {\n onEscape: () => closeDialog(),\n});`,\n },\n ],\n })\n );\n }\n }\n\n /**\n * Analyze an element for keyboard accessibility\n */\n private analyzeElement(element: Element): InteractiveElement {\n // Check for click handlers (including React/Vue event handlers)\n const hasClickHandler =\n element.hasAttribute('onclick') ||\n element.hasAttribute('@click') ||\n element.hasAttribute('v-on:click') ||\n // Check for React synthetic events (harder to detect)\n Object.keys(element).some((key) => key.startsWith('__react'));\n\n // Check for keyboard handlers\n const hasKeyHandler =\n element.hasAttribute('onkeydown') ||\n element.hasAttribute('onkeyup') ||\n element.hasAttribute('onkeypress') ||\n element.hasAttribute('@keydown') ||\n element.hasAttribute('v-on:keydown');\n\n // Check if focusable\n const isFocusable = this.isFocusable(element);\n\n return {\n element,\n hasClickHandler,\n hasKeyHandler,\n isFocusable,\n };\n }\n\n /**\n * Check if element is focusable\n */\n private isFocusable(element: Element): boolean {\n // Semantic interactive elements\n if (\n element instanceof HTMLButtonElement ||\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement ||\n (element instanceof HTMLAnchorElement && element.hasAttribute('href'))\n ) {\n return true;\n }\n\n // Elements with tabindex >= 0\n const tabindex = element.getAttribute('tabindex');\n if (tabindex !== null && parseInt(tabindex, 10) >= 0) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Find all interactive elements in a container\n */\n private findInteractiveElements(container: Element): InteractiveElement[] {\n const elements: InteractiveElement[] = [];\n\n // Find elements with click handlers\n const clickableSelector = '[onclick], [data-clickable]';\n const clickables = container.querySelectorAll(clickableSelector);\n\n clickables.forEach((element) => {\n elements.push(this.analyzeElement(element));\n });\n\n return elements;\n }\n\n /**\n * Check for div/span styled as button (antipattern)\n */\n private checkForDivButton(element: Element): void {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === 'div' || tagName === 'span') {\n const role = element.getAttribute('role');\n const hasClickHandler =\n element.hasAttribute('onclick') ||\n Object.keys(element).some((key) => key.startsWith('__react'));\n\n if ((role === 'button' || hasClickHandler) && !this.isFocusable(element)) {\n WarningSystem.warn(\n createWarning({\n code: WarningCodes.DIV_BUTTON,\n severity: 'warn',\n category: 'semantic-html',\n message: `<${tagName}> used as button - use <button> instead`,\n element,\n fixes: [\n {\n description: 'Use a semantic <button> element',\n example: `<!-- Instead of -->\n<div role=\"button\" onClick={handleClick}>Click me</div>\n\n<!-- Use -->\n<button onClick={handleClick}>Click me</button>`,\n },\n {\n description: 'If you must use a div, add tabindex and keyboard handlers',\n example: `<div\n role=\"button\"\n tabindex=\"0\"\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }}\n>\n Click me\n</div>`,\n },\n ],\n })\n );\n }\n }\n }\n}\n\n/**\n * Singleton keyboard validator\n */\nexport const keyboardValidator = new KeyboardValidator();\n"]}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * @a13y/devtools - Warning Types
3
+ * Type definitions for accessibility warnings
4
+ */
5
+ /**
6
+ * Warning severity level
7
+ */
8
+ type WarningSeverity = 'error' | 'warn' | 'info';
9
+ /**
10
+ * WCAG level for the violation
11
+ */
12
+ type WCAGLevel = 'A' | 'AA' | 'AAA';
13
+ /**
14
+ * Category of accessibility issue
15
+ */
16
+ type WarningCategory = 'focus-management' | 'keyboard-navigation' | 'aria-usage' | 'accessible-name' | 'semantic-html' | 'wcag-compliance' | 'performance';
17
+ /**
18
+ * Fix suggestion for a warning
19
+ */
20
+ interface FixSuggestion {
21
+ /**
22
+ * Description of how to fix the issue
23
+ */
24
+ description: string;
25
+ /**
26
+ * Code example showing the fix
27
+ */
28
+ example?: string;
29
+ /**
30
+ * Link to documentation
31
+ */
32
+ learnMoreUrl?: string;
33
+ }
34
+ /**
35
+ * Accessibility warning
36
+ */
37
+ interface AccessibilityWarning {
38
+ /**
39
+ * Unique warning code (e.g., "A13Y001")
40
+ */
41
+ code: string;
42
+ /**
43
+ * Severity level
44
+ */
45
+ severity: WarningSeverity;
46
+ /**
47
+ * Category of the issue
48
+ */
49
+ category: WarningCategory;
50
+ /**
51
+ * Human-readable message
52
+ */
53
+ message: string;
54
+ /**
55
+ * Element that caused the warning
56
+ */
57
+ element?: Element;
58
+ /**
59
+ * WCAG criterion violated
60
+ */
61
+ wcag?: {
62
+ criterion: string;
63
+ level: WCAGLevel;
64
+ url: string;
65
+ };
66
+ /**
67
+ * Suggestions for fixing the issue
68
+ */
69
+ fixes: FixSuggestion[];
70
+ /**
71
+ * Additional context
72
+ */
73
+ context?: Record<string, unknown>;
74
+ }
75
+ /**
76
+ * Warning code definitions
77
+ */
78
+ declare const WarningCodes: {
79
+ readonly FOCUS_LOST: "A13Y001";
80
+ readonly FOCUS_NOT_VISIBLE: "A13Y002";
81
+ readonly FOCUS_TRAP_BROKEN: "A13Y003";
82
+ readonly FOCUS_ORDER_INVALID: "A13Y004";
83
+ readonly FOCUS_NOT_RESTORED: "A13Y005";
84
+ readonly NOT_KEYBOARD_ACCESSIBLE: "A13Y100";
85
+ readonly MISSING_KEYBOARD_HANDLER: "A13Y101";
86
+ readonly INVALID_TABINDEX: "A13Y102";
87
+ readonly ROVING_TABINDEX_BROKEN: "A13Y103";
88
+ readonly MISSING_ESC_HANDLER: "A13Y104";
89
+ readonly MISSING_ACCESSIBLE_NAME: "A13Y200";
90
+ readonly EMPTY_ACCESSIBLE_NAME: "A13Y201";
91
+ readonly DUPLICATE_ID: "A13Y202";
92
+ readonly INVALID_LABELLEDBY: "A13Y203";
93
+ readonly PLACEHOLDER_AS_LABEL: "A13Y204";
94
+ readonly INVALID_ARIA_ROLE: "A13Y300";
95
+ readonly INVALID_ARIA_ATTRIBUTE: "A13Y301";
96
+ readonly CONFLICTING_ARIA: "A13Y302";
97
+ readonly REDUNDANT_ARIA: "A13Y303";
98
+ readonly MISSING_REQUIRED_ARIA: "A13Y304";
99
+ readonly INVALID_ARIA_VALUE: "A13Y305";
100
+ readonly DIV_BUTTON: "A13Y400";
101
+ readonly DIV_LINK: "A13Y401";
102
+ readonly MISSING_LANDMARK: "A13Y402";
103
+ readonly INVALID_NESTING: "A13Y403";
104
+ readonly CONTRAST_INSUFFICIENT: "A13Y500";
105
+ readonly TARGET_SIZE_TOO_SMALL: "A13Y501";
106
+ readonly ANIMATION_NO_REDUCE_MOTION: "A13Y502";
107
+ readonly TOO_MANY_LIVE_REGIONS: "A13Y600";
108
+ readonly EXCESSIVE_ANNOUNCEMENTS: "A13Y601";
109
+ };
110
+ /**
111
+ * WCAG criterion URLs
112
+ */
113
+ declare const WCAGUrls: {
114
+ readonly '1.3.1': "https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html";
115
+ readonly '1.4.3': "https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html";
116
+ readonly '2.1.1': "https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html";
117
+ readonly '2.1.2': "https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html";
118
+ readonly '2.4.3': "https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html";
119
+ readonly '2.4.7': "https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html";
120
+ readonly '2.5.5': "https://www.w3.org/WAI/WCAG22/Understanding/target-size.html";
121
+ readonly '4.1.2': "https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html";
122
+ readonly '4.1.3': "https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html";
123
+ };
124
+
125
+ /**
126
+ * @a13y/devtools - Warning System
127
+ * Structured warning system with styled console output
128
+ */
129
+
130
+ /**
131
+ * Configuration for warning system
132
+ */
133
+ interface WarningSystemConfig {
134
+ /**
135
+ * Enable/disable warnings
136
+ * @default true in development
137
+ */
138
+ enabled?: boolean;
139
+ /**
140
+ * Minimum severity to show
141
+ * @default 'warn'
142
+ */
143
+ minSeverity?: WarningSeverity;
144
+ /**
145
+ * Show element in console
146
+ * @default true
147
+ */
148
+ showElement?: boolean;
149
+ /**
150
+ * Show stack traces for errors
151
+ * @default true
152
+ */
153
+ showStackTrace?: boolean;
154
+ /**
155
+ * Deduplicate warnings
156
+ * @default true
157
+ */
158
+ deduplicate?: boolean;
159
+ /**
160
+ * Custom warning handler
161
+ */
162
+ onWarning?: (warning: AccessibilityWarning) => void;
163
+ }
164
+ /**
165
+ * Warning system class
166
+ */
167
+ declare class WarningSystemClass {
168
+ private config;
169
+ private warningCache;
170
+ /**
171
+ * Configure the warning system
172
+ */
173
+ configure(config: WarningSystemConfig): void;
174
+ /**
175
+ * Emit a warning
176
+ */
177
+ warn(warning: AccessibilityWarning): void;
178
+ /**
179
+ * Clear warning cache
180
+ */
181
+ clearCache(): void;
182
+ /**
183
+ * Generate a unique key for a warning
184
+ */
185
+ private getWarningKey;
186
+ /**
187
+ * Print warning to console
188
+ */
189
+ private printWarning;
190
+ /**
191
+ * Get severity badge for console
192
+ */
193
+ private getSeverityBadge;
194
+ }
195
+ /**
196
+ * Singleton warning system
197
+ */
198
+ declare const WarningSystem: WarningSystemClass;
199
+ /**
200
+ * Helper to create a warning
201
+ */
202
+ declare const createWarning: (partial: Omit<AccessibilityWarning, "fixes"> & {
203
+ fixes?: AccessibilityWarning["fixes"];
204
+ }) => AccessibilityWarning;
205
+
206
+ export { type AccessibilityWarning, type FixSuggestion, type WCAGLevel, WCAGUrls, type WarningCategory, WarningCodes, type WarningSeverity, WarningSystem, type WarningSystemConfig, createWarning };
@@ -0,0 +1,194 @@
1
+ // @a13y/devtools - Development-time validators (tree-shakeable in production)
2
+
3
+ // src/runtime/warnings/warning-system.ts
4
+ var Styles = {
5
+ reset: "\x1B[0m",
6
+ bold: "\x1B[1m",
7
+ dim: "\x1B[2m",
8
+ blue: "\x1B[34m",
9
+ cyan: "\x1B[36m",
10
+ gray: "\x1B[90m",
11
+ // Backgrounds
12
+ bgRed: "\x1B[41m",
13
+ bgYellow: "\x1B[43m",
14
+ bgBlue: "\x1B[44m"
15
+ };
16
+ var style = (text, ...styles) => {
17
+ return `${styles.join("")}${text}${Styles.reset}`;
18
+ };
19
+ var WarningSystemClass = class {
20
+ constructor() {
21
+ this.config = {
22
+ enabled: true,
23
+ minSeverity: "warn",
24
+ showElement: true,
25
+ showStackTrace: true,
26
+ deduplicate: true,
27
+ onWarning: () => {
28
+ }
29
+ };
30
+ this.warningCache = /* @__PURE__ */ new Set();
31
+ }
32
+ /**
33
+ * Configure the warning system
34
+ */
35
+ configure(config) {
36
+ this.config = { ...this.config, ...config };
37
+ }
38
+ /**
39
+ * Emit a warning
40
+ */
41
+ warn(warning) {
42
+ if (!this.config.enabled) {
43
+ return;
44
+ }
45
+ const severityLevel = { info: 0, warn: 1, error: 2 };
46
+ if (severityLevel[warning.severity] < severityLevel[this.config.minSeverity]) {
47
+ return;
48
+ }
49
+ if (this.config.deduplicate) {
50
+ const key = this.getWarningKey(warning);
51
+ if (this.warningCache.has(key)) {
52
+ return;
53
+ }
54
+ this.warningCache.add(key);
55
+ }
56
+ if (this.config.onWarning) {
57
+ this.config.onWarning(warning);
58
+ }
59
+ this.printWarning(warning);
60
+ }
61
+ /**
62
+ * Clear warning cache
63
+ */
64
+ clearCache() {
65
+ this.warningCache.clear();
66
+ }
67
+ /**
68
+ * Generate a unique key for a warning
69
+ */
70
+ getWarningKey(warning) {
71
+ const parts = [warning.code, warning.message];
72
+ if (warning.element) {
73
+ const tag = warning.element.tagName.toLowerCase();
74
+ const id = warning.element.id;
75
+ const classes = Array.from(warning.element.classList).join(".");
76
+ parts.push(`${tag}#${id}.${classes}`);
77
+ }
78
+ return parts.join("|");
79
+ }
80
+ /**
81
+ * Print warning to console
82
+ */
83
+ printWarning(warning) {
84
+ const { severity, code, category, message, element, wcag, fixes } = warning;
85
+ const badge = this.getSeverityBadge(severity);
86
+ console.group(
87
+ `${badge} ${style(code, Styles.bold, Styles.cyan)} ${style(category, Styles.dim)}`
88
+ );
89
+ console.log(style(message, Styles.bold));
90
+ if (element && this.config.showElement) {
91
+ console.log(style("\nElement:", Styles.bold));
92
+ console.log(element);
93
+ }
94
+ if (wcag) {
95
+ console.log(style("\nWCAG:", Styles.bold), `${wcag.criterion} (Level ${wcag.level})`);
96
+ console.log(style("Learn more:", Styles.blue), wcag.url);
97
+ }
98
+ if (fixes.length > 0) {
99
+ console.log(style("\nHow to fix:", Styles.bold, Styles.cyan));
100
+ fixes.forEach((fix, index) => {
101
+ console.log(`${index + 1}. ${fix.description}`);
102
+ if (fix.example) {
103
+ console.log(style("\n Example:", Styles.dim));
104
+ console.log(style(` ${fix.example}`, Styles.dim, Styles.gray));
105
+ }
106
+ if (fix.learnMoreUrl) {
107
+ console.log(style(" Learn more:", Styles.blue), fix.learnMoreUrl);
108
+ }
109
+ });
110
+ }
111
+ if (severity === "error" && this.config.showStackTrace) {
112
+ console.log(style("\nStack trace:", Styles.dim));
113
+ console.trace();
114
+ }
115
+ console.groupEnd();
116
+ console.log("");
117
+ }
118
+ /**
119
+ * Get severity badge for console
120
+ */
121
+ getSeverityBadge(severity) {
122
+ switch (severity) {
123
+ case "error":
124
+ return style(" ERROR ", Styles.bold, Styles.bgRed);
125
+ case "warn":
126
+ return style(" WARN ", Styles.bold, Styles.bgYellow);
127
+ case "info":
128
+ return style(" INFO ", Styles.bold, Styles.bgBlue);
129
+ }
130
+ }
131
+ };
132
+ var WarningSystem = new WarningSystemClass();
133
+ var createWarning = (partial) => {
134
+ return {
135
+ fixes: [],
136
+ ...partial
137
+ };
138
+ };
139
+
140
+ // src/runtime/warnings/warning-types.ts
141
+ var WarningCodes = {
142
+ // Focus Management (001-099)
143
+ FOCUS_LOST: "A13Y001",
144
+ FOCUS_NOT_VISIBLE: "A13Y002",
145
+ FOCUS_TRAP_BROKEN: "A13Y003",
146
+ FOCUS_ORDER_INVALID: "A13Y004",
147
+ FOCUS_NOT_RESTORED: "A13Y005",
148
+ // Keyboard Navigation (100-199)
149
+ NOT_KEYBOARD_ACCESSIBLE: "A13Y100",
150
+ MISSING_KEYBOARD_HANDLER: "A13Y101",
151
+ INVALID_TABINDEX: "A13Y102",
152
+ ROVING_TABINDEX_BROKEN: "A13Y103",
153
+ MISSING_ESC_HANDLER: "A13Y104",
154
+ // Accessible Name (200-299)
155
+ MISSING_ACCESSIBLE_NAME: "A13Y200",
156
+ EMPTY_ACCESSIBLE_NAME: "A13Y201",
157
+ DUPLICATE_ID: "A13Y202",
158
+ INVALID_LABELLEDBY: "A13Y203",
159
+ PLACEHOLDER_AS_LABEL: "A13Y204",
160
+ // ARIA Usage (300-399)
161
+ INVALID_ARIA_ROLE: "A13Y300",
162
+ INVALID_ARIA_ATTRIBUTE: "A13Y301",
163
+ CONFLICTING_ARIA: "A13Y302",
164
+ REDUNDANT_ARIA: "A13Y303",
165
+ MISSING_REQUIRED_ARIA: "A13Y304",
166
+ INVALID_ARIA_VALUE: "A13Y305",
167
+ // Semantic HTML (400-499)
168
+ DIV_BUTTON: "A13Y400",
169
+ DIV_LINK: "A13Y401",
170
+ MISSING_LANDMARK: "A13Y402",
171
+ INVALID_NESTING: "A13Y403",
172
+ // WCAG Compliance (500-599)
173
+ CONTRAST_INSUFFICIENT: "A13Y500",
174
+ TARGET_SIZE_TOO_SMALL: "A13Y501",
175
+ ANIMATION_NO_REDUCE_MOTION: "A13Y502",
176
+ // Performance (600-699)
177
+ TOO_MANY_LIVE_REGIONS: "A13Y600",
178
+ EXCESSIVE_ANNOUNCEMENTS: "A13Y601"
179
+ };
180
+ var WCAGUrls = {
181
+ "1.3.1": "https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html",
182
+ "1.4.3": "https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html",
183
+ "2.1.1": "https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html",
184
+ "2.1.2": "https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html",
185
+ "2.4.3": "https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html",
186
+ "2.4.7": "https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html",
187
+ "2.5.5": "https://www.w3.org/WAI/WCAG22/Understanding/target-size.html",
188
+ "4.1.2": "https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html",
189
+ "4.1.3": "https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html"
190
+ };
191
+
192
+ export { WCAGUrls, WarningCodes, WarningSystem, createWarning };
193
+ //# sourceMappingURL=index.js.map
194
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/runtime/warnings/warning-system.ts","../../../src/runtime/warnings/warning-types.ts"],"names":[],"mappings":";;;AAUA,IAAM,MAAA,GAAS;AAAA,EACb,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EAKL,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,UAAA;AAAA;AAAA,EAGN,KAAA,EAAO,UAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAKA,IAAM,KAAA,GAAQ,CAAC,IAAA,EAAA,GAAiB,MAAA,KAA6B;AAC3D,EAAA,OAAO,CAAA,EAAG,OAAO,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA;AACjD,CAAA;AA6CA,IAAM,qBAAN,MAAyB;AAAA,EAAzB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,MAAA,GAAwC;AAAA,MAC9C,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,MAAA;AAAA,MACb,WAAA,EAAa,IAAA;AAAA,MACb,cAAA,EAAgB,IAAA;AAAA,MAChB,WAAA,EAAa,IAAA;AAAA,MACb,WAAW,MAAM;AAAA,MAAC;AAAA,KACpB;AAEA,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,UAAU,MAAA,EAAmC;AAC3C,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAAqC;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AACxB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,gBAAgB,EAAE,IAAA,EAAM,GAAG,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAE;AACnD,IAAA,IAAI,aAAA,CAAc,QAAQ,QAAQ,CAAA,GAAI,cAAc,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC5E,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACtC,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,MAAA,IAAA,CAAK,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAA,EAAuC;AAC3D,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAO,CAAA;AAE5C,IAAA,IAAI,QAAQ,OAAA,EAAS;AAEnB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAChD,MAAA,MAAM,EAAA,GAAK,QAAQ,OAAA,CAAQ,EAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,SAAS,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9D,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,GAAG,IAAI,EAAE,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAA,EAAqC;AACxD,IAAA,MAAM,EAAE,UAAU,IAAA,EAAM,QAAA,EAAU,SAAS,OAAA,EAAS,IAAA,EAAM,OAAM,GAAI,OAAA;AAGpE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAG5C,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAClF;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AAGvC,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AACtC,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,MAAA,CAAO,IAAI,CAAC,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,MAAA,CAAO,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AACpF,MAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,aAAA,EAAe,OAAO,IAAI,CAAA,EAAG,KAAK,GAAG,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,eAAA,EAAiB,OAAO,IAAA,EAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AAC5D,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC5B,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AAE9C,QAAA,IAAI,IAAI,OAAA,EAAS;AACf,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9C,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,GAAA,EAAM,GAAA,CAAI,OAAO,IAAI,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,QACjE;AAEA,QAAA,IAAI,IAAI,YAAA,EAAc;AACpB,UAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,gBAAA,EAAkB,OAAO,IAAI,CAAA,EAAG,IAAI,YAAY,CAAA;AAAA,QACpE;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,QAAA,KAAa,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,gBAAA,EAAkB,MAAA,CAAO,GAAG,CAAC,CAAA;AAC/C,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAA,EAAS;AACjB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAA,EAAmC;AAC1D,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,OAAA;AACH,QAAA,OAAO,KAAA,CAAM,SAAA,EAAW,MAAA,CAAO,IAAA,EAAM,OAAO,KAAK,CAAA;AAAA,MACnD,KAAK,MAAA;AACH,QAAA,OAAO,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,MACrD,KAAK,MAAA;AACH,QAAA,OAAO,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA;AACrD,EACF;AACF,CAAA;AAKO,IAAM,aAAA,GAAgB,IAAI,kBAAA;AAK1B,IAAM,aAAA,GAAgB,CAC3B,OAAA,KAGyB;AACzB,EAAA,OAAO;AAAA,IACL,OAAO,EAAC;AAAA,IACR,GAAG;AAAA,GACL;AACF;;;AC9IO,IAAM,YAAA,GAAe;AAAA;AAAA,EAE1B,UAAA,EAAY,SAAA;AAAA,EACZ,iBAAA,EAAmB,SAAA;AAAA,EACnB,iBAAA,EAAmB,SAAA;AAAA,EACnB,mBAAA,EAAqB,SAAA;AAAA,EACrB,kBAAA,EAAoB,SAAA;AAAA;AAAA,EAGpB,uBAAA,EAAyB,SAAA;AAAA,EACzB,wBAAA,EAA0B,SAAA;AAAA,EAC1B,gBAAA,EAAkB,SAAA;AAAA,EAClB,sBAAA,EAAwB,SAAA;AAAA,EACxB,mBAAA,EAAqB,SAAA;AAAA;AAAA,EAGrB,uBAAA,EAAyB,SAAA;AAAA,EACzB,qBAAA,EAAuB,SAAA;AAAA,EACvB,YAAA,EAAc,SAAA;AAAA,EACd,kBAAA,EAAoB,SAAA;AAAA,EACpB,oBAAA,EAAsB,SAAA;AAAA;AAAA,EAGtB,iBAAA,EAAmB,SAAA;AAAA,EACnB,sBAAA,EAAwB,SAAA;AAAA,EACxB,gBAAA,EAAkB,SAAA;AAAA,EAClB,cAAA,EAAgB,SAAA;AAAA,EAChB,qBAAA,EAAuB,SAAA;AAAA,EACvB,kBAAA,EAAoB,SAAA;AAAA;AAAA,EAGpB,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,gBAAA,EAAkB,SAAA;AAAA,EAClB,eAAA,EAAiB,SAAA;AAAA;AAAA,EAGjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,qBAAA,EAAuB,SAAA;AAAA,EACvB,0BAAA,EAA4B,SAAA;AAAA;AAAA,EAG5B,qBAAA,EAAuB,SAAA;AAAA,EACvB,uBAAA,EAAyB;AAC3B;AAKO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS,yEAAA;AAAA,EACT,OAAA,EAAS,mEAAA;AAAA,EACT,OAAA,EAAS,2DAAA;AAAA,EACT,OAAA,EAAS,mEAAA;AAAA,EACT,OAAA,EAAS,8DAAA;AAAA,EACT,OAAA,EAAS,gEAAA;AAAA,EACT,OAAA,EAAS,8DAAA;AAAA,EACT,OAAA,EAAS,kEAAA;AAAA,EACT,OAAA,EAAS;AACX","file":"index.js","sourcesContent":["/**\n * @a13y/devtools - Warning System\n * Structured warning system with styled console output\n */\n\nimport type { AccessibilityWarning, WarningSeverity } from './warning-types';\n\n/**\n * Console styling for warnings\n */\nconst Styles = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n\n // Colors\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n\n // Backgrounds\n bgRed: '\\x1b[41m',\n bgYellow: '\\x1b[43m',\n bgBlue: '\\x1b[44m',\n} as const;\n\n/**\n * Format a message with console styling\n */\nconst style = (text: string, ...styles: string[]): string => {\n return `${styles.join('')}${text}${Styles.reset}`;\n};\n\n/**\n * Configuration for warning system\n */\nexport interface WarningSystemConfig {\n /**\n * Enable/disable warnings\n * @default true in development\n */\n enabled?: boolean;\n\n /**\n * Minimum severity to show\n * @default 'warn'\n */\n minSeverity?: WarningSeverity;\n\n /**\n * Show element in console\n * @default true\n */\n showElement?: boolean;\n\n /**\n * Show stack traces for errors\n * @default true\n */\n showStackTrace?: boolean;\n\n /**\n * Deduplicate warnings\n * @default true\n */\n deduplicate?: boolean;\n\n /**\n * Custom warning handler\n */\n onWarning?: (warning: AccessibilityWarning) => void;\n}\n\n/**\n * Warning system class\n */\nclass WarningSystemClass {\n private config: Required<WarningSystemConfig> = {\n enabled: true,\n minSeverity: 'warn',\n showElement: true,\n showStackTrace: true,\n deduplicate: true,\n onWarning: () => {},\n };\n\n private warningCache = new Set<string>();\n\n /**\n * Configure the warning system\n */\n configure(config: WarningSystemConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Emit a warning\n */\n warn(warning: AccessibilityWarning): void {\n if (!this.config.enabled) {\n return;\n }\n\n // Check severity threshold\n const severityLevel = { info: 0, warn: 1, error: 2 };\n if (severityLevel[warning.severity] < severityLevel[this.config.minSeverity]) {\n return;\n }\n\n // Deduplicate\n if (this.config.deduplicate) {\n const key = this.getWarningKey(warning);\n if (this.warningCache.has(key)) {\n return;\n }\n this.warningCache.add(key);\n }\n\n // Custom handler\n if (this.config.onWarning) {\n this.config.onWarning(warning);\n }\n\n // Console output\n this.printWarning(warning);\n }\n\n /**\n * Clear warning cache\n */\n clearCache(): void {\n this.warningCache.clear();\n }\n\n /**\n * Generate a unique key for a warning\n */\n private getWarningKey(warning: AccessibilityWarning): string {\n const parts = [warning.code, warning.message];\n\n if (warning.element) {\n // Use element's tag, id, and classes for uniqueness\n const tag = warning.element.tagName.toLowerCase();\n const id = warning.element.id;\n const classes = Array.from(warning.element.classList).join('.');\n parts.push(`${tag}#${id}.${classes}`);\n }\n\n return parts.join('|');\n }\n\n /**\n * Print warning to console\n */\n private printWarning(warning: AccessibilityWarning): void {\n const { severity, code, category, message, element, wcag, fixes } = warning;\n\n // Severity badge\n const badge = this.getSeverityBadge(severity);\n\n // Header\n console.group(\n `${badge} ${style(code, Styles.bold, Styles.cyan)} ${style(category, Styles.dim)}`\n );\n\n // Message\n console.log(style(message, Styles.bold));\n\n // Element\n if (element && this.config.showElement) {\n console.log(style('\\nElement:', Styles.bold));\n console.log(element);\n }\n\n // WCAG info\n if (wcag) {\n console.log(style('\\nWCAG:', Styles.bold), `${wcag.criterion} (Level ${wcag.level})`);\n console.log(style('Learn more:', Styles.blue), wcag.url);\n }\n\n // Fix suggestions\n if (fixes.length > 0) {\n console.log(style('\\nHow to fix:', Styles.bold, Styles.cyan));\n fixes.forEach((fix, index) => {\n console.log(`${index + 1}. ${fix.description}`);\n\n if (fix.example) {\n console.log(style('\\n Example:', Styles.dim));\n console.log(style(` ${fix.example}`, Styles.dim, Styles.gray));\n }\n\n if (fix.learnMoreUrl) {\n console.log(style(' Learn more:', Styles.blue), fix.learnMoreUrl);\n }\n });\n }\n\n // Stack trace for errors\n if (severity === 'error' && this.config.showStackTrace) {\n console.log(style('\\nStack trace:', Styles.dim));\n console.trace();\n }\n\n console.groupEnd();\n console.log(''); // Empty line for spacing\n }\n\n /**\n * Get severity badge for console\n */\n private getSeverityBadge(severity: WarningSeverity): string {\n switch (severity) {\n case 'error':\n return style(' ERROR ', Styles.bold, Styles.bgRed);\n case 'warn':\n return style(' WARN ', Styles.bold, Styles.bgYellow);\n case 'info':\n return style(' INFO ', Styles.bold, Styles.bgBlue);\n }\n }\n}\n\n/**\n * Singleton warning system\n */\nexport const WarningSystem = new WarningSystemClass();\n\n/**\n * Helper to create a warning\n */\nexport const createWarning = (\n partial: Omit<AccessibilityWarning, 'fixes'> & {\n fixes?: AccessibilityWarning['fixes'];\n }\n): AccessibilityWarning => {\n return {\n fixes: [],\n ...partial,\n };\n};\n","/**\n * @a13y/devtools - Warning Types\n * Type definitions for accessibility warnings\n */\n\n/**\n * Warning severity level\n */\nexport type WarningSeverity = 'error' | 'warn' | 'info';\n\n/**\n * WCAG level for the violation\n */\nexport type WCAGLevel = 'A' | 'AA' | 'AAA';\n\n/**\n * Category of accessibility issue\n */\nexport type WarningCategory =\n | 'focus-management'\n | 'keyboard-navigation'\n | 'aria-usage'\n | 'accessible-name'\n | 'semantic-html'\n | 'wcag-compliance'\n | 'performance';\n\n/**\n * Fix suggestion for a warning\n */\nexport interface FixSuggestion {\n /**\n * Description of how to fix the issue\n */\n description: string;\n\n /**\n * Code example showing the fix\n */\n example?: string;\n\n /**\n * Link to documentation\n */\n learnMoreUrl?: string;\n}\n\n/**\n * Accessibility warning\n */\nexport interface AccessibilityWarning {\n /**\n * Unique warning code (e.g., \"A13Y001\")\n */\n code: string;\n\n /**\n * Severity level\n */\n severity: WarningSeverity;\n\n /**\n * Category of the issue\n */\n category: WarningCategory;\n\n /**\n * Human-readable message\n */\n message: string;\n\n /**\n * Element that caused the warning\n */\n element?: Element;\n\n /**\n * WCAG criterion violated\n */\n wcag?: {\n criterion: string;\n level: WCAGLevel;\n url: string;\n };\n\n /**\n * Suggestions for fixing the issue\n */\n fixes: FixSuggestion[];\n\n /**\n * Additional context\n */\n context?: Record<string, unknown>;\n}\n\n/**\n * Warning code definitions\n */\nexport const WarningCodes = {\n // Focus Management (001-099)\n FOCUS_LOST: 'A13Y001',\n FOCUS_NOT_VISIBLE: 'A13Y002',\n FOCUS_TRAP_BROKEN: 'A13Y003',\n FOCUS_ORDER_INVALID: 'A13Y004',\n FOCUS_NOT_RESTORED: 'A13Y005',\n\n // Keyboard Navigation (100-199)\n NOT_KEYBOARD_ACCESSIBLE: 'A13Y100',\n MISSING_KEYBOARD_HANDLER: 'A13Y101',\n INVALID_TABINDEX: 'A13Y102',\n ROVING_TABINDEX_BROKEN: 'A13Y103',\n MISSING_ESC_HANDLER: 'A13Y104',\n\n // Accessible Name (200-299)\n MISSING_ACCESSIBLE_NAME: 'A13Y200',\n EMPTY_ACCESSIBLE_NAME: 'A13Y201',\n DUPLICATE_ID: 'A13Y202',\n INVALID_LABELLEDBY: 'A13Y203',\n PLACEHOLDER_AS_LABEL: 'A13Y204',\n\n // ARIA Usage (300-399)\n INVALID_ARIA_ROLE: 'A13Y300',\n INVALID_ARIA_ATTRIBUTE: 'A13Y301',\n CONFLICTING_ARIA: 'A13Y302',\n REDUNDANT_ARIA: 'A13Y303',\n MISSING_REQUIRED_ARIA: 'A13Y304',\n INVALID_ARIA_VALUE: 'A13Y305',\n\n // Semantic HTML (400-499)\n DIV_BUTTON: 'A13Y400',\n DIV_LINK: 'A13Y401',\n MISSING_LANDMARK: 'A13Y402',\n INVALID_NESTING: 'A13Y403',\n\n // WCAG Compliance (500-599)\n CONTRAST_INSUFFICIENT: 'A13Y500',\n TARGET_SIZE_TOO_SMALL: 'A13Y501',\n ANIMATION_NO_REDUCE_MOTION: 'A13Y502',\n\n // Performance (600-699)\n TOO_MANY_LIVE_REGIONS: 'A13Y600',\n EXCESSIVE_ANNOUNCEMENTS: 'A13Y601',\n} as const;\n\n/**\n * WCAG criterion URLs\n */\nexport const WCAGUrls = {\n '1.3.1': 'https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html',\n '1.4.3': 'https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html',\n '2.1.1': 'https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html',\n '2.1.2': 'https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html',\n '2.4.3': 'https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html',\n '2.4.7': 'https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html',\n '2.5.5': 'https://www.w3.org/WAI/WCAG22/Understanding/target-size.html',\n '4.1.2': 'https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html',\n '4.1.3': 'https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html',\n} as const;\n"]}