ratatui-termion-v0.1.0
"Rats don't just survive; they discover; they create. ... I mean, just look at what they do with the terminal!" ā Remy & Orhun
We are excited to announce the biggest release of ratatui so far - a Rust library that's all about cooking up TUIs šØāš³š
š Added "no_std" support for embedded targets, modularized architecture, major widget & layout upgrades!
⨠Release highlights: https://ratatui.rs/highlights/v030/
ā ļø List of breaking changes can be found here.
Features
-
90a77aa (direction) Add
Direction::perpendicular(self)by @b-guild in #2197 -
56d5e05 (bar) Update label and text_value to accept Into<> by @Emivvvvv in #1471 [breaking]
BREAKING CHANGE:label and text_value now accept
Into<>types, which breaks type inference.- Bar::default().label("foo".into()); + Bar::default().label("foo");- Bar::default().text_value("bar".into()); + Bar::default().text_value("bar"); -
b76ad3b (bar) Impl Styled for Bar by @Emivvvvv in #1476
Related:https://github.com/ratatui/ratatui/issues/683
-
e15fefa (barchar) Add BarChart::grouped constructor by @joshka in #1513
Add a new constructor to the
BarChartwidget that allows creating a grouped barchart with multiple groups of bars.Also add a new constructor to the
BarGroupwidget that allows creating a group of bars with a label. -
369b18e (barchart) Reduce barchart creation verbosity by @Emivvvvv in #1453
Adds constructor methods for BarChart, BarGroup, and Bar
-
1dc18bf (calendar) Add width and height functions by @joshka in #2198
Fixes https://github.com/ratatui/ratatui/issues/2016
-
f18bcbf (canvas) Add quadrant, sextant and octant markers by @sbarral in #2235 [breaking]
The octant marker is an alternative to the Braille marker with the same resolution, but offering densely packed, regular pseudo-pixels, without visible bands between rows and columns.
Quadrant and Sextants are also added to support 2x2 and 2x3.
Sextant and Octant unicode characters that are less widely supported at the moment, which is why
Braillewas left as the default.BREAKING CHANGE:addition of new variants to
Markerand removal of no longer used constants inratatui::symbols::braille. -
26b05de (chart) Render Braille over Blocks in Charts and Canvas by @j-g00da in #2165
This makes it possible to stack charts, and write text over block symbols in Charts and Canvas while still showing the block symbols behind the text.
-
bf84c62 (core) Add a
has_modifier()method toStyleby @sxyazi in #2267Resolves https://github.com/ratatui/ratatui/issues/2264
-
2d713d7 (crossterm) Allow multiple crossterm versions by @joshka in #1841
This commit introduces feature flags to make it possible for widget library authors to depend on a specific version of crossterm without causing version conflicts. This should make it easier for libraries and apps to update crossterm versions more easily.
The available feature flags are
crossterm_0_28andcrossterm_0_29. By default, the latest version is enabled. If a multiple features are enabled we choose the latest version. We will in general support at least the last two major (0.x) versions of crossterm, and will only remove versions in a major version bump. -
d99984f (layout) Add
Flex::SpaceEvenlyby @kdheepak in #1952 [breaking]Resolves https://github.com/ratatui/ratatui/issues/1951
BREAKING CHANGE:Old
Flex::SpaceAroundbehavior is available by usingFlex::SpaceEvenlyand newFlex::SpaceAroundnow distributes space evenly around each element except the middle spacers are twice the size of first and last elementsWith this change, the following variants of
Flexare supported:Flex::Start: Aligns items to the start; excess space appears at the end.Flex::End: Aligns items to the end; excess space appears at the start.Flex::Center: Centers items with equal space on both sides.Flex::SpaceAround(new): Distributes space around items; space between items is twice the edge spacing.Flex::SpaceBetween: Distributes space evenly between items except no space at the edges.Flex::SpaceEvenly(previouslyFlex::SpaceAround): Distributes space evenly between items and edges.Flex::Legacy: Preserves legacy behavior, placing all excess space at the end.
This aligns behavior of
Flexwith CSS flexbox more closely.The following is a screenshot in action:
<img width="1090" alt="image"
src="https://github.com/user-attachments/assets/2c7cd797-27bd-4242-a824-4565d369227b" />
-
9275d34 (layout) Add Offset::new() constructor by @joshka in #1547
-
7ad9c29 (linegauge) Customized symbols by @sectore in #1601
With this PR any symbol (
&str) can be used to renderfilledandunfilledparts ofLineGaugenow. Before that change, onlysymbols::line::Setwas accepted.Note:New methods are introduced to define those symbols:
filled_symbolandunfilled_symbol. The methodline_setis still there, but marked asdeprecated. -
92a19cb (list) Highlight symbol styling by @airblast-dev in #1595 [breaking]
Allow styling for
List's highlight symbolThis change makes it so anything that implements
Into<Line>can be used as a highlight symbol.BREAKING CHANGE:
List::highlight_symbolcan no longer be used in const contextBREAKING CHANGE:
List::highlight_symbolaccepted&str. Conversion methods that rely on type inference will need to be rewritten as the compiler cannot infer the type.closes:https://github.com/ratatui/ratatui/issues/1443
-
e89a526 (no_std) Portable-atomic integration for targets with no atomic types by @j-g00da in #2076
Improves compatibility with no-std targets that don't support atomic types.
We support three different scenarios depending on the target:
- Terminal applications and other std targets (e.g. espidf):
stdenabled,portable-atomicdisabled
- Embedded targets with atomic types, bare metal x86, etc.:
stddisabledportable-atomicdisabled
- Embedded targets without atomic types (e.g. single-core MCUs):
stddisabled,portable-atomicenabled
Turning on
portable-atomictogether withstdwill fall back tostdatomic. -
1399d95 (no_std) Make palette and serde features depends on std by @j-g00da in #1919
-
b32f781 (no_std) Make
ratatui-macrosno-std by @j-g00da in #1865 -
3e1c72f (no_std) Make ratatui compatible with
#![no_std]by @j-g00da in #1794 [breaking]Resolves #1781
This PR makes it possible to compile ratatui with
#![no_std]. Also makes me answer "We Are So Embedded" to "Are We Embedded Yet?" -
ab48c06 (no_std) Option to disable layout cache for
no_stdcompatibility by @j-g00da in #1795 [breaking]Resolves #1780
BREAKING CHANGE:Disabling
default-featureswill now disable layout cache, which can have a negative impact on performance.Layout::init_cacheandLayout::DEFAULT_CACHE_SIZEare now only available iflayout-cachefeature is enabled. -
09173d1 (no_std) Make
TestBackend::ErrorInfallibleby @j-g00da in #1823 [breaking]BREAKING CHANGE:
TestBackendnow usescore::convert::Infalliblefor error handling instead ofstd::io::Error -
007713e (no_std) Replace
Backend'sio::Errorusages with associatedErrortype by @j-g00da in #1778 [breaking]Resolves #1775
BREAKING CHANGE:Custom backends now have to implement
Backend::ErrorandBackend::clear_region. Additionally some genericBackendusage will have to explicitly set trait bounds forBackend::Error. -
a42a17e (no_std) Make
ratatui-widgetsno_stdby @j-g00da in #1779Resolves #1776
-
5a232a3 (no_std) Remove redundant
stdusages inratatui-widgetsby @j-g00da in #1762 -
ebe10cd (no_std) Remove redundant
stdusages inratatui-coreby @j-g00da in #1753Resolves https://github.com/ratatui/ratatui/issues/1751
-
08b08cc (rect) Centering by @janTatesa in #1814
Resolves #617
-
ff729b7 (scrollbar) Support retrieving the current position of state by @orhun in #1552
As of now it is possible to change the position of the Scrollbar but not possible to retrieve the position for further use. e.g.
let mut state = ScrollbarState::default(); state.next();This commit adds a new method "
current_position" (sincepositionis already taken by the fluent setter) for that purpose:let index = state.get_position(); // yaySee #1545 for the concrete usage of this.
-
4c3c054 (serde) Handle null modifiers in serde Style by @joshka in #2172
Allow
Style'sadd_modifierandsub_modifierfields to deserialize fromnull -
b9da192 (serde) Derive Serialize/Deserialize for alignment enums by @j-g00da in #1957
Resolves #1954
-
89b7421 (serde) Derive Serialize/Deserialize for additional structs/enums by @aurreland in #1883
This PR adds
#[derive(Serialize, Deserialize)]to the following structs:ConstraintDirectionSpacingLayoutAccentedPaletteNonAccentedPalettePalettePaddingBordersBorderTypeListDirectionScrollbarOrientationScrollDirectionRenderDirectionHighlightSpacing
Fixes #1877
-
03f3f6d (style) Allow add/sub modifiers to be omitted in Style serialization. by @rcorre in #2057
It's really useful that Style supports Deserialize, this allows TUI apps to have configurable theming without much extra code.
However, deserializing a style currently fails if
add_modifierandsub_modifierare not specified. That means the following TOML config:[theme.highlight] fg = "white" bg = "black"Will fail to deserialize with "missing field
add_modifier". It should be possible to omit modifiers and have them default to "none". -
ee67347 (symbols) Make
Markernon-exhaustive by @j-g00da in #2236 [breaking]This will allow us to add new markers without causing further breaking changes.
BREAKING CHANGE:
Markeris now non-exhaustive -
985cd05 (symbols) Add dashed borders by @theotchlx in #1573
Adds several new border sets:
- ratatui::symbols::border::LIGHT_DOUBLE_DASHED
- ratatui::symbols::border::HEAVY_DOUBLE_DASHED
- ratatui::symbols::border::LIGHT_TRIPLE_DASHED
- ratatui::symbols::border::HEAVY_TRIPLE_DASHED
- ratatui::symbols::border::LIGHT_QUADRUPLE_DASHED
- ratatui::symbols::border::HEAVY_QUADRUPLE_DASHED
And corresponding variants to the ratatui::widgets::BorderType enum
Fixes:https://github.com/ratatui/ratatui/issues/1355
-
4c301e8 (text) Implement
AddAssignforTextby @acuteenvy in #1956This makes it possible to add a second
Textinstance to a first one using the += operator.let mut text = Text::from("line 1"); text += Text::from("line 2");Style and alignment applied to the second text is ignored (though styles and alignment of lines and spans are copied).
-
ce4856a (widgets) Add the missing constructor to canvas types by @orhun in #1538
Allows constructing
Rectangle,PointsandCircleusing thenewmethod instead of initializing with the public fields directly. -
22610b0 (uncategorized) Support adding an Offset to Position by @joshka in #2239
Adds Position::offset() and arithmentic ops (Position + Offset and Position - Offset)
Fixes:https://github.com/ratatui/ratatui/issues/2018
-
24e3133 (uncategorized) Add Rect::resize() method by @joshka in #2240
Fixes:https://github.com/ratatui/ratatui/issues/1440
-
96d097e (uncategorized) Implement Rect ops for moving by @joshka in #1596
feat:implement Rect ops for moving
Implemented
Add,AddAssign,Sub, andSubAssignonRectforOffset. This makes it possible to move rectslet rect = Rect::new(1, 2, 3, 4); let moved = rect + Offset(1, 2); let moved = rect - Offset(1, 2); let moved = rect + Offset(-1, -2);Additionally Rect, Size, Offset, and Position now all have MIN and MAX consts.
-
e869cb9 (uncategorized) Add Size::area() by @joshka in #2226
Add Size::area() returning u32 to avoid u16 overflow Fixes https://github.com/ratatui/ratatui/issues/2204
-
b6588fd (uncategorized) Implement
From<Size>for(u16, u16)by @0xb002f0 in #2223 -
75b78be (uncategorized) Add width() impl for tabs by @joshka in #2049
The purpose of this is to make it easy for apps to easily calculate the total tab width including all dividers and padding.
-
8188ed3 (uncategorized) Implement UnicodeWidthStr for Text/Line/Span by @joshka in #2030
You can now calculate the width of any Text/Line/Span using the UnicodeWidthStr trait instead of the width method on the type. This also makes it possible to use the width_cjk() method if needed.
-
c845fec (uncategorized) Add conversion from Size to Rect by @joshka in #2028
Rect::from(size)returns a new Rect at the origin (0, 0) with the specifiedSize -
017af11 (uncategorized) Preserve block titles when merging borders by @j-g00da in #1977
Resolves #1939
-
6dcd53b (uncategorized) Add ergonomic methods for layouting Rects by @joshka in #1909
This commit introduces new methods for the
Rectstruct that simplify the process of splitting aRectinto sub-rects according to a givenLayout. By putting these methods on theRectstruct, we make it a bit more natural that a layout is applied to theRectitself, rather than passing aRectto theLayoutstruct to be split.Adds:-
Rect::layoutandRect::try_layoutmethods that allow splitting aRectinto an array of sub-rects according to a givenLayout.Rect::layout_vecmethod that returns aVecof sub-rects.Layout::try_areasmethod that returns an array of sub-rects, with compile-time checks for the number of constraints. This is added mainly for consistency with the newRectmethods.
use ratatui_core::layout::{Layout, Constraint, Rect}; let area = Rect::new(0, 0, 10, 10); let layout = Layout::vertical([Constraint::Fill(1); 2]); // Rect::layout() infers the number of constraints at compile time: let [top, main] = area.layout(&layout); // Rect::try_layout() and Layout::try_areas() do the same, but return a // Result: let [top, main] = area.try_layout(&layout)?; let [top, main] = layout.try_areas(area)?; // Rect::layout_vec() returns a Vec of sub-rects: let areas_vec = area.layout_vec(&layout); // you can also explicitly specify the number of constraints: let areas = area.layout::<2>(&layout); let areas = area.try_layout::<2>(&layout)?; let areas = layout.try_areas::<2>(area)?; -
0c3872f (uncategorized) Add Rect::outer() by @joshka in #1929
Fixes:https://github.com/ratatui/ratatui/issues/211
-
7bc78bc (uncategorized) Add ratatui::run() method by @joshka in #1707
This introduces a new
ratatui::run()method which runs a closure with a terminal initialized with reasonable defaults for most applications. This callsratatui::init()before running the closure andratatui::restore()after the closure completes, and returns the result of the closure.A minimal hello world example using the new
ratatui::run()method:fn main() -> Result<(), Box<dyn std::error::Error>> { ratatui::run(|terminal| { loop { terminal.draw(|frame| frame.render_widget("Hello World!", frame.area()))?; if crossterm::event::read()?.is_key_press() { break Ok(()); } } }) }Of course, this also works both with apps that use free methods and structs:
fn run(terminal: &mut DefaultTerminal) -> Result<(), AppError> { ... } ratatui::run(run)?;struct App { ... } impl App { fn new() -> Self { ... } fn run(mut self, terminal: &mut DefaultTerminal) -> Result<(), AppError> { ... } } ratatui::run(|terminal| App::new().run(terminal))?; -
b6fbfcd (uncategorized) Add lifetime to symbol sets by @joshka in #1935
This makes it possible to create symbol sets at runtime with non-static lifetimes.
Fixes:https://github.com/ratatui/ratatui/issues/1722
-
488e5f0 (uncategorized) Make
border!work without importingBordersby @j-g00da in #1918Currently using
border!macro requires explicit import ofBorderswhich is unnecessary. -
671c2b4 (uncategorized) Support merging the borders of blocks by @j-g00da
When two borders overlap, they will automatically merge into a single, clean border instead of overlapping.
This improves visual clarity and reduces rendering glitches around corners.
For example:
assert_eq!(Cell::new("ā").merge_symbol("ā", MergeStrategy::Exact).symbol(), "ā"); -
702fff5 (uncategorized) Implement stylize methods directly on Style by @joshka in #1572 [breaking]
This makes it possible to create constants using the shorthand methods.
const MY_STYLE: Style = Style::new().blue().on_black();Rather than implementing Styled for Style and then adding extension methods that implement the Stylize shorthands, this implements the methods as const functions directly on Style.
BREAKING CHANGE:
Styleno longer implementsStyled. Any calls to methods implemented by the blanket implementation of Stylize are now defined directly on Style. Remove the Stylize import if it is no longer used by your code.The
reset()method does not have a direct replacement, as it clashes with the existingreset()method. UseStyle::reset()rather thansome_style.reset()Fixes:#1158
-
4fcd238 (uncategorized) Support no-std for calendar widget by @joshka in #1852
Removes the CalendarEventStore::today() function in no-std environments
-
53cdbbc (uncategorized) Enable serde propagation to backend crates (crossterm, termion) by @ArjunKrish7356 in #1812
This PR propagates the serde feature from the main ratatui crate to the ratatui-crossterm and ratatui-termion backend crates. Solves #1805
-
6836a69 (uncategorized) Implement styled for other primitives by @aschey in #1684
-
fcb47d6 (uncategorized) Rename Alignment to HorizontalAlignment and add VerticalAlignment by @joshka in #1735 [breaking]
We don't anticipate removing or deprecating the type alias in the near future, but it is recommended to update your imports to use the new name.
Added a VerticalAlignment enum to make the API more consistent. We don't have a specific use case for it yet, but it's better to add it now and be able to use it in the future.
BREAKING-CHANGE:The
Alignmentenum has been renamed toHorizontalAlignmentto better reflect its purpose. A type alias has been added to maintain backwards compatibility, however there are some cases where type aliases are not enough to maintain backwards compatibility. E.g. when using glob imports to import all the enum variants. This should not affect most users, but it is recommended to update your imports to use the new name.- use ratatui::layout::Alignment; + use ratatui::layout::HorizontalAlignment; - use Alignment::*; + use HorizontalAlignment::*; -
2714d6b (uncategorized) Add array and tuple RGB color conversion methods by @joshka in #1703
Other crates (e.g. colorgrad) that deal with colors can convert colors to a tuple of 3 or 4 u8 values. This commit adds conversion methods from these types to a
Color::Rgbinstance. Any alpha value is ignored.Color::from([255, 0, 0]); Color::from((255, 0, 0)); Color::from([255, 0, 0, 255]); Color::from((255, 0, 0, 255)); -
50ba965 (uncategorized) Add a new RatatuiMascot widget by @Its-Just-Nans in #1584
Move the Mascot from Demo2 into a new widget. Make the Rat grey and adjust the other colors.
frame.render_widget(RatatuiMascot::default(), frame.area()); -
1d28c89 (uncategorized) Add conversions for anstyle by @joshka in #1581
https://crates.io/crates/anstyle makes it possible to define colors in an interoperable way. This makes it possible for applications to easily load colors from a variety of formats.
This is gated by the anstyle feature flag which is disabled by default.
Bug Fixes
-
a89d3d6 (buffer) Clear behavior with VS16 wide emojis by @nornagon in #2063
This fixes a bug where certain emojis like āØļø would sometimes be "overlaid" onto existing content from the buffer, instead of properly clearing.
This PR was generated by Codex, and validated by me:
- Behavior of the above example code was buggy before this fix (showed overlaying "b" on top of the keyboard emoji), and fixed after.
- The U+FE0F check is not strictly required, but I did note that emoji without this char don't exhibit the buggy behavior, even without the fix.
-
ec30390 (canvas) Round coordinates to nearest grid cell by @joshka in #1507
Previously the canvas coordinates were rounded towards zero, which causes the rendering to be off by one pixel in some cases. It also meant that pixels at the extreme edges of the canvas can only be drawn if the point was exactly on the edge of the canvas. This commit rounds the coordinates to the nearest integer instead. This may change the output for some apps using Canvas / Charts.
-
afd1ce1 Lines that start outside the visible grid are now drawn by @renesat in
Refactor
-
8d60e96 (examples) Use crossterm event methods by @joshka in #1792
Crossterm 0.29 introduced methods to easily check / extract the event type. E.g. as_key_press_event() and is_key_press(). This commit updates the examples to use these methods instead of matching on the event type. This makes the code cleaner and easier to read.
Also does a general cleanup of the event handling code in the examples.
-
07bec55 (no_std) Make usages of std explicit in ratatui-core. by @ed-2100 in #1782
This commit does the following:
- Adds
#[no_std]tolib.rs. - Adds
extern crate std;tolib.rs. - Updates
ratatui-coreto explicitlyuseitems from std and alloc. - Prefers
use-ing alloc over std when possible.
Explanation:
This allows usages of
stdinratatui-coreto be clearly pointed out and dealt with individually.Eventually, when
stdis to be feature gated, the associated commit will be much cleaner. - Adds
-
f132fa1 Small readability improvements by @joshka in
Documentation
-
40e96a2 (block) Add collapsed border example by @joshka in #1899
-
d291042 (block) Revise the block example by @orhun in #1520
- Moves the block example from
ratatuitoratatui-widgets - Simplifies the example (bordered, styled, custom borders)
see #1512
- Moves the block example from
-
0951da5 (breaking-changes) Improve migration guide for
Backend::Errorby @j-g00da in #1908Related:https://github.com/fujiapple852/trippy/pull/1588
-
bbe1cf9 Change MSRV to 1.85 by @j-g00da in
Performance
-
1f41a61 (paragraph) Avoid unnecessary work when rendering by @alexpasmantier in #1622
Improve render times for paragraphs that are scrolled.
Currently all
LineComposers are considered to be state machines which means rendering a paragraph with a given Y offset requires computing the entire state up to Y before being able to render from Y onwards.While this makes sense for Composers such as the
WordWrapper(where one needs to consider all previous lines to determine where a given line will end up), it means it also penalizes Composers which can render a given line "statelessely" (such as theLineTruncator) which actually end up doing a lot of unnecessary work (and on the critical rendering path) when the offset gets high. -
ba9eed7 (table) Replace while loop with simple min operation by @EdJoPaTo in #1747
Styling
-
345f47e (rect) Use plus operator for offset by @pharrison31415 in #2251
Summary
Use
+operator to moveRectby anOffsetas added here.Includes change to use
Offset::new()in place ofOffset { ... } -
ac60de3 (uncategorized) Fix wrapping in doc comment by @joshka in #2104
-
2739391 (uncategorized) Use Module imports_granularity by @joshka in #1728
I was swayed by the arguments about this made by the compiler team In and decided to look at how this organization affects ratatui. I found this reduces the number of lines across the codebase by about 350 and makes the imports more readable and definitely more greppable as you usually only have to read a single line. I've found in the past that maintaining imports regularly leads to merge conflicts which have to be resolved by hand and this change should reduce the likelihood of that happening.
Testing
-
db65aa0 (bench) Add benchmark for text by @orhun in #2160
#2138
-
a21501f (bench) Added a benchmark for constraints by @kashregister in #2043
I've added a new benchmark for constraints, which only takes into account the time it takes to generate a full layout using a single type of constraints only. Avoided rendering here as it resulted in more inaccurate benchmarks, and i believe it should be separated nonetheless.
-
94ba82e (gauge) Add benchmarks for gauge by @WaterWhisperer in #2221
-
39cd313 Add visual buffer tests for Rect methods by @orhun in
Miscellaneous Tasks
-
abe2f27 (backend) Change From impls to new backend specific IntoBackend and FromBackend traits by @joshka in #1464 [breaking]
Adds two traits
IntoCrosstermandFromCrosstermfor converting between ratatui and crossterm types. This is necessary in order to avoid the orphan rule when implementingFromfor crossterm types once the crossterm types are moved to a separate crate.Similarly Termwiz and Termwiz gain FromTermion, IntoTermion, FromTermwiz and IntoTermwiz traits.
BREAKING CHANGE:The
FromandIntoimpls for backend types are now replaced with specific backend traits.+ use ratatui::backend::{FromCrossterm, IntoCrossterm}; let crossterm_color = crossterm::style::Color::Black; - let ratatui_color = crossterm_color.into(); - let ratatui_color = ratatui::style::Color::from(crossterm_color); + let ratatui_color = ratatui::style::Color::from_crossterm(crossterm_color); - let crossterm_color = ratatui_color.into(); - let crossterm_color = crossterm::style::Color::from(ratatui_color); + let crossterm_color = ratatui_color.into_crossterm(); let crossterm_attribute = crossterm::style::types::Attribute::Bold; - let ratatui_modifier = crossterm_attribute.into(); - let ratatui_modifier = ratatui::style::Modifier::from(crossterm_attribute); + let ratatui_modifier = ratatui::style::Modifier::from_crossterm(crossterm_attribute); - let crossterm_attribute = ratatui_modifier.into(); - let crossterm_attribute = crossterm::style::types::Attribute::from(ratatui_modifier); + let crossterm_attribute = ratatui_modifier.into_crossterm();Similar conversions for
ContentStyle->StyleandAttributes->Modifierexist for Crossterm, and all the Termion and Termwiz types.
-
0a47ebd Update bencher CLI usage by @epompeii in
Continuous Integration
-
c01b7d4 (uncategorized) Remove old release workflows by @joshka in #2015
-
02ca587 (uncategorized) Add environment to release workflow by @joshka in #1983
https://github.com/rust-lang/crates.io/issues/11564#issuecomment-3066696820
-
821611f (uncategorized) Use trusted publishing by @joshka in #1981
https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/
https://crates.io/docs/trusted-publishing
-
1f0c2ee Audit github workflows with zizmor by @joshka in
Reverted Commits
-
cace1e0 (release) Prepare for beta release by @orhun in #2117
This reverts commit 5ae224b244a61d9d1460d7e1b0c448dd7cf72933 so that
release-plzis being triggered again.See https://github.com/ratatui/ratatui/pull/2022#issuecomment-3349094310 for rationale.
New Contributors
- @sxyazi made their first contribution in #2267
- @pharrison31415 made their first contribution in #2252
- @sbarral made their first contribution in #2235
- @j-g00da made their first contribution in #2236
- @WaterWhisperer made their first contribution in #2221
- @0xb002f0 made their first contribution in #2223
- @matthiasbeyer made their first contribution in #2212
- @b-guild made their first contribution in #2197
- @github-actions[bot] made their first contribution in #2162
Full Changelog: https://github.com/ratatui/ratatui/compare/v0.29.0...v0.30.0
