import type { E2EPage } from '@stencil/core/testing';
/** axe-core selector path; nested arrays represent iframe/shadow boundaries. */
export type AxeTarget = (string | string[])[];
/**
 * Subset of an axe-core violation surfaced for test assertions. The shape
 * mirrors `axe.AxeResults['violations'][number]` without pulling axe-core's
 * full types into the component test surface.
 */
export interface AxeViolation {
    id: string;
    impact: 'minor' | 'moderate' | 'serious' | 'critical' | null;
    description: string;
    help: string;
    helpUrl: string;
    nodes: Array<{
        target: AxeTarget;
        html: string;
        failureSummary?: string;
    }>;
}
export interface RunAxeOptions {
    /**
     * Limits the run to rules tagged with one or more of these values.
     * Defaults to WCAG 2.0 + 2.1 levels A and AA.
     */
    tags?: string[];
    /**
     * Per-rule overrides (e.g. `{ 'color-contrast': { enabled: false } }`).
     */
    rules?: Record<string, {
        enabled: boolean;
    }>;
}
/**
 * Default tag filter applied by `runAxe`. Mirrors WCAG 2.0 + 2.1 levels A
 * and AA. Override with `{ tags: [...] }` to widen or narrow the scope.
 */
export declare const DEFAULT_AXE_TAGS: readonly ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa"];
/**
 * Page-level axe rules that fire on the bare HTML harness Stencil's E2E
 * provides (no `<title>`, no `<html lang>`, no landmarks, no `<h1>`).
 * They are disabled by default because they describe document chrome,
 * not component behavior — flagging them at component scope yields noise.
 *
 * Tests can opt back in for a specific case:
 *
 * ```ts
 * await runAxe(page, { rules: { 'document-title': { enabled: true } } });
 * ```
 */
export declare const DEFAULT_DISABLED_RULES: readonly ["document-title", "html-has-lang", "landmark-one-main", "page-has-heading-one", "region"];
/**
 * Injects axe-core into an active Stencil E2EPage and returns any
 * accessibility violations found in the current document.
 *
 * Usage:
 *
 * ```ts
 * const page = await newE2EPage();
 * await page.setContent('<pds-button>Click me</pds-button>');
 * const violations = await runAxe(page);
 * expect(violations).toEqual([]);
 * ```
 *
 * Component tests should assert against the returned array directly so
 * each component can document its own baseline (zero violations is the
 * goal; suppressions should be deliberate and commented).
 */
export declare function runAxe(page: E2EPage, options?: RunAxeOptions): Promise<AxeViolation[]>;
/**
 * Formats an axe target selector, including nested arrays for shadow DOM
 * and iframe boundaries (axe's `UnlabelledFrameSelector` shape).
 */
export declare function formatAxeTarget(target: AxeTarget): string;
/**
 * Formats an array of axe violations into a readable failure message for
 * use in test output. Returns an empty string when there are no
 * violations, so it can be passed directly into `expect(...).toBe('')`.
 */
export declare function formatViolations(violations: AxeViolation[]): string;
