apcaInterpolation function

double apcaInterpolation({
  1. required double percent,
  2. required Usage usage,
})

Implementation

double apcaInterpolation({required double percent, required Usage usage}) {
  const start = 0.0;
  final mid = switch (usage) {
    (Usage.text) => 60.0, // "APCA Lc 60 'similar' to WCAG 4.5"
    (Usage.fill) => 45.0, // "APCA Lc 45 'similar' to WCAG 3.0"
    (Usage.large) =>
      30.0, // APCA Lc 30 is minimum for legible semantic elements
    // > 5.5 CSS px in at least one dimension.
    (Usage.border) => 15.0, // APCA Lc 15 for non-text >= 5px (border + blur)
  };
  // Earlier, assumed end was 100. But, at high contrast, this wasn't leading
  // to white/black as expected. 110 seems to work better...but better to have
  // a concrete reason for this.
  const end = 110.0;
  final actualPercent = (percent > 0.5 ? percent - 0.5 : percent) / 0.5;
  final actualStart = percent > 0.5 ? mid : start;
  final actualEnd = percent > 0.5 ? end : mid;
  final range = actualEnd - actualStart;
  final apca = actualStart + (range * actualPercent);
  return apca;
}