LESS is quite powerful in color operations, in your case I would especially recommend checking out the blending functions like difference()
, exclusion()
, negation()
or average()
. Some of them might already give you the desired effects.
But you can also perform addition and subtraction of hex colors in LESS.
To get a difference in hex colors you could just subtract two colors:
color-diff: (#333 - #222);
which will return the per-channel difference in hex:
color-diff: #111111;
So to get a color that is #111
"higher" than @x
you would just need to do
new-color: (@x + #111);
But as you can imagine things with hex colors don't stay so simple. Lets look at your first example:
// @s1-color-main - @s1-color-ts1
diff: (#2DAEBF - #0092b3);
returns
diff: #2d1c0c;
so (as your base/main color was the one with higher values) we can calculate @s1-color-ts1
by subtracting the returned diff
from our main color
(@s1-color-main - #2d1c0c)
But as you can see, the problem now is that we would need to know which color has higher values to choose the right operation ... and it can get a bit messy.
Luckily LESS is quite smart ... and for calculated colors saved in a variable LESS remembers the actual color value diffs (including the sign i.e. whether they are negative or positive).
For a very simple example
@diff1: (#222 - #333);
@diff2: (#eee + #eee);
if we return the calculated values of the diffs
color1: @diff1;
color2: @diff2;
we get
color1: #000000;
color2: #ffffff;
When returned (in CSS), all negative values get cut off at 0
and values larger than FF
get cut off at FF
. However, if we use the variables in further operations we se that @diff1
actually holds an RGB equivalent to something like -17 -17 -17
(a negative value for each of the RGB color components), and @diff2
holds the RGB equivalent of 476 476 476
, which becomes apparent if we do something like
color3: (#888888 + @diff1);
color4: (@diff2 / 2);
and get
color3: #777777;
color4: #eeeeee;
So, how can you use this to your advantage? Now you can do something like
@s1-color-diff1: (#0092b3 - #2DAEBF); // which saves negative color values
and use this variable do calculate @s1-color-ts1
by adding it to whatever the main color is
@s1-color-ts1: @s1-color-main + @s1-color-diff1;
you could also save the whole list of diffs, like so
@diffs: (#0092b3 - #2DAEBF),
(#0087a6 - #2DAEBF),
(#008099 - #2DAEBF),
(#00758c - #2DAEBF),
(#555555 - #2DAEBF),
(#006073 - #2DAEBF),
(#005566 - #2DAEBF);
and access them when needed
@s1-color-ts2: @s1-color-main + extract(@diffs,2);
This way LESS takes care of all the RGB values in the calculations and you just need to deal with the hex codes. But LESS offers you a much better control over the colors by using the color component functions, such as the RGB functions red()
, green()
, blue()
and rgb()
. Which allow you to precisely tune each RGB color component/channel. So to figure out what the actual RGB diffs for your colors are, you could do something like (by extract the RGB components/channels, comparing them to the main color and neatly display them)
.rgb-diff(@v,@m){
@t: @@v;
@rm: red(@m); @gm: green(@m); @bm: blue(@m);
@r: (red(@t) - @rm);
@g: (green(@t) - @gm);
@b: (blue(@t) - @bm);
@{v}: @r @g @b;
}
rgb-diff {
.rgb-diff(s1-color-ts1, @s1-color-main);
.rgb-diff(s1-color-ts2, @s1-color-main);
.rgb-diff(s1-color-ts3, @s1-color-main);
.rgb-diff(s1-color-ts4, @s1-color-main);
.rgb-diff(s1-color-ts5, @s1-color-main);
.rgb-diff(s1-color-ts6, @s1-color-main);
.rgb-diff(s1-color-ts7, @s1-color-main);
}
which should return this
rgb-diff {
s1-color-ts1: -45 -28 -12;
s1-color-ts2: -45 -39 -25;
s1-color-ts3: -45 -46 -38;
s1-color-ts4: -45 -57 -51;
s1-color-ts5: 40 -89 -106;
s1-color-ts6: -45 -78 -76;
s1-color-ts7: -45 -89 -89;
}
and now you can use something like this
rgb((@r-main + @r), (@g-main + @g), (@b-main + @b));
to reconstruct the individual colors by adding their RGB diffs to the main/base color's RGB values.
Test:
.from-rgb(@r,@g,@b,@v,@m){
@rm: red(@m); @gm: green(@m); @bm: blue(@m);
@{v}: rgb((@rm + @r), (@gm + @g), (@bm + @b));
}
from-rgb {
.from-rgb(-45, -28, -12, s1-color-ts1, @s1-color-main);
.from-rgb(-45, -39, -25, s1-color-ts2, @s1-color-main);
.from-rgb(-45, -46, -38, s1-color-ts3, @s1-color-main);
.from-rgb(-45, -57, -51, s1-color-ts4, @s1-color-main);
.from-rgb(40, -89, -106, s1-color-ts5, @s1-color-main);
.from-rgb(-45, -78, -76, s1-color-ts6, @s1-color-main);
.from-rgb(-45, -89, -89, s1-color-ts7, @s1-color-main);
}
should return your above set of hex colors, and you can now adjust all of them by simply adjusting your base color variable @s1-color-main
.