49 lines
1.1 KiB
JavaScript
49 lines
1.1 KiB
JavaScript
import {compose} from '@avocado/core';
|
|
import {Property} from '@avocado/mixins';
|
|
|
|
const decorate = compose(
|
|
Property('red'),
|
|
Property('green'),
|
|
Property('blue'),
|
|
Property('alpha'),
|
|
)
|
|
|
|
export class Color {
|
|
|
|
static fromCss(css) {
|
|
if ('#'.charCodeAt(0) === css.charCodeAt(0)) {
|
|
let hex = css.substr(1);
|
|
if (3 === hex.length) {
|
|
hex = hex.split('').map((c) => c + c).join('');
|
|
}
|
|
const red = parseInt(hex.substr(0, 2), 16);
|
|
const green = parseInt(hex.substr(2, 2), 16);
|
|
const blue = parseInt(hex.substr(4, 2), 16);
|
|
return new Color(red, green, blue);
|
|
}
|
|
else {
|
|
const colors = css.replace(
|
|
/\s/g, ''
|
|
).match(
|
|
/rgba?\((.*)\)/
|
|
)[1].split(',');
|
|
return new Color(colors[0], colors[1], colors[2], colors[3] || 1);
|
|
}
|
|
}
|
|
|
|
constructor(red = 255, green = 0, blue = 255, alpha = 1) {
|
|
this.red = red;
|
|
this.green = green;
|
|
this.blue = blue;
|
|
this.alpha = alpha;
|
|
}
|
|
|
|
toCss() {
|
|
return `rgba(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`;
|
|
}
|
|
|
|
toInteger() {
|
|
return (this.red << 16) | (this.green << 8) | this.blue;
|
|
}
|
|
|
|
} |