# sty 🌈
[![Crates.io](https://img.shields.io/crates/v/sty.svg)](https://crates.io/crates/sty)
[![docs-rs](https://docs.rs/sty/badge.svg)](https://docs.rs/sty)
![Downloads](https://img.shields.io/crates/d/sty)
## $\mathbb{\color{red}{Style \ } \color{lightblue}{terminal}\ \color{black}{outputs \ }\color{gray}{\ in\ a} \color{magenta}{\ minimal}\color{gray}{,} \color{lightyellow}{\ macro\ based}\color{gray}{,}\ and \color{lightgreen}{\ dead\ simple} \color{gray}{\ way.}}$
| | Code | Backgroud | Bright | Bright background |
| ----------------------------- | :-------: | :----------: | :--------------: | :-----------------: |
| $\mathbb{\color{black}{â– }}$ | `black` | `bg_black` | | |
| $\mathbb{\color{gray}{â– }}$ | `gray` | `bg_gray` | | |
| $\mathbb{\color{white}{â– }}$ | `white` | `bg_white` | `white_bright` | `bg_white_bright` |
| $\mathbb{\color{red}{â– }}$ | `red` | `bg_red` | `red_bright` | `bg_red_bright` |
| $\mathbb{\color{green}{â– }}$ | `green` | `bg_green` | `green_bright` | `bg_green_bright` |
| $\mathbb{\color{yellow}{â– }}$ | `yellow` | `bg_yellow` | `yello_bright` | `bg_yellow_bright` |
| $\mathbb{\color{blue}{â– }}$ | `blue` | `bg_blue` | `blue_bright` | `bg_blue_bright` |
| $\mathbb{\color{magenta}{â– }}$ | `magenta` | `bg_magenta` | `magenta_bright` | `bg_magenta_bright` |
| $\mathbb{\color{cyan}{â– }}$ | `cyan` | `bg_cyan` | `cyan_bright` | `bg_cyan_bright` |
> **`bold`** _`italic`_ `underline` `strikethrough` `overline` `dim` `inverse` `hidden` `reset`
## Highlights
- **Macro-based**: Increases compile-time efficiency and boosts safety.
- **Innovative Styling**: Compose styles in an array-like format such as `[red, bold, underline]`.
- **Extensive Type Support**: All types implementing `std::fmt::Display` trait are supported, offering wide-ranging adaptability.
- **Full Color and Style support**: Modifiers / Foreground colors / Background colors / Bright foreground colors / Bright background colors.
- **Zero dependencies**: Cleaner code-base with no third-party interference.
- **Supports `tty` detection**: Avoids styling when the tty lacks color support, Use `set_color_enabled` for manual enable control.
## Documentation
[![docs-rs](https://docs.rs/sty/badge.svg)](https://docs.rs/sty)
## Installation
This crate works with Cargo. Add the following to your Cargo.toml dependencies section:
```toml
[dependencies]
sty = "0.3"
```
## Basic usage
```rust
use sty::{
sty,
style::{red, underline},
};
// or
// use sty::{ sty, red, underline };
println!("{}", sty!("Hello world!", [red]));
// Use `sty!` macro for combination of multiple styles
println!("{}", sty!("Hello world!", [red, underline]));
// Use `sty!` macro for multiple input types
println!("{}", sty!(123, [red, underline]));
// Use style function is simple for `&str` input
println!("{}", red("Hello world!"));
println!("{}", underline(&red("Hello world!")));
```
> [!TIP]
> In style combinations, the styles that are specified later take precedence, For example:
```rust
use sty::{ sty, style::* };
sty!("str", [red, green, blue]); // blue
sty!("str", [red, underline, reset]); // reset
```
> [!TIP]
> If `tty` environment does not support color, default output will be printed without any styling, Use `set_color_enabled` for manual enable control, For example:
```rust
use sty::{ set_color_enabled, is_color_enabled, sty, style::* };
let enabled = is_color_enabled();
set_color_enabled(false);
sty!("123", [red]); // no color
set_color_enabled(true);
sty!("123", [red]); // red
set_color_enabled(enabled);
```
### `sty!` Macro
The `sty!` macro is a powerful utility conveniently used to apply a collection of style manipulations to your input. This macro allows you to seamlessly incorporate text properties with an intuitive syntax.
```rust
use sty::{ sty, style::{red, underline} };
println!("{}", sty!("Hello world!", [red, underline]));
```
In this example, `red` and `underline` are both style transformations, and the sty! macro returns a newly styled text instance with all these styling elements applied. Multiple styles can be applied simultaneously, and the output will be a combination of all.
#### Supported input types
For any type that has implemented the `std::fmt::Display` trait, like:
- `&str`
- `String`
- `numbers`(`usize`, `i8`, `i16`, `i32`, `i64`, `i128`, `u8`, `u16`, `u32`, `u64`, `u128`, `f32`, `f64`)
- `bool`
- ...
### Style function
Each style function can be combine with `sty!` macro or used separately, for example:
```rust
use sty::{
sty,
style::{red, underline},
};
// or
// use sty::{ sty, red, underline };
sty!("Hello world!", [red, underline]);
// or
red("Hello world!");
```
> [!TIP]
> The standalone style function only supports `&str` input type.
All style functions are as follows:
- Modifiers
- `reset`
- `bold`
- `dim`
- `italic`
- `underline`
- `overline`
- `inverse`
- `hidden`
- `strikethrough`
- Foreground colors
- `black`
- `red`
- `green`
- `yellow`
- `blue`
- `magenta`
- `cyan`
- `white`
- `gray`
- Background colors
- `bg_black`
- `bg_red`
- `bg_green`
- `bg_yellow`
- `bg_blue`
- `bg_magenta`
- `bg_cyan`
- `bg_white`
- `bg_gray`
- Bright foreground colors
- `red_bright`
- `green_bright`
- `yellow_bright`
- `blue_bright`
- `magenta_bright`
- `cyan_bright`
- `white_bright`
- Bright background colors
- `bg_red_bright`
- `bg_green_bright`
- `bg_yellow_bright`
- `bg_blue_bright`
- `bg_magenta_bright`
- `bg_cyan_bright`
- `bg_white_bright`
## Contribution
[CONTRIBUTING](CONTRIBUTING.md)