npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

son

v0.0.1

Published

Pure json CSS precompiler

Downloads

13

Readme

#SON

'Style Object Notation' Converts Coffeescript/Javascript to CSS.

No license. Do what you want with this. Creator: Tim Farland

##What can Son do?

###Son lets you use pure json to describe css stylesheets

Son is inspired by Sass, but is more Lispy in spirit, in that it is an embedded DSL rather than an external one.

Because of this, styles can be altered using normal js, and no special constructs like 'mixins' are required. This opens up many possibilities for defining, transporting, and manipulating styles.

For terse style definition, I recommend using coffeescript.

All examples given in Coffeescript unless otherwise noted.

###Example:

The array:

Son.render [['#main'
                font: 
                    [size: 1.4 + 'em',
                     weight: 'normal']
                'margin, padding': 10 + 'px'
                ['h3'
                    'font-weight': 'bold'
                    color: '#000'
                ]
            ]]    

Is converted to the following string:

#main {
  font-size: 1.4em;
  font-weight: normal;
  margin: 10px;
  padding: 10px;
}
#main h3 {
  font-weight: bold;
  color: #000;
}

###Npm

npm install son    

###Node usage

Son = require('son').Son

cssString = Son.render [stylesheetArray]    

###Nested selectors

After sass:

['#main'
    color: '#333'
    ['h3', 
        color: '#000']]
=>

#main {
  color: #333;
}
#main h3 {
  color: #000;
}

###Nested properties

Nested properties inherit their parent as a prefix, joined with "-". Properties are considered nested when the value of a property declaration pair is an array:

['#main'
    font: 
        [size: 1.4 + 'em',
         weight: 'normal']]

=>

#main {
  font-size: 1.4em;
  font-weight: normal;
}

###Giving multiple properties the same value

In css, you can use multiple selectors in one declaration. In son, you can also use multiple property names:

['#main'
    'margin,padding' : 10 + 'px'] 
=>

#main {
  margin: 10px;
  padding: 10px;
}

##Manipulation

Sass-style manipulation like mixins, variables, and inheritance can just be done by manipulating the styles array.

###Variables

Yep, just use js:

myColour = '#CCC'

['#main'
    color: myColour]

###Mixins

Just drop a function in the selector array:

shadow = (x, y, b, clr) ->
    'box-shadow,-moz-box-shadow,-webkit-box-shadow': x + 'px ' + y + 'px ' + b + 'px ' + clr

style = ['h3'
            color: '#000'
            shadow 1,1,3,'#ccc']

Son.render [style] =>

h3 {
  color: #000;
  box-shadow: 1px 1px 3px #ccc;
  -moz-box-shadow: 1px 1px 3px #ccc;
  -webkit-box-shadow: 1px 1px 3px #ccc;
}

So functions give you a great deal of control as you build an embedded styling language - all the power of js is available to manipulate your style arrays. As long as the resulting form adheres to what Son.render() expects, it will return valid css.

Acceptable forms

A cssSelectorArray is an array adhering to the following form:

[selector, (cssPropertyObj || cssSelectorArray)...]

where:

  • selector is a valid css selector string, e.g "#main", "a:link, a:hover", "input[type='text']", "a span"

  • cssPropertyObj is a js object with only 1 key-value pair adhering to the following form:

    {cssPropertyName : (cssPropertyValue || [cssPropertyObj])}

where:

  • cssPropertyName is either:
  • a valid css property name string, e.g: "font-weight"
  • multiple css property names joined by commas, e.g: "margin,padding"
  • a partial css property name, e.g: "font", "weight"
  • cssPropertyValue is a valid css property value string

A styleSheetArray is an array of cssSelectorArrays:

[cssSelectorArray]    

examples:

cssPropertyObj1 = "font-size" : 1.4 + "em"
cssPropertyObj2 = "size" : 1.4 + "em"
cssPropertyObj3 = "font" : [cssPropertyObj2]
cssPropertyObj4 = "margin,padding" : 10 + "px"

cssSelectorArray1 = ["#main", cssPropertyObj1]
cssSelectorArray2 = [".main", cssPropertyObj3]
cssSelectorArray3 = ["div", cssPropertyObj1, cssPropertyObj4]

styleSheetArray1 = [cssSelectorArray1,cssSelectorArray3]

##Changelog

14.03.12

  • Speed improvements, npm packaging

20.04.11

  • Complete rewrite!
  • The new syntax now preserves the ordering of styles
  • Allows terser mixins
  • More coffeescript-centric
  • Has no need for '$' prefixes on selectors
  • Is tighter, more testable code

06.01.11

  • Added some examples in coffescript.

24.09.10

  • Uniqueness identifiers now use curly brackets instead of pipes.
  • Added support for multiple (comma-separated) selectors.

27.09.10

  • Added conversion time notification.
  • Changed for loops to js 1.6 forEach method where possible.
  • Removed all css selector matching logic. Now you must prefix anything to be treated as a css selector with '$', otherwise it will be considered a css property. This makes conversion much faster.

31.10.10

  • Cleaned and speeded up son.js code a bit
  • Added support for multiple property declarations
  • Added son versions of blueprint css 'reset' and 'typography' sheets.

##Authors

Son.js was created by Tim Farland, a web product designer based in Berlin.

##Disclaimer

This is experimental code! I can't guarantee that it won't change or break something in your app. Don't sue me.