style-js

Comprehensive color manipulation classes.

npm install style-js
52 downloads in the last week
105 downloads in the last month

== 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
npm loves you