== Style.js ==
An easy to use JavaScript library providing CSS preprocessing and a myriad of color manipulation functions.
== CSS Preprocessing ==
Style.js allows developers to utilize the full power of JavaScript to generate CSS.
Example:
var color = '#06c';
new Style({
p: {
background_color: color.toHSLA(),
color: selectForeground(color).toHSLA()
}.extend(
CSS.borderRadius(Math.floor(Math.random() * 11) + 0)
)
});
''Alternative syntax'':
var color = '#06c';
({
p: {
background_color: color.toHSLA(),
color: selectForeground(color).toHSLA()
}.extend(
CSS.borderRadius(Math.floor(Math.random() * 11) + 0)
)
}.toStyle());
Result:
p {
background-color: hsla(210, 100%, 40%, 1);
color: hsla(30, 100%, 85%, 1);
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px
}
Any valid JavaScript code should work. It's easy to mix in your own functionality:
// Returns a random color with a high red value, as a hex color code
function getRandomRedColor() {
// Generate random RGB color
var out = RGB.random();
// Minimum red value of 180
while (out.red < 180) {
out = RGB.random();
}
// Convert to HSL color space
out = new HSL(out);
// Adjust the lightness of the color, note: this might reduce the red value
out.lightness = 45;
// Return as hexidecimal
return out.toHex();
}
new Style({
'.randomRed': {
background_color: getRandomRedColor(),
color: '#fff'
}
});
Result:
.randomRed {
background-color: #bd4028;
color: #fff
}
=== Nested Styles ===
Example:
new Style({
html: {
body: {
header: {
div: {
ul: {
li: {
p: {
color: new RGBA(new Hex('#666')),
'a, strong': {
font_weight: 'bold'
}
}
}
}
}
},
footer: {
'background-color': new HSL(new Hex('#ccc'))
}
}
}
});
Result:
html body header div ul li p {
color: rgba(102, 102, 102, 1)
}
html body header div ul li p a, html body header div ul li p strong {
font-weight: bold
}
html body footer {
background-color: hsl(0, 0%, 80%)
}
=== "Mixins" ===
Example:
function myStyle(width, color) {
width = !width || !Type.isNumber(width) ? 700 : Math.floor(width);
if (!Color.isValid(color)) {
color = Hex.random();
}
return {
// Numeric values automatically converted to "px" or the unit set by setDefaultUnit()
width: width,
margin: '0 auto',
text_align: 'left',
background_color: color.toRGB()
};
}
var pageWidth = 800;
new Style({
body: {
text_align: 'center',
header: {}.extend(
myStyle(pageWidth, '#06c')
),
div: {}.extend(
myStyle(pageWidth / 2, '#ccc')
),
footer: {}.extend(
myStyle(pageWidth / 3, '#f30')
)
}
});
Result:
body {
text-align: center
}
body header {
width: 800px;
margin: 0 auto;
text-align: left;
background-color: rgb(0, 102, 204)
}
body div {
width: 400px;
margin: 0 auto;
text-align: left;
background-color: rgb(204, 204, 204)
}
body footer {
width: 266px;
margin: 0 auto;
text-align: left;
background-color: rgb(255, 51, 0)
}
=== Inheritance ===
Example:
// In the beginning, there was nothing
var singularity = {};
var A = {
body: {
font: "12px/14px 'Helvetica Neue', Helvetica, Arial, sans-serif",
color: '#000'.toRGB()
}
};
var B = {
header: {
h1: {
font_size: 24,
color: darken(Hex.random(), 0.3)
}
}
};
new Style(
singularity.extend(A, B)
);
Result:
body {
font: 12px/14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
color: rgb(0, 0, 0)
}
header h1 {
font-size: 24px;
color: #206502
}
== Color Functionality ==
Color spaces are interchangeable:
var color = Hex.random();
console.log('INPUT: ' + color.toString());
color = new RGB(color);
console.log(color.toString());
color = new XYZ(color);
// Color spaces NOT supported in CSS have no .toString() method
console.log(color);
color = new HSL(color);
console.log(color.toString());
color = new CIELab(color);
console.log(color);
color = new RGBA(color);
console.log(color.toString());
color = new CMYK(color);
console.log(color);
color = new HSLA(color);
console.log(color.toString());
/*
* NOTE: Due to the precision of the JavaScript number type
* the output might not be *exactly* equal to the input
*
* e.g. #ff3300 => #fe3300
*/
console.log('OUTPUT: ' + color.toHex().toString());
Result:
INPUT: #6cb84b
rgb(108, 184, 75)
XYZ {X: 24.59483120679862, Y: 37.97712451767409, Z: 12.690646072857769}
hsl(102, 43%, 51%)
CIELab {L: 68.00495079484631, a: -43.46726006781837, b: 47.13923110320886}
rgba(108, 184, 75, 1)
CMYK {cyan: 0.4130662167488027, magenta: 0, yellow: 0.5923735991444304, key: 0.2784016469309353}
hsla(102, 43%, 51%, 1)
OUTPUT: #6cb84b
=== complement() ===
Example:
var color = new Hex('#f30');
console.log(color.toString() + ' => ' + complement(color).toString());
Result:
#ff3300 => #00cbff
=== analogous() ===
Example:
var color = new Hex('#f30');
console.log(color.toString() + ' => ' + analogous(color));
Result:
#ff3300 => #ff004c,#ffb200
=== split() ===
Example:
var color = new Hex('#f30');
console.log(color.toString() + ' => ' + split(color));
Result:
#ff3300 => #004cff,#00ffb2
=== square() ===
Example:
var color = new Hex('#f30');
console.log(color.toString() + ' => ' + square(color));
Result:
#ff3300 => #4cff00,#00cbff,#b200ff
=== triad() ===
Example:
var color = new Hex('#f30');
console.log(color.toString() + ' => ' + triad(color));
Result:
#ff3300 => #3200ff,#00ff32
=== tetradic() ===
Example:
var color = new Hex('#f30');
console.log(color.toString() + ' => ' + tetradic(color));
Result:
#ff3300 => #cbff00,#00cbff,#3200ff