a11y-hud 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -56,8 +56,8 @@ console.log(results.violations);
56
56
  - React — [`@a11y-hud/react`](https://www.npmjs.com/package/@a11y-hud/react)
57
57
  - Vue — [`@a11y-hud/vue`](https://www.npmjs.com/package/@a11y-hud/vue)
58
58
  - Angular — [`@a11y-hud/angular`](https://www.npmjs.com/package/@a11y-hud/angular)
59
- - Svelte — `@a11y-hud/svelte` _(coming soon)_
60
- - Solid — `@a11y-hud/solid` _(coming soon)_
59
+ - Svelte 5 — [`@a11y-hud/svelte`](https://www.npmjs.com/package/@a11y-hud/svelte)
60
+ - Solid — [`@a11y-hud/solid`](https://www.npmjs.com/package/@a11y-hud/solid)
61
61
 
62
62
  ## License
63
63
 
package/dist/index.cjs CHANGED
@@ -80,12 +80,13 @@ function debounce(fn, delay) {
80
80
  return debounced;
81
81
  }
82
82
  var activeRun = null;
83
- async function runScan(target = document.body) {
83
+ async function runScan(target = document.body, runOnly) {
84
84
  if (activeRun) {
85
85
  await activeRun.catch(() => {
86
86
  });
87
87
  }
88
- const run = axe__default.default.run(target).then((results) => {
88
+ const options = runOnly && runOnly.length > 0 ? { runOnly: { type: "tag", values: runOnly } } : {};
89
+ const run = axe__default.default.run(target, options).then((results) => {
89
90
  results.violations = results.violations.map((v) => ({
90
91
  ...v,
91
92
  nodes: v.nodes.filter((node) => {
@@ -106,7 +107,7 @@ async function runScan(target = document.body) {
106
107
  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';
107
108
 
108
109
  // src/styles/themes.css
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';
110
+ 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="github-dark"]) {\n --a11y-hud-bg: #0d1117;\n --a11y-hud-bg-elevated: #161b22;\n --a11y-hud-bg-hover: #21262d;\n --a11y-hud-border: #30363d;\n --a11y-hud-text: #e6edf3;\n --a11y-hud-text-muted: #8b949e;\n --a11y-hud-critical: #ff7b72;\n --a11y-hud-serious: #ffa657;\n --a11y-hud-moderate: #e3b341;\n --a11y-hud-minor: #79c0ff;\n --a11y-hud-highlight: #d2a8ff;\n --a11y-hud-focus-ring: #2f81f7;\n}\n\n:host([data-theme="github-light"]) {\n --a11y-hud-bg: #ffffff;\n --a11y-hud-bg-elevated: #f6f8fa;\n --a11y-hud-bg-hover: #eaeef2;\n --a11y-hud-border: #d0d7de;\n --a11y-hud-text: #1f2328;\n --a11y-hud-text-muted: #636c76;\n --a11y-hud-critical: #cf222e;\n --a11y-hud-serious: #bc4c00;\n /* #8a5e00 gives 5.33:1 white-on-chip (was #9a6700 at 4.37:1 \u2014 neither black nor white passed) */\n --a11y-hud-moderate: #8a5e00;\n --a11y-hud-minor: #0550ae;\n --a11y-hud-highlight: #8250df;\n --a11y-hud-focus-ring: #0550ae;\n}\n\n:host([data-theme="github-light"]) .filter-chip[aria-pressed="true"][data-severity="critical"],\n:host([data-theme="github-light"]) .filter-chip[aria-pressed="true"][data-severity="serious"],\n:host([data-theme="github-light"]) .filter-chip[aria-pressed="true"][data-severity="moderate"],\n:host([data-theme="github-light"]) .filter-chip[aria-pressed="true"][data-severity="minor"] {\n color: #ffffff;\n}\n\n:host([data-theme="tokyo-night"]) {\n --a11y-hud-bg: #1a1b26;\n --a11y-hud-bg-elevated: #24283b;\n --a11y-hud-bg-hover: #2f3549;\n --a11y-hud-border: #3b4261;\n --a11y-hud-text: #c0caf5;\n /* #9aa5ce gives 7.67:1 on #1a1b26 (was #737aa2 at ~4.1:1) */\n --a11y-hud-text-muted: #9aa5ce;\n --a11y-hud-critical: #f7768e;\n --a11y-hud-serious: #ff9e64;\n --a11y-hud-moderate: #e0af68;\n --a11y-hud-minor: #7aa2f7;\n --a11y-hud-highlight: #bb9af7;\n --a11y-hud-focus-ring: #7aa2f7;\n}\n\n:host([data-theme="solarized-dark"]) {\n --a11y-hud-bg: #002b36;\n --a11y-hud-bg-elevated: #073642;\n --a11y-hud-bg-hover: #0d4456;\n --a11y-hud-border: #586e75;\n --a11y-hud-text: #eee8d5;\n --a11y-hud-text-muted: #93a1a1;\n --a11y-hud-critical: #dc322f;\n --a11y-hud-serious: #cb4b16;\n --a11y-hud-moderate: #b58900;\n /* #5ba4cf gives 5.78:1 on #002b36 for text, 5.78:1 for chip (was #268bd2 at ~3.1:1 for both) */\n --a11y-hud-minor: #5ba4cf;\n /* #f06090 gives 4.88:1 on #002b36 (was #d33682 at ~3.3:1) */\n --a11y-hud-highlight: #f06090;\n --a11y-hud-focus-ring: #268bd2;\n}\n\n/* Solarized Dark chip text overrides \u2014 canonical solarized palette falls in the\n middle-luminance zone where neither the panel bg (#002b36) nor white passes\n 4.5:1 on yellow/blue chip backgrounds. Use white text on red/orange,\n dark panel bg text on yellow/blue. */\n:host([data-theme="solarized-dark"]) .filter-chip[aria-pressed="true"][data-severity="critical"],\n:host([data-theme="solarized-dark"]) .filter-chip[aria-pressed="true"][data-severity="serious"] {\n color: #ffffff;\n}\n\n:host([data-theme="solarized-dark"]) .filter-chip[aria-pressed="true"][data-severity="moderate"],\n:host([data-theme="solarized-dark"]) .filter-chip[aria-pressed="true"][data-severity="minor"] {\n color: #002b36;\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';
110
111
 
111
112
  // src/theme.ts
112
113
  function resolveTheme(theme) {
@@ -177,7 +178,7 @@ function buildStyleSheet(css) {
177
178
  }
178
179
  }
179
180
  var A11yHudElement = class extends HTMLElement {
180
- static observedAttributes = ["theme", "scope", "auto-scan", "debounce"];
181
+ static observedAttributes = ["theme", "scope", "auto-scan", "debounce", "run-only"];
181
182
  _shadow;
182
183
  _theme = "auto";
183
184
  _scopeSelector;
@@ -192,6 +193,7 @@ var A11yHudElement = class extends HTMLElement {
192
193
  _removeHighlight;
193
194
  _activeSeverities = /* @__PURE__ */ new Set(["critical", "serious", "moderate", "minor"]);
194
195
  _activeLevels = /* @__PURE__ */ new Set(["A", "AA", "AAA"]);
196
+ _runOnly = [];
195
197
  _debouncedScan;
196
198
  constructor() {
197
199
  super();
@@ -260,6 +262,16 @@ ${themes_default}`;
260
262
  this._debouncedScan = debounce(() => void this._runScan(), this._debounceMs);
261
263
  break;
262
264
  }
265
+ case "run-only": {
266
+ try {
267
+ const parsed = value ? JSON.parse(value) : [];
268
+ this._runOnly = Array.isArray(parsed) ? parsed : [];
269
+ } catch {
270
+ this._runOnly = [];
271
+ }
272
+ if (this._mounted) this._updateRunOnlyChips();
273
+ break;
274
+ }
263
275
  }
264
276
  }
265
277
  get scopeElement() {
@@ -274,7 +286,16 @@ ${themes_default}`;
274
286
  this.setAttribute("theme", theme);
275
287
  this._applyResolvedTheme();
276
288
  }
277
- async triggerScan() {
289
+ setRunOnly(tags) {
290
+ this._runOnly = tags;
291
+ if (tags.length > 0) {
292
+ this.setAttribute("run-only", JSON.stringify(tags));
293
+ } else {
294
+ this.removeAttribute("run-only");
295
+ }
296
+ this._updateRunOnlyChips();
297
+ }
298
+ async runScan() {
278
299
  return this._runScan();
279
300
  }
280
301
  _getScopeTarget() {
@@ -315,7 +336,7 @@ ${themes_default}`;
315
336
  await new Promise((resolve) => setTimeout(resolve, 0));
316
337
  try {
317
338
  const target = this._getScopeTarget();
318
- const results = await runScan(target);
339
+ const results = await runScan(target, this._runOnly.length > 0 ? this._runOnly : void 0);
319
340
  if (!this._mounted) return results;
320
341
  this._results = results;
321
342
  this._render();
@@ -411,6 +432,7 @@ ${themes_default}`;
411
432
  _renderFilters() {
412
433
  const severities = ["critical", "serious", "moderate", "minor"];
413
434
  const levels = ["A", "AA", "AAA"];
435
+ const ruleSets = ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa", "wcag22aa", "best-practice"];
414
436
  const severityChips = severities.map((s) => {
415
437
  const active = this._activeSeverities.has(s);
416
438
  const label = s.charAt(0).toUpperCase() + s.slice(1);
@@ -420,10 +442,15 @@ ${themes_default}`;
420
442
  const active = this._activeLevels.has(l);
421
443
  return `<button class="filter-chip" data-level="${l}" aria-pressed="${active}">${l}</button>`;
422
444
  }).join("");
445
+ const ruleSetChips = ruleSets.map((r) => {
446
+ const active = this._runOnly.includes(r);
447
+ return `<button class="filter-chip" data-ruleset="${r}" aria-pressed="${active}">${r}</button>`;
448
+ }).join("");
423
449
  return `
424
450
  <div class="panel-filters" aria-label="Filters">
425
451
  <div class="filter-group" role="group" aria-label="Filter by severity">${severityChips}</div>
426
452
  <div class="filter-group" role="group" aria-label="Filter by WCAG level">${levelChips}</div>
453
+ <div class="filter-group" role="group" aria-label="Run only rule sets">${ruleSetChips}</div>
427
454
  </div>
428
455
  `;
429
456
  }
@@ -564,9 +591,26 @@ ${themes_default}`;
564
591
  chip.setAttribute("aria-pressed", "true");
565
592
  }
566
593
  this._refreshBody();
594
+ } else if (chip.dataset.ruleset) {
595
+ const ruleset = chip.dataset.ruleset;
596
+ const active = this._runOnly.includes(ruleset);
597
+ if (active) {
598
+ this._runOnly = this._runOnly.filter((r) => r !== ruleset);
599
+ chip.setAttribute("aria-pressed", "false");
600
+ } else {
601
+ this._runOnly = [...this._runOnly, ruleset];
602
+ chip.setAttribute("aria-pressed", "true");
603
+ }
604
+ void this._runScan();
567
605
  }
568
606
  }
569
607
  }
608
+ _updateRunOnlyChips() {
609
+ for (const chip of this._shadow.querySelectorAll(".filter-chip[data-ruleset]")) {
610
+ const active = this._runOnly.includes(chip.dataset.ruleset ?? "");
611
+ chip.setAttribute("aria-pressed", String(active));
612
+ }
613
+ }
570
614
  _handlePanelKeydown(e) {
571
615
  if (e.key === "Escape") {
572
616
  this.setAttribute("data-minimized", "");
@@ -690,6 +734,9 @@ function mount(options = {}) {
690
734
  if (options.debounce !== void 0) {
691
735
  el.setAttribute("debounce", String(options.debounce));
692
736
  }
737
+ if (options.runOnly !== void 0 && options.runOnly.length > 0) {
738
+ el.setAttribute("run-only", JSON.stringify(options.runOnly));
739
+ }
693
740
  return {
694
741
  unmount() {
695
742
  el.remove();
@@ -697,8 +744,11 @@ function mount(options = {}) {
697
744
  setTheme(theme) {
698
745
  el.setTheme(theme);
699
746
  },
747
+ setRunOnly(tags) {
748
+ el.setRunOnly(tags);
749
+ },
700
750
  async runScan() {
701
- return el.triggerScan();
751
+ return el.runScan();
702
752
  }
703
753
  };
704
754
  }
@@ -1 +1 @@
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"]}
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":";;;;;;;;;AAAA,IAAA,oBAAA,GAAA,+SAAA;;;ACAA,IAAA,sBAAA,GAAA,6TAAA;;;ACAA,IAAA,oBAAA,GAAA,uQAAA;;;ACAA,IAAA,oBAAA,GAAA,uNAAA;;;ACAA,IAAA,kBAAA,GAAA,yNAAA;;;ACAA,IAAA,YAAA,GAAA,0TAAA;;;ACAA,IAAA,cAAA,GAAA,8PAAA;;;ACAA,IAAA,YAAA,GAAA,yQAAA;;;ACAA,IAAA,gBAAA,GAAA,saAAA;;;ACAA,IAAA,aAAA,GAAA,mNAAA;;;ACAA,IAAA,YAAA,GAAA,6OAAA;;;ACAA,IAAA,kBAAA,GAAA,uWAAA;;;ACAA,IAAA,WAAA,GAAA,gbAAA;;;ACAA,IAAA,SAAA,GAAA,2OAAA;;;ACeA,IAAM,QAAA,GAAmC;AAAA,EACvC,cAAA,EAAgB,oBAAA;AAAA,EAChB,gBAAA,EAAkB,sBAAA;AAAA,EAClB,cAAA,EAAgB,oBAAA;AAAA,EAChB,cAAA,EAAgB,oBAAA;AAAA,EAChB,YAAA,EAAc,kBAAA;AAAA,EACd,IAAA,EAAA,YAAA;AAAA,EACA,MAAA,EAAA,cAAA;AAAA,EACA,IAAA,EAAA,YAAA;AAAA,EACA,QAAA,EAAA,gBAAA;AAAA,EACA,KAAA,EAAA,aAAA;AAAA,EACA,IAAA,EAAA,YAAA;AAAA,EACA,YAAA,EAAc,kBAAA;AAAA,EACd,GAAA,EAAA,WAAA;AAAA,EACA,CAAA,EAAA;AACF,CAAA;AAEO,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,IAAK,EAAA;AAC3B;;;AClCO,SAAS,QAAA,CACd,IACA,KAAA,EACwB;AACxB,EAAA,IAAI,KAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,KAAwB;AAC5C,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,KAAA,GAAQ,WAAW,MAAM,EAAA,CAAG,GAAI,IAAgB,GAAG,KAAK,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,SAAA,CAAU,MAAA,GAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAE3C,EAAA,OAAO,SAAA;AACT;ACRA,IAAI,SAAA,GAAwC,IAAA;AAE5C,eAAsB,OAAA,CACpB,MAAA,GAAkB,QAAA,CAAS,IAAA,EAC3B,OAAA,EACqB;AACrB,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,SAAA,CAAU,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,OAAA,GACJ,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,IAAI,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ,KAAM,EAAC;AAEnF,EAAA,MAAM,GAAA,GAAMA,qBACT,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA,CACnB,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,IAAA,OAAA,CAAQ,UAAA,GAAa,OAAA,CAAQ,UAAA,CAC1B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,GAAG,CAAA;AAAA,MACH,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC9B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,QAAA,MAAM,QAAA,GAAA,CAAY,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,CAAM,CAAC,IAAI,KAAA,KAAU,EAAA;AAC9D,QAAA,OAAO,CAAC,MAAA,CAAO,QAAQ,EAAE,WAAA,EAAY,CAAE,WAAW,UAAU,CAAA;AAAA,MAC9D,CAAC;AAAA,KACH,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AACnC,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAC,CAAA;AAEH,EAAA,SAAA,GAAY,GAAA;AACZ,EAAA,OAAO,GAAA;AACT;;;ACxCA,IAAA,YAAA,GAAA,qkWAAA;;;ACAA,IAAA,cAAA,GAAA,gmJAAA;;;ACEO,SAAS,aAAa,KAAA,EAA6B;AACxD,EAAA,IAAI,UAAA,CAAW,0BAA0B,CAAA,CAAE,OAAA,EAAS,OAAO,eAAA;AAC3D,EAAA,IAAI,KAAA,KAAU,MAAA;AACZ,IAAA,OAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,GAAU,SAAA,GAAY,OAAA;AAC1E,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,UAAA,CACd,UACA,QAAA,EACY;AACZ,EAAA,MAAM,WAAA,GAAc,WAAW,8BAA8B,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,WAAW,0BAA0B,CAAA;AAEtD,EAAA,MAAM,UAAU,MAAM,QAAA,CAAS,YAAA,CAAa,QAAA,EAAU,CAAC,CAAA;AAEvD,EAAA,WAAA,CAAY,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAC9C,EAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAE3C,EAAA,OAAO,MAAM;AACX,IAAA,WAAA,CAAY,mBAAA,CAAoB,UAAU,OAAO,CAAA;AACjD,IAAA,QAAA,CAAS,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,EAChD,CAAA;AACF;;;AChBA,IAAM,cAAA,GAAiB,2BAAA;AACvB,IAAM,kBAAA,GAAqB,0BAAA;AAC3B,IAAM,aAAA,GAAgB,IAAI,cAAc,CAAA,gGAAA,CAAA;AAExC,IAAM,eAAA,GAA4C;AAAA,EAChD,CAAA,EAAG,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,EACvB,EAAA,EAAI,CAAC,SAAA,EAAW,UAAA,EAAY,UAAU,CAAA;AAAA,EACtC,GAAA,EAAK,CAAC,UAAU;AAClB,CAAA;AAEA,IAAM,aAAA,GAA0C;AAAA,EAC9C,QAAA,EAAU,gBAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,WAAW,KAAA,EAAyC;AAC3D,EAAA,OAAO,UAAU,UAAA,IAAc,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,cAAc,KAAA,KAAU,OAAA;AAC1F;AAEA,SAAS,kBAAkB,IAAA,EAAwB;AACjD,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAChE,IAAA,IAAI,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,UAAU,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,EACtD;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,YAAY,MAAA,EAAkD;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAC/D,IAAA,OAAO,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,GAAI,IAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,GAAA,EAAqB;AACjD,EAAA,IAAI,GAAA,CAAI,cAAA,CAAe,kBAAkB,CAAA,EAAG;AAC5C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,KAAA,CAAM,EAAA,GAAK,kBAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,aAAA;AACpB,EAAA,GAAA,CAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAC5B;AAEA,SAAS,gBAAgB,GAAA,EAAmC;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,EAAc;AAChC,IAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AACrB,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC9C,OAAO,kBAAA,GAAqB,CAAC,SAAS,OAAA,EAAS,WAAA,EAAa,YAAY,UAAU,CAAA;AAAA,EAE1E,OAAA;AAAA,EACA,MAAA,GAAgB,MAAA;AAAA,EAChB,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,WAAA,GAAc,GAAA;AAAA,EACd,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA,uBAAwB,GAAA,CAAc,CAAC,YAAY,SAAA,EAAW,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EAClF,gCAAgB,IAAI,GAAA,CAAY,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,EAClD,WAAqB,EAAC;AAAA,EACtB,cAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjD,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,MAAM,KAAK,KAAK,QAAA,EAAS,EAAG,KAAK,WAAW,CAAA;AAC3E,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,QAAA,GAAW,GAAG,YAAO;AAAA,EAAK,cAAS,CAAA,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,gBAAgB,QAAQ,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,OAAA,CAAQ,kBAAA,GAAqB,CAAC,KAAK,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,KAAA,CAAM,WAAA,GAAc,QAAA;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,iBAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,aAAA,GAAgB,UAAA;AAAA,MACnB,MAAM,IAAA,CAAK,MAAA;AAAA,MACX,CAAC,QAAA,KAAa;AACZ,QAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,QAAA;AAAA,MACvB;AAAA,KACF;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,cAAA,EAAe;AACxC,IAAA,KAAK,KAAK,QAAA,EAAS;AAAA,EACrB;AAAA,EAEA,oBAAA,GAA6B;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,WAAW,UAAA,EAAW;AAC3B,IAAA,IAAA,CAAK,aAAA,IAAgB;AACrB,IAAA,IAAA,CAAK,gBAAA,IAAmB;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,IAAA,CAAK,eAAe,MAAA,EAAO;AAAA,EAC7B;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACtF,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,SAAU,KAAA,IAA0B,MAAA;AACzC,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,mBAAA,EAAoB;AAC5C,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,iBAAiB,KAAA,IAAS,MAAA;AAC/B,QAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,YAAY,KAAA,KAAU,IAAA;AAC3B,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,IAAI,KAAK,SAAA,EAAW;AAClB,YAAA,IAAA,CAAK,cAAA,EAAe;AAAA,UACtB,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,WAAW,UAAA,EAAW;AAC3B,YAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,UACnB;AAAA,QACF;AACA,QAAA;AAAA,MACF,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,IAAI,EAAE,CAAA;AAC9C,QAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,MAAM,IAAI,GAAA,GAAM,MAAA;AAChD,QAAA,IAAA,CAAK,eAAe,MAAA,EAAO;AAC3B,QAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,MAAM,KAAK,KAAK,QAAA,EAAS,EAAG,KAAK,WAAW,CAAA;AAC3E,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,IAAgB,EAAC;AACzD,UAAA,IAAA,CAAK,WAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,SAAsB,EAAC;AAAA,QAClE,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,WAAW,EAAC;AAAA,QACnB;AACA,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,mBAAA,EAAoB;AAC5C,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA,EAEA,IAAI,YAAA,GAAoC;AACtC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,IAAI,aAAa,EAAA,EAAyB;AACxC,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AACrB,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,EACxB;AAAA,EAEA,SAAS,KAAA,EAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,IAAA,EAAsB;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAA,GAA+B;AACnC,IAAA,OAAO,KAAK,QAAA,EAAS;AAAA,EACvB;AAAA,EAEQ,eAAA,GAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AACpC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAO,QAAA,CAAS,aAAA,CAAc,IAAA,CAAK,cAAc,KAAK,QAAA,CAAS,IAAA;AAAA,IACjE;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,WAAW,UAAA,EAAW;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,MAAM,gBAAgB,IAAA,CAAK,cAAA;AAE3B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,CAAC,OAAA,KAAY;AAIjD,MAAA,IAAI,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,aAAA,KAAkB,cAAc,CAAA;AACpF,QAAA;AACF,MAAA,aAAA,EAAc;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,MAAA,EAAQ;AAAA,MAC7B,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,QAAA,GAAgC;AAC5C,IAAA,IAAI,IAAA,CAAK,WAAW,OAAO,IAAA,CAAK,YAAa,EAAE,UAAA,EAAY,EAAC,EAAE;AAC9D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAiC,aAAa,CAAA;AAC7E,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,YAAA,CAAa,iBAAiB,EAAE,CAAA;AAC1C,MAAA,SAAA,CAAU,QAAA,GAAW,IAAA;AAAA,IACvB;AAIA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,eAAA,EAAgB;AAKzC,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AAE3D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,QAAA,GAAW,KAAA,CAAS,CAAA;AAC1F,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,OAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAiC,aAAa,CAAA;AACvE,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,gBAAgB,eAAe,CAAA;AACnC,QAAA,GAAA,CAAI,QAAA,GAAW,KAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAA,GAAmC;AACzC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,EAAU,UAAA,IAAc,EAAC;AACjD,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM;AAC9B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,UAAU,CAAC,IAAA,CAAK,kBAAkB,GAAA,CAAI,MAAM,GAAG,OAAO,KAAA;AAC1D,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,CAAA,CAAE,IAAI,CAAA;AACtC,MAAA,IAAI,SAAS,CAAC,IAAA,CAAK,cAAc,GAAA,CAAI,KAAK,GAAG,OAAO,KAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,MAAM,QAAA,GAAW,KAAK,sBAAA,EAAuB;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAU,UAAA,CAAW,MAAA,IAAU,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA;AAEjD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,MAAA,QAAA,CAAS,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,KAAK,CAAA;AACtD,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA;AACzC,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,aAAA,CAAc,cAAc,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,WAAA,GAAc,OAAO,KAAK,CAAA;AAClC,MAAA,OAAA,CAAQ,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,YAAY,CAAA;AAC1D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,WAAA,GAAc,OAAO,KAAK,CAAA;AACrC,MAAA,UAAA,CAAW,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,aAAa,CAAA;AAC9C,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,YAAY,QAAQ,CAAA;AAEpD,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,aAAa,CAAA;AACrD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,SAAA,GAAY;AAAA;AAAA,4DAAA,EAEuC,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAI5E;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,YAAsB,KAAA,EAAuB;AAChE,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,8DAAA,EAIqD,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA;AAAA,kDAAA,EAE1B,KAAK,CAAA,iCAAA,EAAoC,KAAK,CAAA,aAAA,EAAgB,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAIvG,IAAA,CAAK,MAAM,CAAC;AAAA;AAAA;AAAA,cAAA,EAGZ,IAAA,CAAK,YAAY,CAAC;AAAA;AAAA;AAAA,cAAA,EAGlB,IAAA,CAAK,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,QAAA,EAInB,IAAA,CAAK,gBAAgB;AAAA;AAAA,UAAA,EAEnB,IAAA,CAAK,WAAA,CAAY,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,kDAAA,EAIY,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA;AAAA,4CAAA,EAEpB,KAAK,KAAK,KAAK,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG3D;AAAA,EAEQ,cAAA,GAAyB;AAC/B,IAAA,MAAM,UAAA,GAAyB,CAAC,UAAA,EAAY,SAAA,EAAW,YAAY,OAAO,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAChC,IAAA,MAAM,WAAW,CAAC,QAAA,EAAU,WAAW,SAAA,EAAW,UAAA,EAAY,YAAY,eAAe,CAAA;AAEzF,IAAA,MAAM,aAAA,GAAgB,UAAA,CACnB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnD,MAAA,OAAO,CAAA,2CAAA,EAA8C,CAAC,CAAA,gBAAA,EAAmB,MAAM,KAAK,KAAK,CAAA,SAAA,CAAA;AAAA,IAC3F,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,MAAM,UAAA,GAAa,MAAA,CAChB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA;AACvC,MAAA,OAAO,CAAA,wCAAA,EAA2C,CAAC,CAAA,gBAAA,EAAmB,MAAM,KAAK,CAAC,CAAA,SAAA,CAAA;AAAA,IACpF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,MAAM,YAAA,GAAe,QAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA;AACvC,MAAA,OAAO,CAAA,0CAAA,EAA6C,CAAC,CAAA,gBAAA,EAAmB,MAAM,KAAK,CAAC,CAAA,SAAA,CAAA;AAAA,IACtF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,OAAO;AAAA;AAAA,+EAAA,EAEsE,aAAa,CAAA;AAAA,iFAAA,EACX,UAAU,CAAA;AAAA,+EAAA,EACZ,YAAY,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG3F;AAAA,EAEQ,YAAY,UAAA,EAA8B;AAChD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO;AAAA;AAAA,4DAAA,EAEiD,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAI5E;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO;AAAA;AAAA,4DAAA,EAEiD,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA;AAAA;AAAA,YAAA,EAGpE,KAAK,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,iCAAiC,yDAAyD;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAI1I;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,oBAAA,CAAqB,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC/E,IAAA,OAAO,CAAA,mDAAA,EAAsD,UAAA,CAAW,MAAM,CAAA,UAAA,EAAa,UAAA,CAAW,WAAW,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,KAAA,CAAA;AAAA,EACzI;AAAA,EAEQ,oBAAA,CAAqB,WAAmB,KAAA,EAAuB;AACrE,IAAA,MAAM,MAAA,GAAU,UAAU,MAAA,IAAU,OAAA;AACpC,IAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,MAAA;AAClC,IAAA,MAAM,YAAY,CAAA,EAAG,SAAS,QAAQ,SAAA,KAAc,CAAA,GAAI,MAAM,EAAE,CAAA,CAAA;AAEhE,IAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,CACrB,GAAA,CAAI,CAAC,MAAM,EAAA,KAAO;AACjB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAC/C,MAAA,OAAO;AAAA;AAAA,0DAAA,EAE6C,KAAK,CAAA,aAAA,EAAgB,EAAE,CAAA,yBAAA,EAA4B,QAAQ,CAAA;AAAA,cAAA,EACvG,QAAQ;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,IAIlB,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,OAAO;AAAA;AAAA,+FAAA,EAEsF,KAAK,CAAA;AAAA,qDAAA,EAC/C,MAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,uCAAA,EAC1D,UAAU,EAAE,CAAA;AAAA,yDAAA,EACM,SAAS,KAAK,SAAS,CAAA;AAAA,wDAAA,EACxB,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA;AAAA,2DAAA,EAEjB,KAAK,CAAA,4BAAA,EAA+B,SAAA,CAAU,EAAE,CAAA;AAAA,2CAAA,EAChE,UAAU,WAAW,CAAA;AAAA,0EAAA,EACU,KAAK,CAAA;AAAA;AAAA,iDAAA,EAE9B,UAAU,OAAO,CAAA;AAAA;AAAA;AAAA,iEAAA,EAGD,KAAK,CAAA,mBAAA,EAAsB,SAAA,CAAU,EAAE,CAAA;AAAA,cAAA,EAC1F,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAM1B;AAAA,EAEQ,cAAc,MAAA,EAA0C;AAC9D,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA,KAAS,EAAA;AAAA,EACjE;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA;AACjD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,KAAA,CAAM,aAAA,CAAc,aAAa,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM,KAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AACxF,IAAA,KAAA,CAAM,aAAA,CAAc,eAAe,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AACpE,MAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,EAAE,CAAA;AAAA,IACxC,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,aAAA,CAAc,eAAe,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM,KAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AAE1F,IAAA,KAAA,CAAM,iBAAiB,OAAA,EAAS,CAAC,MAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAChE,IAAA,KAAA,CAAM,iBAAiB,SAAA,EAAW,CAAC,MAAM,IAAA,CAAK,mBAAA,CAAoB,CAAkB,CAAC,CAAA;AAErF,IAAA,IAAA,CAAK,QAAQ,aAAA,CAAc,MAAM,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AAClE,MAAA,IAAA,CAAK,gBAAgB,gBAAgB,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,gBAAgB,CAAA,EAAG;AACjE,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnC,QAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,QAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,OAAA,CAAQ,SAAA,IAAa,IAAI,EAAE,CAAA;AAC/D,QAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,OAAA,CAAQ,IAAA,IAAQ,IAAI,EAAE,CAAA;AAC1D,QAAA,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,MAChC,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,kBAAkB,CAAA,EAAgB;AACxC,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA;AACjD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA;AAC1D,MAAA,MAAA,CAAO,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,CAAC,QAAQ,CAAC,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,eAAe,CAAA;AACpD,MAAA,MAAM,SAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA,GAAI,IAAA;AAClE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAA,CAAO,gBAAgB,WAAW,CAAA;AAAA,QACpC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,YAAA,CAAa,aAAa,EAAE,CAAA;AAAA,QACrC;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AACjD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,QAAQ,OAAA,CAAQ,aAAA,IAAiB,IAAI,EAAE,CAAA;AACpE,MAAA,KAAK,IAAA,CAAK,YAAY,IAAI,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA;AAC1C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAC9B,MAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAC3B,MAAA,IAAI,QAAA,IAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACpC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAClD,QAAA,IAAI,MAAA,IAAU,IAAA,CAAK,iBAAA,CAAkB,IAAA,GAAO,CAAA,EAAG;AAC7C,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AACtC,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,QAC3C,CAAA,MAAA,IAAW,CAAC,MAAA,EAAQ;AAClB,UAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAAA,QAC1C;AACA,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB,WAAW,KAAA,EAAO;AAChB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC3C,QAAA,IAAI,MAAA,IAAU,IAAA,CAAK,aAAA,CAAc,IAAA,GAAO,CAAA,EAAG;AACzC,UAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/B,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,QAC3C,CAAA,MAAA,IAAW,CAAC,MAAA,EAAQ;AAClB,UAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAK,CAAA;AAC5B,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAAA,QAC1C;AACA,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AAC/B,QAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,OAAA;AAC7B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AAC7C,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA;AACzD,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,UAAU,OAAO,CAAA;AAC1C,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAAA,QAC1C;AACA,QAAA,KAAK,KAAK,QAAA,EAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAA8B,4BAA4B,CAAA,EAAG;AAC3F,MAAA,MAAM,SAAS,IAAA,CAAK,QAAA,CAAS,SAAS,IAAA,CAAK,OAAA,CAAQ,WAAW,EAAE,CAAA;AAChE,MAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAEQ,oBAAoB,CAAA,EAAwB;AAClD,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,EAAE,CAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,iBAAiB,CAAA;AACzD,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAChD,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,mBAAmB,CAAC,CAAA;AAClF,MAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,aAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,GAAI,EAAA;AACjD,MAAA,MAAM,OACJ,CAAA,CAAE,GAAA,KAAQ,cACL,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,GAC7B,QAAQ,GAAA,GAAM,CAAC,KAAK,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAC,CAAA;AACrD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,aAAa,CAAA;AACrD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,wBAAwB,CAAA;AAC/D,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAU,UAAA,CAAW,MAAA,IAAU,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,cAAc,CAAA;AACzD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,WAAA,GAAc,OAAO,KAAK,CAAA;AAClC,MAAA,OAAA,CAAQ,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,YAAY,CAAA;AAC1D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,WAAA,GAAc,OAAO,KAAK,CAAA;AACrC,MAAA,UAAA,CAAW,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,4BAA4B,UAAA,EAA8B;AAChE,IAAA,MAAM,MAAA,GAAS,CAAA;AAAA,SAAA,EAAqC,SAAS,IAAI;AAAA,UAAA,EAAA,iBAAe,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa;;AAAA,CAAA;AACxG,IAAA,MAAM,IAAA,GAAO,UAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,QAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,EAAW,CAAA,CAAE,MAAM,KAAK,CAAA;AACvC,QAAA,IAAI,EAAE,cAAA,EAAgB,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,CAAA,CAAE,cAAc,CAAA,CAAE,CAAA;AACjE,QAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACxB,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AACd,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,CAAA,KAAA,EAAA,CAAS,EAAE,MAAA,IAAU,OAAA,EAAS,aAAa,CAAA,EAAA,EAAK,EAAE,EAAE,CAAA,CAAA;AAAA,QACpD,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA;AAAA,QACnB,CAAA,iBAAA,EAAoB,EAAE,WAAW,CAAA,CAAA;AAAA,QACjC,CAAA,qBAAA,EAAwB,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA,IAAA,CAAA;AAAA,QACtC,KAAA;AAAA,QACA,CAAA,eAAA,EAAkB,EAAE,OAAO,CAAA;AAAA,OAC7B,CAAE,KAAK,IAAI,CAAA;AAAA,IACb,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AACd,IAAA,OAAO,MAAA,GAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAc,iBAAiB,IAAA,EAA6B;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAC5C,MAAA,EAAA,CAAG,KAAA,GAAQ,IAAA;AACX,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,8CAAA;AACnB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAC5B,MAAA,EAAA,CAAG,MAAA,EAAO;AACV,MAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAC3B,MAAA,EAAA,CAAG,MAAA,EAAO;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAc,QAAA,GAA0B;AACtC,IAAA,MAAM,UAAA,GAAa,KAAK,QAAA,EAAU,UAAA;AAClC,IAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,2BAAA,CAA4B,UAAU,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAc,YAAY,cAAA,EAAuC;AAC/D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,sBAAA,EAAuB,CAAE,cAAc,CAAA;AAC9D,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,KAAK,gBAAA,CAAiB,IAAA,CAAK,4BAA4B,CAAC,SAAS,CAAC,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEQ,cAAA,CAAe,gBAAwB,SAAA,EAAyB;AACtE,IAAA,IAAA,CAAK,gBAAA,IAAmB;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAExB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,sBAAA,EAAuB,CAAE,cAAc,CAAA;AAC9D,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,oBAAA,CAAqB,QAAQ,CAAA;AAC7B,IAAA,EAAA,CAAG,YAAA,CAAa,gBAAgB,EAAE,CAAA;AAClC,IAAA,EAAA,CAAG,eAAe,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,WAAW,CAAA;AAE1D,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,EAAA,CAAG,eAAA,CAAgB,cAAc,CAAA;AAAA,EACjE;AACF;AAEA,cAAA,CAAe,MAAA,CAAO,YAAY,cAAc,CAAA;;;ACtqBzC,SAAS,KAAA,CAAM,OAAA,GAAwB,EAAC,EAAoB;AACjE,EAAA,IAAI,EAAA,GAAK,QAAA,CAAS,aAAA,CAA8B,UAAU,CAAA;AAE1D,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,EAAA,GAAK,QAAA,CAAS,cAAc,UAAU,CAAA;AACtC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,QAAQ,KAAA,KAAU,MAAA,KAAc,YAAA,CAAa,OAAA,EAAS,QAAQ,KAAK,CAAA;AAEvE,EAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,IAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,MAAA,EAAA,CAAG,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,eAAe,OAAA,CAAQ,KAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,KAAA,EAAO;AAC9B,IAAA,EAAA,CAAG,gBAAgB,WAAW,CAAA;AAAA,EAChC,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,KAAa,IAAA,EAAM;AACpC,IAAA,EAAA,CAAG,YAAA,CAAa,aAAa,EAAE,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,IAAA,EAAA,CAAG,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,QAAQ,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/D,IAAA,EAAA,CAAG,aAAa,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,GAAgB;AACd,MAAA,EAAA,CAAG,MAAA,EAAO;AAAA,IACZ,CAAA;AAAA,IACA,SAAS,KAAA,EAAoB;AAC3B,MAAA,EAAA,CAAG,SAAS,KAAK,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,WAAW,IAAA,EAAsB;AAC/B,MAAA,EAAA,CAAG,WAAW,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,MAAM,OAAA,GAA+B;AACnC,MAAA,OAAO,GAAG,OAAA,EAAQ;AAAA,IACpB;AAAA,GACF;AACF","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, RunOptions } 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(\n target: Element = document.body,\n runOnly?: string[]\n): Promise<AxeResults> {\n if (activeRun) {\n await activeRun.catch(() => {});\n }\n\n const options: RunOptions =\n runOnly && runOnly.length > 0 ? { runOnly: { type: \"tag\", values: runOnly } } : {};\n\n const run = axe\n .run(target, options)\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=\"github-dark\"]) {\n --a11y-hud-bg: #0d1117;\n --a11y-hud-bg-elevated: #161b22;\n --a11y-hud-bg-hover: #21262d;\n --a11y-hud-border: #30363d;\n --a11y-hud-text: #e6edf3;\n --a11y-hud-text-muted: #8b949e;\n --a11y-hud-critical: #ff7b72;\n --a11y-hud-serious: #ffa657;\n --a11y-hud-moderate: #e3b341;\n --a11y-hud-minor: #79c0ff;\n --a11y-hud-highlight: #d2a8ff;\n --a11y-hud-focus-ring: #2f81f7;\n}\n\n:host([data-theme=\"github-light\"]) {\n --a11y-hud-bg: #ffffff;\n --a11y-hud-bg-elevated: #f6f8fa;\n --a11y-hud-bg-hover: #eaeef2;\n --a11y-hud-border: #d0d7de;\n --a11y-hud-text: #1f2328;\n --a11y-hud-text-muted: #636c76;\n --a11y-hud-critical: #cf222e;\n --a11y-hud-serious: #bc4c00;\n /* #8a5e00 gives 5.33:1 white-on-chip (was #9a6700 at 4.37:1 — neither black nor white passed) */\n --a11y-hud-moderate: #8a5e00;\n --a11y-hud-minor: #0550ae;\n --a11y-hud-highlight: #8250df;\n --a11y-hud-focus-ring: #0550ae;\n}\n\n:host([data-theme=\"github-light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"critical\"],\n:host([data-theme=\"github-light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"serious\"],\n:host([data-theme=\"github-light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"moderate\"],\n:host([data-theme=\"github-light\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"minor\"] {\n color: #ffffff;\n}\n\n:host([data-theme=\"tokyo-night\"]) {\n --a11y-hud-bg: #1a1b26;\n --a11y-hud-bg-elevated: #24283b;\n --a11y-hud-bg-hover: #2f3549;\n --a11y-hud-border: #3b4261;\n --a11y-hud-text: #c0caf5;\n /* #9aa5ce gives 7.67:1 on #1a1b26 (was #737aa2 at ~4.1:1) */\n --a11y-hud-text-muted: #9aa5ce;\n --a11y-hud-critical: #f7768e;\n --a11y-hud-serious: #ff9e64;\n --a11y-hud-moderate: #e0af68;\n --a11y-hud-minor: #7aa2f7;\n --a11y-hud-highlight: #bb9af7;\n --a11y-hud-focus-ring: #7aa2f7;\n}\n\n:host([data-theme=\"solarized-dark\"]) {\n --a11y-hud-bg: #002b36;\n --a11y-hud-bg-elevated: #073642;\n --a11y-hud-bg-hover: #0d4456;\n --a11y-hud-border: #586e75;\n --a11y-hud-text: #eee8d5;\n --a11y-hud-text-muted: #93a1a1;\n --a11y-hud-critical: #dc322f;\n --a11y-hud-serious: #cb4b16;\n --a11y-hud-moderate: #b58900;\n /* #5ba4cf gives 5.78:1 on #002b36 for text, 5.78:1 for chip (was #268bd2 at ~3.1:1 for both) */\n --a11y-hud-minor: #5ba4cf;\n /* #f06090 gives 4.88:1 on #002b36 (was #d33682 at ~3.3:1) */\n --a11y-hud-highlight: #f06090;\n --a11y-hud-focus-ring: #268bd2;\n}\n\n/* Solarized Dark chip text overrides — canonical solarized palette falls in the\n middle-luminance zone where neither the panel bg (#002b36) nor white passes\n 4.5:1 on yellow/blue chip backgrounds. Use white text on red/orange,\n dark panel bg text on yellow/blue. */\n:host([data-theme=\"solarized-dark\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"critical\"],\n:host([data-theme=\"solarized-dark\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"serious\"] {\n color: #ffffff;\n}\n\n:host([data-theme=\"solarized-dark\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"moderate\"],\n:host([data-theme=\"solarized-dark\"]) .filter-chip[aria-pressed=\"true\"][data-severity=\"minor\"] {\n color: #002b36;\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\", \"run-only\"];\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 _runOnly: string[] = [];\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 case \"run-only\": {\n try {\n const parsed = value ? (JSON.parse(value) as unknown) : [];\n this._runOnly = Array.isArray(parsed) ? (parsed as string[]) : [];\n } catch {\n this._runOnly = [];\n }\n if (this._mounted) this._updateRunOnlyChips();\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 setRunOnly(tags: string[]): void {\n this._runOnly = tags;\n if (tags.length > 0) {\n this.setAttribute(\"run-only\", JSON.stringify(tags));\n } else {\n this.removeAttribute(\"run-only\");\n }\n this._updateRunOnlyChips();\n }\n\n async runScan(): 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, this._runOnly.length > 0 ? this._runOnly : undefined);\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 const ruleSets = [\"wcag2a\", \"wcag2aa\", \"wcag21a\", \"wcag21aa\", \"wcag22aa\", \"best-practice\"];\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 const ruleSetChips = ruleSets\n .map((r) => {\n const active = this._runOnly.includes(r);\n return `<button class=\"filter-chip\" data-ruleset=\"${r}\" aria-pressed=\"${active}\">${r}</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 class=\"filter-group\" role=\"group\" aria-label=\"Run only rule sets\">${ruleSetChips}</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 } else if (chip.dataset.ruleset) {\n const ruleset = chip.dataset.ruleset;\n const active = this._runOnly.includes(ruleset);\n if (active) {\n this._runOnly = this._runOnly.filter((r) => r !== ruleset);\n chip.setAttribute(\"aria-pressed\", \"false\");\n } else {\n this._runOnly = [...this._runOnly, ruleset];\n chip.setAttribute(\"aria-pressed\", \"true\");\n }\n void this._runScan();\n }\n }\n }\n\n private _updateRunOnlyChips(): void {\n for (const chip of this._shadow.querySelectorAll<HTMLElement>(\".filter-chip[data-ruleset]\")) {\n const active = this._runOnly.includes(chip.dataset.ruleset ?? \"\");\n chip.setAttribute(\"aria-pressed\", String(active));\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 if (options.runOnly !== undefined && options.runOnly.length > 0) {\n el.setAttribute(\"run-only\", JSON.stringify(options.runOnly));\n }\n\n return {\n unmount(): void {\n el.remove();\n },\n setTheme(theme: Theme): void {\n el.setTheme(theme);\n },\n setRunOnly(tags: string[]): void {\n el.setRunOnly(tags);\n },\n async runScan(): Promise<AxeResults> {\n return el.runScan();\n },\n };\n}\n\nexport { runScan };\n"]}