turf 🌱

Warning | As of 0.4.0, the minimum supported Rust version is 1.70.0 by default! This can be circumvented by using the once_cell feature flag, which will lower the minimum supported version to 1.64.0.

turf allows you to build SCSS to CSS during compile time and inject those styles into your binary.

Rust 1.70.0 Crates.io Docs.rs Build Status MIT licensed

Features

turf will:

Usage

For a complete runnable example project, you can check out one of the examples:

| leptos-example | yew-example | dioxus-example | | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |

1. Create SCSS styles for your application

```scss // file at scss/file/path.scss

.TopLevelClass { color: red;

.SomeClass {
    color: blue;
}

} ```

2. Use the style_sheet macro to include the resulting CSS in your code

rust,ignore turf::style_sheet!("scss/file/path.scss");

The macro from the above example will expand to the following code:

rust static STYLE_SHEET: &'static str = "<style_sheet>"; struct ClassName; impl ClassName { pub const TOP_LEVEL_CLASS: &'static str = "<unique_class_name>"; pub const SOME_CLASS: &'static str = "<another_unique_class_name>"; }

To access the generated class names, use the ClassName struct and its associated constants:

rust,ignore let top_level_class_name = ClassName::TOP_LEVEL_CLASS; let some_class_name = ClassName::SOME_CLASS;

3. Configuration

The configuration for turf can be specified in the Cargo.toml file using the [package.metadata.turf] and [package.metadata.turf-dev] keys. This allows you to conveniently manage your SCSS compilation settings for both development and production builds within your project's manifest.

Both profiles offer the exact same configuration options. However, if you haven't specified a [package.metadata.turf-dev] profile, the [package.metadata.turf] settings will also be applied to debug builds. This ensures consistency in the compilation process across different build types unless you explicitly define a separate configuration for the development profile.

Example configuration:

```toml [package.metadata.turf] minify = true loadpaths = ["path/to/scss/files", "path/to/other/scss/files"] classname_template = "custom--"

[package.metadata.turf.browser_targets] chrome = [80, 1, 2] firefox = 65 safari = [12, 3] ```

The following configuration options are available:

3.1 Browser Versions

The available browsers are as follows:

3.2 Browser Version Format

Three formats are supported:

| major | major.minor | major.minor.patch | | :---- | :---------- | :---------------- | | Use a single integer to specify the major version number. | Use an array [major, minor] to specify both the major and minor version numbers. | Use an array [major, minor, patch] to specify the major, minor, and patch version numbers. | | Example: 1 or [1] represent version 1.0.0 | Example: [1, 2] represents version 1.2.0 | Example: [1, 2, 3] represents version 1.2.3. |

3.3 Triggering Recompilation on SCSS File Changes

To ensure that your SCSS files are recompiled whenever they change, you'll need to create a build.rs build script in your project root directory, right next to your src directory. This build script instructs Cargo to rerun the build process whenever the specified files change. Here's how you can set it up:

  1. Create a build.rs file in your project root if you don't already have one.
  2. Inside the build.rs file, add the following content:

rust fn main() { // Tell Cargo to rerun this build script if any SCSS file // in the 'src' directory or its subdirectories changes. println!("cargo:rerun-if-changed=src/**/*.scss"); }

If your SCSS files are located in a different directory, make sure to adjust the path accordingly in the println! statement.

Remember to check the Cargo documentation for more details about build scripts and how they interact with Cargo during the build process.

Contributions

Contributions to turf are always welcome! Whether you have ideas for new features or improvements, don't hesitate to open an issue or submit a pull request. 🤝

License

turf is licensed under the MIT license. For more details, please refer to the LICENSE file. 📄