Ocideck/lib/models/slide_quality.dart
Brenno de Winter 1fc4d25dcf
Some checks are pending
CI / Format · Analyze · Test (push) Waiting to run
Add slide quality checks for accessibility with export warnings.
Help authors spot missing alt text, low contrast, and dense slides in the editor, with an optional confirmation step before export when issues remain.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 08:57:18 +02:00

72 lines
1.9 KiB
Dart

import 'markdown_validation.dart';
/// Sentinel index for deck-wide issues (theme contrast, etc.).
const int kDeckWideSlideIndex = -1;
enum SlideQualityCategory { altText, contrast, textDensity }
enum SlideQualityIssueKind {
missingAltCaption,
themeContrast,
slideContrast,
imageContrastUnverified,
chartMissingDescription,
mediaMissingDescription,
textDensityWarning,
textDensityCritical,
tableDensityMinimum,
codeDensityHigh,
freeMarkdownDensityHigh,
titleDensityHigh,
}
class SlideQualityIssue {
final int slideIndex;
final SlideQualityIssueKind kind;
final SlideQualityCategory category;
final MarkdownValidationSeverity severity;
/// Optional hint for UI focus, e.g. `imageCaption` or `textColor`.
final String? field;
/// Structured parameters for localized formatting ([formatSlideQualityIssue]).
final Map<String, String> args;
const SlideQualityIssue({
required this.slideIndex,
required this.kind,
required this.category,
required this.severity,
this.field,
this.args = const {},
});
bool get isDeckWide => slideIndex == kDeckWideSlideIndex;
}
class SlideQualityResult {
final List<SlideQualityIssue> issues;
const SlideQualityResult(this.issues);
bool get hasIssues => issues.isNotEmpty;
int get errorCount => issues
.where((i) => i.severity == MarkdownValidationSeverity.error)
.length;
int get warningCount => issues
.where((i) => i.severity == MarkdownValidationSeverity.warning)
.length;
List<SlideQualityIssue> forSlide(int slideIndex) =>
issues.where((i) => i.slideIndex == slideIndex).toList();
bool hasCategoryOnSlide(int slideIndex, SlideQualityCategory category) =>
issues.any(
(i) => i.slideIndex == slideIndex && i.category == category,
);
List<SlideQualityIssue> get deckWideIssues =>
issues.where((i) => i.isDeckWide).toList();
}