#tailwind #css #compiler #web-framework

encre-css

A TailwindCSS-compatible utility-first CSS generation library written in Rust

9 releases (5 breaking)

0.14.1 Sep 1, 2024
0.14.0 Aug 25, 2024
0.13.0 Jul 9, 2024
0.12.0 Apr 11, 2024
0.9.3 Feb 24, 2023

#520 in Web programming


Used in 3 crates

MIT license

685KB
17K SLoC

encre-css

A TailwindCSS-compatible utility-first CSS generation library written in Rust

MIT License Pipeline status Coverage report Dependency status Published on crates.io Documentation on docs.rs
Number of files Number of lines of code Number of lines of comments Total number of lines

Table of contents

A brief introduction to utility-first CSS frameworks

Traditionally, whenever you need to style something on the web, you write CSS in a dedicated file and apply the rules using classes in your HTML, like that:

<div class="notification">
  <div class="notification-header">
    <div class="app-icon"></div>
    A new Javascript library has been released!
  </div>
  <div class="notification-body">
    The library <code>react</code> has just been released, did you know it?
    It is <i>a JavaScript library for creating user interfaces</i>.
  </div>
  <div class="notification-footer">
    <a href="#" class="dismiss-button">Dismiss</a>
    <a href="#" class="try-button">Try it here!</a>
  </div>
</div>

However styling this way is pretty boring because you need to think about good class names and to repeatedly switch between several files, it could be better. Utility-first CSS frameworks takes a new approach by using minimal and pre-defined class names directly linked to its CSS rule content. The CSS file will then be generated on-demand allowing the classes to be very flexible and customizable. This approach lets you quickly prototype visual HTML elements and encourages you to turn them into components using your favorite web framework. It also makes building a responsive website easier and forces it to be closer to your design system (if you have one):

<div class="w-128 text-md shadow-[1px_1px_10px_2px_#e5e7eb] rounded-xl">
  <div class="p-3 flex items-center">
    <div class="bg-blue-500 rounded-full w-5 h-5 mr-3"></div>
    A new Javascript library has been released!
  </div>
  <div class="p-6 pt-4">
    The library <code>react</code> has just been released, did you know it?
    It is <i>a JavaScript library for creating user interfaces</i>.
  </div>
  <div class="flex justify-between">
    <a href="#" class="p-3 text-rose-600">Dismiss</a>
    <a href="#" class="p-3 bg-blue-600 text-white rounded-br-xl rounded-tl-xl shadow shadow-blue-600">Try it here!</a>
  </div>
</div>

There is already a lot of utility-first frameworks like Tailwind CSS, Windi CSS, Twind and Uno CSS, but encre-css is unique because it is written in Rust and uses a new architecture, making it the fastest utility-first framework (according to the benchmark here based on Uno CSS' benchmark).

Getting started

Add encre-css to your Cargo.toml:

[dependencies]
encre-css = "0.14.1"

Generating styles takes two steps:

  • You need to configure the CSS generation by making a Config structure. It can be created by reading a TOML file using Config::from_file or by using the default values with Config::default;
  • Then, you need to generate the styles based on some sources using the generate function. This function will scan the content of the sources, extract atomic classes and generate the style needed for each class.

Example

use encre_css::Config;

let config = Config::default();
let css = encre_css::generate(
    [r#"<p class="w-auto bg-red-200 rounded-md">Hello world!</p>"#],
    &config,
);

assert!(css.expect("failed to generate the CSS").ends_with(r#"
.w-auto {
  width: auto;
}

.rounded-md {
  border-radius: 0.375rem;
}

.bg-red-200 {
  --en-bg-opacity: 1;
  background-color: rgb(254 202 202 / var(--en-bg-opacity));
}"#));

Command line interface

A command line interface is also available. Install it using:

cargo install encre-css-cli

Then run encrecss --help for instructions on how to use it.

Plugins

encre-css was built with modularity in mind and it is possible to write or use custom plugins. Learn more

About the name

encre means ink in French.

License

encre-css is published under the MIT license.

Dependencies

~0.9–1.5MB
~33K SLoC