Josh McKinney 5620e06b1a
docs: add crate organization sections to workspace (#1946)
Adds summary-level crate organization documentation to all crates
explaining the modular workspace structure and when to use each crate.
Links to ARCHITECTURE.md for detailed information.
2025-06-26 15:36:00 -07:00

162 lines
5.3 KiB
Markdown

# Ratatui Macros
[![Crates.io badge]][ratatui_macros crate]
[![License badge]](./LICENSE)
[![Docs.rs badge]][API Docs]
[![CI Badge]][CI Status]
[![Crate Downloads badge]][ratatui_macros crate]
<!-- ⚠️ DO NOT EDIT THIS FILE DIRECTLY, EDIT lib.rs AND THEN RUN `cargo rdme` to update this file. -->
<!-- cargo-rdme start -->
`ratatui-macros` is a Rust crate that provides easy-to-use macros for simplifying boilerplate
associated with creating UI using [Ratatui].
This is an experimental playground for us to explore macros that would be useful to have in
Ratatui proper.
## Features
- [Text macros](#text-macros) for easily defining styled [`Text`]s, [`Line`]s, and [`Span`]s.
- [Layout macros](#layout-macros) for defining [`Layout`]s with [`Constraint`]s and directions.
- [Table macros](#table-macros) for creating [`Row`]s and [`Cell`]s.
## Getting Started
Add `ratatui-macros` as a dependency in your `Cargo.toml`:
```shell
cargo add ratatui-macros
```
Then, import the macros in your Rust file:
```rust
use ratatui_macros::{constraint, constraints, horizontal, line, row, span, text, vertical};
```
## Text Macros
The [`span!`] macro creates raw or styled [`Span`]s.
```rust
let name = "world!";
let raw_greeting = span!("hello {name}");
let styled_greeting = span!(Style::new().green(); "hello {name}");
let colored_greeting = span!(Color::Green; "hello {name}");
let modified_greeting = span!(Modifier::BOLD; "hello {name}");
```
The [`line!`] macro creates a [`Line`] that contains a sequence of [`Span`]s. It is similar to
the [`vec!`] macro. Each element is converted into a [`Span`] using [`Into::into`].
```rust
let name = "world!";
let line = line!["hello", format!("{name}")];
let line = line!["hello ", span!(Color::Green; "{name}")];
let line = line!["Name: ".bold(), "Remy".italic()];
let line = line!["bye"; 2];
```
The [`text!`] macro creates a [`Text`] that contains a sequence of [`Line`]. It is similar to
the [`vec!`] macro. Each element is converted to a [`Line`] using [`Into::into`].
```rust
let name = "world!";
let text = text!["hello", format!("{name}")];
let text = text!["bye"; 2];
let name = "Bye!!!";
let text = text![line!["hello", "world".bold()], span!(Modifier::BOLD; "{name}")];
```
## Layout Macros
If you are new to Ratatui, check out the [Layout concepts] article on the Ratatui website before
proceeding.
The [`constraints!`] macro defines an array of [`Constraint`]s:
```rust
let layout = Layout::horizontal(constraints![==50, ==30%, >=3, <=1, ==1/2, *=1]);
```
The [`constraint!`] macro defines individual [`Constraint`]s:
```rust
let layout = Layout::horizontal([constraint!(==50)]);
```
The [`vertical!`] and [`horizontal!`] macros are a shortcut to defining a [`Layout`]:
```rust
let [top, main, bottom] = vertical![==1, *=1, >=3].areas(area);
let [left, main, right] = horizontal![>=20, *=1, >=20].areas(main);
```
## Table Macros
The [`row!`] macro creates a [`Row`] for a [`Table`] that contains a sequence of [`Cell`]s. It
is similar to the [`vec!`] macro.
```rust
let rows = [
row!["hello", "world"],
row!["goodbye", "world"],
row![
text!["line 1", line!["Line", "2".bold()]],
span!(Modifier::BOLD; "Cell 2"),
],
];
let table = Table::new(rows, constraints![==20, *=1]);
```
## Contributing
Contributions to `ratatui-macros` are welcome! Whether it's submitting a bug report, a feature
request, or a pull request, all forms of contributions are valued and appreciated.
## Crate Organization
`ratatui-macros` is part of the Ratatui workspace that was modularized in version 0.30.0.
This crate provides declarative macros to reduce boilerplate when working with
Ratatui.
**When to use `ratatui-macros`:**
- You want to reduce boilerplate when creating styled text, layouts, or tables
- You prefer macro-based syntax for creating UI elements
- You need compile-time generation of repetitive UI code
**When to use the main [`ratatui`] crate:**
- Building applications (recommended - includes macros when the `macros` feature is enabled)
- You want the convenience of having everything available
For detailed information about the workspace organization, see [ARCHITECTURE.md].
[`ratatui`]: https://crates.io/crates/ratatui
[ARCHITECTURE.md]: https://github.com/ratatui/ratatui/blob/main/ARCHITECTURE.md
[Crates.io badge]: https://img.shields.io/crates/v/ratatui-macros?logo=rust&style=flat-square
[License badge]: https://img.shields.io/crates/l/ratatui-macros
[CI Badge]:
https://img.shields.io/github/actions/workflow/status/ratatui/ratatui/ci.yml?logo=github&style=flat-square
[Docs.rs badge]: https://img.shields.io/docsrs/ratatui-macros?logo=rust&style=flat-square
[Crate Downloads badge]:
https://img.shields.io/crates/d/ratatui-macros?logo=rust&style=flat-square
[ratatui_macros crate]: https://crates.io/crates/ratatui-macros
[API Docs]: https://docs.rs/ratatui-macros
[CI Status]: https://github.com/ratatui/ratatui/actions
[Ratatui]: https://github.com/ratatui/ratatui
[Layout concepts]: https://ratatui.rs/concepts/layout
[`Constraint`]: ratatui_core::layout::Constraint
[`Layout`]: ratatui_core::layout::Layout
[`Span`]: ratatui_core::text::Span
[`Line`]: ratatui_core::text::Line
[`Text`]: ratatui_core::text::Text
[`Row`]: ratatui_widgets::table::Row
[`Cell`]: ratatui_widgets::table::Cell
[`Table`]: ratatui_widgets::table::Table
<!-- cargo-rdme end -->