diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f8a6aca..76ba2a5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5124 +1,5433 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -## [0.26.2](https://github.com/ratatui-org/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-org/ratatui/commit/11b452d56fe590188ee7a53fa2dde95513b1a4c7) - *(layout)* Mark various functions as const by @EdJoPaTo in [#951](https://github.com/ratatui-org/ratatui/pull/951) - -- [1cff511](https://github.com/ratatui-org/ratatui/commit/1cff51193466f5a94d202b6233d56889eccf6d7b) - *(line)* Impl Styled for Line by @joshka in [#968](https://github.com/ratatui-org/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-org/ratatui/commit/654949bb00b4522130642f9ad50ab4d9095d921b) - *(list)* Add Scroll Padding to Lists by @CameronBarnes in [#958](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/pull/955 - -- [26af650](https://github.com/ratatui-org/ratatui/commit/26af65043ee9f165459dec228d12eaeed9997d92) - *(text)* Add push methods for text and line by @joshka in [#998](https://github.com/ratatui-org/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-org/ratatui/commit/b5bdde079e0e1eda98b9b1bbbba011b770e5b167) - *(text)* Add `FromIterator` impls for `Line` and `Text` by @joshka in [#967](https://github.com/ratatui-org/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-org/ratatui/commit/12f67e810fad0f907546408192a2380b590ff7bd) - *(uncategorized)* Impl Widget for `&str` and `String` by @kdheepak in [#952](https://github.com/ratatui-org/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-org/ratatui/commit/02071607848c51250b4663722c52e19c8ce1c5e2) - *(line)* Line truncation respects alignment by @TadoTheMiner in [#987](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/issues/932 - -- [c56f49b](https://github.com/ratatui-org/ratatui/commit/c56f49b9fb1c7f1c8c97749119e85f81882ca9a9) - *(list)* Saturating_sub to fix highlight_symbol overflow by @mrjackwills in [#949](https://github.com/ratatui-org/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-org/ratatui/commit/b7778e5cd15d0d4b28f7bbb8b3c62950748e333a) - *(paragraph)* Unit test typo by @joshka in [#1022](https://github.com/ratatui-org/ratatui/pull/1022) - -- [943c043](https://github.com/ratatui-org/ratatui/commit/943c0431d968a82b23a2f31527f32e57f86f8a7c) - *(scrollbar)* Dont render on 0 length track by @EdJoPaTo in [#964](https://github.com/ratatui-org/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-org/ratatui/commit/742a5ead066bec14047f6ab7ffa3ac8307eea715) - *(text)* Fix panic when rendering out of bounds by @joshka in [#997](https://github.com/ratatui-org/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-org/ratatui/commit/f6c4e447e65fe10f4fc7fcc9e9c4312acad41096) - *(uncategorized)* Ensure that paragraph correctly renders styled text by @joshka in [#992](https://github.com/ratatui-org/ratatui/pull/992) - - ````text - Paragraph was ignoring the new `Text::style` field added in 0.26.0 - ```` - - Fixes:https://github.com/ratatui-org/ratatui/issues/990 - -- [35e971f](https://github.com/ratatui-org/ratatui/commit/35e971f7ebb0deadc613b561b15511abd48bdb54) - *(uncategorized)* Scrollbar thumb not visible on long lists by @ThomasMiz in [#959](https://github.com/ratatui-org/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-org/ratatui/commit/6fd5f631bbd58156d9fcae196040bb0248097819) - *(lint)* Prefer idiomatic for loops by @EdJoPaTo - -- [37b957c](https://github.com/ratatui-org/ratatui/commit/37b957c7e167a7ecda07b8a60cee5de71efcc55e) - *(lints)* Add lints to scrollbar by @EdJoPaTo - -- [c12bcfe](https://github.com/ratatui-org/ratatui/commit/c12bcfefa26529610886040bd96f2b6762436b15) - *(non-src)* Apply pedantic lints by @EdJoPaTo in [#976](https://github.com/ratatui-org/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 its mostly independent and would only clutter up the - diff of #974 even more. - - Also see - https://github.com/ratatui-org/ratatui/pull/974#discussion_r1506458743 - - --------- - ```` - -- [8719608](https://github.com/ratatui-org/ratatui/commit/8719608bdaf32ba92bdfdd60569cf73f7070a618) - *(span)* Rename to_aligned_line into into_aligned_line by @EdJoPaTo in [#993](https://github.com/ratatui-org/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-org/ratatui/commit/b831c5688c6f1fbfa6ae2bcd70d803a54fcf0196) - *(widget-ref)* Clippy::needless_pass_by_value by @EdJoPaTo - -- [359204c](https://github.com/ratatui-org/ratatui/commit/359204c9298cc26ea21807d886d596de0329bacc) - *(uncategorized)* Simplify to io::Result by @EdJoPaTo in [#1016](https://github.com/ratatui-org/ratatui/pull/1016) - - ````text - Simplifies the code, logic stays exactly the same. - ```` - -- [8e68db9](https://github.com/ratatui-org/ratatui/commit/8e68db9e2f57fcbf7cb5140006bbbd4dd80bf907) - *(uncategorized)* Remove pointless default on internal structs by @EdJoPaTo in [#980](https://github.com/ratatui-org/ratatui/pull/980) - +# Changelog + +All notable changes to this project will be documented in this file. + +## [0.26.3](https://github.com/ratatui-org/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-org/ratatui/commit/97ee102f179eed4f309d575495f0e4c8359b4f04) *(buffer)* Track_caller for index_of by @EdJoPaTo in [#1046](https://github.com/ratatui-org/ratatui/pull/1046) +** + ````text + The caller put in the wrong x/y -> the caller is the cause. + ```` + +- [bf09234](https://github.com/ratatui-org/ratatui/commit/bf0923473c5cb7f2cff24b010f0072b5ce2f8cf2) *(table)* Make TableState::new const by @EdJoPaTo in [#1040](https://github.com/ratatui-org/ratatui/pull/1040) + +- [eb281df](https://github.com/ratatui-org/ratatui/commit/eb281df97482c2aab66875dc27a49a316a4d7fd7) *(uncategorized)* Use inner Display implementation by @EdJoPaTo in [#1097](https://github.com/ratatui-org/ratatui/pull/1097) + +- [ec763af](https://github.com/ratatui-org/ratatui/commit/ec763af8512df731799c8f30c38c37252068a4c4) *(uncategorized)* Make Stylize's `.bg(color)` generic by @kdheepak in [#1099](https://github.com/ratatui-org/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-org/ratatui/commit/4d1784f2de104b88e998216addaae96ab018f44f) *(uncategorized)* Re-export ParseColorError as style::ParseColorError by @joshka in [#1086](https://github.com/ratatui-org/ratatui/pull/1086) + + Fixes:https://github.com/ratatui-org/ratatui/issues/1085 + +### Bug Fixes + +- [366cbae](https://github.com/ratatui-org/ratatui/commit/366cbae09fb2bf5b5d7f489de1ff15f930569f05) *(buffer)* Fix Debug panic and fix formatting of overridden parts by @EdJoPaTo in [#1098](https://github.com/ratatui-org/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-org/ratatui/commit/43927595012254b33a3901e0d2e5d28164ad04f0) *(examples)* Changed user_input example to work with multi-byte unicode chars by @OkieOth in [#1069](https://github.com/ratatui-org/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-org/ratatui/commit/20fc0ddfca97a863c9ec7537bcf283d3d49baab4) *(examples)* Fix key handling in constraints by @psobolik in [#1066](https://github.com/ratatui-org/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-org/ratatui/commit/f4637d40c35e068fd60d17c9a42b9114667c9861) *(reflow)* Allow wrapping at zero width whitespace by @kxxt in [#1074](https://github.com/ratatui-org/ratatui/pull/1074) + +- [699c2d7](https://github.com/ratatui-org/ratatui/commit/699c2d7c8d0e8c2023cf75350b66535a7b48a102) *(uncategorized)* Unicode truncation bug by @joshka in [#1089](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/issues/1032 + +- [b30411d](https://github.com/ratatui-org/ratatui/commit/b30411d1c71cb7b43b7232226514caa54a56c25f) *(uncategorized)* Termwiz underline color test by @joshka in [#1094](https://github.com/ratatui-org/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-org/ratatui/commit/5f1e119563043e97e5c2c5e7dd48ccd75e17791e) *(uncategorized)* Correct feature flag typo for termwiz by @joshka in [#1088](https://github.com/ratatui-org/ratatui/pull/1088) + + ````text + underline-color was incorrectly spelt as underline_color + ```` + +- [0a16496](https://github.com/ratatui-org/ratatui/commit/0a164965ea2b163433871717cee4fd774a23ee5a) *(uncategorized)* Use `to_string` to serialize Color by @SleepySwords in [#934](https://github.com/ratatui-org/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-org/ratatui/commit/2cfe82a47eb34baa25f474db7be364de7b95374a) *(buffer)* Deprecate assert_buffer_eq! in favor of assert_eq! by @EdJoPaTo in [#1007](https://github.com/ratatui-org/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-org/ratatui/commit/baedc39494ea70292b1d247934420a20d0544b7e) *(buffer)* Simplify set_stringn logic by @EdJoPaTo in [#1083](https://github.com/ratatui-org/ratatui/pull/1083) + +- [9bd89c2](https://github.com/ratatui-org/ratatui/commit/9bd89c218afb1f3999dce1bfe6edea5b7442966d) *(clippy)* Enable breaking lint checks by @EdJoPaTo in [#988](https://github.com/ratatui-org/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-org/ratatui/commit/bef5bcf750375a78b11ae06f217091b2463e842f) *(example)* Remove pointless new method by @EdJoPaTo in [#1038](https://github.com/ratatui-org/ratatui/pull/1038) + + ````text + Use `App::default()` directly. + ```` + +- [f3172c5](https://github.com/ratatui-org/ratatui/commit/f3172c59d4dae6ce4909251976a39c21d88f1907) *(gauge)* Fix internal typo by @EdJoPaTo in [#1048](https://github.com/ratatui-org/ratatui/pull/1048) + +### Documentation + +- [da1ade7](https://github.com/ratatui-org/ratatui/commit/da1ade7b2e4d8909ea0001483780d2c907349fd6) *(github)* Update code owners about past maintainers by @orhun in [#1073](https://github.com/ratatui-org/ratatui/pull/1073) + + ````text + As per suggestion in + https://github.com/ratatui-org/ratatui/pull/1067#issuecomment-2079766990 + + It's good for historical purposes! + ```` + +- [3687f78](https://github.com/ratatui-org/ratatui/commit/3687f78f6a06bd175eda3e19819f6dc68012fb59) *(github)* Update code owners by @orhun in [#1067](https://github.com/ratatui-org/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-org/ratatui/commit/839cca20bf3f109352ea43f1119e13c879e04b95) *(table)* Fix typo in docs for highlight_symbol by @kdheepak in [#1108](https://github.com/ratatui-org/ratatui/pull/1108) + +- [f945a0b](https://github.com/ratatui-org/ratatui/commit/f945a0bcff644c1fa2ad3caaa87cf2b640beaf46) *(test)* Fix typo in TestBackend documentation by @orhun in [#1107](https://github.com/ratatui-org/ratatui/pull/1107) + +- [828d17a](https://github.com/ratatui-org/ratatui/commit/828d17a3f5f449255d7981bb462bf48382c7cb2e) *(uncategorized)* Add minimal example by @joshka in [#1114](https://github.com/ratatui-org/ratatui/pull/1114) + +- [e95230b](https://github.com/ratatui-org/ratatui/commit/e95230beda9f86dfb7a9bc1c1167e5a91a2748c3) *(uncategorized)* Add note about scrollbar state content length by @Utagai in [#1077](https://github.com/ratatui-org/ratatui/pull/1077) + +### Performance + +- [366c2a0](https://github.com/ratatui-org/ratatui/commit/366c2a0e6d17810b26ba37918e72c2f784176d2c) *(block)* Use Block::bordered by @EdJoPaTo in [#1041](https://github.com/ratatui-org/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-org/ratatui/commit/2e71c1874e2de6d9f2bd21622246e55484a9fc62) *(buffer)* Simplify Buffer::filled with macro by @EdJoPaTo in [#1036](https://github.com/ratatui-org/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-org/ratatui/commit/81b96338ea41f9e5fbb0868808a0b450f31eef41) *(calendar)* Use const fn by @EdJoPaTo in [#1039](https://github.com/ratatui-org/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-org/ratatui/commit/c442dfd1ad4896e7abeeaac1754b94bae1f8d014) *(canvas)* Change map data to const instead of static by @EdJoPaTo in [#1037](https://github.com/ratatui-org/ratatui/pull/1037) + +- [1706b0a](https://github.com/ratatui-org/ratatui/commit/1706b0a3e434c51dfed9af88470f47162b615c33) *(crossterm)* Speed up combined fg and bg color changes by up to 20% by @joshka in [#1072](https://github.com/ratatui-org/ratatui/pull/1072) + +- [1a4bb1c](https://github.com/ratatui-org/ratatui/commit/1a4bb1cbb8dc98ab3c9ecfce225a591b0f7a36bc) *(layout)* Avoid allocating memory when using split ergonomic utils by @tranzystorekk in [#1105](https://github.com/ratatui-org/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-org/ratatui/commit/aa4260f92c869ed77123fab700f9f20b059bbe07) *(uncategorized)* Use std::fmt instead of importing Debug and Display by @joshka in [#1087](https://github.com/ratatui-org/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-org/ratatui/pull/1083#discussion_r1588466060) + ```` + +### Testing + +- [3cc29bd](https://github.com/ratatui-org/ratatui/commit/3cc29bdada096283f1fa89d0a610fa6fd5425f9b) *(block)* Use rstest to simplify test cases by @EdJoPaTo in [#1095](https://github.com/ratatui-org/ratatui/pull/1095) + +### Miscellaneous Tasks + +- [5fbb77a](https://github.com/ratatui-org/ratatui/commit/5fbb77ad205ccff763d71899c2f5a34560d25b92) *(readme)* Use terminal theme for badges by @TadoTheMiner in [#1026](https://github.com/ratatui-org/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-org/ratatui/commit/bef2bc1e7c012ecbf357ac54a5262304646b292d) *(cargo)* Add homepage to Cargo.toml by @joshka in [#1080](https://github.com/ratatui-org/ratatui/pull/1080) + +- [76e5fe5](https://github.com/ratatui-org/ratatui/commit/76e5fe5a9a1934aa7cce8f0d48c1c9035ac0bf41) *(uncategorized)* Revert "Make Stylize's `.bg(color)` generic" by @kdheepak in [#1102](https://github.com/ratatui-org/ratatui/pull/1102) + + ````text + This reverts commit ec763af8512df731799c8f30c38c37252068a4c4 from #1099 + ```` + +- [64eb391](https://github.com/ratatui-org/ratatui/commit/64eb3913a4776db290baeb4179e00d2686d42934) *(uncategorized)* Fixup cargo lint for windows targets by @joshka in [#1071](https://github.com/ratatui-org/ratatui/pull/1071) + + ````text + Crossterm brings in multiple versions of the same dep + ```` + +- [326a461](https://github.com/ratatui-org/ratatui/commit/326a461f9a345ba853d57afefc8d77ba0b0b5a14) *(uncategorized)* Add package categories field by @mcskware in [#1035](https://github.com/ratatui-org/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-org/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-org/ratatui/commit/4955380932ab4d657be15dd6c65f48334795c785) *(uncategorized)* Remove pre-push hooks by @joshka in [#1115](https://github.com/ratatui-org/ratatui/pull/1115) + +- [28e81c0](https://github.com/ratatui-org/ratatui/commit/28e81c0714d55f0103d9f075609bcf7e5f551fb1) *(uncategorized)* Add underline-color to all features flag in makefile by @joshka in [#1100](https://github.com/ratatui-org/ratatui/pull/1100) + +- [c75aa19](https://github.com/ratatui-org/ratatui/commit/c75aa1990f5c1e7e86de0fafc9ce0c1b1dcac3ea) *(uncategorized)* Add clippy::cargo lint by @joshka in [#1053](https://github.com/ratatui-org/ratatui/pull/1053) + + ````text + Followup to https://github.com/ratatui-org/ratatui/pull/1035 and + https://github.com/ratatui-org/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-org/ratatui/pull/1077) +* @kxxt made their first contribution in [#1074](https://github.com/ratatui-org/ratatui/pull/1074) +* @OkieOth made their first contribution in [#1069](https://github.com/ratatui-org/ratatui/pull/1069) +* @psobolik made their first contribution in [#1066](https://github.com/ratatui-org/ratatui/pull/1066) +* @SleepySwords made their first contribution in [#934](https://github.com/ratatui-org/ratatui/pull/934) +* @mcskware made their first contribution in [#1035](https://github.com/ratatui-org/ratatui/pull/1035) + +**Full Changelog**: https://github.com/ratatui-org/ratatui/compare/v0.26.2...v0.26.3 + +## [0.26.2](https://github.com/ratatui-org/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-org/ratatui/commit/11b452d56fe590188ee7a53fa2dde95513b1a4c7) + *(layout)* Mark various functions as const by @EdJoPaTo in [#951](https://github.com/ratatui-org/ratatui/pull/951) + +- [1cff511](https://github.com/ratatui-org/ratatui/commit/1cff51193466f5a94d202b6233d56889eccf6d7b) + *(line)* Impl Styled for Line by @joshka in [#968](https://github.com/ratatui-org/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-org/ratatui/commit/654949bb00b4522130642f9ad50ab4d9095d921b) + *(list)* Add Scroll Padding to Lists by @CameronBarnes in [#958](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/pull/955 + +- [26af650](https://github.com/ratatui-org/ratatui/commit/26af65043ee9f165459dec228d12eaeed9997d92) + *(text)* Add push methods for text and line by @joshka in [#998](https://github.com/ratatui-org/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-org/ratatui/commit/b5bdde079e0e1eda98b9b1bbbba011b770e5b167) + *(text)* Add `FromIterator` impls for `Line` and `Text` by @joshka in [#967](https://github.com/ratatui-org/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-org/ratatui/commit/12f67e810fad0f907546408192a2380b590ff7bd) + *(uncategorized)* Impl Widget for `&str` and `String` by @kdheepak in [#952](https://github.com/ratatui-org/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-org/ratatui/commit/02071607848c51250b4663722c52e19c8ce1c5e2) + *(line)* Line truncation respects alignment by @TadoTheMiner in [#987](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/issues/932 + +- [c56f49b](https://github.com/ratatui-org/ratatui/commit/c56f49b9fb1c7f1c8c97749119e85f81882ca9a9) + *(list)* Saturating_sub to fix highlight_symbol overflow by @mrjackwills in [#949](https://github.com/ratatui-org/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-org/ratatui/commit/b7778e5cd15d0d4b28f7bbb8b3c62950748e333a) + *(paragraph)* Unit test typo by @joshka in [#1022](https://github.com/ratatui-org/ratatui/pull/1022) + +- [943c043](https://github.com/ratatui-org/ratatui/commit/943c0431d968a82b23a2f31527f32e57f86f8a7c) + *(scrollbar)* Dont render on 0 length track by @EdJoPaTo in [#964](https://github.com/ratatui-org/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-org/ratatui/commit/742a5ead066bec14047f6ab7ffa3ac8307eea715) + *(text)* Fix panic when rendering out of bounds by @joshka in [#997](https://github.com/ratatui-org/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-org/ratatui/commit/f6c4e447e65fe10f4fc7fcc9e9c4312acad41096) + *(uncategorized)* Ensure that paragraph correctly renders styled text by @joshka in [#992](https://github.com/ratatui-org/ratatui/pull/992) + + ````text + Paragraph was ignoring the new `Text::style` field added in 0.26.0 + ```` + + Fixes:https://github.com/ratatui-org/ratatui/issues/990 + +- [35e971f](https://github.com/ratatui-org/ratatui/commit/35e971f7ebb0deadc613b561b15511abd48bdb54) + *(uncategorized)* Scrollbar thumb not visible on long lists by @ThomasMiz in [#959](https://github.com/ratatui-org/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-org/ratatui/commit/6fd5f631bbd58156d9fcae196040bb0248097819) + *(lint)* Prefer idiomatic for loops by @EdJoPaTo + +- [37b957c](https://github.com/ratatui-org/ratatui/commit/37b957c7e167a7ecda07b8a60cee5de71efcc55e) + *(lints)* Add lints to scrollbar by @EdJoPaTo + +- [c12bcfe](https://github.com/ratatui-org/ratatui/commit/c12bcfefa26529610886040bd96f2b6762436b15) + *(non-src)* Apply pedantic lints by @EdJoPaTo in [#976](https://github.com/ratatui-org/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 its mostly independent and would only clutter up the + diff of #974 even more. + + Also see + https://github.com/ratatui-org/ratatui/pull/974#discussion_r1506458743 + + --------- + ```` + +- [8719608](https://github.com/ratatui-org/ratatui/commit/8719608bdaf32ba92bdfdd60569cf73f7070a618) + *(span)* Rename to_aligned_line into into_aligned_line by @EdJoPaTo in [#993](https://github.com/ratatui-org/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-org/ratatui/commit/b831c5688c6f1fbfa6ae2bcd70d803a54fcf0196) + *(widget-ref)* Clippy::needless_pass_by_value by @EdJoPaTo + +- [359204c](https://github.com/ratatui-org/ratatui/commit/359204c9298cc26ea21807d886d596de0329bacc) + *(uncategorized)* Simplify to io::Result by @EdJoPaTo in [#1016](https://github.com/ratatui-org/ratatui/pull/1016) + + ````text + Simplifies the code, logic stays exactly the same. + ```` + +- [8e68db9](https://github.com/ratatui-org/ratatui/commit/8e68db9e2f57fcbf7cb5140006bbbd4dd80bf907) + *(uncategorized)* Remove pointless default on internal structs by @EdJoPaTo in [#980](https://github.com/ratatui-org/ratatui/pull/980) + See #978 Also remove other derives. They are unused and just slow down -compilation. - -- [3be189e](https://github.com/ratatui-org/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-org/ratatui/commit/5c4efacd1d70bb295d90ffaa73853dc206c187fb) - *(uncategorized)* Clippy::map_err_ignore by @EdJoPaTo - -- [bbb6d65](https://github.com/ratatui-org/ratatui/commit/bbb6d65e063df9a74ab6487b2216183c1fdd7230) - *(uncategorized)* Clippy::else_if_without_else by @EdJoPaTo - -- [fdb14dc](https://github.com/ratatui-org/ratatui/commit/fdb14dc7cd69788e2ed20709e767f7631b11ffa2) - *(uncategorized)* Clippy::redundant_type_annotations by @EdJoPaTo - -- [9b3b23a](https://github.com/ratatui-org/ratatui/commit/9b3b23ac14518a1ef23065d4a5da0fb047b18213) - *(uncategorized)* Remove literal suffix by @EdJoPaTo - - ````text - its not needed and can just be assumed - ```` - - related:clippy::(un)separated_literal_suffix - -- [58b6e0b](https://github.com/ratatui-org/ratatui/commit/58b6e0be0f4db3d90005e130e4b84cd865179785) - *(uncategorized)* Clippy::should_panic_without_expect by @EdJoPaTo - -- [c870a41](https://github.com/ratatui-org/ratatui/commit/c870a41057ac0c14c2e72e762b37689dc32e7b23) - *(uncategorized)* Clippy::many_single_char_names by @EdJoPaTo - -- [a6036ad](https://github.com/ratatui-org/ratatui/commit/a6036ad78911653407f607f5efa556a055d3dce9) - *(uncategorized)* Clippy::similar_names by @EdJoPaTo - -- [060d26b](https://github.com/ratatui-org/ratatui/commit/060d26b6dc6e1027dbf46ae98b0ebba83701f941) - *(uncategorized)* Clippy::match_same_arms by @EdJoPaTo - -- [fcbea9e](https://github.com/ratatui-org/ratatui/commit/fcbea9ee68591344a29a7b2e83f1c8c878857aeb) - *(uncategorized)* Clippy::uninlined_format_args by @EdJoPaTo - -- [14b24e7](https://github.com/ratatui-org/ratatui/commit/14b24e75858af48f39d5880e7f6c9adeac1b1da9) - *(uncategorized)* Clippy::if_not_else by @EdJoPaTo - -- [5ed1f43](https://github.com/ratatui-org/ratatui/commit/5ed1f43c627053f25d9ee711677ebec6cb8fcd85) - *(uncategorized)* Clippy::redundant_closure_for_method_calls by @EdJoPaTo - -- [c8c7924](https://github.com/ratatui-org/ratatui/commit/c8c7924e0ca84351f5ed5c54e79611ce16d4dc37) - *(uncategorized)* Clippy::too_many_lines by @EdJoPaTo - -- [e3afe7c](https://github.com/ratatui-org/ratatui/commit/e3afe7c8a14c1cffd7de50782a7acf0f95f41673) - *(uncategorized)* Clippy::unreadable_literal by @EdJoPaTo - -- [a1f54de](https://github.com/ratatui-org/ratatui/commit/a1f54de7d60fa6c57be29bf8f02a675e58b7b9c2) - *(uncategorized)* Clippy::bool_to_int_with_if by @EdJoPaTo - -- [b8ea190](https://github.com/ratatui-org/ratatui/commit/b8ea190bf2cde8c18e2ac8276d2eb57d219db263) - *(uncategorized)* Clippy::cast_lossless by @EdJoPaTo - -- [0de5238](https://github.com/ratatui-org/ratatui/commit/0de5238ed3613f2d663f5e9628ca7b2aa205ed02) - *(uncategorized)* Dead_code by @EdJoPaTo - - ````text - enabled by default, only detected by nightly yet - ```` - -- [df5dddf](https://github.com/ratatui-org/ratatui/commit/df5dddfbc9c679d15a5a90ea79bb1f8946d5cb9c) - *(uncategorized)* Unused_imports by @EdJoPaTo - - ````text - enabled by default, only detected on nightly yet - ```` - -- [f1398ae](https://github.com/ratatui-org/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-org/ratatui/commit/525848ff4e066526d402fecf1d5b9c63cff1f22a) - *(uncategorized)* Manually apply clippy::use_self for impl with lifetimes by @EdJoPaTo - -- [660c718](https://github.com/ratatui-org/ratatui/commit/660c7183c7a10dc453d80dfb651d9534536960b9) - *(uncategorized)* Clippy::empty_line_after_doc_comments by @EdJoPaTo - -- [ab951fa](https://github.com/ratatui-org/ratatui/commit/ab951fae8166c9321728ba942b48552dfe4d9c55) - *(uncategorized)* Clippy::return_self_not_must_use by @EdJoPaTo - -- [3cd4369](https://github.com/ratatui-org/ratatui/commit/3cd436917649a93b4b80d0c4a0343284e0585522) - *(uncategorized)* Clippy::doc_markdown by @EdJoPaTo - -- [9bc014d](https://github.com/ratatui-org/ratatui/commit/9bc014d7f16efdb70fcd6b6b786fe74eac7b9bdf) - *(uncategorized)* Clippy::items_after_statements by @EdJoPaTo - -- [36a0cd5](https://github.com/ratatui-org/ratatui/commit/36a0cd56e5645533a1d6c2720536fa10a56b0d40) - *(uncategorized)* Clippy::deref_by_slicing by @EdJoPaTo - -- [f7f6692](https://github.com/ratatui-org/ratatui/commit/f7f66928a8833532a3bc97292665640285e7aafa) - *(uncategorized)* Clippy::equatable_if_let by @EdJoPaTo - -- [01418eb](https://github.com/ratatui-org/ratatui/commit/01418eb7c2e1874cb4070828c485d81ea171b18d) - *(uncategorized)* Clippy::default_trait_access by @EdJoPaTo - -- [8536760](https://github.com/ratatui-org/ratatui/commit/8536760e7802a498f7c6d9fe8fb4c7920a1c6e71) - *(uncategorized)* Clippy::inefficient_to_string by @EdJoPaTo - -- [a558b19](https://github.com/ratatui-org/ratatui/commit/a558b19c9a7b90a1ed3f309301f49f0b483e02ec) - *(uncategorized)* Clippy::implicit_clone by @EdJoPaTo - -- [5b00e3a](https://github.com/ratatui-org/ratatui/commit/5b00e3aae98cb5c20c10bec944948a75ac83f956) - *(uncategorized)* Clippy::use_self by @EdJoPaTo - -- [27680c0](https://github.com/ratatui-org/ratatui/commit/27680c05ce1670f026ad23c446ada321c1c755f0) - *(uncategorized)* Clippy::semicolon_if_nothing_returned by @EdJoPaTo - -### Documentation - -- [14461c3](https://github.com/ratatui-org/ratatui/commit/14461c3a3554c95905ebca433fc3d4dae1e1acda) - *(breaking-changes)* Typos and markdownlint by @EdJoPaTo in [#1009](https://github.com/ratatui-org/ratatui/pull/1009) - -- [d0067c8](https://github.com/ratatui-org/ratatui/commit/d0067c8815d5244d319934d58a9366c8ad36b3e5) - *(license)* Update copyright years by @orhun in [#962](https://github.com/ratatui-org/ratatui/pull/962) - -- [88bfb5a](https://github.com/ratatui-org/ratatui/commit/88bfb5a43027cf3410ad560772c5bfdbaa3d58b7) - *(text)* Update Text and Line docs by @joshka in [#969](https://github.com/ratatui-org/ratatui/pull/969) - -- [3b002fd](https://github.com/ratatui-org/ratatui/commit/3b002fdcab964ce3f65f55dc8053d9678ae247a3) - *(uncategorized)* Update incompatible code warning in examples readme by @joshka in [#1013](https://github.com/ratatui-org/ratatui/pull/1013) - -### Performance - -- [e02f476](https://github.com/ratatui-org/ratatui/commit/e02f4768ce2ee30473200fe98e2687e42acb9c33) - *(borders)* Allow border!() in const by @EdJoPaTo in [#977](https://github.com/ratatui-org/ratatui/pull/977) - - ````text - This allows more compiler optimizations when the macro is used. - ```` - -- [541f0f9](https://github.com/ratatui-org/ratatui/commit/541f0f99538762a07d68a71b2989ecc6ff6f71ef) - *(cell)* Use const CompactString::new_inline by @EdJoPaTo in [#979](https://github.com/ratatui-org/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-org/ratatui/commit/65e792375396c3160d76964ef0dfc4fb1e53be41) - *(scrollbar)* Const creation by @EdJoPaTo in [#963](https://github.com/ratatui-org/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-org/ratatui/commit/8195f526cb4b321f337dcbe9e689cc7f6eb84065) - *(uncategorized)* Clippy::needless_pass_by_value by @EdJoPaTo - -- [183c07e](https://github.com/ratatui-org/ratatui/commit/183c07ef436cbb8fb0bec418042b44b4fedd836f) - *(uncategorized)* Clippy::trivially_copy_pass_by_ref by @EdJoPaTo - -- [a13867f](https://github.com/ratatui-org/ratatui/commit/a13867ffceb2f8f57f4540049754c2f916fd3efc) - *(uncategorized)* Clippy::cloned_instead_of_copied by @EdJoPaTo - -- [3834374](https://github.com/ratatui-org/ratatui/commit/3834374652b46c5ddbfedcf8dea2086fd762f884) - *(uncategorized)* Clippy::missing_const_for_fn by @EdJoPaTo - -### Miscellaneous Tasks - -- [125ee92](https://github.com/ratatui-org/ratatui/commit/125ee929ee9009b97a270e2e105a3f1167ab13d7) - *(docs)* Fix: fix typos in crate documentation by @orhun in [#1002](https://github.com/ratatui-org/ratatui/pull/1002) - -- [38c17e0](https://github.com/ratatui-org/ratatui/commit/38c17e091cf3f4de2d196ecdd6a40129019eafc4) - *(editorconfig)* Set and apply some defaults by @EdJoPaTo - -- [07da90a](https://github.com/ratatui-org/ratatui/commit/07da90a7182035b24f870bcbf0a0ffaad75eb48b) - *(funding)* Add eth address for receiving funds from drips.network by @BenJam in [#994](https://github.com/ratatui-org/ratatui/pull/994) - -- [078e97e](https://github.com/ratatui-org/ratatui/commit/078e97e4ff65c02afa7c884914ecd38a6e959b58) - *(github)* Add EdJoPaTo as a maintainer by @orhun in [#986](https://github.com/ratatui-org/ratatui/pull/986) - -- [b0314c5](https://github.com/ratatui-org/ratatui/commit/b0314c5731b32f51f5b6ca71a5194c6d7f265972) - *(uncategorized)* Remove conventional commit check for PR by @Valentin271 in [#950](https://github.com/ratatui-org/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-org/ratatui/commit/6e6ba27a122560bcf47b0efd20b7095f1bfd8714) - *(lint)* Warn on pedantic and allow the rest by @EdJoPaTo - -- [c4ce7e8](https://github.com/ratatui-org/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-org/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-org/ratatui/pull/987) -* @BenJam made their first contribution in [#994](https://github.com/ratatui-org/ratatui/pull/994) -* @CameronBarnes made their first contribution in [#958](https://github.com/ratatui-org/ratatui/pull/958) -* @ThomasMiz made their first contribution in [#959](https://github.com/ratatui-org/ratatui/pull/959) - -**Full Changelog**: https://github.com/ratatui-org/ratatui/compare/v0.26.1...0.26.2 - -## [0.26.1](https://github.com/ratatui-org/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-org/ratatui/commit/74a051147a4059990c31e08d96a8469d8220537b) - *(rect)* Add Rect::positions iterator ([#928](https://github.com/ratatui-org/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-org/ratatui/commit/9182f47026d1630cb749163b6f8b8987474312ae) - *(uncategorized)* Add Block::title_top and Block::title_top_bottom ([#940](https://github.com/ratatui-org/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-org/ratatui/issues/738 - ```` - -### Bug Fixes - -- [2202059](https://github.com/ratatui-org/ratatui/commit/220205925911ed4377358d2a28ffca9373f11bda) - *(block)* Fix crash on empty right aligned title ([#933](https://github.com/ratatui-org/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-org/ratatui/pull/807#discussion_r1455645954 - for another example of this. - ```` - - Fixes: https://github.com/ratatui-org/ratatui/pull/929 - -- [14c67fb](https://github.com/ratatui-org/ratatui/commit/14c67fbb52101d10b2d2e26898c408ab8dd3ec2d) - *(list)* Highlight symbol when using a multi-bytes char ([#924](https://github.com/ratatui-org/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-org/ratatui/commit/0dcdbea083aace6d531c0d505837e0911f400675) - *(paragraph)* Render Line::styled correctly inside a paragraph ([#930](https://github.com/ratatui-org/ratatui/issues/930)) - - ````text - Renders the styled graphemes of the line instead of the contained spans. - ```` - -- [fae5862](https://github.com/ratatui-org/ratatui/commit/fae5862c6e0947ee1488a7e4775413dbead67c8b) - *(uncategorized)* Ensure that buffer::set_line sets the line style ([#926](https://github.com/ratatui-org/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-org/ratatui/commit/fbb5dfaaa903efde0e63114c393dc3063d5f56fd) - *(uncategorized)* Scrollbar rendering when no track symbols are provided ([#911](https://github.com/ratatui-org/ratatui/issues/911)) - -### Refactor - -- [c3fb258](https://github.com/ratatui-org/ratatui/commit/c3fb25898f3e3ffe485ee69631b680679874d2cb) - *(rect)* Move iters to module and add docs ([#927](https://github.com/ratatui-org/ratatui/issues/927)) - -- [e51ca6e](https://github.com/ratatui-org/ratatui/commit/e51ca6e0d2705e6e0a96aeee78f1e80fcaaf34fc) - *(uncategorized)* Finish tidying up table ([#942](https://github.com/ratatui-org/ratatui/issues/942)) - -- [91040c0](https://github.com/ratatui-org/ratatui/commit/91040c0865043b8d5e7387509523a41345ed5af3) - *(uncategorized)* Rearrange block structure ([#939](https://github.com/ratatui-org/ratatui/issues/939)) - -### Documentation - -- [61a8278](https://github.com/ratatui-org/ratatui/commit/61a827821dff2bd733377cfc143266edce1dbeec) - *(canvas)* Add documentation to canvas module ([#913](https://github.com/ratatui-org/ratatui/issues/913)) - - ````text - Document the whole `canvas` module. With this, the whole `widgets` - module is documented. - ```` - -- [d2d91f7](https://github.com/ratatui-org/ratatui/commit/d2d91f754c87458c6d07863eca20f3ea8ae319ce) - *(changelog)* Add sponsors section ([#908](https://github.com/ratatui-org/ratatui/issues/908)) - -- [410d08b](https://github.com/ratatui-org/ratatui/commit/410d08b2b5812d7e29302adc0e8ddf18eb7d1d26) - *(uncategorized)* Add link to FOSDEM 2024 talk ([#944](https://github.com/ratatui-org/ratatui/issues/944)) - -- [1f208ff](https://github.com/ratatui-org/ratatui/commit/1f208ffd0368b4d269854dc0c550686dcd2d1de0) - *(uncategorized)* Add GitHub Sponsors badge ([#943](https://github.com/ratatui-org/ratatui/issues/943)) - -### Performance - -- [0963463](https://github.com/ratatui-org/ratatui/commit/096346350e19c5de9a4d74bba64796997e9f40da) - *(uncategorized)* Use drain instead of remove in chart examples ([#922](https://github.com/ratatui-org/ratatui/issues/922)) - -### Miscellaneous Tasks - -- [a4892ad](https://github.com/ratatui-org/ratatui/commit/a4892ad444739d7a760bc45bbd954e728c66b2d2) - *(uncategorized)* Fix typo in docsrs example ([#946](https://github.com/ratatui-org/ratatui/issues/946)) - -- [18870ce](https://github.com/ratatui-org/ratatui/commit/18870ce99063a492674de061441b2cce5dc54c60) - *(uncategorized)* Fix the method name for setting the Line style ([#947](https://github.com/ratatui-org/ratatui/issues/947)) - -- [8fb4630](https://github.com/ratatui-org/ratatui/commit/8fb46301a00b5d065f9b890496f914d3fdc17495) - *(uncategorized)* Remove github action bot that makes comments nudging commit signing ([#937](https://github.com/ratatui-org/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-org/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-org/ratatui/blob/main/BREAKING-CHANGES.md). - -💖 Consider sponsoring us at ! - -### Features - -- [79ceb9f](https://github.com/ratatui-org/ratatui/commit/79ceb9f7b6ce7d7079fd7a1e1de8b160086206d0) - _(line)_ Add alignment convenience functions ([#856](https://github.com/ratatui-org/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-org/ratatui/commit/0df935473f59d9bcf16ea5092878e59ee129d876) - _(padding)_ Add new constructors for padding ([#828](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/issues/798 - -- [d726e92](https://github.com/ratatui-org/ratatui/commit/d726e928d2004d2a99caeeb00b95ce27dbc04bc0) - _(paragraph)_ Add alignment convenience functions ([#866](https://github.com/ratatui-org/ratatui/issues/866)) - - ```text - Added convenience functions left_aligned(), centered() and - right_aligned() plus unit tests. Updated example code. - ``` - -- [c1ed5c3](https://github.com/ratatui-org/ratatui/commit/c1ed5c3637dc4574612ac2029249ba700e9192b5) - _(span)_ Add alignment functions ([#873](https://github.com/ratatui-org/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-org/ratatui/commit/b80264de877e7ca240cea15716379622d822bc08) - _(text)_ Add alignment convenience functions ([#862](https://github.com/ratatui-org/ratatui/issues/862)) - - ```text - Adds convenience functions `left_aligned()`, `centered()` and - `right_aligned()` plus unit tests. - ``` - -- [23f6938](https://github.com/ratatui-org/ratatui/commit/23f6938498a7c31916a091d5b79c9d95a0575344) - _(block)_ Add `Block::bordered` ([#736](https://github.com/ratatui-org/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-org/ratatui/commit/ffd5fc79fcaf8bfff1a49c55f8d4b503a9e6dfed) - _(color)_ Add Color::from_u32 constructor ([#785](https://github.com/ratatui-org/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-org/ratatui/commit/4f2db82a774a3faea7db9659f30684e9635c24b2) - _(color)_ Use the FromStr implementation for deserialization ([#705](https://github.com/ratatui-org/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-org/ratatui/commit/1cbe1f52abb7ab1cd5bd05030e7857ee1762f44a) - _(constraints)_ Rename `Constraint::Proportional` to `Constraint::Fill` ([#880](https://github.com/ratatui-org/ratatui/issues/880)) - - `Constraint::Fill` is a more intuitive name for the behavior, and it is - shorter. - - Resolves #859 - -- [dfd6db9](https://github.com/ratatui-org/ratatui/commit/dfd6db988faa7a45cbe99b01024c086c4fcf7577) - _(demo2)_ Add destroy mode to celebrate commit 1000! ([#809](https://github.com/ratatui-org/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-org/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-org/ratatui/commit/540fd2df036648674a2f6d37f7b12326d5978bbd) - _(layout)_ Change `Flex::default()` ([#881](https://github.com/ratatui-org/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-org/ratatui/issues/843 - - Thanks to @joshka for the direction - ```` - -- [bbcfa55](https://github.com/ratatui-org/ratatui/commit/bbcfa55a88c1916598ea0442217ac7f6a99ea96f) - _(layout)_ Add Rect::contains method ([#882](https://github.com/ratatui-org/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-org/ratatui/commit/736605ec88aac4877b19dd66ded97b26d933407f) - _(layout)_ Add default impl for Position ([#869](https://github.com/ratatui-org/ratatui/issues/869)) - -- [1e75596](https://github.com/ratatui-org/ratatui/commit/1e755967c53e9a1803cc7fcc46ad0946c78f0eda) - _(layout)_ Increase default cache size to 500 ([#850](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/issues/820 - -- [2819eea](https://github.com/ratatui-org/ratatui/commit/2819eea82bfde48562b830b4ef1c998dacae8b69) - _(layout)_ Add Position struct ([#790](https://github.com/ratatui-org/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-org/ratatui/commit/1561d64c80e6498f90807a1607d84a1405d3e0bb) - _(layout)_ Add Rect -> Size conversion methods ([#789](https://github.com/ratatui-org/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-org/ratatui/commit/f13fd73d9ec108af723a9cd11f4262f2b09c9d25) - _(layout)_ Add `Rect::clamp()` method ([#749](https://github.com/ratatui-org/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-org/ratatui/commit/98bcf1c0a57a340229684345497b2d378979de04) - _(layout)_ Add Rect::split method ([#729](https://github.com/ratatui-org/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-org/ratatui/commit/0494ee52f1f0070f1ccf4532f7301fd59d4a5c10) - _(layout)_ Accept Into for constructors ([#744](https://github.com/ratatui-org/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-org/ratatui/commit/7ab12ed8ce8f6cdb0712d132b4dfc4cccfda08da) - _(layout)_ Add horizontal and vertical constructors ([#728](https://github.com/ratatui-org/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-org/ratatui/commit/4278b4088d2ab1d94aa5d73d7a0c321a46dbd9de) - _(line)_ Implement iterators for Line ([#896](https://github.com/ratatui-org/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-org/ratatui/commit/5d410c6895de49e77c7e0d1884be63d797724448) - _(line)_ Implement Widget for Line ([#715](https://github.com/ratatui-org/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-org/ratatui/commit/c977293f14b019ee520379bf5eaafb44cef04a01) - _(line)_ Add style field, setters and docs ([#708](https://github.com/ratatui-org/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-org/ratatui/commit/bbf2f906fbe7e593fdeb5dd7530d3479788f77a5) - _(rect.rs)_ Implement Rows and Columns iterators in Rect ([#765](https://github.com/ratatui-org/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-org/ratatui/commit/fe06f0c7b06e50cd5d7916dab9ccb5e28f5a6511) - _(serde)_ Support TableState, ListState, and ScrollbarState ([#723](https://github.com/ratatui-org/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-org/ratatui/commit/37c183636b573e7637af5fbab9ae5c6f2d3fec6b) - _(span)_ Implement Widget on Span ([#709](https://github.com/ratatui-org/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-org/ratatui/commit/e1e85aa7af2a7624b12a0ad7f0aa2413b409475d) - _(style)_ Add material design color palette ([#786](https://github.com/ratatui-org/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-org/ratatui/commit/bf678507395a528befcf5c5e3180368cb8f4b826) - _(style)_ Add tailwind color palette ([#787](https://github.com/ratatui-org/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-org/ratatui/commit/27e9216cea7f25fcf172fe0a8f11e7cca222b055) - _(table)_ Remove allow deprecated attribute used previously for segment_size ✨ ([#875](https://github.com/ratatui-org/ratatui/issues/875)) - -- [a489d85](https://github.com/ratatui-org/ratatui/commit/a489d85f2dda561ea18f1431f6e44f0335549eca) - _(table)_ Deprecate SegmentSize on table ([#842](https://github.com/ratatui-org/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-org/ratatui/commit/c69ca47922619332f76488f5d9e70541b496fe1c) - _(table)_ Collect iterator of `Row` into `Table` ([#774](https://github.com/ratatui-org/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-org/ratatui/commit/2faa879658a439d233edc4ac886fb42c17ff971a) - _(table)_ Accept Text for highlight_symbol ([#781](https://github.com/ratatui-org/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-org/ratatui/commit/e64e194b6bc5f89c68fe73d430e63c264af6ca4f) - _(table)_ Implement FromIterator for widgets::Row ([#755](https://github.com/ratatui-org/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-org/ratatui/commit/803a72df27190e273556e089e42036bfc001f003) - _(table)_ Accept Into for widths ([#745](https://github.com/ratatui-org/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-org/ratatui/commit/f025d2bfa26eac11ef5c2a63943a4e177abfc800) - _(table)_ Add Table::footer and Row::top_margin methods ([#722](https://github.com/ratatui-org/ratatui/issues/722)) - - ```text - * feat(table): Add a Table::footer method - ``` - -- [f29c73f](https://github.com/ratatui-org/ratatui/commit/f29c73fb1cf746aea0adfaed4a8b959e0466b830) - _(tabs)_ Accept Iterators of `Line` in constructors ([#776](https://github.com/ratatui-org/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-org/ratatui/commit/b459228e26b9429b8a09084d76251361f7f5bfd3) - _(termwiz)_ Add `From` termwiz style impls ([#726](https://github.com/ratatui-org/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-org/ratatui/commit/9ba7354335a106607fe0670e1205a038ec54aa1b) - _(text)_ Implement iterators for Text ([#900](https://github.com/ratatui-org/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-org/ratatui/commit/68d5783a6912c644b922b7030facff4b1172a434) - _(text)_ Add style and alignment ([#807](https://github.com/ratatui-org/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-org/ratatui/commit/815757fcbbc147050f8ce9418a4e91fd871d011f) - _(widgets)_ Implement Widget for Widget refs ([#833](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/discussions/164 - Replaces PRs: https://github.com/ratatui-org/ratatui/pull/122 and - - https://github.com/ratatui-org/ratatui/pull/16 - - Enables:https://github.com/ratatui-org/ratatui/issues/132 - Validated as a viable working solution by: - - https://github.com/ratatui-org/ratatui/pull/836 - -- [eb79256](https://github.com/ratatui-org/ratatui/commit/eb79256ceea151130c6b80930b51098b9ad43f5b) - _(widgets)_ Collect iterator of `ListItem` into `List` ([#775](https://github.com/ratatui-org/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-org/ratatui/commit/c8dd87918d44fff6d4c3c78e1fc821a3275db1ae) - _(uncategorized)_ Add WidgetRef and StatefulWidgetRef traits ([#903](https://github.com/ratatui-org/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-org/ratatui/commit/87bf1dd9dfb8bf2e6c08c488d4a38dac21e14304) - _(uncategorized)_ Replace Rect::split with Layout::areas and spacers ([#904](https://github.com/ratatui-org/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-org/ratatui/commit/dab08b99b6a2a4c8ced6f780af7a37a0f3c34f6b) - _(uncategorized)_ Show space constrained UIs conditionally ([#895](https://github.com/ratatui-org/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-org/ratatui/commit/2a12f7bddf0b286e63439c2d1fa894dcfbfde6c0) - _(uncategorized)_ Impl Widget for &BarChart ([#897](https://github.com/ratatui-org/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-org/ratatui/commit/9ec43eff1c7a62631fab99e4874ccd15fe7b210a) - _(uncategorized)_ Constraint Explorer example ([#893](https://github.com/ratatui-org/ratatui/issues/893)) - - ```text - Here's a constraint explorer demo put together with @joshka - ``` - - https://github.com/ratatui-org/ratatui/assets/1813121/08d7d8f6-d013-44b4-8331-f4eee3589cce - -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:https://github.com/ratatui-org/ratatui/issues/792 - ---- - -- [4ee4e6d](https://github.com/ratatui-org/ratatui/commit/4ee4e6d78a136b5a1e4942f25b9afe34f7dd5d0c) - _(uncategorized)_ Make spacing work in `Flex::SpaceAround` and `Flex::SpaceBetween` ([#892](https://github.com/ratatui-org/ratatui/issues/892)) - - ```text - This PR implements user provided spacing gaps for `SpaceAround` and - `SpaceBetween`. - ``` - - https://github.com/ratatui-org/ratatui/assets/1813121/2e260708-e8a7-48ef-aec7-9cf84b655e91 - -Now user provided spacing gaps always take priority in all `Flex` modes. - -- [dd5ca3a](https://github.com/ratatui-org/ratatui/commit/dd5ca3a0c83bc1efc281133707eec04864567e69) - _(uncategorized)_ Better weights for constraints ([#889](https://github.com/ratatui-org/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-org/ratatui/commit/aeec16369bdf26dc96af46cc580df191078464ae) - _(uncategorized)_ Change rounding to make tests stable ([#888](https://github.com/ratatui-org/ratatui/issues/888)) - - ```text - This fixes some unstable tests - ``` - -- [be4fdaa](https://github.com/ratatui-org/ratatui/commit/be4fdaa0c7c863daa50c0109cd5f96005365029d) - _(uncategorized)_ Change priority of constraints and add `split_with_spacers` ✨ ([#788](https://github.com/ratatui-org/ratatui/issues/788)) - - ```text - Follow up to https://github.com/ratatui-org/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-org/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-org/ratatui/commit/d7132011f921cb87593914bd7d2e24ac676ec911) - _(uncategorized)_ Add `Color::from_hsl` ✨ ([#772](https://github.com/ratatui-org/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-org/ratatui/commit/405a125c8235b983993e3774361821b67a340aa0) - _(uncategorized)_ Add wide and tall proportional border set ([#848](https://github.com/ratatui-org/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:https://github.com/ratatui-org/ratatui/issues/834 - -- [9df6ceb](https://github.com/ratatui-org/ratatui/commit/9df6cebb58e97ac795868fa0af96a8aaf9c794c0) - _(uncategorized)_ Table column calculation uses layout spacing ✨ ([#824](https://github.com/ratatui-org/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-org/ratatui/commit/f299463847e8aa4b61619e5a5c02c5855d8fdb7b) - _(uncategorized)_ Add one eighth wide and tall border sets ✨ ([#831](https://github.com/ratatui-org/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-org/ratatui/commit/ae6a2b0007ee7195de14d36420e2e30853fbb2f4) - _(uncategorized)_ Add spacing feature to flex example ✨ ([#830](https://github.com/ratatui-org/ratatui/issues/830)) - - ```text - This adds the `spacing` using `+` and `-` to the flex example - ``` - -- [cddf4b2](https://github.com/ratatui-org/ratatui/commit/cddf4b2930f573fafad64a4ddd7fe5753f7540e2) - _(uncategorized)_ Implement Display for Text, Line, Span ([#826](https://github.com/ratatui-org/ratatui/issues/826)) - - Issue:https://github.com/ratatui-org/ratatui/issues/816 - -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-org/ratatui/commit/5131c813ce5de078be0458c9a067bca2d6b38921) - _(uncategorized)_ Add layout spacing ✨ ([#821](https://github.com/ratatui-org/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-org/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: - ``` - - https://github.com/ratatui-org/ratatui/assets/1813121/c8716c59-493f-4631-add5-feecf4bd4e06 - -- [9a3815b](https://github.com/ratatui-org/ratatui/commit/9a3815b66d8b6e4ff9f6475666f5742701e256bb) - _(uncategorized)_ Add Constraint::Fixed and Constraint::Proportional ✨ ([#783](https://github.com/ratatui-org/ratatui/issues/783)) - -- [425a651](https://github.com/ratatui-org/ratatui/commit/425a65140b61695169c996784974488ad2fd16ea) - _(uncategorized)_ Add comprehensive tests for Length interacting with other constraints ✨ ([#802](https://github.com/ratatui-org/ratatui/issues/802)) - -- [c50ff08](https://github.com/ratatui-org/ratatui/commit/c50ff08a630ae59c9aac10f69fe3ce67c2db449c) - _(uncategorized)_ Add frame count ✨ ([#766](https://github.com/ratatui-org/ratatui/issues/766)) - -- [8f56fab](https://github.com/ratatui-org/ratatui/commit/8f56fabcdd34cb3938736f3302902a7fead64ee5) - _(uncategorized)_ Accept Color and Modifier for all Styles ([#720](https://github.com/ratatui-org/ratatui/issues/720)) [**breaking**] - - ````text - * feat: accept Color and Modifier for all Styles - - All style related methods now accept `S: Into