Skip to content

Commit e14ca2b

Browse files
authored
Add support for passing var() to CSS functions (#2363)
Implementation based off [the reference][1] Fixes #2244 Spec sass/sass-spec#1101 [1]: sass/dart-sass@9d67846
1 parent 8116200 commit e14ca2b

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

src/functions.cpp

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,35 @@ namespace Sass {
245245
}
246246
}
247247

248+
inline bool special_number(String_Constant_Ptr s) {
249+
if (s) {
250+
std::string calc("calc");
251+
std::string var("var");
252+
std::string ss(s->value());
253+
return std::equal(calc.begin(), calc.end(), ss.begin()) ||
254+
std::equal(var.begin(), var.end(), ss.begin());
255+
}
256+
return false;
257+
}
258+
248259
Signature rgb_sig = "rgb($red, $green, $blue)";
249260
BUILT_IN(rgb)
250261
{
262+
if (
263+
special_number(Cast<String_Constant>(env["$red"])) ||
264+
special_number(Cast<String_Constant>(env["$green"])) ||
265+
special_number(Cast<String_Constant>(env["$blue"]))
266+
) {
267+
return SASS_MEMORY_NEW(String_Constant, pstate, "rgb("
268+
+ env["$red"]->to_string()
269+
+ ", "
270+
+ env["$green"]->to_string()
271+
+ ", "
272+
+ env["$blue"]->to_string()
273+
+ ")"
274+
);
275+
}
276+
251277
return SASS_MEMORY_NEW(Color,
252278
pstate,
253279
color_num(ARG("$red", Number)),
@@ -258,6 +284,24 @@ namespace Sass {
258284
Signature rgba_4_sig = "rgba($red, $green, $blue, $alpha)";
259285
BUILT_IN(rgba_4)
260286
{
287+
if (
288+
special_number(Cast<String_Constant>(env["$red"])) ||
289+
special_number(Cast<String_Constant>(env["$green"])) ||
290+
special_number(Cast<String_Constant>(env["$blue"])) ||
291+
special_number(Cast<String_Constant>(env["$alpha"]))
292+
) {
293+
return SASS_MEMORY_NEW(String_Constant, pstate, "rgba("
294+
+ env["$red"]->to_string()
295+
+ ", "
296+
+ env["$green"]->to_string()
297+
+ ", "
298+
+ env["$blue"]->to_string()
299+
+ ", "
300+
+ env["$alpha"]->to_string()
301+
+ ")"
302+
);
303+
}
304+
261305
return SASS_MEMORY_NEW(Color,
262306
pstate,
263307
color_num(ARG("$red", Number)),
@@ -270,6 +314,22 @@ namespace Sass {
270314
BUILT_IN(rgba_2)
271315
{
272316
Color_Ptr c_arg = ARG("$color", Color);
317+
318+
if (
319+
special_number(Cast<String_Constant>(env["$alpha"]))
320+
) {
321+
return SASS_MEMORY_NEW(String_Constant, pstate, "rgba("
322+
+ std::to_string((int)c_arg->r())
323+
+ ", "
324+
+ std::to_string((int)c_arg->g())
325+
+ ", "
326+
+ std::to_string((int)c_arg->b())
327+
+ ", "
328+
+ env["$alpha"]->to_string()
329+
+ ")"
330+
);
331+
}
332+
273333
Color_Ptr new_c = SASS_MEMORY_COPY(c_arg);
274334
new_c->a(alpha_num(ARG("$alpha", Number)));
275335
new_c->disp("");
@@ -399,6 +459,21 @@ namespace Sass {
399459
Signature hsl_sig = "hsl($hue, $saturation, $lightness)";
400460
BUILT_IN(hsl)
401461
{
462+
if (
463+
special_number(Cast<String_Constant>(env["$hue"])) ||
464+
special_number(Cast<String_Constant>(env["$saturation"])) ||
465+
special_number(Cast<String_Constant>(env["$lightness"]))
466+
) {
467+
return SASS_MEMORY_NEW(String_Constant, pstate, "hsl("
468+
+ env["$hue"]->to_string()
469+
+ ", "
470+
+ env["$saturation"]->to_string()
471+
+ ", "
472+
+ env["$lightness"]->to_string()
473+
+ ")"
474+
);
475+
}
476+
402477
return hsla_impl(ARG("$hue", Number)->value(),
403478
ARG("$saturation", Number)->value(),
404479
ARG("$lightness", Number)->value(),
@@ -410,6 +485,24 @@ namespace Sass {
410485
Signature hsla_sig = "hsla($hue, $saturation, $lightness, $alpha)";
411486
BUILT_IN(hsla)
412487
{
488+
if (
489+
special_number(Cast<String_Constant>(env["$hue"])) ||
490+
special_number(Cast<String_Constant>(env["$saturation"])) ||
491+
special_number(Cast<String_Constant>(env["$lightness"])) ||
492+
special_number(Cast<String_Constant>(env["$alpha"]))
493+
) {
494+
return SASS_MEMORY_NEW(String_Constant, pstate, "hsla("
495+
+ env["$hue"]->to_string()
496+
+ ", "
497+
+ env["$saturation"]->to_string()
498+
+ ", "
499+
+ env["$lightness"]->to_string()
500+
+ ", "
501+
+ env["$alpha"]->to_string()
502+
+ ")"
503+
);
504+
}
505+
413506
return hsla_impl(ARG("$hue", Number)->value(),
414507
ARG("$saturation", Number)->value(),
415508
ARG("$lightness", Number)->value(),

0 commit comments

Comments
 (0)