# Changelog All notable changes to this project will be documented in this file. _"Food will come, Remy. Food always comes to those who love to cook." – Gusteau_ We are excited to announce the new version of `ratatui` - a Rust library that's all about cooking up TUIs 👨‍🍳🐀 ✨ **Release highlights**: ⚠️ List of breaking changes can be found [here](https://github.com/ratatui/ratatui/blob/main/BREAKING-CHANGES.md). ## [v0.29.0](https://github.com/ratatui/ratatui/releases/tag/v0.29.0) - 2024-10-21 ### Features - [3a43274](https://github.com/ratatui/ratatui/commit/3a43274881a79b4e593536c2ca915b509e557215) *(color)* Add hsluv support by @du-ob in [#1333](https://github.com/ratatui/ratatui/pull/1333) - [4c4851c](https://github.com/ratatui/ratatui/commit/4c4851ca3d1437a50ed1f146c0849b58716b89a2) *(example)* Add drawing feature to the canvas example by @orhun in [#1429](https://github.com/ratatui/ratatui/pull/1429) > ![rec_20241018T235208](https://github.com/user-attachments/assets/cfb2f9f8-773b-4599-9312-29625ff2ca60) > > > fun fact: I had to do [35 > pushups](https://www.youtube.com/watch?v=eS92stzBYXA) for this... > > --------- - [e5a7609](https://github.com/ratatui/ratatui/commit/e5a76095884a4ce792846289f56d04a4acaaa6fa) *(line)* Impl From> for Line by @joshka in [#1373](https://github.com/ratatui/ratatui/pull/1373) [**breaking**] > > BREAKING-CHANGES:`Line` now implements `From` > > As this adds an extra conversion, ambiguous inferred values may no longer > compile. > > ```rust > // given: > struct Foo { ... } > impl From for String { ... } > impl From for Cow { ... } > > let foo = Foo { ... }; > let line = Line::from(foo); // now fails due to ambiguous type inference > // replace with > let line = Line::from(String::from(foo)); > ``` > > Fixes:https://github.com/ratatui/ratatui/issues/1367 > > --------- - [2805ddd](https://github.com/ratatui/ratatui/commit/2805dddf0527584da9c7865ff6a78a9c74731187) *(logo)* Add a Ratatui logo widget by @joshka in [#1307](https://github.com/ratatui/ratatui/pull/1307) > This is a simple logo widget that can be used to render the Ratatui logo > in the terminal. It is used in the `examples/ratatui-logo.rs` example, > and may be used in your applications' help or about screens. > > ```rust > use ratatui::{Frame, widgets::RatatuiLogo}; > > fn draw(frame: &mut Frame) { > frame.render_widget(RatatuiLogo::tiny(), frame.area()); > } > ``` - [d72968d](https://github.com/ratatui/ratatui/commit/d72968d86b94100579feba80c5cd207c2e7e13e7) *(scrolling-regions)* Use terminal scrolling regions to stop Terminal::insert_before from flickering by @nfachan in [#1341](https://github.com/ratatui/ratatui/pull/1341) [**breaking**] > The current implementation of Terminal::insert_before causes the > viewport to flicker. This is described in #584 . > > This PR removes that flickering by using terminal scrolling regions > (sometimes called "scroll regions"). A terminal can have its scrolling > region set to something other than the whole screen. When a scroll ANSI > sequence is sent to the terminal and it has a non-default scrolling > region, the terminal will scroll just inside of that region. > > We use scrolling regions to implement insert_before. We create a region > on the screen above the viewport, scroll that up to make room for the > newly inserted lines, and then draw the new lines. We may need to repeat > this process depending on how much space there is and how many lines we > need to draw. > > When the viewport takes up the entire screen, we take a modified > approach. We create a scrolling region of just the top line (could be > more) of the viewport, then use that to draw the lines we want to > output. When we're done, we scroll it up by one line, into the > scrollback history, and then redraw the top line from the viewport. > > A final edge case is when the viewport hasn't yet reached the bottom of > the screen. This case, we set up a different scrolling region, where the > top is the top of the viewport, and the bottom is the viewport's bottom > plus the number of lines we want to scroll by. We then scroll this > region down to open up space above the viewport for drawing the inserted > lines. > > Regardless of what we do, we need to reset the scrolling region. This PR > takes the approach of always resetting the scrolling region after every > operation. So the Backend gets new scroll_region_up and > scroll_region_down methods instead of set_scrolling_region, scroll_up, > scroll_down, and reset_scrolling_region methods. We chose that approach > for two reasons. First, we don't want Ratatui to have to remember that > state and then reset the scrolling region when tearing down. Second, the > pre-Windows-10 console code doesn't support scrolling region > > This PR: > - Adds a new scrolling-regions feature. > - Adds two new Backend methods: scroll_region_up and scroll_region_down. > - Implements those Backend methods on all backends in the codebase. > - The crossterm and termion implementations use raw ANSI escape > sequences. I'm trying to merge changes into those two projects > separately to support these functions. > - Adds code to Terminal::insert_before to choose between > insert_before_scrolling_regions and insert_before_no_scrolling_regions. > The latter is the old implementation. > - Adds lots of tests to the TestBackend to for the > scrolling-region-related Backend methods. > - Adds versions of terminal tests that show that insert_before doesn't > clobber the viewport. This is a change in behavior from before. - [dc8d058](https://github.com/ratatui/ratatui/commit/dc8d0587ecfd46cde86c9e33a6fd385e2d4810a9) *(table)* Add support for selecting column and cell by @airblast-dev in [#1331](https://github.com/ratatui/ratatui/pull/1331) [**breaking**] > Fixes https://github.com/ratatui-org/ratatui/issues/1250 > > Adds support for selecting a column and cell in `TableState`. The > selected column, and cells style can be set by > `Table::column_highlight_style` and `Table::cell_highlight_style` > respectively. > > The table example has also been updated to display the new > functionality: > > https://github.com/user-attachments/assets/e5fd2858-4931-4ce1-a2f6-a5ea1eacbecc > > BREAKING CHANGE:The Serialized output of the state will now include the > "selected_column" field. Software that manually parse the serialized the > output (with anything other than the `Serialize` implementation on > `TableState`) may have to be refactored if the "selected_column" field > is not accounted for. This does not affect users who rely on the > `Deserialize`, or `Serialize` implementation on the state. > > BREAKING CHANGE:The `Table::highlight_style` is now deprecated in favor > of `Table::row_highlight_style`. > > --------- - [ab6b1fe](https://github.com/ratatui/ratatui/commit/ab6b1feaec3ef0cf23bcfac219b95ec946180fa8) *(tabs)* Allow tabs to be deselected by @joshka in [#1413](https://github.com/ratatui/ratatui/pull/1413) [**breaking**] > > `Tabs::select()` now accepts `Into>` instead of `usize`. > This allows tabs to be deselected by passing `None`. > > `Tabs::default()` is now also implemented manually instead of deriving > `Default`, and a new method `Tabs::titles()` is added to set the titles > of the tabs. > > Fixes: > > BREAKING CHANGE:`Tabs::select()` now accepts `Into>` > which breaks any code already using parameter type inference: > > ```diff > let selected = 1u8; > - let tabs = Tabs::new(["A", "B"]).select(selected.into()) > + let tabs = Tabs::new(["A", "B"]).select(selected as usize) > ``` - [23c0d52](https://github.com/ratatui/ratatui/commit/23c0d52c29f27547d94448be44aa46e85f49fbb0) *(text)* Improve concise debug view for Span,Line,Text,Style by @joshka in [#1410](https://github.com/ratatui/ratatui/pull/1410) > Improves https://github.com/ratatui/ratatui/pull/1383 > > The following now round trips when formatted for debug. > This will make it easier to use insta when testing text related views of > widgets. > > ```rust > Text::from_iter([ > Line::from("Hello, world!"), > Line::from("How are you?").bold().left_aligned(), > Line::from_iter([ > Span::from("I'm "), > Span::from("doing ").italic(), > Span::from("great!").bold(), > ]), > ]).on_blue().italic().centered() > ``` - [60cc15b](https://github.com/ratatui/ratatui/commit/60cc15bbb064faa704f78ca51ae60584b5f7ca31) *(uncategorized)* Add support for empty bar style to `Sparkline` by @fujiapple852 in [#1326](https://github.com/ratatui/ratatui/pull/1326) [**breaking**] > - distinguish between empty bars and bars with a value of 0 > - provide custom styling for empty bars > - provide custom styling for individual bars > - inverts the rendering algorithm to be item first > > Closes:#1325 > > BREAKING CHANGE:`Sparkline::data` takes `IntoIterator` > instead of `&[u64]` and is no longer const - [453a308](https://github.com/ratatui/ratatui/commit/453a308b46bbacba2ee7cba849cf0c19c88a1a27) *(uncategorized)* Add overlap to layout by @kdheepak in [#1398](https://github.com/ratatui/ratatui/pull/1398) [**breaking**] > This PR adds a new feature for the existing `Layout::spacing` method, > and introducing a `Spacing` enum. > > Now `Layout::spacing` is generic and can take > > - zero or positive numbers, e.g. `Layout::spacing(1)` (current > functionality) > - negative number, e.g. `Layout::spacing(-1)` (new) > - variant of the `Spacing` (new) > > This allows creating layouts with a shared pixel for segments. When > `spacing(negative_value)` is used, spacing is ignored and all segments > will be adjacent and have pixels overlapping. > `spacing(zero_or_positive_value)` behaves the same as before. These are > internally converted to `Spacing::Overlap` or `Spacing::Space`. > > Here's an example output to illustrate the layout solve from this PR: > > ```rust > #[test] > fn test_layout() { > use crate::layout::Constraint::*; > let mut terminal = crate::Terminal::new(crate::backend::TestBackend::new(50, 4)).unwrap(); > terminal > .draw(|frame| { > let [upper, lower] = Layout::vertical([Fill(1), Fill(1)]).areas(frame.area()); > > let (segments, spacers) = Layout::horizontal([Length(10), Length(10), Length(10)]) > .flex(Flex::Center) > .split_with_spacers(upper); > > for segment in segments.iter() { > frame.render_widget( > crate::widgets::Block::bordered() > .border_set(crate::symbols::border::DOUBLE), > *segment, > ); > } > for spacer in spacers.iter() { > frame.render_widget(crate::widgets::Block::bordered(), *spacer); > } > > let (segments, spacers) = Layout::horizontal([Length(10), Length(10), Length(10)]) > .flex(Flex::Center) > .spacing(-1) // new feature > .split_with_spacers(lower); > > for segment in segments.iter() { > frame.render_widget( > crate::widgets::Block::bordered() > .border_set(crate::symbols::border::DOUBLE), > *segment, > ); > } > for spacer in spacers.iter() { > frame.render_widget(crate::widgets::Block::bordered(), *spacer); > } > }) > .unwrap(); > dbg!(terminal.backend()); > } > ``` > > > ```plain > ┌────────┐╔════════╗╔════════╗╔════════╗┌────────┐ > └────────┘╚════════╝╚════════╝╚════════╝└────────┘ > ┌─────────┐╔════════╔════════╔════════╗┌─────────┐ > └─────────┘╚════════╚════════╚════════╝└─────────┘ > ``` > > Currently drawing a border on top of an existing border overwrites it. > Future PRs will allow for making the border drawing handle overlaps > better. > > --------- - [7bdccce](https://github.com/ratatui/ratatui/commit/7bdccce3d56052306eb4121afe6b1ff56b198796) *(uncategorized)* Add an impl of `DoubleEndedIterator` for `Columns` and `Rows` by @fujiapple852 [**breaking**] > > BREAKING-CHANGE:The `pub` modifier has been removed from fields on the > > `layout::rect::Columns` and `layout::rect::Rows` iterators. These fields > were not intended to be public and should not have been accessed > directly. > > Fixes:#1357 ### Bug Fixes - [4f5503d](https://github.com/ratatui/ratatui/commit/4f5503dbf610290904a759a3f169a15111f11392) *(color)* Hsl and hsluv are now clamped before conversion by @joshka in [#1436](https://github.com/ratatui/ratatui/pull/1436) [**breaking**] > The `from_hsl` and `from_hsluv` functions now clamp the HSL and HSLuv > values before converting them to RGB. This ensures that the input values > are within the expected range before conversion. > > Also note that the ranges of Saturation and Lightness values have been > aligned to be consistent with the palette crate. Saturation and Lightness > for `from_hsl` are now in the range [0.0..1.0] while `from_hsluv` are > in the range [0.0..100.0]. > > Refs:- > - > - > > Fixes: - [b7e4885](https://github.com/ratatui/ratatui/commit/b7e488507d23cbc91ac63d5249088ad0f4852205) *(color)* Fix doc test for from_hsl by @joshka in [#1421](https://github.com/ratatui/ratatui/pull/1421) - [3df685e](https://github.com/ratatui/ratatui/commit/3df685e1144340935db2b1d929e2546f83c5e65f) *(rect)* Rect::area now returns u32 and Rect::new() no longer clamps area to u16::MAX by @joshka in [#1378](https://github.com/ratatui/ratatui/pull/1378) [**breaking**] > This change fixes the unexpected behavior of the Rect::new() function to > be more intuitive. The Rect::new() function now clamps the width and > height of the rectangle to keep each bound within u16::MAX. The > Rect::area() function now returns a u32 instead of a u16 to allow for > larger areas to be calculated. > > Previously, the Rect::new() function would clamp the total area of the > rectangle to u16::MAX, by preserving the aspect ratio of the rectangle. > > BREAKING CHANGE:Rect::area() now returns a u32 instead of a u16. > > Fixes: - [514d273](https://github.com/ratatui/ratatui/commit/514d2738750d792a75fde6cc7666f9220bcf6b3a) *(terminal)* Use the latest, resized area when clearing by @roberth in [#1427](https://github.com/ratatui/ratatui/pull/1427) - [0f48239](https://github.com/ratatui/ratatui/commit/0f4823977894cef51d5ffafe6ae35ca7ad56e1ac) *(terminal)* Resize() now resizes fixed viewports by @Patryk27 in [#1353](https://github.com/ratatui/ratatui/pull/1353) > > `Terminal::resize()` on a fixed viewport used to do nothing due to > an accidentally shadowed variable. This now works as intended. - [a52ee82](https://github.com/ratatui/ratatui/commit/a52ee82fc716fafb2652b83a331c36f844104dda) *(text)* Truncate based on alignment by @Lunderberg in [#1432](https://github.com/ratatui/ratatui/pull/1432) > This is a follow-up PR to https://github.com/ratatui/ratatui/pull/987, > which implemented alignment-aware truncation for the `Line` widget. > However, the truncation only checked the `Line::alignment` field, and > any alignment inherited from a parent's `Text::alignment` field would > not be used. > > This commit updates the truncation of `Line` to depend both on the > individual `Line::alignment`, and on any alignment inherited from the > parent's `Text::alignment`. - [611086e](https://github.com/ratatui/ratatui/commit/611086eba4dc07dcef89502a3bedfc28015b879f) *(uncategorized)* Sparkline docs / doc tests by @joshka in [#1437](https://github.com/ratatui/ratatui/pull/1437) - [b9653ba](https://github.com/ratatui/ratatui/commit/b9653ba05a468d3843499d8abd243158df823f82) *(uncategorized)* Prevent calender render panic when terminal height is small by @adrodgers in [#1380](https://github.com/ratatui/ratatui/pull/1380) > > Fixes:#1379 - [da821b4](https://github.com/ratatui/ratatui/commit/da821b431edd656973b4480d3d4f22e7eea6d369) *(uncategorized)* Clippy lints from rust 1.81.0 by @fujiapple852 in [#1356](https://github.com/ratatui/ratatui/pull/1356) - [68886d1](https://github.com/ratatui/ratatui/commit/68886d1787b8e07d307dda4f36342d51d650345b) *(uncategorized)* Add `unstable-backend-writer` feature by @Patryk27 in [#1352](https://github.com/ratatui/ratatui/pull/1352) > > https://github.com/ratatui/ratatui/pull/991 created a new unstable > feature, but forgot to add it to Cargo.toml, making it impossible to use > on newer versions of rustc - this commit fixes it. ### Refactor - [6db16d6](https://github.com/ratatui/ratatui/commit/6db16d67fc3cc97f1e5bd4b7df02ce9f00756a55) *(color)* Use palette types for Hsl/Hsluv conversions by @orhun in [#1418](https://github.com/ratatui/ratatui/pull/1418) [**breaking**] > > BREAKING-CHANGE:Previously `Color::from_hsl` accepted components > as individual f64 parameters. It now accepts a single `palette::Hsl` > value > and is gated behind a `palette` feature flag. > > ```diff > - Color::from_hsl(360.0, 100.0, 100.0) > + Color::from_hsl(Hsl::new(360.0, 100.0, 100.0)) > ``` > > Fixes: > > --------- - [edcdc8a](https://github.com/ratatui/ratatui/commit/edcdc8a8147a2f450d2c871b19da6d6383fd5497) *(layout)* Rename element to segment in layout by @kdheepak in [#1397](https://github.com/ratatui/ratatui/pull/1397) > This PR renames `element` to `segment` in a couple of functions in the > layout calculations for clarity. `element` can refer to `segment`s or > `spacer`s and functions that take only `segment`s should use `segment` > as the variable names. - [1153a9e](https://github.com/ratatui/ratatui/commit/1153a9ebaf0b98c45982002a659cb718e3c1d137) *(uncategorized)* Consistent result expected in layout tests by @farmeroy in [#1406](https://github.com/ratatui/ratatui/pull/1406) > > Fixes #1399 > I've looked through all the `assert_eq` and made sure that they follow > the `expected, result` pattern. I wasn't sure if it was desired to > actually pass result and expected as variables to the assert_eq > statements, so I've left everything that seems to have followed the > pattern as is. - [20c88aa](https://github.com/ratatui/ratatui/commit/20c88aaa5b9eb011a52240eab5edc1a8db23157a) *(uncategorized)* Avoid unneeded allocations by @mo8it in [#1345](https://github.com/ratatui/ratatui/pull/1345) ### Documentation - [b13e2f9](https://github.com/ratatui/ratatui/commit/b13e2f94733afccfe02275fca263bde1dc532d2f) *(backend)* Added link to stdio FAQ by @Valentin271 in [#1349](https://github.com/ratatui/ratatui/pull/1349) - [b88717b](https://github.com/ratatui/ratatui/commit/b88717b65f7f89276edd855c4a3f9da2eda44361) *(constraint)* Add note about percentages by @joshka in [#1368](https://github.com/ratatui/ratatui/pull/1368) - [381ec75](https://github.com/ratatui/ratatui/commit/381ec75329866b3c1256113d1cb7716206b79fb7) *(readme)* Reduce the length by @joshka in [#1431](https://github.com/ratatui/ratatui/pull/1431) > Motivation for this is that there's a bunch of stuff at the bottom of the Readme that we don't really keep up to date. Instead it's better to link to the places that we do keep this info. - [4728f0e](https://github.com/ratatui/ratatui/commit/4728f0e68b41eabb7d4ebd041fd5a85a0e794287) *(uncategorized)* Tweak readme by @joshka in [#1419](https://github.com/ratatui/ratatui/pull/1419) > > Fixes: - [4069aa8](https://github.com/ratatui/ratatui/commit/4069aa82745585f53b4b3376af589bb1b6108427) *(uncategorized)* Fix missing breaking changes link by @joshka in [#1416](https://github.com/ratatui/ratatui/pull/1416) - [870bc6a](https://github.com/ratatui/ratatui/commit/870bc6a64a680e9209d30e67e2e1f4e50a10a4bb) *(uncategorized)* Use `Frame::area()` instead of `size()` in examples by @hosseinnedaee in [#1361](https://github.com/ratatui/ratatui/pull/1361) > > `Frame::size()` is deprecated ### Performance - [8db7a9a](https://github.com/ratatui/ratatui/commit/8db7a9a44a2358315dedaee3e7a2cb1a44ae1e58) *(uncategorized)* Implement size hints for `Rect` iterators by @airblast-dev in [#1420](https://github.com/ratatui/ratatui/pull/1420) ### Styling - [e02947b](https://github.com/ratatui/ratatui/commit/e02947be6185643f906a97c453540676eade3f38) *(example)* Update panic message in minimal template by @orhun in [#1344](https://github.com/ratatui/ratatui/pull/1344) ### Miscellaneous Tasks - [67c0ea2](https://github.com/ratatui/ratatui/commit/67c0ea243b5eb08159e41f922067247984902c1a) *(block)* Deprecate block::Title by @joshka in [#1372](https://github.com/ratatui/ratatui/pull/1372) > > `ratatui::widgets::block::Title` is deprecated in favor of using `Line` > to represent titles. > This removes an unnecessary layer of wrapping (string -> Span -> Line -> > Title). > > This struct will be removed in a future release of Ratatui (likely > 0.31). > For more information see: > > > > To update your code: > ```rust > > Block::new().title(Title::from("foo")); > // becomes any of > > Block::new().title("foo"); > > Block::new().title(Line::from("foo")); > > Block::new().title(Title::from("foo").position(Position::TOP)); > // becomes any of > > Block::new().title_top("foo"); > > Block::new().title_top(Line::from("foo")); > > Block::new().title(Title::from("foo").position(Position::BOTTOM)); > // becomes any of > > Block::new().title_bottom("foo"); > > Block::new().title_bottom(Line::from("foo")); > ``` - [6515097](https://github.com/ratatui/ratatui/commit/6515097434a10c08276b58f0cd10b9301b44e9fe) *(cargo)* Check in Cargo.lock by @joshka in [#1434](https://github.com/ratatui/ratatui/pull/1434) > When kept up to date, this makes it possible to build any git version > with the same versions of crates that were used for any version, without > it, you can only use the current versions. This makes bugs in semver > compatible code difficult to detect. > > The Cargo.lock file is not used by downstream consumers of the crate, so > it is safe to include it in the repository (and recommended by the Rust > docs). > > See:- https://doc.rust-lang.org/cargo/faq.html#why-have-cargolock-in-version-control > - https://blog.rust-lang.org/2023/08/29/committing-lockfiles.html > - https://github.com/rust-lang/cargo/issues/8728 - [c777beb](https://github.com/ratatui/ratatui/commit/c777beb658ebab26890b52cbda8df5d945525221) *(ci)* Bump git-cliff-action to v4 by @orhun in [#1350](https://github.com/ratatui/ratatui/pull/1350) > > See:https://github.com/orhun/git-cliff-action/releases/tag/v4.0.0 - [69e0cd2](https://github.com/ratatui/ratatui/commit/69e0cd2fc4b126870b3381704260271904996c8f) *(deny)* Allow Zlib license in cargo-deny configuration by @orhun in [#1411](https://github.com/ratatui/ratatui/pull/1411) - [bc10af5](https://github.com/ratatui/ratatui/commit/bc10af5931d1c1ec58a4181c01807ed3c52051c6) *(style)* Make Debug output for Text/Line/Span/Style more concise by @joshka in [#1383](https://github.com/ratatui/ratatui/pull/1383) > > Given:```rust > > Text::from_iter([ > Line::from("without line fields"), > Line::from("with line fields").bold().centered(), > Line::from_iter([ > Span::from("without span fields"), > Span::from("with span fields") > .green() > .on_black() > .italic() > .not_dim(), > ]), > ]) > ``` > > Debug:``` > Text [Line [Span("without line fields")], Line { style: Style::new().add_modifier(Modifier::BOLD), alignment: Some(Center), spans: [Span("with line fields")] }, Line [Span("without span fields"), Span { style: Style::new().green().on_black().add_modifier(Modifier::ITALIC).remove_modifier(Modifier::DIM), content: "with span fields" }]] > ``` > > Fixes: https://github.com/ratatui/ratatui/issues/1382 > > --------- - [f6f7794](https://github.com/ratatui/ratatui/commit/f6f7794dd782d20cd41875c0578ffc4331692c1e) *(uncategorized)* Remove leftover prelude refs / glob imports from example code by @joshka in [#1430](https://github.com/ratatui/ratatui/pull/1430) > > Fixes: - [9fd1bee](https://github.com/ratatui/ratatui/commit/9fd1beedb25938bcc9565a52f1104ed45636c2dd) *(uncategorized)* Make Positions iterator fields private by @joshka in [#1424](https://github.com/ratatui/ratatui/pull/1424) [**breaking**] > > BREAKING CHANGE:The Rect Positions iterator no longer has public > fields. The `rect` and `current_position` fields have been made private > as they were not intended to be accessed directly. - [c32baa7](https://github.com/ratatui/ratatui/commit/c32baa7cd8a29a370a71da07ee02cf32125c9bcf) *(uncategorized)* Add benchmark for `Table` by @airblast-dev in [#1408](https://github.com/ratatui/ratatui/pull/1408) - [5ad623c](https://github.com/ratatui/ratatui/commit/5ad623c29b8f0b50fad742448902245f353ef19e) *(uncategorized)* Remove usage of prelude by @joshka in [#1390](https://github.com/ratatui/ratatui/pull/1390) > This helps make the doc examples more explicit about what is being used. > It will also makes it a bit easier to do future refactoring of Ratatui, > into several crates, as the ambiguity of where types are coming from > will be reduced. > > Additionally, several doc examples have been simplified to use Stylize, > and necessary imports are no longer hidden. > > This doesn't remove the prelude. Only the internal usages. - [f4880b4](https://github.com/ratatui/ratatui/commit/cc7497532ac50e7e15e8ee8ff506f4689c396f50) *(deps)* Pin unicode-width to 0.2.0 by @orhun in [#1403](https://github.com/ratatui/ratatui/pull/1403) [**breaking**] > We pin unicode-width to avoid breaking applications when there are breaking changes in the library. > > Discussion in [#1271](https://github.com/ratatui/ratatui/pull/1271) ### Continuous Integration - [5635b93](https://github.com/ratatui/ratatui/commit/5635b930c7196ef8f12824341a7bd8b7323aabcd) *(uncategorized)* Add cargo-machete and remove unused deps by @Veetaha in [#1362](https://github.com/ratatui/ratatui/pull/1362) > > https://github.com/bnjbvr/cargo-machete ### New Contributors * @roberth made their first contribution in [#1427](https://github.com/ratatui/ratatui/pull/1427) * @du-ob made their first contribution in [#1333](https://github.com/ratatui/ratatui/pull/1333) * @farmeroy made their first contribution in [#1406](https://github.com/ratatui/ratatui/pull/1406) * @adrodgers made their first contribution in [#1380](https://github.com/ratatui/ratatui/pull/1380) * @Veetaha made their first contribution in [#1362](https://github.com/ratatui/ratatui/pull/1362) * @hosseinnedaee made their first contribution in [#1361](https://github.com/ratatui/ratatui/pull/1361) * @Patryk27 made their first contribution in [#1352](https://github.com/ratatui/ratatui/pull/1352) **Full Changelog**: https://github.com/ratatui/ratatui/compare/v0.28.1...v0.29.0 ## [v0.28.1](https://github.com/ratatui/ratatui/releases/tag/v0.28.1) - 2024-08-25 ### Features - [ed51c4b](https://github.com/ratatui/ratatui/commit/ed51c4b3429862201b2c5de6846fea4c237f0ffb) *(terminal)* Add ratatui::init() and restore() methods by @joshka in [#1289](https://github.com/ratatui/ratatui/pull/1289) > 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. > > A minimal hello world now looks a bit like: > > ```rust > use ratatui::{ > crossterm::event::{self, Event}, > text::Text, > Frame, > }; > > fn main() { > let mut terminal = ratatui::init(); > loop { > terminal > .draw(|frame: &mut Frame| frame.render_widget(Text::raw("Hello World!"), frame.area())) > .expect("Failed to draw"); > if matches!(event::read().expect("failed to read event"), Event::Key(_)) { > break; > } > } > ratatui::restore(); > } > ``` > > A type alias `DefaultTerminal` is added to represent this terminal > type and to simplify any cases where applications need to pass this > terminal around. It is equivalent to: > `Terminal>` > > We also added `ratatui::try_init()` and `try_restore()`, 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 `init` and `restore` functions over these functions. > > Corresponding functions to allow passing a `TerminalOptions` with > a `Viewport` (e.g. inline, fixed) are also available > (`init_with_options`, > and `try_init_with_options`). > > The existing code to create a backend and terminal will remain and > is not deprecated by this approach. This just provides a simple one > line initialization using the common options. > > --------- ### Bug Fixes - [aed60b9](https://github.com/ratatui/ratatui/commit/aed60b98394edc834d9fe8e96c3698510b5922f4) *(terminal)* Terminal::insert_before would crash when called while the viewport filled the screen by @nfachan in [#1329](https://github.com/ratatui/ratatui/pull/1329) > Reimplement Terminal::insert_before. The previous implementation would > insert the new lines in chunks into the area between the top of the > screen and the top of the (new) viewport. If the viewport filled the > screen, there would be no area in which to insert lines, and the > function would crash. > > The new implementation uses as much of the screen as it needs to, all > the way up to using the whole screen. > > This commit: > - adds a scrollback buffer to the `TestBackend` so that tests can > inspect and assert the state of the scrollback buffer in addition to the > screen > - adds functions to `TestBackend` to assert the state of the scrollback > - adds and updates `TestBackend` tests to test the behavior of the > scrollback and the new asserting functions > - reimplements `Terminal::insert_before`, including adding two new > helper functions `Terminal::draw_lines` and `Terminal::scroll_up`. > - updates the documentation for `Terminal::insert_before` to clarify > some of the edge cases > - updates terminal tests to assert the state of the scrollback buffer > - adds a new test for the condition that causes the bug > - adds a conversion constructor `Cell::from(char)` > > Fixes:https://github.com/ratatui/ratatui/issues/999 - [fdd5d8c](https://github.com/ratatui/ratatui/commit/fdd5d8c092b33c188b0657f5a2e17fa6712a91ae) *(text)* Remove trailing newline from single-line Display trait impl by @LucasPickering in [#1320](https://github.com/ratatui/ratatui/pull/1320) - [2fb0b8a](https://github.com/ratatui/ratatui/commit/2fb0b8a741e7e20d4bbef8077e25d63e5ee51d83) *(uncategorized)* Fix u16 overflow in Terminal::insert_before. by @nfachan in [#1323](https://github.com/ratatui/ratatui/pull/1323) > If the amount of characters in the screen above the viewport was greater > than u16::MAX, a multiplication would overflow. The multiply was used to > compute the maximum chunk size. The fix is to just do the multiplication > as a usize and also do the subsequent division as a usize. > > There is currently another outstanding issue that limits the amount of > characters that can be inserted when calling Terminal::insert_before to > u16::MAX. However, this bug can still occur even if the viewport and the > amount of characters being inserted are both less than u16::MAX, since > it's dependant on how large the screen is above the viewport. > > Fixes #1322 ### Documentation - [3631b34](https://github.com/ratatui/ratatui/commit/3631b34f538a14840d633de57a0beb59c83bd649) *(examples)* Add widget implementation example by @joshka in [#1147](https://github.com/ratatui/ratatui/pull/1147) > This new example documents the various ways to implement widgets in > Ratatui. It demonstrates how to implement the `Widget` trait on a type, > a reference, and a mutable reference. It also shows how to use the > `WidgetRef` trait to render boxed widgets. - [d5477b5](https://github.com/ratatui/ratatui/commit/d5477b50d54fc43c75924c2b2584331f039ed261) *(examples)* Use ratatui::crossterm in examples by @joshka in [#1315](https://github.com/ratatui/ratatui/pull/1315) - [730dfd4](https://github.com/ratatui/ratatui/commit/730dfd4940809fb2d8a15ed2976a4016c2227114) *(examples)* Show line gauge in demo example by @montmorill in [#1309](https://github.com/ratatui/ratatui/pull/1309) - [9ed85fd](https://github.com/ratatui/ratatui/commit/9ed85fd1dddc68757e9258b2e99dbd25f7ba0768) *(table)* Fix incorrect backticks in `TableState` docs by @airblast-dev in [#1342](https://github.com/ratatui/ratatui/pull/1342) - [6d1bd99](https://github.com/ratatui/ratatui/commit/6d1bd99544ab3b82b2494ca514f307234c6f2477) *(uncategorized)* Minor grammar fixes by @matta in [#1330](https://github.com/ratatui/ratatui/pull/1330) - [097ee86](https://github.com/ratatui/ratatui/commit/097ee86e399abefdca6505550287035967a7b035) *(uncategorized)* Remove superfluous doc(inline) by @EdJoPaTo in [#1310](https://github.com/ratatui/ratatui/pull/1310) > It's no longer needed since #1260 - [3fdb5e8](https://github.com/ratatui/ratatui/commit/3fdb5e8987ca811c094593b0f816a64900880d23) *(uncategorized)* Fix typo in terminal.rs by @mrjackwills in [#1313](https://github.com/ratatui/ratatui/pull/1313) ### Testing - [0d5f3c0](https://github.com/ratatui/ratatui/commit/0d5f3c091f838888a3cfb69c6de3a0a6af739bbe) *(uncategorized)* Avoid unneeded allocations in assertions by @mo8it in [#1335](https://github.com/ratatui/ratatui/pull/1335) > A vector can be compared to an array. ### Miscellaneous Tasks - [65da535](https://github.com/ratatui/ratatui/commit/65da5357455b11cd395757182f07b0ee22025e4b) *(ci)* Update release strategy by @orhun in [#1337](https://github.com/ratatui/ratatui/pull/1337) > > closes #1232 > > Now we can trigger point releases by pushing a tag (follow the > instructions in `RELEASE.md`). This will create a release with generated > changelog. > > There is still a lack of automation (e.g. updating `CHANGELOG.md`), but > this PR is a good start towards improving that. - [57d8b74](https://github.com/ratatui/ratatui/commit/57d8b742e55b75674e271a83339fc585f62d3a6d) *(ci)* Use cargo-docs-rs to lint docs by @joshka in [#1318](https://github.com/ratatui/ratatui/pull/1318) - [8b624f5](https://github.com/ratatui/ratatui/commit/8b624f5952af940d570bc95d45b6bd7bf8018dd0) *(maintainers)* Remove EdJoPaTo by @EdJoPaTo in [#1314](https://github.com/ratatui/ratatui/pull/1314) - [23516bc](https://github.com/ratatui/ratatui/commit/23516bce76af91586b697db339da6b895c9e7151) *(uncategorized)* Rename ratatui-org to ratatui by @joshka in [#1334](https://github.com/ratatui/ratatui/pull/1334) > All urls updated to point at https://github.com/ratatui > > To update your repository remotes, you can run the following commands: > > ```shell > git remote set-url origin https://github.com/ratatui/ratatui > ``` ### Build - [0256269](https://github.com/ratatui/ratatui/commit/0256269a7f978c6bba6fcae3e35517b42b3dc846) *(uncategorized)* Simplify Windows build by @joshka in [#1317](https://github.com/ratatui/ratatui/pull/1317) > Termion is not supported on Windows, so we need to avoid building it. > > Adds a conditional dependency to the Cargo.toml file to only include > termion when the target is not Windows. This allows contributors to > build using the `--all-features` flag on Windows rather than needing > to specify the features individually. ### New Contributors * @nfachan made their first contribution in [#1329](https://github.com/ratatui/ratatui/pull/1329) * @LucasPickering made their first contribution in [#1320](https://github.com/ratatui/ratatui/pull/1320) * @montmorill made their first contribution in [#1309](https://github.com/ratatui/ratatui/pull/1309) **Full Changelog**: https://github.com/ratatui/ratatui/compare/v0.28.0...v0.28.1 ## [0.28.0](https://github.com/ratatui/ratatui/releases/tag/v0.28.0) - 2024-08-07 _"If you are what you eat, then I only want to eat the good stuff." – Remy_ We are excited to announce the new version of `ratatui` - a Rust library that's all about cooking up TUIs 🐭 In this version, we have upgraded to Crossterm 0.28.0, introducing enhanced functionality and performance improvements. New features include GraphType::Bar, lines in bar charts, and enhanced scroll/navigation methods. We have also refined the terminal module and added brand new methods for cursor positions and text operations. ✨ **Release highlights**: ⚠️ List of breaking changes can be found [here](https://github.com/ratatui/ratatui/blob/main/BREAKING-CHANGES.md). ### Features - [8d4a102](https://github.com/ratatui/ratatui/commit/8d4a1026ab410a52570737c6d62edcd0a205091e) _(barchart)_ Allow axes to accept Lines by @joshka in [#1273](https://github.com/ratatui/ratatui/pull/1273) [**breaking**] > > Fixes: - [a23ecd9](https://github.com/ratatui/ratatui/commit/a23ecd9b456ab2aa4dc858fe31461a6224b40fe3) _(buffer)_ Add Buffer::cell, cell_mut and index implementations by @joshka in [#1084](https://github.com/ratatui/ratatui/pull/1084) > Code which previously called `buf.get(x, y)` or `buf.get_mut(x, y)` > should now use index operators, or be transitioned to `buff.cell()` or > `buf.cell_mut()` for safe access that avoids panics by returning > `Option<&Cell>` and `Option<&mut Cell>`. > > The new methods accept `Into` instead of `x` and `y` > coordinates, which makes them more ergonomic to use. > > ```rust > let mut buffer = Buffer::empty(Rect::new(0, 0, 10, 10)); > > let cell = buf[(0, 0)]; > let cell = buf[Position::new(0, 0)]; > > let symbol = buf.cell((0, 0)).map(|cell| cell.symbol()); > let symbol = buf.cell(Position::new(0, 0)).map(|cell| cell.symbol()); > > buf[(0, 0)].set_symbol("🐀"); > buf[Position::new(0, 0)].set_symbol("🐀"); > > buf.cell_mut((0, 0)).map(|cell| cell.set_symbol("🐀")); > buf.cell_mut(Position::new(0, 0)).map(|cell| cell.set_symbol("🐀")); > ``` > > The existing `get()` and `get_mut()` methods are marked as deprecated. > These are fairly widely used and we will leave these methods around on > the buffer for a longer time than our normal deprecation approach (2 > major release) > > Addresses part of: > > --------- - [afe1534](https://github.com/ratatui/ratatui/commit/afe15349c87efefc5c9f0385f8f145f4b9c42c0a) _(chart)_ Accept `IntoIterator` for axis labels by @EdJoPaTo in [#1283](https://github.com/ratatui/ratatui/pull/1283) [**breaking**] > BREAKING CHANGES: #1273 is already breaking and this only advances the > already breaking part - [5b51018](https://github.com/ratatui/ratatui/commit/5b51018501c859d4e6ee0ff55e010310bda5511f) _(chart)_ Add GraphType::Bar by @joshka in [#1205](https://github.com/ratatui/ratatui/pull/1205) > ![Demo](https://vhs.charm.sh/vhs-50v7I5n7lQF7tHCb1VCmFc.gif) - [f97e07c](https://github.com/ratatui/ratatui/commit/f97e07c08a332e257efabdbe3f8bb306aec2a8eb) _(frame)_ Replace Frame::size() with Frame::area() by @EdJoPaTo in [#1293](https://github.com/ratatui/ratatui/pull/1293) > Area is the more correct term for the result of this method. > The Frame::size() method is marked as deprecated and will be > removed around Ratatui version 0.30 or later. > > Fixes: - [5b89bd0](https://github.com/ratatui/ratatui/commit/5b89bd04a8a4860dc5040150464b45d1909184db) _(layout)_ Add Size::ZERO and Position::ORIGIN constants by @EdJoPaTo in [#1253](https://github.com/ratatui/ratatui/pull/1253) - [b2aa843](https://github.com/ratatui/ratatui/commit/b2aa843b310d8df77d16670c302b247fc0315372) _(layout)_ Enable serde for Margin, Position, Rect, Size by @EdJoPaTo in [#1255](https://github.com/ratatui/ratatui/pull/1255) - [36d49e5](https://github.com/ratatui/ratatui/commit/36d49e549b9e19e87e71c23afaee274fa7415fde) _(table)_ Select first, last, etc to table state by @robertpsoane in [#1198](https://github.com/ratatui/ratatui/pull/1198) > Add select_previous, select_next, select_first & select_last to > TableState > > Used equivalent API as in ListState - [3bb374d](https://github.com/ratatui/ratatui/commit/3bb374df88c79429767d9eb788bda2e65b3ba412) _(terminal)_ Add Terminal::try_draw() method by @joshka in [#1209](https://github.com/ratatui/ratatui/pull/1209) > This makes it easier to write fallible rendering methods that can use > the `?` operator > > ```rust > terminal.try_draw(|frame| { > some_method_that_can_fail()?; > another_faillible_method()?; > Ok(()) > })?; > ``` - [3725262](https://github.com/ratatui/ratatui/commit/3725262ca384d28a46e03013023a19677b5a35fe) _(text)_ Add `Add` and `AddAssign` implementations for `Line`, `Span`, and `Text` by @joshka in [#1236](https://github.com/ratatui/ratatui/pull/1236) > This enables: > > ```rust > let line = Span::raw("Red").red() + Span::raw("blue").blue(); > let line = Line::raw("Red").red() + Span::raw("blue").blue(); > let line = Line::raw("Red").red() + Line::raw("Blue").blue(); > let text = Line::raw("Red").red() + Line::raw("Blue").blue(); > let text = Text::raw("Red").red() + Line::raw("Blue").blue(); > > let mut line = Line::raw("Red").red(); > line += Span::raw("Blue").blue(); > > let mut text = Text::raw("Red").red(); > text += Line::raw("Blue").blue(); > > line.extend(vec![Span::raw("1"), Span::raw("2"), Span::raw("3")]); > ``` - [c34fb77](https://github.com/ratatui/ratatui/commit/c34fb778183b8360ac0a273af16c695c33632b39) _(text)_ Remove unnecessary lifetime from ToText trait by @joshka in [#1234](https://github.com/ratatui/ratatui/pull/1234) [**breaking**] > > BREAKING CHANGE:The ToText trait no longer has a lifetime parameter. > This change simplifies the trait and makes it easier implement. - [c68ee6c](https://github.com/ratatui/ratatui/commit/c68ee6c64a7c48955a7b26db1db57f8427e35e5c) _(uncategorized)_ Add `get/set_cursor_position()` methods to Terminal and Backend by @EdJoPaTo in [#1284](https://github.com/ratatui/ratatui/pull/1284) [**breaking**] > The new methods return/accept `Into` which can be either a Position or a (u16, u16) tuple. > > ```rust > backend.set_cursor_position(Position { x: 0, y: 20 })?; > let position = backend.get_cursor_position()?; > terminal.set_cursor_position((0, 20))?; > let position = terminal.set_cursor_position()?; > ``` - [b70cd03](https://github.com/ratatui/ratatui/commit/b70cd03c029d91acd4709c2b91c735b8d796987c) _(uncategorized)_ Add ListState / TableState scroll_down_by() / scroll_up_by() methods by @josueBarretogit in [#1267](https://github.com/ratatui/ratatui/pull/1267) > Implement new methods `scroll_down_by(u16)` and `scroll_up_by(u16)` for > both `Liststate` and `Tablestate`. > > Closes:#1207 ### Bug Fixes - [864cd9f](https://github.com/ratatui/ratatui/commit/864cd9ffef47c43269fa16e773fc7c6e06d13bf3) _(testbackend)_ Prevent area mismatch by @EdJoPaTo in [#1252](https://github.com/ratatui/ratatui/pull/1252) > Removes the height and width fields from TestBackend, which can get > out of sync with the Buffer, which currently clamps to 255,255. > > This changes the `TestBackend` serde representation. It should be > possible to read older data, but data generated after this change > can't be read by older versions. - [7e1bab0](https://github.com/ratatui/ratatui/commit/7e1bab049bc5acd4a5cb13189e8f86fec5813ab8) _(buffer)_ Dont render control characters by @EdJoPaTo in [#1226](https://github.com/ratatui/ratatui/pull/1226) - [c08b522](https://github.com/ratatui/ratatui/commit/c08b522d34ef3bfae37342ba1bff897cb320971e) _(chart)_ Allow removing all the axis labels by @EdJoPaTo in [#1282](https://github.com/ratatui/ratatui/pull/1282) > `axis.labels(vec![])` removes all the labels correctly. > > This makes calling axis.labels with an empty Vec the equivalent > of not calling axis.labels. It's likely that this is never used, but it > prevents weird cases by removing the mix-up of `Option::None` > and `Vec::is_empty`, and simplifies the implementation code. - [03f3124](https://github.com/ratatui/ratatui/commit/03f3124c1d83294788213fb4195a708f86eecd4f) _(paragraph)_ Line_width, and line_count include block borders by @airblast-dev in [#1235](https://github.com/ratatui/ratatui/pull/1235) > The `line_width`, and `line_count` methods for `Paragraph` would not > take into account the `Block` if one was set. This will now correctly > calculate the values including the `Block`'s width/height. > > Fixes:#1233 - [3ca920e](https://github.com/ratatui/ratatui/commit/3ca920e881f2f78ada27e0ff19a9705bb194e533) _(span)_ Prevent panic on rendering out of y bounds by @EdJoPaTo in [#1257](https://github.com/ratatui/ratatui/pull/1257) - [84cb164](https://github.com/ratatui/ratatui/commit/84cb16483a76f1eb28f31f4a99075edfd78635f4) _(terminal)_ Make terminal module private by @joshka in [#1260](https://github.com/ratatui/ratatui/pull/1260) [**breaking**] > This is a simplification of the public API that is helpful for new users > that are not familiar with how rust re-exports work, and helps avoid > clashes with other modules in the backends that are named terminal. > > BREAKING CHANGE:The `terminal` module is now private and can not be > used directly. The types under this module are exported from the root of > the crate. > > ```diff > - use ratatui::terminal::{CompletedFrame, Frame, Terminal, TerminalOptions, ViewPort}; > + use ratatui::{CompletedFrame, Frame, Terminal, TerminalOptions, ViewPort}; > ``` > > Fixes: - [29c8c84](https://github.com/ratatui/ratatui/commit/29c8c84fd05692e8981fc21ae55102bf29835431) _(uncategorized)_ Ignore newlines in Span's Display impl by @SUPERCILEX in [#1270](https://github.com/ratatui/ratatui/pull/1270) - [cd93547](https://github.com/ratatui/ratatui/commit/cd93547db869aab3dbca49f11667a8091a7077bd) _(uncategorized)_ Remove unnecessary synchronization in layout cache by @SUPERCILEX in [#1245](https://github.com/ratatui/ratatui/pull/1245) > > Layout::init_cache no longer returns bool and takes a NonZeroUsize instead of usize > > The cache is a thread-local, so doesn't make much sense to require > synchronized initialization. - [b344f95](https://github.com/ratatui/ratatui/commit/b344f95b7cfc3b90221c84cfef8afcf6944bafc1) _(uncategorized)_ Only apply style to first line when rendering a `Line` by @joshka in [#1247](https://github.com/ratatui/ratatui/pull/1247) > A `Line` widget should only apply its style to the first line when > rendering and not the entire area. This is because the `Line` widget > should only render a single line of text. This commit fixes the issue by > clamping the area to a single line before rendering the text. - [7ddfbc0](https://github.com/ratatui/ratatui/commit/7ddfbc0010400f39756a66a666702176e508c5ea) _(uncategorized)_ Unnecessary allocations when creating Lines by @SUPERCILEX in [#1237](https://github.com/ratatui/ratatui/pull/1237) - [84f3341](https://github.com/ratatui/ratatui/commit/84f334163be2945ca8f5da9e0b244b6413a4d329) _(uncategorized)_ Clippy lints from rust 1.80.0 by @joshka in [#1238](https://github.com/ratatui/ratatui/pull/1238) ### Refactor - [bb68bc6](https://github.com/ratatui/ratatui/commit/bb68bc6968219dacea8f3c272bb99d142d2f3253) _(backend)_ Return `Size` from `Backend::size` instead of `Rect` by @EdJoPaTo in [#1254](https://github.com/ratatui/ratatui/pull/1254) [**breaking**] > The `Backend::size` method returns a `Size` instead of a `Rect`. > There is no need for the position here as it was always 0,0. - [e81663b](https://github.com/ratatui/ratatui/commit/e81663bec07f46433db7b6eb0154ca48e9389bdb) _(list)_ Split up list.rs into smaller modules by @joshka in [#1204](https://github.com/ratatui/ratatui/pull/1204) - [e707ff1](https://github.com/ratatui/ratatui/commit/e707ff11d15b5ee10ef2cffc934bb132ee8a1ead) _(uncategorized)_ Internally use Position struct by @EdJoPaTo in [#1256](https://github.com/ratatui/ratatui/pull/1256) - [32a0b26](https://github.com/ratatui/ratatui/commit/32a0b265253cb83cbf1d51784abf150fed7ef82f) _(uncategorized)_ Simplify WordWrapper implementation by @tranzystorekk in [#1193](https://github.com/ratatui/ratatui/pull/1193) ### Documentation - [6ce447c](https://github.com/ratatui/ratatui/commit/6ce447c4f344ae7bec11d7f98cdc49ccac800df8) _(block)_ Add docs about style inheritance by @joshka in [#1190](https://github.com/ratatui/ratatui/pull/1190) > > Fixes: - [55e0880](https://github.com/ratatui/ratatui/commit/55e0880d2fef35b328901b4194d39101fe26a9e9) _(block)_ Update block documentation by @leohscl in [#1206](https://github.com/ratatui/ratatui/pull/1206) > Update block documentation with constructor methods and setter methods > in the main doc comment Added an example for using it to surround > widgets > > Fixes: - [f2fa1ae](https://github.com/ratatui/ratatui/commit/f2fa1ae9aa6f456615c519dcb17d7d3b8177bfb8) _(breaking-changes)_ Add missing code block by @orhun in [#1291](https://github.com/ratatui/ratatui/pull/1291) - [f687af7](https://github.com/ratatui/ratatui/commit/f687af7c0d1dfc87302d2cf3b9ef7c7d58edb2d3) _(breaking-changes)_ Mention removed lifetime of ToText trait by @orhun in [#1292](https://github.com/ratatui/ratatui/pull/1292) - [d468463](https://github.com/ratatui/ratatui/commit/d468463fc6aff426131f3ff61dc63291b90b37d1) _(breaking-changes)_ Fix the PR link by @orhun in [#1294](https://github.com/ratatui/ratatui/pull/1294) - [1b9bdd4](https://github.com/ratatui/ratatui/commit/1b9bdd425cb68bbb5f57900175ad88a9b211f607) _(contributing)_ Fix minor issues by @EdJoPaTo in [#1300](https://github.com/ratatui/ratatui/pull/1300) - [5f7a7fb](https://github.com/ratatui/ratatui/commit/5f7a7fbe19ecf36c5060a6ba8835d92029a15777) _(examples)_ Update barcharts gifs by @joshka in [#1306](https://github.com/ratatui/ratatui/pull/1306) - [fe4eeab](https://github.com/ratatui/ratatui/commit/fe4eeab676e8db69a1e4f878173cdda0d96d5f7f) _(examples)_ Simplify the barchart example by @joshka in [#1079](https://github.com/ratatui/ratatui/pull/1079) > The `barchart` example has been split into two examples: `barchart` and > `barchart-grouped`. The `barchart` example now shows a simple barchart > with random data, while the `barchart-grouped` example shows a grouped > barchart with fake revenue data. > > This simplifies the examples a bit so they don't cover too much at once. > > - Simplify the rendering functions > - Fix several clippy lints that were marked as allowed > > --------- - [6e7b4e4](https://github.com/ratatui/ratatui/commit/6e7b4e4d55abcfeb3ffa598086ab227604b26ff7) _(examples)_ Add async example by @joshka in [#1248](https://github.com/ratatui/ratatui/pull/1248) > This example demonstrates how to use Ratatui with widgets that fetch > data asynchronously. It uses the `octocrab` crate to fetch a list of > pull requests from the GitHub API. You will need an environment > variable named `GITHUB_TOKEN` with a valid GitHub personal access > token. The token does not need any special permissions. - [935a718](https://github.com/ratatui/ratatui/commit/935a7187c273e0efc876d094d6247d50e28677a3) _(examples)_ Add missing examples to README by @kibibyt3 in [#1225](https://github.com/ratatui/ratatui/pull/1225) > > Resolves:#1014 - [50e5674](https://github.com/ratatui/ratatui/commit/50e5674a20edad0d95bd103522b21df35b38430b) _(examples)_ Fix: fix typos in tape files by @kibibyt3 in [#1224](https://github.com/ratatui/ratatui/pull/1224) - [810da72](https://github.com/ratatui/ratatui/commit/810da72f26acd8761031d9a822957df9588ac406) _(examples)_ Fix hyperlink example tape by @kibibyt3 in [#1222](https://github.com/ratatui/ratatui/pull/1222) - [5eeb1cc](https://github.com/ratatui/ratatui/commit/5eeb1ccbc4e1e1dff4979647f87e91c515a56fd5) _(github)_ Create CODE_OF_CONDUCT.md by @joshka in [#1279](https://github.com/ratatui/ratatui/pull/1279) - [7c0665c](https://github.com/ratatui/ratatui/commit/7c0665cb0e34eff3ca427d2ada81f043f20cea00) _(layout)_ Fix typo in example by @EmiOnGit in [#1217](https://github.com/ratatui/ratatui/pull/1217) - [272d059](https://github.com/ratatui/ratatui/commit/272d0591a7efc09897a2566969fbafcb2423fdbc) _(paragraph)_ Update main docs by @joshka in [#1202](https://github.com/ratatui/ratatui/pull/1202) - [bb71e5f](https://github.com/ratatui/ratatui/commit/bb71e5ffd484fa3296d014d72d8a0521f56c7876) _(readme)_ Remove MSRV by @EdJoPaTo in [#1266](https://github.com/ratatui/ratatui/pull/1266) > This notice was useful when the `Cargo.toml` had no standardized field > for this. Now it's easier to look it up in the `Cargo.toml` and it's > also a single point of truth. Updating the README was overlooked for > quite some time so it's better to just omit it rather than having > something wrong that will be forgotten again in the future. - [8857037](https://github.com/ratatui/ratatui/commit/8857037bfff52104affa3c764dea0f3370cc702c) _(terminal)_ Fix imports by @EdJoPaTo in [#1263](https://github.com/ratatui/ratatui/pull/1263) - [2fd5ae6](https://github.com/ratatui/ratatui/commit/2fd5ae64bf1440fccf072c1b6aa3dc03dc9ac1ec) _(widgets)_ Document stability of WidgetRef by @joshka in [#1288](https://github.com/ratatui/ratatui/pull/1288) > Addresses some confusion about when to implement `WidgetRef` vs `impl > Widget for &W`. Notes the stability rationale and links to an issue that > helps explain the context of where we're at in working this out. - [716c931](https://github.com/ratatui/ratatui/commit/716c93136e0c0f11e62364fdc9b32ec58036851e) _(uncategorized)_ Document crossterm breaking change by @joshka in [#1281](https://github.com/ratatui/ratatui/pull/1281) - [f775030](https://github.com/ratatui/ratatui/commit/f77503050ffbe4dd2d4949cb22b451a2b0fe9296) _(uncategorized)_ Update main lib.rs / README examples by @joshka in [#1280](https://github.com/ratatui/ratatui/pull/1280) - [8433d09](https://github.com/ratatui/ratatui/commit/8433d0958bd0a384383bdefe28e6146de1332e17) _(uncategorized)_ Update demo image by @joshka in [#1276](https://github.com/ratatui/ratatui/pull/1276) > Follow up to ### Performance - [663486f](https://github.com/ratatui/ratatui/commit/663486f1e8deae6287d4d0051dfab0682b700423) _(list)_ Avoid extra allocations when rendering `List` by @airblast-dev in [#1244](https://github.com/ratatui/ratatui/pull/1244) > When rendering a `List`, each `ListItem` would be cloned. Removing the > clone, and replacing `Widget::render` with `WidgetRef::render_ref` saves > us allocations caused by the clone of the `Text<'_>` stored inside of > `ListItem`. > > Based on the results of running the "list" benchmark locally; > Performance is improved by %1-3 for all `render` benchmarks for `List`. - [4753b72](https://github.com/ratatui/ratatui/commit/4753b7241bf3f33b9d953d301f83baa547e7037c) _(reflow)_ Eliminate most WordWrapper allocations by @SUPERCILEX in [#1239](https://github.com/ratatui/ratatui/pull/1239) > On large paragraphs (~1MB), this saves hundreds of thousands of > allocations. > > TL;DR:reuse as much memory as possible across `next_line` calls. > Instead of allocating new buffers each time, allocate the buffers once > and clear them before reuse. - [be3eb75](https://github.com/ratatui/ratatui/commit/be3eb75ea58127caad6696a21d794f5f99e0dfd6) _(table)_ Avoid extra allocations when rendering `Table` by @airblast-dev in [#1242](https://github.com/ratatui/ratatui/pull/1242) > When rendering a `Table` the `Text` stored inside of a `Cell` gets > cloned before rendering. This removes the clone and uses `WidgetRef` > instead, saving us from allocating a `Vec>` inside `Text`. Also > avoids an allocation when rendering the highlight symbol if it contains > an owned value. - [f04bf85](https://github.com/ratatui/ratatui/commit/f04bf855cbc28e0ae29eaf678f26425a05f2295e) _(uncategorized)_ Add buffer benchmarks by @joshka in [#1303](https://github.com/ratatui/ratatui/pull/1303) - [e6d2e04](https://github.com/ratatui/ratatui/commit/e6d2e04bcf2340c901ba1513ddaf84d358751768) _(uncategorized)_ Move benchmarks into a single benchmark harness by @joshka in [#1302](https://github.com/ratatui/ratatui/pull/1302) > Consolidates the benchmarks into a single executable rather than having > to create a new cargo.toml setting per and makes it easier to rearrange > these when adding new benchmarks. ### Styling - [a80a8a6](https://github.com/ratatui/ratatui/commit/a80a8a6a473274aa44a4543d945760123f9d5407) _(format)_ Lint markdown by @joshka in [#1131](https://github.com/ratatui/ratatui/pull/1131) > - **chore: Fix line endings for changelog** > - **chore: cleanup markdown lints** > - **ci: add Markdown linter** > - **build: add markdown lint to the makefile** > > --------- ### Testing - [32d0695](https://github.com/ratatui/ratatui/commit/32d0695cc2d56900d8a6246d9d876393294dd94e) _(buffer)_ Ensure emojis are rendered by @EdJoPaTo in [#1258](https://github.com/ratatui/ratatui/pull/1258) ### Miscellaneous Tasks - [82b70fd](https://github.com/ratatui/ratatui/commit/82b70fd329885f8ab3cb972b6fe117bc27e3d96a) _(ci)_ Integrate cargo-semver-checks by @orhun in [#1166](https://github.com/ratatui/ratatui/pull/1166) > > > [`cargo-semver-checks`](https://github.com/obi1kenobi/cargo-semver-checks): > Lint your crate API changes for semver violations. - [c245c13](https://github.com/ratatui/ratatui/commit/c245c13cc14ac8c483c4aeb6e2e3b4f8e387b791) _(ci)_ Onboard bencher for tracking benchmarks by @orhun in [#1174](https://github.com/ratatui/ratatui/pull/1174) > > > > Closes:#1092 - [efef0d0](https://github.com/ratatui/ratatui/commit/efef0d0dc0872ed2b0c5d865ef008698f3051d10) _(ci)_ Change label from `breaking change` to `Type: Breaking Change` by @kdheepak in [#1243](https://github.com/ratatui/ratatui/pull/1243) > This PR changes the label that is auto attached to a PR with a breaking > change per the conventional commits specification. - [41a9100](https://github.com/ratatui/ratatui/commit/41a910004dfe69de135845fac900dd4240a865c7) _(github)_ Use the GitHub organization team as codeowners by @EdJoPaTo in [#1081](https://github.com/ratatui/ratatui/pull/1081) > Use GitHub organization team in CODEOWNERS and create MAINTAINERS.md - [3e7458f](https://github.com/ratatui/ratatui/commit/3e7458fdb8051b9a62aac551372d5592e7f59eb7) _(github)_ Add forums and faqs to the issue template by @joshka in [#1201](https://github.com/ratatui/ratatui/pull/1201) - [45fcab7](https://github.com/ratatui/ratatui/commit/45fcab7497650685781434e27abf3ddf0459aead) _(uncategorized)_ Add rect::rows benchmark by @joshka in [#1301](https://github.com/ratatui/ratatui/pull/1301) - [edc2af9](https://github.com/ratatui/ratatui/commit/edc2af98223229656480dd30e03f1230b0aba919) _(uncategorized)_ Replace big_text with hardcoded logo by @joshka in [#1203](https://github.com/ratatui/ratatui/pull/1203) > big_text.rs was a copy of the code from tui-big-text and was getting > gradually out of sync with the original crate. It was also rendering > something a bit different than the Ratatui logo. This commit replaces > the big_text.rs file with a much smaller string representation of the > Ratatui logo. > > ![demo2](https://raw.githubusercontent.com/ratatui/ratatui/images/examples/demo2-destroy.gif) - [c2d3850](https://github.com/ratatui/ratatui/commit/c2d38509b4d6a5d80f721c08d4e8727a37475aa6) _(uncategorized)_ Use LF line endings for CHANGELOG.md instead of CRLF by @joshka in [#1269](https://github.com/ratatui/ratatui/pull/1269) - [a9fe428](https://github.com/ratatui/ratatui/commit/a9fe4284acfa6ca01260c11b0f64f8f610272d20) _(uncategorized)_ Update cargo-deny config by @EdJoPaTo in [#1265](https://github.com/ratatui/ratatui/pull/1265) > Update `cargo-deny` config (noticed in > ) > > See - [ffc4300](https://github.com/ratatui/ratatui/commit/ffc43005589c9baf90db839f5388d3783d59e963) _(uncategorized)_ Remove executable flag for rs files by @EdJoPaTo in [#1262](https://github.com/ratatui/ratatui/pull/1262) - [7bab9f0](https://github.com/ratatui/ratatui/commit/7bab9f0d802e154f3551f895399398a4d43d489f) _(uncategorized)_ Add more CompactString::const_new instead of new by @joshka in [#1230](https://github.com/ratatui/ratatui/pull/1230) - [ccf83e6](https://github.com/ratatui/ratatui/commit/ccf83e6d7610bf74f4ab02e0b1e2fe0e55ad9e78) _(uncategorized)_ Update labels in issue templates by @joshka in [#1212](https://github.com/ratatui/ratatui/pull/1212) ### Build - [379dab9](https://github.com/ratatui/ratatui/commit/379dab9cdb8f1836836dc3ad6bf411088d610f37) _(uncategorized)_ Cleanup dev dependencies by @EdJoPaTo in [#1231](https://github.com/ratatui/ratatui/pull/1231) ### Continuous Integration - [476ac87](https://github.com/ratatui/ratatui/commit/476ac87c9937de8863d2e884efdac19c8c1e43d2) _(uncategorized)_ Split up lint job by @EdJoPaTo in [#1264](https://github.com/ratatui/ratatui/pull/1264) > This helps with identifying what failed right from the title. Also steps > after a failing one are now always executed. > > Also shortens the steps a bit by removing obvious names. ### New Contributors - @SUPERCILEX made their first contribution in [#1239](https://github.com/ratatui/ratatui/pull/1239) - @josueBarretogit made their first contribution in [#1267](https://github.com/ratatui/ratatui/pull/1267) - @airblast-dev made their first contribution in [#1242](https://github.com/ratatui/ratatui/pull/1242) - @kibibyt3 made their first contribution in [#1225](https://github.com/ratatui/ratatui/pull/1225) - @EmiOnGit made their first contribution in [#1217](https://github.com/ratatui/ratatui/pull/1217) - @leohscl made their first contribution in [#1206](https://github.com/ratatui/ratatui/pull/1206) - @robertpsoane made their first contribution in [#1198](https://github.com/ratatui/ratatui/pull/1198) **Full Changelog**: ## [0.27.0](https://github.com/ratatui/ratatui/releases/tag/v0.27.0) - 2024-06-24 In this version, we have focused on enhancing usability and functionality with new features like background styles for LineGauge, palette colors, and various other improvements including improved performance. Also, we added brand new examples for tracing and creating hyperlinks! ✨ **Release highlights**: ⚠️ List of breaking changes can be found [here](https://github.com/ratatui/ratatui/blob/main/BREAKING-CHANGES.md). ### Features - [eef1afe](https://github.com/ratatui/ratatui/commit/eef1afe9155089dca489a9159c368a5ac07e7585) _(linegauge)_ Allow LineGauge background styles by @nowNick in [#565](https://github.com/ratatui/ratatui/pull/565) ```text This PR deprecates `gauge_style` in favor of `filled_style` and `unfilled_style` which can have its foreground and background styled. `cargo run --example=line_gauge --features=crossterm` ``` Implements: - [1365620](https://github.com/ratatui/ratatui/commit/13656206064b53c7f86f179b570c7769399212a3) _(borders)_ Add FULL and EMPTY border sets by @joshka in [#1182](https://github.com/ratatui/ratatui/pull/1182) `border::FULL` uses a full block symbol, while `border::EMPTY` uses an empty space. This is useful for when you need to allocate space for the border and apply the border style to a block without actually drawing a border. This makes it possible to style the entire title area or a block rather than just the title content. ```rust use ratatui::{symbols::border, widgets::Block}; let block = Block::bordered().title("Title").border_set(border::FULL); let block = Block::bordered().title("Title").border_set(border::EMPTY); ``` - [7a48c5b](https://github.com/ratatui/ratatui/commit/7a48c5b11b3d51b915ccc187d0499b6e0e88b89d) _(cell)_ Add EMPTY and (const) new method by @EdJoPaTo in [#1143](https://github.com/ratatui/ratatui/pull/1143) ```text This simplifies calls to `Buffer::filled` in tests. ``` - [3f2f2cd](https://github.com/ratatui/ratatui/commit/3f2f2cd6abf67a04809ff314025a462a3c2e2446) _(docs)_ Add tracing example by @joshka in [#1192](https://github.com/ratatui/ratatui/pull/1192) ```text Add an example that demonstrates logging to a file for: ``` ```shell cargo run --example tracing RUST_LOG=trace cargo run --example=tracing cat tracing.log ``` ![Made with VHS](https://vhs.charm.sh/vhs-21jgJCedh2YnFDONw0JW7l.gif) - [1520ed9](https://github.com/ratatui/ratatui/commit/1520ed9d106f99580a9e529212e43dac06a2f6d2) _(layout)_ Impl Display for Position and Size by @joshka in [#1162](https://github.com/ratatui/ratatui/pull/1162) - [46977d8](https://github.com/ratatui/ratatui/commit/46977d88519d28ccac1c94e171af0c9cca071dbc) _(list)_ Add list navigation methods (first, last, previous, next) by @joshka in [#1159](https://github.com/ratatui/ratatui/pull/1159) [**breaking**] ```text Also cleans up the list example significantly (see also ) ``` Fixes: BREAKING CHANGE:The `List` widget now clamps the selected index to the bounds of the list when navigating with `first`, `last`, `previous`, and `next`, as well as when setting the index directly with `select`. - [10d7788](https://github.com/ratatui/ratatui/commit/10d778866edea55207ff3f03d063c9fec619b9c9) _(style)_ Add conversions from the palette crate colors by @joshka in [#1172](https://github.com/ratatui/ratatui/pull/1172) ````text This is behind the "palette" feature flag. ```rust use palette::{LinSrgb, Srgb}; use ratatui::style::Color; let color = Color::from(Srgb::new(1.0f32, 0.0, 0.0)); let color = Color::from(LinSrgb::new(1.0f32, 0.0, 0.0)); ``` ```` - [7ef2dae](https://github.com/ratatui/ratatui/commit/7ef2daee060a7fe964a8de64eafcb6062228e035) _(text)_ support conversion from Display to Span, Line and Text by @orhun in [#1167](https://github.com/ratatui/ratatui/pull/1167) ````text Now you can create `Line` and `Text` from numbers like so: ```rust let line = 42.to_line(); let text = 666.to_text(); ``` ```` - [74a32af](https://github.com/ratatui/ratatui/commit/74a32afbaef8851f9462b27094d88d518e56addf) _(uncategorized)_ Re-export backends from the ratatui crate by @joshka in [#1151](https://github.com/ratatui/ratatui/pull/1151) ```text `crossterm`, `termion`, and `termwiz` can now be accessed as `ratatui::{crossterm, termion, termwiz}` respectively. This makes it possible to just add the Ratatui crate as a dependency and use the backend of choice without having to add the backend crates as dependencies. To update existing code, replace all instances of `crossterm::` with `ratatui::crossterm::`, `termion::` with `ratatui::termion::`, and `termwiz::` with `ratatui::termwiz::`. ``` - [3594180](https://github.com/ratatui/ratatui/commit/35941809e11ab43309dd83a8f67bb375f5e7ff2b) _(uncategorized)_ Make Stylize's `.bg(color)` generic by @kdheepak in [#1103](https://github.com/ratatui/ratatui/pull/1103) [**breaking**] - [0b5fd6b](https://github.com/ratatui/ratatui/commit/0b5fd6bf8eb64662df96900faea3608d4cbb3984) _(uncategorized)_ Add writer() and writer_mut() to termion and crossterm backends by @enricozb in [#991](https://github.com/ratatui/ratatui/pull/991) ```text It is sometimes useful to obtain access to the writer if we want to see what has been written so far. For example, when using &mut [u8] as a writer. ``` ### Bug Fixes - [efa965e](https://github.com/ratatui/ratatui/commit/efa965e1e806c60cb1bdb2d1715f960db0857704) _(line)_ Remove newlines when converting strings to Lines by @joshka in [#1191](https://github.com/ratatui/ratatui/pull/1191) `Line::from("a\nb")` now returns a line with two `Span`s instead of 1 Fixes: - [d370aa7](https://github.com/ratatui/ratatui/commit/d370aa75af99da3e0c41ceb28e2d02ee81cd2538) _(span)_ Ensure that zero-width characters are rendered correctly by @joshka in [#1165](https://github.com/ratatui/ratatui/pull/1165) - [127d706](https://github.com/ratatui/ratatui/commit/127d706ee4876a58230f42f4a730b18671eae167) _(table)_ Ensure render offset without selection properly by @joshka in [#1187](https://github.com/ratatui/ratatui/pull/1187) Fixes: - [4bfdc15](https://github.com/ratatui/ratatui/commit/4bfdc15b80ba14489d359ab1f88564c3bd016c19) _(uncategorized)_ Render of &str and String doesn't respect area.width by @thscharler in [#1177](https://github.com/ratatui/ratatui/pull/1177) - [e6871b9](https://github.com/ratatui/ratatui/commit/e6871b9e21c25acf1e203f4860198c37aa9429a1) _(uncategorized)_ Avoid unicode-width breaking change in tests by @joshka in [#1171](https://github.com/ratatui/ratatui/pull/1171) ```text unicode-width 0.1.13 changed the width of \u{1} from 0 to 1. Our tests assumed that \u{1} had a width of 0, so this change replaces the \u{1} character with \u{200B} (zero width space) in the tests. Upstream issue (closed as won't fix): https://github.com/unicode-rs/unicode-width/issues/55 ``` - [7f3efb0](https://github.com/ratatui/ratatui/commit/7f3efb02e6f846fc72079f0921abd2cee09d2d83) _(uncategorized)_ Pin unicode-width crate to 0.1.13 by @joshka in [#1170](https://github.com/ratatui/ratatui/pull/1170) ```text semver breaking change in 0.1.13 ``` - [42cda6d](https://github.com/ratatui/ratatui/commit/42cda6d28706bf83308787ca784f374f6c286a02) _(uncategorized)_ Prevent panic from string_slice by @EdJoPaTo in [#1140](https://github.com/ratatui/ratatui/pull/1140) ### Refactor - [73fd367](https://github.com/ratatui/ratatui/commit/73fd367a740924ce80ef7a0cd13a66b5094f7a54) _(block)_ Group builder pattern methods by @EdJoPaTo in [#1134](https://github.com/ratatui/ratatui/pull/1134) - [257db62](https://github.com/ratatui/ratatui/commit/257db6257f392a07ee238b439344d91566beb740) _(cell)_ Must_use and simplify style() by @EdJoPaTo in [#1124](https://github.com/ratatui/ratatui/pull/1124) ```text ``` - [bf20369](https://github.com/ratatui/ratatui/commit/bf2036987f04d83f4f2b8338fab1b4fd7f4cc81d) _(cell)_ Reset instead of applying default by @EdJoPaTo in [#1127](https://github.com/ratatui/ratatui/pull/1127) ```text Using reset is clearer to me what actually happens. On the other case a struct is created to override the old one completely which basically does the same in a less clear way. ``` - [7d175f8](https://github.com/ratatui/ratatui/commit/7d175f85c1905c08adf547dd37cc89c63039f480) _(lint)_ Fix new lint warnings by @EdJoPaTo in [#1178](https://github.com/ratatui/ratatui/pull/1178) - [cf67ed9](https://github.com/ratatui/ratatui/commit/cf67ed9b884347cef034b09e0e9f9d4aff74ab0a) _(lint)_ Use clippy::or_fun_call by @EdJoPaTo in [#1138](https://github.com/ratatui/ratatui/pull/1138) - [4770e71](https://github.com/ratatui/ratatui/commit/4770e715819475cdca2f2ccdbac00cba203cd6d2) _(list)_ Remove deprecated `start_corner` and `Corner` by @Valentin271 in [#759](https://github.com/ratatui/ratatui/pull/759) [**breaking**] `List::start_corner` was deprecated in v0.25. Use `List::direction` and `ListDirection` instead. ```diff - list.start_corner(Corner::TopLeft); - list.start_corner(Corner::TopRight); // This is not an error, BottomRight rendered top to bottom previously - list.start_corner(Corner::BottomRight); // all becomes + list.direction(ListDirection::TopToBottom); ``` ```diff - list.start_corner(Corner::BottomLeft); // becomes + list.direction(ListDirection::BottomToTop); ``` `layout::Corner` is removed entirely. - [4f77910](https://github.com/ratatui/ratatui/commit/4f7791079edd16b54dc8cdfc95bb72b282a09576) _(padding)_ Add Padding::ZERO as a constant by @EdJoPaTo in [#1133](https://github.com/ratatui/ratatui/pull/1133) ```text Deprecate Padding::zero() ``` - [8061813](https://github.com/ratatui/ratatui/commit/8061813f324c08e11196e62fca22c2f6b9216b7e) _(uncategorized)_ Expand glob imports by @joshka in [#1152](https://github.com/ratatui/ratatui/pull/1152) ```text Consensus is that explicit imports make it easier to understand the example code. This commit removes the prelude import from all examples and replaces it with the necessary imports, and expands other glob imports (widget::*, Constraint::*, KeyCode::*, etc.) everywhere else. Prelude glob imports not in examples are not covered by this PR. See https://github.com/ratatui/ratatui/issues/1150 for more details. ``` - [d929971](https://github.com/ratatui/ratatui/commit/d92997105bde15a1fd43829466ec8cc46bffe121) _(uncategorized)_ Dont manually impl Default for defaults by @EdJoPaTo in [#1142](https://github.com/ratatui/ratatui/pull/1142) ```text Replace `impl Default` by `#[derive(Default)]` when its implementation equals. ``` - [8a60a56](https://github.com/ratatui/ratatui/commit/8a60a561c95691912cbf41d55866abafcba0127d) _(uncategorized)_ Needless_pass_by_ref_mut by @EdJoPaTo in [#1137](https://github.com/ratatui/ratatui/pull/1137) - [1de9a82](https://github.com/ratatui/ratatui/commit/1de9a82b7a871a83995d224785cae139c6f4787b) _(uncategorized)_ Simplify if let by @EdJoPaTo in [#1135](https://github.com/ratatui/ratatui/pull/1135) ```text While looking through lints [`clippy::option_if_let_else`](https://rust-lang.github.io/rust-clippy/master/index.html#option_if_let_else) found these. Other findings are more complex so I skipped them. ``` ### Documentation - [1908b06](https://github.com/ratatui/ratatui/commit/1908b06b4a497ff1cfb2c8d8c165d2a241ee1864) _(borders)_ Add missing closing code blocks by @orhun in [#1195](https://github.com/ratatui/ratatui/pull/1195) - [38bb196](https://github.com/ratatui/ratatui/commit/38bb19640449c7a3eee3a2fba6450071395e5e06) _(breaking-changes)_ Mention `LineGauge::gauge_style` by @orhun in [#1194](https://github.com/ratatui/ratatui/pull/1194) see #565 - [07efde5](https://github.com/ratatui/ratatui/commit/07efde5233752e1bcb7ae94a91b9e36b7fadb01b) _(examples)_ Add hyperlink example by @joshka in [#1063](https://github.com/ratatui/ratatui/pull/1063) - [7fdccaf](https://github.com/ratatui/ratatui/commit/7fdccafd52f4ddad1a3c9dda59fada59af21ecfa) _(examples)_ Add vhs tapes for constraint-explorer and minimal examples by @joshka in [#1164](https://github.com/ratatui/ratatui/pull/1164) - [4f307e6](https://github.com/ratatui/ratatui/commit/4f307e69db058891675d0f12d75ef49006c511d6) _(examples)_ Simplify paragraph example by @joshka in [#1169](https://github.com/ratatui/ratatui/pull/1169) Related: - [f429f68](https://github.com/ratatui/ratatui/commit/f429f688da536a52266144e63a1a7897ec6b7f26) _(examples)_ Remove lifetimes from the List example by @matta in [#1132](https://github.com/ratatui/ratatui/pull/1132) ```text Simplify the List example by removing lifetimes not strictly necessary to demonstrate how Ratatui lists work. Instead, the sample strings are copied into each `TodoItem`. To further simplify, I changed the code to use a new TodoItem::new function, rather than an implementation of the `From` trait. ``` - [308c1df](https://github.com/ratatui/ratatui/commit/308c1df6495ee4373f808007a1566ca7e9279933) _(readme)_ Add links to forum by @joshka in [#1188](https://github.com/ratatui/ratatui/pull/1188) - [2f8a936](https://github.com/ratatui/ratatui/commit/2f8a9363fc6c54fe2b10792c9f57fbb40b06bc0f) _(uncategorized)_ Fix links on docs.rs by @EdJoPaTo in [#1144](https://github.com/ratatui/ratatui/pull/1144) ```text This also results in a more readable Cargo.toml as the locations of the things are more obvious now. Includes rewording of the underline-color feature. Logs of the errors: https://docs.rs/crate/ratatui/0.26.3/builds/1224962 Also see #989 ``` ### Performance - [4ce67fc](https://github.com/ratatui/ratatui/commit/4ce67fc84e3bc472e9ae97aece85f8ffae091834) _(buffer)_ Filled moves the cell to be filled by @EdJoPaTo in [#1148](https://github.com/ratatui/ratatui/pull/1148) [**breaking**] - [8b447ec](https://github.com/ratatui/ratatui/commit/8b447ec4d6276c3110285e663417487ff18dafc1) _(rect)_ `Rect::inner` takes `Margin` directly instead of reference by @EdJoPaTo in [#1008](https://github.com/ratatui/ratatui/pull/1008) [**breaking**] BREAKING CHANGE:Margin needs to be passed without reference now. ```diff -let area = area.inner(&Margin { +let area = area.inner(Margin { vertical: 0, horizontal: 2, }); ``` ### Styling - [df4b706](https://github.com/ratatui/ratatui/commit/df4b706674de806bdf2a1fb8c04d0654b6b0b891) _(uncategorized)_ Enable more rustfmt settings by @EdJoPaTo in [#1125](https://github.com/ratatui/ratatui/pull/1125) ### Testing - [d6587bc](https://github.com/ratatui/ratatui/commit/d6587bc6b0db955aeac6af167e1b8ef81a3afcc9) _(style)_ Use rstest by @EdJoPaTo in [#1136](https://github.com/ratatui/ratatui/pull/1136) ```text ``` ### Miscellaneous Tasks - [7b45f74](https://github.com/ratatui/ratatui/commit/7b45f74b719ff18329ddbf9f05a9ac53bf06f71d) _(prelude)_ Add / remove items by @joshka in [#1149](https://github.com/ratatui/ratatui/pull/1149) [**breaking**] ```text his PR removes the items from the prelude that don't form a coherent common vocabulary and adds the missing items that do. Based on a comment at ``` BREAKING CHANGE:The following items have been removed from the prelude: - `style::Styled` - this trait is useful for widgets that want to support the Stylize trait, but it adds complexity as widgets have two `style` methods and a `set_style` method. - `symbols::Marker` - this item is used by code that needs to draw to the `Canvas` widget, but it's not a common item that would be used by most users of the library. - `terminal::{CompletedFrame, TerminalOptions, Viewport}` - these items are rarely used by code that needs to interact with the terminal, and they're generally only ever used once in any app. The following items have been added to the prelude: - `layout::{Position, Size}` - these items are used by code that needs to interact with the layout system. These are newer items that were added in the last few releases, which should be used more liberally. - [cd64367](https://github.com/ratatui/ratatui/commit/cd64367e244a1588206f653fd79678ce62a86a2f) _(symbols)_ Add tests for line symbols by @joshka in [#1186](https://github.com/ratatui/ratatui/pull/1186) - [8cfc316](https://github.com/ratatui/ratatui/commit/8cfc316bccb48e88660d14cd18c0df2264c4d6ce) _(uncategorized)_ Alphabetize examples in Cargo.toml by @joshka in [#1145](https://github.com/ratatui/ratatui/pull/1145) ### Build - [70df102](https://github.com/ratatui/ratatui/commit/70df102de0154cdfbd6508659cf6ed649f820bc8) _(bench)_ Improve benchmark consistency by @EdJoPaTo in [#1126](https://github.com/ratatui/ratatui/pull/1126) ```text Codegen units are optimized on their own. Per default bench / release have 16 codegen units. What ends up in a codeget unit is rather random and can influence a benchmark result as a code change can move stuff into a different codegen unit → prevent / allow LLVM optimizations unrelated to the actual change. More details: https://doc.rust-lang.org/cargo/reference/profiles.html ``` ### New Contributors - @thscharler made their first contribution in [#1177](https://github.com/ratatui/ratatui/pull/1177) - @matta made their first contribution in [#1132](https://github.com/ratatui/ratatui/pull/1132) - @nowNick made their first contribution in [#565](https://github.com/ratatui/ratatui/pull/565) - @enricozb made their first contribution in [#991](https://github.com/ratatui/ratatui/pull/991) **Full Changelog**: ## [0.26.3](https://github.com/ratatui/ratatui/releases/tag/v0.26.3) - 2024-05-19 We are happy to announce a brand new [**Ratatui Forum**](https://forum.ratatui.rs) 🐭 for Rust & TUI enthusiasts. This is a patch release that fixes the unicode truncation bug, adds performance and quality of life improvements. ✨ **Release highlights**: ### Features - [97ee102](https://github.com/ratatui/ratatui/commit/97ee102f179eed4f309d575495f0e4c8359b4f04) _(buffer)_ Track_caller for index_of by @EdJoPaTo in [#1046](https://github.com/ratatui/ratatui/pull/1046) ** ````text The caller put in the wrong x/y -> the caller is the cause. ```` - [bf09234](https://github.com/ratatui/ratatui/commit/bf0923473c5cb7f2cff24b010f0072b5ce2f8cf2) _(table)_ Make TableState::new const by @EdJoPaTo in [#1040](https://github.com/ratatui/ratatui/pull/1040) - [eb281df](https://github.com/ratatui/ratatui/commit/eb281df97482c2aab66875dc27a49a316a4d7fd7) _(uncategorized)_ Use inner Display implementation by @EdJoPaTo in [#1097](https://github.com/ratatui/ratatui/pull/1097) - [ec763af](https://github.com/ratatui/ratatui/commit/ec763af8512df731799c8f30c38c37252068a4c4) _(uncategorized)_ Make Stylize's `.bg(color)` generic by @kdheepak in [#1099](https://github.com/ratatui/ratatui/pull/1099) ````text This PR makes `.bg(color)` generic accepting anything that can be converted into `Color`; similar to the `.fg(color)` method on the same trait ```` - [4d1784f](https://github.com/ratatui/ratatui/commit/4d1784f2de104b88e998216addaae96ab018f44f) _(uncategorized)_ Re-export ParseColorError as style::ParseColorError by @joshka in [#1086](https://github.com/ratatui/ratatui/pull/1086) Fixes: ### Bug Fixes - [366cbae](https://github.com/ratatui/ratatui/commit/366cbae09fb2bf5b5d7f489de1ff15f930569f05) _(buffer)_ Fix Debug panic and fix formatting of overridden parts by @EdJoPaTo in [#1098](https://github.com/ratatui/ratatui/pull/1098) ````text Fix panic in `Debug for Buffer` when `width == 0`. Also corrects the output when symbols are overridden. ```` - [4392759](https://github.com/ratatui/ratatui/commit/43927595012254b33a3901e0d2e5d28164ad04f0) _(examples)_ Changed user_input example to work with multi-byte unicode chars by @OkieOth in [#1069](https://github.com/ratatui/ratatui/pull/1069) ````text This is the proposed solution for issue #1068. It solves the bug in the user_input example with multi-byte UTF-8 characters as input. ```` Fixes:#1068 --------- - [20fc0dd](https://github.com/ratatui/ratatui/commit/20fc0ddfca97a863c9ec7537bcf283d3d49baab4) _(examples)_ Fix key handling in constraints by @psobolik in [#1066](https://github.com/ratatui/ratatui/pull/1066) ````text Add check for `KeyEventKind::Press` to constraints example's event handler to eliminate double keys on Windows. ```` Fixes:#1062 --------- - [f4637d4](https://github.com/ratatui/ratatui/commit/f4637d40c35e068fd60d17c9a42b9114667c9861) _(reflow)_ Allow wrapping at zero width whitespace by @kxxt in [#1074](https://github.com/ratatui/ratatui/pull/1074) - [699c2d7](https://github.com/ratatui/ratatui/commit/699c2d7c8d0e8c2023cf75350b66535a7b48a102) _(uncategorized)_ Unicode truncation bug by @joshka in [#1089](https://github.com/ratatui/ratatui/pull/1089) ````text - Rewrote the line / span rendering code to take into account how multi-byte / wide emoji characters are truncated when rendering into areas that cannot accommodate them in the available space - Added comprehensive coverage over the edge cases - Adds a benchmark to ensure perf ```` Fixes: - [b30411d](https://github.com/ratatui/ratatui/commit/b30411d1c71cb7b43b7232226514caa54a56c25f) _(uncategorized)_ Termwiz underline color test by @joshka in [#1094](https://github.com/ratatui/ratatui/pull/1094) ````text Fixes code that doesn't compile in the termwiz tests when underline-color feature is enabled. ```` - [5f1e119](https://github.com/ratatui/ratatui/commit/5f1e119563043e97e5c2c5e7dd48ccd75e17791e) _(uncategorized)_ Correct feature flag typo for termwiz by @joshka in [#1088](https://github.com/ratatui/ratatui/pull/1088) ````text underline-color was incorrectly spelt as underline_color ```` - [0a16496](https://github.com/ratatui/ratatui/commit/0a164965ea2b163433871717cee4fd774a23ee5a) _(uncategorized)_ Use `to_string` to serialize Color by @SleepySwords in [#934](https://github.com/ratatui/ratatui/pull/934) ````text Since deserialize now uses `FromStr` to deserialize color, serializing `Color` RGB values, as well as index values, would produce an output that would no longer be able to be deserialized without causing an error. ```` Color::Rgb will now be serialized as the hex representation of their value. For example, with serde_json, `Color::Rgb(255, 0, 255)` would be serialized as `"#FF00FF"` rather than `{"Rgb": [255, 0, 255]}`. Color::Indexed will now be serialized as just the string of the index. For example, with serde_json, `Color::Indexed(10)` would be serialized as `"10"` rather than `{"Indexed": 10}`. Other color variants remain the same. ### Refactor - [2cfe82a](https://github.com/ratatui/ratatui/commit/2cfe82a47eb34baa25f474db7be364de7b95374a) _(buffer)_ Deprecate assert_buffer_eq! in favor of assert_eq! by @EdJoPaTo in [#1007](https://github.com/ratatui/ratatui/pull/1007) ````text - Simplify `assert_buffer_eq!` logic. - Deprecate `assert_buffer_eq!`. - Introduce `TestBackend::assert_buffer_lines`. Also simplify many tests involving buffer comparisons. For the deprecation, just use `assert_eq` instead of `assert_buffer_eq`: ```diff -assert_buffer_eq!(actual, expected); +assert_eq!(actual, expected); ``` --- I noticed `assert_buffer_eq!` creating no test coverage reports and looked into this macro. First I simplified it. Then I noticed a bunch of `assert_eq!(buffer, …)` and other indirect usages of this macro (like `TestBackend::assert_buffer`). The good thing here is that it's mainly used in tests so not many changes to the library code. ```` - [baedc39](https://github.com/ratatui/ratatui/commit/baedc39494ea70292b1d247934420a20d0544b7e) _(buffer)_ Simplify set_stringn logic by @EdJoPaTo in [#1083](https://github.com/ratatui/ratatui/pull/1083) - [9bd89c2](https://github.com/ratatui/ratatui/commit/9bd89c218afb1f3999dce1bfe6edea5b7442966d) _(clippy)_ Enable breaking lint checks by @EdJoPaTo in [#988](https://github.com/ratatui/ratatui/pull/988) ````text We need to make sure to not change existing methods without a notice. But at the same time this also finds public additions with mistakes before they are even released which is what I would like to have. This renames a method and deprecated the old name hinting to a new name. Should this be mentioned somewhere, so it's added to the release notes? It's not breaking because the old method is still there. ```` - [bef5bcf](https://github.com/ratatui/ratatui/commit/bef5bcf750375a78b11ae06f217091b2463e842f) _(example)_ Remove pointless new method by @EdJoPaTo in [#1038](https://github.com/ratatui/ratatui/pull/1038) ````text Use `App::default()` directly. ```` - [f3172c5](https://github.com/ratatui/ratatui/commit/f3172c59d4dae6ce4909251976a39c21d88f1907) _(gauge)_ Fix internal typo by @EdJoPaTo in [#1048](https://github.com/ratatui/ratatui/pull/1048) ### Documentation - [da1ade7](https://github.com/ratatui/ratatui/commit/da1ade7b2e4d8909ea0001483780d2c907349fd6) _(github)_ Update code owners about past maintainers by @orhun in [#1073](https://github.com/ratatui/ratatui/pull/1073) ````text As per suggestion in https://github.com/ratatui/ratatui/pull/1067#issuecomment-2079766990 It's good for historical purposes! ```` - [3687f78](https://github.com/ratatui/ratatui/commit/3687f78f6a06bd175eda3e19819f6dc68012fb59) _(github)_ Update code owners by @orhun in [#1067](https://github.com/ratatui/ratatui/pull/1067) ````text Removes the team members that are not able to review PRs recently (with their approval ofc) ```` - [839cca2](https://github.com/ratatui/ratatui/commit/839cca20bf3f109352ea43f1119e13c879e04b95) _(table)_ Fix typo in docs for highlight_symbol by @kdheepak in [#1108](https://github.com/ratatui/ratatui/pull/1108) - [f945a0b](https://github.com/ratatui/ratatui/commit/f945a0bcff644c1fa2ad3caaa87cf2b640beaf46) _(test)_ Fix typo in TestBackend documentation by @orhun in [#1107](https://github.com/ratatui/ratatui/pull/1107) - [828d17a](https://github.com/ratatui/ratatui/commit/828d17a3f5f449255d7981bb462bf48382c7cb2e) _(uncategorized)_ Add minimal example by @joshka in [#1114](https://github.com/ratatui/ratatui/pull/1114) - [e95230b](https://github.com/ratatui/ratatui/commit/e95230beda9f86dfb7a9bc1c1167e5a91a2748c3) _(uncategorized)_ Add note about scrollbar state content length by @Utagai in [#1077](https://github.com/ratatui/ratatui/pull/1077) ### Performance - [366c2a0](https://github.com/ratatui/ratatui/commit/366c2a0e6d17810b26ba37918e72c2f784176d2c) _(block)_ Use Block::bordered by @EdJoPaTo in [#1041](https://github.com/ratatui/ratatui/pull/1041) `Block::bordered()` is shorter than `Block::new().borders(Borders::ALL)`, requires one less import (`Borders`) and in case `Block::default()` was used before can even be `const`. - [2e71c18](https://github.com/ratatui/ratatui/commit/2e71c1874e2de6d9f2bd21622246e55484a9fc62) _(buffer)_ Simplify Buffer::filled with macro by @EdJoPaTo in [#1036](https://github.com/ratatui/ratatui/pull/1036) ````text The `vec![]` macro is highly optimized by the Rust team and shorter. Don't do it manually. This change is mainly cleaner code. The only production code that uses this is `Terminal::with_options` and `Terminal::insert_before` so it's not performance relevant on every render. ```` - [81b9633](https://github.com/ratatui/ratatui/commit/81b96338ea41f9e5fbb0868808a0b450f31eef41) _(calendar)_ Use const fn by @EdJoPaTo in [#1039](https://github.com/ratatui/ratatui/pull/1039) ````text Also, do the comparison without `as u8`. Stays the same at runtime and is cleaner code. ```` - [c442dfd](https://github.com/ratatui/ratatui/commit/c442dfd1ad4896e7abeeaac1754b94bae1f8d014) _(canvas)_ Change map data to const instead of static by @EdJoPaTo in [#1037](https://github.com/ratatui/ratatui/pull/1037) - [1706b0a](https://github.com/ratatui/ratatui/commit/1706b0a3e434c51dfed9af88470f47162b615c33) _(crossterm)_ Speed up combined fg and bg color changes by up to 20% by @joshka in [#1072](https://github.com/ratatui/ratatui/pull/1072) - [1a4bb1c](https://github.com/ratatui/ratatui/commit/1a4bb1cbb8dc98ab3c9ecfce225a591b0f7a36bc) _(layout)_ Avoid allocating memory when using split ergonomic utils by @tranzystorekk in [#1105](https://github.com/ratatui/ratatui/pull/1105) ````text Don't create intermediate vec in `Layout::areas` and `Layout::spacers` when there's no need for one. ```` ### Styling - [aa4260f](https://github.com/ratatui/ratatui/commit/aa4260f92c869ed77123fab700f9f20b059bbe07) _(uncategorized)_ Use std::fmt instead of importing Debug and Display by @joshka in [#1087](https://github.com/ratatui/ratatui/pull/1087) ````text This is a small universal style change to avoid making this change a part of other PRs. [rationale](https://github.com/ratatui/ratatui/pull/1083#discussion_r1588466060) ```` ### Testing - [3cc29bd](https://github.com/ratatui/ratatui/commit/3cc29bdada096283f1fa89d0a610fa6fd5425f9b) _(block)_ Use rstest to simplify test cases by @EdJoPaTo in [#1095](https://github.com/ratatui/ratatui/pull/1095) ### Miscellaneous Tasks - [5fbb77a](https://github.com/ratatui/ratatui/commit/5fbb77ad205ccff763d71899c2f5a34560d25b92) _(readme)_ Use terminal theme for badges by @TadoTheMiner in [#1026](https://github.com/ratatui/ratatui/pull/1026) ````text The badges in the readme were all the default theme. Giving them prettier colors that match the terminal gif is better. I've used the colors from the VHS repo. ```` - [bef2bc1](https://github.com/ratatui/ratatui/commit/bef2bc1e7c012ecbf357ac54a5262304646b292d) _(cargo)_ Add homepage to Cargo.toml by @joshka in [#1080](https://github.com/ratatui/ratatui/pull/1080) - [76e5fe5](https://github.com/ratatui/ratatui/commit/76e5fe5a9a1934aa7cce8f0d48c1c9035ac0bf41) _(uncategorized)_ Revert "Make Stylize's `.bg(color)` generic" by @kdheepak in [#1102](https://github.com/ratatui/ratatui/pull/1102) ````text This reverts commit ec763af8512df731799c8f30c38c37252068a4c4 from #1099 ```` - [64eb391](https://github.com/ratatui/ratatui/commit/64eb3913a4776db290baeb4179e00d2686d42934) _(uncategorized)_ Fixup cargo lint for windows targets by @joshka in [#1071](https://github.com/ratatui/ratatui/pull/1071) ````text Crossterm brings in multiple versions of the same dep ```` - [326a461](https://github.com/ratatui/ratatui/commit/326a461f9a345ba853d57afefc8d77ba0b0b5a14) _(uncategorized)_ Add package categories field by @mcskware in [#1035](https://github.com/ratatui/ratatui/pull/1035) ````text Add the package categories field in Cargo.toml, with value `["command-line-interface"]`. This fixes the (currently non-default) clippy cargo group lint [`clippy::cargo_common_metadata`](https://rust-lang.github.io/rust-clippy/master/index.html#/cargo_common_metadata). As per discussion in [Cargo package categories suggestions](https://github.com/ratatui/ratatui/discussions/1034), this lint is not suggested to be run by default in CI, but rather as an occasional one-off as part of the larger [`clippy::cargo`](https://doc.rust-lang.org/stable/clippy/lints.html#cargo) lint group. ```` ### Build - [4955380](https://github.com/ratatui/ratatui/commit/4955380932ab4d657be15dd6c65f48334795c785) _(uncategorized)_ Remove pre-push hooks by @joshka in [#1115](https://github.com/ratatui/ratatui/pull/1115) - [28e81c0](https://github.com/ratatui/ratatui/commit/28e81c0714d55f0103d9f075609bcf7e5f551fb1) _(uncategorized)_ Add underline-color to all features flag in makefile by @joshka in [#1100](https://github.com/ratatui/ratatui/pull/1100) - [c75aa19](https://github.com/ratatui/ratatui/commit/c75aa1990f5c1e7e86de0fafc9ce0c1b1dcac3ea) _(uncategorized)_ Add clippy::cargo lint by @joshka in [#1053](https://github.com/ratatui/ratatui/pull/1053) ````text Followup to https://github.com/ratatui/ratatui/pull/1035 and https://github.com/ratatui/ratatui/discussions/1034 It's reasonable to enable this and deal with breakage by fixing any specific issues that arise. ```` ### New Contributors - @Utagai made their first contribution in [#1077](https://github.com/ratatui/ratatui/pull/1077) - @kxxt made their first contribution in [#1074](https://github.com/ratatui/ratatui/pull/1074) - @OkieOth made their first contribution in [#1069](https://github.com/ratatui/ratatui/pull/1069) - @psobolik made their first contribution in [#1066](https://github.com/ratatui/ratatui/pull/1066) - @SleepySwords made their first contribution in [#934](https://github.com/ratatui/ratatui/pull/934) - @mcskware made their first contribution in [#1035](https://github.com/ratatui/ratatui/pull/1035) **Full Changelog**: ## [0.26.2](https://github.com/ratatui/ratatui/releases/tag/v0.26.2) - 2024-04-15 This is a patch release that fixes bugs and adds enhancements, including new iterator constructors, List scroll padding, and various rendering improvements. ✨ ✨ **Release highlights**: ### Features - [11b452d](https://github.com/ratatui/ratatui/commit/11b452d56fe590188ee7a53fa2dde95513b1a4c7) _(layout)_ Mark various functions as const by @EdJoPaTo in [#951](https://github.com/ratatui/ratatui/pull/951) - [1cff511](https://github.com/ratatui/ratatui/commit/1cff51193466f5a94d202b6233d56889eccf6d7b) _(line)_ Impl Styled for Line by @joshka in [#968](https://github.com/ratatui/ratatui/pull/968) ````text This adds `FromIterator` impls for `Line` and `Text` that allow creating `Line` and `Text` instances from iterators of `Span` and `Line` instances, respectively. ```rust let line = Line::from_iter(vec!["Hello".blue(), " world!".green()]); let line: Line = iter::once("Hello".blue()) .chain(iter::once(" world!".green())) .collect(); let text = Text::from_iter(vec!["The first line", "The second line"]); let text: Text = iter::once("The first line") .chain(iter::once("The second line")) .collect(); ``` ```` - [654949b](https://github.com/ratatui/ratatui/commit/654949bb00b4522130642f9ad50ab4d9095d921b) _(list)_ Add Scroll Padding to Lists by @CameronBarnes in [#958](https://github.com/ratatui/ratatui/pull/958) ````text Introduces scroll padding, which allows the api user to request that a certain number of ListItems be kept visible above and below the currently selected item while scrolling. ```rust let list = List::new(items).scroll_padding(1); ``` ```` Fixes: - [26af650](https://github.com/ratatui/ratatui/commit/26af65043ee9f165459dec228d12eaeed9997d92) _(text)_ Add push methods for text and line by @joshka in [#998](https://github.com/ratatui/ratatui/pull/998) ````text Adds the following methods to the `Text` and `Line` structs: - Text::push_line - Text::push_span - Line::push_span This allows for adding lines and spans to a text object without having to call methods on the fields directly, which is useful for incremental construction of text objects. ```` - [b5bdde0](https://github.com/ratatui/ratatui/commit/b5bdde079e0e1eda98b9b1bbbba011b770e5b167) _(text)_ Add `FromIterator` impls for `Line` and `Text` by @joshka in [#967](https://github.com/ratatui/ratatui/pull/967) ````text This adds `FromIterator` impls for `Line` and `Text` that allow creating `Line` and `Text` instances from iterators of `Span` and `Line` instances, respectively. ```rust let line = Line::from_iter(vec!["Hello".blue(), " world!".green()]); let line: Line = iter::once("Hello".blue()) .chain(iter::once(" world!".green())) .collect(); let text = Text::from_iter(vec!["The first line", "The second line"]); let text: Text = iter::once("The first line") .chain(iter::once("The second line")) .collect(); ``` ```` - [12f67e8](https://github.com/ratatui/ratatui/commit/12f67e810fad0f907546408192a2380b590ff7bd) _(uncategorized)_ Impl Widget for `&str` and `String` by @kdheepak in [#952](https://github.com/ratatui/ratatui/pull/952) ````text Currently, `f.render_widget("hello world".bold(), area)` works but `f.render_widget("hello world", area)` doesn't. This PR changes that my implementing `Widget` for `&str` and `String`. This makes it easier to render strings with no styles as widgets. Example usage: ```rust terminal.draw(|f| f.render_widget("Hello World!", f.size()))?; ``` --------- ```` ### Bug Fixes - [0207160](https://github.com/ratatui/ratatui/commit/02071607848c51250b4663722c52e19c8ce1c5e2) _(line)_ Line truncation respects alignment by @TadoTheMiner in [#987](https://github.com/ratatui/ratatui/pull/987) ````text When rendering a `Line`, the line will be truncated: - on the right for left aligned lines - on the left for right aligned lines - on bot sides for centered lines E.g. "Hello World" will be rendered as "Hello", "World", "lo wo" for left, right, centered lines respectively. ```` Fixes: - [c56f49b](https://github.com/ratatui/ratatui/commit/c56f49b9fb1c7f1c8c97749119e85f81882ca9a9) _(list)_ Saturating_sub to fix highlight_symbol overflow by @mrjackwills in [#949](https://github.com/ratatui/ratatui/pull/949) ````text An overflow (pedantically an underflow) can occur if the highlight_symbol is a multi-byte char, and area is reduced to a size less than that char length. ```` - [b7778e5](https://github.com/ratatui/ratatui/commit/b7778e5cd15d0d4b28f7bbb8b3c62950748e333a) _(paragraph)_ Unit test typo by @joshka in [#1022](https://github.com/ratatui/ratatui/pull/1022) - [943c043](https://github.com/ratatui/ratatui/commit/943c0431d968a82b23a2f31527f32e57f86f8a7c) _(scrollbar)_ Dont render on 0 length track by @EdJoPaTo in [#964](https://github.com/ratatui/ratatui/pull/964) ````text Fixes a panic when `track_length - 1` is used. (clamp panics on `-1.0` being smaller than `0.0`) ```` - [742a5ea](https://github.com/ratatui/ratatui/commit/742a5ead066bec14047f6ab7ffa3ac8307eea715) _(text)_ Fix panic when rendering out of bounds by @joshka in [#997](https://github.com/ratatui/ratatui/pull/997) ````text Previously it was possible to cause a panic when rendering to an area outside of the buffer bounds. Instead this now correctly renders nothing to the buffer. ```` - [f6c4e44](https://github.com/ratatui/ratatui/commit/f6c4e447e65fe10f4fc7fcc9e9c4312acad41096) _(uncategorized)_ Ensure that paragraph correctly renders styled text by @joshka in [#992](https://github.com/ratatui/ratatui/pull/992) ````text Paragraph was ignoring the new `Text::style` field added in 0.26.0 ```` Fixes: - [35e971f](https://github.com/ratatui/ratatui/commit/35e971f7ebb0deadc613b561b15511abd48bdb54) _(uncategorized)_ Scrollbar thumb not visible on long lists by @ThomasMiz in [#959](https://github.com/ratatui/ratatui/pull/959) ````text When displaying somewhat-long lists, the `Scrollbar` widget sometimes did not display a thumb character, and only the track will be visible. ```` ### Refactor - [6fd5f63](https://github.com/ratatui/ratatui/commit/6fd5f631bbd58156d9fcae196040bb0248097819) _(lint)_ Prefer idiomatic for loops by @EdJoPaTo - [37b957c](https://github.com/ratatui/ratatui/commit/37b957c7e167a7ecda07b8a60cee5de71efcc55e) _(lints)_ Add lints to scrollbar by @EdJoPaTo - [c12bcfe](https://github.com/ratatui/ratatui/commit/c12bcfefa26529610886040bd96f2b6762436b15) _(non-src)_ Apply pedantic lints by @EdJoPaTo in [#976](https://github.com/ratatui/ratatui/pull/976) ````text Fixes many not yet enabled lints (mostly pedantic) on everything that is not the lib (examples, benches, tests). Therefore, this is not containing anything that can be a breaking change. Lints are not enabled as that should be the job of #974. I created this as a separate PR as it's mostly independent and would only clutter up the diff of #974 even more. Also see https://github.com/ratatui/ratatui/pull/974#discussion_r1506458743 --------- ```` - [8719608](https://github.com/ratatui/ratatui/commit/8719608bdaf32ba92bdfdd60569cf73f7070a618) _(span)_ Rename to_aligned_line into into_aligned_line by @EdJoPaTo in [#993](https://github.com/ratatui/ratatui/pull/993) ````text With the Rust method naming conventions these methods are into methods consuming the Span. Therefore, it's more consistent to use `into_` instead of `to_`. ```rust Span::to_centered_line Span::to_left_aligned_line Span::to_right_aligned_line ``` Are marked deprecated and replaced with the following ```rust Span::into_centered_line Span::into_left_aligned_line Span::into_right_aligned_line ``` ```` - [b831c56](https://github.com/ratatui/ratatui/commit/b831c5688c6f1fbfa6ae2bcd70d803a54fcf0196) _(widget-ref)_ Clippy::needless_pass_by_value by @EdJoPaTo - [359204c](https://github.com/ratatui/ratatui/commit/359204c9298cc26ea21807d886d596de0329bacc) _(uncategorized)_ Simplify to io::Result by @EdJoPaTo in [#1016](https://github.com/ratatui/ratatui/pull/1016) ````text Simplifies the code, logic stays exactly the same. ```` - [8e68db9](https://github.com/ratatui/ratatui/commit/8e68db9e2f57fcbf7cb5140006bbbd4dd80bf907) _(uncategorized)_ Remove pointless default on internal structs by @EdJoPaTo in [#980](https://github.com/ratatui/ratatui/pull/980) See #978 Also remove other derives. They are unused and just slow down compilation. - [3be189e](https://github.com/ratatui/ratatui/commit/3be189e3c6ebd418d13138ff32bc4a749dc840cf) _(uncategorized)_ Clippy::thread_local_initializer_can_be_made_const by @EdJoPaTo ````text enabled by default on nightly ```` - [5c4efac](https://github.com/ratatui/ratatui/commit/5c4efacd1d70bb295d90ffaa73853dc206c187fb) _(uncategorized)_ Clippy::map_err_ignore by @EdJoPaTo - [bbb6d65](https://github.com/ratatui/ratatui/commit/bbb6d65e063df9a74ab6487b2216183c1fdd7230) _(uncategorized)_ Clippy::else_if_without_else by @EdJoPaTo - [fdb14dc](https://github.com/ratatui/ratatui/commit/fdb14dc7cd69788e2ed20709e767f7631b11ffa2) _(uncategorized)_ Clippy::redundant_type_annotations by @EdJoPaTo - [9b3b23a](https://github.com/ratatui/ratatui/commit/9b3b23ac14518a1ef23065d4a5da0fb047b18213) _(uncategorized)_ Remove literal suffix by @EdJoPaTo ````text it's not needed and can just be assumed ```` related:clippy::(un)separated_literal_suffix - [58b6e0b](https://github.com/ratatui/ratatui/commit/58b6e0be0f4db3d90005e130e4b84cd865179785) _(uncategorized)_ Clippy::should_panic_without_expect by @EdJoPaTo - [c870a41](https://github.com/ratatui/ratatui/commit/c870a41057ac0c14c2e72e762b37689dc32e7b23) _(uncategorized)_ Clippy::many_single_char_names by @EdJoPaTo - [a6036ad](https://github.com/ratatui/ratatui/commit/a6036ad78911653407f607f5efa556a055d3dce9) _(uncategorized)_ Clippy::similar_names by @EdJoPaTo - [060d26b](https://github.com/ratatui/ratatui/commit/060d26b6dc6e1027dbf46ae98b0ebba83701f941) _(uncategorized)_ Clippy::match_same_arms by @EdJoPaTo - [fcbea9e](https://github.com/ratatui/ratatui/commit/fcbea9ee68591344a29a7b2e83f1c8c878857aeb) _(uncategorized)_ Clippy::uninlined_format_args by @EdJoPaTo - [14b24e7](https://github.com/ratatui/ratatui/commit/14b24e75858af48f39d5880e7f6c9adeac1b1da9) _(uncategorized)_ Clippy::if_not_else by @EdJoPaTo - [5ed1f43](https://github.com/ratatui/ratatui/commit/5ed1f43c627053f25d9ee711677ebec6cb8fcd85) _(uncategorized)_ Clippy::redundant_closure_for_method_calls by @EdJoPaTo - [c8c7924](https://github.com/ratatui/ratatui/commit/c8c7924e0ca84351f5ed5c54e79611ce16d4dc37) _(uncategorized)_ Clippy::too_many_lines by @EdJoPaTo - [e3afe7c](https://github.com/ratatui/ratatui/commit/e3afe7c8a14c1cffd7de50782a7acf0f95f41673) _(uncategorized)_ Clippy::unreadable_literal by @EdJoPaTo - [a1f54de](https://github.com/ratatui/ratatui/commit/a1f54de7d60fa6c57be29bf8f02a675e58b7b9c2) _(uncategorized)_ Clippy::bool_to_int_with_if by @EdJoPaTo - [b8ea190](https://github.com/ratatui/ratatui/commit/b8ea190bf2cde8c18e2ac8276d2eb57d219db263) _(uncategorized)_ Clippy::cast_lossless by @EdJoPaTo - [0de5238](https://github.com/ratatui/ratatui/commit/0de5238ed3613f2d663f5e9628ca7b2aa205ed02) _(uncategorized)_ Dead_code by @EdJoPaTo ````text enabled by default, only detected by nightly yet ```` - [df5dddf](https://github.com/ratatui/ratatui/commit/df5dddfbc9c679d15a5a90ea79bb1f8946d5cb9c) _(uncategorized)_ Unused_imports by @EdJoPaTo ````text enabled by default, only detected on nightly yet ```` - [f1398ae](https://github.com/ratatui/ratatui/commit/f1398ae6cb1abd32106923d64844b482c7ba6f82) _(uncategorized)_ Clippy::useless_vec by @EdJoPaTo ````text Lint enabled by default but only nightly finds this yet ```` - [525848f](https://github.com/ratatui/ratatui/commit/525848ff4e066526d402fecf1d5b9c63cff1f22a) _(uncategorized)_ Manually apply clippy::use_self for impl with lifetimes by @EdJoPaTo - [660c718](https://github.com/ratatui/ratatui/commit/660c7183c7a10dc453d80dfb651d9534536960b9) _(uncategorized)_ Clippy::empty_line_after_doc_comments by @EdJoPaTo - [ab951fa](https://github.com/ratatui/ratatui/commit/ab951fae8166c9321728ba942b48552dfe4d9c55) _(uncategorized)_ Clippy::return_self_not_must_use by @EdJoPaTo - [3cd4369](https://github.com/ratatui/ratatui/commit/3cd436917649a93b4b80d0c4a0343284e0585522) _(uncategorized)_ Clippy::doc_markdown by @EdJoPaTo - [9bc014d](https://github.com/ratatui/ratatui/commit/9bc014d7f16efdb70fcd6b6b786fe74eac7b9bdf) _(uncategorized)_ Clippy::items_after_statements by @EdJoPaTo - [36a0cd5](https://github.com/ratatui/ratatui/commit/36a0cd56e5645533a1d6c2720536fa10a56b0d40) _(uncategorized)_ Clippy::deref_by_slicing by @EdJoPaTo - [f7f6692](https://github.com/ratatui/ratatui/commit/f7f66928a8833532a3bc97292665640285e7aafa) _(uncategorized)_ Clippy::equatable_if_let by @EdJoPaTo - [01418eb](https://github.com/ratatui/ratatui/commit/01418eb7c2e1874cb4070828c485d81ea171b18d) _(uncategorized)_ Clippy::default_trait_access by @EdJoPaTo - [8536760](https://github.com/ratatui/ratatui/commit/8536760e7802a498f7c6d9fe8fb4c7920a1c6e71) _(uncategorized)_ Clippy::inefficient_to_string by @EdJoPaTo - [a558b19](https://github.com/ratatui/ratatui/commit/a558b19c9a7b90a1ed3f309301f49f0b483e02ec) _(uncategorized)_ Clippy::implicit_clone by @EdJoPaTo - [5b00e3a](https://github.com/ratatui/ratatui/commit/5b00e3aae98cb5c20c10bec944948a75ac83f956) _(uncategorized)_ Clippy::use_self by @EdJoPaTo - [27680c0](https://github.com/ratatui/ratatui/commit/27680c05ce1670f026ad23c446ada321c1c755f0) _(uncategorized)_ Clippy::semicolon_if_nothing_returned by @EdJoPaTo ### Documentation - [14461c3](https://github.com/ratatui/ratatui/commit/14461c3a3554c95905ebca433fc3d4dae1e1acda) _(breaking-changes)_ Typos and markdownlint by @EdJoPaTo in [#1009](https://github.com/ratatui/ratatui/pull/1009) - [d0067c8](https://github.com/ratatui/ratatui/commit/d0067c8815d5244d319934d58a9366c8ad36b3e5) _(license)_ Update copyright years by @orhun in [#962](https://github.com/ratatui/ratatui/pull/962) - [88bfb5a](https://github.com/ratatui/ratatui/commit/88bfb5a43027cf3410ad560772c5bfdbaa3d58b7) _(text)_ Update Text and Line docs by @joshka in [#969](https://github.com/ratatui/ratatui/pull/969) - [3b002fd](https://github.com/ratatui/ratatui/commit/3b002fdcab964ce3f65f55dc8053d9678ae247a3) _(uncategorized)_ Update incompatible code warning in examples readme by @joshka in [#1013](https://github.com/ratatui/ratatui/pull/1013) ### Performance - [e02f476](https://github.com/ratatui/ratatui/commit/e02f4768ce2ee30473200fe98e2687e42acb9c33) _(borders)_ Allow border!() in const by @EdJoPaTo in [#977](https://github.com/ratatui/ratatui/pull/977) ````text This allows more compiler optimizations when the macro is used. ```` - [541f0f9](https://github.com/ratatui/ratatui/commit/541f0f99538762a07d68a71b2989ecc6ff6f71ef) _(cell)_ Use const CompactString::new_inline by @EdJoPaTo in [#979](https://github.com/ratatui/ratatui/pull/979) ````text Some minor find when messing around trying to `const` all the things. While `reset()` and `default()` can not be `const` it's still a benefit when their contents are. ```` - [65e7923](https://github.com/ratatui/ratatui/commit/65e792375396c3160d76964ef0dfc4fb1e53be41) _(scrollbar)_ Const creation by @EdJoPaTo in [#963](https://github.com/ratatui/ratatui/pull/963) ````text A bunch of `const fn` allow for more performance and `Default` now uses the `const` new implementations. ```` - [8195f52](https://github.com/ratatui/ratatui/commit/8195f526cb4b321f337dcbe9e689cc7f6eb84065) _(uncategorized)_ Clippy::needless_pass_by_value by @EdJoPaTo - [183c07e](https://github.com/ratatui/ratatui/commit/183c07ef436cbb8fb0bec418042b44b4fedd836f) _(uncategorized)_ Clippy::trivially_copy_pass_by_ref by @EdJoPaTo - [a13867f](https://github.com/ratatui/ratatui/commit/a13867ffceb2f8f57f4540049754c2f916fd3efc) _(uncategorized)_ Clippy::cloned_instead_of_copied by @EdJoPaTo - [3834374](https://github.com/ratatui/ratatui/commit/3834374652b46c5ddbfedcf8dea2086fd762f884) _(uncategorized)_ Clippy::missing_const_for_fn by @EdJoPaTo ### Miscellaneous Tasks - [125ee92](https://github.com/ratatui/ratatui/commit/125ee929ee9009b97a270e2e105a3f1167ab13d7) _(docs)_ Fix: fix typos in crate documentation by @orhun in [#1002](https://github.com/ratatui/ratatui/pull/1002) - [38c17e0](https://github.com/ratatui/ratatui/commit/38c17e091cf3f4de2d196ecdd6a40129019eafc4) _(editorconfig)_ Set and apply some defaults by @EdJoPaTo - [07da90a](https://github.com/ratatui/ratatui/commit/07da90a7182035b24f870bcbf0a0ffaad75eb48b) _(funding)_ Add eth address for receiving funds from drips.network by @BenJam in [#994](https://github.com/ratatui/ratatui/pull/994) - [078e97e](https://github.com/ratatui/ratatui/commit/078e97e4ff65c02afa7c884914ecd38a6e959b58) _(github)_ Add EdJoPaTo as a maintainer by @orhun in [#986](https://github.com/ratatui/ratatui/pull/986) - [b0314c5](https://github.com/ratatui/ratatui/commit/b0314c5731b32f51f5b6ca71a5194c6d7f265972) _(uncategorized)_ Remove conventional commit check for PR by @Valentin271 in [#950](https://github.com/ratatui/ratatui/pull/950) ````text This removes conventional commit check for PRs. Since we use the PR title and description this is useless. It fails a lot of time and we ignore it. IMPORTANT NOTE: This does **not** mean Ratatui abandons conventional commits. This only relates to commits in PRs. ```` ### Build - [6e6ba27](https://github.com/ratatui/ratatui/commit/6e6ba27a122560bcf47b0efd20b7095f1bfd8714) _(lint)_ Warn on pedantic and allow the rest by @EdJoPaTo - [c4ce7e8](https://github.com/ratatui/ratatui/commit/c4ce7e8ff6f00875e1ead5b68052f0db737bd44d) _(uncategorized)_ Enable more satisfied lints by @EdJoPaTo ````text These lints dont generate warnings and therefore dont need refactoring. I think they are useful in the future. ```` - [a4e84a6](https://github.com/ratatui/ratatui/commit/a4e84a6a7f6f5b80903799028f30e2a4438f2807) _(uncategorized)_ Increase msrv to 1.74.0 by @EdJoPaTo [**breaking**] ````text configure lints in Cargo.toml requires 1.74.0 ```` BREAKING CHANGE:rust 1.74 is required now ### New Contributors - @TadoTheMiner made their first contribution in [#987](https://github.com/ratatui/ratatui/pull/987) - @BenJam made their first contribution in [#994](https://github.com/ratatui/ratatui/pull/994) - @CameronBarnes made their first contribution in [#958](https://github.com/ratatui/ratatui/pull/958) - @ThomasMiz made their first contribution in [#959](https://github.com/ratatui/ratatui/pull/959) **Full Changelog**: ## [0.26.1](https://github.com/ratatui/ratatui/releases/tag/v0.26.1) - 2024-02-12 This is a patch release that fixes bugs and adds enhancements, including new iterators, title options for blocks, and various rendering improvements. ✨ ### Features - [74a0511](https://github.com/ratatui/ratatui/commit/74a051147a4059990c31e08d96a8469d8220537b) _(rect)_ Add Rect::positions iterator ([#928](https://github.com/ratatui/ratatui/issues/928)) ````text Useful for performing some action on all the cells in a particular area. E.g., ```rust fn render(area: Rect, buf: &mut Buffer) { for position in area.positions() { buf.get_mut(position.x, position.y).set_symbol("x"); } } ``` ```` - [9182f47](https://github.com/ratatui/ratatui/commit/9182f47026d1630cb749163b6f8b8987474312ae) _(uncategorized)_ Add Block::title_top and Block::title_top_bottom ([#940](https://github.com/ratatui/ratatui/issues/940)) ````text This adds the ability to add titles to the top and bottom of a block without having to use the `Title` struct (which will be removed in a future release - likely v0.28.0). Fixes a subtle bug if the title was created from a right aligned Line and was also right aligned. The title would be rendered one cell too far to the right. ```rust Block::bordered() .title_top(Line::raw("A").left_aligned()) .title_top(Line::raw("B").centered()) .title_top(Line::raw("C").right_aligned()) .title_bottom(Line::raw("D").left_aligned()) .title_bottom(Line::raw("E").centered()) .title_bottom(Line::raw("F").right_aligned()) .render(buffer.area, &mut buffer); // renders "┌A─────B─────C┐", "│ │", "└D─────E─────F┘", ``` Addresses part of https://github.com/ratatui/ratatui/issues/738 ```` ### Bug Fixes - [2202059](https://github.com/ratatui/ratatui/commit/220205925911ed4377358d2a28ffca9373f11bda) _(block)_ Fix crash on empty right aligned title ([#933](https://github.com/ratatui/ratatui/issues/933)) ````text - Simplified implementation of the rendering for block. - Introduces a subtle rendering change where centered titles that are odd in length will now be rendered one character to the left compared to before. This aligns with other places that we render centered text and is a more consistent behavior. See https://github.com/ratatui/ratatui/pull/807#discussion_r1455645954 for another example of this. ```` Fixes: - [14c67fb](https://github.com/ratatui/ratatui/commit/14c67fbb52101d10b2d2e26898c408ab8dd3ec2d) _(list)_ Highlight symbol when using a multi-bytes char ([#924](https://github.com/ratatui/ratatui/issues/924)) ````text ratatui v0.26.0 brought a regression in the List widget, in which the highlight symbol width was incorrectly calculated - specifically when the highlight symbol was a multi-char character, e.g. `▶`. ```` - [0dcdbea](https://github.com/ratatui/ratatui/commit/0dcdbea083aace6d531c0d505837e0911f400675) _(paragraph)_ Render Line::styled correctly inside a paragraph ([#930](https://github.com/ratatui/ratatui/issues/930)) ````text Renders the styled graphemes of the line instead of the contained spans. ```` - [fae5862](https://github.com/ratatui/ratatui/commit/fae5862c6e0947ee1488a7e4775413dbead67c8b) _(uncategorized)_ Ensure that buffer::set_line sets the line style ([#926](https://github.com/ratatui/ratatui/issues/926)) ````text Fixes a regression in 0.26 where buffer::set_line was no longer setting the style. This was due to the new style field on Line instead of being stored only in the spans. Also adds a configuration for just running unit tests to bacon.toml. ```` - [fbb5dfa](https://github.com/ratatui/ratatui/commit/fbb5dfaaa903efde0e63114c393dc3063d5f56fd) _(uncategorized)_ Scrollbar rendering when no track symbols are provided ([#911](https://github.com/ratatui/ratatui/issues/911)) ### Refactor - [c3fb258](https://github.com/ratatui/ratatui/commit/c3fb25898f3e3ffe485ee69631b680679874d2cb) _(rect)_ Move iters to module and add docs ([#927](https://github.com/ratatui/ratatui/issues/927)) - [e51ca6e](https://github.com/ratatui/ratatui/commit/e51ca6e0d2705e6e0a96aeee78f1e80fcaaf34fc) _(uncategorized)_ Finish tidying up table ([#942](https://github.com/ratatui/ratatui/issues/942)) - [91040c0](https://github.com/ratatui/ratatui/commit/91040c0865043b8d5e7387509523a41345ed5af3) _(uncategorized)_ Rearrange block structure ([#939](https://github.com/ratatui/ratatui/issues/939)) ### Documentation - [61a8278](https://github.com/ratatui/ratatui/commit/61a827821dff2bd733377cfc143266edce1dbeec) _(canvas)_ Add documentation to canvas module ([#913](https://github.com/ratatui/ratatui/issues/913)) ````text Document the whole `canvas` module. With this, the whole `widgets` module is documented. ```` - [d2d91f7](https://github.com/ratatui/ratatui/commit/d2d91f754c87458c6d07863eca20f3ea8ae319ce) _(changelog)_ Add sponsors section ([#908](https://github.com/ratatui/ratatui/issues/908)) - [410d08b](https://github.com/ratatui/ratatui/commit/410d08b2b5812d7e29302adc0e8ddf18eb7d1d26) _(uncategorized)_ Add link to FOSDEM 2024 talk ([#944](https://github.com/ratatui/ratatui/issues/944)) - [1f208ff](https://github.com/ratatui/ratatui/commit/1f208ffd0368b4d269854dc0c550686dcd2d1de0) _(uncategorized)_ Add GitHub Sponsors badge ([#943](https://github.com/ratatui/ratatui/issues/943)) ### Performance - [0963463](https://github.com/ratatui/ratatui/commit/096346350e19c5de9a4d74bba64796997e9f40da) _(uncategorized)_ Use drain instead of remove in chart examples ([#922](https://github.com/ratatui/ratatui/issues/922)) ### Miscellaneous Tasks - [a4892ad](https://github.com/ratatui/ratatui/commit/a4892ad444739d7a760bc45bbd954e728c66b2d2) _(uncategorized)_ Fix typo in docsrs example ([#946](https://github.com/ratatui/ratatui/issues/946)) - [18870ce](https://github.com/ratatui/ratatui/commit/18870ce99063a492674de061441b2cce5dc54c60) _(uncategorized)_ Fix the method name for setting the Line style ([#947](https://github.com/ratatui/ratatui/issues/947)) - [8fb4630](https://github.com/ratatui/ratatui/commit/8fb46301a00b5d065f9b890496f914d3fdc17495) _(uncategorized)_ Remove github action bot that makes comments nudging commit signing ([#937](https://github.com/ratatui/ratatui/issues/937)) ````text We can consider reverting this commit once this PR is merged: https://github.com/1Password/check-signed-commits-action/pull/9 ```` ### Contributors Thank you so much to everyone that contributed to this release! Here is the list of contributors who have contributed to `ratatui` for the first time! - @mo8it - @m4rch3n1ng ## [0.26.0](https://github.com/ratatui/ratatui/releases/tag/v0.26.0) - 2024-02-02 We are excited to announce the new version of `ratatui` - a Rust library that's all about cooking up TUIs 🐭 In this version, we have primarily focused on simplifications and quality-of-life improvements for providing a more intuitive and user-friendly experience while building TUIs. ✨ **Release highlights**: ⚠️ List of breaking changes can be found [here](https://github.com/ratatui/ratatui/blob/main/BREAKING-CHANGES.md). 💖 Consider sponsoring us at ! ### Features - [79ceb9f](https://github.com/ratatui/ratatui/commit/79ceb9f7b6ce7d7079fd7a1e1de8b160086206d0) _(line)_ Add alignment convenience functions ([#856](https://github.com/ratatui/ratatui/issues/856)) ```text This adds convenience functions `left_aligned()`, `centered()` and `right_aligned()` plus unit tests. Updated example code. ``` - [0df9354](https://github.com/ratatui/ratatui/commit/0df935473f59d9bcf16ea5092878e59ee129d876) _(padding)_ Add new constructors for padding ([#828](https://github.com/ratatui/ratatui/issues/828)) ````text Adds `proportional`, `symmetric`, `left`, `right`, `top`, and `bottom` constructors for Padding struct. Proportional is ``` /// **NOTE**: Terminal cells are often taller than they are wide, so to make horizontal and vertical /// padding seem equal, doubling the horizontal padding is usually pretty good. ``` ```` Fixes: - [d726e92](https://github.com/ratatui/ratatui/commit/d726e928d2004d2a99caeeb00b95ce27dbc04bc0) _(paragraph)_ Add alignment convenience functions ([#866](https://github.com/ratatui/ratatui/issues/866)) ```text Added convenience functions left_aligned(), centered() and right_aligned() plus unit tests. Updated example code. ``` - [c1ed5c3](https://github.com/ratatui/ratatui/commit/c1ed5c3637dc4574612ac2029249ba700e9192b5) _(span)_ Add alignment functions ([#873](https://github.com/ratatui/ratatui/issues/873)) ```text Implemented functions that convert Span into a left-/center-/right-aligned Line. Implemented unit tests. ``` Closes #853 - [b80264d](https://github.com/ratatui/ratatui/commit/b80264de877e7ca240cea15716379622d822bc08) _(text)_ Add alignment convenience functions ([#862](https://github.com/ratatui/ratatui/issues/862)) ```text Adds convenience functions `left_aligned()`, `centered()` and `right_aligned()` plus unit tests. ``` - [23f6938](https://github.com/ratatui/ratatui/commit/23f6938498a7c31916a091d5b79c9d95a0575344) _(block)_ Add `Block::bordered` ([#736](https://github.com/ratatui/ratatui/issues/736)) ````text This avoid creating a block with no borders and then settings Borders::ALL. i.e. ```diff - Block::default().borders(Borders::ALL); + Block::bordered(); ``` ```` - [ffd5fc7](https://github.com/ratatui/ratatui/commit/ffd5fc79fcaf8bfff1a49c55f8d4b503a9e6dfed) _(color)_ Add Color::from_u32 constructor ([#785](https://github.com/ratatui/ratatui/issues/785)) ````text Convert a u32 in the format 0x00RRGGBB to a Color. ```rust let white = Color::from_u32(0x00FFFFFF); let black = Color::from_u32(0x00000000); ``` ```` - [4f2db82](https://github.com/ratatui/ratatui/commit/4f2db82a774a3faea7db9659f30684e9635c24b2) _(color)_ Use the FromStr implementation for deserialization ([#705](https://github.com/ratatui/ratatui/issues/705)) ```text The deserialize implementation for Color used to support only the enum names (e.g. Color, LightRed, etc.) With this change, you can use any of the strings supported by the FromStr implementation (e.g. black, light-red, #00ff00, etc.) ``` - [1cbe1f5](https://github.com/ratatui/ratatui/commit/1cbe1f52abb7ab1cd5bd05030e7857ee1762f44a) _(constraints)_ Rename `Constraint::Proportional` to `Constraint::Fill` ([#880](https://github.com/ratatui/ratatui/issues/880)) `Constraint::Fill` is a more intuitive name for the behavior, and it is shorter. Resolves #859 - [dfd6db9](https://github.com/ratatui/ratatui/commit/dfd6db988faa7a45cbe99b01024c086c4fcf7577) _(demo2)_ Add destroy mode to celebrate commit 1000! ([#809](https://github.com/ratatui/ratatui/issues/809)) ````text ```shell cargo run --example demo2 --features="crossterm widget-calendar" ``` Press `d` to activate destroy mode and Enjoy! ![Destroy Demo2](https://github.com/ratatui/ratatui/blob/1d39444e3dea6f309cf9035be2417ac711c1abc9/examples/demo2-destroy.gif?raw=true) Vendors a copy of tui-big-text to allow us to use it in the demo. ```` - [540fd2d](https://github.com/ratatui/ratatui/commit/540fd2df036648674a2f6d37f7b12326d5978bbd) _(layout)_ Change `Flex::default()` ([#881](https://github.com/ratatui/ratatui/issues/881)) [**breaking**] ````text This PR makes a number of simplifications to the layout and constraint features that were added after v0.25.0. For users upgrading from v0.25.0, the net effect of this PR (along with the other PRs) is the following: - New `Flex` modes have been added. - `Flex::Start` (new default) - `Flex::Center` - `Flex::End` - `Flex::SpaceAround` - `Flex::SpaceBetween` - `Flex::Legacy` (old default) - `Min(v)` grows to allocate excess space in all `Flex` modes instead of shrinking (except in `Flex::Legacy` where it retains old behavior). - `Fill(1)` grows to allocate excess space, growing equally with `Min(v)`. --- The following contains a summary of the changes in this PR and the motivation behind them. **`Flex`** - Removes `Flex::Stretch` - Renames `Flex::StretchLast` to `Flex::Legacy` **`Constraint`** - Removes `Fixed` - Makes `Min(v)` grow as much as possible everywhere (except `Flex::Legacy` where it retains the old behavior) - Makes `Min(v)` grow equally as `Fill(1)` while respecting `Min` lower bounds. When `Fill` and `Min` are used together, they both fill excess space equally. Allowing `Min(v)` to grow still allows users to build the same layouts as before with `Flex::Start` with no breaking changes to the behavior. This PR also removes the unstable feature `SegmentSize`. This is a breaking change to the behavior of constraints. If users want old behavior, they can use `Flex::Legacy`. ```rust Layout::vertical([Length(25), Length(25)]).flex(Flex::Legacy) ``` Users that have constraint that exceed the available space will probably not see any difference or see an improvement in their layouts. Any layout with `Min` will be identical in `Flex::Start` and `Flex::Legacy` so any layout with `Min` will not be breaking. Previously, `Table` used `EvenDistribution` internally by default, but with that gone the default is now `Flex::Start`. This changes the behavior of `Table` (for the better in most cases). The only way for users to get exactly the same as the old behavior is to change their constraints. I imagine most users will be happier out of the box with the new Table default. Resolves https://github.com/ratatui/ratatui/issues/843 Thanks to @joshka for the direction ```` - [bbcfa55](https://github.com/ratatui/ratatui/commit/bbcfa55a88c1916598ea0442217ac7f6a99ea96f) _(layout)_ Add Rect::contains method ([#882](https://github.com/ratatui/ratatui/issues/882)) ```text This is useful for performing hit tests (i.e. did the user click in an area). ``` - [736605e](https://github.com/ratatui/ratatui/commit/736605ec88aac4877b19dd66ded97b26d933407f) _(layout)_ Add default impl for Position ([#869](https://github.com/ratatui/ratatui/issues/869)) - [1e75596](https://github.com/ratatui/ratatui/commit/1e755967c53e9a1803cc7fcc46ad0946c78f0eda) _(layout)_ Increase default cache size to 500 ([#850](https://github.com/ratatui/ratatui/issues/850)) ```text This is a somewhat arbitrary size for the layout cache based on adding the columns and rows on my laptop's terminal (171+51 = 222) and doubling it for good measure and then adding a bit more to make it a round number. This gives enough entries to store a layout for every row and every column, twice over, which should be enough for most apps. For those that need more, the cache size can be set with `Layout::init_cache()`. ``` Fixes: - [2819eea](https://github.com/ratatui/ratatui/commit/2819eea82bfde48562b830b4ef1c998dacae8b69) _(layout)_ Add Position struct ([#790](https://github.com/ratatui/ratatui/issues/790)) ```text This stores the x and y coordinates (columns and rows) - add conversions from Rect - add conversion with Size to Rect - add Rect::as_position ``` - [1561d64](https://github.com/ratatui/ratatui/commit/1561d64c80e6498f90807a1607d84a1405d3e0bb) _(layout)_ Add Rect -> Size conversion methods ([#789](https://github.com/ratatui/ratatui/issues/789)) ```text - add Size::new() constructor - add Rect::as_size() - impl From for Size - document and add tests for Size ``` - [f13fd73](https://github.com/ratatui/ratatui/commit/f13fd73d9ec108af723a9cd11f4262f2b09c9d25) _(layout)_ Add `Rect::clamp()` method ([#749](https://github.com/ratatui/ratatui/issues/749)) ````text * feat(layout): add a Rect::clamp() method This ensures a rectangle does not end up outside an area. This is useful when you want to be able to dynamically move a rectangle around, but keep it constrained to a certain area. For example, this can be used to implement a draggable window that can be moved around, but not outside the terminal window. ```rust let window_area = Rect::new(state.x, state.y, 20, 20).clamp(area); state.x = rect.x; state.y = rect.y; ``` * refactor: use rstest to simplify clamp test * fix: use rstest description instead of string test layout::rect::tests::clamp::case_01_inside ... ok test layout::rect::tests::clamp::case_02_up_left ... ok test layout::rect::tests::clamp::case_04_up_right ... ok test layout::rect::tests::clamp::case_05_left ... ok test layout::rect::tests::clamp::case_03_up ... ok test layout::rect::tests::clamp::case_06_right ... ok test layout::rect::tests::clamp::case_07_down_left ... ok test layout::rect::tests::clamp::case_08_down ... ok test layout::rect::tests::clamp::case_09_down_right ... ok test layout::rect::tests::clamp::case_10_too_wide ... ok test layout::rect::tests::clamp::case_11_too_tall ... ok test layout::rect::tests::clamp::case_12_too_large ... ok * fix: less ambiguous docs for this / other rect * fix: move rstest to dev deps ```` - [98bcf1c](https://github.com/ratatui/ratatui/commit/98bcf1c0a57a340229684345497b2d378979de04) _(layout)_ Add Rect::split method ([#729](https://github.com/ratatui/ratatui/issues/729)) ````text This method splits a Rect and returns a fixed-size array of the resulting Rects. This allows the caller to use array destructuring to get the individual Rects. ```rust use Constraint::*; let layout = &Layout::vertical([Length(1), Min(0)]); let [top, main] = area.split(&layout); ``` ```` - [0494ee5](https://github.com/ratatui/ratatui/commit/0494ee52f1f0070f1ccf4532f7301fd59d4a5c10) _(layout)_ Accept Into for constructors ([#744](https://github.com/ratatui/ratatui/issues/744)) ````text This allows Layout constructors to accept any type that implements Into instead of just AsRef. This is useful when you want to specify a fixed size for a layout, but don't want to explicitly create a Constraint::Length yourself. ```rust Layout::new(Direction::Vertical, [1, 2, 3]); Layout::horizontal([1, 2, 3]); Layout::vertical([1, 2, 3]); Layout::default().constraints([1, 2, 3]); ``` ```` - [7ab12ed](https://github.com/ratatui/ratatui/commit/7ab12ed8ce8f6cdb0712d132b4dfc4cccfda08da) _(layout)_ Add horizontal and vertical constructors ([#728](https://github.com/ratatui/ratatui/issues/728)) ````text * feat(layout): add vertical and horizontal constructors This commit adds two new constructors to the `Layout` struct, which allow the user to create a vertical or horizontal layout with default values. ```rust let layout = Layout::vertical([ Constraint::Length(10), Constraint::Min(5), Constraint::Length(10), ]); let layout = Layout::horizontal([ Constraint::Length(10), Constraint::Min(5), Constraint::Length(10), ]); ``` ```` - [4278b40](https://github.com/ratatui/ratatui/commit/4278b4088d2ab1d94aa5d73d7a0c321a46dbd9de) _(line)_ Implement iterators for Line ([#896](https://github.com/ratatui/ratatui/issues/896)) ```text This allows iterating over the `Span`s of a line using `for` loops and other iterator methods. - add `iter` and `iter_mut` methods to `Line` - implement `IntoIterator` for `Line`, `&Line`, and `&mut Line` traits - update call sites to iterate over `Line` rather than `Line::spans` ``` - [5d410c6](https://github.com/ratatui/ratatui/commit/5d410c6895de49e77c7e0d1884be63d797724448) _(line)_ Implement Widget for Line ([#715](https://github.com/ratatui/ratatui/issues/715)) ````text This allows us to use Line as a child of other widgets, and to use Line::render() to render it rather than calling buffer.set_line(). ```rust frame.render_widget(Line::raw("Hello, world!"), area); // or Line::raw("Hello, world!").render(frame, area); ``` ```` - [c977293](https://github.com/ratatui/ratatui/commit/c977293f14b019ee520379bf5eaafb44cef04a01) _(line)_ Add style field, setters and docs ([#708](https://github.com/ratatui/ratatui/issues/708)) [**breaking**] ```text - The `Line` struct now stores the style of the line rather than each `Span` storing it. - Adds two new setters for style and spans - Adds missing docs ``` BREAKING CHANGE:`Line::style` is now a field of `Line` instead of being stored in each `Span`. - [bbf2f90](https://github.com/ratatui/ratatui/commit/bbf2f906fbe7e593fdeb5dd7530d3479788f77a5) _(rect.rs)_ Implement Rows and Columns iterators in Rect ([#765](https://github.com/ratatui/ratatui/issues/765)) ```text This enables iterating over rows and columns of a Rect. In tern being able to use that with other iterators and simplify looping over cells. ``` - [fe06f0c](https://github.com/ratatui/ratatui/commit/fe06f0c7b06e50cd5d7916dab9ccb5e28f5a6511) _(serde)_ Support TableState, ListState, and ScrollbarState ([#723](https://github.com/ratatui/ratatui/issues/723)) ````text TableState, ListState, and ScrollbarState can now be serialized and deserialized using serde. ```rust #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] struct AppState { list_state: ListState, table_state: TableState, scrollbar_state: ScrollbarState, } let app_state = AppState::default(); let serialized = serde_json::to_string(app_state); let app_state = serde_json::from_str(serialized); ``` ```` - [37c1836](https://github.com/ratatui/ratatui/commit/37c183636b573e7637af5fbab9ae5c6f2d3fec6b) _(span)_ Implement Widget on Span ([#709](https://github.com/ratatui/ratatui/issues/709)) ````text This allows us to use Span as a child of other widgets, and to use Span::render() to render it rather than calling buffer.set_span(). ```rust frame.render_widget(Span::raw("Hello, world!"), area); // or Span::raw("Hello, world!").render(frame, area); // or even "Hello, world!".green().render(frame, area); ``` ```` - [e1e85aa](https://github.com/ratatui/ratatui/commit/e1e85aa7af2a7624b12a0ad7f0aa2413b409475d) _(style)_ Add material design color palette ([#786](https://github.com/ratatui/ratatui/issues/786)) ````text The `ratatui::style::palette::material` module contains the Google 2014 Material Design palette. See https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors for more information. ```rust use ratatui::style::palette::material::BLUE_GRAY; Line::styled("Hello", BLUE_GRAY.c500); ``` ```` - [bf67850](https://github.com/ratatui/ratatui/commit/bf678507395a528befcf5c5e3180368cb8f4b826) _(style)_ Add tailwind color palette ([#787](https://github.com/ratatui/ratatui/issues/787)) ````text The `ratatui::style::palette::tailwind` module contains the default Tailwind color palette. This is useful for styling components with colors that match the Tailwind color palette. See https://tailwindcss.com/docs/customizing-colors for more information on Tailwind. ```rust use ratatui::style::palette::tailwind::SLATE; Line::styled("Hello", SLATE.c500); ``` ```` - [27e9216](https://github.com/ratatui/ratatui/commit/27e9216cea7f25fcf172fe0a8f11e7cca222b055) _(table)_ Remove allow deprecated attribute used previously for segment_size ✨ ([#875](https://github.com/ratatui/ratatui/issues/875)) - [a489d85](https://github.com/ratatui/ratatui/commit/a489d85f2dda561ea18f1431f6e44f0335549eca) _(table)_ Deprecate SegmentSize on table ([#842](https://github.com/ratatui/ratatui/issues/842)) ```text This adds for table: - Added new flex method with flex field - Deprecated segment_size method and removed segment_size field - Updated documentation - Updated tests ``` - [c69ca47](https://github.com/ratatui/ratatui/commit/c69ca47922619332f76488f5d9e70541b496fe1c) _(table)_ Collect iterator of `Row` into `Table` ([#774](https://github.com/ratatui/ratatui/issues/774)) [**breaking**] ```text Any iterator whose item is convertible into `Row` can now be collected into a `Table`. Where previously, `Table::new` accepted `IntoIterator`, it now accepts `IntoIterator>`. ``` BREAKING CHANGE:The compiler can no longer infer the element type of the container passed to `Table::new()`. For example, `Table::new(vec![], widths)` will no longer compile, as the type of `vec![]` can no longer be inferred. - [2faa879](https://github.com/ratatui/ratatui/commit/2faa879658a439d233edc4ac886fb42c17ff971a) _(table)_ Accept Text for highlight_symbol ([#781](https://github.com/ratatui/ratatui/issues/781)) ````text This allows for multi-line symbols to be used as the highlight symbol. ```rust let table = Table::new(rows, widths) .highlight_symbol(Text::from(vec![ "".into(), " █ ".into(), " █ ".into(), "".into(), ])); ``` ```` - [e64e194](https://github.com/ratatui/ratatui/commit/e64e194b6bc5f89c68fe73d430e63c264af6ca4f) _(table)_ Implement FromIterator for widgets::Row ([#755](https://github.com/ratatui/ratatui/issues/755)) ```text The `Row::new` constructor accepts a single argument that implements `IntoIterator`. This commit adds an implementation of `FromIterator`, as a thin wrapper around `Row::new`. This allows `.collect::()` to be used at the end of an iterator chain, rather than wrapping the entire iterator chain in `Row::new`. ``` - [803a72d](https://github.com/ratatui/ratatui/commit/803a72df27190e273556e089e42036bfc001f003) _(table)_ Accept Into for widths ([#745](https://github.com/ratatui/ratatui/issues/745)) ````text This allows Table constructors to accept any type that implements Into instead of just AsRef. This is useful when you want to specify a fixed size for a table columns, but don't want to explicitly create a Constraint::Length yourself. ```rust Table::new(rows, [1,2,3]) Table::default().widths([1,2,3]) ``` ```` - [f025d2b](https://github.com/ratatui/ratatui/commit/f025d2bfa26eac11ef5c2a63943a4e177abfc800) _(table)_ Add Table::footer and Row::top_margin methods ([#722](https://github.com/ratatui/ratatui/issues/722)) ```text * feat(table): Add a Table::footer method ``` - [f29c73f](https://github.com/ratatui/ratatui/commit/f29c73fb1cf746aea0adfaed4a8b959e0466b830) _(tabs)_ Accept Iterators of `Line` in constructors ([#776](https://github.com/ratatui/ratatui/issues/776)) [**breaking**] ```text Any iterator whose item is convertible into `Line` can now be collected into `Tabs`. In addition, where previously `Tabs::new` required a `Vec`, it can now accept any object that implements `IntoIterator` with an item type implementing `Into`. ``` BREAKING CHANGE:Calls to `Tabs::new()` whose argument is collected from an iterator will no longer compile. For example, `Tabs::new(["a","b"].into_iter().collect())` will no longer compile, because the return type of `.collect()` can no longer be inferred to be a `Vec<_>`. - [b459228](https://github.com/ratatui/ratatui/commit/b459228e26b9429b8a09084d76251361f7f5bfd3) _(termwiz)_ Add `From` termwiz style impls ([#726](https://github.com/ratatui/ratatui/issues/726)) ```text Important note: this also fixes a wrong mapping between ratatui's gray and termwiz's grey. `ratatui::Color::Gray` now maps to `termwiz::color::AnsiColor::Silver` ``` - [9ba7354](https://github.com/ratatui/ratatui/commit/9ba7354335a106607fe0670e1205a038ec54aa1b) _(text)_ Implement iterators for Text ([#900](https://github.com/ratatui/ratatui/issues/900)) ```text This allows iterating over the `Lines`s of a text using `for` loops and other iterator methods. - add `iter` and `iter_mut` methods to `Text` - implement `IntoIterator` for `Text`, `&Text`, and `&mut Text` traits - update call sites to iterate over `Text` rather than `Text::lines` ``` - [68d5783](https://github.com/ratatui/ratatui/commit/68d5783a6912c644b922b7030facff4b1172a434) _(text)_ Add style and alignment ([#807](https://github.com/ratatui/ratatui/issues/807)) Fixes #758, fixes #801 This PR adds: - `style` and `alignment` to `Text` - impl `Widget` for `Text` - replace `Text` manual draw to call for Widget impl All places that use `Text` have been updated and support its new features expect paragraph which still has a custom implementation. - [815757f](https://github.com/ratatui/ratatui/commit/815757fcbbc147050f8ce9418a4e91fd871d011f) _(widgets)_ Implement Widget for Widget refs ([#833](https://github.com/ratatui/ratatui/issues/833)) ````text Many widgets can be rendered without changing their state. This commit implements The `Widget` trait for references to widgets and changes their implementations to be immutable. This allows us to render widgets without consuming them by passing a ref to the widget when calling `Frame::render_widget()`. ```rust // this might be stored in a struct let paragraph = Paragraph::new("Hello world!"); let [left, right] = area.split(&Layout::horizontal([20, 20])); frame.render_widget(¶graph, left); frame.render_widget(¶graph, right); // we can reuse the widget ``` Implemented for all widgets except BarChart (which has an implementation that modifies the internal state and requires a rewrite to fix. Other widgets will be implemented in follow up commits. ```` Fixes: Replaces PRs: and Enables: Validated as a viable working solution by: - [eb79256](https://github.com/ratatui/ratatui/commit/eb79256ceea151130c6b80930b51098b9ad43f5b) _(widgets)_ Collect iterator of `ListItem` into `List` ([#775](https://github.com/ratatui/ratatui/issues/775)) ````text Any iterator whose item is convertible into `ListItem` can now be collected into a `List`. ```rust let list: List = (0..3).map(|i| format!("Item{i}")).collect(); ``` ```` - [c8dd879](https://github.com/ratatui/ratatui/commit/c8dd87918d44fff6d4c3c78e1fc821a3275db1ae) _(uncategorized)_ Add WidgetRef and StatefulWidgetRef traits ([#903](https://github.com/ratatui/ratatui/issues/903)) ````text The Widget trait consumes self, which makes it impossible to use in a boxed context. Previously we implemented the Widget trait for &T, but this was not enough to render a boxed widget. We now have a new trait called `WidgetRef` that allows rendering a widget by reference. This trait is useful when you want to store a reference to one or more widgets and render them later. Additionally this makes it possible to render boxed widgets where the type is not known at compile time (e.g. in a composite layout with multiple panes of different types). This change also adds a new trait called `StatefulWidgetRef` which is the stateful equivalent of `WidgetRef`. Both new traits are gated behind the `unstable-widget-ref` feature flag as we may change the exact name / approach a little on this based on further discussion. Blanket implementation of `Widget` for `&W` where `W` implements `WidgetRef` and `StatefulWidget` for `&W` where `W` implements `StatefulWidgetRef` is provided. This allows you to render a widget by reference and a stateful widget by reference. A blanket implementation of `WidgetRef` for `Option` where `W` implements `WidgetRef` is provided. This makes it easier to render child widgets that are optional without the boilerplate of unwrapping the option. Previously several widgets implemented this manually. This commits expands the pattern to apply to all widgets. ```rust struct Parent { child: Option, } impl WidgetRef for Parent { fn render_ref(&self, area: Rect, buf: &mut Buffer) { self.child.render_ref(area, buf); } } ``` ```rust let widgets: Vec> = vec![Box::new(Greeting), Box::new(Farewell)]; for widget in widgets { widget.render_ref(buf.area, &mut buf); } assert_eq!(buf, Buffer::with_lines(["Hello Goodbye"])); ``` ```` - [87bf1dd](https://github.com/ratatui/ratatui/commit/87bf1dd9dfb8bf2e6c08c488d4a38dac21e14304) _(uncategorized)_ Replace Rect::split with Layout::areas and spacers ([#904](https://github.com/ratatui/ratatui/issues/904)) ```text In a recent commit we added Rec::split, but this feels more ergonomic as Layout::areas. This also adds Layout::spacers to get the spacers between the areas. ``` - [dab08b9](https://github.com/ratatui/ratatui/commit/dab08b99b6a2a4c8ced6f780af7a37a0f3c34f6b) _(uncategorized)_ Show space constrained UIs conditionally ([#895](https://github.com/ratatui/ratatui/issues/895)) ```text With this PR the constraint explorer demo only shows space constrained UIs instead: Smallest (15 row height): image Small (20 row height): image Medium (30 row height): image Full (40 row height): image ``` - [2a12f7b](https://github.com/ratatui/ratatui/commit/2a12f7bddf0b286e63439c2d1fa894dcfbfde6c0) _(uncategorized)_ Impl Widget for &BarChart ([#897](https://github.com/ratatui/ratatui/issues/897)) ```text BarChart had some internal mutations that needed to be removed to implement the Widget trait for &BarChart to bring it in line with the other widgets. ``` - [9ec43ef](https://github.com/ratatui/ratatui/commit/9ec43eff1c7a62631fab99e4874ccd15fe7b210a) _(uncategorized)_ Constraint Explorer example ([#893](https://github.com/ratatui/ratatui/issues/893)) ```text Here's a constraint explorer demo put together with @joshka ``` It allows users to interactive explore how the constraints behave with respect to each other and compare that across flex modes. It allows users to swap constraints out for other constraints, increment or decrement the values, add and remove constraints, and add spacing It is also a good example for how to structure a simple TUI with several Ratatui code patterns that are useful for refactoring. Fixes: --- - [4ee4e6d](https://github.com/ratatui/ratatui/commit/4ee4e6d78a136b5a1e4942f25b9afe34f7dd5d0c) _(uncategorized)_ Make spacing work in `Flex::SpaceAround` and `Flex::SpaceBetween` ([#892](https://github.com/ratatui/ratatui/issues/892)) ```text This PR implements user provided spacing gaps for `SpaceAround` and `SpaceBetween`. ``` Now user provided spacing gaps always take priority in all `Flex` modes. - [dd5ca3a](https://github.com/ratatui/ratatui/commit/dd5ca3a0c83bc1efc281133707eec04864567e69) _(uncategorized)_ Better weights for constraints ([#889](https://github.com/ratatui/ratatui/issues/889)) ````text This PR is a split of reworking the weights from #888 This keeps the same ranking of weights, just uses a different numerical value so that the lowest weight is `WEAK` (`1.0`). No tests are changed as a result of this change, and running the following multiple times did not cause any errors for me: ```rust for i in {0..100} do cargo test --lib -- if [ $? -ne 0 ]; then echo "Test failed. Exiting loop." break fi done ``` ```` - [aeec163](https://github.com/ratatui/ratatui/commit/aeec16369bdf26dc96af46cc580df191078464ae) _(uncategorized)_ Change rounding to make tests stable ([#888](https://github.com/ratatui/ratatui/issues/888)) ```text This fixes some unstable tests ``` - [be4fdaa](https://github.com/ratatui/ratatui/commit/be4fdaa0c7c863daa50c0109cd5f96005365029d) _(uncategorized)_ Change priority of constraints and add `split_with_spacers` ✨ ([#788](https://github.com/ratatui/ratatui/issues/788)) ```text Follow up to https://github.com/ratatui/ratatui/pull/783 This PR introduces different priorities for each kind of constraint. This PR also adds tests that specifies this behavior. This PR resolves a number of broken tests. Fixes https://github.com/ratatui/ratatui/issues/827 With this PR, the layout algorithm will do the following in order: 1. Ensure that all the segments are within the user provided area and ensure that all segments and spacers are aligned next to each other 2. if a user provides a `layout.spacing`, it will enforce it. 3. ensure proportional elements are all proportional to each other 4. if a user provides a `Fixed(v)` constraint, it will enforce it. 5. `Min` / `Max` binding inequality constraints 6. `Length` 7. `Percentage` 8. `Ratio` 9. collapse `Min` or collapse `Max` 10. grow `Proportional` as much as possible 11. grow spacers as much as possible This PR also returns the spacer areas as `Rects` to the user. Users can then draw into the spacers as they see fit (thanks @joshka for the idea). Here's a screenshot with the modified flex example: image This PR introduces a `strengths` module that has "default" weights that give stable solutions as well as predictable behavior. ``` - [d713201](https://github.com/ratatui/ratatui/commit/d7132011f921cb87593914bd7d2e24ac676ec911) _(uncategorized)_ Add `Color::from_hsl` ✨ ([#772](https://github.com/ratatui/ratatui/issues/772)) ````text This PR adds `Color::from_hsl` that returns a valid `Color::Rgb`. ```rust let color: Color = Color::from_hsl(360.0, 100.0, 100.0); assert_eq!(color, Color::Rgb(255, 255, 255)); let color: Color = Color::from_hsl(0.0, 0.0, 0.0); assert_eq!(color, Color::Rgb(0, 0, 0)); ``` HSL stands for Hue (0-360 deg), Saturation (0-100%), and Lightness (0-100%) and working with HSL the values can be more intuitive. For example, if you want to make a red color more orange, you can change the Hue closer toward yellow on the color wheel (i.e. increase the Hue). ```` Related #763 - [405a125](https://github.com/ratatui/ratatui/commit/405a125c8235b983993e3774361821b67a340aa0) _(uncategorized)_ Add wide and tall proportional border set ([#848](https://github.com/ratatui/ratatui/issues/848)) ```text Adds `PROPORTIONAL_WIDE` and `PROPORTIONAL_TALL` border sets. ``` `symbols::border::PROPORTIONAL_WIDE` ``` ▄▄▄▄ █xx█ █xx█ ▀▀▀▀ ``` `symbols::border::PROPORTIONAL_TALL` ``` █▀▀█ █xx█ █xx█ █▄▄█ ``` Fixes: - [9df6ceb](https://github.com/ratatui/ratatui/commit/9df6cebb58e97ac795868fa0af96a8aaf9c794c0) _(uncategorized)_ Table column calculation uses layout spacing ✨ ([#824](https://github.com/ratatui/ratatui/issues/824)) ```text This uses the new `spacing` feature of the `Layout` struct to allocate columns spacing in the `Table` widget. This changes the behavior of the table column layout in the following ways: 1. Selection width is always allocated. - if a user does not want a selection width ever they should use `HighlightSpacing::Never` 2. Column spacing is prioritized over other constraints - if a user does not want column spacing, they should use `Table::new(...).column_spacing(0)` --------- ``` - [f299463](https://github.com/ratatui/ratatui/commit/f299463847e8aa4b61619e5a5c02c5855d8fdb7b) _(uncategorized)_ Add one eighth wide and tall border sets ✨ ([#831](https://github.com/ratatui/ratatui/issues/831)) ````text This PR adds the [`McGugan`](https://www.willmcgugan.com/blog/tech/post/ceo-just-wants-to-draw-boxes/) border set, which allows for tighter borders. For example, with the `flex` example you can get this effect (top is mcgugan wide, bottom is mcgugan tall): image image As of this PR, `MCGUGAN_WIDE` has to be styled manually, like so: ```rust let main_color = color_for_constraint(*constraint); let cell = buf.get_mut(block.x, block.y + 1); cell.set_style(Style::reset().fg(main_color).reversed()); let cell = buf.get_mut(block.x, block.y + 2); cell.set_style(Style::reset().fg(main_color).reversed()); let cell = buf.get_mut(block.x + block.width.saturating_sub(1), block.y + 1); cell.set_style(Style::reset().fg(main_color).reversed()); let cell = buf.get_mut(block.x + block.width.saturating_sub(1), block.y + 2); cell.set_style(Style::reset().fg(main_color).reversed()); ``` `MCGUGAN_TALL` has to be styled manually, like so: ```rust let main_color = color_for_constraint(*constraint); for x in block.x + 1..(block.x + block.width).saturating_sub(1) { let cell = buf.get_mut(x, block.y); cell.set_style(Style::reset().fg(main_color).reversed()); let cell = buf.get_mut(x, block.y + block.height - 1); cell.set_style(Style::reset().fg(main_color).reversed()); } ``` ```` - [ae6a2b0](https://github.com/ratatui/ratatui/commit/ae6a2b0007ee7195de14d36420e2e30853fbb2f4) _(uncategorized)_ Add spacing feature to flex example ✨ ([#830](https://github.com/ratatui/ratatui/issues/830)) ```text This adds the `spacing` using `+` and `-` to the flex example ``` - [cddf4b2](https://github.com/ratatui/ratatui/commit/cddf4b2930f573fafad64a4ddd7fe5753f7540e2) _(uncategorized)_ Implement Display for Text, Line, Span ([#826](https://github.com/ratatui/ratatui/issues/826)) Issue: This PR adds: `std::fmt::Display` for `Text`, `Line`, and `Span` structs. Display implementation displays actual content while ignoring style. - [5131c81](https://github.com/ratatui/ratatui/commit/5131c813ce5de078be0458c9a067bca2d6b38921) _(uncategorized)_ Add layout spacing ✨ ([#821](https://github.com/ratatui/ratatui/issues/821)) ```text This adds a `spacing` feature for layouts. Spacing can be added between items of a layout. ``` - [de97a1f](https://github.com/ratatui/ratatui/commit/de97a1f1da4fd146034f7c8f20264f4d558cc1a0) _(uncategorized)_ Add flex to layout ✨ ```text This PR adds a new way to space elements in a `Layout`. Loosely based on [flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/), this PR adds a `Flex` enum with the following variants: - Start - Center - End - SpaceAround - SpaceBetween image It also adds two more variants, to make this backward compatible and to make it replace `SegmentSize`: - StretchLast (default in the `Flex` enum, also behavior matches old default `SegmentSize::LastTakesRemainder`) - Stretch (behavior matches `SegmentSize::EvenDistribution`) The `Start` variant from above matches `SegmentSize::None`. This allows `Flex` to be a complete replacement for `SegmentSize`, hence this PR also deprecates the `segment_size` constructor on `Layout`. `SegmentSize` is still used in `Table` but under the hood `segment_size` maps to `Flex` with all tests passing unchanged. I also put together a simple example for `Flex` layouts so that I could test it visually, shared below: ``` - [9a3815b](https://github.com/ratatui/ratatui/commit/9a3815b66d8b6e4ff9f6475666f5742701e256bb) _(uncategorized)_ Add Constraint::Fixed and Constraint::Proportional ✨ ([#783](https://github.com/ratatui/ratatui/issues/783)) - [425a651](https://github.com/ratatui/ratatui/commit/425a65140b61695169c996784974488ad2fd16ea) _(uncategorized)_ Add comprehensive tests for Length interacting with other constraints ✨ ([#802](https://github.com/ratatui/ratatui/issues/802)) - [c50ff08](https://github.com/ratatui/ratatui/commit/c50ff08a630ae59c9aac10f69fe3ce67c2db449c) _(uncategorized)_ Add frame count ✨ ([#766](https://github.com/ratatui/ratatui/issues/766)) - [8f56fab](https://github.com/ratatui/ratatui/commit/8f56fabcdd34cb3938736f3302902a7fead64ee5) _(uncategorized)_ Accept Color and Modifier for all Styles ([#720](https://github.com/ratatui/ratatui/issues/720)) [**breaking**] ````text * feat: accept Color and Modifier for all Styles All style related methods now accept `S: Into