Twust - Static TailwindCSS Validation in Rust

Twust is a compile-time TailwindCSS static checker for Rust. It validates class names before runtime, preventing typos, incorrect class names, and misconfigurations.

Why Twust?

  • Compile-time validation: Catch invalid TailwindCSS classes before your Rust app runs.
  • Zero runtime overhead: Errors are flagged at compile time.
  • Supports Tailwind plugins like DaisyUI (via feature flags).
  • Works with Rust UI frameworks (Leptos, Dioxus, Yew, Sycamore).
#![allow(unused)] fn main() { use twust::tw; let class = tw!("bg-blue-500 text-lg hover:bg-blue-600"); assert_eq!(class, "bg-blue-500 text-lg hover:bg-blue-600"); }

Installation

Twust is available on crates.io. Add it to your Cargo.toml:

[dependencies] twust = "1.0.7" # Enable optional features like daisyui: twust = { version = "1.0.7", features = ["daisyui"] }

Usage

Twust provides macros to validate TailwindCSS classes at compile time.

Basic Example

#![allow(unused)] fn main() { use twust::tw; let class = tw!("bg-red-500 text-lg"); assert_eq!(class, "bg-red-500 text-lg"); }

Restricting to One Class

#![allow(unused)] fn main() { use twust::tw1; let single_class = tw1!("bg-blue-500"); assert_eq!(single_class, "bg-blue-500"); }

Using Multiple Classes As Array

#![allow(unused)] fn main() { use twust::tws; let class_list = tws!["bg-red-500 text-lg", "p-4 bg-blue-500"]; assert_eq!(class_list, ["bg-red-500", "text-lg", "p-4"]); }

Using Multiple Classes As Array: One class per item

#![allow(unused)] fn main() { use twust::tws1; let class_list = tws1!["bg-red-500", "text-lg", "p-4"]; assert_eq!(class_list, ["bg-red-500", "text-lg", "p-4"]); }

Macros

Twust provides the following macros:

tw! - Type-Checked Tailwind Classes

#![allow(unused)] fn main() { use twust::tw; let class = tw!("hover:bg-green-500 text-white font-bold"); assert_eq!(class, "hover:bg-green-500 text-white font-bold"); }

tws! - Compile-time Checked Array of Classes

#![allow(unused)] fn main() { use twust::tws; let class_list = tws!["border", "rounded-md", "shadow"]; assert_eq!(class_list, ["border", "rounded-md", "shadow"]); }

tw1! - Single Tailwind Class Only

#![allow(unused)] fn main() { use twust::tw1; let single_class = tw1!("flex"); assert_eq!(single_class, "flex"); }

tws1! - Array of Single-Class Items Only

#![allow(unused)] fn main() { use twust::tws1; let class_list = tws1!["text-xl", "border", "m-4"]; assert_eq!(class_list, ["text-xl", "border", "m-4"]); }

Configuration

Tailwind Configuration

Twust reads custom Tailwind settings from tailwind.config.json.

Example Configuration

{ "theme": { "extend": { "colors": { "primary": "#ff6347", "secondary": "#4a90e2" } } }, "corePlugins": { "preflight": false }, "variants": { "backgroundColor": ["responsive", "hover", "focus"] } }

Using Custom Classes

#![allow(unused)] fn main() { tw!("bg-primary text-secondary hover:bg-secondary"); }

FAQ

Why use Twust instead of tailwindcss-to-rust?

Twust is simpler, requires no setup, and validates classes at compile-time instead of generating code.

Can I use this with DaisyUI?

Yes! Enable the feature flag:

twust = { version = "1.0.7", features = ["daisyui"] }

Contributing

Steps

  1. Fork the repository.
  2. Clone it locally:
git clone https://github.com/oyelowo/twust.git
  1. Create a feature branch:
git checkout -b feature-name
  1. Make changes and commit:
git commit -m "Add new feature"
  1. Push your branch and open a PR.

License

License

Twust is licensed under MIT/Apache-2.0.

© Oyelowo Oyedayo. See LICENSE for details.