Git Product home page Git Product logo

suitcss-classnames's Introduction

suitcss-classnames Build Status

Class names builder library compatible for Suit CSS naming conventions.

Installation

npm install suitcss-classnames

Usage

suitClassNames(suitCSSObject): string

suitCSSObject is a following object:

export interface SuitCSSObject {
    /**
     * class="namespace-Component"
     */
    namespace?: string;
    /**
     * class="namespace-Component"
     */
    descendant?: string;
    /**
     * class="Component"
     */
    component: string;
    /**
     * class="Component--modifier"
     */
    modifiers?: string[] | {
        [index: string]: boolean;
    };
    /**
     * class="Component is-state"
     */
    states?: string[] | {
        [index: string]: boolean;
    };
    /**
     * class="u-utility Component"
     */
    utilities?: string[] | {
        [index: string]: boolean;
    };
}

component property is required, other properties is optional.

import { suitClassNames } from "suitcss-classnames";
const className = suitClassNames({
    namespace: "ns",
    component: "ComponentName", // <= require
    descendant: "descendantName",
    modifiers: ["default", "small"],
    states: ["disable", "active"]
});
const classes = className.split(" ");
assert(classes.indexOf("ns-ComponentName-descendantName") !== -1);
assert(classes.indexOf("ns-ComponentName-descendantName--default") !== -1);
assert(classes.indexOf("ns-ComponentName-descendantName--small") !== -1);
assert(classes.indexOf("is-disable") !== -1);
assert(classes.indexOf("is-active") !== -1);

state, modifiers and utilities property accept array or object.

It means that you can write following:

const className = suitClassNames({
component: "ComponentName",
    states: {
        // ignore
        "disable": false,
        // accept
        "active": true
    }
});
const classes = className.split(/\s+/);
console.log(classes);
// [ 'ComponentName', 'is-active' ]

Use case

If you use it in react component, write following pattern:

import { suitClassNames } from "suitcss-classnames";
class MyComponent extends React.Component {
    render() {
        const className = suitClassNames({
            component: "MyComponent",
            states: {
                // on/off by active state
                "active": this.props.active
            }
        });
        return <div className={className}>
           {this.props.active ? "active!" : "none"}
        </div>;
    }
}

Behavior Note 📝

When key already has prefix

suitcss-classnames don't throw error, just ignore this.

import { suitClassNames } from "suitcss-classnames";
const className = suitClassNames({
    component: "ComponentName",
    // key alredy has "is-" prefix
    states: {
        "is-active": true
    }
});
const classes = className.split(/\s+/);
assert.equal(classes.length, 2);
assert(classes.indexOf("ComponentName") !== -1);
// don't add duplicated prefix, it will be "is-active"
assert(classes.indexOf("is-active") !== -1);

suitcss-classnames don't allowed the key name:"state"

suitcss-classnames don't allowed the key name that except "namespace", "descendant", "component", "modifiers", "states", "utilities".

import { suitClassNames } from "suitcss-classnames";
suitClassNames({
    component: "ComponentName",
    // typo => states
    state: {
        "is-active": true
    }
});

The code throw error, because it contain a typo(state => states).

Tests

npm test

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

MIT

suitcss-classnames's People

Contributors

azu avatar

Stargazers

Joseph Chiang avatar Paweł Lesiecki avatar Yoshiaki Kawazu avatar Masahiro Nakahashi avatar  avatar

Watchers

 avatar James Cloos avatar

suitcss-classnames's Issues

modifiers with props

I think it is difficult to create expected class name string by suitcss-classnames.

    static propTypes = {
        align: React.PropTypes.oneOf(["left", "center", "right"])
    };

    render() {
        // <Component>--modifier
        const names = suitClassNames({
            component: this.constructor.name,
            modifiers: {
                align: this.props.align
            }
        });
        // `Component--alignLeft` is happy!
   }

ref: suitcss/components-grid: Component CSS for grids

Component--alignLeft is suitabe classname. But, current result is Component--align :(

vs.

        const names = suitClassNames({
            component: this.constructor.name,
            modifiers: {
                align: this.props.align
            }
        });

should be Component--alignLeft.

OR

Provide alternative way of creating.

        const names = suitClassNames({
            component: this.constructor.name,
            modifiers: {
                [`align${this.props.align}`]: this.props.align
            }
        });

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.