0.01
No release in over a year
A tool for styling html by composing css utility classes
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 3.0
 Project Readme

Styler

A tool for styling html by composing css utility classes, like Tachyons.

Installation

Add this line to your application's Gemfile:

gem "ruby_styler"

And then execute:

$ bundle install

Or install it yourself as:

$ gem install ruby_styler

Usage

Define styles

You can declare styles with a name and an already defined css class, for example you define a style named btn, like this...

styles = Styler.new do
  style :btn, ["white", "bg_blue"]
end

This will build a styles object, which you can then call btn on...

styles.btn.to_s # => "white bg_blue"

You would be able to use it like this in your erb files...

<button class="<%= styles.btn %>">My button</button>

Likewise in haml...

%button{class: styles.btn} My button

Which would output in HTML...

<button class="white bg_blue">My button</button>

Compose styles

You can define many of these styles and compose them...

styles = Styler.new do
  style :btn, ["padding3", "margin3"]
  style :blue_btn, [btn, "white", "bg_blue"]
end
%button{class: styles.btn} My button
%button{class: styles.blue_btn} My button

This would output to HTML as...

<button class="padding3 margin3">My button</button>
<button class="padding3 margin3 white bg_blue">My button</button>

Subtract styles

By composing styles, classes can be subtracted from ones previously declared. Below, bg_blue is removed from :default, and bg_red is added, creating :danger...

styles = Styler.new do
  style :default, ["pa3", "white", "bg_blue"]
  style :danger, [default - "bg_blue", "bg_red"]
end

styles.default.to_s # => "pa3 white bg_blue"
styles.danger.to_s # => "pa3 white bg_red"

Passing arguments to styles

You can also define styles that expect an argument, which will determine the styles to render...

styles = Styler.new do
  style :default_color do |project|
    if project[:color] == "blue"
      ["bg_blue", "border_blue", "text_blue"]
    else
      ["bg_white", "border_black", "text_black"]
    end
  end
end

project = { color: "blue" }
styles.default_color(project).to_s # => "bg_blue border_blue text_blue"

Styles can be used as a template to build other styles...

project = { color: "blue" }

styles = Styler.new do
  style :default_color do |project|
    if project[:color] == "blue"
      ["bg_blue"]
    else
      ["bg_white"]
    end
  end

  style :title, [default_color(project), "pa3"]
end

styles.title(project).to_s # => "bg_blue pa3"

Or as a block...

styles = Styler.new do
  style :default_color do |project|
    if project[:color] == "blue"
      ["bg_blue"]
    else
      ["bg_red"]
    end
  end

  style :title do |project|
    [default_color(project), "pa3"]
  end
end

project = { color: "blue" }
styles.title(project).to_s # => "bg_blue pa3"

Define collections

Collections can be used as "namespaces" for styles...

styles = Styler.new do
  collection :buttons do
    style :default, ["pa3", "blue"]
    style :danger, [default - "blue", "red"]
  end
end

styles.respond_to?(:default) # => false
styles.respond_to?(:danger) # => false
styles.buttons.default.to_s # => "pa3 blue"
styles.buttons.danger.to_s # => "pa3 red"

Nested collections

Nested collections allow the creation of complete themes...

styles = Styler.new do
  collection :v1 do
    collection :buttons do
      style :default, ["pa3", "blue"]
    end
  end

  collection :v2 do
    collection :buttons do
      style :default, ["pa3", "red"]
    end
  end
end

styles.v1.buttons.default.to_s # => "pa3 blue"
styles.v2.buttons.default.to_s # => "pa3 red"

Collections with arguments

Similar to styles, collections can also require arguments...

styles = Styler.new do
  collection :buttons do |project|
    if project[:color] == "blue"
      style :default, ["pa3", "blue"]
    else
      style :default, ["pa3", "red"]
    end
  end
end

project = { color: "blue" }
styles.buttons(project).default.to_s # => "pa3 blue"

Select a collection with an alias

styles = Styler.new do
  collection :v1 do
    collection :buttons do
      style :default, ["pa3", "blue"]
    end
  end

  collection :v2 do
    collection :buttons do
      style :default, ["pa3", "red"]
    end
  end

  collection_alias :theme, v1
end

styles.theme.buttons.default.to_s # => "pa3 blue"

Collection alias with a block

styles = Styler.new do
  collection :dark do
    collection :buttons do
      style :default, ["bg_black", "border_gray", "text_white"]
    end
  end

  collection :light do
    collection :buttons do
      style :default, ["bg_white", "border_black", "text_black"]
    end
  end

  collection_alias :theme do |current_version|
    if current_version == "dark"
      dark
    else
      light
    end
  end
end

styles.theme("dark").buttons.default.to_s # => "bg_black border_gray text_white"
styles.theme("light").buttons.default.to_s # => "bg_white border_black text_black"

Select a collection from other styler

dark = Styler.new do
  collection :buttons do
    style :default, ["bg_black", "border_gray", "text_white"]
  end
end

light = Styler.new do
  collection :buttons do
    style :default, ["bg_white", "border_black", "text_black"]
  end
end

styles = Styler.new do
  collection_alias :theme do |current_version|
    if current_version == "dark"
      dark
    else
      light
    end
  end
end

styles.theme("dark").buttons.default.to_s # => "bg_black border_gray text_white"
styles.theme("light").buttons.default.to_s # => "bg_white border_black text_black"

Copy styles from collection

Styles from an existing collection can be copied then overidden and modified.

styles = Styler.new do
  collection :v1 do
    collection :buttons do
      style :default, ["pa3", "blue"]
      style :danger, [default - "blue", "red"]
    end
  end

  collection :v2 do
    collection :buttons do
      copy_styles_from collection: v1.buttons
      style :danger, [v1.buttons.danger - "red", "orange"]
    end
  end
end

expect(styles.v2.buttons.default.to_s).to eq "pa3 blue"
expect(styles.v2.buttons.danger.to_s).to eq "pa3 orange"

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt for experimentation.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/bhserna/styler.

License

The gem is available as open source under the terms of the MIT License.