aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-studio/app-util.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/theme-studio/app-util.js')
-rw-r--r--scripts/theme-studio/app-util.js20
1 files changed, 20 insertions, 0 deletions
diff --git a/scripts/theme-studio/app-util.js b/scripts/theme-studio/app-util.js
new file mode 100644
index 00000000..e3f76dd8
--- /dev/null
+++ b/scripts/theme-studio/app-util.js
@@ -0,0 +1,20 @@
+// Pure color/UI-boundary helpers: hex-input parsing, the contrast-rating status
+// color, and the readable text color for a background. These are kept out of
+// colormath.js (the pure math core) but are unit-tested and inlined into the page
+// the same way. textOn leans on rl from colormath; the import is for the tests —
+// generate.py strips it on inline, where rl is already present from the inlined
+// colormath core.
+import { rl } from './colormath.js';
+
+// Normalize a hex string: trim, accept an optional leading #, require exactly six
+// hex digits, lowercase the result. Returns null for anything else.
+function normHex(s){s=s.trim();if(/^[0-9a-fA-F]{6}$/.test(s))s='#'+s;return /^#[0-9a-fA-F]{6}$/.test(s)?s.toLowerCase():null;}
+
+// Map a WCAG contrast ratio to a status color: AAA green (>=7), AA grey (>=4.5),
+// otherwise the fail red.
+function ratingColor(r){return r>=7?'#5d9b86':r>=4.5?'#a9b2bb':'#cb6b4d';}
+
+// Pick black or white text for a background hex, by WCAG relative luminance.
+function textOn(h){const L=rl(h);return ((L+0.05)/0.05)>(1.05/(L+0.05))?'#000':'#fff';}
+
+export { normHex, ratingColor, textOn };