xcss

Programmable stylesheets

npm install xcss
2 downloads in the last day
66 downloads in the last week
72 downloads in the last month

xCSS

xCSS is a JavaScript library for programmatic stylesheet composition and a syntax sugar on top of it.

The idea is to produce CSS by composing data structures in JavaScript. That way you don't need preprocessors like Sass, Less or Stylus. Instead, all the power of JavaScript is at your fingertips.

Moreover xCSS is based on Node.js and allows you to reuse its module system and even package manager, npm with thousands of packages there.

Writing CSS with JavaScript can be verbose. To fix that xCSS provides a compiler from xCSS (a language, a superset of CSS) to JavaScript.

A xCSS module looks like:

@import "./other-stylesheet.css";

@require "some-pkg/theme" as theme;

.Component {
  width: 12px;
  background-color: {theme.bgColor};
}

It compiles into the following JavaScript module which is essentially a CommonJS (Node.js) module which uses xCSS object model:

var xcss = require("xcss"),
    theme = require("some-pkg/theme");

module.exports = xcss.om.stylesheet(null,
  xcss.om.import(require("./other-stylesheet.css")),
  xcss.om.rule('.Component', {
    width: '12px',
    backgroundColor: theme.bgColor
  })
);

Now to get the CSS string from that you just need to evaluate this module in Node, the module's value is a xcss.om.Stylesheet object which has .toCSS() method.

Installation

Install via npm:

% npm install --global xcss

Using from command-line

After installation there's xcss command line utility, which generates a CSS from a given xCSS module:

% xcss ./index.css > bundle.css

Run xcss --help to see more options:

Usage: xcss [options] <filename>

Compile xCSS to CSS and print the result.

Options:

    -c, --compress  Compress the resulted stylesheet

    --object-model  Print the result of translation from xCSS to JavaScript

        -h, --help  Show this message and exit

Using from Node.js

xCSS modules are just Node modules but expressed in a different syntax. That basically means that you'll be able to require xCSS modules directly:

// this line is needed to install .css handle
require('xcss');

// require .css directly!
var stylesheet = require('./index.css');

// generate CSS and print it
console.log(stylesheet.toCSS());

You can transform stylesheets in any way you want, for example, combine two stylsheets together:

var button = require('./button.css');
var select = require('./select.css');

console.log(button.concat(select));

Using as a browserify plugin

Since 3.28.0 version browserify has a new feature called plugins. This allows you to run xcss along with browserify and extract references to stylesheets from your code, so you can write:

require('./styles.css');

...

and have ./styles.css bundled in a resulted stylesheet bundle.

The command-line usage of browserify + xcss looks like:

browserify -p [ xcss -o ./bundle.css ] -o ./bundle.js ./index.js

After running this you will have bundle.js and bundle.css created in the directory.

If you use browserify programmatically, then usage is as follows:

var fs = require('fs')
var browserify = require('browserify')
var xcss = require('xcss')

var b = browserify('./index.js').plugin(xcss)
var stream = b.bundle()
stream.pipe(fs.createWriteStream('bundle.js'))
stream.css.pipe(fs.createWriteStream('bundle.css'))

As you can see, there's stream.css stream which you can pipe to the destination.

npm loves you