Skip to content

Commit f0dc4cd

Browse files
authored
[Color 4] Support none alpha values in color.change() (#2233)
1 parent ce124ba commit f0dc4cd

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

lib/src/functions/color.dart

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ SassColor _updateComponents(List<Value> arguments,
711711
var spaceKeyword = keywords.remove("space")?.assertString("space")
712712
?..assertUnquoted("space");
713713

714-
var alphaArg = keywords.remove('alpha')?.assertNumber('alpha');
714+
var alphaArg = keywords.remove('alpha');
715715

716716
// For backwards-compatibility, we allow legacy colors to modify channels in
717717
// any legacy color space.
@@ -743,9 +743,10 @@ SassColor _updateComponents(List<Value> arguments,
743743
for (var i = 0; i < channelInfo.length; i++)
744744
channelArgs[i]?.assertNumber(channelInfo[i].name)
745745
];
746+
var alphaNumber = alphaArg?.assertNumber("alpha");
746747
result = scale
747-
? _scaleColor(color, channelNumbers, alphaArg)
748-
: _adjustColor(color, channelNumbers, alphaArg);
748+
? _scaleColor(color, channelNumbers, alphaNumber)
749+
: _adjustColor(color, channelNumbers, alphaNumber);
749750
}
750751

751752
return result.toSpace(originalColor.space);
@@ -754,32 +755,33 @@ SassColor _updateComponents(List<Value> arguments,
754755
/// Returns a copy of [color] with its channel values replaced by those in
755756
/// [channelArgs] and [alphaArg], if specified.
756757
SassColor _changeColor(
757-
SassColor color, List<Value?> channelArgs, SassNumber? alphaArg) =>
758+
SassColor color, List<Value?> channelArgs, Value? alphaArg) =>
758759
_colorFromChannels(
759760
color.space,
760761
_channelForChange(channelArgs[0], color, 0),
761762
_channelForChange(channelArgs[1], color, 1),
762763
_channelForChange(channelArgs[2], color, 2),
763-
alphaArg.andThen((alphaArg) {
764-
if (!alphaArg.hasUnits) {
765-
return alphaArg.valueInRange(0, 1, "alpha");
766-
} else if (alphaArg.hasUnit('%')) {
767-
return alphaArg.valueInRangeWithUnit(0, 100, "alpha", "%") /
768-
100;
769-
} else {
770-
warnForDeprecation(
771-
"\$alpha: Passing a unit other than % ($alphaArg) is "
772-
"deprecated.\n"
773-
"\n"
774-
"To preserve current behavior: "
775-
"${alphaArg.unitSuggestion('alpha')}\n"
776-
"\n"
777-
"See https://sass-lang.com/d/function-units",
778-
Deprecation.functionUnits);
779-
return alphaArg.valueInRange(0, 1, "alpha");
780-
}
781-
}) ??
782-
color.alpha,
764+
switch (alphaArg) {
765+
null => color.alpha,
766+
_ when _isNone(alphaArg) => null,
767+
SassNumber(hasUnits: false) => alphaArg.valueInRange(0, 1, "alpha"),
768+
SassNumber() when alphaArg.hasUnit('%') =>
769+
alphaArg.valueInRangeWithUnit(0, 100, "alpha", "%") / 100,
770+
SassNumber() => () {
771+
warnForDeprecation(
772+
"\$alpha: Passing a unit other than % ($alphaArg) is "
773+
"deprecated.\n"
774+
"\n"
775+
"To preserve current behavior: "
776+
"${alphaArg.unitSuggestion('alpha')}\n"
777+
"\n"
778+
"See https://sass-lang.com/d/function-units",
779+
Deprecation.functionUnits);
780+
return alphaArg.valueInRange(0, 1, "alpha");
781+
}(),
782+
_ => throw SassScriptException(
783+
'$alphaArg is not a number or unquoted "none".', 'alpha')
784+
},
783785
clamp: false);
784786

785787
/// Returns the value for a single channel in `color.change()`.

0 commit comments

Comments
 (0)