Skip to content

v0.24.0

Compare
Choose a tag to compare
@orhun orhun released this 23 Oct 11:46
· 322 commits to main since this release
c597b87

We are excited to announce the new version of ratatui - a Rust library that's all about cooking up TUIs 🐭

In this version, we've introduced features like window size API, enhanced chart rendering, and more.
The list of *breaking changes* can be found here ⚠️.
Also, we created various tutorials and walkthroughs in Ratatui Book which is available at https://ratatui.rs 🚀

Release highlights: https://ratatui.rs/highlights/v0.24.html

Features

  • c6c3f88
    (backend) Implement common traits for WindowSize (#586)

  • d077903
    (backend) Backend provides window_size, add Size struct (#276)

    For image (sixel, iTerm2, Kitty...) support that handles graphics in
    terms of `Rect` so that the image area can be included in layouts.
    
    For example: an image is loaded with a known pixel-size, and drawn, but
    the image protocol has no mechanism of knowing the actual cell/character
    area that been drawn on. It is then impossible to skip overdrawing the
    area.
    
    Returning the window size in pixel-width / pixel-height, together with
    columns / rows, it can be possible to account the pixel size of each cell
    / character, and then known the `Rect` of a given image, and also resize
    the image so that it fits exactly in a `Rect`.
    
    Crossterm and termwiz also both return both sizes from one syscall,
    while termion does two.
    
    Add a `Size` struct for the cases where a `Rect`'s `x`/`y` is unused
    (always zero).
    
    `Size` is not "clipped" for `area < u16::max_value()` like `Rect`. This
    is why there are `From` implementations between the two.
    
  • 301366c
    (barchart) Render charts smaller than 3 lines (#532)

    The bar values are not shown if the value width is equal the bar width
    and the bar is height is less than one line
    
    Add an internal structure `LabelInfo` which stores the reserved height
    for the labels (0, 1 or 2) and also whether the labels will be shown.
    
    Fixes ratatui-org#513
    
  • 32e4619
    (block) Allow custom symbols for borders (#529) [breaking]

    Adds a new `Block::border_set` method that allows the user to specify
    the symbols used for the border.
    
    Added two new border types: `BorderType::QuadrantOutside` and
    `BorderType::QuadrantInside`. These are used to draw borders using the
    unicode quadrant characters (which look like half block "pixels").
    
    ```
    ▛▀▀▜
    ▌  ▐
    ▙▄▄▟
    
    ▗▄▄▖
    ▐  ▌
    ▝▀▀▘
    ```
    Fixes: https://github.com/ratatui-org/ratatui/issues/528
    
    BREAKING CHANGES:
    - BorderType::to_line_set is renamed to to_border_set
    - BorderType::line_symbols is renamed to border_symbols
    
  • 4541336
    (canvas) Implement half block marker (#550)

    * feat(canvas): implement half block marker
    
    A useful technique for the terminal is to use half blocks to draw a grid
    of "pixels" on the screen. Because we can set two colors per cell, and
    because terminal cells are about twice as tall as they are wide, we can
    draw a grid of half blocks that looks like a grid of square pixels.
    
    This commit adds a new `HalfBlock` marker that can be used in the Canvas
    widget and the associated HalfBlockGrid.
    
    Also updated demo2 to use the new marker as it looks much nicer.
    
    Adds docs for many of the methods and structs on canvas.
    
    Changes the grid resolution method to return the pixel count
    rather than the index of the last pixel.
    This is an internal detail with no user impact.
    
  • be55a5f
    (examples) Add demo2 example (#500)

  • 082cbcb
    (frame) Remove generic Backend parameter (#530) [breaking]

    This change simplifies UI code that uses the Frame type. E.g.:
    
    ```rust
    fn draw<B: Backend>(frame: &mut Frame<B>) {
        // ...
    }
    ```
    
    Frame was generic over Backend because it stored a reference to the
    terminal in the field. Instead it now directly stores the viewport area
    and current buffer. These are provided at creation time and are valid
    for the duration of the frame.
    
    BREAKING CHANGE: Frame is no longer generic over Backend. Code that
    accepted a Frame<Backend> will now need to accept a Frame.
    
  • d67fa2c
    (line) Add Line::raw constructor (#511)

    * feat(line): add `Line::raw` constructor
    
    There is already `Span::raw` and `Text::raw` methods
    and this commit simply adds `Line::raw` method for symmetry.
    
    Multi-line content is converted to multiple spans with the new line removed
    
  • cbf86da
    (rect) Add is_empty() to simplify some common checks (#534)

    - add `Rect::is_empty()` that checks whether either height or width == 0
    - refactored `Rect` into layout/rect.rs from layout.rs. No public API change as
       the module is private and the type is re-exported under the `layout` module.
    
  • 15641c8
    (uncategorized) Add buffer_mut method on Frame ✨ (#548)

Bug Fixes

  • 638d596
    (layout) Use LruCache for layout cache (#487)

    The layout cache now uses a LruCache with default size set to 16 entries.
    Previously the cache was backed by a HashMap, and was able to grow
    without bounds as a new entry was added for every new combination of
    layout parameters.
    
    - Added a new method (`layout::init_cache(usize)`) that allows the cache
    size to be changed if necessary. This will only have an effect if it is called
    prior to any calls to `layout::split()` as the cache is wrapped in a `OnceLock`
    
  • 8d507c4
    (backend) Add feature flag for underline-color (#570)

    Windows 7 doesn't support the underline color attribute, so we need to
    make it optional. This commit adds a feature flag for the underline
    color attribute - it is enabled by default, but can be disabled by
    passing `--no-default-features` to cargo.
    
    We could specically check for Windows 7 and disable the feature flag
    automatically, but I think it's better for this check to be done by the
    crossterm crate, since it's the one that actually knows about the
    underlying terminal.
    
    To disable the feature flag in an application that supports Windows 7,
    add the following to your Cargo.toml:
    
    ```toml
    ratatui = { version = "0.24.0", default-features = false, features = ["crossterm"] }
    ```
    
    Fixes https://github.com/ratatui-org/ratatui/issues/555
    
  • c3155a2
    (barchart) Add horizontal labels(#518)

    Labels were missed in the initial implementation of the horizontal
    mode for the BarChart widget. This adds them.
    
    Fixes https://github.com/ratatui-org/ratatui/issues/499
    
  • c5ea656
    (barchart) Avoid divide by zero in rendering (#525)

  • c9b8e7c
    (barchart) Render value labels with unicode correctly (#515)

    An earlier change introduced a bug where the width of value labels with
    unicode characters was incorrectly using the string length in bytes
    instead of the unicode character count. This reverts the earlier change.
    
  • c8ab2d5
    (chart) Use graph style for top line (#462)

    A bug in the rendering caused the top line of the chart to be rendered
    using the style of the chart, instead of the dataset style. This is
    fixed by only setting the style for the width of the text, and not the
    entire row.
    
  • 0c7d547
    (docs) Don't fail rustdoc due to termion (#503)

    Windows cannot compile termion, so it is not included in the docs.
    Rustdoc will fail if it cannot find a link, so the docs fail to build
    on windows.
    
    This replaces the link to TermionBackend with one that does not fail
    during checks.
    
    Fixes https://github.com/ratatui-org/ratatui/issues/498
    
  • 0c52ff4
    (gauge) Fix gauge widget colors (#572)

    The background colors of the gauge had a workaround for the issue we had
    with VHS / TTYD rendering the background color of the gauge. This
    workaround is no longer necessary in the updated versions of VHS / TTYD.
    
    Fixes https://github.com/ratatui-org/ratatui/issues/501
    
  • 11076d0
    (rect) Fix arithmetic overflow edge cases (#543)

    Fixes https://github.com/ratatui-org/ratatui/issues/258
    
  • 21303f2
    (rect) Prevent overflow in inner() and area() (#523)

  • ebd3680
    (stylize) Add Stylize impl for String (#466) [breaking]

    Although the `Stylize` trait is already implemented for `&str` which
    extends to `String`, it is not implemented for `String` itself. This
    commit adds an impl of Stylize that returns a Span<'static> for `String`
    so that code can call Stylize methods on temporary `String`s.
    
    E.g. the following now compiles instead of failing with a compile error
    about referencing a temporary value:
    
        let s = format!("hello {name}!", "world").red();
    
    BREAKING CHANGE: This may break some code that expects to call Stylize
    methods on `String` values and then use the String value later. This
    will now fail to compile because the String is consumed by set_style
    instead of a slice being created and consumed.
    
    This can be fixed by cloning the `String`. E.g.:
    
        let s = String::from("hello world");
        let line = Line::from(vec![s.red(), s.green()]); // fails to compile
        let line = Line::from(vec![s.clone().red(), s.green()]); // works
    
    Fixes https://discord.com/channels/1070692720437383208/1072907135664529508/1148229700821450833
    

Refactor

  • 2fd85af
    (barchart) Simplify internal implementation (#544)

    Replace `remove_invisible_groups_and_bars` with `group_ticks`
    `group_ticks` calculates the visible bar length in ticks. (A cell contains 8 ticks).
    
    It is used for 2 purposes:
    1. to get the bar length in ticks for rendering
    2. since it delivers only the values of the visible bars, If we zip these values
       with the groups and bars, then we will filter out the invisible groups and bars
    

Documentation

  • 0c68ebe
    (block) Add documentation to Block (#469)

  • 0fe7385
    (gauge) Add docs for Gauge and LineGauge (#514)

  • 27c5637
    (readme) Fix links to CONTRIBUTING.md and BREAKING-CHANGES.md (#577)

  • 1947c58
    (backend) Improve backend module docs (#489)

  • e098731
    (barchart) Add documentation to BarChart (#449)

    Add documentation to the `BarChart` widgets and its sub-modules.
    
  • 17797d8
    (canvas) Add support note for Braille marker (#472)

  • 3cf0b83
    (color) Document true color support (#477)

    * refactor(style): move Color to separate color mod
    
    * docs(color): document true color support
    
  • e5caf17
    (custom_widget) Make button sticky when clicking with mouse (#561)

  • ad2dc56
    (examples) Update examples readme (#576)

    remove VHS bug info, tweak colors_rgb image, update some of the instructions. add demo2
    
  • b61f65b
    (examples) Update theme to Aardvark Blue (#574)

    This is a nicer theme that makes the colors pop
    
  • 61af0d9
    (examples) Make custom widget example into a button (#539)

    The widget also now supports mouse
    
  • 6b8725f
    (examples) Add colors_rgb example (#476)

  • 5c785b2
    (examples) Move example gifs to github (#460)

    - A new orphan branch named "images" is created to store the example
      images
    
  • ca9bcd3
    (examples) Add descriptions and update theme (#460)

    - Use the OceanicMaterial consistently in examples
    
  • 080a05b
    (paragraph) Add docs for alignment fn (#467)

  • 1e20475
    (stylize) Improve docs for style shorthands (#491)

    The Stylize trait was introduced in 0.22 to make styling less verbose.
    This adds a bunch of documentation comments to the style module and
    types to make this easier to discover.
    
  • dd9a8df
    (table) Add documentation for block and header methods of the Table widget (#505)

  • 232be80
    (table) Add documentation for Table::new() (#471)

  • 3bda372
    (tabs) Add documentation to Tabs (#535)

  • 42f8169
    (terminal) Add docs for terminal module (#486)

    - moves the impl Terminal block up to be closer to the type definition
    
  • 28e7fd4
    (terminal) Fix doc comment (#452)

  • 51fdcbe
    (title) Add documentation to title (#443)

    This adds documentation for Title and Position
    
  • d4976d4
    (widgets) Update the list of available widgets (#496)

  • 6c7bef8
    (uncategorized) Replace colons with dashes in README.md for consistency (#566)

  • 88ae348
    (uncategorized) Update Frame docstring to remove reference to generic backend (#564)

  • 089f8ba
    (uncategorized) Add double quotes to instructions for features (#560)

  • 346e7b4
    (uncategorized) Add summary to breaking changes (#549)

  • 401a7a7
    (uncategorized) Improve clarity in documentation for Frame and Terminal 📚 (#545)

  • e35e413
    (uncategorized) Fix terminal comment (#547)

  • 8ae4403
    (uncategorized) Fix Terminal docstring (#546)

  • 9cfb133
    (uncategorized) Document alpha release process (#542)

    Fixes https://github.com/ratatui-org/ratatui/issues/412
    
  • 4548a9b
    (uncategorized) Add BREAKING-CHANGES.md (#538)

    Document the breaking changes in each version. This document is
    manually curated by summarizing the breaking changes in the changelog.
    
  • c0991cc
    (uncategorized) Make library and README consistent (#526)

    * docs: make library and README consistent
    
    Generate the bulk of the README from the library documentation, so that
    they are consistent using cargo-rdme.
    
    - Removed the Contributors section, as it is redundant with the github
      contributors list.
    - Removed the info about the other backends and replaced it with a
      pointer to the documentation.
    - add docsrs example, vhs tape and images that will end up in the README
    
  • 1414fbc
    (uncategorized) Import prelude::* in doc examples (#490)

    This commit adds `prelude::*` all doc examples and widget::* to those
    that need it. This is done to highlight the use of the prelude and
    simplify the examples.
    
    - Examples in Type and module level comments show all imports and use
      `prelude::*` and `widget::*` where possible.
    - Function level comments hide imports unless there are imports other
      than `prelude::*` and `widget::*`.
    
  • 74c5244
    (uncategorized) Add logo and favicon to docs.rs page (#473)

  • 927a5d8
    (uncategorized) Fix documentation lint warnings (#450)

  • eda2fb7
    (uncategorized) Use ratatui 📚 (#446)

Testing

  • ea70bff
    (barchart) Add benchmarks (#455)

  • 94af2a2
    (buffer) Allow with_lines to accept Vec<Into> (#494)

    This allows writing unit tests without having to call set_style on the
    expected buffer.
    

Miscellaneous Tasks

  • 1278131
    (changelog) Make the scopes lowercase in the changelog (#479)

  • 82b40be
    (ci) Improve checking the PR title (#464)

    - Use [`action-semantic-pull-request`](https://github.com/amannn/action-semantic-pull-request)
    - Allow only reading the PR contents
    - Enable merge group
    
  • a20bd6a
    (deps) Update lru requirement from 0.11.1 to 0.12.0 (#581)

    Updates the requirements on [lru](https://github.com/jeromefroe/lru-rs) to permit the latest version.
    - [Changelog](https://github.com/jeromefroe/lru-rs/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/jeromefroe/lru-rs/compare/0.11.1...0.12.0)
    
    ---
    updated-dependencies:
    - dependency-name: lru
      dependency-type: direct:production
    ...
    
  • 5213f78
    (deps) Bump actions/checkout from 3 to 4 (#580)

    Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
    - [Release notes](https://github.com/actions/checkout/releases)
    - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/actions/checkout/compare/v3...v4)
    
    ---
    updated-dependencies:
    - dependency-name: actions/checkout
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
  • 6cbdb06
    (examples) Refactor some examples (#578)

    * chore(examples): Simplify timeout calculation with `Duration::saturating_sub`
    
  • 12f9291
    (github) Create dependabot.yml (#575)

    * chore: Create dependabot.yml
    
    * Update .github/dependabot.yml
    
  • 3a57e76
    (github) Add contact links for issues (#567)

  • 5498a88
    (spans) Remove deprecated Spans type (#426)

    The `Spans` type (plural, not singular) was replaced with a more ergonomic `Line` type
    in Ratatui v0.21.0 and marked deprecated byt left for backwards compatibility. This is now
    removed.
    
    - `Line` replaces `Spans`
    - `Buffer::set_line` replaces `Buffer::set_spans`
    
  • fbf1a45
    (uncategorized) Simplify constraints (#556)

    Use bare arrays rather than array refs / Vecs for all constraint
    examples.
    
  • a7bf4b3
    (uncategorized) Use modern modules syntax (#492)

    Move xxx/mod.rs to xxx.rs
    
  • af36282
    (uncategorized) Only run check pr action on pull_request_target events (#485)

  • 322e46f
    (uncategorized) Prevent PR merge with do not merge labels ♻️ (#484)

  • 983ea7f
    (uncategorized) Fix check for if breaking change label should be added ♻️ (#483)

  • 384e616
    (uncategorized) Add a check for if breaking change label should be added ♻️ (#481)

  • 5f6aa30
    (uncategorized) Check documentation lint (#454)

  • 47ae602
    (uncategorized) Check that PR title matches conventional commit guidelines ♻️ (#459)

  • 28c6157
    (uncategorized) Add documentation guidelines (#447)

Continuous Integration

  • 343c6cd
    (lint) Move formatting and doc checks first (#465)

    Putting the formatting and doc checks first to ensure that more critical
    errors are caught first (e.g. a conventional commit error or typo should
    not prevent the formatting and doc checks from running).
    
  • c95a75c
    (makefile) Remove termion dependency from doc lint (#470)

    Only build termion on non-windows targets
    
  • b996102
    (makefile) Add format target (#468)

    - add format target to Makefile.toml that actually fixes the formatting
    - rename fmt target to lint-format
    - rename style-check target to lint-style
    - rename typos target to lint-typos
    - rename check-docs target to lint-docs
    - add section to CONTRIBUTING.md about formatting
    
  • 572df75
    (uncategorized) Put commit id first in changelog (#463)

  • 878b6fc
    (uncategorized) Ignore benches from code coverage (#461)

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!