export type Severity = 'critical' | 'warning' | 'notice'; export type Grade = 'A' | 'B' | 'C' | 'D' | 'F'; export type Position = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'; export type AIProvider = 'none' | 'anthropic' | 'openai' | 'gemini' | 'ollama'; export type ScanSchedule = 'daily' | 'weekly' | 'monthly'; export interface IssueNode { element: string; selector: string; } export interface Issue { id: string; rule: string; wcag: string; severity: Severity; title: string; description: string; element?: string; selector?: string; nodes?: IssueNode[]; count: number; fixed: boolean; ai_fixable: boolean; help_url?: string; } export interface ScanResult { url: string; scanned_at: string; score: number; grade: Grade; issues: Issue[]; passed: number; failed: number; error?: string; } export interface PourPrinciple { score: number; issues: Issue[]; } export interface Report { has_data: boolean; score: number; grade: Grade; scanned_at: string | null; url: string | null; passed?: number; failed?: number; issues: Issue[]; groups: { critical: Issue[]; warning: Issue[]; notice: Issue[]; }; pour: { perceivable: PourPrinciple; operable: PourPrinciple; understandable: PourPrinciple; robust: PourPrinciple; }; summary: { critical: number; warnings: number; notices: number; }; } export interface Settings { ai_provider: AIProvider; ai_key_set: boolean; ai_model: string; scan_schedule: ScanSchedule; } export interface ScanHistoryEntry { date: string; score: number; grade: Grade; failed: number; } export interface WidgetConfig { enabled: boolean; color: string; position: Position; features: string[]; hide_powered_by?: boolean; } export interface ScannableUrl { url: string; type: string; label: string; } export interface PageScanSummary { url: string; score: number; grade: Grade; failed: number; issues: Issue[]; scanned_at: string; }