Skip to content

Commit 8c82e53

Browse files
authored
[Color 4] Add support for CSS Color Level 4. (#259)
1 parent 6eda68d commit 8c82e53

File tree

5 files changed

+1174
-325
lines changed

5 files changed

+1174
-325
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
strategy:
4444
matrix:
4545
os: [ubuntu, macos, windows]
46-
node-version: [18.x, 16.x, 14.x] # If changing this, also change env.DEFAULT_NODE_VERSION
46+
node-version: [18.x, 16.x] # If changing this, also change env.DEFAULT_NODE_VERSION
4747
fail-fast: false
4848

4949
steps:
@@ -89,8 +89,6 @@ jobs:
8989
# Include LTS versions on Ubuntu
9090
- os: ubuntu
9191
node_version: 16
92-
- os: ubuntu
93-
node_version: 14
9492

9593
steps:
9694
- uses: actions/checkout@v2

lib/src/protofier.ts

Lines changed: 78 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as proto from './vendor/embedded_sass_pb';
88
import * as utils from './utils';
99
import {FunctionRegistry} from './function-registry';
1010
import {SassArgumentList} from './value/argument-list';
11-
import {SassColor} from './value/color';
11+
import {SassColor, KnownColorSpace} from './value/color';
1212
import {SassFunction} from './value/function';
1313
import {SassList, ListSeparator} from './value/list';
1414
import {SassMap} from './value/map';
@@ -66,21 +66,14 @@ export class Protofier {
6666
} else if (value instanceof SassNumber) {
6767
result.value = {case: 'number', value: this.protofyNumber(value)};
6868
} else if (value instanceof SassColor) {
69-
if (value.hasCalculatedHsl) {
70-
const color = new proto.Value_HslColor();
71-
color.hue = value.hue;
72-
color.saturation = value.saturation;
73-
color.lightness = value.lightness;
74-
color.alpha = value.alpha;
75-
result.value = {case: 'hslColor', value: color};
76-
} else {
77-
const color = new proto.Value_RgbColor();
78-
color.red = value.red;
79-
color.green = value.green;
80-
color.blue = value.blue;
81-
color.alpha = value.alpha;
82-
result.value = {case: 'rgbColor', value: color};
83-
}
69+
const color = new proto.Value_Color();
70+
const channels = value.channels;
71+
color.channel1 = channels.get(0) as number;
72+
color.channel2 = channels.get(1) as number;
73+
color.channel3 = channels.get(2) as number;
74+
color.alpha = value.alpha;
75+
color.space = value.space;
76+
result.value = {case: 'color', value: color};
8477
} else if (value instanceof SassList) {
8578
const list = new proto.Value_List();
8679
list.separator = this.protofySeparator(value.separator);
@@ -242,24 +235,76 @@ export class Protofier {
242235
return this.deprotofyNumber(value.value.value);
243236
}
244237

245-
case 'rgbColor': {
246-
const color = value.value.value;
247-
return new SassColor({
248-
red: color.red,
249-
green: color.green,
250-
blue: color.blue,
251-
alpha: color.alpha,
252-
});
253-
}
254-
255-
case 'hslColor': {
238+
case 'color': {
256239
const color = value.value.value;
257-
return new SassColor({
258-
hue: color.hue,
259-
saturation: color.saturation,
260-
lightness: color.lightness,
261-
alpha: color.alpha,
262-
});
240+
switch (color.space.toLowerCase()) {
241+
case 'rgb':
242+
case 'srgb':
243+
case 'srgb-linear':
244+
case 'display-p3':
245+
case 'a98-rgb':
246+
case 'prophoto-rgb':
247+
case 'rec2020':
248+
return new SassColor({
249+
red: color.channel1,
250+
green: color.channel2,
251+
blue: color.channel3,
252+
alpha: color.alpha,
253+
space: color.space as KnownColorSpace,
254+
});
255+
256+
case 'hsl':
257+
return new SassColor({
258+
hue: color.channel1,
259+
saturation: color.channel2,
260+
lightness: color.channel3,
261+
alpha: color.alpha,
262+
space: 'hsl',
263+
});
264+
265+
case 'hwb':
266+
return new SassColor({
267+
hue: color.channel1,
268+
whiteness: color.channel2,
269+
blackness: color.channel3,
270+
alpha: color.alpha,
271+
space: 'hwb',
272+
});
273+
274+
case 'lab':
275+
case 'oklab':
276+
return new SassColor({
277+
lightness: color.channel1,
278+
a: color.channel2,
279+
b: color.channel3,
280+
alpha: color.alpha,
281+
space: color.space as KnownColorSpace,
282+
});
283+
284+
case 'lch':
285+
case 'oklch':
286+
return new SassColor({
287+
lightness: color.channel1,
288+
chroma: color.channel2,
289+
hue: color.channel3,
290+
alpha: color.alpha,
291+
space: color.space as KnownColorSpace,
292+
});
293+
294+
case 'xyz':
295+
case 'xyz-d65':
296+
case 'xyz-d50':
297+
return new SassColor({
298+
x: color.channel1,
299+
y: color.channel2,
300+
z: color.channel3,
301+
alpha: color.alpha,
302+
space: color.space as KnownColorSpace,
303+
});
304+
305+
default:
306+
throw utils.compilerError(`Unknown color space "${color.space}".`);
307+
}
263308
}
264309

265310
case 'list': {

0 commit comments

Comments
 (0)