Skip to content

Commit 558640b

Browse files
authoredOct 28, 2022
Support all angle units in color functions (#1818)
See #1174 See sass/sass#2904
1 parent dd9e3cc commit 558640b

File tree

2 files changed

+27
-42
lines changed

2 files changed

+27
-42
lines changed
 

‎CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## 1.55.1
22

3+
* **Potentially breaking bug fix:** Angle units like `rad` or `turn` are now
4+
properly converted to equivalent `deg` values for `hsl()`, `hsla()`,
5+
`adjust-hue()`, `color.adjust()`, and `color.change()`.
6+
37
* Fix indentation for selectors that span multiple lines in a `@media` query.
48

59
* Emit a deprecation warning when passing `$alpha` values with units to

‎lib/src/functions/color.dart

+23-42
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,8 @@ final global = UnmodifiableListView([
120120

121121
_function("adjust-hue", r"$color, $degrees", (arguments) {
122122
var color = arguments[0].assertColor("color");
123-
var degrees = arguments[1].assertNumber("degrees");
124-
_checkAngle(degrees, "degrees");
125-
return color.changeHsl(hue: color.hue + degrees.value);
123+
var degrees = _angleValue(arguments[1], "degrees");
124+
return color.changeHsl(hue: color.hue + degrees);
126125
}),
127126

128127
_function("lighten", r"$color, $amount", (arguments) {
@@ -484,9 +483,9 @@ SassColor _updateComponents(List<Value> arguments,
484483
var green = getParam("green", 255);
485484
var blue = getParam("blue", 255);
486485

487-
var hueNumber = scale ? null : keywords.remove("hue")?.assertNumber("hue");
488-
if (hueNumber != null) _checkAngle(hueNumber, "hue");
489-
var hue = hueNumber?.value;
486+
var hue = scale
487+
? null
488+
: keywords.remove("hue").andThen((hue) => _angleValue(hue, "hue"));
490489

491490
var saturation = getParam("saturation", 100, checkPercent: true);
492491
var lightness = getParam("lightness", 100, checkPercent: true);
@@ -634,54 +633,37 @@ Value _hsl(String name, List<Value> arguments) {
634633
return _functionString(name, arguments);
635634
}
636635

637-
var hue = arguments[0].assertNumber("hue");
636+
var hue = _angleValue(arguments[0], "hue");
638637
var saturation = arguments[1].assertNumber("saturation");
639638
var lightness = arguments[2].assertNumber("lightness");
640639

641-
_checkAngle(hue, "hue");
642640
_checkPercent(saturation, "saturation");
643641
_checkPercent(lightness, "lightness");
644642

645643
return SassColor.hslInternal(
646-
hue.value,
644+
hue,
647645
saturation.value.clamp(0, 100),
648646
lightness.value.clamp(0, 100),
649647
alpha.andThen((alpha) =>
650648
_percentageOrUnitless(alpha.assertNumber("alpha"), 1, "alpha")),
651649
ColorFormat.hslFunction);
652650
}
653651

654-
/// Prints a deprecation warning if [hue] has a unit other than `deg`.
655-
void _checkAngle(SassNumber angle, String name) {
656-
if (!angle.hasUnits || angle.hasUnit('deg')) return;
657-
658-
var message = StringBuffer()
659-
..writeln("\$$name: Passing a unit other than deg ($angle) is deprecated.")
660-
..writeln();
661-
662-
if (angle.compatibleWithUnit('deg')) {
663-
message
664-
..writeln(
665-
"You're passing $angle, which is currently (incorrectly) converted "
666-
"to ${SassNumber(angle.value, 'deg')}.")
667-
..writeln("Soon, it will instead be correctly converted to "
668-
"${angle.coerce(['deg'], [])}.")
669-
..writeln();
670-
671-
var actualUnit = angle.numeratorUnits.first;
672-
message
673-
..writeln(
674-
"To preserve current behavior: calc(\$$name * 1deg/1$actualUnit)")
675-
..writeln("To migrate to new behavior: 0deg + \$$name")
676-
..writeln();
677-
} else {
678-
message
679-
..writeln("To preserve current behavior: ${angle.unitSuggestion(name)}")
680-
..writeln();
681-
}
652+
/// Asserts that [angle] is a number and returns its value in degrees.
653+
///
654+
/// Prints a deprecation warning if [angle] has a non-angle unit.
655+
double _angleValue(Value angleValue, String name) {
656+
var angle = angleValue.assertNumber(name);
657+
if (angle.compatibleWithUnit('deg')) return angle.coerceValueToUnit('deg');
682658

683-
message.write("See https://sass-lang.com/d/color-units");
684-
warn(message.toString(), deprecation: true);
659+
warn(
660+
"\$$name: Passing a unit other than deg ($angle) is deprecated.\n"
661+
"\n"
662+
"To preserve current behavior: ${angle.unitSuggestion(name)}\n"
663+
"\n"
664+
"See https://sass-lang.com/d/function-units",
665+
deprecation: true);
666+
return angle.value;
685667
}
686668

687669
/// Prints a deprecation warning if [number] doesn't have unit `%`.
@@ -700,16 +682,15 @@ void _checkPercent(SassNumber number, String name) {
700682
/// Create an HWB color from the given [arguments].
701683
Value _hwb(List<Value> arguments) {
702684
var alpha = arguments.length > 3 ? arguments[3] : null;
703-
var hue = arguments[0].assertNumber("hue");
685+
var hue = _angleValue(arguments[0], "hue");
704686
var whiteness = arguments[1].assertNumber("whiteness");
705687
var blackness = arguments[2].assertNumber("blackness");
706688

707-
_checkAngle(hue, "hue");
708689
whiteness.assertUnit("%", "whiteness");
709690
blackness.assertUnit("%", "blackness");
710691

711692
return SassColor.hwb(
712-
hue.value,
693+
hue,
713694
whiteness.valueInRange(0, 100, "whiteness"),
714695
blackness.valueInRange(0, 100, "blackness"),
715696
alpha.andThen((alpha) =>

0 commit comments

Comments
 (0)
Please sign in to comment.