{"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","r","Gtxt","g","Btxt","b","Rbg","Gbg","Bbg","Ytxt","Ybg","Math","abs","outputContrast","SAPC"],"sources":["../../../src/util/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 '@/util'\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.0721750 // 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) ? 0.0\n : (SAPC < loConThresh) ? 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) ? 0.0\n : (SAPC > -loConThresh) ? SAPC - SAPC * loConFactor * loConOffset\n : SAPC + loConOffset\n }\n\n return outputContrast * 100\n}\n"],"mappings":"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","ignoreList":[]}