Home

Awesome

Stylers

Important Note

Installtion

cargo add stylers

Prerequisite

[dependencies]
stylers = { version = "*" }

[build-dependencies]
stylers = {  version = "*" }
use stylers::build;

fn main() {
    build(Some(String::from("./target/main.css")));
}

You can find the importance of these new changes here.

Leptos Example

Note :Leptos version > 0.4.9 has some new changes. But stylers works the same way in all versions of leptos

style!

#[component]
fn Hello(cx: Scope, name: &'static str) -> impl IntoView {
    let styler_class = style! {
        #two{
            color: blue;
        }
        div.one{
            color: red;
            content: raw_str(r#"\hello"#);
            font: "1.3em/1.2" Arial, Helvetica, sans-serif;
        }
        div {
            border: 1px solid black;
            margin: 25px 50px 75px 100px;
            background-color: lightblue;
        }
        h2 {
            color: purple;
        }
        @media only screen and (max-width: 1000px) {
            h3 {
                background-color: lightblue;
                color: blue
            }
        }
    };

    view! {class = styler_class,
        <div class="one">
            <h1 id="two">"Hello"</h1>
            <h2>"World"</h2>
            <h2>{name}</h2>
            <h3>"Hello Kanna"</h3>
        </div>
    }
}

style_sheet!

#[component]
fn Hello(cx: Scope, name: &'static str) -> impl IntoView {
    let class_name = style_sheet!("./hello.css");
    view! {class = class_name,
        <div class="one">
            <h1 id="two">"Hello"</h1>
            <h2>"World"</h2>
        </div>
    }
}

style_str!

#[component]
pub fn GreenButton(cx: Scope) -> impl IntoView {
    let (class_name, style_val) = style_str! {
        button {
            background-color: green;
            border-radius: 8px;
            border-style: none;
            box-sizing: border-box;
            color: yellow;
            cursor: pointer;
            display: inline-block;
            font-family: r#"Haas Grot Text R Web"#, r#"Helvetica Neue"#, Helvetica, Arial, sans-serif;
            font-size: 14px;
            font-weight: 500;
            height: 40px;
            line-height: 20px;
            list-style: none;
            margin: 0;
            outline: none;
            padding: 10px 16px;
            position: relative;
            text-align: center;
            text-decoration: none;
            transition: color 100ms;
            vertical-align: baseline;
            user-select: none;
            -webkit-user-select: none;
        }
        button:hover{
            background-color: yellow;
            color: green;
        }
    };

    view! {class = class_name,
        <style>{style_val}</style>
        <button>"I am green button"</button>
    }
}

style_sheet_str!

#[component]
pub fn BlueButton() -> impl IntoView {
    let (class_name, style_val) = style_sheet_str!("./src/button.css");

    view! {class = class_name,
        <style>{style_val}</style>
        <button>"I am blue button"</button>
    }
}

Custom pseudo classes

Input

div :deep(h3) {
    color: orange;
}

Output

div.l-243433 h3{color: orange;}

Input

:deep(h3 div) {
    color: orange;
}

Ouput

h3 div{color: orange;}

How it works:

Edge cases handled for style! macros

Input

style!(
    div{
        content: raw_str(r#"\hello"#);
        font: "1.3em/1.2" Arial;
    }
)

Output

    div.l-23432{
        content: "\hello";
        font: 1.3em/1.2 Arial;
    }

Optional build process using Trunk(Only when you use style! or style_sheet! macro )

[[hooks]]
stage = "post_build"
command = "sh"
command_arguments = ["-c", "cp ./target/main.css $TRUNK_STAGING_DIR/"]