{"version":3,"file":"APCA.mjs","names":["mainTRC","Rco","Gco","Bco","normBG","normTXT","revTXT","revBG","blkThrs","blkClmp","deltaYmin","scaleBoW","scaleWoB","loConThresh","loConFactor","loConOffset","loClip","APCAcontrast","text","background","Rtxt","Math","pow","r","Gtxt","g","Btxt","b","Rbg","Gbg","Bbg","Ytxt","Ybg","abs","outputContrast","SAPC"],"sources":["../../../src/utils/color/APCA.ts"],"sourcesContent":["/**\n * WCAG 3.0 APCA perceptual contrast algorithm from https://github.com/Myndex/SAPC-APCA\n * @licence https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n * @see https://www.w3.org/WAI/GL/task-forces/silver/wiki/Visual_Contrast_of_Text_Subgroup\n */\n// Types\nimport type { RGB } from '@/utils'\n\n// MAGICAL NUMBERS\n\n// sRGB Conversion to Relative Luminance (Y)\n\n// Transfer Curve (aka \"Gamma\") for sRGB linearization\n// Simple power curve vs piecewise described in docs\n// Essentially, 2.4 best models actual display\n// characteristics in combination with the total method\nconst mainTRC = 2.4\n\nconst Rco = 0.2126729 // sRGB Red Coefficient (from matrix)\nconst Gco = 0.7151522 // sRGB Green Coefficient (from matrix)\nconst Bco = 0.072175 // sRGB Blue Coefficient (from matrix)\n\n// For Finding Raw SAPC Contrast from Relative Luminance (Y)\n\n// Constants for SAPC Power Curve Exponents\n// One pair for normal text, and one for reverse\n// These are the \"beating heart\" of SAPC\nconst normBG = 0.55\nconst normTXT = 0.58\nconst revTXT = 0.57\nconst revBG = 0.62\n\n// For Clamping and Scaling Values\n\nconst blkThrs = 0.03 // Level that triggers the soft black clamp\nconst blkClmp = 1.45 // Exponent for the soft black clamp curve\nconst deltaYmin = 0.0005 // Lint trap\nconst scaleBoW = 1.25 // Scaling for dark text on light\nconst scaleWoB = 1.25 // Scaling for light text on dark\nconst loConThresh = 0.078 // Threshold for new simple offset scale\nconst loConFactor = 12.82051282051282 // = 1/0.078,\nconst loConOffset = 0.06 // The simple offset\nconst loClip = 0.001 // Output clip (lint trap #2)\n\nexport function APCAcontrast(text: RGB, background: RGB) {\n  // Linearize sRGB\n  const Rtxt = (text.r / 255) ** mainTRC\n  const Gtxt = (text.g / 255) ** mainTRC\n  const Btxt = (text.b / 255) ** mainTRC\n\n  const Rbg = (background.r / 255) ** mainTRC\n  const Gbg = (background.g / 255) ** mainTRC\n  const Bbg = (background.b / 255) ** mainTRC\n\n  // Apply the standard coefficients and sum to Y\n  let Ytxt = Rtxt * Rco + Gtxt * Gco + Btxt * Bco\n  let Ybg = Rbg * Rco + Gbg * Gco + Bbg * Bco\n\n  // Soft clamp Y when near black.\n  // Now clamping all colors to prevent crossover errors\n  if (Ytxt <= blkThrs) Ytxt += (blkThrs - Ytxt) ** blkClmp\n  if (Ybg <= blkThrs) Ybg += (blkThrs - Ybg) ** blkClmp\n\n  // Return 0 Early for extremely low ∆Y (lint trap #1)\n  if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0.0\n\n  // SAPC CONTRAST\n\n  let outputContrast: number // For weighted final values\n  if (Ybg > Ytxt) {\n    // For normal polarity, black text on white\n    // Calculate the SAPC contrast value and scale\n\n    const SAPC = (Ybg ** normBG - Ytxt ** normTXT) * scaleBoW\n\n    // NEW! SAPC SmoothScale™\n    // Low Contrast Smooth Scale Rollout to prevent polarity reversal\n    // and also a low clip for very low contrasts (lint trap #2)\n    // much of this is for very low contrasts, less than 10\n    // therefore for most reversing needs, only loConOffset is important\n    outputContrast =\n      SAPC < loClip\n        ? 0.0\n        : SAPC < loConThresh\n        ? SAPC - SAPC * loConFactor * loConOffset\n        : SAPC - loConOffset\n  } else {\n    // For reverse polarity, light text on dark\n    // WoB should always return negative value.\n\n    const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB\n\n    outputContrast =\n      SAPC > -loClip\n        ? 0.0\n        : SAPC > -loConThresh\n        ? SAPC - SAPC * loConFactor * loConOffset\n        : SAPC + loConOffset\n  }\n\n  return outputContrast * 100\n}\n"],"mappings":"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"}