+
+
+
+
+ @if (auditResult != null && !isAuditing)
+ {
+
+
+ @auditResult.Score
+ / 100
+
+
+ @foreach (var cat in auditResult.ScoreCategories)
+ {
+
+
+ @cat.Name
+ @cat.Passed/@cat.Total
+
+ }
+
+
+ @auditResult.ErrorCount
+ @auditResult.WarningCount
+ @auditResult.InfoCount
+ @auditResult.TotalElements elements
+ @if (previousScore != null)
+ {
+ var delta = auditResult.Score - previousScore.Value;
+ @if (delta != 0)
+ {
+
+ @Math.Abs(delta)
+
+ }
+ }
+
+
+ @if (isAuditing && auditResult == null)
+ {
+
+
+ Scanning visual tree for accessibility issues...
+ @if (auditProgress != null)
+ {
+ @auditProgress
+ }
+
+ }
+ else if (auditResult == null)
+ {
+
+
+ Click Audit to scan the running app for accessibility issues.
+ Checks for missing labels, small touch targets, color contrast, keyboard accessibility, and more.
+
+ }
+ else if (activeView == "audit")
+ {
+
+
+
+
+ @if (selectedIssue != null)
+ {
+
+
+
+ Element
+ @selectedIssue.ElementType @(!string.IsNullOrWhiteSpace(selectedIssue.AutomationId) ? $"#{selectedIssue.AutomationId}" : "")
+
+
@selectedIssue.Message
+
+
+ @selectedIssue.Suggestion
+
+ @if (!string.IsNullOrWhiteSpace(selectedIssue.XamlFix))
+ {
+
+
+
@selectedIssue.XamlFix
+
+ }
+
+ }
+
+ }
+ else if (activeView == "screenreader")
+ {
+
+ @if (auditResult!.ScreenReaderOrder.Count == 0)
+ {
+
No accessible elements found in the visual tree.
+ }
+ else
+ {
+ var srEntries = auditResult.ScreenReaderOrder;
+ var current = srEntries[_srCurrentIndex];
+
+
+
+
+
+
+ @(_srCurrentIndex + 1) / @srEntries.Count
+
+
+
+
+
+
+
+
+ @if (!string.IsNullOrEmpty(current.AnnouncedText))
+ {
+ "@current.AnnouncedText"
+ }
+ else
+ {
+ (no label)
+ }
+
+ @if (!string.IsNullOrEmpty(current.Role))
+ {
+
@current.Role
+ }
+ @if (!string.IsNullOrEmpty(current.Hint))
+ {
+
@current.Hint
+ }
+ @if (current.HeadingLevel != null)
+ {
+
@current.HeadingLevel
+ }
+ @if (current.IsInteractive)
+ {
+
Interactive
+ }
+ @if (current.HasIssue)
+ {
+
Has Issue
+ }
+
+
+
+
+
+ Type
+ @current.ElementType
+
+ @if (current.WindowBounds != null)
+ {
+
+ Bounds
+ @($"{current.WindowBounds.X:F0}, {current.WindowBounds.Y:F0} - {current.WindowBounds.Width:F0}x{current.WindowBounds.Height:F0}")
+
+ }
+
+
+
+
+ @foreach (var entry in srEntries)
+ {
+ var isActive = entry.Order == _srCurrentIndex;
+
SrGoTo(entry.Order)" @key="entry.Order">
+ @(entry.Order + 1)
+ @(!string.IsNullOrEmpty(entry.AnnouncedText) ? entry.AnnouncedText : "(no label)")
+ @if (!string.IsNullOrEmpty(entry.Role))
+ {
+ @entry.Role
+ }
+
+ }
+
+
+ }
+ }
+ else if (activeView == "contrast")
+ {
+
+
+
+
+
+
+ Hidden
+
+
+ @if (FilteredContrastResults.Any())
+ {
+
+ @FilteredContrastResults.Count(c => c.PassesAA) AA Pass
+ @FilteredContrastResults.Count(c => !c.PassesAA) AA Fail
+ @FilteredContrastResults.Count(c => c.PassesAAA) AAA Pass
+
+
+ @foreach (var cr in FilteredContrastResults.OrderBy(c => c.ContrastRatio))
+ {
+ var isSelected = selectedContrastId == cr.ElementId;
+
SelectContrast(cr)" @key="cr.ElementId">
+
+
+ on
+
+
+
+ @(cr.ContrastRatio):1
+
+ AA @(cr.PassesAA ? "\u2713" : "\u2717")
+ AAA @(cr.PassesAAA ? "\u2713" : "\u2717")
+ @if (cr.IsLargeText) { Large }
+
+
+
+ @cr.ElementType
+ @if (!string.IsNullOrWhiteSpace(cr.ElementText))
+ {
+ "@Truncate(cr.ElementText, 20)"
+ }
+
+
+ }
+ }
+ else if (auditResult!.ContrastResults.Any())
+ {
+
No contrast results match the current filter.
+ }
+ else
+ {
+
No text elements with both TextColor and Background detected. Contrast checks require explicit color values.
+ }
+
+ }
+