a11y-hud 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -0
- package/dist/index.cjs +59 -51
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +59 -51
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +50 -43
- package/dist/index.umd.js.map +1 -1
- package/package.json +4 -4
package/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# a11y-hud
|
|
2
|
+
|
|
3
|
+
A framework-agnostic developer overlay that runs [axe-core](https://github.com/dequelabs/axe-core) accessibility audits inside your running web app — no browser extension required.
|
|
4
|
+
|
|
5
|
+
- **No DevTools required** — the HUD runs in the page itself, not as an extension.
|
|
6
|
+
- **Framework-agnostic** — works with any stack. Framework adapters available for React, Vue, Angular, Svelte, and Solid.
|
|
7
|
+
- **Interactive** — violation list with severity filters, click-to-highlight, keyboard navigation, and clipboard export.
|
|
8
|
+
- **Three built-in themes** — `default` (dark), `light`, `high-contrast`; `auto` respects `prefers-color-scheme`.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npm install a11y-hud
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
### Imperative (any framework)
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { mount } from "a11y-hud";
|
|
22
|
+
|
|
23
|
+
const hud = mount({ theme: "auto" });
|
|
24
|
+
|
|
25
|
+
// later
|
|
26
|
+
hud.unmount();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Declarative (HTML / script tag)
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<script src="https://cdn.jsdelivr.net/npm/a11y-hud/dist/index.umd.js"></script>
|
|
33
|
+
<a11y-hud theme="auto"></a11y-hud>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Options
|
|
37
|
+
|
|
38
|
+
| Option | Type | Default | Description |
|
|
39
|
+
|--------|------|---------|-------------|
|
|
40
|
+
| `theme` | `"auto" \| "default" \| "light" \| "high-contrast"` | `"auto"` | Panel theme |
|
|
41
|
+
| `scope` | `string \| Element` | `document.body` | Restrict scan to a subtree |
|
|
42
|
+
| `autoScan` | `boolean` | `true` | Auto-rescan on DOM mutations |
|
|
43
|
+
| `debounce` | `number` | `500` | Debounce delay in ms |
|
|
44
|
+
|
|
45
|
+
### Headless API
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { runScan } from "a11y-hud";
|
|
49
|
+
|
|
50
|
+
const results = await runScan(document.querySelector("#my-app"));
|
|
51
|
+
console.log(results.violations);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Framework adapters
|
|
55
|
+
|
|
56
|
+
- React — [`@a11y-hud/react`](https://www.npmjs.com/package/@a11y-hud/react)
|
|
57
|
+
- Vue — [`@a11y-hud/vue`](https://www.npmjs.com/package/@a11y-hud/vue)
|
|
58
|
+
- Angular — `@a11y-hud/angular` _(coming soon)_
|
|
59
|
+
- Svelte — `@a11y-hud/svelte` _(coming soon)_
|
|
60
|
+
- Solid — `@a11y-hud/solid` _(coming soon)_
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT © Arthur Vasconcelos
|
|
65
|
+
|
|
66
|
+
Icon set: [Lucide](https://lucide.dev/) (MIT). See [LICENSE-ICONS.md](https://github.com/arthurvasconcelos/a11y-hud/blob/main/LICENSE-ICONS.md).
|
package/dist/index.cjs
CHANGED
|
@@ -6,56 +6,6 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
6
6
|
|
|
7
7
|
var axe__default = /*#__PURE__*/_interopDefault(axe);
|
|
8
8
|
|
|
9
|
-
// src/scan.ts
|
|
10
|
-
async function runScan(target = document.body) {
|
|
11
|
-
const results = await axe__default.default.run(target);
|
|
12
|
-
results.violations = results.violations.map((v) => ({
|
|
13
|
-
...v,
|
|
14
|
-
nodes: v.nodes.filter((node) => {
|
|
15
|
-
const first = node.target[0];
|
|
16
|
-
const selector = (Array.isArray(first) ? first[0] : first) ?? "";
|
|
17
|
-
return !String(selector).toLowerCase().startsWith("a11y-hud");
|
|
18
|
-
})
|
|
19
|
-
})).filter((v) => v.nodes.length > 0);
|
|
20
|
-
return results;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// src/mount.ts
|
|
24
|
-
function mount(options = {}) {
|
|
25
|
-
let el = document.querySelector("a11y-hud");
|
|
26
|
-
if (!el) {
|
|
27
|
-
el = document.createElement("a11y-hud");
|
|
28
|
-
document.body.appendChild(el);
|
|
29
|
-
}
|
|
30
|
-
if (options.theme !== void 0) el.setAttribute("theme", options.theme);
|
|
31
|
-
if (options.scope !== void 0) {
|
|
32
|
-
if (typeof options.scope === "string") {
|
|
33
|
-
el.setAttribute("scope", options.scope);
|
|
34
|
-
} else {
|
|
35
|
-
el.scopeElement = options.scope;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (options.autoScan === false) {
|
|
39
|
-
el.removeAttribute("auto-scan");
|
|
40
|
-
} else if (options.autoScan === true) {
|
|
41
|
-
el.setAttribute("auto-scan", "");
|
|
42
|
-
}
|
|
43
|
-
if (options.debounce !== void 0) {
|
|
44
|
-
el.setAttribute("debounce", String(options.debounce));
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
unmount() {
|
|
48
|
-
el.remove();
|
|
49
|
-
},
|
|
50
|
-
setTheme(theme) {
|
|
51
|
-
el.setTheme(theme);
|
|
52
|
-
},
|
|
53
|
-
async runScan() {
|
|
54
|
-
return el.triggerScan();
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
9
|
// src/icons/alert-circle.svg
|
|
60
10
|
var alert_circle_default = '<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';
|
|
61
11
|
|
|
@@ -129,9 +79,31 @@ function debounce(fn, delay) {
|
|
|
129
79
|
debounced.cancel = () => clearTimeout(timer);
|
|
130
80
|
return debounced;
|
|
131
81
|
}
|
|
82
|
+
var activeRun = null;
|
|
83
|
+
async function runScan(target = document.body) {
|
|
84
|
+
if (activeRun) {
|
|
85
|
+
await activeRun.catch(() => {
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const run = axe__default.default.run(target).then((results) => {
|
|
89
|
+
results.violations = results.violations.map((v) => ({
|
|
90
|
+
...v,
|
|
91
|
+
nodes: v.nodes.filter((node) => {
|
|
92
|
+
const first = node.target[0];
|
|
93
|
+
const selector = (Array.isArray(first) ? first[0] : first) ?? "";
|
|
94
|
+
return !String(selector).toLowerCase().startsWith("a11y-hud");
|
|
95
|
+
})
|
|
96
|
+
})).filter((v) => v.nodes.length > 0);
|
|
97
|
+
return results;
|
|
98
|
+
}).finally(() => {
|
|
99
|
+
activeRun = null;
|
|
100
|
+
});
|
|
101
|
+
activeRun = run;
|
|
102
|
+
return run;
|
|
103
|
+
}
|
|
132
104
|
|
|
133
105
|
// src/styles/base.css
|
|
134
|
-
var base_default = ':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/* \u2500\u2500 FAB (minimized state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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';
|
|
106
|
+
var base_default = ':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:\n background 120ms,\n 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:\n background 120ms,\n color 120ms,\n 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:\n background 120ms,\n 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/* \u2500\u2500 FAB (minimized state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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';
|
|
135
107
|
|
|
136
108
|
// src/styles/themes.css
|
|
137
109
|
var themes_default = ':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 \u2014 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';
|
|
@@ -695,6 +667,42 @@ ${themes_default}`;
|
|
|
695
667
|
};
|
|
696
668
|
customElements.define("a11y-hud", A11yHudElement);
|
|
697
669
|
|
|
670
|
+
// src/mount.ts
|
|
671
|
+
function mount(options = {}) {
|
|
672
|
+
let el = document.querySelector("a11y-hud");
|
|
673
|
+
if (!el) {
|
|
674
|
+
el = document.createElement("a11y-hud");
|
|
675
|
+
document.body.appendChild(el);
|
|
676
|
+
}
|
|
677
|
+
if (options.theme !== void 0) el.setAttribute("theme", options.theme);
|
|
678
|
+
if (options.scope !== void 0) {
|
|
679
|
+
if (typeof options.scope === "string") {
|
|
680
|
+
el.setAttribute("scope", options.scope);
|
|
681
|
+
} else {
|
|
682
|
+
el.scopeElement = options.scope;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
if (options.autoScan === false) {
|
|
686
|
+
el.removeAttribute("auto-scan");
|
|
687
|
+
} else if (options.autoScan === true) {
|
|
688
|
+
el.setAttribute("auto-scan", "");
|
|
689
|
+
}
|
|
690
|
+
if (options.debounce !== void 0) {
|
|
691
|
+
el.setAttribute("debounce", String(options.debounce));
|
|
692
|
+
}
|
|
693
|
+
return {
|
|
694
|
+
unmount() {
|
|
695
|
+
el.remove();
|
|
696
|
+
},
|
|
697
|
+
setTheme(theme) {
|
|
698
|
+
el.setTheme(theme);
|
|
699
|
+
},
|
|
700
|
+
async runScan() {
|
|
701
|
+
return el.triggerScan();
|
|
702
|
+
}
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
|
|
698
706
|
exports.A11yHudElement = A11yHudElement;
|
|
699
707
|
exports.mount = mount;
|
|
700
708
|
exports.runScan = runScan;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../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/scan.ts","../src/styles/base.css","../src/styles/themes.css","../src/theme.ts","../src/element.ts","../src/mount.ts"],"names":["axe"],"mappings":"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","file":"index.cjs","sourcesContent":["<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","import type { AxeResults } from \"axe-core\";\nimport axe from \"axe-core\";\n\n// axe-core does not support concurrent runs. Serialize all calls so that a\n// second scan triggered while one is in-flight (e.g. from React StrictMode's\n// double-invocation) waits for the active run to finish before starting.\nlet activeRun: Promise<AxeResults> | null = null;\n\nexport async function runScan(target: Element = document.body): Promise<AxeResults> {\n if (activeRun) {\n await activeRun.catch(() => {});\n }\n\n const run = axe\n .run(target)\n .then((results) => {\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 .finally(() => {\n activeRun = null;\n });\n\n activeRun = run;\n return run;\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:\n background 120ms,\n 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:\n background 120ms,\n color 120ms,\n 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:\n background 120ms,\n 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","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"]}
|