Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Color 4] Add support for CSS Color Level 4. #259

Merged
merged 28 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
09f19da
Rough WIP for new color spaces.
jgerigmeyer Oct 19, 2023
5aff16b
Update protocol version
jgerigmeyer Oct 19, 2023
6620189
Clean up missing components and rgb
jgerigmeyer Oct 20, 2023
1229be6
typo
jgerigmeyer Oct 20, 2023
3713dee
Merge branch 'main' into js-api-color-4
jgerigmeyer Oct 29, 2023
a27e7b6
Address initial review
jgerigmeyer Nov 2, 2023
04010b6
Adjust getters and constructor for clamped vals and NaN conversion
jgerigmeyer Nov 2, 2023
b1005fb
Update equals, toString, hashCode
jgerigmeyer Nov 2, 2023
0f14eff
Do not mutate SassColor; implement remaining except change and interp…
jgerigmeyer Nov 3, 2023
7b7c1e6
Stub missing fns to pass type checks
jgerigmeyer Nov 3, 2023
5badae1
Start fixing based on failing tests
jgerigmeyer Nov 3, 2023
435cf5c
track xyz as its own space, not an alias
jgerigmeyer Nov 3, 2023
dca7444
more tests passing
jgerigmeyer Nov 3, 2023
133dd7b
Include space in hash code
jgerigmeyer Nov 4, 2023
71d5f20
Always fuzzyRound red/green/blue getters
jgerigmeyer Nov 4, 2023
c04411b
Update powerless and check for channel validity
jgerigmeyer Nov 6, 2023
89cb50e
Add interpolate implementation
jgerigmeyer Nov 6, 2023
afcac77
Try using colorjs legacy build
jgerigmeyer Nov 6, 2023
4129510
re-add missing type def
jgerigmeyer Nov 6, 2023
193761f
Try cjs build?
jgerigmeyer Nov 6, 2023
c0514bd
Implement color.change
jgerigmeyer Nov 9, 2023
c19074d
Add missing space to protofy method
jgerigmeyer Nov 10, 2023
0f47969
remove precision
jgerigmeyer Nov 10, 2023
a2853f9
Drop support for node v14.
jgerigmeyer Nov 13, 2023
18ab10e
Address review
jgerigmeyer Nov 15, 2023
b203605
update comments
jgerigmeyer Nov 15, 2023
20a4c46
Merge branch 'feature.color-4' into js-api-color-4
jgerigmeyer Nov 16, 2023
421662a
Merge branch 'feature.color-4' into js-api-color-4
jgerigmeyer Nov 17, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 77 additions & 33 deletions lib/src/protofier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import * as proto from './vendor/embedded_sass_pb';
import * as utils from './utils';
import {FunctionRegistry} from './function-registry';
import {SassArgumentList} from './value/argument-list';
import {SassColor} from './value/color';
import {SassColor, KnownColorSpace} from './value/color';
import {SassFunction} from './value/function';
import {SassList, ListSeparator} from './value/list';
import {SassMap} from './value/map';
Expand Down Expand Up @@ -66,21 +66,13 @@ export class Protofier {
} else if (value instanceof SassNumber) {
result.value = {case: 'number', value: this.protofyNumber(value)};
} else if (value instanceof SassColor) {
if (value.hasCalculatedHsl) {
const color = new proto.Value_HslColor();
color.hue = value.hue;
color.saturation = value.saturation;
color.lightness = value.lightness;
color.alpha = value.alpha;
result.value = {case: 'hslColor', value: color};
} else {
const color = new proto.Value_RgbColor();
color.red = value.red;
color.green = value.green;
color.blue = value.blue;
color.alpha = value.alpha;
result.value = {case: 'rgbColor', value: color};
}
const color = new proto.Value_Color();
const channels = value.channels;
color.channel1 = channels.get(0) as number;
color.channel2 = channels.get(1) as number;
color.channel3 = channels.get(2) as number;
color.alpha = value.alpha;
result.value = {case: 'color', value: color};
} else if (value instanceof SassList) {
const list = new proto.Value_List();
list.separator = this.protofySeparator(value.separator);
Expand Down Expand Up @@ -242,24 +234,76 @@ export class Protofier {
return this.deprotofyNumber(value.value.value);
}

case 'rgbColor': {
const color = value.value.value;
return new SassColor({
red: color.red,
green: color.green,
blue: color.blue,
alpha: color.alpha,
});
}

case 'hslColor': {
case 'color': {
const color = value.value.value;
return new SassColor({
hue: color.hue,
saturation: color.saturation,
lightness: color.lightness,
alpha: color.alpha,
});
switch (color.space.toLowerCase()) {
case 'rgb':
case 'srgb':
case 'srgb-linear':
case 'display-p3':
case 'a98-rgb':
case 'prophoto-rgb':
case 'rec2020':
return new SassColor({
red: color.channel1,
green: color.channel2,
blue: color.channel3,
alpha: color.alpha,
space: color.space as KnownColorSpace,
});

case 'hsl':
return new SassColor({
hue: color.channel1,
saturation: color.channel2,
lightness: color.channel3,
alpha: color.alpha,
space: 'hsl',
});

case 'hwb':
return new SassColor({
hue: color.channel1,
whiteness: color.channel2,
blackness: color.channel3,
alpha: color.alpha,
space: 'hwb',
});

case 'lab':
case 'oklab':
return new SassColor({
lightness: color.channel1,
a: color.channel2,
b: color.channel3,
alpha: color.alpha,
space: color.space as KnownColorSpace,
});

case 'lch':
case 'oklch':
return new SassColor({
lightness: color.channel1,
chroma: color.channel2,
hue: color.channel3,
alpha: color.alpha,
space: color.space as KnownColorSpace,
});

case 'xyz':
case 'xyz-d65':
case 'xyz-d50':
return new SassColor({
x: color.channel1,
y: color.channel2,
z: color.channel3,
alpha: color.alpha,
space: color.space as KnownColorSpace,
});

default:
throw utils.compilerError(`Unknown color space "${color.space}".`);
}
}

case 'list': {
Expand Down
Loading
Loading