Skip to content

Commit e96b3a0

Browse files
committed
fix: correctly handle alpha and hue value
1 parent 726e09b commit e96b3a0

File tree

2 files changed

+255
-116
lines changed

2 files changed

+255
-116
lines changed

src/lib/colors/strategies/hsl-strategy.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const R_SATURATION = `(?:\\d{1,3}${DOT_VALUE}?|${DOT_VALUE})`;
99
const R_LUMINANCE = R_SATURATION;
1010
const R_ALPHA = `([ ,]\\s*${ALPHA}\\s*|\\s*\\/\\s*${R_SATURATION}%?\\s*)?`;
1111

12-
const HSL_NEW_SYNTAX = `hsla?\\(\\s*${R_HUE}(deg)?\\s*\\s*${R_SATURATION}%?\\s*\\s*${R_LUMINANCE}%?\\s*${R_ALPHA}\\)`;
12+
const HSL_NEW_SYNTAX = `hsla?\\(\\s*${R_HUE}(deg|turn)?\\s*\\s*${R_SATURATION}%?\\s*\\s*${R_LUMINANCE}%?\\s*${R_ALPHA}\\)`;
1313
const HSL_LEGACY_SYNTAX = `hsl\\(\\s*${R_HUE}\\s*,\\s*${R_SATURATION}%\\s*,\\s*${R_LUMINANCE}%\\s*\\)`;
1414
const HSLA_LEGACY_SYNTAX = `hsla\\(\\s*${R_HUE}\\s*,\\s*${R_SATURATION}%\\s*,\\s*${R_LUMINANCE}%\\s*,\\s*${ALPHA}\\s*\\)`;
1515

@@ -31,14 +31,37 @@ export const REGEXP_ONE = new RegExp(
3131
* @memberof HSLColorExtractor
3232
*/
3333
function extractHSLValue(value: string) {
34-
const [h, s, l, a]: number[] = value
34+
const values = value
3535
.replace(/hsl(a){0,1}\(/, '')
3636
.replace(/\)/, '')
37-
.replace(/%/g, '')
38-
.replace(/deg/, '')
37+
.replace('/', ' ')
3938
.replaceAll(',', ' ')
40-
.split(/\s+/)
41-
.map((c) => parseFloat(c));
39+
.split(/\s+/);
40+
41+
let h = parseFloat(values[0]);
42+
43+
if (/turn/.test(values[0])) {
44+
h = (h % 1) * 360;
45+
}
46+
47+
const [s, l] = values.slice(1, 3).map(parseFloat);
48+
49+
const isRelativeAlpha = /%/.test(values[3]);
50+
51+
let a = parseFloat(values[3] ?? 1);
52+
53+
if (!isRelativeAlpha && a > 1) {
54+
a = 1;
55+
}
56+
57+
if (isRelativeAlpha && a > 100) {
58+
a = 1;
59+
}
60+
61+
if (a > 1) {
62+
a = a / 100;
63+
}
64+
4265
return [h, s, l, a];
4366
}
4467

0 commit comments

Comments
 (0)