a11y-hud 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.
- package/LICENSE +26 -0
- package/dist/index.cjs +702 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +73 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.js +694 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +751 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scan.ts","../src/mount.ts","../src/icons/alert-circle.svg","../src/icons/alert-triangle.svg","../src/icons/check-circle.svg","../src/icons/chevron-down.svg","../src/icons/chevron-up.svg","../src/icons/copy.svg","../src/icons/filter.svg","../src/icons/info.svg","../src/icons/keyboard.svg","../src/icons/minus.svg","../src/icons/moon.svg","../src/icons/refresh-cw.svg","../src/icons/sun.svg","../src/icons/x.svg","../src/icons/index.ts","../src/observer.ts","../src/styles/base.css","../src/styles/themes.css","../src/theme.ts","../src/element.ts"],"names":["axe"],"mappings":"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","file":"index.cjs","sourcesContent":["import axe from \"axe-core\";\nimport type { AxeResults } from \"axe-core\";\n\nexport async function runScan(target: Element = document.body): Promise<AxeResults> {\n const results = await axe.run(target);\n // Strip any violations whose nodes all come from inside the a11y-hud element\n // itself. The HUD is a dev-tool overlay and should not audit its own UI.\n results.violations = results.violations\n .map((v) => ({\n ...v,\n nodes: v.nodes.filter((node) => {\n const first = node.target[0];\n const selector = (Array.isArray(first) ? first[0] : first) ?? \"\";\n return !String(selector).toLowerCase().startsWith(\"a11y-hud\");\n }),\n }))\n .filter((v) => v.nodes.length > 0);\n return results;\n}\n","import type { AxeResults } from \"axe-core\";\nimport type { A11yHudElement } from \"./element.js\";\nimport { runScan } from \"./scan.js\";\nimport type { A11yHudInstance, MountOptions, Theme } from \"./types.js\";\n\nexport function mount(options: MountOptions = {}): A11yHudInstance {\n let el = document.querySelector<A11yHudElement>(\"a11y-hud\");\n\n if (!el) {\n el = document.createElement(\"a11y-hud\") as A11yHudElement;\n document.body.appendChild(el);\n }\n\n if (options.theme !== undefined) el.setAttribute(\"theme\", options.theme);\n\n if (options.scope !== undefined) {\n if (typeof options.scope === \"string\") {\n el.setAttribute(\"scope\", options.scope);\n } else {\n el.scopeElement = options.scope;\n }\n }\n\n if (options.autoScan === false) {\n el.removeAttribute(\"auto-scan\");\n } else if (options.autoScan === true) {\n el.setAttribute(\"auto-scan\", \"\");\n }\n\n if (options.debounce !== undefined) {\n el.setAttribute(\"debounce\", String(options.debounce));\n }\n\n return {\n unmount(): void {\n el.remove();\n },\n setTheme(theme: Theme): void {\n el.setTheme(theme);\n },\n async runScan(): Promise<AxeResults> {\n return el.triggerScan();\n },\n };\n}\n\nexport { runScan };\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><path d=\"m9 11 3 3L22 4\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m18 15-6-6-6 6\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" ry=\"2\"/><path d=\"M6 8h.001\"/><path d=\"M10 8h.001\"/><path d=\"M14 8h.001\"/><path d=\"M18 8h.001\"/><path d=\"M8 12h.001\"/><path d=\"M12 12h.001\"/><path d=\"M16 12h.001\"/><path d=\"M7 16h10\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M8 16H3v5\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"m4.93 4.93 1.41 1.41\"/><path d=\"m17.66 17.66 1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"m6.34 17.66-1.41 1.41\"/><path d=\"m19.07 4.93-1.41 1.41\"/></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n","import alertCircle from \"./alert-circle.svg\";\nimport alertTriangle from \"./alert-triangle.svg\";\nimport checkCircle from \"./check-circle.svg\";\nimport chevronDown from \"./chevron-down.svg\";\nimport chevronUp from \"./chevron-up.svg\";\nimport copy from \"./copy.svg\";\nimport filter from \"./filter.svg\";\nimport info from \"./info.svg\";\nimport keyboard from \"./keyboard.svg\";\nimport minus from \"./minus.svg\";\nimport moon from \"./moon.svg\";\nimport refreshCw from \"./refresh-cw.svg\";\nimport sun from \"./sun.svg\";\nimport x from \"./x.svg\";\n\nconst registry: Record<string, string> = {\n \"alert-circle\": alertCircle,\n \"alert-triangle\": alertTriangle,\n \"check-circle\": checkCircle,\n \"chevron-down\": chevronDown,\n \"chevron-up\": chevronUp,\n copy,\n filter,\n info,\n keyboard,\n minus,\n moon,\n \"refresh-cw\": refreshCw,\n sun,\n x,\n};\n\nexport function icon(name: string): string {\n return registry[name] ?? \"\";\n}\n","export function debounce<T extends (...args: never[]) => void>(\n fn: T,\n delay: number\n): T & { cancel(): void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...(args as never[])), delay);\n };\n\n debounced.cancel = () => clearTimeout(timer);\n\n return debounced as unknown as T & { cancel(): void };\n}\n\nexport function createObserver(\n target: Element,\n callback: () => void,\n delay: number\n): MutationObserver {\n const debouncedCallback = debounce(callback, delay);\n\n const observer = new MutationObserver(debouncedCallback);\n observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: false,\n });\n\n return observer;\n}\n",":host {\n --a11y-hud-bg: #1e1e2e;\n --a11y-hud-bg-elevated: #313244;\n --a11y-hud-bg-hover: #45475a;\n --a11y-hud-border: #45475a;\n --a11y-hud-text: #cdd6f4;\n --a11y-hud-text-muted: #a6adc8;\n --a11y-hud-critical: #f38ba8;\n --a11y-hud-serious: #fab387;\n --a11y-hud-moderate: #f9e2af;\n --a11y-hud-minor: #89b4fa;\n --a11y-hud-highlight: #cba6f7;\n --a11y-hud-focus-ring: #89b4fa;\n --a11y-hud-radius: 8px;\n --a11y-hud-font: ui-monospace, \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, monospace;\n --a11y-hud-z-index: 999999;\n --a11y-hud-panel-width: 380px;\n\n all: initial;\n display: block;\n position: fixed;\n inset-block-end: 16px;\n inset-inline-end: 16px;\n z-index: var(--a11y-hud-z-index);\n font-family: var(--a11y-hud-font);\n font-size: 13px;\n line-height: 1.5;\n color: var(--a11y-hud-text);\n contain: layout style;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n.panel {\n width: var(--a11y-hud-panel-width);\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n background: var(--a11y-hud-bg);\n border: 1px solid var(--a11y-hud-border);\n border-radius: var(--a11y-hud-radius);\n overflow: hidden;\n box-shadow: 0 8px 32px rgb(0 0 0 / 40%);\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--a11y-hud-bg-elevated);\n border-block-end: 1px solid var(--a11y-hud-border);\n flex-shrink: 0;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n letter-spacing: 0.02em;\n}\n\n.panel-title-icon {\n display: flex;\n align-items: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n\n.panel-title-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.panel-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding-inline: 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 700;\n background: var(--a11y-hud-critical);\n color: var(--a11y-hud-bg);\n}\n\n.panel-count[data-count=\"0\"] {\n background: var(--a11y-hud-minor);\n}\n\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.btn-icon {\n all: unset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n color: var(--a11y-hud-text-muted);\n cursor: pointer;\n transition: background 120ms, color 120ms;\n}\n\n.btn-icon svg {\n width: 14px;\n height: 14px;\n pointer-events: none;\n}\n\n.btn-icon:hover {\n background: var(--a11y-hud-bg-hover);\n color: var(--a11y-hud-text);\n}\n\n.btn-icon:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: 1px;\n}\n\n.btn-icon[data-scanning] {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.panel-filters {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 12px;\n border-block-end: 1px solid var(--a11y-hud-border);\n flex-shrink: 0;\n}\n\n.filter-group {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.filter-chip {\n all: unset;\n display: inline-flex;\n align-items: center;\n height: 22px;\n padding-inline: 8px;\n border-radius: 11px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n cursor: pointer;\n border: 1px solid var(--a11y-hud-border);\n color: var(--a11y-hud-text-muted);\n background: transparent;\n transition: background 120ms, color 120ms, border-color 120ms;\n}\n\n.filter-chip:hover {\n background: var(--a11y-hud-bg-hover);\n color: var(--a11y-hud-text);\n}\n\n.filter-chip:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: 1px;\n}\n\n.filter-chip[aria-pressed=\"true\"][data-severity=\"critical\"] {\n background: var(--a11y-hud-critical);\n border-color: var(--a11y-hud-critical);\n color: var(--a11y-hud-bg);\n}\n\n.filter-chip[aria-pressed=\"true\"][data-severity=\"serious\"] {\n background: var(--a11y-hud-serious);\n border-color: var(--a11y-hud-serious);\n color: var(--a11y-hud-bg);\n}\n\n.filter-chip[aria-pressed=\"true\"][data-severity=\"moderate\"] {\n background: var(--a11y-hud-moderate);\n border-color: var(--a11y-hud-moderate);\n color: var(--a11y-hud-bg);\n}\n\n.filter-chip[aria-pressed=\"true\"][data-severity=\"minor\"] {\n background: var(--a11y-hud-minor);\n border-color: var(--a11y-hud-minor);\n color: var(--a11y-hud-bg);\n}\n\n.filter-chip[aria-pressed=\"true\"][data-level] {\n background: var(--a11y-hud-bg-elevated);\n border-color: var(--a11y-hud-text-muted);\n color: var(--a11y-hud-text);\n}\n\n.panel-body {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.panel-body:focus-visible {\n outline: none;\n}\n\n.violation-list {\n list-style: none;\n}\n\n.violation-item {\n border-block-end: 1px solid var(--a11y-hud-border);\n}\n\n.violation-item:last-child {\n border-block-end: none;\n}\n\n.violation-toggle {\n all: unset;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n cursor: pointer;\n text-align: start;\n transition: background 120ms;\n}\n\n.violation-toggle:hover {\n background: var(--a11y-hud-bg-elevated);\n}\n\n.violation-toggle:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: -2px;\n}\n\n.severity-icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n}\n\n.severity-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.severity-icon[data-severity=\"critical\"] {\n color: var(--a11y-hud-critical);\n}\n\n.severity-icon[data-severity=\"serious\"] {\n color: var(--a11y-hud-serious);\n}\n\n.severity-icon[data-severity=\"moderate\"] {\n color: var(--a11y-hud-moderate);\n}\n\n.severity-icon[data-severity=\"minor\"] {\n color: var(--a11y-hud-minor);\n}\n\n.violation-rule {\n flex: 1;\n font-size: 12px;\n font-weight: 500;\n word-break: break-word;\n}\n\n.violation-node-count {\n font-size: 11px;\n color: var(--a11y-hud-text-muted);\n flex-shrink: 0;\n}\n\n.chevron-icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n color: var(--a11y-hud-text-muted);\n transition: transform 200ms;\n}\n\n.chevron-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.violation-toggle[aria-expanded=\"true\"] .chevron-icon {\n transform: rotate(180deg);\n}\n\n.violation-detail {\n padding: 0 12px 10px 34px;\n display: none;\n flex-direction: column;\n gap: 8px;\n}\n\n.violation-detail[data-open] {\n display: flex;\n}\n\n.violation-description {\n font-size: 12px;\n color: var(--a11y-hud-text-muted);\n line-height: 1.6;\n}\n\n.violation-nodes-list {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.violation-node-item {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.btn-highlight {\n all: unset;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-family: var(--a11y-hud-font);\n color: var(--a11y-hud-highlight);\n border: 1px solid var(--a11y-hud-border);\n cursor: pointer;\n word-break: break-all;\n transition: background 120ms;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.btn-highlight:hover {\n background: var(--a11y-hud-bg-elevated);\n}\n\n.btn-highlight:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: 1px;\n}\n\n.violation-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.violation-help-link {\n font-size: 11px;\n color: var(--a11y-hud-minor);\n text-decoration: none;\n}\n\n.violation-help-link:hover {\n text-decoration: underline;\n}\n\n.violation-help-link:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: 1px;\n border-radius: 2px;\n}\n\n.btn-copy-single {\n all: unset;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 11px;\n font-family: var(--a11y-hud-font);\n color: var(--a11y-hud-text-muted);\n cursor: pointer;\n transition: background 120ms, color 120ms;\n}\n\n.btn-copy-single svg {\n width: 12px;\n height: 12px;\n pointer-events: none;\n}\n\n.btn-copy-single:hover {\n background: var(--a11y-hud-bg-elevated);\n color: var(--a11y-hud-text);\n}\n\n.btn-copy-single:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: 1px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--a11y-hud-text-muted);\n}\n\n.empty-state-icon {\n width: 32px;\n height: 32px;\n color: var(--a11y-hud-minor);\n}\n\n.empty-state-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.empty-state-title {\n font-weight: 600;\n color: var(--a11y-hud-text);\n}\n\n.empty-state-body {\n font-size: 12px;\n text-align: center;\n}\n\n.scanning-state {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 24px 16px;\n color: var(--a11y-hud-text-muted);\n font-size: 12px;\n}\n\n.scanning-spinner {\n width: 16px;\n height: 16px;\n color: var(--a11y-hud-minor);\n animation: spin 1s linear infinite;\n}\n\n.scanning-spinner svg {\n width: 100%;\n height: 100%;\n}\n\n/* ── FAB (minimized state) ────────────────────────────────────────────────── */\n\n.fab {\n all: unset;\n display: none;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n background: var(--a11y-hud-bg);\n border: 1px solid var(--a11y-hud-border);\n border-radius: 24px;\n color: var(--a11y-hud-text);\n cursor: pointer;\n font-family: var(--a11y-hud-font);\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 4px 16px rgb(0 0 0 / 30%);\n transition: background 120ms;\n}\n\n:host([data-minimized]) .fab {\n display: flex;\n}\n\n:host([data-minimized]) .panel {\n display: none;\n}\n\n@keyframes panel-in {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.panel {\n animation: panel-in 120ms ease-out;\n}\n\n.fab:hover {\n background: var(--a11y-hud-bg-elevated);\n}\n\n.fab:focus-visible {\n outline: 2px solid var(--a11y-hud-focus-ring);\n outline-offset: 2px;\n}\n\n.fab-icon {\n display: flex;\n align-items: center;\n width: 14px;\n height: 14px;\n}\n\n.fab-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.fab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding-inline: 5px;\n border-radius: 9px;\n font-size: 11px;\n font-weight: 700;\n background: var(--a11y-hud-critical);\n color: var(--a11y-hud-bg);\n}\n\n.fab-count[data-count=\"0\"] {\n background: var(--a11y-hud-minor);\n}\n",":host([data-theme=\"light\"]) {\n --a11y-hud-bg: #eff1f5;\n --a11y-hud-bg-elevated: #e6e9ef;\n --a11y-hud-bg-hover: #dce0e8;\n --a11y-hud-border: #bcc0cc;\n --a11y-hud-text: #4c4f69;\n /* #5c5f77 gives 5.56:1 on #eff1f5 (was #6c6f85 at 4.36:1) */\n --a11y-hud-text-muted: #5c5f77;\n --a11y-hud-critical: #d20f39;\n --a11y-hud-serious: #fe640b;\n --a11y-hud-moderate: #df8e1d;\n /* #1452c7 gives 5.92:1 on #eff1f5 (was #1e66f5 at 4.34:1) */\n --a11y-hud-minor: #1452c7;\n --a11y-hud-highlight: #8839ef;\n --a11y-hud-focus-ring: #1452c7;\n}\n\n/* Chip text overrides — bright severity backgrounds need dark or white text\n to meet 4.5:1 at 11 px. The base CSS uses --a11y-hud-bg (light in this\n theme) which fails on orange and yellow. */\n:host([data-theme=\"light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"critical\"] {\n color: #ffffff;\n}\n\n:host([data-theme=\"light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"serious\"],\n:host([data-theme=\"light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"moderate\"] {\n color: #1a1a2e;\n}\n\n:host([data-theme=\"high-contrast\"]) {\n --a11y-hud-bg: #000000;\n --a11y-hud-bg-elevated: #111111;\n --a11y-hud-bg-hover: #222222;\n --a11y-hud-border: #ffffff;\n --a11y-hud-text: #ffffff;\n --a11y-hud-text-muted: #cccccc;\n --a11y-hud-critical: #ff4444;\n --a11y-hud-serious: #ff8800;\n --a11y-hud-moderate: #ffcc00;\n --a11y-hud-minor: #66aaff;\n --a11y-hud-highlight: #ff66ff;\n --a11y-hud-focus-ring: #ffffff;\n}\n","import type { ResolvedTheme, Theme } from \"./types.js\";\n\nexport function resolveTheme(theme: Theme): ResolvedTheme {\n if (matchMedia(\"(prefers-contrast: more)\").matches) return \"high-contrast\";\n if (theme === \"auto\")\n return matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"default\" : \"light\";\n return theme;\n}\n\nexport function watchTheme(\n getTheme: () => Theme,\n callback: (resolved: ResolvedTheme) => void\n): () => void {\n const colorScheme = matchMedia(\"(prefers-color-scheme: dark)\");\n const contrast = matchMedia(\"(prefers-contrast: more)\");\n\n const handler = () => callback(resolveTheme(getTheme()));\n\n colorScheme.addEventListener(\"change\", handler);\n contrast.addEventListener(\"change\", handler);\n\n return () => {\n colorScheme.removeEventListener(\"change\", handler);\n contrast.removeEventListener(\"change\", handler);\n };\n}\n","import type { AxeResults, Result } from \"axe-core\";\nimport { icon } from \"./icons/index.js\";\nimport { debounce } from \"./observer.js\";\nimport { runScan } from \"./scan.js\";\nimport baseCss from \"./styles/base.css\";\nimport themesCss from \"./styles/themes.css\";\nimport { resolveTheme, watchTheme } from \"./theme.js\";\nimport type { Severity, Theme } from \"./types.js\";\n\nconst HIGHLIGHT_ATTR = \"data-a11y-hud-highlighted\";\nconst HIGHLIGHT_STYLE_ID = \"a11y-hud-highlight-style\";\nconst HIGHLIGHT_CSS = `[${HIGHLIGHT_ATTR}]{outline:3px solid #7c3aed!important;outline-offset:3px!important;scroll-margin:8px!important;}`;\n\nconst WCAG_LEVEL_TAGS: Record<string, string[]> = {\n A: [\"wcag2a\", \"wcag21a\"],\n AA: [\"wcag2aa\", \"wcag21aa\", \"wcag22aa\"],\n AAA: [\"wcag2aaa\"],\n};\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n critical: \"alert-triangle\",\n serious: \"alert-circle\",\n moderate: \"alert-circle\",\n minor: \"info\",\n};\n\nfunction isSeverity(value: string | null): value is Severity {\n return value === \"critical\" || value === \"serious\" || value === \"moderate\" || value === \"minor\";\n}\n\nfunction getViolationLevel(tags: string[]): string {\n for (const [level, levelTags] of Object.entries(WCAG_LEVEL_TAGS)) {\n if (tags.some((t) => levelTags.includes(t))) return level;\n }\n return \"\";\n}\n\nfunction findElement(target: Array<string | string[]>): Element | null {\n try {\n const last = target[target.length - 1];\n const selector = Array.isArray(last) ? last[last.length - 1] : last;\n return selector ? document.querySelector(selector) : null;\n } catch {\n return null;\n }\n}\n\nfunction ensureHighlightStyle(doc: Document): void {\n if (doc.getElementById(HIGHLIGHT_STYLE_ID)) return;\n const style = doc.createElement(\"style\");\n style.id = HIGHLIGHT_STYLE_ID;\n style.textContent = HIGHLIGHT_CSS;\n doc.head.appendChild(style);\n}\n\nfunction buildStyleSheet(css: string): CSSStyleSheet | null {\n try {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n return sheet;\n } catch {\n return null;\n }\n}\n\nexport class A11yHudElement extends HTMLElement {\n static observedAttributes = [\"theme\", \"scope\", \"auto-scan\", \"debounce\"];\n\n private _shadow: ShadowRoot;\n private _theme: Theme = \"auto\";\n private _scopeSelector: string | undefined;\n private _scopeElement: Element | undefined;\n private _autoScan = true;\n private _debounceMs = 500;\n private _results: AxeResults | undefined;\n private _scanning = false;\n private _mounted = false;\n private _observer: MutationObserver | undefined;\n private _unwatchTheme: (() => void) | undefined;\n private _removeHighlight: (() => void) | undefined;\n private _activeSeverities = new Set<Severity>([\"critical\", \"serious\", \"moderate\", \"minor\"]);\n private _activeLevels = new Set<string>([\"A\", \"AA\", \"AAA\"]);\n private _debouncedScan: ((...args: never[]) => void) & { cancel(): void };\n\n constructor() {\n super();\n this._shadow = this.attachShadow({ mode: \"open\" });\n this._debouncedScan = debounce(() => void this._runScan(), this._debounceMs);\n this._applyStyles();\n }\n\n private _applyStyles(): void {\n const combined = `${baseCss}\\n${themesCss}`;\n const sheet = buildStyleSheet(combined);\n if (sheet) {\n this._shadow.adoptedStyleSheets = [sheet];\n } else {\n const style = document.createElement(\"style\");\n style.textContent = combined;\n this._shadow.appendChild(style);\n }\n }\n\n connectedCallback(): void {\n this._mounted = true;\n this._applyResolvedTheme();\n this._render();\n this._unwatchTheme = watchTheme(\n () => this._theme,\n (resolved) => {\n this.dataset.theme = resolved;\n }\n );\n if (this._autoScan) this._startObserver();\n void this._runScan();\n }\n\n disconnectedCallback(): void {\n this._mounted = false;\n this._observer?.disconnect();\n this._unwatchTheme?.();\n this._removeHighlight?.();\n this._removeHighlight = undefined;\n this._debouncedScan.cancel();\n }\n\n attributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n switch (name) {\n case \"theme\":\n this._theme = (value as Theme | null) ?? \"auto\";\n if (this._mounted) this._applyResolvedTheme();\n break;\n case \"scope\":\n this._scopeSelector = value ?? undefined;\n this._scopeElement = undefined;\n break;\n case \"auto-scan\":\n this._autoScan = value !== null;\n if (this._mounted) {\n if (this._autoScan) {\n this._startObserver();\n } else {\n this._observer?.disconnect();\n this._observer = undefined;\n }\n }\n break;\n case \"debounce\": {\n const parsed = Number.parseInt(value ?? \"\", 10);\n this._debounceMs = Number.isNaN(parsed) ? 500 : parsed;\n this._debouncedScan.cancel();\n this._debouncedScan = debounce(() => void this._runScan(), this._debounceMs);\n break;\n }\n }\n }\n\n get scopeElement(): Element | undefined {\n return this._scopeElement;\n }\n\n set scopeElement(el: Element | undefined) {\n this._scopeElement = el;\n this._scopeSelector = undefined;\n }\n\n setTheme(theme: Theme): void {\n this._theme = theme;\n this.setAttribute(\"theme\", theme);\n this._applyResolvedTheme();\n }\n\n async triggerScan(): Promise<AxeResults> {\n return this._runScan();\n }\n\n private _getScopeTarget(): Element {\n if (this._scopeElement) return this._scopeElement;\n if (this._scopeSelector) {\n return document.querySelector(this._scopeSelector) ?? document.body;\n }\n return document.body;\n }\n\n private _applyResolvedTheme(): void {\n this.dataset.theme = resolveTheme(this._theme);\n }\n\n private _startObserver(): void {\n this._observer?.disconnect();\n const target = this._getScopeTarget();\n const debouncedScan = this._debouncedScan;\n\n this._observer = new MutationObserver((records) => {\n // Ignore mutations we caused ourselves (adding/removing the highlight\n // attribute on the host page). Without this guard, clicking a highlight\n // button triggers a rescan which rebuilds the list and collapses open items.\n if (records.every((r) => r.type === \"attributes\" && r.attributeName === HIGHLIGHT_ATTR))\n return;\n debouncedScan();\n });\n\n this._observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: false,\n });\n }\n\n private async _runScan(): Promise<AxeResults> {\n if (this._scanning) return this._results ?? ({ violations: [] } as unknown as AxeResults);\n this._scanning = true;\n\n const rescanBtn = this._shadow.querySelector<HTMLButtonElement>(\"#btn-rescan\");\n if (rescanBtn) {\n rescanBtn.setAttribute(\"data-scanning\", \"\");\n rescanBtn.disabled = true;\n }\n\n // Only show the full-body spinner on the very first scan — on rescan, keep\n // existing results visible and let the button spin instead.\n if (!this._results) this._renderScanning();\n\n // Yield to the browser's rendering pipeline so the spinning button state\n // is painted before the scan starts. Without this, axe.run resolves as a\n // microtask and the DOM change is never painted.\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n\n try {\n const target = this._getScopeTarget();\n const results = await runScan(target);\n if (!this._mounted) return results;\n this._results = results;\n this._render();\n return results;\n } finally {\n this._scanning = false;\n const btn = this._shadow.querySelector<HTMLButtonElement>(\"#btn-rescan\");\n if (btn) {\n btn.removeAttribute(\"data-scanning\");\n btn.disabled = false;\n }\n }\n }\n\n private _getFilteredViolations(): Result[] {\n const violations = this._results?.violations ?? [];\n return violations.filter((v) => {\n const impact = v.impact as Severity | null;\n if (impact && !this._activeSeverities.has(impact)) return false;\n const level = getViolationLevel(v.tags);\n if (level && !this._activeLevels.has(level)) return false;\n return true;\n });\n }\n\n private _render(): void {\n const filtered = this._getFilteredViolations();\n const total = this._results?.violations.length ?? 0;\n const panel = this._shadow.querySelector(\".panel\");\n\n if (!panel) {\n const template = document.createElement(\"template\");\n template.innerHTML = this._renderPanel(filtered, total);\n this._shadow.appendChild(template.content);\n this._bindEvents();\n return;\n }\n\n const countEl = panel.querySelector(\".panel-count\");\n if (countEl) {\n countEl.textContent = String(total);\n countEl.setAttribute(\"data-count\", String(total));\n }\n\n const fabCountEl = this._shadow.querySelector(\".fab-count\");\n if (fabCountEl) {\n fabCountEl.textContent = String(total);\n fabCountEl.setAttribute(\"data-count\", String(total));\n }\n\n const body = panel.querySelector(\".panel-body\");\n if (body) body.innerHTML = this._renderBody(filtered);\n\n this._bindHighlightEvents();\n }\n\n private _renderScanning(): void {\n const body = this._shadow.querySelector(\".panel-body\");\n if (body) {\n body.innerHTML = `\n <div class=\"scanning-state\" aria-live=\"polite\" aria-label=\"Scanning for accessibility issues\">\n <span class=\"scanning-spinner\" aria-hidden=\"true\">${icon(\"refresh-cw\")}</span>\n Scanning…\n </div>\n `;\n }\n }\n\n private _renderPanel(violations: Result[], total: number): string {\n return `\n <div class=\"panel\" role=\"complementary\" aria-label=\"Accessibility panel\">\n <div class=\"panel-header\">\n <span class=\"panel-title\">\n <span class=\"panel-title-icon\" aria-hidden=\"true\">${icon(\"filter\")}</span>\n a11y\n <span class=\"panel-count\" data-count=\"${total}\" aria-live=\"polite\" aria-label=\"${total} violations\">${total}</span>\n </span>\n <div class=\"panel-actions\" role=\"toolbar\" aria-label=\"Panel actions\">\n <button class=\"btn-icon\" id=\"btn-copy-all\" aria-label=\"Copy all violations to clipboard\" title=\"Copy all\">\n ${icon(\"copy\")}\n </button>\n <button class=\"btn-icon\" id=\"btn-rescan\" aria-label=\"Re-scan page\" title=\"Re-scan\">\n ${icon(\"refresh-cw\")}\n </button>\n <button class=\"btn-icon\" id=\"btn-minimize\" aria-label=\"Minimize panel\" title=\"Minimize\">\n ${icon(\"minus\")}\n </button>\n </div>\n </div>\n ${this._renderFilters()}\n <div class=\"panel-body\" role=\"region\" aria-label=\"Violations\">\n ${this._renderBody(violations)}\n </div>\n </div>\n <button class=\"fab\" aria-label=\"Open accessibility panel\" title=\"Open a11y panel\">\n <span class=\"fab-icon\" aria-hidden=\"true\">${icon(\"filter\")}</span>\n a11y\n <span class=\"fab-count\" data-count=\"${total}\">${total}</span>\n </button>\n `;\n }\n\n private _renderFilters(): string {\n const severities: Severity[] = [\"critical\", \"serious\", \"moderate\", \"minor\"];\n const levels = [\"A\", \"AA\", \"AAA\"];\n\n const severityChips = severities\n .map((s) => {\n const active = this._activeSeverities.has(s);\n const label = s.charAt(0).toUpperCase() + s.slice(1);\n return `<button class=\"filter-chip\" data-severity=\"${s}\" aria-pressed=\"${active}\">${label}</button>`;\n })\n .join(\"\");\n\n const levelChips = levels\n .map((l) => {\n const active = this._activeLevels.has(l);\n return `<button class=\"filter-chip\" data-level=\"${l}\" aria-pressed=\"${active}\">${l}</button>`;\n })\n .join(\"\");\n\n return `\n <div class=\"panel-filters\" aria-label=\"Filters\">\n <div class=\"filter-group\" role=\"group\" aria-label=\"Filter by severity\">${severityChips}</div>\n <div class=\"filter-group\" role=\"group\" aria-label=\"Filter by WCAG level\">${levelChips}</div>\n </div>\n `;\n }\n\n private _renderBody(violations: Result[]): string {\n if (!this._results) {\n return `\n <div class=\"empty-state\">\n <span class=\"scanning-spinner\" aria-hidden=\"true\">${icon(\"refresh-cw\")}</span>\n <span class=\"empty-state-body\">Running first scan…</span>\n </div>\n `;\n }\n\n if (violations.length === 0) {\n return `\n <div class=\"empty-state\">\n <span class=\"empty-state-icon\" aria-hidden=\"true\">${icon(\"check-circle\")}</span>\n <span class=\"empty-state-title\">No violations found</span>\n <span class=\"empty-state-body\">\n ${this._results.violations.length > 0 ? \"All violations filtered out.\" : \"Great job! The scanned area has no axe-core violations.\"}\n </span>\n </div>\n `;\n }\n\n const items = violations.map((v, i) => this._renderViolationItem(v, i)).join(\"\");\n return `<ul class=\"violation-list\" role=\"list\" aria-label=\"${violations.length} violation${violations.length !== 1 ? \"s\" : \"\"}\">${items}</ul>`;\n }\n\n private _renderViolationItem(violation: Result, index: number): string {\n const impact = (violation.impact ?? \"minor\") as Severity;\n const iconName = SEVERITY_ICON[impact];\n const nodeCount = violation.nodes.length;\n const nodeLabel = `${nodeCount} node${nodeCount !== 1 ? \"s\" : \"\"}`;\n\n const nodes = violation.nodes\n .map((node, ni) => {\n const selector = this._nodeSelector(node.target);\n return `\n <li class=\"violation-node-item\">\n <button class=\"btn-highlight\" data-violation=\"${index}\" data-node=\"${ni}\" aria-label=\"Highlight: ${selector}\">\n ${selector}\n </button>\n </li>\n `;\n })\n .join(\"\");\n\n return `\n <li class=\"violation-item\">\n <button class=\"violation-toggle\" aria-expanded=\"false\" aria-controls=\"violation-detail-${index}\">\n <span class=\"severity-icon\" data-severity=\"${impact}\" aria-hidden=\"true\">${icon(iconName)}</span>\n <span class=\"violation-rule\">${violation.id}</span>\n <span class=\"violation-node-count\" aria-label=\"${nodeLabel}\">${nodeLabel}</span>\n <span class=\"chevron-icon\" aria-hidden=\"true\">${icon(\"chevron-down\")}</span>\n </button>\n <div class=\"violation-detail\" id=\"violation-detail-${index}\" role=\"region\" aria-label=\"${violation.id} details\">\n <p class=\"violation-description\">${violation.description}</p>\n <ul class=\"violation-nodes-list\" aria-label=\"Affected elements\">${nodes}</ul>\n <div class=\"violation-footer\">\n <a class=\"violation-help-link\" href=\"${violation.helpUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">\n Learn more ↗\n </a>\n <button class=\"btn-copy-single\" data-copy-violation=\"${index}\" aria-label=\"Copy ${violation.id} to clipboard\" title=\"Copy violation\">\n ${icon(\"copy\")} Copy\n </button>\n </div>\n </div>\n </li>\n `;\n }\n\n private _nodeSelector(target: Array<string | string[]>): string {\n const last = target[target.length - 1];\n return (Array.isArray(last) ? last[last.length - 1] : last) ?? \"\";\n }\n\n private _bindEvents(): void {\n const panel = this._shadow.querySelector(\".panel\");\n if (!panel) return;\n\n panel.querySelector(\"#btn-rescan\")?.addEventListener(\"click\", () => void this._runScan());\n panel.querySelector(\"#btn-minimize\")?.addEventListener(\"click\", () => {\n this.setAttribute(\"data-minimized\", \"\");\n });\n panel.querySelector(\"#btn-copy-all\")?.addEventListener(\"click\", () => void this._copyAll());\n\n panel.addEventListener(\"click\", (e) => this._handlePanelClick(e));\n panel.addEventListener(\"keydown\", (e) => this._handlePanelKeydown(e as KeyboardEvent));\n\n this._shadow.querySelector(\".fab\")?.addEventListener(\"click\", () => {\n this.removeAttribute(\"data-minimized\");\n });\n\n this._bindHighlightEvents();\n }\n\n private _bindHighlightEvents(): void {\n for (const btn of this._shadow.querySelectorAll(\".btn-highlight\")) {\n btn.addEventListener(\"click\", (e) => {\n const target = e.currentTarget as HTMLElement;\n const vIdx = Number.parseInt(target.dataset.violation ?? \"\", 10);\n const nIdx = Number.parseInt(target.dataset.node ?? \"\", 10);\n this._highlightNode(vIdx, nIdx);\n });\n }\n }\n\n private _handlePanelClick(e: Event): void {\n const target = e.target as HTMLElement;\n\n const toggle = target.closest(\".violation-toggle\") as HTMLElement | null;\n if (toggle) {\n const expanded = toggle.getAttribute(\"aria-expanded\") === \"true\";\n toggle.setAttribute(\"aria-expanded\", String(!expanded));\n const detailId = toggle.getAttribute(\"aria-controls\");\n const detail = detailId ? this._shadow.getElementById(detailId) : null;\n if (detail) {\n if (expanded) {\n detail.removeAttribute(\"data-open\");\n } else {\n detail.setAttribute(\"data-open\", \"\");\n }\n }\n return;\n }\n\n const copyBtn = target.closest(\".btn-copy-single\") as HTMLElement | null;\n if (copyBtn) {\n const vIdx = Number.parseInt(copyBtn.dataset.copyViolation ?? \"\", 10);\n void this._copySingle(vIdx);\n return;\n }\n\n const chip = target.closest(\".filter-chip\") as HTMLElement | null;\n if (chip) {\n const severity = chip.dataset.severity;\n const level = chip.dataset.level;\n if (severity && isSeverity(severity)) {\n const active = this._activeSeverities.has(severity);\n if (active && this._activeSeverities.size > 1) {\n this._activeSeverities.delete(severity);\n chip.setAttribute(\"aria-pressed\", \"false\");\n } else if (!active) {\n this._activeSeverities.add(severity);\n chip.setAttribute(\"aria-pressed\", \"true\");\n }\n this._refreshBody();\n } else if (level) {\n const active = this._activeLevels.has(level);\n if (active && this._activeLevels.size > 1) {\n this._activeLevels.delete(level);\n chip.setAttribute(\"aria-pressed\", \"false\");\n } else if (!active) {\n this._activeLevels.add(level);\n chip.setAttribute(\"aria-pressed\", \"true\");\n }\n this._refreshBody();\n }\n }\n }\n\n private _handlePanelKeydown(e: KeyboardEvent): void {\n if (e.key === \"Escape\") {\n this.setAttribute(\"data-minimized\", \"\");\n return;\n }\n\n const list = this._shadow.querySelector(\".violation-list\");\n if (!list) return;\n\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n const toggles = Array.from(list.querySelectorAll<HTMLElement>(\".violation-toggle\"));\n const current = this._shadow.activeElement as HTMLElement | null;\n const idx = current ? toggles.indexOf(current) : -1;\n const next =\n e.key === \"ArrowDown\"\n ? (toggles[idx + 1] ?? toggles[0])\n : (toggles[idx - 1] ?? toggles[toggles.length - 1]);\n if (next) {\n e.preventDefault();\n next.focus();\n }\n }\n }\n\n private _refreshBody(): void {\n const body = this._shadow.querySelector(\".panel-body\");\n if (body) {\n body.innerHTML = this._renderBody(this._getFilteredViolations());\n this._bindHighlightEvents();\n }\n\n const total = this._results?.violations.length ?? 0;\n const countEl = this._shadow.querySelector(\".panel-count\");\n if (countEl) {\n countEl.textContent = String(total);\n countEl.setAttribute(\"data-count\", String(total));\n }\n const fabCountEl = this._shadow.querySelector(\".fab-count\");\n if (fabCountEl) {\n fabCountEl.textContent = String(total);\n fabCountEl.setAttribute(\"data-count\", String(total));\n }\n }\n\n private _formatViolationsAsMarkdown(violations: Result[]): string {\n const header = `# a11y-hud scan results\\n**URL:** ${location.href}\\n**Time:** ${new Date().toISOString()}\\n\\n`;\n const body = violations\n .map((v) => {\n const nodes = v.nodes\n .map((n) => {\n const lines = [\"```html\", n.html, \"```\"];\n if (n.failureSummary) lines.push(`*Failure:* ${n.failureSummary}`);\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n return [\n \"---\",\n `### [${(v.impact ?? \"minor\").toUpperCase()}] ${v.id}`,\n `**Help:** ${v.help}`,\n `**Description:** ${v.description}`,\n `**Affected elements (${v.nodes.length}):**`,\n nodes,\n `**More info:** ${v.helpUrl}`,\n ].join(\"\\n\");\n })\n .join(\"\\n\\n\");\n return header + body;\n }\n\n private async _copyToClipboard(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.cssText = \"position:fixed;opacity:0;pointer-events:none\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n }\n\n private async _copyAll(): Promise<void> {\n const violations = this._results?.violations;\n if (!violations?.length) return;\n await this._copyToClipboard(this._formatViolationsAsMarkdown(violations));\n }\n\n private async _copySingle(violationIndex: number): Promise<void> {\n const violation = this._getFilteredViolations()[violationIndex];\n if (!violation) return;\n await this._copyToClipboard(this._formatViolationsAsMarkdown([violation]));\n }\n\n private _highlightNode(violationIndex: number, nodeIndex: number): void {\n this._removeHighlight?.();\n this._removeHighlight = undefined;\n\n const violation = this._getFilteredViolations()[violationIndex];\n if (!violation) return;\n const node = violation.nodes[nodeIndex];\n if (!node) return;\n\n const el = findElement(node.target) as HTMLElement | null;\n if (!el) return;\n\n ensureHighlightStyle(document);\n el.setAttribute(HIGHLIGHT_ATTR, \"\");\n el.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n\n this._removeHighlight = () => el.removeAttribute(HIGHLIGHT_ATTR);\n }\n}\n\ncustomElements.define(\"a11y-hud\", A11yHudElement);\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { AxeResults } from 'axe-core';
|
|
2
|
+
export { AxeResults } from 'axe-core';
|
|
3
|
+
|
|
4
|
+
declare function runScan(target?: Element): Promise<AxeResults>;
|
|
5
|
+
|
|
6
|
+
type Theme = "auto" | "default" | "light" | "high-contrast";
|
|
7
|
+
type ResolvedTheme = "default" | "light" | "high-contrast";
|
|
8
|
+
type Severity = "minor" | "moderate" | "serious" | "critical";
|
|
9
|
+
interface MountOptions {
|
|
10
|
+
theme?: Theme;
|
|
11
|
+
scope?: string | Element;
|
|
12
|
+
autoScan?: boolean;
|
|
13
|
+
debounce?: number;
|
|
14
|
+
}
|
|
15
|
+
interface A11yHudInstance {
|
|
16
|
+
unmount(): void;
|
|
17
|
+
setTheme(theme: Theme): void;
|
|
18
|
+
runScan(): Promise<AxeResults>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
declare function mount(options?: MountOptions): A11yHudInstance;
|
|
22
|
+
|
|
23
|
+
declare class A11yHudElement extends HTMLElement {
|
|
24
|
+
static observedAttributes: string[];
|
|
25
|
+
private _shadow;
|
|
26
|
+
private _theme;
|
|
27
|
+
private _scopeSelector;
|
|
28
|
+
private _scopeElement;
|
|
29
|
+
private _autoScan;
|
|
30
|
+
private _debounceMs;
|
|
31
|
+
private _results;
|
|
32
|
+
private _scanning;
|
|
33
|
+
private _mounted;
|
|
34
|
+
private _observer;
|
|
35
|
+
private _unwatchTheme;
|
|
36
|
+
private _removeHighlight;
|
|
37
|
+
private _activeSeverities;
|
|
38
|
+
private _activeLevels;
|
|
39
|
+
private _debouncedScan;
|
|
40
|
+
constructor();
|
|
41
|
+
private _applyStyles;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
|
|
45
|
+
get scopeElement(): Element | undefined;
|
|
46
|
+
set scopeElement(el: Element | undefined);
|
|
47
|
+
setTheme(theme: Theme): void;
|
|
48
|
+
triggerScan(): Promise<AxeResults>;
|
|
49
|
+
private _getScopeTarget;
|
|
50
|
+
private _applyResolvedTheme;
|
|
51
|
+
private _startObserver;
|
|
52
|
+
private _runScan;
|
|
53
|
+
private _getFilteredViolations;
|
|
54
|
+
private _render;
|
|
55
|
+
private _renderScanning;
|
|
56
|
+
private _renderPanel;
|
|
57
|
+
private _renderFilters;
|
|
58
|
+
private _renderBody;
|
|
59
|
+
private _renderViolationItem;
|
|
60
|
+
private _nodeSelector;
|
|
61
|
+
private _bindEvents;
|
|
62
|
+
private _bindHighlightEvents;
|
|
63
|
+
private _handlePanelClick;
|
|
64
|
+
private _handlePanelKeydown;
|
|
65
|
+
private _refreshBody;
|
|
66
|
+
private _formatViolationsAsMarkdown;
|
|
67
|
+
private _copyToClipboard;
|
|
68
|
+
private _copyAll;
|
|
69
|
+
private _copySingle;
|
|
70
|
+
private _highlightNode;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { A11yHudElement, type A11yHudInstance, type MountOptions, type ResolvedTheme, type Severity, type Theme, mount, runScan };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { AxeResults } from 'axe-core';
|
|
2
|
+
export { AxeResults } from 'axe-core';
|
|
3
|
+
|
|
4
|
+
declare function runScan(target?: Element): Promise<AxeResults>;
|
|
5
|
+
|
|
6
|
+
type Theme = "auto" | "default" | "light" | "high-contrast";
|
|
7
|
+
type ResolvedTheme = "default" | "light" | "high-contrast";
|
|
8
|
+
type Severity = "minor" | "moderate" | "serious" | "critical";
|
|
9
|
+
interface MountOptions {
|
|
10
|
+
theme?: Theme;
|
|
11
|
+
scope?: string | Element;
|
|
12
|
+
autoScan?: boolean;
|
|
13
|
+
debounce?: number;
|
|
14
|
+
}
|
|
15
|
+
interface A11yHudInstance {
|
|
16
|
+
unmount(): void;
|
|
17
|
+
setTheme(theme: Theme): void;
|
|
18
|
+
runScan(): Promise<AxeResults>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
declare function mount(options?: MountOptions): A11yHudInstance;
|
|
22
|
+
|
|
23
|
+
declare class A11yHudElement extends HTMLElement {
|
|
24
|
+
static observedAttributes: string[];
|
|
25
|
+
private _shadow;
|
|
26
|
+
private _theme;
|
|
27
|
+
private _scopeSelector;
|
|
28
|
+
private _scopeElement;
|
|
29
|
+
private _autoScan;
|
|
30
|
+
private _debounceMs;
|
|
31
|
+
private _results;
|
|
32
|
+
private _scanning;
|
|
33
|
+
private _mounted;
|
|
34
|
+
private _observer;
|
|
35
|
+
private _unwatchTheme;
|
|
36
|
+
private _removeHighlight;
|
|
37
|
+
private _activeSeverities;
|
|
38
|
+
private _activeLevels;
|
|
39
|
+
private _debouncedScan;
|
|
40
|
+
constructor();
|
|
41
|
+
private _applyStyles;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
|
|
45
|
+
get scopeElement(): Element | undefined;
|
|
46
|
+
set scopeElement(el: Element | undefined);
|
|
47
|
+
setTheme(theme: Theme): void;
|
|
48
|
+
triggerScan(): Promise<AxeResults>;
|
|
49
|
+
private _getScopeTarget;
|
|
50
|
+
private _applyResolvedTheme;
|
|
51
|
+
private _startObserver;
|
|
52
|
+
private _runScan;
|
|
53
|
+
private _getFilteredViolations;
|
|
54
|
+
private _render;
|
|
55
|
+
private _renderScanning;
|
|
56
|
+
private _renderPanel;
|
|
57
|
+
private _renderFilters;
|
|
58
|
+
private _renderBody;
|
|
59
|
+
private _renderViolationItem;
|
|
60
|
+
private _nodeSelector;
|
|
61
|
+
private _bindEvents;
|
|
62
|
+
private _bindHighlightEvents;
|
|
63
|
+
private _handlePanelClick;
|
|
64
|
+
private _handlePanelKeydown;
|
|
65
|
+
private _refreshBody;
|
|
66
|
+
private _formatViolationsAsMarkdown;
|
|
67
|
+
private _copyToClipboard;
|
|
68
|
+
private _copyAll;
|
|
69
|
+
private _copySingle;
|
|
70
|
+
private _highlightNode;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { A11yHudElement, type A11yHudInstance, type MountOptions, type ResolvedTheme, type Severity, type Theme, mount, runScan };
|