Bumps the cargo-dependencies group with 1 update: [ratatui](https://github.com/ratatui/ratatui). Updates `ratatui` from 0.28.0 to 0.28.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/ratatui/ratatui/releases">ratatui's releases</a>.</em></p> <blockquote> <h2>v0.28.1</h2> <h2><a href="https://github.com/ratatui/ratatui/releases/tag/v0.28.1">v0.28.1</a> - 2024-08-25</h2> <h3>Features</h3> <ul> <li> <p><a href="ed51c4b342">ed51c4b</a> <em>(terminal)</em> Add ratatui::init() and restore() methods by <a href="https://github.com/joshka"><code>@joshka</code></a> in <a href="https://redirect.github.com/ratatui/ratatui/pull/1289">#1289</a></p> <blockquote> <p>These are simple opinionated methods for creating a terminal that is useful to use in most apps. The new init method creates a crossterm backend writing to stdout, enables raw mode, enters the alternate screen, and sets a panic handler that restores the terminal on panic.</p> <p>A minimal hello world now looks a bit like:</p> <pre lang="rust"><code>use ratatui::{ crossterm::event::{self, Event}, text::Text, Frame, }; <p>fn main() {<br /> let mut terminal = ratatui::init();<br /> loop {<br /> terminal<br /> .draw(|frame: &mut Frame| frame.render_widget(Text::raw("Hello World!"), frame.area()))<br /> .expect("Failed to draw");<br /> if matches!(event::read().expect("failed to read event"), Event::Key(_)) {<br /> break;<br /> }<br /> }<br /> ratatui::restore();<br /> }<br /> </code></pre></p> <p>A type alias <code>DefaultTerminal</code> is added to represent this terminal type and to simplify any cases where applications need to pass this terminal around. It is equivalent to: <code>Terminal<CrosstermBackend<Stdout>></code></p> <p>We also added <code>ratatui::try_init()</code> and <code>try_restore()</code>, for situations where you might want to handle initialization errors yourself instead of letting the panic handler fire and cleanup. Simple Apps should prefer the <code>init</code> and <code>restore</code> functions over these functions.</p> <p>Corresponding functions to allow passing a <code>TerminalOptions</code> with a <code>Viewport</code> (e.g. inline, fixed) are also available (<code>init_with_options</code>, and <code>try_init_with_options</code>).</p> </blockquote> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/ratatui/ratatui/blob/main/CHANGELOG.md">ratatui's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/ratatui/ratatui/releases/tag/v0.28.1">v0.28.1</a> - 2024-08-25</h2> <h3>Features</h3> <ul> <li> <p><a href="ed51c4b342">ed51c4b</a> <em>(terminal)</em> Add ratatui::init() and restore() methods by <a href="https://github.com/joshka"><code>@joshka</code></a> in <a href="https://redirect.github.com/ratatui/ratatui/pull/1289">#1289</a></p> <blockquote> <p>These are simple opinionated methods for creating a terminal that is useful to use in most apps. The new init method creates a crossterm backend writing to stdout, enables raw mode, enters the alternate screen, and sets a panic handler that restores the terminal on panic.</p> <p>A minimal hello world now looks a bit like:</p> <pre lang="rust"><code>use ratatui::{ crossterm::event::{self, Event}, text::Text, Frame, }; <p>fn main() {<br /> let mut terminal = ratatui::init();<br /> loop {<br /> terminal<br /> .draw(|frame: &mut Frame| frame.render_widget(Text::raw("Hello World!"), frame.area()))<br /> .expect("Failed to draw");<br /> if matches!(event::read().expect("failed to read event"), Event::Key(_)) {<br /> break;<br /> }<br /> }<br /> ratatui::restore();<br /> }<br /> </code></pre></p> <p>A type alias <code>DefaultTerminal</code> is added to represent this terminal type and to simplify any cases where applications need to pass this terminal around. It is equivalent to: <code>Terminal<CrosstermBackend<Stdout>></code></p> <p>We also added <code>ratatui::try_init()</code> and <code>try_restore()</code>, for situations where you might want to handle initialization errors yourself instead of letting the panic handler fire and cleanup. Simple Apps should prefer the <code>init</code> and <code>restore</code> functions over these functions.</p> <p>Corresponding functions to allow passing a <code>TerminalOptions</code> with a <code>Viewport</code> (e.g. inline, fixed) are also available (<code>init_with_options</code>, and <code>try_init_with_options</code>).</p> <p>The existing code to create a backend and terminal will remain and</p> </blockquote> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="3a90e2a761"><code>3a90e2a</code></a> chore(release): prepare for 0.28.1 (<a href="https://redirect.github.com/ratatui/ratatui/issues/1343">#1343</a>)</li> <li><a href="65da535745"><code>65da535</code></a> chore(ci): update release strategy (<a href="https://redirect.github.com/ratatui/ratatui/issues/1337">#1337</a>)</li> <li><a href="9ed85fd1dd"><code>9ed85fd</code></a> docs(table): fix incorrect backticks in <code>TableState</code> docs (<a href="https://redirect.github.com/ratatui/ratatui/issues/1342">#1342</a>)</li> <li><a href="aed60b9839"><code>aed60b9</code></a> fix(terminal): Terminal::insert_before would crash when called while the view...</li> <li><a href="3631b34f53"><code>3631b34</code></a> docs(examples): add widget implementation example (<a href="https://redirect.github.com/ratatui/ratatui/issues/1147">#1147</a>)</li> <li><a href="0d5f3c091f"><code>0d5f3c0</code></a> test: Avoid unneeded allocations in assertions (<a href="https://redirect.github.com/ratatui/ratatui/issues/1335">#1335</a>)</li> <li><a href="ed51c4b342"><code>ed51c4b</code></a> feat(terminal): Add ratatui::init() and restore() methods (<a href="https://redirect.github.com/ratatui/ratatui/issues/1289">#1289</a>)</li> <li><a href="23516bce76"><code>23516bc</code></a> chore: rename ratatui-org to ratatui (<a href="https://redirect.github.com/ratatui/ratatui/issues/1334">#1334</a>)</li> <li><a href="6d1bd99544"><code>6d1bd99</code></a> docs: minor grammar fixes (<a href="https://redirect.github.com/ratatui/ratatui/issues/1330">#1330</a>)</li> <li><a href="2fb0b8a741"><code>2fb0b8a</code></a> fix: fix u16 overflow in Terminal::insert_before. (<a href="https://redirect.github.com/ratatui/ratatui/issues/1323">#1323</a>)</li> <li>Additional commits viewable in <a href="https://github.com/ratatui/ratatui/compare/v0.28.0...v0.28.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Ratatui Macros
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
- Constraint-based Layouts: Easily define layout constraints such as fixed, percentage, minimum, and maximum sizes, as well as ratios.
- Directional Layouts: Specify layouts as either horizontal or vertical with simple macro commands.
- Span and Line macros: Make it easier to create spans and lines with styling.
Getting Started
To use ratatui-macros in your Rust project, add it as a dependency in your Cargo.toml:
cargo add ratatui-macros
Then, import the macros in your Rust file:
use ratatui_macros::{
constraint,
constraints,
horizontal,
vertical,
span,
line,
};
Layout
If you are new to Ratatui, check out the Layout concepts article on the Ratatui website before proceeding.
Use the constraints! macro to define layout constraints:
use ratatui::prelude::*;
use ratatui_macros::constraints;
assert_eq!(
constraints![==50, ==30%, >=3, <=1, ==1/2, *=1],
[
Constraint::Length(50),
Constraint::Percentage(30),
Constraint::Min(3),
Constraint::Max(1),
Constraint::Ratio(1, 2),
Constraint::Fill(1),
]
)
use ratatui::prelude::*;
use ratatui_macros::constraints;
assert_eq!(
constraints![==1/4; 4],
[
Constraint::Ratio(1, 4),
Constraint::Ratio(1, 4),
Constraint::Ratio(1, 4),
Constraint::Ratio(1, 4),
]
)
Use the constraint! macro to define individual constraints:
use ratatui::prelude::*;
use ratatui_macros::constraint;
assert_eq!(
constraint!(==50),
Constraint::Length(50),
)
Create vertical and horizontal layouts using the vertical! and horizontal! macros:
use ratatui::prelude::*;
use ratatui_macros::{vertical, horizontal};
let area = Rect { x: 0, y: 0, width: 10, height: 10 };
let [main, bottom] = vertical![==100%, >=3].areas(area);
assert_eq!(bottom.y, 7);
assert_eq!(bottom.height, 3);
let [left, main, right] = horizontal![>=3, ==100%, >=3].areas(area);
assert_eq!(left.width, 3);
assert_eq!(right.width, 3);
Spans
The span! macro create raw and styled Spans. They each take a format string and arguments.
span! accepts as the first parameter any value that can be converted to a Style followed by a
; followed by the format string and arguments.
use ratatui::prelude::*;
use ratatui_macros::span;
let name = "world!";
let raw_greeting = span!("hello {name}");
let styled_greeting = span!(Style::new().green(); "hello {name}");
let styled_greeting = span!(Color::Green; "hello {name}");
let styled_greeting = span!(Modifier::BOLD; "hello {name}");
Line
The line! macro creates a Line that contains a sequence of spans. It is similar to the vec!
macro.
use ratatui::prelude::*;
use ratatui_macros::line;
let name = "world!";
let line = line!["hello", format!("{name}")];
let line = line!["bye"; 2];
Text
The text! macro creates a Text that contains a sequence of lines. It is similar to the vec!
macro.
use ratatui::prelude::*;
use ratatui_macros::{span, line, text};
let name = "world!";
let text = text!["hello", format!("{name}")];
let text = text!["bye"; 2];
It is even possible to use span! and line! in the text! macro:
use ratatui::prelude::*;
use ratatui_macros::{span, line, text};
let name = "Bye!!!";
let text = text![line!["hello", "world".bold()], span!(Modifier::BOLD; "{name}")];
Row
The row! macro creates a Row that contains a sequence of Cell. It is similar to the vec!
macro. A Row represents a sequence of Cells in a single row of a table.
use ratatui::prelude::*;
use ratatui_macros::row;
let rows = [
row!["hello", "world"],
row!["goodbye", "world"],
];
It is even possible to use span!, line! and text! in the row! macro:
use ratatui::prelude::*;
use ratatui_macros::{span, line, text, row};
let name = "Bye!!!";
let text = row![text![line!["hello", "world".bold()]], span!(Modifier::BOLD; "{name}")];
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.