From 70e3a041f1890e63855fad693891652b36f48195 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 10:30:51 -0700 Subject: [PATCH] clamp HSL format (#101) --- src/color.js | 12 ++++++++---- test/hsl-test.js | 7 +++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/color.js b/src/color.js index 3e3ad49..3af25a9 100644 --- a/src/color.js +++ b/src/color.js @@ -353,11 +353,15 @@ define(Hsl, hsl, extend(Color, { && (0 <= this.opacity && this.opacity <= 1); }, formatHsl: function() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + var a = this.opacity, + h = (this.h || 0) % 360, + s = Math.max(0, Math.min(1, this.s || 0)), + l = Math.max(0, Math.min(1, this.l || 0)); + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); return (a === 1 ? "hsl(" : "hsla(") - + (this.h || 0) + ", " - + (this.s || 0) * 100 + "%, " - + (this.l || 0) * 100 + "%" + + (h < 0 ? h + 360 : h) + ", " + + s * 100 + "%, " + + l * 100 + "%" + (a === 1 ? ")" : ", " + a + ")"); } })); diff --git a/test/hsl-test.js b/test/hsl-test.js index 5f5b9c7..d963916 100644 --- a/test/hsl-test.js +++ b/test/hsl-test.js @@ -38,6 +38,13 @@ it("hsl.formatHsl() formats as hsl(…) or hsla(…)", () => { assert.strictEqual(hsl("hsla(60, 100%, 20%, 0.4)").formatHsl(), "hsla(60, 100%, 20%, 0.4)"); }); +it("hsl.formatHsl() clamps to the expected range", () => { + assert.strictEqual(hsl(180, -100, -50).formatHsl(), "hsl(180, 0%, 0%)"); + assert.strictEqual(hsl(180, 150, 200).formatHsl(), "hsl(180, 100%, 100%)"); + assert.strictEqual(hsl(-90, 50, 50).formatHsl(), "hsl(270, 100%, 100%)"); + assert.strictEqual(hsl(420, 50, 50).formatHsl(), "hsl(60, 100%, 100%)"); +}); + it("hsl.formatHex() formats as #rrggbb", () => { assert.strictEqual(hsl("#abcdef").formatHex(), "#abcdef"); assert.strictEqual(hsl("hsl(60, 100%, 20%)").formatHex(), "#666600");