Compare commits

...

232 Commits

Author SHA1 Message Date
Orhun Parmaksız
af18bae1ff Set up go or sth 2025-09-28 13:24:41 +03:00
Orhun Parmaksız
c68ff86c64 Use the correct bin 2025-09-28 13:19:24 +03:00
Orhun Parmaksız
c337aa3d58 Try docker 2025-09-28 13:18:46 +03:00
Orhun Parmaksız
7cef8d2a8b Use go/bin path 2025-09-28 13:18:28 +03:00
Orhun Parmaksız
96a468443e Use the correct path 2025-09-28 13:12:45 +03:00
Orhun Parmaksız
1ae449c92b Remove the vhs-action 2025-09-28 13:07:28 +03:00
Orhun Parmaksız
71722bbf41 Install the damn ffmpeg 2025-09-28 13:04:07 +03:00
Orhun Parmaksız
1b573d982e Add vhs-test CI workflow 2025-09-28 13:02:13 +03:00
Josh McKinney
ac60de3960 style: fix wrapping in doc comment (#2104) 2025-09-28 11:35:25 +03:00
Shingo OKAWA
91fa249cd4 chore: remove obsolete doc_auto_cfg feature (#2103)
The doc_auto_cfg feature was incorporated into the doc_cfg feature
in https://github.com/rust-lang/rust/pull/138907

Closes #2102

Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com>
2025-09-28 00:38:45 -07:00
Shingo OKAWA
73488abb45 docs(contributing): fix link to widgets_block_renders test (#2101)
The `CONTRIBUTING.md` referenced `tests/widgets_block.rs`, but the
correct path is `ratatui/tests/widgets_block.rs`. Updated the link so
that readers can navigate to the test example without 404 error.

---------

Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com>
2025-09-27 10:07:07 +03:00
eqsdxr
40f13c6a6c docs(rect): update the outdated comment for Rect::area() (#2100)
The return value of Rect.area() is no longer of u16 type, and the value
is not being clumped anymore.
2025-09-25 22:35:05 +03:00
Jeremy Rose
a89d3d62ff fix(buffer): clear behavior with VS16 wide emojis (#2063)
This fixes a bug where certain emojis like ⌨️ would sometimes be
"overlaid" onto existing content from the buffer, instead of properly
clearing.

[example demonstrating
bug](https://gist.github.com/nornagon/11a79d7a1f2e98aa129fedb4abccc530)

This PR was generated by Codex, and validated by me:
1. Behavior of the above example code was buggy before this fix (showed
overlaying "b" on top of the keyboard emoji), and fixed after.
2. 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.

---------

Co-authored-by: Orhun Parmaksız <orhunparmaksiz@gmail.com>
2025-09-25 00:27:10 +03:00
dependabot[bot]
42a4e9e9af build(deps): bump bnjbvr/cargo-machete from 0.8.0 to 0.9.1 (#2059)
Bumps [bnjbvr/cargo-machete](https://github.com/bnjbvr/cargo-machete)
from 0.8.0 to 0.9.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bnjbvr/cargo-machete/releases">bnjbvr/cargo-machete's
releases</a>.</em></p>
<blockquote>
<h2>v0.9.1</h2>
<p>Hotfix for the Github Action, no other changes in behavior since
v0.9.0.</p>
<h2>v0.9.0</h2>
<h2>Shiny new things</h2>
<ul>
<li>Add pre-commit hook by <a
href="https://github.com/jpmelos"><code>@​jpmelos</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/164">bnjbvr/cargo-machete#164</a></li>
<li>Handle multiple dependency tables and dependency delimiters by <a
href="https://github.com/mkatychev"><code>@​mkatychev</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/112">bnjbvr/cargo-machete#112</a></li>
<li>feat(<a
href="https://redirect.github.com/bnjbvr/cargo-machete/issues/152">#152</a>):
add renamed configuration field by <a
href="https://github.com/jalil-salame"><code>@​jalil-salame</code></a>
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/153">bnjbvr/cargo-machete#153</a></li>
<li>chore(ci): add aarch64 linux by <a
href="https://github.com/jarjk"><code>@​jarjk</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/179">bnjbvr/cargo-machete#179</a></li>
<li>feat: improve Dockerfile by <a
href="https://github.com/reneleonhardt"><code>@​reneleonhardt</code></a>
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/174">bnjbvr/cargo-machete#174</a></li>
</ul>
<h2>Internal changes / refactorinsg</h2>
<ul>
<li>Add a release process by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/157">bnjbvr/cargo-machete#157</a></li>
<li>refactor: use ?-operator to simplify some and_then chains by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/166">bnjbvr/cargo-machete#166</a></li>
<li>Bump ring from 0.17.9 to 0.17.14 in
/integration-tests/renamed-dep-workspace by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/165">bnjbvr/cargo-machete#165</a></li>
<li>Bump ring from 0.17.8 to 0.17.14 in /integration-tests/renamed-dep
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/167">bnjbvr/cargo-machete#167</a></li>
<li>doc: rename job name in example workflow by <a
href="https://github.com/kyu08"><code>@​kyu08</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/168">bnjbvr/cargo-machete#168</a></li>
<li>chore: update dependencies by <a
href="https://github.com/reneleonhardt"><code>@​reneleonhardt</code></a>
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/177">bnjbvr/cargo-machete#177</a></li>
<li>Bump cargo_toml from 0.22.1 to 0.22.3 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/180">bnjbvr/cargo-machete#180</a></li>
<li>refactor: collect_paths by <a
href="https://github.com/reneleonhardt"><code>@​reneleonhardt</code></a>
in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/176">bnjbvr/cargo-machete#176</a></li>
<li>chore: add github sponsoring to FUNDING.yml by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/183">bnjbvr/cargo-machete#183</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/jpmelos"><code>@​jpmelos</code></a> made
their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/164">bnjbvr/cargo-machete#164</a></li>
<li><a href="https://github.com/mkatychev"><code>@​mkatychev</code></a>
made their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/112">bnjbvr/cargo-machete#112</a></li>
<li><a
href="https://github.com/jalil-salame"><code>@​jalil-salame</code></a>
made their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/153">bnjbvr/cargo-machete#153</a></li>
<li><a href="https://github.com/kyu08"><code>@​kyu08</code></a> made
their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/168">bnjbvr/cargo-machete#168</a></li>
<li><a
href="https://github.com/reneleonhardt"><code>@​reneleonhardt</code></a>
made their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/177">bnjbvr/cargo-machete#177</a></li>
<li><a href="https://github.com/jarjk"><code>@​jarjk</code></a> made
their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/179">bnjbvr/cargo-machete#179</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bnjbvr/cargo-machete/compare/v0.8.0...v0.9.0">https://github.com/bnjbvr/cargo-machete/compare/v0.8.0...v0.9.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7959c84578"><code>7959c84</code></a>
chore: release v0.9.1</li>
<li><a
href="7e41788742"><code>7e41788</code></a>
fix(action): request to use the rust stable toolchain when
installing</li>
<li><a
href="ffca7bed89"><code>ffca7be</code></a>
chore: release 0.9.0</li>
<li><a
href="86e260dd1d"><code>86e260d</code></a>
chore: bump dependencies before the release</li>
<li><a
href="ddb305d9bc"><code>ddb305d</code></a>
chore: add github sponsoring to FUNDING.yml</li>
<li><a
href="373b106eaa"><code>373b106</code></a>
feat: improve Dockerfile</li>
<li><a
href="57a61aabbe"><code>57a61aa</code></a>
refactor: simplify <code>collect_path</code></li>
<li><a
href="73318504c4"><code>7331850</code></a>
chore(ci): add aarch64 linux (<a
href="https://redirect.github.com/bnjbvr/cargo-machete/issues/179">#179</a>)</li>
<li><a
href="c24779f18b"><code>c24779f</code></a>
Bump cargo_toml from 0.22.1 to 0.22.3</li>
<li><a
href="c725183eab"><code>c725183</code></a>
chore: update dependencies and set up automatic dependency updates</li>
<li>Additional commits viewable in <a
href="b54422fa33...7959c84578">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bnjbvr/cargo-machete&package-manager=github_actions&previous-version=0.8.0&new-version=0.9.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-25 00:25:50 +03:00
dependabot[bot]
74558dafae build(deps): bump amannn/action-semantic-pull-request from 5.5.3 to 6.1.1 (#2067)
Bumps
[amannn/action-semantic-pull-request](https://github.com/amannn/action-semantic-pull-request)
from 5.5.3 to 6.1.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/amannn/action-semantic-pull-request/releases">amannn/action-semantic-pull-request's
releases</a>.</em></p>
<blockquote>
<h2>v6.1.1</h2>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v6.1.0...v6.1.1">6.1.1</a>
(2025-08-22)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Parse <code>headerPatternCorrespondence</code> properly (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/295">#295</a>)
(<a
href="800da4c97f">800da4c</a>)</li>
</ul>
<h2>v6.1.0</h2>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v6.0.1...v6.1.0">6.1.0</a>
(2025-08-19)</h2>
<h3>Features</h3>
<ul>
<li>Support providing regexps for types (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/292">#292</a>)
(<a
href="a30288bf13">a30288b</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Remove trailing whitespace from &quot;unknown release type&quot;
error message (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/291">#291</a>)
(<a
href="afa4edb1c4">afa4edb</a>)</li>
</ul>
<h2>v6.0.1</h2>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v6.0.0...v6.0.1">6.0.1</a>
(2025-08-13)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Actually execute action (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/289">#289</a>)
(<a
href="58e4ab40f5">58e4ab4</a>)</li>
</ul>
<h2>v6.0.0</h2>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v5.5.3...v6.0.0">6.0.0</a>
(2025-08-13)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>Upgrade action to use Node.js 24 and ESM (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/287">#287</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>Upgrade action to use Node.js 24 and ESM (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/287">#287</a>)
(<a
href="bc0c9a79ab">bc0c9a7</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/amannn/action-semantic-pull-request/blob/main/CHANGELOG.md">amannn/action-semantic-pull-request's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v6.1.0...v6.1.1">6.1.1</a>
(2025-08-22)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Parse <code>headerPatternCorrespondence</code> properly (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/295">#295</a>)
(<a
href="800da4c97f">800da4c</a>)</li>
</ul>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v6.0.1...v6.1.0">6.1.0</a>
(2025-08-19)</h2>
<h3>Features</h3>
<ul>
<li>Support providing regexps for types (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/292">#292</a>)
(<a
href="a30288bf13">a30288b</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Remove trailing whitespace from &quot;unknown release type&quot;
error message (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/291">#291</a>)
(<a
href="afa4edb1c4">afa4edb</a>)</li>
</ul>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v6.0.0...v6.0.1">6.0.1</a>
(2025-08-13)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Actually execute action (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/289">#289</a>)
(<a
href="58e4ab40f5">58e4ab4</a>)</li>
</ul>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v5.5.3...v6.0.0">6.0.0</a>
(2025-08-13)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>Upgrade action to use Node.js 24 and ESM (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/287">#287</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>Upgrade action to use Node.js 24 and ESM (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/287">#287</a>)
(<a
href="bc0c9a79ab">bc0c9a7</a>)</li>
</ul>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v5.5.2...v5.5.3">5.5.3</a>
(2024-06-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Bump <code>braces</code> dependency (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/269">#269</a>.
by <a href="https://github.com/EelcoLos"><code>@​EelcoLos</code></a>)
(<a
href="2d952a1bf9">2d952a1</a>)</li>
</ul>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v5.5.1...v5.5.2">5.5.2</a>
(2024-04-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Bump tar from 6.1.11 to 6.2.1 (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/262">#262</a>
by <a href="https://github.com/EelcoLos"><code>@​EelcoLos</code></a>)
(<a
href="9a90d5a5ac">9a90d5a</a>)</li>
</ul>
<h2><a
href="https://github.com/amannn/action-semantic-pull-request/compare/v5.5.0...v5.5.1">5.5.1</a>
(2024-04-24)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="48f256284b"><code>48f2562</code></a>
chore: Release 6.1.1 [skip ci]</li>
<li><a
href="800da4c97f"><code>800da4c</code></a>
fix: Parse <code>headerPatternCorrespondence</code> properly (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/295">#295</a>)</li>
<li><a
href="677b89571e"><code>677b895</code></a>
test: Fix broken test</li>
<li><a
href="24e6f016c1"><code>24e6f01</code></a>
ci: Fix permissions for tagger</li>
<li><a
href="7f33ba7922"><code>7f33ba7</code></a>
chore: Release 6.1.0 [skip ci]</li>
<li><a
href="afa4edb1c4"><code>afa4edb</code></a>
fix: Remove trailing whitespace from &quot;unknown release type&quot;
error message (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/291">#291</a>)</li>
<li><a
href="a30288bf13"><code>a30288b</code></a>
feat: Support providing regexps for types (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/292">#292</a>)</li>
<li><a
href="a46a7c8dc4"><code>a46a7c8</code></a>
build: Move Vitest to <code>devDependencies</code> (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/290">#290</a>)</li>
<li><a
href="fdd4d3ddf6"><code>fdd4d3d</code></a>
chore: Release 6.0.1 [skip ci]</li>
<li><a
href="58e4ab40f5"><code>58e4ab4</code></a>
fix: Actually execute action (<a
href="https://redirect.github.com/amannn/action-semantic-pull-request/issues/289">#289</a>)</li>
<li>Additional commits viewable in <a
href="0723387faa...48f256284b">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=amannn/action-semantic-pull-request&package-manager=github_actions&previous-version=5.5.3&new-version=6.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:56:31 +03:00
dependabot[bot]
3c54e91420 build(deps): bump serde_json from 1.0.142 to 1.0.143 (#2068)
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.142 to
1.0.143.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/serde-rs/json/releases">serde_json's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.143</h2>
<ul>
<li>Implement Clone and Debug for serde_json::Map iterators (<a
href="https://redirect.github.com/serde-rs/json/issues/1264">#1264</a>,
thanks <a
href="https://github.com/xlambein"><code>@​xlambein</code></a>)</li>
<li>Implement Default for CompactFormatter (<a
href="https://redirect.github.com/serde-rs/json/issues/1268">#1268</a>,
thanks <a href="https://github.com/SOF3"><code>@​SOF3</code></a>)</li>
<li>Implement FromStr for serde_json::Map (<a
href="https://redirect.github.com/serde-rs/json/issues/1271">#1271</a>,
thanks <a
href="https://github.com/mickvangelderen"><code>@​mickvangelderen</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="10102c49bf"><code>10102c4</code></a>
Release 1.0.143</li>
<li><a
href="2a5b85312c"><code>2a5b853</code></a>
Replace super::super with absolute path within crate</li>
<li><a
href="447170bd38"><code>447170b</code></a>
Merge pull request 1271 from
mickvangelderen/mick/impl-from-str-for-map</li>
<li><a
href="ec190d6dfd"><code>ec190d6</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/json/issues/1264">#1264</a>
from xlambein/master</li>
<li><a
href="8be664752f"><code>8be6647</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/json/issues/1268">#1268</a>
from SOF3/compact-default</li>
<li><a
href="ba5b3cccea"><code>ba5b3cc</code></a>
Revert &quot;Pin nightly toolchain used for miri job&quot;</li>
<li><a
href="fd35a02901"><code>fd35a02</code></a>
Implement FromStr for Map&lt;String, Value&gt;</li>
<li><a
href="bea0fe6b3e"><code>bea0fe6</code></a>
Implement Default for CompactFormatter</li>
<li><a
href="0c0e9f6bfa"><code>0c0e9f6</code></a>
Add Clone and Debug impls to map iterators</li>
<li>See full diff in <a
href="https://github.com/serde-rs/json/compare/v1.0.142...v1.0.143">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.142&new-version=1.0.143)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:55:53 +03:00
dependabot[bot]
3673d360cf build(deps): bump codecov/codecov-action from 5.4.3 to 5.5.1 (#2081)
Bumps
[codecov/codecov-action](https://github.com/codecov/codecov-action) from
5.4.3 to 5.5.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/codecov/codecov-action/releases">codecov/codecov-action's
releases</a>.</em></p>
<blockquote>
<h2>v5.5.1</h2>
<h2>What's Changed</h2>
<ul>
<li>build(deps): bump ossf/scorecard-action from 2.4.1 to 2.4.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1833">codecov/codecov-action#1833</a></li>
<li>build(deps): bump github/codeql-action from 3.28.18 to 3.29.9 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1861">codecov/codecov-action#1861</a></li>
<li>Document a <code>codecov-cli</code> version reference example by <a
href="https://github.com/webknjaz"><code>@​webknjaz</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1774">codecov/codecov-action#1774</a></li>
<li>docs: fix typo in README by <a
href="https://github.com/datalater"><code>@​datalater</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1866">codecov/codecov-action#1866</a></li>
<li>fix: update to use local app/ dir by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1872">codecov/codecov-action#1872</a></li>
<li>build(deps): bump github/codeql-action from 3.29.9 to 3.29.11 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1867">codecov/codecov-action#1867</a></li>
<li>build(deps): bump actions/checkout from 4.2.2 to 5.0.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1868">codecov/codecov-action#1868</a></li>
<li>fix: overwrite pr number on fork by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1871">codecov/codecov-action#1871</a></li>
<li>chore(release): 5.5.1 by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1873">codecov/codecov-action#1873</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/datalater"><code>@​datalater</code></a>
made their first contribution in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1866">codecov/codecov-action#1866</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.5.0...v5.5.1">https://github.com/codecov/codecov-action/compare/v5.5.0...v5.5.1</a></p>
<h2>v5.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>build(deps): bump github/codeql-action from 3.28.17 to 3.28.18 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1829">codecov/codecov-action#1829</a></li>
<li>docs: Refine OIDC docs by <a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1837">codecov/codecov-action#1837</a></li>
<li>fix: Typo in README by <a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1838">codecov/codecov-action#1838</a></li>
<li>fix: check reqs exist by <a
href="https://github.com/joseph-sentry"><code>@​joseph-sentry</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1835">codecov/codecov-action#1835</a></li>
<li>Pin actions/github-script by Git SHA by <a
href="https://github.com/martincostello"><code>@​martincostello</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1859">codecov/codecov-action#1859</a></li>
<li>feat: upgrade wrapper to 0.2.4 by <a
href="https://github.com/jviall"><code>@​jviall</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1864">codecov/codecov-action#1864</a></li>
<li>chore(release): 5.5.0 by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1865">codecov/codecov-action#1865</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> made
their first contribution in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1837">codecov/codecov-action#1837</a></li>
<li><a
href="https://github.com/martincostello"><code>@​martincostello</code></a>
made their first contribution in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1859">codecov/codecov-action#1859</a></li>
<li><a href="https://github.com/jviall"><code>@​jviall</code></a> made
their first contribution in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1864">codecov/codecov-action#1864</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.4.3...v5.5.0">https://github.com/codecov/codecov-action/compare/v5.4.3...v5.5.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md">codecov/codecov-action's
changelog</a>.</em></p>
<blockquote>
<h2>v5.5.1</h2>
<h3>What's Changed</h3>
<ul>
<li>fix: overwrite pr number on fork by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1871">codecov/codecov-action#1871</a></li>
<li>build(deps): bump actions/checkout from 4.2.2 to 5.0.0 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1868">codecov/codecov-action#1868</a></li>
<li>build(deps): bump github/codeql-action from 3.29.9 to 3.29.11 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1867">codecov/codecov-action#1867</a></li>
<li>fix: update to use local app/ dir by <a
href="https://github.com/thomasrockhu-codecov"><code>@​thomasrockhu-codecov</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1872">codecov/codecov-action#1872</a></li>
<li>docs: fix typo in README by <a
href="https://github.com/datalater"><code>@​datalater</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1866">codecov/codecov-action#1866</a></li>
<li>Document a <code>codecov-cli</code> version reference example by <a
href="https://github.com/webknjaz"><code>@​webknjaz</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1774">codecov/codecov-action#1774</a></li>
<li>build(deps): bump github/codeql-action from 3.28.18 to 3.29.9 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1861">codecov/codecov-action#1861</a></li>
<li>build(deps): bump ossf/scorecard-action from 2.4.1 to 2.4.2 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1833">codecov/codecov-action#1833</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.5.0..v5.5.1">https://github.com/codecov/codecov-action/compare/v5.5.0..v5.5.1</a></p>
<h2>v5.5.0</h2>
<h3>What's Changed</h3>
<ul>
<li>feat: upgrade wrapper to 0.2.4 by <a
href="https://github.com/jviall"><code>@​jviall</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1864">codecov/codecov-action#1864</a></li>
<li>Pin actions/github-script by Git SHA by <a
href="https://github.com/martincostello"><code>@​martincostello</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1859">codecov/codecov-action#1859</a></li>
<li>fix: check reqs exist by <a
href="https://github.com/joseph-sentry"><code>@​joseph-sentry</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1835">codecov/codecov-action#1835</a></li>
<li>fix: Typo in README by <a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1838">codecov/codecov-action#1838</a></li>
<li>docs: Refine OIDC docs by <a
href="https://github.com/spalmurray"><code>@​spalmurray</code></a> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1837">codecov/codecov-action#1837</a></li>
<li>build(deps): bump github/codeql-action from 3.28.17 to 3.28.18 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1829">codecov/codecov-action#1829</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.4.3..v5.5.0">https://github.com/codecov/codecov-action/compare/v5.4.3..v5.5.0</a></p>
<h2>v5.4.3</h2>
<h3>What's Changed</h3>
<ul>
<li>build(deps): bump github/codeql-action from 3.28.13 to 3.28.17 by
<code>@​app/dependabot</code> in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1822">codecov/codecov-action#1822</a></li>
<li>fix: OIDC on forks by <a
href="https://github.com/joseph-sentry"><code>@​joseph-sentry</code></a>
in <a
href="https://redirect.github.com/codecov/codecov-action/pull/1823">codecov/codecov-action#1823</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.4.2..v5.4.3">https://github.com/codecov/codecov-action/compare/v5.4.2..v5.4.3</a></p>
<h2>v5.4.2</h2>
<h3>What's Changed</h3>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/codecov/codecov-action/compare/v5.4.1..v5.4.2">https://github.com/codecov/codecov-action/compare/v5.4.1..v5.4.2</a></p>
<h2>v5.4.1</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5a1091511a"><code>5a10915</code></a>
chore(release): 5.5.1 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1873">#1873</a>)</li>
<li><a
href="3e0ce21cac"><code>3e0ce21</code></a>
fix: overwrite pr number on fork (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1871">#1871</a>)</li>
<li><a
href="c4741c8197"><code>c4741c8</code></a>
build(deps): bump actions/checkout from 4.2.2 to 5.0.0 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1868">#1868</a>)</li>
<li><a
href="17370e8add"><code>17370e8</code></a>
build(deps): bump github/codeql-action from 3.29.9 to 3.29.11 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1867">#1867</a>)</li>
<li><a
href="18fdacf0ce"><code>18fdacf</code></a>
fix: update to use local app/ dir (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1872">#1872</a>)</li>
<li><a
href="206148c4b8"><code>206148c</code></a>
docs: fix typo in README (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1866">#1866</a>)</li>
<li><a
href="3cb13a1234"><code>3cb13a1</code></a>
Document a <code>codecov-cli</code> version reference example (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1774">#1774</a>)</li>
<li><a
href="a4803c1f8d"><code>a4803c1</code></a>
build(deps): bump github/codeql-action from 3.28.18 to 3.29.9 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1861">#1861</a>)</li>
<li><a
href="3139621497"><code>3139621</code></a>
build(deps): bump ossf/scorecard-action from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1833">#1833</a>)</li>
<li><a
href="fdcc847654"><code>fdcc847</code></a>
chore(release): 5.5.0 (<a
href="https://redirect.github.com/codecov/codecov-action/issues/1865">#1865</a>)</li>
<li>Additional commits viewable in <a
href="18283e04ce...5a1091511a">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=codecov/codecov-action&package-manager=github_actions&previous-version=5.4.3&new-version=5.5.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:54:46 +03:00
dependabot[bot]
28e5f35b17 build(deps): bump crate-ci/typos from 1.35.3 to 1.36.2 (#2080)
Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.35.3 to
1.36.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/crate-ci/typos/releases">crate-ci/typos's
releases</a>.</em></p>
<blockquote>
<h2>v1.36.2</h2>
<h2>[1.36.2] - 2025-09-04</h2>
<h3>Fixes</h3>
<ul>
<li>Fix regression from 1.36.1 when rendering an error for a line with
invalid UTF-8</li>
</ul>
<h2>v1.36.1</h2>
<h2>[1.36.1] - 2025-09-03</h2>
<h3>Fixes</h3>
<ul>
<li>Replaced the error rendering for various quality of life
improvements</li>
</ul>
<h2>v1.36.0</h2>
<h2>[1.36.0] - 2025-09-02</h2>
<h3>Features</h3>
<ul>
<li>Updated the dictionary with the <a
href="https://redirect.github.com/crate-ci/typos/issues/1345">August
2025</a> changes</li>
</ul>
<h2>v1.35.8</h2>
<h2>[1.35.8] - 2025-09-02</h2>
<h2>v1.35.7</h2>
<h2>[1.35.7] - 2025-08-29</h2>
<h3>Documentation</h3>
<ul>
<li>Expand PyPI metadata</li>
</ul>
<h2>v1.35.6</h2>
<h2>[1.35.6] - 2025-08-28</h2>
<h3>Fixes</h3>
<ul>
<li>Track <code>go.mod</code> as a golang file (regression from
1.13.21)</li>
</ul>
<h2>v1.35.5</h2>
<h2>[1.35.5] - 2025-08-18</h2>
<h3>Fixes</h3>
<ul>
<li>Fix typo in correction to <code>accidently</code></li>
<li>Fix typo in correction to <code>dynamincally</code></li>
<li>Fix typo in correction to <code>interruptability</code></li>
<li>Fix typo in correction to <code>interruptability</code></li>
<li>Fix typo in correction to <code>messager</code></li>
<li>Fix typo in correction to <code>preferables</code></li>
<li>Fix typo in correction to <code>producibles</code></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/crate-ci/typos/blob/master/CHANGELOG.md">crate-ci/typos's
changelog</a>.</em></p>
<blockquote>
<h1>Change Log</h1>
<p>All notable changes to this project will be documented in this
file.</p>
<p>The format is based on <a href="http://keepachangelog.com/">Keep a
Changelog</a>
and this project adheres to <a href="http://semver.org/">Semantic
Versioning</a>.</p>
<!-- raw HTML omitted -->
<h2>[Unreleased] - ReleaseDate</h2>
<h2>[1.36.2] - 2025-09-04</h2>
<h3>Fixes</h3>
<ul>
<li>Fix regression from 1.36.1 when rendering an error for a line with
invalid UTF-8</li>
</ul>
<h2>[1.36.1] - 2025-09-03</h2>
<h3>Fixes</h3>
<ul>
<li>Replaced the error rendering for various quality of life
improvements</li>
</ul>
<h2>[1.36.0] - 2025-09-02</h2>
<h3>Features</h3>
<ul>
<li>Updated the dictionary with the <a
href="https://redirect.github.com/crate-ci/typos/issues/1345">August
2025</a> changes</li>
</ul>
<h2>[1.35.8] - 2025-09-02</h2>
<h2>[1.35.7] - 2025-08-29</h2>
<h3>Documentation</h3>
<ul>
<li>Expand PyPI metadata</li>
</ul>
<h2>[1.35.6] - 2025-08-28</h2>
<h3>Fixes</h3>
<ul>
<li>Track <code>go.mod</code> as a golang file (regression from
1.13.21)</li>
</ul>
<h2>[1.35.5] - 2025-08-18</h2>
<h3>Fixes</h3>
<ul>
<li>Fix typo in correction to <code>accidently</code></li>
<li>Fix typo in correction to <code>dynamincally</code></li>
<li>Fix typo in correction to <code>interruptability</code></li>
<li>Fix typo in correction to <code>interruptability</code></li>
<li>Fix typo in correction to <code>messager</code></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="85f62a8a84"><code>85f62a8</code></a>
chore: Release</li>
<li><a
href="6f26306a91"><code>6f26306</code></a>
docs: Update changelog</li>
<li><a
href="6bd8b39b57"><code>6bd8b39</code></a>
Merge pull request <a
href="https://redirect.github.com/crate-ci/typos/issues/1374">#1374</a>
from epage/invalid</li>
<li><a
href="f5e19d3038"><code>f5e19d3</code></a>
fix(cli): Don't panic with invalid utf-8</li>
<li><a
href="5062775d92"><code>5062775</code></a>
test(cli): Generalize utf16 tests</li>
<li><a
href="b6297a6a50"><code>b6297a6</code></a>
chore: Release</li>
<li><a
href="e6d718928a"><code>e6d7189</code></a>
docs: Update changelog</li>
<li><a
href="1bf1ed2584"><code>1bf1ed2</code></a>
Merge pull request <a
href="https://redirect.github.com/crate-ci/typos/issues/1372">#1372</a>
from epage/render</li>
<li><a
href="9e79b8d2c6"><code>9e79b8d</code></a>
refactor(cli): Give control over the whole group</li>
<li><a
href="a5fa603453"><code>a5fa603</code></a>
refactor(cli): Extract snippet creation</li>
<li>Additional commits viewable in <a
href="52bd719c2c...85f62a8a84">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crate-ci/typos&package-manager=github_actions&previous-version=1.35.3&new-version=1.36.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:53:57 +03:00
dependabot[bot]
ba37ecebdb build(deps): bump actions/github-script from 7 to 8 (#2082)
Bumps [actions/github-script](https://github.com/actions/github-script)
from 7 to 8.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/github-script/releases">actions/github-script's
releases</a>.</em></p>
<blockquote>
<h2>v8.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update Node.js version support to 24.x by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li>
<li>README for updating actions/github-script from v7 to v8 by <a
href="https://github.com/sneha-krip"><code>@​sneha-krip</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li>
</ul>
<h2>⚠️ Minimum Compatible Runner Version</h2>
<p><strong>v2.327.1</strong><br />
<a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Release
Notes</a></p>
<p>Make sure your runner is updated to this version or newer to use this
release.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li>
<li><a
href="https://github.com/sneha-krip"><code>@​sneha-krip</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/github-script/compare/v7.1.0...v8.0.0">https://github.com/actions/github-script/compare/v7.1.0...v8.0.0</a></p>
<h2>v7.1.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Upgrade husky to v9 by <a
href="https://github.com/benelan"><code>@​benelan</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/482">actions/github-script#482</a></li>
<li>Add workflow file for publishing releases to immutable action
package by <a
href="https://github.com/Jcambass"><code>@​Jcambass</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/485">actions/github-script#485</a></li>
<li>Upgrade IA Publish by <a
href="https://github.com/Jcambass"><code>@​Jcambass</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/486">actions/github-script#486</a></li>
<li>Fix workflow status badges by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/497">actions/github-script#497</a></li>
<li>Update usage of <code>actions/upload-artifact</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/512">actions/github-script#512</a></li>
<li>Clear up package name confusion by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/514">actions/github-script#514</a></li>
<li>Update dependencies with <code>npm audit fix</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/515">actions/github-script#515</a></li>
<li>Specify that the used script is JavaScript by <a
href="https://github.com/timotk"><code>@​timotk</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/478">actions/github-script#478</a></li>
<li>chore: Add Dependabot for NPM and Actions by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/472">actions/github-script#472</a></li>
<li>Define <code>permissions</code> in workflows and update actions by
<a href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in
<a
href="https://redirect.github.com/actions/github-script/pull/531">actions/github-script#531</a></li>
<li>chore: Add Dependabot for .github/actions/install-dependencies by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/532">actions/github-script#532</a></li>
<li>chore: Remove .vscode settings by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/533">actions/github-script#533</a></li>
<li>ci: Use github/setup-licensed by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/473">actions/github-script#473</a></li>
<li>make octokit instance available as octokit on top of github, to make
it easier to seamlessly copy examples from GitHub rest api or octokit
documentations by <a
href="https://github.com/iamstarkov"><code>@​iamstarkov</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/508">actions/github-script#508</a></li>
<li>Remove <code>octokit</code> README updates for v7 by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/557">actions/github-script#557</a></li>
<li>docs: add &quot;exec&quot; usage examples by <a
href="https://github.com/neilime"><code>@​neilime</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/546">actions/github-script#546</a></li>
<li>Bump ruby/setup-ruby from 1.213.0 to 1.222.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/github-script/pull/563">actions/github-script#563</a></li>
<li>Bump ruby/setup-ruby from 1.222.0 to 1.229.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/github-script/pull/575">actions/github-script#575</a></li>
<li>Clearly document passing inputs to the <code>script</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/603">actions/github-script#603</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/610">actions/github-script#610</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/benelan"><code>@​benelan</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/482">actions/github-script#482</a></li>
<li><a href="https://github.com/Jcambass"><code>@​Jcambass</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/485">actions/github-script#485</a></li>
<li><a href="https://github.com/timotk"><code>@​timotk</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/478">actions/github-script#478</a></li>
<li><a
href="https://github.com/iamstarkov"><code>@​iamstarkov</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/508">actions/github-script#508</a></li>
<li><a href="https://github.com/neilime"><code>@​neilime</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/546">actions/github-script#546</a></li>
<li><a href="https://github.com/nebuk89"><code>@​nebuk89</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/610">actions/github-script#610</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/github-script/compare/v7...v7.1.0">https://github.com/actions/github-script/compare/v7...v7.1.0</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ed597411d8"><code>ed59741</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/github-script/issues/653">#653</a>
from actions/sneha-krip/readme-for-v8</li>
<li><a
href="2dc352e4ba"><code>2dc352e</code></a>
Bold minimum Actions Runner version in README</li>
<li><a
href="01e118c8d0"><code>01e118c</code></a>
Update README for Node 24 runtime requirements</li>
<li><a
href="8b222ac82e"><code>8b222ac</code></a>
Apply suggestion from <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a></li>
<li><a
href="adc0eeac99"><code>adc0eea</code></a>
README for updating actions/github-script from v7 to v8</li>
<li><a
href="20fe497b3f"><code>20fe497</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/github-script/issues/637">#637</a>
from actions/node24</li>
<li><a
href="e7b7f222b1"><code>e7b7f22</code></a>
update licenses</li>
<li><a
href="2c81ba05f3"><code>2c81ba0</code></a>
Update Node.js version support to 24.x</li>
<li>See full diff in <a
href="https://github.com/actions/github-script/compare/v7...v8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/github-script&package-manager=github_actions&previous-version=7&new-version=8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:53:23 +03:00
dependabot[bot]
a2b2f98868 build(deps): bump hashbrown from 0.15.5 to 0.16.0 (#2084)
Bumps [hashbrown](https://github.com/rust-lang/hashbrown) from 0.15.5 to
0.16.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/hashbrown/releases">hashbrown's
releases</a>.</em></p>
<blockquote>
<h2>v0.16.0</h2>
<h3>Changed</h3>
<ul>
<li>Bump foldhash, the default hasher, to 0.2.0.</li>
<li>Replaced <code>DefaultHashBuilder</code> with a newtype wrapper
around <code>foldhash</code> instead of re-exporting it directly.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/hashbrown/blob/master/CHANGELOG.md">hashbrown's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/rust-lang/hashbrown/compare/v0.15.5...v0.16.0">0.16.0</a>
- 2025-08-28</h2>
<h3>Changed</h3>
<ul>
<li>Bump foldhash, the default hasher, to 0.2.0.</li>
<li>Replaced <code>DefaultHashBuilder</code> with a newtype wrapper
around <code>foldhash</code> instead
of re-exporting it directly.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8d4def0edc"><code>8d4def0</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/643">#643</a>
from cuviper/newtype-hasher</li>
<li><a
href="e0f404cc0b"><code>e0f404c</code></a>
use <code>feature(hasher_prefixfree_extras)</code></li>
<li><a
href="95ffed34ed"><code>95ffed3</code></a>
Change <code>DefaultHashBuilder</code> to an opaque newtype</li>
<li><a
href="bf35a11329"><code>bf35a11</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/641">#641</a>
from hoxxep/foldhash-0.2</li>
<li><a
href="e2a634b37f"><code>e2a634b</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/642">#642</a>
from heiher/loong-simd-types</li>
<li><a
href="88794e7fc5"><code>88794e7</code></a>
loongarch64: Use unified data types for SIMD intrinsics</li>
<li><a
href="b22dd85cc3"><code>b22dd85</code></a>
perf: Bump foldhash to 0.2.0</li>
<li><a
href="fe72a08e63"><code>fe72a08</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/639">#639</a>
from gaujay/unbloat-get_inner-perf</li>
<li><a
href="71f8f37413"><code>71f8f37</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/637">#637</a>
from gaujay/add-benchmarks</li>
<li><a
href="f1c039c1f6"><code>f1c039c</code></a>
Un-bloat get_inner functions to restore lookup performance</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-lang/hashbrown/compare/v0.15.5...v0.16.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hashbrown&package-manager=cargo&previous-version=0.15.5&new-version=0.16.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:43:23 +03:00
dependabot[bot]
e799b732b6 build(deps): bump zizmorcore/zizmor-action from 0.1.1 to 0.2.0 (#2089)
Bumps
[zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action)
from 0.1.1 to 0.2.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/zizmorcore/zizmor-action/releases">zizmorcore/zizmor-action's
releases</a>.</em></p>
<blockquote>
<h2>v0.2.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat: add support for <code>color</code> input by <a
href="https://github.com/birjj"><code>@​birjj</code></a> in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/37">zizmorcore/zizmor-action#37</a></li>
<li>Adding option for GitHub annotations by <a
href="https://github.com/abdelq"><code>@​abdelq</code></a> in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/45">zizmorcore/zizmor-action#45</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/birjj"><code>@​birjj</code></a> made
their first contribution in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/37">zizmorcore/zizmor-action#37</a></li>
<li><a href="https://github.com/abdelq"><code>@​abdelq</code></a> made
their first contribution in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/45">zizmorcore/zizmor-action#45</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/zizmorcore/zizmor-action/compare/v0.1.2...v0.2.0">https://github.com/zizmorcore/zizmor-action/compare/v0.1.2...v0.2.0</a></p>
<h2>v0.1.2</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: allow version prefix of <code>v</code> by <a
href="https://github.com/martincostello"><code>@​martincostello</code></a>
in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/31">zizmorcore/zizmor-action#31</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/martincostello"><code>@​martincostello</code></a>
made their first contribution in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/31">zizmorcore/zizmor-action#31</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/zizmorcore/zizmor-action/compare/v0.1.1...v0.1.2">https://github.com/zizmorcore/zizmor-action/compare/v0.1.1...v0.1.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e673c3917a"><code>e673c39</code></a>
Adding option for GitHub annotations (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/45">#45</a>)</li>
<li><a
href="2d5a33f24d"><code>2d5a33f</code></a>
chore: add missing license (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/44">#44</a>)</li>
<li><a
href="a016d81e77"><code>a016d81</code></a>
chore(deps): bump github/codeql-action in the github-actions group (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/39">#39</a>)</li>
<li><a
href="a8fb1d7e7d"><code>a8fb1d7</code></a>
feat: add support for <code>color</code> input (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/37">#37</a>)</li>
<li><a
href="09680325f5"><code>0968032</code></a>
chore(deps): bump the github-actions group with 2 updates (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/35">#35</a>)</li>
<li><a
href="7f2abfff74"><code>7f2abff</code></a>
README: bump pins (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/33">#33</a>)</li>
<li><a
href="5ca5fc7a47"><code>5ca5fc7</code></a>
README: add note about v prefix (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/32">#32</a>)</li>
<li><a
href="9c58446551"><code>9c58446</code></a>
fix: allow version prefix of <code>v</code> (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/31">#31</a>)</li>
<li><a
href="c17832b972"><code>c17832b</code></a>
chore(deps): bump github/codeql-action in the github-actions group (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/30">#30</a>)</li>
<li><a
href="383d31df2e"><code>383d31d</code></a>
chore(deps): bump github/codeql-action in the github-actions group (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/27">#27</a>)</li>
<li>Additional commits viewable in <a
href="f52a838cfa...e673c3917a">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=zizmorcore/zizmor-action&package-manager=github_actions&previous-version=0.1.1&new-version=0.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:42:10 +03:00
lolbinarycat
b08b4cbd5e docs(terminal): add disclaimer about panics to Terminal::new (#2088)
<!-- Please read CONTRIBUTING.md before submitting any pull request. -->
part of #2087

cc @orhun

---------

Co-authored-by: Orhun Parmaksız <orhunparmaksiz@gmail.com>
2025-09-24 23:41:09 +03:00
dependabot[bot]
881d2452e0 build(deps): bump trybuild from 1.0.110 to 1.0.111 (#2092)
Bumps [trybuild](https://github.com/dtolnay/trybuild) from 1.0.110 to
1.0.111.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/trybuild/releases">trybuild's
releases</a>.</em></p>
<blockquote>
<h2>1.0.111</h2>
<ul>
<li>Normalize dependency crate's version in filepaths (<a
href="https://redirect.github.com/dtolnay/trybuild/issues/316">#316</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="31fbbb2dc6"><code>31fbbb2</code></a>
Release 1.0.111</li>
<li><a
href="d4dfc63d0a"><code>d4dfc63</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/trybuild/issues/316">#316</a>
from dtolnay/version</li>
<li><a
href="3caa02a1f0"><code>3caa02a</code></a>
Normalize dependency crate's version in paths</li>
<li><a
href="e1cfaadab8"><code>e1cfaad</code></a>
Update actions/checkout@v4 -&gt; v5</li>
<li>See full diff in <a
href="https://github.com/dtolnay/trybuild/compare/1.0.110...1.0.111">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=trybuild&package-manager=cargo&previous-version=1.0.110&new-version=1.0.111)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:40:47 +03:00
dependabot[bot]
cedad530fe build(deps): bump release-plz/action from 0.5.110 to 0.5.117 (#2090)
Bumps [release-plz/action](https://github.com/release-plz/action) from
0.5.110 to 0.5.117.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-plz/action/releases">release-plz/action's
releases</a>.</em></p>
<blockquote>
<h2>v0.5.117</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.146 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/222">release-plz/action#222</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.117">https://github.com/release-plz/action/compare/v0.5...v0.5.117</a></p>
<h2>v0.5.116</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.145 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/220">release-plz/action#220</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.116">https://github.com/release-plz/action/compare/v0.5...v0.5.116</a></p>
<h2>v0.5.115</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.144 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/219">release-plz/action#219</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.115">https://github.com/release-plz/action/compare/v0.5...v0.5.115</a></p>
<h2>v0.5.114</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.143 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/218">release-plz/action#218</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.114">https://github.com/release-plz/action/compare/v0.5...v0.5.114</a></p>
<h2>v0.5.113</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.142 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/217">release-plz/action#217</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.113">https://github.com/release-plz/action/compare/v0.5...v0.5.113</a></p>
<h2>v0.5.112</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.141 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/215">release-plz/action#215</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.112">https://github.com/release-plz/action/compare/v0.5...v0.5.112</a></p>
<h2>v0.5.111</h2>
<h2>What's Changed</h2>
<ul>
<li>build(deps): bump actions/checkout from 4 to 5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/release-plz/action/pull/212">release-plz/action#212</a></li>
<li>update cargo semver checks to v0.43 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/213">release-plz/action#213</a></li>
<li>Update to 0.3.140 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/214">release-plz/action#214</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.111">https://github.com/release-plz/action/compare/v0.5...v0.5.111</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="acb9246af4"><code>acb9246</code></a>
Update to 0.3.146 (<a
href="https://redirect.github.com/release-plz/action/issues/222">#222</a>)</li>
<li><a
href="27195cf771"><code>27195cf</code></a>
Update to 0.3.145 (<a
href="https://redirect.github.com/release-plz/action/issues/220">#220</a>)</li>
<li><a
href="574c1d0ed8"><code>574c1d0</code></a>
Update to 0.3.144 (<a
href="https://redirect.github.com/release-plz/action/issues/219">#219</a>)</li>
<li><a
href="d15ad33e74"><code>d15ad33</code></a>
Update to 0.3.143 (<a
href="https://redirect.github.com/release-plz/action/issues/218">#218</a>)</li>
<li><a
href="f4facd4a76"><code>f4facd4</code></a>
Update to 0.3.142 (<a
href="https://redirect.github.com/release-plz/action/issues/217">#217</a>)</li>
<li><a
href="f9715bc3b4"><code>f9715bc</code></a>
Update to 0.3.141 (<a
href="https://redirect.github.com/release-plz/action/issues/215">#215</a>)</li>
<li><a
href="a4ffad5637"><code>a4ffad5</code></a>
Update to 0.3.140 (<a
href="https://redirect.github.com/release-plz/action/issues/214">#214</a>)</li>
<li><a
href="8e4ec4422c"><code>8e4ec44</code></a>
update cargo semver checks to v0.43 (<a
href="https://redirect.github.com/release-plz/action/issues/213">#213</a>)</li>
<li><a
href="a27e254757"><code>a27e254</code></a>
build(deps): bump actions/checkout from 4 to 5 (<a
href="https://redirect.github.com/release-plz/action/issues/212">#212</a>)</li>
<li>See full diff in <a
href="ccf6dd9984...acb9246af4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=release-plz/action&package-manager=github_actions&previous-version=0.5.110&new-version=0.5.117)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:40:27 +03:00
dependabot[bot]
0e6c8f89be build(deps): bump taiki-e/install-action from 2.56.7 to 2.62.1 (#2095)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps
[taiki-e/install-action](https://github.com/taiki-e/install-action) from
2.56.7 to 2.62.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/releases">taiki-e/install-action's
releases</a>.</em></p>
<blockquote>
<h2>2.62.1</h2>
<ul>
<li>
<p>Update <code>mise@latest</code> to 2025.9.15.</p>
</li>
<li>
<p>Update <code>cargo-udeps@latest</code> to 0.1.59.</p>
</li>
<li>
<p>Update <code>git-cliff@latest</code> to 2.10.1.</p>
</li>
</ul>
<h2>2.62.0</h2>
<ul>
<li>Support <code>cargo-deadlinks</code> (<a
href="https://redirect.github.com/taiki-e/install-action/pull/1161">#1161</a>,
thanks <a
href="https://github.com/BenjaminBrienen"><code>@​BenjaminBrienen</code></a>)</li>
</ul>
<h2>2.61.13</h2>
<ul>
<li>
<p>Update <code>cargo-semver-checks@latest</code> to 0.44.0.</p>
</li>
<li>
<p>Update <code>mise@latest</code> to 2025.9.14.</p>
</li>
<li>
<p>Update <code>wasmtime@latest</code> to 37.0.0.</p>
</li>
</ul>
<h2>2.61.12</h2>
<ul>
<li>
<p>Update <code>parse-changelog@latest</code> to 0.6.14.</p>
</li>
<li>
<p>Update <code>xh@latest</code> to 0.25.0.</p>
</li>
<li>
<p>Update <code>mise@latest</code> to 2025.9.13.</p>
</li>
<li>
<p>Update <code>uv@latest</code> to 0.8.19.</p>
</li>
</ul>
<h2>2.61.11</h2>
<ul>
<li>
<p>Update <code>cargo-no-dev-deps@latest</code> to 0.2.18.</p>
</li>
<li>
<p>Update <code>cargo-minimal-versions@latest</code> to 0.1.33.</p>
</li>
<li>
<p>Update <code>cargo-hack@latest</code> to 0.6.39.</p>
</li>
</ul>
<h2>2.61.10</h2>
<ul>
<li>Update <code>uv@latest</code> to 0.8.18.</li>
</ul>
<h2>2.61.9</h2>
<ul>
<li>Update <code>wasm-bindgen@latest</code> to 0.2.103.</li>
</ul>
<h2>2.61.8</h2>
<ul>
<li>
<p>Update <code>wasm-bindgen@latest</code> to 0.2.102.</p>
</li>
<li>
<p>Update <code>vacuum@latest</code> to 0.18.3.</p>
</li>
<li>
<p>Update <code>mise@latest</code> to 2025.9.12.</p>
</li>
</ul>
<h2>2.61.7</h2>
<ul>
<li>Update <code>vacuum@latest</code> to 0.18.0.</li>
</ul>
<h2>2.61.6</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md">taiki-e/install-action's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<p>All notable changes to this project will be documented in this
file.</p>
<p>This project adheres to <a href="https://semver.org">Semantic
Versioning</a>.</p>
<!-- raw HTML omitted -->
<h2>[Unreleased]</h2>
<h2>[2.62.1] - 2025-09-22</h2>
<ul>
<li>
<p>Update <code>mise@latest</code> to 2025.9.15.</p>
</li>
<li>
<p>Update <code>cargo-udeps@latest</code> to 0.1.59.</p>
</li>
<li>
<p>Update <code>git-cliff@latest</code> to 2.10.1.</p>
</li>
</ul>
<h2>[2.62.0] - 2025-09-21</h2>
<ul>
<li>Support <code>cargo-deadlinks</code> (<a
href="https://redirect.github.com/taiki-e/install-action/pull/1161">#1161</a>,
thanks <a
href="https://github.com/BenjaminBrienen"><code>@​BenjaminBrienen</code></a>)</li>
</ul>
<h2>[2.61.13] - 2025-09-21</h2>
<ul>
<li>
<p>Update <code>cargo-semver-checks@latest</code> to 0.44.0.</p>
</li>
<li>
<p>Update <code>mise@latest</code> to 2025.9.14.</p>
</li>
<li>
<p>Update <code>wasmtime@latest</code> to 37.0.0.</p>
</li>
</ul>
<h2>[2.61.12] - 2025-09-20</h2>
<ul>
<li>
<p>Update <code>parse-changelog@latest</code> to 0.6.14.</p>
</li>
<li>
<p>Update <code>xh@latest</code> to 0.25.0.</p>
</li>
<li>
<p>Update <code>mise@latest</code> to 2025.9.13.</p>
</li>
<li>
<p>Update <code>uv@latest</code> to 0.8.19.</p>
</li>
</ul>
<h2>[2.61.11] - 2025-09-19</h2>
<ul>
<li>
<p>Update <code>cargo-no-dev-deps@latest</code> to 0.2.18.</p>
</li>
<li>
<p>Update <code>cargo-minimal-versions@latest</code> to 0.1.33.</p>
</li>
<li>
<p>Update <code>cargo-hack@latest</code> to 0.6.39.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d6912b4777"><code>d6912b4</code></a>
Release 2.62.1</li>
<li><a
href="ac4d226188"><code>ac4d226</code></a>
Update <code>mise@latest</code> to 2025.9.15</li>
<li><a
href="a878b7011d"><code>a878b70</code></a>
Update <code>cargo-udeps@latest</code> to 0.1.59</li>
<li><a
href="16ab0e7b53"><code>16ab0e7</code></a>
Update <code>git-cliff@latest</code> to 2.10.1</li>
<li><a
href="0e09747a63"><code>0e09747</code></a>
Release 2.62.0</li>
<li><a
href="1856fd6ff0"><code>1856fd6</code></a>
Update changelog</li>
<li><a
href="ed4255be07"><code>ed4255b</code></a>
Support cargo-deadlinks (<a
href="https://redirect.github.com/taiki-e/install-action/issues/1161">#1161</a>)</li>
<li><a
href="3c3a266059"><code>3c3a266</code></a>
Release 2.61.13</li>
<li><a
href="e814402cd9"><code>e814402</code></a>
Update <code>cargo-semver-checks@latest</code> to 0.44.0</li>
<li><a
href="e34e0638e2"><code>e34e063</code></a>
Update <code>mise@latest</code> to 2025.9.14</li>
<li>Additional commits viewable in <a
href="https://github.com/taiki-e/install-action/compare/v2.56.7...d6912b47771be2c443ec90dbb3d28e023987e782">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=taiki-e/install-action&package-manager=github_actions&previous-version=2.56.7&new-version=2.62.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:40:06 +03:00
dependabot[bot]
aa6d8c9200 build(deps): bump dtolnay/rust-toolchain from b3b07ba8b418998c39fb20f53e8b695cdcc8de1b to 6d653acede28d24f02e3cd41383119e8b1b35921 (#2096)
Bumps
[dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from
b3b07ba8b418998c39fb20f53e8b695cdcc8de1b to
6d653acede28d24f02e3cd41383119e8b1b35921.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6d653acede"><code>6d653ac</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/rust-toolchain/issues/171">#171</a>
from dtolnay/up</li>
<li><a
href="30dc51db75"><code>30dc51d</code></a>
Update Linux arm64 runner to Ubuntu 24.04</li>
<li><a
href="e97e2d8cc3"><code>e97e2d8</code></a>
Update actions/checkout@v4 -&gt; v5</li>
<li><a
href="3bd6ba104c"><code>3bd6ba1</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/rust-toolchain/issues/168">#168</a>
from dtolnay/sed</li>
<li><a
href="0185c06042"><code>0185c06</code></a>
Fix update-revs.sh to recognize only the intended <code>required:
true</code></li>
<li><a
href="350b8170d6"><code>350b817</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/rust-toolchain/issues/166">#166</a>
from dtolnay/fix1</li>
<li><a
href="6ded28b5b7"><code>6ded28b</code></a>
Try without comment?</li>
<li><a
href="cc2784cec7"><code>cc2784c</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/rust-toolchain/issues/165">#165</a>
from dtolnay/fix2</li>
<li><a
href="f6642a8e0a"><code>f6642a8</code></a>
Try without backtick?</li>
<li><a
href="5ee21dc396"><code>5ee21dc</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/rust-toolchain/issues/162">#162</a>
from dtolnay/pin</li>
<li>Additional commits viewable in <a
href="b3b07ba8b4...6d653acede">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 23:38:44 +03:00
dependabot[bot]
bbe590ab08 build(deps): bump clap from 4.5.45 to 4.5.48 (#2097)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.45 to 4.5.48.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.48</h2>
<h2>[4.5.48] - 2025-09-19</h2>
<h3>Documentation</h3>
<ul>
<li>Add a new CLI Concepts document as another way of framing clap</li>
<li>Expand the <code>typed_derive</code> cookbook entry</li>
</ul>
<h2>v4.5.47</h2>
<h2>[4.5.47] - 2025-09-02</h2>
<h3>Features</h3>
<ul>
<li>Added <code>impl FromArgMatches for ()</code></li>
<li>Added <code>impl Args for ()</code></li>
<li>Added <code>impl Subcommand for ()</code></li>
<li>Added <code>impl FromArgMatches for Infallible</code></li>
<li>Added <code>impl Subcommand for Infallible</code></li>
</ul>
<h3>Fixes</h3>
<ul>
<li><em>(derive)</em> Update runtime error text to match
<code>clap</code></li>
</ul>
<h2>v4.5.46</h2>
<h2>[4.5.46] - 2025-08-26</h2>
<h3>Features</h3>
<ul>
<li>Expose <code>StyledStr::push_str</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.48] - 2025-09-19</h2>
<h3>Documentation</h3>
<ul>
<li>Add a new CLI Concepts document as another way of framing clap</li>
<li>Expand the <code>typed_derive</code> cookbook entry</li>
</ul>
<h2>[4.5.47] - 2025-09-02</h2>
<h3>Features</h3>
<ul>
<li>Added <code>impl FromArgMatches for ()</code></li>
<li>Added <code>impl Args for ()</code></li>
<li>Added <code>impl Subcommand for ()</code></li>
<li>Added <code>impl FromArgMatches for Infallible</code></li>
<li>Added <code>impl Subcommand for Infallible</code></li>
</ul>
<h3>Fixes</h3>
<ul>
<li><em>(derive)</em> Update runtime error text to match
<code>clap</code></li>
</ul>
<h2>[4.5.46] - 2025-08-26</h2>
<h3>Features</h3>
<ul>
<li>Expose <code>StyledStr::push_str</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c3a1ddc118"><code>c3a1ddc</code></a>
chore: Release</li>
<li><a
href="4460ff44b3"><code>4460ff4</code></a>
docs: Update changelog</li>
<li><a
href="54947a1b4b"><code>54947a1</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5981">#5981</a>
from mernen/fix-bash-clap-complete-space</li>
<li><a
href="fd3f6d271d"><code>fd3f6d2</code></a>
fix(complete): Restore nospace in bash</li>
<li><a
href="2f6a1083d9"><code>2f6a108</code></a>
test(complete): Demonstrate current behavior</li>
<li><a
href="f88be5738e"><code>f88be57</code></a>
style: Ensure consistent newlines</li>
<li><a
href="f209bce220"><code>f209bce</code></a>
chore: Release</li>
<li><a
href="f33ff7f81a"><code>f33ff7f</code></a>
docs: Update changelog</li>
<li><a
href="bf06e6f8f6"><code>bf06e6f</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5974">#5974</a>
from kryvashek/support-clearing-args-matches</li>
<li><a
href="5d357ada53"><code>5d357ad</code></a>
feat(parser): Added ArgMatches::try_clear_id()</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.45...clap_complete-v4.5.48">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.45&new-version=4.5.48)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 18:56:47 +02:00
dependabot[bot]
b507b38c58 build(deps): bump time from 0.3.41 to 0.3.44 (#2098)
Bumps [time](https://github.com/time-rs/time) from 0.3.41 to 0.3.44.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/time-rs/time/releases">time's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.44</h2>
<p>See the <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">changelog</a>
for details.</p>
<h2>v0.3.43</h2>
<p>See the <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">changelog</a>
for details.</p>
<h2>v0.3.42</h2>
<p>See the <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">changelog</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">time's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.44 [2025-09-19]</h2>
<h3>Fixed</h3>
<ul>
<li>Comparisons of <code>PrimitiveDateTime</code>,
<code>UtcDateTime</code>, and <code>OffsetDateTime</code> with differing
signs (i.e.
one negative and one positive year) would return the inverse result of
what was expected. This was
introduced in v0.3.42 and has been fixed.</li>
<li>Type inference would fail due to feature unification when
<code>wasm-bindgen</code> enabled <code>serde_json</code>.
This has been fixed by explicitly specifying the type in the relevant
locations.</li>
</ul>
<h2>0.3.43 [2025-09-02]</h2>
<h3>Added</h3>
<ul>
<li>Support for <code>rand</code> 0.9</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>In the <code>convert</code> module, any use of <code>per</code> with
types that were not the same (such as
<code>Nanosecond::per(Second)</code>) would not compile due to a bug.
This has been fixed.</li>
</ul>
<h2>0.3.42 [2025-08-31]</h2>
<h3>Added</h3>
<ul>
<li><code>Time::duration_until</code></li>
<li><code>Time::duration_since</code></li>
<li><code>per_t</code> method for all types in
<code>time::convert</code>. This is similar to the existing
<code>per</code> method, but
can return any of the primitive numeric types that can represent the
result. This will cut down on
<code>as</code> casts while ensuring correctness. Type inference isn't
perfect, so you may need to provide a
type annotation in some situations.</li>
<li><code>impl PartialOrd for Month</code> and <code>impl Ord for
Month</code>; this assumes the months are in the same year</li>
<li><code>SystemTimeExt</code> trait, adding methods for checked
arithmetic with <code>time::Duration</code> and obtaining
the difference between two <code>SystemTime</code>s as a
<code>time::Duration</code></li>
<li>Permit using <code>UtcDateTime</code> with <code>rand</code> (this
was inadvertently omitted previously)</li>
<li><code>impl core::error::Error</code> for all error types (now
available when the <code>std</code> feature is disabled)</li>
<li>MacOS can now obtain the local UTC offset in multi-threaded programs
as the system APIs are
thread-safe.</li>
<li><code>#[track_caller]</code> has been added to all relevant
methods.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>The minimum supported Rust version is now 1.81.0.</li>
<li>The dependency on <code>itoa</code> has been removed, as the
standard library now has similar functionality
by default.</li>
<li>Formatting a component that involves a floating point number is now
guaranteed to be
deterministic, avoiding any subtle differences between platforms or
compiler versions.</li>
</ul>
<h3>Fixed</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="04c0ef2838"><code>04c0ef2</code></a>
v0.3.44 release</li>
<li><a
href="b9420633a3"><code>b942063</code></a>
Compare datetimes with signed integers</li>
<li><a
href="dcdfbf62a9"><code>dcdfbf6</code></a>
Add explicit type to avoid inference errors</li>
<li><a
href="f20385296a"><code>f203852</code></a>
Revert &quot;Remove dependency on <code>itoa</code>&quot;</li>
<li><a
href="45b9932e57"><code>45b9932</code></a>
v0.3.43 release</li>
<li><a
href="8cbf0dbff0"><code>8cbf0db</code></a>
Fix bug with <code>convert</code></li>
<li><a
href="3343e85826"><code>3343e85</code></a>
Add support for rand 0.9</li>
<li><a
href="afb2574f94"><code>afb2574</code></a>
Add note about MSRV</li>
<li><a
href="ed2852e3b2"><code>ed2852e</code></a>
v0.3.42 release</li>
<li><a
href="1067543c7f"><code>1067543</code></a>
Fix copied comment</li>
<li>Additional commits viewable in <a
href="https://github.com/time-rs/time/compare/v0.3.41...v0.3.44">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=time&package-manager=cargo&previous-version=0.3.41&new-version=0.3.44)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 18:49:17 +02:00
Shingo OKAWA
8aefc06a90 test(macros): regenerate trybuild stderr (#2093)
### Overview

Updated the `.stderr` file corresponding to the
`ratatui-macros/tests/ui/fails.rs` compile-fail test.

### Changes

- Updated `tests/ui/fails.stderr` to match the new compiler output.

### Impact

- Affects only the trybuild UI tests
- No impact on production code

### Notes

- The `.stderr` was generated using `TRYBUILD=overwrite cargo test`.

Closes https://github.com/ratatui/ratatui/issues/2094

Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com>
2025-09-23 22:55:06 +03:00
Ryan Roden-Corrent
03f3f6df35 feat(style): allow add/sub modifiers to be omitted in Style serialization. (#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_modifier` and
`sub_modifier` are
not specified. That means the following TOML config:

```toml
[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".
2025-09-19 21:57:55 +03:00
dependabot[bot]
ecef506a2b build(deps): bump bitflags from 2.9.2 to 2.9.3 (#2064)
Bumps [bitflags](https://github.com/bitflags/bitflags) from 2.9.2 to
2.9.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bitflags/bitflags/releases">bitflags's
releases</a>.</em></p>
<blockquote>
<h2>2.9.3</h2>
<h2>What's Changed</h2>
<ul>
<li>Streamline generated code by <a
href="https://github.com/nnethercote"><code>@​nnethercote</code></a> in
<a
href="https://redirect.github.com/bitflags/bitflags/pull/458">bitflags/bitflags#458</a></li>
<li>Prepare for 2.9.3 release by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/bitflags/bitflags/pull/459">bitflags/bitflags#459</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/nnethercote"><code>@​nnethercote</code></a>
made their first contribution in <a
href="https://redirect.github.com/bitflags/bitflags/pull/458">bitflags/bitflags#458</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bitflags/bitflags/compare/2.9.2...2.9.3">https://github.com/bitflags/bitflags/compare/2.9.2...2.9.3</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bitflags/bitflags/blob/main/CHANGELOG.md">bitflags's
changelog</a>.</em></p>
<blockquote>
<h1>2.9.3</h1>
<h2>What's Changed</h2>
<ul>
<li>Streamline generated code by <a
href="https://github.com/nnethercote"><code>@​nnethercote</code></a> in
<a
href="https://redirect.github.com/bitflags/bitflags/pull/458">bitflags/bitflags#458</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/nnethercote"><code>@​nnethercote</code></a>
made their first contribution in <a
href="https://redirect.github.com/bitflags/bitflags/pull/458">bitflags/bitflags#458</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bitflags/bitflags/compare/2.9.2...2.9.3">https://github.com/bitflags/bitflags/compare/2.9.2...2.9.3</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f59ad49e71"><code>f59ad49</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/459">#459</a>
from KodrAus/cargo/2.9.3</li>
<li><a
href="2c3a4f4a4a"><code>2c3a4f4</code></a>
prepare for 2.9.3 release</li>
<li><a
href="9e1cf3eaca"><code>9e1cf3e</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/458">#458</a>
from nnethercote/streamline-generated-code</li>
<li><a
href="a3f1f78b5d"><code>a3f1f78</code></a>
Avoid calling
<code>InternalBitFlags::{bits,from_bits_retain}</code>.</li>
<li><a
href="aead794e31"><code>aead794</code></a>
Avoid local variables in generated code.</li>
<li>See full diff in <a
href="https://github.com/bitflags/bitflags/compare/2.9.2...2.9.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bitflags&package-manager=cargo&previous-version=2.9.2&new-version=2.9.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 21:50:05 +02:00
Jagoda Estera Ślązak
e89a526aab feat(no_std): portable-atomic integration for targets with no atomic types (#2076)
Improves compatibility with no-std targets that don't support atomic
types.

We support three different scenarios depending on the target:
1. Terminal applications and other std targets (e.g. espidf):
- `std` enabled, `portable-atomic` disabled
2. Embedded targets with atomic types, bare metal x86, etc.:
- `std` disabled `portable-atomic` disabled
3. Embedded targets without atomic types (e.g. single-core MCUs):
- `std` disabled, `portable-atomic` enabled

Turning on `portable-atomic` together with `std` will fall back to `std`
atomic.
2025-09-04 20:14:25 +02:00
Josh McKinney
46e7c6cbbf chore: document rustfmt options (#2055) 2025-09-01 18:48:09 +03:00
dependabot[bot]
9a4f5af613 build(deps): bump tracing-subscriber from 0.3.19 to 0.3.20 in the cargo group (#2074)
Bumps the cargo group with 1 update:
[tracing-subscriber](https://github.com/tokio-rs/tracing).

Updates `tracing-subscriber` from 0.3.19 to 0.3.20
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/tracing/releases">tracing-subscriber's
releases</a>.</em></p>
<blockquote>
<h2>tracing-subscriber 0.3.20</h2>
<p><strong>Security Fix</strong>: ANSI Escape Sequence Injection
(CVE-TBD)</p>
<h2>Impact</h2>
<p>Previous versions of tracing-subscriber were vulnerable to ANSI
escape sequence injection attacks. Untrusted user input containing ANSI
escape sequences could be injected into terminal output when logged,
potentially allowing attackers to:</p>
<ul>
<li>Manipulate terminal title bars</li>
<li>Clear screens or modify terminal display</li>
<li>Potentially mislead users through terminal manipulation</li>
</ul>
<p>In isolation, impact is minimal, however security issues have been
found in terminal emulators that enabled an attacker to use ANSI escape
sequences via logs to exploit vulnerabilities in the terminal
emulator.</p>
<h2>Solution</h2>
<p>Version 0.3.20 fixes this vulnerability by escaping ANSI control
characters in when writing events to destinations that may be printed to
the terminal.</p>
<h2>Affected Versions</h2>
<p>All versions of tracing-subscriber prior to 0.3.20 are affected by
this vulnerability.</p>
<h2>Recommendations</h2>
<p>Immediate Action Required: We recommend upgrading to
tracing-subscriber 0.3.20 immediately, especially if your
application:</p>
<ul>
<li>Logs user-provided input (form data, HTTP headers, query parameters,
etc.)</li>
<li>Runs in environments where terminal output is displayed to
users</li>
</ul>
<h2>Migration</h2>
<p>This is a patch release with no breaking API changes. Simply update
your Cargo.toml:</p>
<pre lang="toml"><code>[dependencies]
tracing-subscriber = &quot;0.3.20&quot;
</code></pre>
<h2>Acknowledgments</h2>
<p>We would like to thank <a href="http://github.com/zefr0x">zefr0x</a>
who responsibly reported the issue at
<code>security@tokio.rs</code>.</p>
<p>If you believe you have found a security vulnerability in any
tokio-rs project, please email us at <code>security@tokio.rs</code>.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4c52ca5266"><code>4c52ca5</code></a>
fmt: fix ANSI escape sequence injection vulnerability (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3368">#3368</a>)</li>
<li><a
href="f71cebe41e"><code>f71cebe</code></a>
subscriber: impl Clone for EnvFilter (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3360">#3360</a>)</li>
<li><a
href="3a1f571102"><code>3a1f571</code></a>
Fix CI (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3361">#3361</a>)</li>
<li><a
href="e63ef57f3d"><code>e63ef57</code></a>
chore: prepare tracing-attributes 0.1.30 (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3316">#3316</a>)</li>
<li><a
href="6e59a13b1a"><code>6e59a13</code></a>
attributes: fix tracing::instrument regression around shadowing (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3311">#3311</a>)</li>
<li><a
href="e4df761275"><code>e4df761</code></a>
tracing: update core to 0.1.34 and attributes to 0.1.29 (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3305">#3305</a>)</li>
<li><a
href="643f392ebb"><code>643f392</code></a>
chore: prepare tracing-attributes 0.1.29 (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3304">#3304</a>)</li>
<li><a
href="d08e7a6eea"><code>d08e7a6</code></a>
chore: prepare tracing-core 0.1.34 (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3302">#3302</a>)</li>
<li><a
href="6e70c571d3"><code>6e70c57</code></a>
tracing-subscriber: count numbers of enters in <code>Timings</code> (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/2944">#2944</a>)</li>
<li><a
href="c01d4fd9de"><code>c01d4fd</code></a>
fix docs and enable CI on <code>main</code> branch (<a
href="https://redirect.github.com/tokio-rs/tracing/issues/3295">#3295</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.19...tracing-subscriber-0.3.20">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tracing-subscriber&package-manager=cargo&previous-version=0.3.19&new-version=0.3.20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/ratatui/ratatui/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 09:46:37 +02:00
dependabot[bot]
0a9ff761a4 build(deps): bump thiserror from 2.0.15 to 2.0.16 (#2069)
Bumps [thiserror](https://github.com/dtolnay/thiserror) from 2.0.15 to
2.0.16.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/thiserror/releases">thiserror's
releases</a>.</em></p>
<blockquote>
<h2>2.0.16</h2>
<ul>
<li>Add to &quot;no-std&quot; crates.io category (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/429">#429</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="40b58536cc"><code>40b5853</code></a>
Release 2.0.16</li>
<li><a
href="83dfb5f99b"><code>83dfb5f</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/thiserror/issues/429">#429</a>
from dtolnay/nostd</li>
<li><a
href="9b4a99fb90"><code>9b4a99f</code></a>
Add to &quot;no-std&quot; crates.io category</li>
<li>See full diff in <a
href="https://github.com/dtolnay/thiserror/compare/2.0.15...2.0.16">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=2.0.15&new-version=2.0.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-26 21:07:21 +03:00
dependabot[bot]
632ce79adf build(deps): bump clap-verbosity-flag from 3.0.3 to 3.0.4 (#2070)
Bumps
[clap-verbosity-flag](https://github.com/clap-rs/clap-verbosity-flag)
from 3.0.3 to 3.0.4.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap-verbosity-flag/blob/master/CHANGELOG.md">clap-verbosity-flag's
changelog</a>.</em></p>
<blockquote>
<h2>[3.0.4] - 2025-08-19</h2>
<h3>Features</h3>
<ul>
<li>Add <code>serde</code> feature for when mixing CLI and config</li>
<li>Add comparison operators to types</li>
<li>Add conversions between <code>Verbosity</code> and
<code>VerbosityFilter</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5e051e6c96"><code>5e051e6</code></a>
chore: Release clap-verbosity-flag version 3.0.4</li>
<li><a
href="7e81cfd0a4"><code>7e81cfd</code></a>
docs: Update changelog</li>
<li><a
href="210e8d9b0e"><code>210e8d9</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/114">#114</a>
from joshka/jm/serde</li>
<li><a
href="44f0caae99"><code>44f0caa</code></a>
feat: Implement Serialization and Deserialization</li>
<li><a
href="f735876936"><code>f735876</code></a>
feat: Add conversion methods between Verbosity and VerbosityFilter</li>
<li><a
href="e6f4e62f94"><code>e6f4e62</code></a>
feat: Add Eq, and PartialEq impls to various types</li>
<li><a
href="5e1afbe4ad"><code>5e1afbe</code></a>
chore(deps): Update Rust Stable to v1.89 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/147">#147</a>)</li>
<li><a
href="70812d8da8"><code>70812d8</code></a>
chore(deps): Update Rust Stable to v1.88 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/146">#146</a>)</li>
<li><a
href="97637bc6f7"><code>97637bc</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/145">#145</a>
from epage/template</li>
<li><a
href="e9231b150d"><code>e9231b1</code></a>
chore: Update from _rust/main template</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap-verbosity-flag/compare/v3.0.3...v3.0.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap-verbosity-flag&package-manager=cargo&previous-version=3.0.3&new-version=3.0.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-26 20:52:37 +03:00
Dominique Martinet
564a9d76fc fix(line-gauge): pad default label to display 3 numbers (#2053)
Display the default label of the LineGauge widget padded to fill 3 cells.
This makes it so that the label doesn't shift around when going from a
single digit to double / triple digits.

To maintain the existing behavior, use a custom label by calling `.label()`
on the LineGauge.
2025-08-22 11:11:38 -07:00
Josh McKinney
2d713d723d feat(crossterm): allow multiple crossterm versions (#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_28` and `crossterm_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.
2025-08-17 12:43:18 -07:00
Shingo OKAWA
86cd5292dd chore(deps): update slab and zerovec (#2050)
## Summary
This PR updates the `slab` dependency from 0.4.10 to 0.4.11 to fix
[RUSTSEC-2025-0047](https://rustsec.org/advisories/RUSTSEC-2025-0047), a
security
advisory about a bounds check bug in `get_disjoint_mut` that could lead
to reading
uninitialized memory. Also updates `zerovec` to the latest non-yanked
version to resolve cargo-deny warnings.

## Changes
- Updated `slab` to 0.4.11
- Updated `zerovec` to latest available version
- Regenerated `Cargo.lock`

## References
- https://rustsec.org/advisories/RUSTSEC-2025-0047
-
https://github.com/ratatui/ratatui/actions/runs/16983398723/job/48147754711?pr=1963

Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com>
2025-08-15 12:03:55 +03:00
kashregister
a21501f7f4 test(bench): Added a benchmark for constraints (#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.
2025-08-12 14:49:00 -07:00
Josh McKinney
75b78be09f feat: add width() impl for tabs (#2049)
The purpose of this is to make it easy for apps to easily calculate the
total tab width including all dividers and padding.
2025-08-12 14:39:27 -07:00
Jagoda Estera Ślązak
719badb5b8 chore: skip alpha and beta tags in cliff.toml (#2026)
https://github.com/ratatui/ratatui/pull/2025#issuecomment-3135177683
2025-08-12 08:02:01 +02:00
dependabot[bot]
879e09787e build(deps): bump crate-ci/typos from 1.34.0 to 1.35.3 (#2044)
Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.34.0 to
1.35.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/crate-ci/typos/releases">crate-ci/typos's
releases</a>.</em></p>
<blockquote>
<h2>v1.35.3</h2>
<h2>[1.35.3] - 2025-08-08</h2>
<h3>Fixes</h3>
<ul>
<li>Don't correct <code>ratatui</code> in Rust files</li>
</ul>
<h2>v1.35.2</h2>
<h2>[1.35.2] - 2025-08-07</h2>
<h3>Fixes</h3>
<ul>
<li>Don't correct <code>unmarshaling</code></li>
</ul>
<h2>v1.35.1</h2>
<h2>[1.35.1] - 2025-08-04</h2>
<h3>Fixes</h3>
<ul>
<li>Fix typo in correction to <code>apostroph</code></li>
<li>Fix typo in correction to <code>cordinate</code></li>
<li>Fix typo in correction to <code>reproduceability</code></li>
<li>Fix typo in correction to <code>revolutionss</code></li>
<li>Fix typo in correction to <code>transivity</code></li>
</ul>
<h2>v1.35.0</h2>
<h2>[1.35.0] - 2025-08-04</h2>
<h3>Features</h3>
<ul>
<li>Updated the dictionary with the <a
href="https://redirect.github.com/crate-ci/typos/issues/1331">July
2025</a> changes</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/crate-ci/typos/blob/master/CHANGELOG.md">crate-ci/typos's
changelog</a>.</em></p>
<blockquote>
<h1>Change Log</h1>
<p>All notable changes to this project will be documented in this
file.</p>
<p>The format is based on <a href="http://keepachangelog.com/">Keep a
Changelog</a>
and this project adheres to <a href="http://semver.org/">Semantic
Versioning</a>.</p>
<!-- raw HTML omitted -->
<h2>[Unreleased] - ReleaseDate</h2>
<h2>[1.35.3] - 2025-08-08</h2>
<h3>Fixes</h3>
<ul>
<li>Don't correct <code>ratatui</code> in Rust files</li>
</ul>
<h2>[1.35.2] - 2025-08-07</h2>
<h3>Fixes</h3>
<ul>
<li>Don't correct <code>unmarshaling</code></li>
</ul>
<h2>[1.35.1] - 2025-08-04</h2>
<h3>Fixes</h3>
<ul>
<li>Fix typo in correction to <code>apostroph</code></li>
<li>Fix typo in correction to <code>cordinate</code></li>
<li>Fix typo in correction to <code>reproduceability</code></li>
<li>Fix typo in correction to <code>revolutionss</code></li>
<li>Fix typo in correction to <code>transivity</code></li>
</ul>
<h2>[1.35.0] - 2025-08-04</h2>
<h3>Features</h3>
<ul>
<li>Updated the dictionary with the <a
href="https://redirect.github.com/crate-ci/typos/issues/1331">July
2025</a> changes</li>
</ul>
<h2>[1.34.0] - 2025-06-30</h2>
<h3>Features</h3>
<ul>
<li>Updated the dictionary with the <a
href="https://redirect.github.com/crate-ci/typos/issues/1309">June
2025</a> changes</li>
</ul>
<h2>[1.33.1] - 2025-06-02</h2>
<h3>Fixes</h3>
<ul>
<li><em>(dict)</em> Don't correct <code>wasn't</code> to
<code>wasm't</code></li>
</ul>
<h2>[1.33.0] - 2025-06-02</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="52bd719c2c"><code>52bd719</code></a>
chore: Release</li>
<li><a
href="c6f77dda9e"><code>c6f77dd</code></a>
docs: Update changelog</li>
<li><a
href="e35d08c453"><code>e35d08c</code></a>
Merge pull request <a
href="https://redirect.github.com/crate-ci/typos/issues/1353">#1353</a>
from Rolv-Apneseth/ratatui</li>
<li><a
href="9d6691bc8c"><code>9d6691b</code></a>
fix: Ignore <code>ratatui</code> in Rust files</li>
<li><a
href="f1231bc2bc"><code>f1231bc</code></a>
chore: Release</li>
<li><a
href="66def6387b"><code>66def63</code></a>
docs: Update changelog</li>
<li><a
href="623f09b5bc"><code>623f09b</code></a>
chore: Release</li>
<li><a
href="1080316783"><code>1080316</code></a>
chore: Release</li>
<li><a
href="442605b529"><code>442605b</code></a>
Merge pull request <a
href="https://redirect.github.com/crate-ci/typos/issues/1352">#1352</a>
from epage/marshaling</li>
<li><a
href="983f866bac"><code>983f866</code></a>
fix(dict): Don't correct marshaling</li>
<li>Additional commits viewable in <a
href="392b78fe18...52bd719c2c">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crate-ci/typos&package-manager=github_actions&previous-version=1.34.0&new-version=1.35.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-11 13:45:40 -07:00
dependabot[bot]
381fcf3dc9 build(deps): bump actions/checkout from 4.2.2 to 5.0.0 (#2045)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2
to 5.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/releases">actions/checkout's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update actions checkout to use node 24 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li>
<li>Prepare v5.0.0 release by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2238">actions/checkout#2238</a></li>
</ul>
<h2>⚠️ Minimum Compatible Runner Version</h2>
<p><strong>v2.327.1</strong><br />
<a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Release
Notes</a></p>
<p>Make sure your runner is updated to this version or newer to use this
release.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v4...v5.0.0">https://github.com/actions/checkout/compare/v4...v5.0.0</a></p>
<h2>v4.3.0</h2>
<h2>What's Changed</h2>
<ul>
<li>docs: update README.md by <a
href="https://github.com/motss"><code>@​motss</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li>Add internal repos for checking out multiple repositories by <a
href="https://github.com/mouismail"><code>@​mouismail</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li>Documentation update - add recommended permissions to Readme by <a
href="https://github.com/benwells"><code>@​benwells</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li>Adjust positioning of user email note and permissions heading by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li>Update CODEOWNERS for actions by <a
href="https://github.com/TingluoHuang"><code>@​TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li>
<li>Update package dependencies by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
<li>Prepare release v4.3.0 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2237">actions/checkout#2237</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/motss"><code>@​motss</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li><a href="https://github.com/mouismail"><code>@​mouismail</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li><a href="https://github.com/benwells"><code>@​benwells</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li><a href="https://github.com/nebuk89"><code>@​nebuk89</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v4...v4.3.0">https://github.com/actions/checkout/compare/v4...v4.3.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2>V5.0.0</h2>
<ul>
<li>Update actions checkout to use node 24 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li>
</ul>
<h2>V4.3.0</h2>
<ul>
<li>docs: update README.md by <a
href="https://github.com/motss"><code>@​motss</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li>Add internal repos for checking out multiple repositories by <a
href="https://github.com/mouismail"><code>@​mouismail</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li>Documentation update - add recommended permissions to Readme by <a
href="https://github.com/benwells"><code>@​benwells</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li>Adjust positioning of user email note and permissions heading by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li>Update CODEOWNERS for actions by <a
href="https://github.com/TingluoHuang"><code>@​TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li>
<li>Update package dependencies by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
</ul>
<h2>v4.2.2</h2>
<ul>
<li><code>url-helper.ts</code> now leverages well-known environment
variables by <a href="https://github.com/jww3"><code>@​jww3</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li>
<li>Expand unit test coverage for <code>isGhes</code> by <a
href="https://github.com/jww3"><code>@​jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li>
</ul>
<h2>v4.2.1</h2>
<ul>
<li>Check out other refs/* by commit if provided, fall back to ref by <a
href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li>
</ul>
<h2>v4.2.0</h2>
<ul>
<li>Add Ref and Commit outputs by <a
href="https://github.com/lucacome"><code>@​lucacome</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1180">actions/checkout#1180</a></li>
<li>Dependency updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>- <a
href="https://redirect.github.com/actions/checkout/pull/1777">actions/checkout#1777</a>,
<a
href="https://redirect.github.com/actions/checkout/pull/1872">actions/checkout#1872</a></li>
</ul>
<h2>v4.1.7</h2>
<ul>
<li>Bump the minor-npm-dependencies group across 1 directory with 4
updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1739">actions/checkout#1739</a></li>
<li>Bump actions/checkout from 3 to 4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1697">actions/checkout#1697</a></li>
<li>Check out other refs/* by commit by <a
href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1774">actions/checkout#1774</a></li>
<li>Pin actions/checkout's own workflows to a known, good, stable
version. by <a href="https://github.com/jww3"><code>@​jww3</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1776">actions/checkout#1776</a></li>
</ul>
<h2>v4.1.6</h2>
<ul>
<li>Check platform to set archive extension appropriately by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1732">actions/checkout#1732</a></li>
</ul>
<h2>v4.1.5</h2>
<ul>
<li>Update NPM dependencies by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1703">actions/checkout#1703</a></li>
<li>Bump github/codeql-action from 2 to 3 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1694">actions/checkout#1694</a></li>
<li>Bump actions/setup-node from 1 to 4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1696">actions/checkout#1696</a></li>
<li>Bump actions/upload-artifact from 2 to 4 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1695">actions/checkout#1695</a></li>
<li>README: Suggest <code>user.email</code> to be
<code>41898282+github-actions[bot]@users.noreply.github.com</code> by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1707">actions/checkout#1707</a></li>
</ul>
<h2>v4.1.4</h2>
<ul>
<li>Disable <code>extensions.worktreeConfig</code> when disabling
<code>sparse-checkout</code> by <a
href="https://github.com/jww3"><code>@​jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1692">actions/checkout#1692</a></li>
<li>Add dependabot config by <a
href="https://github.com/cory-miller"><code>@​cory-miller</code></a> in
<a
href="https://redirect.github.com/actions/checkout/pull/1688">actions/checkout#1688</a></li>
<li>Bump the minor-actions-dependencies group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1693">actions/checkout#1693</a></li>
<li>Bump word-wrap from 1.2.3 to 1.2.5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1643">actions/checkout#1643</a></li>
</ul>
<h2>v4.1.3</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="08c6903cd8"><code>08c6903</code></a>
Prepare v5.0.0 release (<a
href="https://redirect.github.com/actions/checkout/issues/2238">#2238</a>)</li>
<li><a
href="9f265659d3"><code>9f26565</code></a>
Update actions checkout to use node 24 (<a
href="https://redirect.github.com/actions/checkout/issues/2226">#2226</a>)</li>
<li><a
href="08eba0b27e"><code>08eba0b</code></a>
Prepare release v4.3.0 (<a
href="https://redirect.github.com/actions/checkout/issues/2237">#2237</a>)</li>
<li><a
href="631c7dc4f8"><code>631c7dc</code></a>
Update package dependencies (<a
href="https://redirect.github.com/actions/checkout/issues/2236">#2236</a>)</li>
<li><a
href="8edcb1bdb4"><code>8edcb1b</code></a>
Update CODEOWNERS for actions (<a
href="https://redirect.github.com/actions/checkout/issues/2224">#2224</a>)</li>
<li><a
href="09d2acae67"><code>09d2aca</code></a>
Update README.md (<a
href="https://redirect.github.com/actions/checkout/issues/2194">#2194</a>)</li>
<li><a
href="85e6279cec"><code>85e6279</code></a>
Adjust positioning of user email note and permissions heading (<a
href="https://redirect.github.com/actions/checkout/issues/2044">#2044</a>)</li>
<li><a
href="009b9ae9e4"><code>009b9ae</code></a>
Documentation update - add recommended permissions to Readme (<a
href="https://redirect.github.com/actions/checkout/issues/2043">#2043</a>)</li>
<li><a
href="cbb722410c"><code>cbb7224</code></a>
Update README.md (<a
href="https://redirect.github.com/actions/checkout/issues/1977">#1977</a>)</li>
<li><a
href="3b9b8c884f"><code>3b9b8c8</code></a>
docs: update README.md (<a
href="https://redirect.github.com/actions/checkout/issues/1971">#1971</a>)</li>
<li>See full diff in <a
href="11bd71901b...08c6903cd8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.2.2&new-version=5.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-08-11 13:37:56 -07:00
dependabot[bot]
03072fa374 build(deps): bump taiki-e/install-action from 2.57.1 to 2.58.9 (#2046)
Bumps
[taiki-e/install-action](https://github.com/taiki-e/install-action) from
2.57.1 to 2.58.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/releases">taiki-e/install-action's
releases</a>.</em></p>
<blockquote>
<h2>2.58.9</h2>
<ul>
<li>Update <code>cargo-shear@latest</code> to 1.5.0.</li>
</ul>
<h2>2.58.8</h2>
<ul>
<li>Update <code>osv-scanner@latest</code> to 2.2.1.</li>
</ul>
<h2>2.58.7</h2>
<ul>
<li>
<p>Update <code>knope@latest</code> to 0.21.2.</p>
</li>
<li>
<p>Update <code>cyclonedx@latest</code> to 0.29.1.</p>
</li>
</ul>
<h2>2.58.6</h2>
<ul>
<li>Update <code>cargo-semver-checks@latest</code> to 0.43.0.</li>
</ul>
<h2>2.58.5</h2>
<ul>
<li>
<p>Update <code>knope@latest</code> to 0.21.1.</p>
</li>
<li>
<p>Update <code>cargo-binstall@latest</code> to 1.14.4.</p>
</li>
</ul>
<h2>2.58.4</h2>
<ul>
<li>
<p>Update <code>typos@latest</code> to 1.35.3.</p>
</li>
<li>
<p>Update <code>syft@latest</code> to 1.30.0.</p>
</li>
</ul>
<h2>2.58.3</h2>
<ul>
<li>Update <code>typos@latest</code> to 1.35.2.</li>
</ul>
<h2>2.58.2</h2>
<ul>
<li>Update <code>deepsource@latest</code> to 0.10.1.</li>
</ul>
<h2>2.58.1</h2>
<ul>
<li>
<p>Update <code>osv-scanner@latest</code> to 2.2.0.</p>
</li>
<li>
<p>Update <code>grcov@latest</code> to 0.10.5.</p>
</li>
</ul>
<h2>2.58.0</h2>
<ul>
<li>
<p>Support <code>iai-callgrind-runner</code>. (<a
href="https://redirect.github.com/taiki-e/install-action/pull/1073">#1073</a>,
thanks <a
href="https://github.com/niklasf"><code>@​niklasf</code></a>)</p>
</li>
<li>
<p>Update <code>vacuum@latest</code> to 0.17.8.</p>
</li>
</ul>
<h2>2.57.8</h2>
<ul>
<li>Update <code>deepsource@latest</code> to 0.10.0.</li>
</ul>
<h2>2.57.7</h2>
<ul>
<li>Update <code>typos@latest</code> to 1.35.1.</li>
</ul>
<h2>2.57.6</h2>
<ul>
<li>
<p>Update <code>shellcheck@latest</code> to 0.11.0.</p>
</li>
<li>
<p>Update <code>cargo-nextest@latest</code> to 0.9.102.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md">taiki-e/install-action's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<p>All notable changes to this project will be documented in this
file.</p>
<p>This project adheres to <a href="https://semver.org">Semantic
Versioning</a>.</p>
<!-- raw HTML omitted -->
<h2>[Unreleased]</h2>
<ul>
<li>Update <code>editorconfig-checker@latest</code> to 3.4.0.</li>
</ul>
<h2>[2.58.9] - 2025-08-11</h2>
<ul>
<li>Update <code>cargo-shear@latest</code> to 1.5.0.</li>
</ul>
<h2>[2.58.8] - 2025-08-11</h2>
<ul>
<li>Update <code>osv-scanner@latest</code> to 2.2.1.</li>
</ul>
<h2>[2.58.7] - 2025-08-11</h2>
<ul>
<li>
<p>Update <code>knope@latest</code> to 0.21.2.</p>
</li>
<li>
<p>Update <code>cyclonedx@latest</code> to 0.29.1.</p>
</li>
</ul>
<h2>[2.58.6] - 2025-08-10</h2>
<ul>
<li>Update <code>cargo-semver-checks@latest</code> to 0.43.0.</li>
</ul>
<h2>[2.58.5] - 2025-08-10</h2>
<ul>
<li>
<p>Update <code>knope@latest</code> to 0.21.1.</p>
</li>
<li>
<p>Update <code>cargo-binstall@latest</code> to 1.14.4.</p>
</li>
</ul>
<h2>[2.58.4] - 2025-08-09</h2>
<ul>
<li>
<p>Update <code>typos@latest</code> to 1.35.3.</p>
</li>
<li>
<p>Update <code>syft@latest</code> to 1.30.0.</p>
</li>
</ul>
<h2>[2.58.3] - 2025-08-08</h2>
<ul>
<li>Update <code>typos@latest</code> to 1.35.2.</li>
</ul>
<h2>[2.58.2] - 2025-08-07</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2c73a741d1"><code>2c73a74</code></a>
Release 2.58.9</li>
<li><a
href="424d851274"><code>424d851</code></a>
Update <code>cargo-shear@latest</code> to 1.5.0</li>
<li><a
href="c6d88ff920"><code>c6d88ff</code></a>
Release 2.58.8</li>
<li><a
href="c44ead199b"><code>c44ead1</code></a>
Update <code>osv-scanner@latest</code> to 2.2.1</li>
<li><a
href="1fd1160ee1"><code>1fd1160</code></a>
Release 2.58.7</li>
<li><a
href="a56809b7da"><code>a56809b</code></a>
Update <code>knope@latest</code> to 0.21.2</li>
<li><a
href="4af683f0e4"><code>4af683f</code></a>
Update <code>cyclonedx@latest</code> to 0.29.1</li>
<li><a
href="5f6f3e0538"><code>5f6f3e0</code></a>
Release 2.58.6</li>
<li><a
href="0a75db001a"><code>0a75db0</code></a>
Update <code>cargo-semver-checks@latest</code> to 0.43.0</li>
<li><a
href="a50f5c5668"><code>a50f5c5</code></a>
Release 2.58.5</li>
<li>Additional commits viewable in <a
href="a416ddeedb...2c73a741d1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=taiki-e/install-action&package-manager=github_actions&previous-version=2.57.1&new-version=2.58.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-11 13:32:25 -07:00
Orhun Parmaksız
01067efd1c chore(changelog): allow running git-cliff without release-plz (#2031)
This is probably not optimal because we won't have access to the current
`{package}` while running `git-cliff` but at least it will run _just_
fine.

While at it, I changed something in the commit parsers to avoid adding
dependency updates to the changelog.

---------

Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-08-09 20:21:59 +03:00
Josh McKinney
ae4f42f5ae chore(deps): use less specific versions in manifests (#2041)
The goal of this is to reduce dependabot updates to generally only
Cargo.lock updates

- Use "0.x" or "x" as the version generally.
- Specify versions only in the workspace manifest
- Bump versions to latest semver compatible (and update rstest / lru /
  criterion deps)
2025-08-05 02:25:15 -07:00
LitoMore
9998000e36 docs: use shields.io badge (#2040)
Related to:
- https://github.com/simple-icons/simple-icons/pull/13593
- https://github.com/ratatui/ratatui/pull/1967

The Ratatui icon is available on shields.io now ✌️

And it's customizable. There are more configurations at
https://shields.io/badges.

Here are some examples:

```markdown
![](https://img.shields.io/badge/Ratatui-000?logo=ratatui&logoColor=fff)
![](https://img.shields.io/badge/Ratatui-fff?logo=ratatui&logoColor=000)
![](https://img.shields.io/badge/Built_With-Ratatui-000?logo=ratatui&logoColor=fff&labelColor=000&color=fff)
![](https://img.shields.io/badge/Ratatui-000?logo=ratatui&logoColor=fff&style=flat-square)
![](https://img.shields.io/badge/Ratatui-000?logo=ratatui&logoColor=fff&style=for-the-badge)
```

![](https://img.shields.io/badge/Ratatui-000?logo=ratatui&logoColor=fff)
![](https://img.shields.io/badge/Ratatui-fff?logo=ratatui&logoColor=000)

![](https://img.shields.io/badge/Built_With-Ratatui-000?logo=ratatui&logoColor=fff&labelColor=000&color=fff)

![](https://img.shields.io/badge/Ratatui-000?logo=ratatui&logoColor=fff&style=flat-square)

![](https://img.shields.io/badge/Ratatui-000?logo=ratatui&logoColor=fff&style=for-the-badge)

I also created a PR to the ratatui-website project to update the badge.
Here is the PR:

- https://github.com/ratatui/ratatui-website/pull/924
2025-08-04 17:32:32 -07:00
Josh McKinney
8188ed3950 feat: implement UnicodeWidthStr for Text/Line/Span (#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.
2025-08-01 10:50:09 -07:00
dependabot[bot]
5e75278499 build(deps): bump taiki-e/install-action from 2.56.19 to 2.57.1 (#2020) 2025-08-01 07:43:58 +02:00
Josh McKinney
71ef65b624 docs: add section on collaborative development to contributing doc (#2029) 2025-07-30 14:01:34 -07:00
Josh McKinney
c845fec765 feat: add conversion from Size to Rect (#2028)
`Rect::from(size)` returns a new Rect at the origin (0, 0) with the
specified `Size`
2025-07-30 11:25:21 -07:00
Jagoda Estera Ślązak
0afb1a99af chore: ignore beta and rc tags in cliff.toml (#2025) 2025-07-29 15:25:30 -07:00
Jagoda Estera Ślązak
5ae224b244 chore: prepare for beta release (#2022) 2025-07-29 09:45:40 +02:00
dependabot[bot]
cd90671a8b build(deps): bump release-plz/action from 0.5.109 to 0.5.110 (#2021)
Bumps [release-plz/action](https://github.com/release-plz/action) from
0.5.109 to 0.5.110.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-plz/action/releases">release-plz/action's
releases</a>.</em></p>
<blockquote>
<h2>v0.5.110</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.139 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/211">release-plz/action#211</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.110">https://github.com/release-plz/action/compare/v0.5...v0.5.110</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ccf6dd9984"><code>ccf6dd9</code></a>
Update to 0.3.139 (<a
href="https://redirect.github.com/release-plz/action/issues/211">#211</a>)</li>
<li>See full diff in <a
href="068d76d2aa...ccf6dd9984">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=release-plz/action&package-manager=github_actions&previous-version=0.5.109&new-version=0.5.110)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-28 23:30:36 -07:00
dependabot[bot]
08040b893e build(deps): bump tokio from 1.46.1 to 1.47.0 (#2019)
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.46.1 to 1.47.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/tokio/releases">tokio's
releases</a>.</em></p>
<blockquote>
<h2>Tokio v1.47.0</h2>
<h1>1.47.0 (July 25th, 2025)</h1>
<p>This release adds <code>poll_proceed</code> and
<code>cooperative</code> to the <code>coop</code> module for
cooperative scheduling, adds <code>SetOnce</code> to the
<code>sync</code> module which provides
similar functionality to [<code>std::sync::OnceLock</code>], and adds a
new method
<code>sync::Notify::notified_owned()</code> which returns an
<code>OwnedNotified</code> without
a lifetime parameter.</p>
<h2>Added</h2>
<ul>
<li>coop: add <code>cooperative</code> and <code>poll_proceed</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7405">#7405</a>)</li>
<li>sync: add <code>SetOnce</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7418">#7418</a>)</li>
<li>sync: add <code>sync::Notify::notified_owned()</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7465">#7465</a>)</li>
</ul>
<h2>Changed</h2>
<ul>
<li>deps: upgrade windows-sys 0.52 → 0.59 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7117">#7117</a>)</li>
<li>deps: update to socket2 v0.6 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7443">#7443</a>)</li>
<li>sync: improve <code>AtomicWaker::wake</code> performance (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7450">#7450</a>)</li>
</ul>
<h2>Documented</h2>
<ul>
<li>metrics: fix listed feature requirements for some metrics (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7449">#7449</a>)</li>
<li>runtime: improve safety comments of <code>Readiness&lt;'_&gt;</code>
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7415">#7415</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/tokio/issues/7405">#7405</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7405">tokio-rs/tokio#7405</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7415">#7415</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7415">tokio-rs/tokio#7415</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7418">#7418</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7418">tokio-rs/tokio#7418</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7449">#7449</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7449">tokio-rs/tokio#7449</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7450">#7450</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7450">tokio-rs/tokio#7450</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7465">#7465</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7465">tokio-rs/tokio#7465</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3911cb8523"><code>3911cb8</code></a>
chore: prepare Tokio v1.47.0 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7482">#7482</a>)</li>
<li><a
href="d545aa2601"><code>d545aa2</code></a>
sync: add <code>sync::Notify::notified_owned()</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7465">#7465</a>)</li>
<li><a
href="911ab21d70"><code>911ab21</code></a>
sync: add <code>SetOnce</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7418">#7418</a>)</li>
<li><a
href="9e94fa7e15"><code>9e94fa7</code></a>
task: remove raw-entry feature from hashbrown dep (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7252">#7252</a>)</li>
<li><a
href="0d234c3cf9"><code>0d234c3</code></a>
ci: unfreeze wasm-unknown-unknown from rustc 1.81 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7471">#7471</a>)</li>
<li><a
href="3754e059b6"><code>3754e05</code></a>
ci: use ubuntu-24.04-arm instead of ubuntu-22.04-arm (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7470">#7470</a>)</li>
<li><a
href="6d868d96ce"><code>6d868d9</code></a>
sync: fix <code>CancellationToken</code> failing to cancel the ready
futures (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7462">#7462</a>)</li>
<li><a
href="0a3fe46086"><code>0a3fe46</code></a>
sync: remove duplicated code in <code>OnceCell</code> tests (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7458">#7458</a>)</li>
<li><a
href="154d7d5fe6"><code>154d7d5</code></a>
ci: cleanup legacy <code>R-loom-multi-thread-alt</code> label from the
labeler (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7457">#7457</a>)</li>
<li><a
href="611b793356"><code>611b793</code></a>
coop: add <code>cooperative</code> and <code>poll_proceed</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7405">#7405</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tokio-rs/tokio/compare/tokio-1.46.1...tokio-1.47.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.46.1&new-version=1.47.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-28 23:30:01 -07:00
Jagoda Estera Ślązak
cba5cca2bd docs: update heading image for Ratatui 0.30.0 release 🎉 (#2000)
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-07-25 14:30:36 -07:00
Josh McKinney
c01b7d43ea ci: remove old release workflows (#2015) 2025-07-25 14:28:37 -07:00
Josh McKinney
9836f0760d docs: add AI contribution guidelines (#2013) 2025-07-25 12:10:14 -07:00
dependabot[bot]
bce6604379 build(deps): bump taiki-e/install-action from 2.56.13 to 2.56.19 (#2006)
Bumps
[taiki-e/install-action](https://github.com/taiki-e/install-action) from
2.56.13 to 2.56.19.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/releases">taiki-e/install-action's
releases</a>.</em></p>
<blockquote>
<h2>2.56.19</h2>
<ul>
<li>Update <code>cargo-llvm-cov@latest</code> to 0.6.18.</li>
</ul>
<h2>2.56.18</h2>
<ul>
<li>Update <code>just@latest</code> to 1.42.3.</li>
</ul>
<h2>2.56.17</h2>
<ul>
<li>Update <code>wasmtime@latest</code> to 34.0.2.</li>
</ul>
<h2>2.56.16</h2>
<ul>
<li>
<p>Update <code>cargo-zigbuild@latest</code> to 0.20.1.</p>
</li>
<li>
<p>Update <code>cargo-lambda@latest</code> to 1.8.6.</p>
</li>
<li>
<p>Update <code>vacuum@latest</code> to 0.17.6.</p>
</li>
<li>
<p>Update <code>earthly@latest</code> to 0.8.16.</p>
</li>
</ul>
<h2>2.56.15</h2>
<ul>
<li>
<p>Fix <code>cargo-valgrind</code> installation error due to their tag
rename.</p>
</li>
<li>
<p>Update <code>cargo-valgrind@latest</code> to 2.3.2.</p>
</li>
<li>
<p>Update <code>just@latest</code> to 1.42.2.</p>
</li>
</ul>
<h2>2.56.14</h2>
<ul>
<li>
<p>Update <code>zola@latest</code> to 0.21.0.</p>
</li>
<li>
<p>Update <code>wait-for-them@latest</code> to 0.5.1.</p>
</li>
<li>
<p>Update <code>mdbook@latest</code> to 0.4.52.</p>
</li>
<li>
<p>Update <code>just@latest</code> to 1.42.1.</p>
</li>
<li>
<p>Update <code>cargo-shear@latest</code> to 1.4.0.</p>
</li>
<li>
<p>Update <code>cyclonedx@latest</code> to 0.29.0.</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md">taiki-e/install-action's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<p>All notable changes to this project will be documented in this
file.</p>
<p>This project adheres to <a href="https://semver.org">Semantic
Versioning</a>.</p>
<!-- raw HTML omitted -->
<h2>[Unreleased]</h2>
<h2>[2.56.19] - 2025-07-19</h2>
<ul>
<li>Update <code>cargo-llvm-cov@latest</code> to 0.6.18.</li>
</ul>
<h2>[2.56.18] - 2025-07-19</h2>
<ul>
<li>Update <code>just@latest</code> to 1.42.3.</li>
</ul>
<h2>[2.56.17] - 2025-07-18</h2>
<ul>
<li>Update <code>wasmtime@latest</code> to 34.0.2.</li>
</ul>
<h2>[2.56.16] - 2025-07-18</h2>
<ul>
<li>
<p>Update <code>cargo-zigbuild@latest</code> to 0.20.1.</p>
</li>
<li>
<p>Update <code>cargo-lambda@latest</code> to 1.8.6.</p>
</li>
<li>
<p>Update <code>vacuum@latest</code> to 0.17.6.</p>
</li>
<li>
<p>Update <code>earthly@latest</code> to 0.8.16.</p>
</li>
</ul>
<h2>[2.56.15] - 2025-07-16</h2>
<ul>
<li>
<p>Fix <code>cargo-valgrind</code> installation error due to their tag
rename.</p>
</li>
<li>
<p>Update <code>cargo-valgrind@latest</code> to 2.3.2.</p>
</li>
<li>
<p>Update <code>just@latest</code> to 1.42.2.</p>
</li>
</ul>
<h2>[2.56.14] - 2025-07-15</h2>
<ul>
<li>
<p>Update <code>zola@latest</code> to 0.21.0.</p>
</li>
<li>
<p>Update <code>wait-for-them@latest</code> to 0.5.1.</p>
</li>
<li>
<p>Update <code>mdbook@latest</code> to 0.4.52.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c99cc51b30"><code>c99cc51</code></a>
Release 2.56.19</li>
<li><a
href="35aa282e0f"><code>35aa282</code></a>
Update <code>cargo-llvm-cov@latest</code> to 0.6.18</li>
<li><a
href="8962e8bc90"><code>8962e8b</code></a>
Release 2.56.18</li>
<li><a
href="86ed27786e"><code>86ed277</code></a>
Update <code>just@latest</code> to 1.42.3</li>
<li><a
href="d8fcd11e5f"><code>d8fcd11</code></a>
Release 2.56.17</li>
<li><a
href="03efa19be6"><code>03efa19</code></a>
Update readme</li>
<li><a
href="14dc975de9"><code>14dc975</code></a>
ci: Fix debian 10 setup</li>
<li><a
href="00c7072f52"><code>00c7072</code></a>
Update wasmtime manifest</li>
<li><a
href="8520ed0913"><code>8520ed0</code></a>
Release 2.56.16</li>
<li><a
href="56de642f63"><code>56de642</code></a>
Update <code>cargo-zigbuild@latest</code> to 0.20.1</li>
<li>Additional commits viewable in <a
href="c07504cae0...c99cc51b30">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=taiki-e/install-action&package-manager=github_actions&previous-version=2.56.13&new-version=2.56.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 13:27:03 -07:00
dependabot[bot]
c8d5d385b3 build(deps): bump release-plz/action from 0.5.108 to 0.5.109 (#2008)
Bumps [release-plz/action](https://github.com/release-plz/action) from
0.5.108 to 0.5.109.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-plz/action/releases">release-plz/action's
releases</a>.</em></p>
<blockquote>
<h2>v0.5.109</h2>
<h2>What's Changed</h2>
<ul>
<li>Update to 0.3.138 by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/release-plz/action/pull/210">release-plz/action#210</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-plz/action/compare/v0.5...v0.5.109">https://github.com/release-plz/action/compare/v0.5...v0.5.109</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="068d76d2aa"><code>068d76d</code></a>
Update to 0.3.138 (<a
href="https://redirect.github.com/release-plz/action/issues/210">#210</a>)</li>
<li>See full diff in <a
href="8724d33cd9...068d76d2aa">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=release-plz/action&package-manager=github_actions&previous-version=0.5.108&new-version=0.5.109)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 13:26:38 -07:00
dependabot[bot]
3fe3fe316e build(deps): bump marocchino/sticky-pull-request-comment from 2.9.3 to 2.9.4 (#2011)
Bumps
[marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment)
from 2.9.3 to 2.9.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/marocchino/sticky-pull-request-comment/releases">marocchino/sticky-pull-request-comment's
releases</a>.</em></p>
<blockquote>
<h2>v2.9.4</h2>
<h2>What's Changed</h2>
<ul>
<li>build(deps-dev): Bump <code>@​biomejs/biome</code> from 2.0.0 to
2.0.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1554">marocchino/sticky-pull-request-comment#1554</a></li>
<li>build(deps-dev): Bump <code>@​types/node</code> from 24.0.3 to
24.0.11 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1561">marocchino/sticky-pull-request-comment#1561</a></li>
<li>build(deps-dev): Bump <code>@​biomejs/biome</code> from 2.0.4 to
2.1.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1562">marocchino/sticky-pull-request-comment#1562</a></li>
<li>build(deps-dev): Bump <code>@​types/node</code> from 24.0.11 to
24.0.12 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1563">marocchino/sticky-pull-request-comment#1563</a></li>
<li>build(deps-dev): Bump <code>@​types/node</code> from 24.0.12 to
24.0.13 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1564">marocchino/sticky-pull-request-comment#1564</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/marocchino/sticky-pull-request-comment/compare/v2.9.3...v2.9.4">https://github.com/marocchino/sticky-pull-request-comment/compare/v2.9.3...v2.9.4</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="773744901b"><code>7737449</code></a>
📦️ Build</li>
<li><a
href="8b423c6fac"><code>8b423c6</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1564">#1564</a>
from marocchino/dependabot/npm_and_yarn/types/node-2...</li>
<li><a
href="3ac8a744e4"><code>3ac8a74</code></a>
build(deps-dev): Bump <code>@​types/node</code> from 24.0.12 to
24.0.13</li>
<li><a
href="e430cfc2fc"><code>e430cfc</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1563">#1563</a>
from marocchino/dependabot/npm_and_yarn/types/node-2...</li>
<li><a
href="99f9378b47"><code>99f9378</code></a>
build(deps-dev): Bump <code>@​types/node</code> from 24.0.11 to
24.0.12</li>
<li><a
href="2216b3aa26"><code>2216b3a</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1562">#1562</a>
from marocchino/dependabot/npm_and_yarn/biomejs/biom...</li>
<li><a
href="482d7fd7d6"><code>482d7fd</code></a>
build(deps-dev): Bump <code>@​biomejs/biome</code> from 2.0.4 to
2.1.1</li>
<li><a
href="c2da581914"><code>c2da581</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1561">#1561</a>
from marocchino/dependabot/npm_and_yarn/types/node-2...</li>
<li><a
href="76f84622bc"><code>76f8462</code></a>
build(deps-dev): Bump <code>@​types/node</code> from 24.0.3 to
24.0.11</li>
<li><a
href="246151aa30"><code>246151a</code></a>
⬆️ Update biome</li>
<li>Additional commits viewable in <a
href="d2ad0de260...773744901b">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=marocchino/sticky-pull-request-comment&package-manager=github_actions&previous-version=2.9.3&new-version=2.9.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 13:25:49 -07:00
dependabot[bot]
0f10944ca0 build(deps): bump strum from 0.27.1 to 0.27.2 (#2009)
Bumps [strum](https://github.com/Peternator7/strum) from 0.27.1 to
0.27.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Peternator7/strum/releases">strum's
releases</a>.</em></p>
<blockquote>
<h2>v0.27.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Adding support for doc comments on <code>EnumDiscriminants</code>
generated type… by <a
href="https://github.com/linclelinkpart5"><code>@​linclelinkpart5</code></a>
in <a
href="https://redirect.github.com/Peternator7/strum/pull/141">Peternator7/strum#141</a></li>
<li>Drop needless <code>rustversion</code> dependency by <a
href="https://github.com/paolobarbolini"><code>@​paolobarbolini</code></a>
in <a
href="https://redirect.github.com/Peternator7/strum/pull/446">Peternator7/strum#446</a></li>
<li>Upgrade <code>phf</code> to v0.12 by <a
href="https://github.com/paolobarbolini"><code>@​paolobarbolini</code></a>
in <a
href="https://redirect.github.com/Peternator7/strum/pull/448">Peternator7/strum#448</a></li>
<li>allow discriminants on empty enum by <a
href="https://github.com/crop2000"><code>@​crop2000</code></a> in <a
href="https://redirect.github.com/Peternator7/strum/pull/435">Peternator7/strum#435</a></li>
<li>Remove broken link to EnumTable docs by <a
href="https://github.com/schneems"><code>@​schneems</code></a> in <a
href="https://redirect.github.com/Peternator7/strum/pull/427">Peternator7/strum#427</a></li>
<li>Change enum table callbacks to FnMut. by <a
href="https://github.com/ClaytonKnittel"><code>@​ClaytonKnittel</code></a>
in <a
href="https://redirect.github.com/Peternator7/strum/pull/443">Peternator7/strum#443</a></li>
<li>Add <code>#[automatically_derived]</code> to the <code>impl</code>s
by <a
href="https://github.com/dandedotdev"><code>@​dandedotdev</code></a> in
<a
href="https://redirect.github.com/Peternator7/strum/pull/444">Peternator7/strum#444</a></li>
<li>Implement a <code>suffix</code> attribute for serialization of enum
variants by <a
href="https://github.com/amogh-dambal"><code>@​amogh-dambal</code></a>
in <a
href="https://redirect.github.com/Peternator7/strum/pull/440">Peternator7/strum#440</a></li>
<li>Expound upon use_phf docs by <a
href="https://github.com/Peternator7"><code>@​Peternator7</code></a> in
<a
href="https://redirect.github.com/Peternator7/strum/pull/449">Peternator7/strum#449</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/paolobarbolini"><code>@​paolobarbolini</code></a>
made their first contribution in <a
href="https://redirect.github.com/Peternator7/strum/pull/446">Peternator7/strum#446</a></li>
<li><a href="https://github.com/crop2000"><code>@​crop2000</code></a>
made their first contribution in <a
href="https://redirect.github.com/Peternator7/strum/pull/435">Peternator7/strum#435</a></li>
<li><a href="https://github.com/schneems"><code>@​schneems</code></a>
made their first contribution in <a
href="https://redirect.github.com/Peternator7/strum/pull/427">Peternator7/strum#427</a></li>
<li><a
href="https://github.com/ClaytonKnittel"><code>@​ClaytonKnittel</code></a>
made their first contribution in <a
href="https://redirect.github.com/Peternator7/strum/pull/443">Peternator7/strum#443</a></li>
<li><a
href="https://github.com/dandedotdev"><code>@​dandedotdev</code></a>
made their first contribution in <a
href="https://redirect.github.com/Peternator7/strum/pull/444">Peternator7/strum#444</a></li>
<li><a
href="https://github.com/amogh-dambal"><code>@​amogh-dambal</code></a>
made their first contribution in <a
href="https://redirect.github.com/Peternator7/strum/pull/440">Peternator7/strum#440</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Peternator7/strum/compare/v0.27.1...v0.27.2">https://github.com/Peternator7/strum/compare/v0.27.1...v0.27.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Peternator7/strum/blob/master/CHANGELOG.md">strum's
changelog</a>.</em></p>
<blockquote>
<h2>0.27.2</h2>
<ul>
<li>
<p><a
href="https://redirect.github.com/Peternator7/strum/pull/141">#141</a>:
Adding support for doc comments on <code>EnumDiscriminants</code>
generated type.</p>
<ul>
<li>The doc comment will be copied from the variant on the type
itself.</li>
</ul>
</li>
<li>
<p><a
href="https://redirect.github.com/Peternator7/strum/pull/435">#435</a>:allow
discriminants on empty enum.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/Peternator7/strum/pull/443">#443</a>:
Change enum table callbacks to FnMut.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/Peternator7/strum/pull/444">#444</a>:
Add <code>#[automatically_derived]</code> to the <code>impl</code>s by
<a href="https://github.com/dandedotdev"><code>@​dandedotdev</code></a>
in <a
href="https://redirect.github.com/Peternator7/strum/pull/444">Peternator7/strum#444</a></p>
<ul>
<li>This should make the linter less noisy with warnings in generated
code.</li>
</ul>
</li>
<li>
<p><a
href="https://redirect.github.com/Peternator7/strum/pull/440">#440</a>:
Implement a <code>suffix</code> attribute for serialization of enum
variants.</p>
<pre lang="rust"><code>#[derive(strum::Display)]
#[strum(suffix=&quot;.json&quot;)]
#[strum(serialize_all=&quot;snake_case&quot;)]
enum StorageConfiguration {
  PostgresProvider,
  S3StorageProvider,
  AzureStorageProvider,
}
<p>fn main() {
let response = SurveyResponse::Other(&quot;It was good&quot;.into());
println!(&quot;Loading configuration from: {}&quot;,
StorageConfiguration::PostgresProvider);
// prints: Loaded Configuration from: postgres_provider.json
}
</code></pre></p>
</li>
<li>
<p><a
href="https://redirect.github.com/Peternator7/strum/pull/446">#446</a>:
Drop needless <code>rustversion</code> dependency.</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="38f66210e7"><code>38f6621</code></a>
Expound upon use_phf docs (<a
href="https://redirect.github.com/Peternator7/strum/issues/449">#449</a>)</li>
<li><a
href="bb1339026b"><code>bb13390</code></a>
Implement a <code>suffix</code> attribute for serialization of enum
variants (<a
href="https://redirect.github.com/Peternator7/strum/issues/440">#440</a>)</li>
<li><a
href="c9e52bfd28"><code>c9e52bf</code></a>
Add <code>#[automatically_derived]</code> to the <code>impl</code>s (<a
href="https://redirect.github.com/Peternator7/strum/issues/444">#444</a>)</li>
<li><a
href="1b00f899e5"><code>1b00f89</code></a>
Change enum table callbacks to FnMut. (<a
href="https://redirect.github.com/Peternator7/strum/issues/443">#443</a>)</li>
<li><a
href="6e2ca25fba"><code>6e2ca25</code></a>
Remove broken link to EnumTable docs (<a
href="https://redirect.github.com/Peternator7/strum/issues/427">#427</a>)</li>
<li><a
href="9503781141"><code>9503781</code></a>
allow discriminants on empty enum (<a
href="https://redirect.github.com/Peternator7/strum/issues/435">#435</a>)</li>
<li><a
href="8553ba2845"><code>8553ba2</code></a>
Upgrade <code>phf</code> to v0.12 (<a
href="https://redirect.github.com/Peternator7/strum/issues/448">#448</a>)</li>
<li><a
href="2eba5c2a5c"><code>2eba5c2</code></a>
Drop needless <code>rustversion</code> dependency (<a
href="https://redirect.github.com/Peternator7/strum/issues/446">#446</a>)</li>
<li><a
href="f301b67d91"><code>f301b67</code></a>
Merge branch 'linclelinkpart5-master-2'</li>
<li><a
href="455b2bf859"><code>455b2bf</code></a>
Merge branch 'master' of <a
href="https://github.com/linclelinkpart5/strum">https://github.com/linclelinkpart5/strum</a>
into lincle...</li>
<li>See full diff in <a
href="https://github.com/Peternator7/strum/compare/v0.27.1...v0.27.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=strum&package-manager=cargo&previous-version=0.27.1&new-version=0.27.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 21:55:41 +02:00
dependabot[bot]
1bd3181d8e build(deps): bump instability from 0.3.7 to 0.3.9 (#2007)
Bumps [instability](https://github.com/ratatui/instability) from 0.3.7
to 0.3.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ratatui/instability/releases">instability's
releases</a>.</em></p>
<blockquote>
<h2>instability-example-v0.3.9</h2>
<h3>Other</h3>
<ul>
<li>Add #[allow(unused_imports)] lint to unstable reexports (<a
href="https://redirect.github.com/ratatui/instability/pull/21">#21</a>)</li>
</ul>
<h2>instability-v0.3.9</h2>
<h3>Other</h3>
<ul>
<li>split release jobs, fixup permissions (<a
href="https://redirect.github.com/ratatui/instability/pull/28">#28</a>)</li>
</ul>
<h2>instability-example-v0.3.8</h2>
<h3>Other</h3>
<ul>
<li>Add #[allow(unused_imports)] lint to unstable reexports (<a
href="https://redirect.github.com/ratatui/instability/pull/21">#21</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ratatui/instability/blob/main/CHANGELOG.md">instability's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/ratatui/instability/compare/instability-v0.3.8...instability-v0.3.9">0.3.9</a>
- 2025-07-18</h2>
<h3>Other</h3>
<ul>
<li>split release jobs, fixup permissions (<a
href="https://redirect.github.com/ratatui/instability/pull/28">#28</a>)</li>
</ul>
<h2><a
href="https://github.com/ratatui/instability/compare/instability-v0.3.7...instability-v0.3.8">0.3.8</a>
- 2025-07-11</h2>
<h3>Added</h3>
<ul>
<li>Add <code>instability_disable_unstable_docs</code> RUSTFLAGS (<a
href="https://redirect.github.com/ratatui/instability/pull/23">#23</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4cf23b4370"><code>4cf23b4</code></a>
chore: release v0.3.9 (<a
href="https://redirect.github.com/ratatui/instability/issues/29">#29</a>)</li>
<li><a
href="d88afd18b7"><code>d88afd1</code></a>
ci: split release jobs, fixup permissions (<a
href="https://redirect.github.com/ratatui/instability/issues/28">#28</a>)</li>
<li><a
href="f88acb150e"><code>f88acb1</code></a>
ci: configure trusted publishing (<a
href="https://redirect.github.com/ratatui/instability/issues/27">#27</a>)</li>
<li><a
href="5bf7467800"><code>5bf7467</code></a>
chore: replace ratatui-org with ratatui everywhere (<a
href="https://redirect.github.com/ratatui/instability/issues/26">#26</a>)</li>
<li><a
href="d0fc40644f"><code>d0fc406</code></a>
chore: release v0.3.8 (<a
href="https://redirect.github.com/ratatui/instability/issues/24">#24</a>)</li>
<li><a
href="4d899fea50"><code>4d899fe</code></a>
feat: Add <code>instability_disable_unstable_docs</code> RUSTFLAGS (<a
href="https://redirect.github.com/ratatui/instability/issues/23">#23</a>)</li>
<li>See full diff in <a
href="https://github.com/ratatui/instability/compare/instability-v0.3.7...instability-v0.3.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=instability&package-manager=cargo&previous-version=0.3.7&new-version=0.3.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 21:53:00 +02:00
dependabot[bot]
e04fef7354 build(deps): bump serde_json from 1.0.140 to 1.0.141 (#2005)
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.140 to
1.0.141.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/serde-rs/json/releases">serde_json's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.141</h2>
<ul>
<li>Optimize string escaping during serialization (<a
href="https://redirect.github.com/serde-rs/json/issues/1273">#1273</a>,
thanks <a
href="https://github.com/conradludgate"><code>@​conradludgate</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6843c3660e"><code>6843c36</code></a>
Release 1.0.141</li>
<li><a
href="6e2c21063a"><code>6e2c210</code></a>
Touch up PR 1273</li>
<li><a
href="623d9b47cf"><code>623d9b4</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/json/issues/1273">#1273</a>
from conradludgate/optimise-string-escaping</li>
<li><a
href="de70b7db1f"><code>de70b7d</code></a>
use unreachable_unchecked for escape table. use a second match to
roundtrip E...</li>
<li><a
href="f2d940dd54"><code>f2d940d</code></a>
replace start index with bytes slice reference</li>
<li><a
href="cd55b5a0ff"><code>cd55b5a</code></a>
Ignore mismatched_lifetime_syntaxes lint</li>
<li><a
href="c1826ebccc"><code>c1826eb</code></a>
Pin nightly toolchain used for miri job</li>
<li><a
href="8a56cfa6d0"><code>8a56cfa</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/json/issues/1248">#1248</a>
from jimmycathy/master</li>
<li><a
href="af3d80de56"><code>af3d80d</code></a>
chore: fix typo</li>
<li>See full diff in <a
href="https://github.com/serde-rs/json/compare/v1.0.140...v1.0.141">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.140&new-version=1.0.141)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 22:34:26 +03:00
dependabot[bot]
bbca3870d5 build(deps): bump rand from 0.9.1 to 0.9.2 (#2010)
Bumps [rand](https://github.com/rust-random/rand) from 0.9.1 to 0.9.2.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-random/rand/blob/master/CHANGELOG.md">rand's
changelog</a>.</em></p>
<blockquote>
<h2>[0.9.2 — 2025-07-20]</h2>
<h3>Deprecated</h3>
<ul>
<li>Deprecate <code>rand::rngs::mock</code> module and
<code>StepRng</code> generator (<a
href="https://redirect.github.com/rust-random/rand/issues/1634">#1634</a>)</li>
</ul>
<h3>Additions</h3>
<ul>
<li>Enable <code>WeightedIndex&lt;usize&gt;</code> (de)serialization (<a
href="https://redirect.github.com/rust-random/rand/issues/1646">#1646</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d3dd415705"><code>d3dd415</code></a>
Prepare rand_core 0.9.2 (<a
href="https://redirect.github.com/rust-random/rand/issues/1605">#1605</a>)</li>
<li><a
href="99fabd20e9"><code>99fabd2</code></a>
Prepare rand_core 0.9.2</li>
<li><a
href="c7fe1c43b5"><code>c7fe1c4</code></a>
rand: re-export <code>rand_core</code> (<a
href="https://redirect.github.com/rust-random/rand/issues/1604">#1604</a>)</li>
<li><a
href="db2b1e0bb4"><code>db2b1e0</code></a>
rand: re-export <code>rand_core</code></li>
<li><a
href="ee1d96f9f5"><code>ee1d96f</code></a>
rand_core: implement reborrow for <code>UnwrapMut</code> (<a
href="https://redirect.github.com/rust-random/rand/issues/1595">#1595</a>)</li>
<li><a
href="e0eb2ee0fc"><code>e0eb2ee</code></a>
rand_core: implement reborrow for <code>UnwrapMut</code></li>
<li><a
href="975f602f5d"><code>975f602</code></a>
fixup clippy 1.85 warnings</li>
<li><a
href="775b05be1b"><code>775b05b</code></a>
Relax <code>Sized</code> requirements for blanket impls (<a
href="https://redirect.github.com/rust-random/rand/issues/1593">#1593</a>)</li>
<li>See full diff in <a
href="https://github.com/rust-random/rand/compare/rand_core-0.9.1...rand_core-0.9.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rand&package-manager=cargo&previous-version=0.9.1&new-version=0.9.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 22:33:35 +03:00
Austin Schey
1fe64de09a fix: include underline color in anstyle conversion (#2004)
Underline color wasn't included in the style conversion logic.
2025-07-20 17:07:29 -07:00
kenji
72334ed61c docs(layout): Update documentation to point to kasuari solver (#2003) 2025-07-20 13:07:20 -07:00
Jagoda Estera Ślązak
c1b8528b69 fix: panic when rendering widgets on too small buffer (#1996)
Fixes panic on overflow on horizontal `Barchart` and `RatatuiMascot` and adds proper tests to all widgets.

---------

Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
2025-07-20 21:39:18 +02:00
Dheepak Krishnamurthy
cfebd68e18 chore: Fix typo in CONTRIBUTING.md (#2001)
Removes a hanging opening code block:

````
```suggestion
````
2025-07-20 06:11:27 +02:00
Josh McKinney
572749f388 chore: update contributing guidelines and add copilot-instructions (#1998)
See
https://docs.github.com/en/copilot/how-tos/agents/copilot-code-review/using-copilot-code-review

These instructions will be used by copilot when it performs automated PR
reviews, and helps provide guardrails for our standards. Over time we
might grow these to capture any consistent problems that we start seeing
when reviewing.

---------

Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
2025-07-19 16:02:13 -07:00
David Tolnay
cdf189e15a build(deps): allow using ratatui with unicode-width 0.2.1 (#1999)
According to the issue linked from Cargo.toml, the intention has been to
manually upgrade unicode-width every now and then, after verifying that
the new version does not disrupt Ratatui. See
https://github.com/ratatui/ratatui/issues/1271#issuecomment-2373917195.

This PR unblocks using Ratatui in a dependency graph where some other
crate requires some of the fixes that landed in unicode-width 0.2.1.
Without this PR, Cargo blocks Ratatui from being used.

```console
error: failed to select a version for `unicode-width`.
    ... required by package `ratatui v0.29.0`
    ... which satisfies dependency `ratatui = "^0.29"` of package `cargo v0.91.0`
    ... which satisfies path dependency `cargo` (locked to 0.91.0) of package `repro v0.0.0`
versions that meet the requirements `=0.2.0` are: 0.2.0

all possible versions conflict with previously selected packages.

  previously selected package `unicode-width v0.2.1`
    ... which satisfies dependency `unicode-width = "^0.2.1"` of package `cargo v0.91.0`
    ... which satisfies path dependency `cargo` (locked to 0.91.0) of package `repro v0.0.0`

failed to select a version for `unicode-width` which could resolve this conflict
```
2025-07-19 15:23:20 -07:00
Tyler Breisacher
98f85b8650 docs: update link to scrollable widgets RFC (#1994) 2025-07-16 07:19:46 +02:00
Josh McKinney
0148b62f0c chore: remove cargo_metadata dep from xtask (#1993)
Removed due to hard N-2 MSRV requirement, whereas we use a soft N-2
(only update when necessary). This makes it painful to be able to test
our actual msrv (as the xtask has to be built with the version that its
deps support, while still wanting to check the msrv version, so we'd end
up with 2 versions in the one CI task and this would get annoying to
check).

See https://github.com/rust-lang/cargo/issues/15746 for more details.

Partially implements #1820 - mainly as a problem solution rather than a
specific goal to use cargo-hack
2025-07-15 15:05:18 -07:00
Josh McKinney
9bc573931c chore: remove clap-cargo from xtask (#1992)
Removed to avoid needing to bump our msrv. See
https://github.com/rust-lang/cargo/issues/15746\#issuecomment-3071774343
for more details.
2025-07-14 21:54:38 -07:00
dependabot[bot]
64e6d1953c build(deps): bump rust-lang/crates-io-auth-action from 1.0.0 to 1.0.1 (#1989)
[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rust-lang/crates-io-auth-action&package-manager=github_actions&previous-version=1.0.0&new-version=1.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
2025-07-14 13:38:55 -07:00
dependabot[bot]
c0148a00fe build(deps): bump taiki-e/install-action from 2.56.7 to 2.56.13 (#1991)
[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=taiki-e/install-action&package-manager=github_actions&previous-version=2.56.7&new-version=2.56.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 13:30:49 -07:00
dependabot[bot]
44727c7b4a build(deps): bump cargo_metadata from 0.20.0 to 0.21.0 (#1987)
Bumps [cargo_metadata](https://github.com/oli-obk/cargo_metadata) from
0.20.0 to 0.21.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="70018a8681"><code>70018a8</code></a>
Update main.yml</li>
<li><a
href="523cfbe7f0"><code>523cfbe</code></a>
bump msrv</li>
<li><a
href="b1a61d390f"><code>b1a61d3</code></a>
bump version</li>
<li><a
href="0f300d5bff"><code>0f300d5</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/295">#295</a>
from smoelius/update-cargo-util-schemas</li>
<li><a
href="4b28226e26"><code>4b28226</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/300">#300</a>
from joeferner/fix-node-dep-name</li>
<li><a
href="bcd2373560"><code>bcd2373</code></a>
fix clippy errors</li>
<li><a
href="73aaebb077"><code>73aaebb</code></a>
fixes &quot;package name cannot be empty&quot; under
&quot;resolve/nodes/deps/name&quot;</li>
<li><a
href="f9a67c2023"><code>f9a67c2</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/298">#298</a>
from kornelski/result</li>
<li><a
href="289e1173da"><code>289e117</code></a>
Make Result alias wildcard-import-proof</li>
<li><a
href="a9147a68d0"><code>a9147a6</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/297">#297</a>
from ranger-ross/build-dir-unstable-support</li>
<li>Additional commits viewable in <a
href="https://github.com/oli-obk/cargo_metadata/compare/0.20.0...0.21.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cargo_metadata&package-manager=cargo&previous-version=0.20.0&new-version=0.21.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 11:35:41 -07:00
dependabot[bot]
1e9d1253f9 build(deps): bump clap from 4.5.40 to 4.5.41 (#1988)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.40 to 4.5.41.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.41] - 2025-07-09</h2>
<h3>Features</h3>
<ul>
<li>Add <code>Styles::context</code> and
<code>Styles::context_value</code> to customize the styling of
<code>[default: value]</code> like notes in the <code>--help</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="92fcd83b76"><code>92fcd83</code></a>
chore: Release</li>
<li><a
href="aca91b99c1"><code>aca91b9</code></a>
docs: Update changelog</li>
<li><a
href="8434510cee"><code>8434510</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5869">#5869</a>
from tw4452852/patch-1</li>
<li><a
href="33b1fc304e"><code>33b1fc3</code></a>
fix(complete): Fix env leakage in elvish dynamic completion</li>
<li><a
href="e5f1f4884c"><code>e5f1f48</code></a>
chore: Release</li>
<li><a
href="9466a552fb"><code>9466a55</code></a>
docs: Update changelog</li>
<li><a
href="d74b793512"><code>d74b793</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5865">#5865</a>
from gifnksm/nushell-completion-value-types</li>
<li><a
href="ecbc775d3b"><code>ecbc775</code></a>
fix(nu): Set argument type based on <code>ValueHint</code></li>
<li><a
href="6784054536"><code>6784054</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5857">#5857</a>
from epage/empty</li>
<li><a
href="cca5f32b3a"><code>cca5f32</code></a>
test(complete): Show empty option-value behavior</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.40...clap_complete-v4.5.41">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.40&new-version=4.5.41)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 11:25:23 -07:00
dependabot[bot]
aae46032bc build(deps): bump trybuild from 1.0.105 to 1.0.106 (#1986)
Bumps [trybuild](https://github.com/dtolnay/trybuild) from 1.0.105 to
1.0.106.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/trybuild/releases">trybuild's
releases</a>.</em></p>
<blockquote>
<h2>1.0.106</h2>
<ul>
<li>Update <code>toml</code> dependency to 0.9 (<a
href="https://redirect.github.com/dtolnay/trybuild/issues/306">#306</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9e3eb039ed"><code>9e3eb03</code></a>
Release 1.0.106</li>
<li><a
href="6d6d3e83ad"><code>6d6d3e8</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/trybuild/issues/306">#306</a>
from dtolnay/toml</li>
<li><a
href="6b77d62236"><code>6b77d62</code></a>
Update to toml 0.9</li>
<li><a
href="f7a9a80fc4"><code>f7a9a80</code></a>
Ignore mismatched_lifetime_syntaxes lint</li>
<li><a
href="51a1a41487"><code>51a1a41</code></a>
Resolve manual_let_else pedantic clippy lint</li>
<li>See full diff in <a
href="https://github.com/dtolnay/trybuild/compare/1.0.105...1.0.106">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=trybuild&package-manager=cargo&previous-version=1.0.105&new-version=1.0.106)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 11:24:57 -07:00
Josh McKinney
0e10170e19 chore: change Borders::NONE to a proper const (#1985)
https://docs.rs/bitflags/latest/bitflags/#zero-bit-flags

> Flags with no bits set should be avoided because they interact
strangely with
[Flags::contains](https://docs.rs/bitflags/latest/bitflags/trait.Flags.html#method.contains)
and
[Flags::intersects](https://docs.rs/bitflags/latest/bitflags/trait.Flags.html#method.intersects).
A zero-bit flag is always contained, but is never intersected. The names
of zero-bit flags can be parsed, but are never formatted.

Removing this simplifies the manual Debug impl that previously had to
check for Borders::NONE and now does not.
2025-07-13 22:56:21 -07:00
Josh McKinney
40e96a2a04 docs(block): add collapsed border example (#1899) 2025-07-13 01:30:57 -07:00
Josh McKinney
02ca5870c5 ci: add environment to release workflow (#1983)
https://github.com/rust-lang/crates.io/issues/11564#issuecomment-3066696820
2025-07-13 01:29:23 -07:00
LitoMore
8e3bd11d60 chore: add svg logo asset (#1967)
Added a shields.io style svg logo and a nicer version of the original logo.
The simplified icon will be added and available directly from shields.io via:
- https://github.com/simple-icons/simple-icons/pull/13593
2025-07-12 17:24:38 -07:00
Jagoda Estera Ślązak
017af11b2b feat: preserve block titles when merging borders (#1977)
Resolves #1939
2025-07-12 15:45:56 -07:00
Josh McKinney
821611f76f ci: use trusted publishing (#1981)
https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/
https://crates.io/docs/trusted-publishing
2025-07-12 14:11:34 -07:00
Josh McKinney
ae43ea796a chore(cell): use Option instead of space (" ") for symbol (#1974)
This change makes the `Cell::symbol` field an `Option<CompactString>`,
allowing it to represent an empty cell as `None` instead of an empty
string. The rationale for this is to later allow the merge symbol
functionality to act differently based on whether a cell has previously
held a symbol or not, rather than always merging with an empty string.
This will help make it possible to merge borders with titles with spaces
and other symbols, without assuming that an empty string is always
equivalent to no symbol.

- Default is now derived as `Option::None` works correctly.
- PartialEq and Eq implementations are updated to treat `None` the same
  as an empty string.
- merge_symbol against an empty cell will now just set the symbol
  rather than calling MergeStrategy::merge with an empty string.
- PartialEq, and Hash are manually implementated instead of being
  derived, and are updated to treat `None` equal to an empty string.
2025-07-11 21:43:23 +03:00
Shingo OKAWA
5fa342cc52 fix(widgets): fix centered block title truncation (#1973)
Previously block titles that were aligned center were
truncated poorly (aligned to the left, and the last
non-fitting title would be truncated on the left and right.
This now truncates the titles more obviously centered.
2025-07-11 00:19:07 -07:00
John T. Wodder II
08b21fa55c fix: Fix panic when rendering a Paragraph out of bounds (#1670)
Fixes #1667.
2025-07-09 17:37:20 -07:00
dependabot[bot]
32ccf38606 build(deps): bump marocchino/sticky-pull-request-comment from 2.9.1 to 2.9.3 (#1970)
Bumps
[marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment)
from 2.9.1 to 2.9.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/marocchino/sticky-pull-request-comment/releases">marocchino/sticky-pull-request-comment's
releases</a>.</em></p>
<blockquote>
<h2>v2.9.3</h2>
<h2>What's Changed</h2>
<ul>
<li>Update deps (including security issues)</li>
<li>Test with vitest instead of jest</li>
<li>Use biome</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/marocchino/sticky-pull-request-comment/compare/v2.9.2...v2.9.3">https://github.com/marocchino/sticky-pull-request-comment/compare/v2.9.2...v2.9.3</a></p>
<h2>v2.9.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Update <code>@​octokit/graphql-schema</code> &amp; use biome by <a
href="https://github.com/marocchino"><code>@​marocchino</code></a> in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1517">marocchino/sticky-pull-request-comment#1517</a></li>
<li>build(deps): Bump undici from 5.28.4 to 5.28.5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1476">marocchino/sticky-pull-request-comment#1476</a></li>
<li>build(deps-dev): Bump <code>@​types/node</code> from 22.10.7 to
22.14.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1515">marocchino/sticky-pull-request-comment#1515</a></li>
<li>build(deps): Bump <code>@​octokit/request-error</code> from 5.0.1 to
5.1.1 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1490">marocchino/sticky-pull-request-comment#1490</a></li>
<li>build(deps): Bump <code>@​octokit/request</code> from 8.1.4 to 8.4.1
by <a href="https://github.com/dependabot"><code>@​dependabot</code></a>
in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1494">marocchino/sticky-pull-request-comment#1494</a></li>
<li>build(deps): Bump <code>@​octokit/plugin-paginate-rest</code> from
9.1.2 to 9.2.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/pull/1493">marocchino/sticky-pull-request-comment#1493</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/marocchino/sticky-pull-request-comment/compare/v2.9.1...v2.9.2">https://github.com/marocchino/sticky-pull-request-comment/compare/v2.9.1...v2.9.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d2ad0de260"><code>d2ad0de</code></a>
📦️ Build</li>
<li><a
href="c6b90f93cb"><code>c6b90f9</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1553">#1553</a>
from marocchino/dependabot/npm_and_yarn/brace-expans...</li>
<li><a
href="20665dd134"><code>20665dd</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1550">#1550</a>
from marocchino/dependabot/npm_and_yarn/types/node-2...</li>
<li><a
href="8a03a65ab9"><code>8a03a65</code></a>
build(deps): Bump brace-expansion from 1.1.11 to 1.1.12</li>
<li><a
href="8d4420ab75"><code>8d4420a</code></a>
build(deps-dev): Bump <code>@​types/node</code> from 22.15.30 to
24.0.3</li>
<li><a
href="14ca6a4b49"><code>14ca6a4</code></a>
📦️ Build</li>
<li><a
href="283f17cccc"><code>283f17c</code></a>
🔧 Update biome setting</li>
<li><a
href="0607099d6a"><code>0607099</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1552">#1552</a>
from marocchino/dependabot/npm_and_yarn/vitest-3.2.4</li>
<li><a
href="9bff39e005"><code>9bff39e</code></a>
Merge pull request <a
href="https://redirect.github.com/marocchino/sticky-pull-request-comment/issues/1551">#1551</a>
from marocchino/dependabot/npm_and_yarn/biomejs/biom...</li>
<li><a
href="f02e40f8ac"><code>f02e40f</code></a>
build(deps-dev): Bump vitest from 3.2.2 to 3.2.4</li>
<li>Additional commits viewable in <a
href="52423e0164...d2ad0de260">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=marocchino/sticky-pull-request-comment&package-manager=github_actions&previous-version=2.9.1&new-version=2.9.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-07 16:41:11 -07:00
dependabot[bot]
04428f6f74 build(deps): bump taiki-e/install-action from 2.55.1 to 2.56.7 (#1971)
Bumps
[taiki-e/install-action](https://github.com/taiki-e/install-action) from
2.55.1 to 2.56.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/releases">taiki-e/install-action's
releases</a>.</em></p>
<blockquote>
<h2>2.56.7</h2>
<ul>
<li>Update <code>shfmt@latest</code> to 3.12.0.</li>
</ul>
<h2>2.56.6</h2>
<ul>
<li>
<p>Update <code>cargo-llvm-cov@latest</code> to 0.6.17.</p>
</li>
<li>
<p>Update <code>cargo-udeps@latest</code> to 0.1.57.</p>
</li>
</ul>
<h2>2.56.5</h2>
<ul>
<li>Update <code>cargo-semver-checks@latest</code> to 0.42.0.</li>
</ul>
<h2>2.56.4</h2>
<ul>
<li>Update <code>cargo-shear@latest</code> to 1.3.3.</li>
</ul>
<h2>2.56.3</h2>
<ul>
<li>Update <code>trivy@latest</code> to 0.64.1.</li>
</ul>
<h2>2.56.2</h2>
<ul>
<li>
<p>Update <code>vacuum@latest</code> to 0.17.2.</p>
</li>
<li>
<p>Update <code>syft@latest</code> to 1.28.0.</p>
</li>
</ul>
<h2>2.56.1</h2>
<ul>
<li>Update <code>release-plz@latest</code> to 0.3.137.</li>
</ul>
<h2>2.56.0</h2>
<ul>
<li>Support <code>coreutils</code>. (<a
href="https://redirect.github.com/taiki-e/install-action/pull/1017">#1017</a>,
thanks <a
href="https://github.com/jayvdb"><code>@​jayvdb</code></a>)</li>
</ul>
<h2>2.55.4</h2>
<ul>
<li>
<p>Update <code>trivy@latest</code> to 0.64.0.</p>
</li>
<li>
<p>Update <code>just@latest</code> to 1.41.0.</p>
</li>
</ul>
<h2>2.55.3</h2>
<ul>
<li>Update <code>dprint@latest</code> to 0.50.1.</li>
</ul>
<h2>2.55.2</h2>
<ul>
<li>
<p>Update <code>zizmor@latest</code> to 1.11.0.</p>
</li>
<li>
<p>Update <code>cargo-dinghy@latest</code> to 0.8.1.</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md">taiki-e/install-action's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<p>All notable changes to this project will be documented in this
file.</p>
<p>This project adheres to <a href="https://semver.org">Semantic
Versioning</a>.</p>
<!-- raw HTML omitted -->
<h2>[Unreleased]</h2>
<ul>
<li>Update <code>vacuum@latest</code> to 0.17.3.</li>
</ul>
<h2>[2.56.7] - 2025-07-07</h2>
<ul>
<li>Update <code>shfmt@latest</code> to 3.12.0.</li>
</ul>
<h2>[2.56.6] - 2025-07-06</h2>
<ul>
<li>
<p>Update <code>cargo-llvm-cov@latest</code> to 0.6.17.</p>
</li>
<li>
<p>Update <code>cargo-udeps@latest</code> to 0.1.57.</p>
</li>
</ul>
<h2>[2.56.5] - 2025-07-06</h2>
<ul>
<li>Update <code>cargo-semver-checks@latest</code> to 0.42.0.</li>
</ul>
<h2>[2.56.4] - 2025-07-05</h2>
<ul>
<li>Update <code>cargo-shear@latest</code> to 1.3.3.</li>
</ul>
<h2>[2.56.3] - 2025-07-03</h2>
<ul>
<li>Update <code>trivy@latest</code> to 0.64.1.</li>
</ul>
<h2>[2.56.2] - 2025-07-02</h2>
<ul>
<li>
<p>Update <code>vacuum@latest</code> to 0.17.2.</p>
</li>
<li>
<p>Update <code>syft@latest</code> to 1.28.0.</p>
</li>
</ul>
<h2>[2.56.1] - 2025-07-01</h2>
<ul>
<li>Update <code>release-plz@latest</code> to 0.3.137.</li>
</ul>
<h2>[2.56.0] - 2025-07-01</h2>
<ul>
<li>Support <code>coreutils</code>. (<a
href="https://redirect.github.com/taiki-e/install-action/pull/1017">#1017</a>,
thanks <a
href="https://github.com/jayvdb"><code>@​jayvdb</code></a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f3a27926ea"><code>f3a2792</code></a>
Release 2.56.7</li>
<li><a
href="fc0c1ad363"><code>fc0c1ad</code></a>
Update <code>shfmt@latest</code> to 3.12.0</li>
<li><a
href="cb148fe1fc"><code>cb148fe</code></a>
Release 2.56.6</li>
<li><a
href="95c7e0aefa"><code>95c7e0a</code></a>
Update <code>cargo-llvm-cov@latest</code> to 0.6.17</li>
<li><a
href="d86483f9ef"><code>d86483f</code></a>
Update <code>cargo-udeps@latest</code> to 0.1.57</li>
<li><a
href="d32ce31795"><code>d32ce31</code></a>
Release 2.56.5</li>
<li><a
href="2119a1ef9a"><code>2119a1e</code></a>
Replace tab with space</li>
<li><a
href="0ae016a18f"><code>0ae016a</code></a>
Update jq to 1.8.1</li>
<li><a
href="9b1aeb740e"><code>9b1aeb7</code></a>
Update <code>cargo-semver-checks@latest</code> to 0.42.0</li>
<li><a
href="e6d2212084"><code>e6d2212</code></a>
Release 2.56.4</li>
<li>Additional commits viewable in <a
href="491d37bbaa...f3a27926ea">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=taiki-e/install-action&package-manager=github_actions&previous-version=2.55.1&new-version=2.56.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-07 16:40:29 -07:00
dependabot[bot]
84427c2857 build(deps): bump tokio from 1.45.1 to 1.46.1 (#1968) 2025-07-07 20:01:54 +02:00
Orhun Parmaksız
ca5a9bb019 chore(changelog): skip dependency updates in changelog (#1966) 2025-07-05 16:29:09 +03:00
Josh McKinney
1f0c2ee18e ci: audit github workflows with zizmor (#1961)
Fixes https://github.com/ratatui/ratatui/issues/1950
2025-07-02 14:51:41 -07:00
dependabot[bot]
6b3323fb10 build(deps): bump kasuari from 0.4.6 to 0.4.7 (#1960)
Bumps [kasuari](https://github.com/ratatui/kasuari) from 0.4.6 to 0.4.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ratatui/kasuari/releases">kasuari's
releases</a>.</em></p>
<blockquote>
<h2>v0.4.7</h2>
<h3>Other</h3>
<ul>
<li><em>(gitignore)</em> add <code>.env</code> to
<code>.gitignore</code> (<a
href="https://redirect.github.com/ratatui/kasuari/pull/22">#22</a>)</li>
<li>use variables directly in the <code>format!</code> string (<a
href="https://redirect.github.com/ratatui/kasuari/pull/23">#23</a>)</li>
<li><em>(deps)</em> bump hashbrown from 0.15.3 to 0.15.4 in the
rust-dependencies group (<a
href="https://redirect.github.com/ratatui/kasuari/pull/19">#19</a>)</li>
<li>fix for code scanning alert no. 1: Workflow does not contain
permissions (<a
href="https://redirect.github.com/ratatui/kasuari/pull/20">#20</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ratatui/kasuari/blob/main/CHANGELOG.md">kasuari's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/ratatui/kasuari/compare/v0.4.6...v0.4.7">0.4.7</a>
- 2025-06-27</h2>
<h3>Other</h3>
<ul>
<li><em>(gitignore)</em> add <code>.env</code> to
<code>.gitignore</code> (<a
href="https://redirect.github.com/ratatui/kasuari/pull/22">#22</a>)</li>
<li>use variables directly in the <code>format!</code> string (<a
href="https://redirect.github.com/ratatui/kasuari/pull/23">#23</a>)</li>
<li><em>(deps)</em> bump hashbrown from 0.15.3 to 0.15.4 in the
rust-dependencies group (<a
href="https://redirect.github.com/ratatui/kasuari/pull/19">#19</a>)</li>
<li>fix for code scanning alert no. 1: Workflow does not contain
permissions (<a
href="https://redirect.github.com/ratatui/kasuari/pull/20">#20</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="cf8c01fc18"><code>cf8c01f</code></a>
chore: release v0.4.7 (<a
href="https://redirect.github.com/ratatui/kasuari/issues/21">#21</a>)</li>
<li><a
href="a20b77a8f0"><code>a20b77a</code></a>
chore(gitignore): add <code>.env</code> to <code>.gitignore</code> (<a
href="https://redirect.github.com/ratatui/kasuari/issues/22">#22</a>)</li>
<li><a
href="e4b1bc12c7"><code>e4b1bc1</code></a>
refactor: use variables directly in the <code>format!</code> string (<a
href="https://redirect.github.com/ratatui/kasuari/issues/23">#23</a>)</li>
<li><a
href="78847cf972"><code>78847cf</code></a>
build(deps): bump hashbrown from 0.15.3 to 0.15.4 in the
rust-dependencies gr...</li>
<li><a
href="b918060969"><code>b918060</code></a>
ci: fix for code scanning alert no. 1: Workflow does not contain
permissions ...</li>
<li>See full diff in <a
href="https://github.com/ratatui/kasuari/compare/v0.4.6...v0.4.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=kasuari&package-manager=cargo&previous-version=0.4.6&new-version=0.4.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 15:13:38 -07:00
github-actions[bot]
11c5862728 chore: release (#1866)
## 🤖 New release

* `ratatui-core`: 0.1.0-alpha.5 -> 0.1.0-alpha.6
* `ratatui-crossterm`: 0.1.0-alpha.4 -> 0.1.0-alpha.5
* `ratatui-widgets`: 0.3.0-alpha.4 -> 0.3.0-alpha.5
* `ratatui-macros`: 0.7.0-alpha.3 -> 0.7.0-alpha.4
* `ratatui-termwiz`: 0.1.0-alpha.4 -> 0.1.0-alpha.5
* `ratatui-termion`: 0.1.0-alpha.4 -> 0.1.0-alpha.5
* `ratatui`: 0.30.0-alpha.4 -> 0.30.0-alpha.5

<details><summary><i><b>Changelog</b></i></summary><p>

## `ratatui-core`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-crossterm`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-widgets`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-macros`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-30 04:53:20 -07:00
Jagoda Estera Ślązak
055522ef7b docs: add docs for authoring widget crates (#1955)
- added Authoring Widget Libraries sub-section
- moved built-in and third-party widgets sections higher
2025-06-30 07:09:28 +02:00
Jagoda Estera Ślązak
0b025db72b docs(contributing): fix grammar (#1958) 2025-06-28 15:45:21 -07:00
Josh McKinney
617d31851a docs: improve Block docs (#1953)
Co-authored-by: Jagoda Estera Ślązak <128227338+j-g00da@users.noreply.github.com>
2025-06-28 15:28:21 -07:00
Lena
4c301e891d feat(text): implement AddAssign for Text (#1956)
This makes it possible to add a second `Text` instance to a first one using the += operator.

```rust
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).
2025-06-28 14:53:29 -07:00
Jagoda Estera Ślązak
b9da1926a0 feat(serde): derive Serialize/Deserialize for alignment enums (#1957)
Resolves #1954
2025-06-28 14:48:16 -07:00
Josh McKinney
6dcd53bc6b feat: add ergonomic methods for layouting Rects (#1909)
This commit introduces new methods for the `Rect` struct that simplify
the process of splitting a `Rect` into sub-rects according to a given
`Layout`. By putting these methods on the `Rect` struct, we make it a
bit more natural that a layout is applied to the `Rect` itself, rather
than passing a `Rect` to the `Layout` struct to be split.

Adds:
- `Rect::layout` and `Rect::try_layout` methods that allow splitting a
  `Rect` into an array of sub-rects according to a given `Layout`.
- `Rect::layout_vec` method that returns a `Vec` of sub-rects.
- `Layout::try_areas` method that returns an array of sub-rects, with
  compile-time checks for the number of constraints. This is added
  mainly for consistency with the new `Rect` methods.

```rust
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)?;
```
2025-06-28 01:23:34 -07:00
Dheepak Krishnamurthy
d99984f1e9 feat(layout)!: Add Flex::SpaceEvenly (#1952)
Resolves https://github.com/ratatui/ratatui/issues/1951

BREAKING CHANGE: Old `Flex::SpaceAround` behavior is available by using
`Flex::SpaceEvenly` and new
`Flex::SpaceAround` now distributes space evenly around each element
except the middle spacers
    are twice the size of first and last elements

With this change, the following variants of `Flex` are 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` (**previously `Flex::SpaceAround`**): Distributes
space _evenly between_ items and edges.
- `Flex::Legacy`: Preserves legacy behavior, placing all excess space at
the end.

This aligns behavior of `Flex` with 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"
/>

---------

Co-authored-by: Jagoda Estera Ślązak <128227338+j-g00da@users.noreply.github.com>
2025-06-28 03:39:15 -04:00
Josh McKinney
8e2d568428 docs: improve layout related docs (#1948)
Adds module level docs and more comprehensive docs on all the types in
the layout module

Fixes #1937
2025-06-27 14:31:11 -07:00
Jagoda Estera Ślązak
d02995fda1 chore(gitignore): add .env to .gitignore (#1949) 2025-06-27 08:15:44 +03:00
Josh McKinney
4c708ddf8a docs: improve docs for run/init/restore etc. (#1947)
- **docs: document the init module**
- **docs: use the ratatui::run() methods in the main doc**
- **docs: add more intradoc / website links and historical perspective
on Terminal / backend**
- **docs: add notes about new run/init/restore methods and the
defaultterminal type to terminal docs**
2025-06-26 21:52:58 -07:00
Josh McKinney
5620e06b1a docs: add crate organization sections to workspace (#1946)
Adds summary-level crate organization documentation to all crates
explaining the modular workspace structure and when to use each crate.
Links to ARCHITECTURE.md for detailed information.
2025-06-26 15:36:00 -07:00
Josh McKinney
cfb65e64ba docs: add examples for handling state (#1849)
Added comprehensive state management examples covering both immutable
and mutable patterns and documentation to help developers choose the
right approach for their applications.
2025-06-26 13:04:42 -07:00
Jagoda Estera Ślązak
92bb9b2219 chore: remove Title references (#1943) 2025-06-26 09:13:59 +02:00
Josh McKinney
d6647db744 chore: remove some allow attributes for fixed clippy bugs (#1944) 2025-06-25 22:29:56 -07:00
Josh McKinney
3f48bde3c6 chore: remove OpenSSL license (#1942)
Only keep licenses in the allow list that are actually used
2025-06-25 21:59:26 -07:00
Josh McKinney
80bc818723 fix: fix truncation of left aligned block titles (#1931)
truncate the right side of left aligned titles rather than the left side
of right aligned titles. This is more obvious as the left side of text
often contains more important information. And we generally read
left to right.

This change makes centered titles overwrite left aligned titles and
right aligned titles overwrite centered or left aligned titles.

Fixes: https://github.com/ratatui/ratatui/issues/358
2025-06-25 21:56:40 -07:00
Josh McKinney
0c3872f1c5 feat: add Rect::outer() (#1929)
Fixes: https://github.com/ratatui/ratatui/issues/211
2025-06-25 21:56:15 -07:00
dependabot[bot]
9f9ec332b0 build(deps): bump cargo_metadata from 0.19.2 to 0.20.0 (#1887)
Bumps [cargo_metadata](https://github.com/oli-obk/cargo_metadata) from
0.19.2 to 0.20.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fa60b98bc8"><code>fa60b98</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/293">#293</a>
from oli-obk/push-orzyoroqpxpu</li>
<li><a
href="61345fb320"><code>61345fb</code></a>
required features have a different format from normal feature names</li>
<li><a
href="19f42039ee"><code>19f4203</code></a>
Bump MSRV</li>
<li><a
href="6861466d25"><code>6861466</code></a>
Fix build on with <code>builder</code> feature</li>
<li><a
href="a21b7a1d01"><code>a21b7a1</code></a>
Update examples</li>
<li><a
href="5895dd6b15"><code>5895dd6</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/261">#261</a>
from zetanumbers/docsrs-features</li>
<li><a
href="e3373d02e7"><code>e3373d0</code></a>
refactor: NodeDep::name: PackageName</li>
<li><a
href="2f0142d684"><code>2f0142d</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/291">#291</a>
from gear-tech/fix-cross-compilation</li>
<li><a
href="95d4a360fc"><code>95d4a36</code></a>
update changelog</li>
<li><a
href="9cd40e6363"><code>9cd40e6</code></a>
append docs</li>
<li>Additional commits viewable in <a
href="https://github.com/oli-obk/cargo_metadata/compare/0.19.2...0.20.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cargo_metadata&package-manager=cargo&previous-version=0.19.2&new-version=0.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-06-25 21:44:39 -07:00
Jagoda Estera Ślązak
0951da52f9 docs(breaking-changes): improve migration guide for Backend::Error (#1908)
Related: https://github.com/fujiapple852/trippy/pull/1588
2025-06-25 19:36:12 -07:00
Josh McKinney
3de41a8249 docs: document widgets module (#1932)
Adds a good overview of the use and implementation of widget traits.

Goals with the doc rewrite:
- document the rationale for the ratatui-widgets crate with info for app
builders and widget makers.
- Show how to use the widgets for rendering as well as implement the
traits- document the differences and reasons for each trait
- document the historical perspective (to make it easy to understand
older Ratatui apps as well as migrate to newer approaches
- give recommended approaches to implementing traits
- explain the differences between Consuming and Shared / Mutable
Reference implementations of Widget
- explain the differences between using StatefulWidget and Mutable
References
- Explain the use case for WidgetRef and StatefulWidgetRef
- Link out to third part widget lists

Fixes: https://github.com/ratatui/ratatui/issues/366

---------

Co-authored-by: hasezoey <hasezoey@gmail.com>
2025-06-25 16:19:54 -07:00
dependabot[bot]
d41b8d6334 build(deps): bump clap from 4.5.39 to 4.5.40 (#1911)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.39 to 4.5.40.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.40] - 2025-06-09</h2>
<h3>Features</h3>
<ul>
<li>Support quoted ids in <code>arg!()</code> macro (e.g.
<code>arg!(&quot;check-config&quot;: ...)</code>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="cff27dbf57"><code>cff27db</code></a>
chore: Release</li>
<li><a
href="4ef41249f1"><code>4ef4124</code></a>
docs: Update changelog</li>
<li><a
href="ca896175c1"><code>ca89617</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5848">#5848</a>
from jennings/jennings/push-xolwzyoornps</li>
<li><a
href="99b6391ee9"><code>99b6391</code></a>
fix(complete): Fix PowerShell dynamic completion</li>
<li>See full diff in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.39...clap_complete-v4.5.40">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.39&new-version=4.5.40)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-25 15:37:11 -07:00
Josh McKinney
4c86513790 chore: remove block::Title (#1926)
The title alignment is better expressed in the `Line` as this fits more
coherently with the rest of the library.

BREAKING CHANGES:
- `widgets::block` is no longer exported
- `widgets::block::Title` no longer exists
- `widgets::block::Position` is now `widgets::TitlePosition`
- `Block::title()` now accepts `Into::<Line>` instead of `Into<Title>`
- `BlockExt` is now exported at widgets::`BlockExt`

Closes: https://github.com/ratatui/ratatui/issues/738
2025-06-25 15:36:50 -07:00
Josh McKinney
7bc78bca1b feat: add ratatui::run() method (#1707)
This introduces a new `ratatui::run()` method which runs a closure with
a terminal initialized with reasonable defaults for most applications.
This calls `ratatui::init()` before running the closure and
`ratatui::restore()` after the closure completes, and returns the result
of the closure.

A minimal hello world example using the new `ratatui::run()` method:

```rust
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:

```rust
fn run(terminal: &mut DefaultTerminal) -> Result<(), AppError> { ... }

ratatui::run(run)?;
```

```rust
struct App { ... }

impl App {
    fn new() -> Self { ... }
    fn run(mut self, terminal: &mut DefaultTerminal) -> Result<(), AppError> { ... }
}

ratatui::run(|terminal| App::new().run(terminal))?;
```
2025-06-25 03:20:42 -07:00
Josh McKinney
b6fbfcdd1c feat: add lifetime to symbol sets (#1935)
This makes it possible to create symbol sets at runtime with non-static
lifetimes.

Fixes: https://github.com/ratatui/ratatui/issues/1722
2025-06-25 01:02:09 -07:00
Josh McKinney
21e3b598ce fix: fix handling of multi-byte chars in bar chart (#1934)
The split_at method requires that the split point is at a valid utf8
character boundary.

Fixes: https://github.com/ratatui/ratatui/issues/1928
2025-06-25 00:55:18 -07:00
Josh McKinney
ca2ad4a1f9 docs: simplify ratatui-macro docs (#1923) 2025-06-25 00:47:27 -07:00
Josh McKinney
272f5c05dc chore: fix new lints (#1922) 2025-06-25 00:38:41 -07:00
dependabot[bot]
dfd0736f3a build(deps): bump anstyle from 1.0.10 to 1.0.11 (#1901)
Bumps [anstyle](https://github.com/rust-cli/anstyle) from 1.0.10 to
1.0.11.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="886539c953"><code>886539c</code></a>
chore: Release</li>
<li><a
href="161bf93c92"><code>161bf93</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-cli/anstyle/issues/255">#255</a>
from Muscraft/anstyle-svg-urls</li>
<li><a
href="70dd95e053"><code>70dd95e</code></a>
feat(anstyle-svg): Add support for rendering Hyperlinks</li>
<li><a
href="96e3f75643"><code>96e3f75</code></a>
test(anstyle-svg): Add tests for Hyperlinks</li>
<li><a
href="abdd703a5c"><code>abdd703</code></a>
refactor(anstyle-svg): Use a concrete retrurn type from adapter</li>
<li><a
href="8d5053079d"><code>8d50530</code></a>
refactor(anstyle-svg): Use a better name for internal adapter</li>
<li><a
href="327c261668"><code>327c261</code></a>
refactor: Use a custom adapter for anstyle-svg</li>
<li><a
href="f1d6c141e2"><code>f1d6c14</code></a>
refactor(anstream): Use a less general name for State</li>
<li><a
href="98ef02efe0"><code>98ef02e</code></a>
test(anstream): Use anstyle for wincon adapter tests</li>
<li><a
href="182053aaa8"><code>182053a</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-cli/anstyle/issues/254">#254</a>
from epage/template</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-cli/anstyle/compare/v1.0.10...v1.0.11">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anstyle&package-manager=cargo&previous-version=1.0.10&new-version=1.0.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-24 20:10:42 -07:00
dependabot[bot]
a112953c59 build(deps): bump hashbrown from 0.15.3 to 0.15.4 (#1902)
Bumps [hashbrown](https://github.com/rust-lang/hashbrown) from 0.15.3 to
0.15.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/hashbrown/releases">hashbrown's
releases</a>.</em></p>
<blockquote>
<h2>v0.15.4</h2>
<h3>Changed</h3>
<ul>
<li>Removed optional dependency on compiler-builtins. This only affects
building as part of <code>std</code>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/hashbrown/blob/master/CHANGELOG.md">hashbrown's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/rust-lang/hashbrown/compare/v0.15.3...v0.15.4">0.15.4</a>
- 2025-06-05</h2>
<h3>Changed</h3>
<ul>
<li>Removed optional dependency on compiler-builtins. This only affects
building as part of <code>std</code>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8ceeb4045f"><code>8ceeb40</code></a>
Update CHANGELOG.md</li>
<li><a
href="b9be6808d6"><code>b9be680</code></a>
chore: release v0.15.4</li>
<li><a
href="53cf3532ff"><code>53cf353</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/625">#625</a>
from tgross35/no-compiler-builtins</li>
<li><a
href="197a1ebf65"><code>197a1eb</code></a>
Remove optional dependency on compiler-builtins</li>
<li><a
href="d3a2a3d752"><code>d3a2a3d</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/623">#623</a>
from cppbear/add-tests</li>
<li><a
href="165fdcfb58"><code>165fdcf</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/622">#622</a>
from AbeZbm/add-tests</li>
<li><a
href="e52627b92d"><code>e52627b</code></a>
test: add test for HashMap::get_mut with non-existent key</li>
<li><a
href="c1cd0c6827"><code>c1cd0c6</code></a>
Add missing test for set</li>
<li><a
href="62634581de"><code>6263458</code></a>
Merge pull request <a
href="https://redirect.github.com/rust-lang/hashbrown/issues/620">#620</a>
from rust-lang/release-plz-2025-04-29T17-31-59Z</li>
<li>See full diff in <a
href="https://github.com/rust-lang/hashbrown/compare/v0.15.3...v0.15.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hashbrown&package-manager=cargo&previous-version=0.15.3&new-version=0.15.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-24 20:10:07 -07:00
Tatesa Uradnik
e1e400406c fix: derive copy for list state (#1921) 2025-06-24 10:54:34 -07:00
Jagoda Estera Ślązak
1399d95ae0 feat(no_std): make palette and serde features depends on std (#1919) 2025-06-23 23:00:40 -07:00
Jagoda Estera Ślązak
488e5f020f feat: make border! work without importing Borders (#1918)
Currently using `border!` macro requires explicit import of `Borders`
which is unnecessary.
2025-06-21 18:30:23 -07:00
Jagoda Estera Ślązak
e48aa9ec09 chore(ci): stop publish-alpha from running on forks (#1916)
I can't sleep because every Saturday alpha release fails on my ratatui
fork. This should fix my insomnia.
2025-06-20 22:37:15 -07:00
Hari Chalise
68b9f67f59 docs(readme): add Built with Ratatui badge for downstream projects (#1905) 2025-06-16 15:32:22 -07:00
Jagoda Estera Ślązak
bbe1cf9497 docs(breaking-changes): change MSRV to 1.85 (#1896)
The minimum supported Rust version is now for `ratatui` v0.30 is 1.85
2025-06-05 11:37:01 +03:00
Jagoda Estera Ślązak
671c2b4fd4 feat: support merging the borders of blocks (#1874)
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(), "╆");
```

Co-authored-by: pauladam94 <poladam2002@gmail.com>
Co-authored-by: Paul Adam <65903440+pauladam94@users.noreply.github.com>
Co-authored-by: Orhun Parmaksız <orhunparmaksiz@gmail.com>
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-06-04 11:10:26 +02:00
Daksh
12cb5a28fe fix: allow canvas area to exceed u16::MAX (#1891)
This allows Canvas grids where the width * height exceeds u16::MAX by
converting values to usize earlier in several methods.

Fixes: https://github.com/ratatui/ratatui/issues/1449
2025-06-03 16:04:47 -07:00
Jagoda Estera Ślązak
861fbdf5cf docs(examples): fix a typo (#1890)
Makes CI typos check pass again
2025-06-03 14:55:23 +03:00
dependabot[bot]
bf9ecf19de build(deps): bump clap from 4.5.38 to 4.5.39 (#1888)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps [clap](https://github.com/clap-rs/clap) from 4.5.38 to 4.5.39.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.39</h2>
<h2>[4.5.39] - 2025-05-27</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Show short flag aliases before long</li>
<li><em>(help)</em> Merge the short and long flag alias lists</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.39] - 2025-05-27</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Show short flag aliases before long</li>
<li><em>(help)</em> Merge the short and long flag alias lists</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ed2360f9cd"><code>ed2360f</code></a>
chore: Release</li>
<li><a
href="196a14b8c9"><code>196a14b</code></a>
docs: Update changelog</li>
<li><a
href="cd622ab63c"><code>cd622ab</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5846">#5846</a>
from ribru17/alias_fn_dedup</li>
<li><a
href="48ff72be28"><code>48ff72b</code></a>
fix(complete): Deduplicate bash subcmd cases</li>
<li><a
href="b1b6f17f61"><code>b1b6f17</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5843">#5843</a>
from epage/link</li>
<li><a
href="5900216569"><code>5900216</code></a>
fix(derive): Update link for derive attributes</li>
<li><a
href="fde45f9aea"><code>fde45f9</code></a>
chore: Release</li>
<li><a
href="45d5d7edcb"><code>45d5d7e</code></a>
docs: Update changelog</li>
<li><a
href="4b82b97cd9"><code>4b82b97</code></a>
chore: Release</li>
<li><a
href="a982adfbbd"><code>a982adf</code></a>
docs: Update changelog</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.38...clap_complete-v4.5.39">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.38&new-version=4.5.39)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-02 12:56:59 -07:00
dependabot[bot]
ac22d21deb build(deps): bump color-eyre from 0.6.4 to 0.6.5 (#1889)
Bumps [color-eyre](https://github.com/eyre-rs/eyre) from 0.6.4 to 0.6.5.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f110d78793"><code>f110d78</code></a>
Bump color-eyre to 0.6.5, color-spantrace to 0.3.0</li>
<li><a
href="6534ecdcbb"><code>6534ecd</code></a>
Undo eyre version bump (DO NOT PUBLISH EYRE)</li>
<li><a
href="9f35b8c83f"><code>9f35b8c</code></a>
Exclude images from published crate (<a
href="https://redirect.github.com/eyre-rs/eyre/issues/239">#239</a>)</li>
<li><a
href="6e9ced8865"><code>6e9ced8</code></a>
re-bump eyre version</li>
<li>See full diff in <a
href="https://github.com/eyre-rs/eyre/compare/color-eyre@0.6.4...color-eyre@0.6.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=color-eyre&package-manager=cargo&previous-version=0.6.4&new-version=0.6.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-02 12:56:08 -07:00
Josh McKinney
770cb7c3c3 chore: add tests for combining list styles (#1884)
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
2025-06-01 13:30:13 -07:00
Sevki
92b6a16bde docs: fix grammar in ratatui-widgets README (#1885)
Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-06-01 13:14:59 -07:00
Aurelien Andreo
89b74214d9 feat(serde): derive Serialize/Deserialize for additional structs/enums (#1883)
This PR adds `#[derive(Serialize, Deserialize)]` to the following
structs:
- `Constraint`
- `Direction`
- `Spacing`
- `Layout`
- `AccentedPalette`
- `NonAccentedPalette`
- `Palette`
- `Padding`
- `Borders`
- `BorderType`
- `ListDirection`
- `ScrollbarOrientation`
- `ScrollDirection`
- `RenderDirection`
- `HighlightSpacing`

Fixes #1877
2025-05-31 14:57:13 -07:00
dependabot[bot]
e32a5bf442 build(deps): bump clap-verbosity-flag from 3.0.2 to 3.0.3 (#1870)
Bumps
[clap-verbosity-flag](https://github.com/clap-rs/clap-verbosity-flag)
from 3.0.2 to 3.0.3.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap-verbosity-flag/blob/master/CHANGELOG.md">clap-verbosity-flag's
changelog</a>.</em></p>
<blockquote>
<h2>[3.0.3] - 2025-05-20</h2>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7ac7bff71e"><code>7ac7bff</code></a>
chore: Release clap-verbosity-flag version 3.0.3</li>
<li><a
href="496f3ed5e7"><code>496f3ed</code></a>
docs(readme): Switch to console code blocks</li>
<li><a
href="6ca4f7adc1"><code>6ca4f7a</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/143">#143</a>
from joshka/jm/docs-tracing</li>
<li><a
href="352354610f"><code>3523546</code></a>
chore(deps): Update Rust Stable to v1.87 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/144">#144</a>)</li>
<li><a
href="cda6017809"><code>cda6017</code></a>
docs: Document tracing support in README and lib.rs</li>
<li><a
href="d97ade1611"><code>d97ade1</code></a>
chore(deps): Update Rust Stable to v1.86 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/141">#141</a>)</li>
<li><a
href="a58fde5b1a"><code>a58fde5</code></a>
chore(deps): Update Rust crate clap to v4.5.31 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/140">#140</a>)</li>
<li><a
href="d5e646395c"><code>d5e6463</code></a>
chore(deps): Update Rust Stable to v1.85 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/139">#139</a>)</li>
<li><a
href="e8151159f5"><code>e815115</code></a>
chore(deps): Update Rust Stable to v1.84 (<a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/137">#137</a>)</li>
<li><a
href="6b0a9d4107"><code>6b0a9d4</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap-verbosity-flag/issues/138">#138</a>
from epage/template</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap-verbosity-flag/compare/v3.0.2...v3.0.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap-verbosity-flag&package-manager=cargo&previous-version=3.0.2&new-version=3.0.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-26 10:17:01 -07:00
dependabot[bot]
3728a0d90a build(deps): bump tokio from 1.45.0 to 1.45.1 (#1871)
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.45.0 to 1.45.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/tokio/releases">tokio's
releases</a>.</em></p>
<blockquote>
<h2>Tokio v1.45.1</h2>
<h1>1.45.1 (May 24th, 2025)</h1>
<p>This fixes a regression on the wasm32-unknown-unknown target, where
code that previously did not panic due to calls to
<code>Instant::now()</code> started failing. This is due to the
stabilization of the first time-based metric.</p>
<h3>Fixed</h3>
<ul>
<li>Disable time-based metrics on wasm32-unknown-unknown (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7322">#7322</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/tokio/issues/7322">#7322</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7322">tokio-rs/tokio#7322</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3768696d92"><code>3768696</code></a>
chore: prepare Tokio v1.45.1 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7359">#7359</a>)</li>
<li><a
href="421a7b001c"><code>421a7b0</code></a>
rt: do not track time-based metrics on wasm32-unknown-unknown (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7322">#7322</a>)</li>
<li><a
href="b1bdb3c57b"><code>b1bdb3c</code></a>
ci: update macros_type_mismatch for Rust 1.87.0 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7339">#7339</a>)</li>
<li>See full diff in <a
href="https://github.com/tokio-rs/tokio/compare/tokio-1.45.0...tokio-1.45.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.45.0&new-version=1.45.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-26 10:16:03 -07:00
Jagoda Estera Ślązak
b32f78195b feat(no_std): make ratatui-macros no-std (#1865) 2025-05-20 21:22:48 +03:00
dependabot[bot]
7d84d42103 build(deps): bump DavidAnson/markdownlint-cli2-action from 19 to 20 (#1864)
Bumps
[DavidAnson/markdownlint-cli2-action](https://github.com/davidanson/markdownlint-cli2-action)
from 19 to 20.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/davidanson/markdownlint-cli2-action/releases">DavidAnson/markdownlint-cli2-action's
releases</a>.</em></p>
<blockquote>
<h2>Update markdownlint version (markdownlint-cli2 v0.18.1, markdownlint
v0.38.0).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.17.2, markdownlint
v0.37.4).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.17.0, markdownlint
v0.37.0).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.15.0, markdownlint
v0.36.1).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.14.0, markdownlint
v0.35.0).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.13.0, markdownlint
v0.34.0).</h2>
<p>No release notes provided.</p>
<p>Update markdownlint version (markdownlint-cli2 v0.12.1, markdownlint
v0.33.0).</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.11.0, markdownlint
v0.32.1), remove deprecated &quot;command&quot; input.</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.10.0, markdownlint
v0.31.1).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.9.2, markdownlint
v0.30.0).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.8.1, markdownlint
v0.29.0), add &quot;config&quot; and &quot;fix&quot; inputs, deprecate
&quot;command&quot; input.</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.7.1, markdownlint
v0.28.2).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.7.0, markdownlint
v0.28.1), include link to rule information in title of annotations
(clickable in GitHub).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.6.0, markdownlint
v0.27.0).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.5.1, markdownlint
v0.26.2).</h2>
<p>No release notes provided.</p>
<h2>Update markdownlint version (markdownlint-cli2 v0.4.0, markdownlint
v0.25.1)</h2>
<p>No release notes provided.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="992badcdf2"><code>992badc</code></a>
Update to version 20.0.0.</li>
<li><a
href="fafa44c8d4"><code>fafa44c</code></a>
Update dependency: markdownlint-cli2 to 0.18.1.</li>
<li><a
href="052b336194"><code>052b336</code></a>
Bump eslint-plugin-n from 17.17.0 to 17.18.0</li>
<li><a
href="e0b0869c70"><code>e0b0869</code></a>
Bump eslint-plugin-unicorn from 59.0.0 to 59.0.1</li>
<li><a
href="96cc31310c"><code>96cc313</code></a>
Bump <code>@​eslint/js</code> from 9.25.1 to 9.26.0</li>
<li><a
href="66095aa687"><code>66095aa</code></a>
Bump eslint from 9.25.1 to 9.26.0</li>
<li><a
href="51af1d1b7b"><code>51af1d1</code></a>
Bump eslint-plugin-unicorn from 58.0.0 to 59.0.0</li>
<li><a
href="81f6304570"><code>81f6304</code></a>
Bump <code>@​eslint/js</code> from 9.25.0 to 9.25.1</li>
<li><a
href="e2c95fbdf2"><code>e2c95fb</code></a>
Bump eslint from 9.25.0 to 9.25.1</li>
<li><a
href="9f58cc3808"><code>9f58cc3</code></a>
Bump <code>@​eslint/js</code> from 9.24.0 to 9.25.0</li>
<li>Additional commits viewable in <a
href="https://github.com/davidanson/markdownlint-cli2-action/compare/v19...v20">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=DavidAnson/markdownlint-cli2-action&package-manager=github_actions&previous-version=19&new-version=20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-19 11:53:20 -07:00
github-actions[bot]
7407c36849 chore: release (#1854)
## 🤖 New release

* `ratatui-core`: 0.1.0-alpha.4 -> 0.1.0-alpha.5
* `ratatui-crossterm`: 0.1.0-alpha.3 -> 0.1.0-alpha.4
* `ratatui-widgets`: 0.3.0-alpha.3 -> 0.3.0-alpha.4
* `ratatui-macros`: 0.7.0-alpha.2 -> 0.7.0-alpha.3
* `ratatui-termwiz`: 0.1.0-alpha.3 -> 0.1.0-alpha.4
* `ratatui-termion`: 0.1.0-alpha.3 -> 0.1.0-alpha.4
* `ratatui`: 0.30.0-alpha.3 -> 0.30.0-alpha.4

<details><summary><i><b>Changelog</b></i></summary><p>

## `ratatui-core`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-crossterm`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-widgets`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-macros`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-19 01:20:49 -07:00
Tyler Breisacher
dbfb2c3399 chore: upgrade to Rust Edition 2024 (#1863)
https://doc.rust-lang.org/edition-guide/rust-2024/index.html

Fixes #1727
2025-05-19 01:17:03 -07:00
Tyler Breisacher
7cb35d4be1 chore: Update to Rust version 1.85.0 (#1860)
This is a small step toward fixing #1727
2025-05-17 17:23:28 +03:00
dependabot[bot]
eacf9b6dbf build(deps): bump duct from 0.13.7 to 1.0.0 (#1847) 2025-05-15 10:05:04 -07:00
Josh McKinney
a07f5bec20 chore: move dependency management to workspace (#1858)
Move all dependency management to the workspace level. This makes it
easier to manage dependencies across multiple crates in the workspace.

This also changes the versions of each dependency to track based on the
semver compatible version of the dependency (e.g. 0.1 instead of 0.1.0
or 2.9 instead of 2.9.0 to avoid having to regularly update the toml
files and to communicate that Ratatui will still generally work with
versions of the dependencies that are not the fully latest version. The
exact version of the dependencies is still tracked in the Cargo.lock
file.

Several dependencies that are fairly stable are changed to track a less
specific version (e.g. serde 1 instead of 1.0.x).

The following dependencies are updated to their latest versions:
- bitflags (2.3 -> 2.9)
- strum (0.26 -> 0.27)
- strum_macros (0.26 -> 0.27)
- all other semver compatible updates
2025-05-15 09:55:34 -07:00
Josh McKinney
09cc9ef57d fix: typo in changelog (#1857) 2025-05-15 12:41:41 +03:00
Josh McKinney
702fff501c feat!: implement stylize methods directly on Style (#1572)
This makes it possible to create constants using the shorthand methods.

```rust
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: `Style` no longer implements `Styled`. 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 existing `reset()` method. Use `Style::reset()` rather than
`some_style.reset()`

Fixes: #1158
2025-05-14 15:26:29 -07:00
Josh McKinney
e15fefa922 feat(barchar): add BarChart::grouped constructor (#1513)
Add a new constructor to the `BarChart` widget that allows creating a
grouped barchart with multiple groups of bars.

Also add a new constructor to the `BarGroup` widget that allows creating
a group of bars with a label.
2025-05-14 15:00:50 +03:00
github-actions[bot]
dcb0e5dffc chore: release (#1701)
## 🤖 New release

* `ratatui-core`: 0.1.0-alpha.3 -> 0.1.0-alpha.4
* `ratatui-crossterm`: 0.1.0-alpha.2 -> 0.1.0-alpha.3
* `ratatui-widgets`: 0.3.0-alpha.2 -> 0.3.0-alpha.3
* `ratatui-macros`: 0.7.0-alpha.1 -> 0.7.0-alpha.2
* `ratatui-termwiz`: 0.1.0-alpha.2 -> 0.1.0-alpha.3
* `ratatui-termion`: 0.1.0-alpha.2 -> 0.1.0-alpha.3
* `ratatui`: 0.30.0-alpha.2 -> 0.30.0-alpha.3

<details><summary><i><b>Changelog</b></i></summary><p>

## `ratatui-core`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-crossterm`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-widgets`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)* Make StatefulWidget and Ref work with unsized State by
@thscharler in [#1505](https://github.com/ratatui/ratatui/pull/1505)

-
[7b87509](7b875091e1)
*(uncategorized)* Typo by @marcoieni in
[#1480](https://github.com/ratatui/ratatui/pull/1480)

### Refactor

-
[f132fa1](f132fa1715)
*(table)* Small readability improvements by @joshka in
[#1510](https://github.com/ratatui/ratatui/pull/1510)

-
[904b0aa](904b0aa723)
*(uncategorized)* Move symbols to modules by @joshka in
[#1594](https://github.com/ratatui/ratatui/pull/1594)

-
[7c8573f](7c8573f575)
*(uncategorized)* Rearrange selection_spacing code by @raylu in
[#1540](https://github.com/ratatui/ratatui/pull/1540)

-
[217c57c](217c57cd60)
*(uncategorized)* Modularize backends by @orhun in
[#1508](https://github.com/ratatui/ratatui/pull/1508)

-
[e461b72](e461b724a6)
*(uncategorized)* Move {Stateful,}Widget{,Ref} types into individual
files by @joshka in
[#1479](https://github.com/ratatui/ratatui/pull/1479)

### Documentation

-
[d291042](d291042e69)
*(block)* Revise the block example by @orhun in
[#1520](https://github.com/ratatui/ratatui/pull/1520)

-
[fcde9cb](fcde9cb9c3)
*(changelog)* Fix typo by @orhun in
[#1463](https://github.com/ratatui/ratatui/pull/1463)

-
[3ae6bf1](3ae6bf1d6f)
*(contributing)* Use cargo-xtask for instructions by @orhun in
[#1509](https://github.com/ratatui/ratatui/pull/1509)

-
[04e1b32](04e1b32cd2)
*(layout)* Rename cassowary-rs references to cassowary by @miroim in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

-
[088aac1](088aac136d)
*(readme)* Tweak links and badges by @joshka in
[#1598](https://github.com/ratatui/ratatui/pull/1598)

-
[6e43672](6e436725e4)
*(readme)* Reimagine README.md by @orhun in
[#1569](https://github.com/ratatui/ratatui/pull/1569)

-
[8f28247](8f282473b2)
*(readme)* Correct examples links by @HoKim98 in
[#1484](https://github.com/ratatui/ratatui/pull/1484)

-
[9f90f74](9f90f7495f)
*(readme)* Fix broken link by @nilsmartel in
[#1485](https://github.com/ratatui/ratatui/pull/1485)

-
[260af68](260af68a34)
*(readme)* Include iocraft as an alternative by @kdheepak in
[#1483](https://github.com/ratatui/ratatui/pull/1483)

-
[dafb716](dafb716f9d)
*(widgets)* Add example for grouped barchart by @orhun in
[#1566](https://github.com/ratatui/ratatui/pull/1566)

-
[ed5dd73](ed5dd73084)
*(widgets)* Add example for tabs by @orhun in
[#1559](https://github.com/ratatui/ratatui/pull/1559)

-
[fab5321](fab532171d)
*(widgets)* Add example for scrollbar by @orhun in
[#1545](https://github.com/ratatui/ratatui/pull/1545)

-
[898aef6](898aef6e2f)
*(widgets)* Add example for list by @orhun in
[#1542](https://github.com/ratatui/ratatui/pull/1542)

-
[452366a](452366aa9e)
*(widgets)* Add example for sparkline by @orhun in
[#1556](https://github.com/ratatui/ratatui/pull/1556)

-
[6ddde0e](6ddde0e8a8)
*(widgets)* Add example for table by @orhun in
[#1557](https://github.com/ratatui/ratatui/pull/1557)

-
[93ad6b8](93ad6b828c)
*(widgets)* Update values in chart example by @orhun in
[#1558](https://github.com/ratatui/ratatui/pull/1558)

-
[15f442a](15f442a71e)
*(widgets)* Add example for paragraph by @orhun in
[#1544](https://github.com/ratatui/ratatui/pull/1544)

-
[17bba14](17bba14540)
*(widgets)* Move the logo example to widgets by @orhun in
[#1543](https://github.com/ratatui/ratatui/pull/1543)

-
[f2451e7](f2451e7f1e)
*(widgets)* Add example for gauge by @orhun in
[#1539](https://github.com/ratatui/ratatui/pull/1539)

-
[4f0a8b2](4f0a8b21af)
*(widgets)* Add example for canvas by @orhun in
[#1533](https://github.com/ratatui/ratatui/pull/1533)

-
[91147c4](91147c4d75)
*(widgets)* Add example for chart by @orhun in
[#1536](https://github.com/ratatui/ratatui/pull/1536)

-
[6dd25a3](6dd25a3111)
*(widgets)* Add example for calendar by @orhun in
[#1532](https://github.com/ratatui/ratatui/pull/1532)

-
[99ac005](99ac005b06)
*(widgets)* Add simple barchart example by @joshka in
[#1511](https://github.com/ratatui/ratatui/pull/1511)

-
[da05957](da05957fa0)
*(uncategorized)* Add widget-ref-container example by @joshka in
[#1603](https://github.com/ratatui/ratatui/pull/1603)

-
[1798512](1798512e94)
*(uncategorized)* Fix wording in user_input example by @dawedawe in
[#1611](https://github.com/ratatui/ratatui/pull/1611)

-
[03066d8](03066d81bf)
*(uncategorized)* Fix punctuation in canvas.rs documentation by
@dawedawe in [#1583](https://github.com/ratatui/ratatui/pull/1583)

-
[e411d9e](e411d9ec3e)
*(uncategorized)* Add input form example by @joshka in
[#1551](https://github.com/ratatui/ratatui/pull/1551)

-
[ed071f3](ed071f3723)
*(uncategorized)* Add mouse-drawing example by @joshka in
[#1546](https://github.com/ratatui/ratatui/pull/1546)

-
[46902f5](46902f5587)
*(uncategorized)* Improve docs for workspace crates by @orhun in
[#1490](https://github.com/ratatui/ratatui/pull/1490)

-
[a6b5792](a6b579223f)
*(uncategorized)* Fix example link in readme by @thomas-tacquet in
[#1462](https://github.com/ratatui/ratatui/pull/1462)

### Miscellaneous Tasks

-
[abe2f27](abe2f27328)
*(backend)* Change From<T> impls to new backend specific IntoBackend and
FromBackend traits by @joshka in
[#1464](https://github.com/ratatui/ratatui/pull/1464) [**breaking**]

-
[0a47ebd](0a47ebd94b)
*(bencher)* Update bencher CLI usage by @epompeii in
[#1470](https://github.com/ratatui/ratatui/pull/1470)

-
[a0979d6](a0979d6871)
*(build)* Remove cargo lint by @joshka in
[#1549](https://github.com/ratatui/ratatui/pull/1549)

-
[eaa4038](eaa403856e)
*(ci)* Install pre-built binaries for cargo-rdme by @orhun in
[#1477](https://github.com/ratatui/ratatui/pull/1477)

-
[e5e2316](e5e2316451)
*(ci)* Add check for keeping README.md up-to-date by @orhun in
[#1473](https://github.com/ratatui/ratatui/pull/1473)

-
[2ef3583](2ef3583eff)
*(ci)* Replace cargo-make with a custom cargo-xtask by @joshka in
[#1461](https://github.com/ratatui/ratatui/pull/1461)

-
[98df774](98df774d7f)
*(core)* Move core types to ratatui-core by @joshka in
[#1460](https://github.com/ratatui/ratatui/pull/1460)

-
[35eba76](35eba76b4d)
*(example)* Move demo2 to top level folder by @joshka in
[#1524](https://github.com/ratatui/ratatui/pull/1524)

-
[5f57d35](5f57d35234)
*(examples)* Add colors explorer demo app by @orhun in
[#1580](https://github.com/ratatui/ratatui/pull/1580)

-
[5c021bf](5c021bf344)
*(examples)* Add chart demo app by @orhun in
[#1579](https://github.com/ratatui/ratatui/pull/1579)

-
[9721300](9721300a47)
*(examples)* Add canvas demo app by @orhun in
[#1578](https://github.com/ratatui/ratatui/pull/1578)

-
[a6a1368](a6a1368250)
*(examples)* Add calendar explorer demo app by @orhun in
[#1571](https://github.com/ratatui/ratatui/pull/1571)

-
[819e92c](819e92cd44)
*(examples)* Add weather demo app by @orhun in
[#1567](https://github.com/ratatui/ratatui/pull/1567)

-
[b5f7e44](b5f7e44183)
*(examples)* Move async example to apps by @joshka in
[#1503](https://github.com/ratatui/ratatui/pull/1503)

-
[17316ec](17316ec5d0)
*(github)* Enable sponsorship button by @orhun in
[#1478](https://github.com/ratatui/ratatui/pull/1478)

-
[d3f01eb](d3f01ebf6e)
*(lint)* Ensure lint config is correct by @joshka in
[#1528](https://github.com/ratatui/ratatui/pull/1528)

-
[2b7ec5c](2b7ec5cb7f)
*(widgets)* Enable calendar widget as default by @orhun in
[#1521](https://github.com/ratatui/ratatui/pull/1521)

-
[d201b8e](d201b8e5dd)
*(xtask)* Check lints for only library targets by @orhun in
[#1531](https://github.com/ratatui/ratatui/pull/1531)

-
[6f21319](6f213191ef)
*(uncategorized)* Rename examples with clashing names by @joshka in
[#1597](https://github.com/ratatui/ratatui/pull/1597)

-
[11cbb2b](11cbb2ba87)
*(uncategorized)* Use cargo xtask for bacon clippy command by @joshka in
[#1592](https://github.com/ratatui/ratatui/pull/1592)

-
[b544e39](b544e394c9)
*(uncategorized)* Use clap instead of argh for demo example by @joshka
in [#1591](https://github.com/ratatui/ratatui/pull/1591)

-
[9a54198](9a541981b8)
*(uncategorized)* Make source files non-executable by @orhun in
[#1577](https://github.com/ratatui/ratatui/pull/1577)

-
[357ae7e](357ae7e251)
*(uncategorized)* Move terminal types to ratatui-core by @joshka in
[#1530](https://github.com/ratatui/ratatui/pull/1530) [**breaking**]

-
[21e62d8](21e62d84c2)
*(uncategorized)* Move the demo example to main folder by @joshka in
[#1523](https://github.com/ratatui/ratatui/pull/1523)

-
[fbf6050](fbf6050c86)
*(uncategorized)* Prepare alpha modularization release by @joshka in
[#1525](https://github.com/ratatui/ratatui/pull/1525)

-
[e4e95bc](e4e95bcecf)
*(uncategorized)* Remove --color always flags from bacon.toml by @joshka
in [#1502](https://github.com/ratatui/ratatui/pull/1502)

-
[a41c97b](a41c97b413)
*(uncategorized)* Move unstable widget refs to ratatui by @joshka in
[#1491](https://github.com/ratatui/ratatui/pull/1491) [**breaking**]

-
[e7085e3](e7085e3a3e)
*(uncategorized)* Move widgets into ratatui-widgets crate by @joshka in
[#1474](https://github.com/ratatui/ratatui/pull/1474)

-
[f1d0a18](f1d0a18375)
*(uncategorized)* Move ratatui crate into workspace folder by @joshka in
[#1459](https://github.com/ratatui/ratatui/pull/1459)

-
[55fb2d2](55fb2d2e56)
*(uncategorized)* Update repo links to ratatui instead of ratatui-org by
@joshka in [#1458](https://github.com/ratatui/ratatui/pull/1458)

### Continuous Integration

-
[4a871f9](4a871f993e)
*(uncategorized)* Refactor xtask / toml formatting by @joshka in
[#1602](https://github.com/ratatui/ratatui/pull/1602)

### New Contributors

* @dawedawe made their first contribution in
[#1611](https://github.com/ratatui/ratatui/pull/1611)
* @Its-Just-Nans made their first contribution in
[#1584](https://github.com/ratatui/ratatui/pull/1584)
* @MarSik made their first contribution in
[#1541](https://github.com/ratatui/ratatui/pull/1541)
* @raylu made their first contribution in
[#1540](https://github.com/ratatui/ratatui/pull/1540)
* @renesat made their first contribution in
[#1501](https://github.com/ratatui/ratatui/pull/1501)
* @HoKim98 made their first contribution in
[#1484](https://github.com/ratatui/ratatui/pull/1484)
* @nilsmartel made their first contribution in
[#1485](https://github.com/ratatui/ratatui/pull/1485)
* @marcoieni made their first contribution in
[#1480](https://github.com/ratatui/ratatui/pull/1480)
* @epompeii made their first contribution in
[#1470](https://github.com/ratatui/ratatui/pull/1470)
* @thomas-tacquet made their first contribution in
[#1462](https://github.com/ratatui/ratatui/pull/1462)
* @miroim made their first contribution in
[#1448](https://github.com/ratatui/ratatui/pull/1448)

**Full Changelog**:
https://github.com/ratatui/ratatui/compare/v0.29.0...0.30.0-alpha.1
</blockquote>

## `ratatui-macros`

<blockquote>

##
[0.30.0-alpha.1](https://github.com/ratatui/ratatui/releases/tag/0.30.0-alpha.1)
- 2025-01-14

0.30.0-alpha.1 is a pre-release of the upcoming 0.30.0 release. It is
intended for testing and
feedback. Please report any issues you encounter. The primary change is
that we've split the crate
into multiple crates. The main crate is now `ratatui-core` and the
widgets are in `ratatui-widgets`.
This allows for widget crates to depend on a stable core crate, and for
the core crate to be used
without widgets.

### Features

-
[56d5e05](56d5e05762)
*(bar)* Update label and text_value to accept Into<> by @Emivvvvv in
[#1471](https://github.com/ratatui/ratatui/pull/1471) [**breaking**]

-
[b76ad3b](b76ad3b02e)
*(bar)* Impl Styled for Bar by @Emivvvvv in
[#1476](https://github.com/ratatui/ratatui/pull/1476)

-
[369b18e](369b18eef2)
*(barchart)* Reduce barchart creation verbosity by @Emivvvvv in
[#1453](https://github.com/ratatui/ratatui/pull/1453)

-
[9275d34](9275d3421c)
*(layout)* Add Offset::new() constructor by @joshka in
[#1547](https://github.com/ratatui/ratatui/pull/1547)

-
[ff729b7](ff729b7607)
*(scrollbar)* Support retrieving the current position of state by @orhun
in [#1552](https://github.com/ratatui/ratatui/pull/1552)

-
[ce4856a](ce4856a65f)
*(widgets)* Add the missing constructor to canvas types by @orhun in
[#1538](https://github.com/ratatui/ratatui/pull/1538)

-
[50ba965](50ba96518f)
*(uncategorized)* Add a new RatatuiMascot widget by @Its-Just-Nans in
[#1584](https://github.com/ratatui/ratatui/pull/1584)

-
[1d28c89](1d28c89fe5)
*(uncategorized)* Add conversions for anstyle by @joshka in
[#1581](https://github.com/ratatui/ratatui/pull/1581)

### Bug Fixes

-
[860e48b](860e48b0f0)
*(buffer)* Buffer::get_pos() now correctly handles index > u16::MAX by
@joshka in [#1447](https://github.com/ratatui/ratatui/pull/1447)

-
[ec30390](ec30390446)
*(canvas)* Round coordinates to nearest grid cell by @joshka in
[#1507](https://github.com/ratatui/ratatui/pull/1507)

-
[afd1ce1](afd1ce179b)
*(canvas)* Lines that start outside the visible grid are now drawn by
@renesat in [#1501](https://github.com/ratatui/ratatui/pull/1501)

-
[18e70d3](18e70d3d51)
*(crossterm)* Terminal should keep Bold when removing Dim by @MarSik in
[#1541](https://github.com/ratatui/ratatui/pull/1541)

-
[a692a6e](a692a6e371)
*(lint)* Apply rust 1.84 clippy suggestions by @joshka in
[#1612](https://github.com/ratatui/ratatui/pull/1612)

-
[3b13240](3b13240728)
*(scrollbar)* Check for area.is_empty() before rendering by @farmeroy in
[#1529](https://github.com/ratatui/ratatui/pull/1529)

-
[f57b696](f57b696fdc)
*(span)* Dont render control characters by @EdJoPaTo in
[#1312](https://github.com/ratatui/ratatui/pull/1312)

-
[2ce958e](2ce958e38c)
*(table)* Allow display of additional table row, if row height > 1 by
@Lunderberg in [#1452](https://github.com/ratatui/ratatui/pull/1452)

-
[2892bdd](2892bddce6)
*(uncategorized)* Rust 1.83 clippy lints by @joshka in
[#1527](https://github.com/ratatui/ratatui/pull/1527)

-
[36e2d1b](36e2d1bda1)
*(uncategorized)* Add feature(doc_cfg) when generating docs by @joshka
in [#1506](https://github.com/ratatui/ratatui/pull/1506)

-
[4d7704f](4d7704fba5)
*(uncategorized)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-13 12:48:15 -07:00
Josh McKinney
a0746bad7e ci: add job to check no-std build (#1851)
Uses x86_64-unknown-none as an arbitrary target that does not support
the std library

Resolves: https://github.com/ratatui/ratatui/issues/1843
2025-05-13 12:43:10 -07:00
Josh McKinney
4fcd238e1e feat: support no-std for calendar widget (#1852)
Removes the CalendarEventStore::today() function in no-std environments
2025-05-13 11:38:39 -07:00
Jagoda Estera Ślązak
79d5165cae fix(no_std): propagate std feature flag to dependencies (#1838)
Disables `std` feature flags in dependencies and only enables them with
`ratatui` and `ratatui-core`'s `std` feature flag. This partially fixes the
issue of still depending on `std`, when `std` feature flag is disabled.
2025-05-13 10:48:45 -07:00
Jagoda Estera Ślązak
00da8c6203 fix(no_std): provide f64 polyfills for no_std compatibility (#1840)
Related: https://github.com/rust-lang/rust/issues/137578
2025-05-13 10:37:18 -07:00
dependabot[bot]
54bb651008 build(deps): bump hashbrown from 0.15.2 to 0.15.3 (#1821) 2025-05-12 08:45:08 -07:00
Jagoda Estera Ślązak
daeba85f14 build(deps): bump kasuari and line-clipping (#1844) 2025-05-12 01:55:49 -07:00
Josh McKinney
93143126b3 fix(layout): feature flag cache related types (#1842) 2025-05-11 01:55:12 -07:00
Jagoda Estera Ślązak
b46778dd1d chore(breaking-changes): add details to no_std-related breaking changes (#1828)
Some corrections and added details to BREAKING-CHANGES.md.

I decided to remove:

- `Backend` now uses `Self::Error` for error handling instead of
`std::io::Error`
- `Terminal<B>` now uses `B::Error` for error handling instead of
`std::io::Error`

...as we are still using `std::io::Error` in built-in backends, so this
will only be breaking if a third-party backend decides to use a custom
error other than `std::io::Error`, which would be a breaking change in
downstream and not `ratatui`.

The exception to that is `TestBackend`, which uses `Infallible`, but
this already has its own breaking changes entry.
2025-05-11 11:45:30 +03:00
Josh McKinney
8d60e96b2b refactor(examples): use crossterm event methods (#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.
2025-05-10 10:35:12 -07:00
Jagoda Estera Ślązak
1874b9dd55 chore: move time to dev-dependencies (#1835) 2025-05-10 08:11:00 -07:00
Jagoda Estera Ślązak
2dd1977c59 fix(layout-cache): import NonZeroUsize only when layout-cache is enabled (#1839)
This silences unused import warning, when `layout-cache` is disabled.
2025-05-10 08:09:47 -07:00
三咲雅 · Misaki Masa
c238aca83a fix: padding_right() should set right padding instead of left (#1837)
Fixes https://github.com/ratatui/ratatui/issues/1836
2025-05-09 23:31:16 -07:00
Jagoda Estera Ślązak
60a81913ed chore(widgets): move crossterm to dev-dependencies (#1834)
Crossterm in widgets is used only in tests.
2025-05-09 16:16:32 -07:00
Tayfun Bocek
2e54d5e22c fix(macros): use $crate re-export in text macro (#1832) 2025-05-09 09:54:15 -07:00
Jagoda Estera Ślązak
3e1c72fb27 feat(no_std)!: make ratatui compatible with #![no_std] (#1794)
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?"
2025-05-07 13:42:03 -07:00
Jagoda Estera Ślązak
ab48c06171 feat(no_std)!: option to disable layout cache for no_std compatibility (#1795)
Resolves #1780 

BREAKING CHANGE: Disabling `default-features` will now disable layout
cache, which can have a negative impact on performance.
`Layout::init_cache` and `Layout::DEFAULT_CACHE_SIZE` are now only
available if `layout-cache` feature is enabled.
2025-05-07 13:00:22 -07:00
Jagoda Estera Ślązak
09173d1829 feat(no_std)!: make TestBackend::Error Infallible (#1823)
BREAKING CHANGE: `TestBackend` now uses `core::convert::Infallible` for
error handling instead of `std::io::Error`
2025-05-07 00:33:26 -07:00
Jagoda Estera Ślązak
c7912f3990 docs(breaking-changes): fix header level (#1825) 2025-05-06 23:17:37 -07:00
M Arjun Krishna
53cdbbccd5 feat: Enable serde propagation to backend crates (crossterm, termion) (#1812)
This PR propagates the serde feature from the main ratatui crate to the
ratatui-crossterm and ratatui-termion backend crates. Solves #1805
2025-04-29 13:29:49 -07:00
Josh McKinney
1197b2a02c docs(contributing): add note about using nightly for formatting (#1816) 2025-04-28 21:25:09 +03:00
Tatesa Uradnik
08b08cc45b feat(rect): centering (#1814)
Resolves #617
2025-04-28 11:16:58 -07:00
Jagoda Estera Ślązak
007713e50a feat(no_std)!: replace Backend's io::Error usages with associated Error type (#1778)
Resolves #1775 

BREAKING CHANGE: Custom backends now have to implement `Backend::Error`
and `Backend::clear_region`. Additionally some generic `Backend` usage
will have to explicitly set trait bounds for `Backend::Error`.
2025-04-23 15:05:59 -07:00
dependabot[bot]
3745a67ba0 build(deps): bump rand from 0.9.0 to 0.9.1 (#1804)
Bumps [rand](https://github.com/rust-random/rand) from 0.9.0 to 0.9.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-random/rand/blob/master/CHANGELOG.md">rand's
changelog</a>.</em></p>
<blockquote>
<h2>[0.9.1] - 2025-04-17</h2>
<h3>Security and unsafe</h3>
<ul>
<li>Revise &quot;not a crypto library&quot; policy again (<a
href="https://redirect.github.com/rust-random/rand/issues/1565">#1565</a>)</li>
<li>Remove <code>zerocopy</code> dependency from <code>rand</code> (<a
href="https://redirect.github.com/rust-random/rand/issues/1579">#1579</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Fix feature <code>simd_support</code> for recent nightly rust (<a
href="https://redirect.github.com/rust-random/rand/issues/1586">#1586</a>)</li>
</ul>
<h3>Changes</h3>
<ul>
<li>Allow <code>fn rand::seq::index::sample_weighted</code> and <code>fn
IndexedRandom::choose_multiple_weighted</code> to return fewer than
<code>amount</code> results (<a
href="https://redirect.github.com/rust-random/rand/issues/1623">#1623</a>),
reverting an undocumented change (<a
href="https://redirect.github.com/rust-random/rand/issues/1382">#1382</a>)
to the previous release.</li>
</ul>
<h3>Additions</h3>
<ul>
<li>Add <code>rand::distr::Alphabetic</code> distribution. (<a
href="https://redirect.github.com/rust-random/rand/issues/1587">#1587</a>)</li>
<li>Re-export <code>rand_core</code> (<a
href="https://redirect.github.com/rust-random/rand/issues/1604">#1604</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ec6d5c06a5"><code>ec6d5c0</code></a>
Prepare rand_core v0.9.1 (<a
href="https://redirect.github.com/rust-random/rand/issues/1591">#1591</a>)</li>
<li><a
href="6a06056e8a"><code>6a06056</code></a>
rand_core: introduce an UnwrapMut wrapper (<a
href="https://redirect.github.com/rust-random/rand/issues/1589">#1589</a>)</li>
<li><a
href="8929123b4d"><code>8929123</code></a>
Add <code>Alphabetic</code> distribution (<a
href="https://redirect.github.com/rust-random/rand/issues/1587">#1587</a>)</li>
<li><a
href="06b16426bd"><code>06b1642</code></a>
Remove unnecessary underscore from `impl&lt;T, const N: usize&gt;
Distribution&lt;[T; ...</li>
<li><a
href="49d76cd7b4"><code>49d76cd</code></a>
rename extract to extract_lane (<a
href="https://redirect.github.com/rust-random/rand/issues/1586">#1586</a>)</li>
<li><a
href="e0a70fd8be"><code>e0a70fd</code></a>
Change to use <code>array::from_fn</code> in <code>Distribution\&lt;[T;
N]&gt; for StandardUniform</code> ...</li>
<li><a
href="0bc3f652c4"><code>0bc3f65</code></a>
Move rand distr (<a
href="https://redirect.github.com/rust-random/rand/issues/1577">#1577</a>)</li>
<li><a
href="2677c49960"><code>2677c49</code></a>
Revise &quot;not a crypto library&quot; policy and SECURITY.md (<a
href="https://redirect.github.com/rust-random/rand/issues/1565">#1565</a>)</li>
<li><a
href="bfd1826c36"><code>bfd1826</code></a>
SeedableRng docs: add note on (lack of) reproducibility (<a
href="https://redirect.github.com/rust-random/rand/issues/1572">#1572</a>)</li>
<li><a
href="c01aee7a13"><code>c01aee7</code></a>
Fix some links (<a
href="https://redirect.github.com/rust-random/rand/issues/1571">#1571</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-random/rand/compare/0.9.0...rand_core-0.9.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rand&package-manager=cargo&previous-version=0.9.0&new-version=0.9.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 21:14:44 +03:00
dependabot[bot]
98f77f296b build(deps): bump clap from 4.5.36 to 4.5.37 (#1803)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.36 to 4.5.37.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.37</h2>
<h2>[4.5.37] - 2025-04-18</h2>
<h3>Features</h3>
<ul>
<li>Added <code>ArgMatches::try_clear_id()</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.37] - 2025-04-18</h2>
<h3>Features</h3>
<ul>
<li>Added <code>ArgMatches::try_clear_id()</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c54ffa17f5"><code>c54ffa1</code></a>
chore: Release</li>
<li><a
href="26eab7b4e5"><code>26eab7b</code></a>
docs: Update changelog</li>
<li><a
href="f275804c23"><code>f275804</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5805">#5805</a>
from epage/style</li>
<li><a
href="7c7742cae8"><code>7c7742c</code></a>
fix(complete): Adjust dynamic for MSRV</li>
<li><a
href="f1ae3c0e49"><code>f1ae3c0</code></a>
style: Make clippy happy</li>
<li><a
href="5c932b7079"><code>5c932b7</code></a>
chore(deps): Update Rust crate divan to v0.1.15 (<a
href="https://redirect.github.com/clap-rs/clap/issues/5798">#5798</a>)</li>
<li><a
href="bc0537f589"><code>bc0537f</code></a>
chore(deps): Update compatible (dev) (<a
href="https://redirect.github.com/clap-rs/clap/issues/5797">#5797</a>)</li>
<li>See full diff in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.36...clap_complete-v4.5.37">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.36&new-version=4.5.37)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 21:01:16 +03:00
Tyler Breisacher
d88cd29079 chore: Add 'const' to functions where possible. (#1802)
The Clippy check for this (missing_const_for_fn) is already enabled, but
catches more cases in upcoming toolchain versions.

This is part of the work to unblock #1727
2025-04-20 18:48:49 -07:00
Josh McKinney
79cc92dfb6 chore(deps): bump proc-macro2 (#1793) 2025-04-17 01:03:23 -07:00
Josh McKinney
5a3be12ebd ci: run clippy using rust stable and beta (#1757)
This makes it possible to pre-emptively catch upcoming clippy issues. We
should not block PRs on these generally (unless the PR introduces a
valid clippy warning), so the workflow is set up to not fail on beta.
2025-04-15 11:09:20 -07:00
Josh McKinney
bb068892c9 chore: fix io_other_error clippy lints (#1756)
Pre-emptive fix for new lint to be added in 1.87 (currently in beta).

https://rust-lang.github.io/rust-clippy/master/index.html\#io_other_error
2025-04-15 11:09:05 -07:00
cgzones
deb1b8ec43 test: ensure Style::new() and Style::default() are equivalent (#1789) 2025-04-15 10:21:19 -07:00
cgzones
0f80c5e87e chore!: use expect() instead of allow() for lint overrides (#1786)
BREAKING CHANGE: MSRV is now 1.81
2025-04-15 10:20:22 -07:00
dependabot[bot]
a03ba0de5c build(deps): bump crossterm from 0.28.1 to 0.29.0 (#1771)
Bumps [crossterm](https://github.com/crossterm-rs/crossterm) from 0.28.1
to 0.29.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/crossterm-rs/crossterm/releases">crossterm's
releases</a>.</em></p>
<blockquote>
<h2>0.29</h2>
<h1>Version 0.29</h1>
<h2>Added </h2>
<ul>
<li>Copy to clipboard using OSC52 (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/974">#974</a>)</li>
<li>Derive standard traits for &quot;SetCursorStyle&quot; (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/909">#909</a>)</li>
<li>Add query_keyboard_enhancement_flags to read enabled flags (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/958">#958</a>)</li>
<li>Add is_* and as_* methods to the event enums (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/949">#949</a>)</li>
<li>Add a feature flag for derive_more impls (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/970">#970</a>)</li>
<li>Update rustix to 1.0 (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/982">#982</a>)</li>
<li>Upgrade various dependencies</li>
</ul>
<h2>Breaking ⚠️</h2>
<ul>
<li>Correctly fix KeyModifiers Display impl Properly adding + in between
modifiers (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/979">#979</a>)</li>
</ul>
<p><a href="https://github.com/joshka"><code>@​joshka</code></a> <a
href="https://github.com/linrongbin16"><code>@​linrongbin16</code></a>
<a href="https://github.com/kmicklas"><code>@​kmicklas</code></a> <a
href="https://github.com/maciek50322"><code>@​maciek50322</code></a> <a
href="https://github.com/rosew0od"><code>@​rosew0od</code></a> <a
href="https://github.com/sxyazi"><code>@​sxyazi</code></a> <a
href="https://github.com/the-mikedavis"><code>@​the-mikedavis</code></a>
<a href="https://github.com/hthuz"><code>@​hthuz</code></a> <a
href="https://github.com/aschey"><code>@​aschey</code></a> <a
href="https://github.com/naseschwarz"><code>@​naseschwarz</code></a> <a
href="https://github.com/Flokkq"><code>@​Flokkq</code></a> <a
href="https://github.com/gaesa"><code>@​gaesa</code></a> <a
href="https://github.com/WindSoilder"><code>@​WindSoilder</code></a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/crossterm-rs/crossterm/blob/master/CHANGELOG.md">crossterm's
changelog</a>.</em></p>
<blockquote>
<h1>Unreleased</h1>
<h1>Version 0.29</h1>
<h2>Added </h2>
<ul>
<li>Copy to clipboard using OSC52 (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/974">#974</a>)</li>
<li>Derive standard traits for &quot;SetCursorStyle&quot; (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/909">#909</a>)</li>
<li>Add query_keyboard_enhancement_flags to read enabled flags (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/958">#958</a>)</li>
<li>Add is_* and as_* methods to the event enums (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/949">#949</a>)</li>
<li>Add a feature flag for derive_more impls (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/970">#970</a>)</li>
<li>Update rustix to 1.0 (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/982">#982</a>)</li>
</ul>
<h2>Breaking ⚠️</h2>
<ul>
<li>Correctly fix KeyModifiers Display impl Properly adding + in between
modifiers (<a
href="https://redirect.github.com/crossterm-rs/crossterm/issues/979">#979</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/crossterm-rs/crossterm/commits/0.29">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crossterm&package-manager=cargo&previous-version=0.28.1&new-version=0.29.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-04-15 09:35:41 -07:00
Jagoda Estera Ślązak
b4a71e5fd5 chore(lint): add std instead of core/alloc lints to ratatui-widgets (#1763)
Resolves #1761
2025-04-15 09:21:46 -07:00
Jagoda Estera Ślązak
a42a17e184 feat(no_std): make ratatui-widgets no_std (#1779)
Resolves #1776
2025-04-15 09:16:06 -07:00
Edwin Burwell
07bec55b7d refactor(no_std): Make usages of std explicit in ratatui-core. (#1782)
### This commit does the following:

- Adds `#[no_std]` to `lib.rs`.
- Adds `extern crate std;` to `lib.rs`.
- Updates `ratatui-core` to explicitly `use` items from std and alloc.
- Prefers `use`-ing alloc over std when possible.

### Explanation:

This allows usages of `std` in `ratatui-core` to be clearly pointed out
and dealt with individually.

Eventually, when `std` is to be feature gated, the associated commit
will be much cleaner.
2025-04-15 09:14:25 -07:00
cgzones
02e53de0f8 refactor: make use of iter::repeat_n() (#1788)
Applied via clippy --fix.
Available since 1.82.0.
2025-04-14 21:43:38 +03:00
cgzones
c90ba9781e fix: avoid unnecessary imports in minimal build (#1787)
core::ops::Range is only used with the feature `scrolling-regions`.
Ensure a minimal `cargo check` reports no warnings.
2025-04-14 21:38:47 +03:00
dependabot[bot]
799a6c66a7 build(deps): bump clap from 4.5.35 to 4.5.36 (#1790)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.35 to 4.5.36.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.36</h2>
<h2>[4.5.36] - 2025-04-11</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Revert 4.5.35's &quot;Don't leave space for shorts
if there are none&quot; for now</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.36] - 2025-04-11</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Revert 4.5.35's &quot;Don't leave space for shorts
if there are none&quot; for now</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7a6475e3c1"><code>7a6475e</code></a>
chore: Release</li>
<li><a
href="0266c4197f"><code>0266c41</code></a>
docs: Update changelog</li>
<li><a
href="6ec0b43448"><code>6ec0b43</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5791">#5791</a>
from okapia/zsh-default-fallback</li>
<li><a
href="e40168c2fd"><code>e40168c</code></a>
fix(zsh): Use _default as zsh completion fallback</li>
<li>See full diff in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.35...clap_complete-v4.5.36">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.35&new-version=4.5.36)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-14 20:49:18 +03:00
Ben Beasley
fc4b996c59 build(deps): update compact_str requirement from 0.8.1 to 0.9.0 (#1783)
Looking at
https://github.com/ParkMyCar/compact_str/blob/v0.9.0/CHANGELOG.md#090,
there are a few API changes, but it doesn’t seem like anything there
should be a problem given that `cargo test` still passes in
`ratatui-core/`.
2025-04-13 10:51:21 +03:00
Austin Schey
6836a6903e feat: implement styled for other primitives (#1684) 2025-04-11 07:52:33 -07:00
Cristian Le
d28a08237a chore(deps): drop unused font8x8 dependency (#1777) 2025-04-11 15:28:11 +03:00
dependabot[bot]
5f8c159484 build(deps): bump crossbeam-channel from 0.5.14 to 0.5.15 in the cargo group (#1774)
Bumps the cargo group with 1 update:
[crossbeam-channel](https://github.com/crossbeam-rs/crossbeam).

Updates `crossbeam-channel` from 0.5.14 to 0.5.15
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/crossbeam-rs/crossbeam/releases">crossbeam-channel's
releases</a>.</em></p>
<blockquote>
<h2>crossbeam-channel 0.5.15</h2>
<ul>
<li>Fix regression introduced in 0.5.12 that can lead to a double free
when dropping unbounded channel. (<a
href="https://redirect.github.com/crossbeam-rs/crossbeam/issues/1187">#1187</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d35ffde18a"><code>d35ffde</code></a>
Prepare for the next release</li>
<li><a
href="6ec74ecae8"><code>6ec74ec</code></a>
crossbeam-channel: prevent double free on Drop (<a
href="https://redirect.github.com/crossbeam-rs/crossbeam/issues/1187">#1187</a>)</li>
<li>See full diff in <a
href="https://github.com/crossbeam-rs/crossbeam/compare/crossbeam-channel-0.5.14...crossbeam-channel-0.5.15">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crossbeam-channel&package-manager=cargo&previous-version=0.5.14&new-version=0.5.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/ratatui/ratatui/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-11 14:36:09 +03:00
Jagoda Estera Ślązak
5a232a3115 feat(no_std): remove redundant std usages in ratatui-widgets (#1762) 2025-04-08 08:59:31 -07:00
dependabot[bot]
577bd17bba build(deps): bump clap from 4.5.34 to 4.5.35 (#1770)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.34 to 4.5.35.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.35</h2>
<h2>[4.5.35] - 2025-04-01</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Align positionals and flags when put in the same
<code>help_heading</code></li>
<li><em>(help)</em> Don't leave space for shorts if there are none</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.35] - 2025-04-01</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Align positionals and flags when put in the same
<code>help_heading</code></li>
<li><em>(help)</em> Don't leave space for shorts if there are none</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="55a18f518b"><code>55a18f5</code></a>
chore: Release</li>
<li><a
href="3b0563580d"><code>3b05635</code></a>
fix(complete): Ensure new enough clap is used</li>
<li>See full diff in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.34...clap_complete-v4.5.35">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.34&new-version=4.5.35)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 13:23:20 +03:00
dependabot[bot]
fdc1746eff build(deps): bump tokio from 1.44.1 to 1.44.2 (#1769)
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.44.1 to 1.44.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/tokio/releases">tokio's
releases</a>.</em></p>
<blockquote>
<h2>Tokio v1.44.2</h2>
<p>This release fixes a soundness issue in the broadcast channel. The
channel
accepts values that are <code>Send</code> but <code>!Sync</code>.
Previously, the channel called
<code>clone()</code> on these values without synchronizing. This release
fixes the channel
by synchronizing calls to <code>.clone()</code> (Thanks Austin Bonander
for finding and
reporting the issue).</p>
<h3>Fixed</h3>
<ul>
<li>sync: synchronize <code>clone()</code> call in broadcast channel (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7232">#7232</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/tokio/issues/7232">#7232</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7232">tokio-rs/tokio#7232</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ec4b1d7215"><code>ec4b1d7</code></a>
chore: forward port 1.43.x</li>
<li><a
href="e3c3a56718"><code>e3c3a56</code></a>
Merge branch 'tokio-1.43.x' into forward-port-1.43.x</li>
<li><a
href="a7b658c35b"><code>a7b658c</code></a>
chore: prepare Tokio v1.43.1 release</li>
<li><a
href="c1c8d1033d"><code>c1c8d10</code></a>
Merge remote-tracking branch 'origin/tokio-1.38.x' into
forward-port-1.38.x</li>
<li><a
href="aa303bc205"><code>aa303bc</code></a>
chore: prepare Tokio v1.38.2 release</li>
<li><a
href="7b6ccb515f"><code>7b6ccb5</code></a>
chore: backport CI fixes</li>
<li><a
href="4b174ce2c9"><code>4b174ce</code></a>
sync: fix cloning value when receiving from broadcast channel</li>
<li>See full diff in <a
href="https://github.com/tokio-rs/tokio/compare/tokio-1.44.1...tokio-1.44.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.44.1&new-version=1.44.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 13:23:02 +03:00
Josh McKinney
fcb47d60f3 feat!: rename Alignment to HorizontalAlignment and add VerticalAlignment (#1735)
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 `Alignment` enum has been renamed to
`HorizontalAlignment` to 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.

```diff
- use ratatui::layout::Alignment;
+ use ratatui::layout::HorizontalAlignment;

- use Alignment::*;
+ use HorizontalAlignment::*;
```
2025-04-06 20:00:59 +03:00
Jagoda Estera Ślązak
2be9ccb120 docs(layout): remove unnecessary path prefix (#1766) 2025-04-06 18:19:36 +03:00
Jagoda Estera Ślązak
b669cebcaf docs(layout): change cassowary to kasuari crate reference (#1765) 2025-04-06 18:19:19 +03:00
Jagoda Estera Ślązak
cef617cc35 chore(lint): add std instead of core/alloc lints to ratatui-core (#1759)
Resolves #1752
2025-04-04 03:59:22 -07:00
Josh McKinney
3d5b250e74 build(deps): use kasuari instead of cassowary (#1758)
[Kasuari](https://github.com/ratatui/kasuari) is a maintained fork of Cassowary.
2025-04-04 00:03:39 -07:00
Jagoda Estera Ślązak
ebe10cd81f feat(no_std): remove redundant std usages in ratatui-core (#1753)
Resolves https://github.com/ratatui/ratatui/issues/1751
2025-04-03 20:02:54 -07:00
Jagoda Estera Ślązak
416ebdf8c8 fix: correct clippy errors introduced by rust 1.86.0 update (#1755)
New version of rust (1.86.0) caused CI to fail.
2025-04-03 16:43:12 -07:00
Jagoda Estera Ślązak
ce16692b9a docs(release): fix typo (#1754) 2025-04-03 21:51:03 +03:00
EdJoPaTo
ba9eed7742 perf(table): replace while loop with simple min operation (#1747) 2025-04-02 14:55:47 -07:00
dependabot[bot]
c27fba06f1 build(deps): bump clap from 4.5.32 to 4.5.34 (#1742)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.32 to 4.5.34.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.34</h2>
<h2>[4.5.34] - 2025-03-27</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Don't add extra blank lines with
<code>flatten_help(true)</code> and subcommands without arguments</li>
</ul>
<h2>v4.5.33</h2>
<h2>[4.5.33] - 2025-03-26</h2>
<h3>Fixes</h3>
<ul>
<li><em>(error)</em> When showing the usage of a suggestion for an
unknown argument, don't show the group</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.34] - 2025-03-27</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Don't add extra blank lines with
<code>flatten_help(true)</code> and subcommands without arguments</li>
</ul>
<h2>[4.5.33] - 2025-03-26</h2>
<h3>Fixes</h3>
<ul>
<li><em>(error)</em> When showing the usage of a suggestion for an
unknown argument, don't show the group</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5d2cdac3e6"><code>5d2cdac</code></a>
chore: Release</li>
<li><a
href="f1c10ebe58"><code>f1c10eb</code></a>
docs: Update changelog</li>
<li><a
href="a4d1a7fe2b"><code>a4d1a7f</code></a>
chore(ci): Take a break from template updates</li>
<li><a
href="e95ed396c4"><code>e95ed39</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5775">#5775</a>
from vivienm/master</li>
<li><a
href="18f8d4c3f5"><code>18f8d4c</code></a>
chore(deps): Update Rust Stable to v1.82 (<a
href="https://redirect.github.com/clap-rs/clap/issues/5788">#5788</a>)</li>
<li><a
href="f35d8e09fb"><code>f35d8e0</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5787">#5787</a>
from epage/template</li>
<li><a
href="1389d7d689"><code>1389d7d</code></a>
chore: Update from '_rust/main' template</li>
<li><a
href="dbc9faa79d"><code>dbc9faa</code></a>
chore(ci): Initialize git for template update</li>
<li><a
href="3dac2f3683"><code>3dac2f3</code></a>
chore(ci): Get history for template update</li>
<li><a
href="e1f77dacf1"><code>e1f77da</code></a>
chore(ci): Fix branch for template update</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.32...clap_complete-v4.5.34">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.32&new-version=4.5.34)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 07:33:01 +03:00
dependabot[bot]
497b88e237 build(deps): bump termwiz from 0.23.0 to 0.23.3 (#1736)
Bumps [termwiz](https://github.com/wezterm/wezterm) from 0.23.0 to
0.23.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/wezterm/wezterm/releases">termwiz's
releases</a>.</em></p>
<blockquote>
<h2>Nightly Builds</h2>
<p>Ignore the sources associated with this release: it's just the
readme.
This release holds builds generated by the nightly build process that
runs in the CI/CD environment.
These builds may be unstable or unusable; they are simply a build of
whatever is in master at the time that the nightly build runs.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4bf28e253c"><code>4bf28e2</code></a>
deps: set workspace pest dep to 2.7</li>
<li><a
href="d0ff5cb892"><code>d0ff5cb</code></a>
termwiz: update changelog</li>
<li><a
href="994c0a39b6"><code>994c0a3</code></a>
add Cargo.lock</li>
<li><a
href="8b7ca454b5"><code>8b7ca45</code></a>
termwiz: bump version</li>
<li><a
href="eb9f8604e1"><code>eb9f860</code></a>
fix: deal with Windows Terminal mouse move with no buttons SGR
report</li>
<li><a
href="7053748e4d"><code>7053748</code></a>
refactor: remove redundant character checks in Launcher,
InputSelector</li>
<li><a
href="12b971ac44"><code>12b971a</code></a>
docs: changelog for <a
href="https://redirect.github.com/wezterm/wezterm/issues/6696">#6696</a></li>
<li><a
href="9606fa2569"><code>9606fa2</code></a>
Add font configuration option for ActivateCommandPalette, CharSelect,
PaneSel...</li>
<li><a
href="46cfda6665"><code>46cfda6</code></a>
shapecache: fixup for noto font update</li>
<li><a
href="824df44296"><code>824df44</code></a>
update bundled Noto Color Emoji</li>
<li>Additional commits viewable in <a
href="https://github.com/wezterm/wezterm/compare/termwiz-0.23.0...termwiz-0.23.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=termwiz&package-manager=cargo&previous-version=0.23.0&new-version=0.23.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 07:31:48 +03:00
dependabot[bot]
fff8319fa1 build(deps): bump termion from 4.0.4 to 4.0.5 (#1743)
Bumps termion from 4.0.4 to 4.0.5.


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=termion&package-manager=cargo&previous-version=4.0.4&new-version=4.0.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 07:27:48 +03:00
dependabot[bot]
495a9807ea build(deps): bump octocrab from 0.43.0 to 0.44.0 (#1744)
Bumps [octocrab](https://github.com/XAMPPRocky/octocrab) from 0.43.0 to
0.44.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/XAMPPRocky/octocrab/releases">octocrab's
releases</a>.</em></p>
<blockquote>
<h2>v0.44.0</h2>
<h3>Added</h3>
<ul>
<li>Implement Serialize for Page (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/761">#761</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>[<strong>breaking</strong>] <code>sha</code> is optional in
<code>DiffEntry</code> if file contents are unchanged (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/750">#750</a>)</li>
<li>insert auth headers for api.github.com (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/754">#754</a>)</li>
<li><em>(emails)</em> <code>visibility</code> can be <code>null</code>
(<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/756">#756</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/XAMPPRocky/octocrab/blob/main/CHANGELOG.md">octocrab's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/XAMPPRocky/octocrab/compare/v0.43.0...v0.44.0">0.44.0</a>
- 2025-03-26</h2>
<h3>Added</h3>
<ul>
<li>Implement Serialize for Page (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/761">#761</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>[<strong>breaking</strong>] <code>sha</code> is optional in
<code>DiffEntry</code> if file contents are unchanged (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/750">#750</a>)</li>
<li>insert auth headers for api.github.com (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/754">#754</a>)</li>
<li><em>(emails)</em> <code>visibility</code> can be <code>null</code>
(<a
href="https://redirect.github.com/XAMPPRocky/octocrab/pull/756">#756</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3a779f3969"><code>3a779f3</code></a>
chore: release v0.43.1 (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/issues/762">#762</a>)</li>
<li><a
href="689cb92846"><code>689cb92</code></a>
fix!: <code>sha</code> is optional in <code>DiffEntry</code> if file
contents are unchanged (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/issues/750">#750</a>)</li>
<li><a
href="e37e5a836b"><code>e37e5a8</code></a>
fix: insert auth headers for api.github.com (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/issues/754">#754</a>)</li>
<li><a
href="87a49c3913"><code>87a49c3</code></a>
feat: Implement Serialize for Page (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/issues/761">#761</a>)</li>
<li><a
href="31f625d03b"><code>31f625d</code></a>
fix(emails): <code>visibility</code> can be <code>null</code> (<a
href="https://redirect.github.com/XAMPPRocky/octocrab/issues/756">#756</a>)</li>
<li>See full diff in <a
href="https://github.com/XAMPPRocky/octocrab/compare/v0.43.0...v0.44.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=octocrab&package-manager=cargo&previous-version=0.43.0&new-version=0.44.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 07:25:00 +03:00
Orhun Parmaksız
b3f3c9bfd5 chore(ci): disable running release-plz on forked repositories (#1730)
See https://github.com/jdssl/ratatui/pull/1#issuecomment-2739366609
2025-03-25 01:49:11 -07:00
Josh McKinney
2739391950 style: use Module imports_granularity (#1728)
I was swayed by the arguments about this made by the compiler team In
<https://github.com/rust-lang/compiler-team/issues/750> 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.

Main change is in rustfmt.toml, and the rest is just the result of
running `cargo xtask format`.

While implementing this, cargo machete brings up that the various
backend crates are unused by the example crates.

The re-export of each backend crate under ratatui is to make it possible
for libs that rely on a specific version of ratatui to use the same
version of the backend crate. Apps in general should use the backend
crate directly rather than through ratatui as this is less confusing.

- Removes all usages of `ratatui::{crossterm, termion, termwiz}`` in the
  examples.
- Adds the backend crate to the dependencies of the examples that use
  the backend crate directly.
2025-03-19 16:48:02 -07:00
Orhun Parmaksız
dca331c748 fix(demo): support tab key in demo2 example (#1726)
see #1721

Not sure what caused this - it's been there for a while probably and we
didn't realize it since we used `demo2-destroy` mostly.
2025-03-19 12:14:49 +03:00
Josh McKinney
e7defb36de ci: remove bencher workflows (#1719)
These actions are currently unused as we haven't
invested the time necessary to understand how best
to use them. We can always re-add them later if we
find them useful.
2025-03-17 16:09:51 -07:00
dependabot[bot]
87c9823b08 build(deps): bump serde from 1.0.218 to 1.0.219 (#1714)
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.218 to
1.0.219.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/serde-rs/serde/releases">serde's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.219</h2>
<ul>
<li>Prevent <code>absolute_paths</code> Clippy restriction being
triggered inside macro-generated code (<a
href="https://redirect.github.com/serde-rs/serde/issues/2906">#2906</a>,
thanks <a
href="https://github.com/davidzeng0"><code>@​davidzeng0</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="49d098debd"><code>49d098d</code></a>
Release 1.0.219</li>
<li><a
href="40f1d19dbe"><code>40f1d19</code></a>
Wrap dummy.rs to 80 columns</li>
<li><a
href="514848b584"><code>514848b</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/serde/issues/2906">#2906</a>
from davidzeng0/master</li>
<li><a
href="168b6cf789"><code>168b6cf</code></a>
fix clippy absolute paths warning</li>
<li><a
href="a8bdd17333"><code>a8bdd17</code></a>
Remove unused Punctuated import</li>
<li><a
href="1c9601358b"><code>1c96013</code></a>
Resolve mem_replace_with_default clippy lint</li>
<li><a
href="f0d1ae08f3"><code>f0d1ae0</code></a>
Ignore elidable_lifetime_names pedantic clippy lint</li>
<li><a
href="e3eaa6a3dd"><code>e3eaa6a</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/serde/issues/2896">#2896</a>
from dtolnay/stabledoc</li>
<li><a
href="6a630cf283"><code>6a630cf</code></a>
Also link to stable proc_macro</li>
<li>See full diff in <a
href="https://github.com/serde-rs/serde/compare/v1.0.218...v1.0.219">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.218&new-version=1.0.219)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 14:33:00 -07:00
dependabot[bot]
352021bc6f build(deps): bump tokio from 1.43.0 to 1.44.1 (#1723)
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.43.0 to 1.44.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/tokio/releases">tokio's
releases</a>.</em></p>
<blockquote>
<h2>Tokio v1.44.1</h2>
<h1>1.44.1 (March 13th, 2025)</h1>
<h3>Fixed</h3>
<ul>
<li>rt: skip defer queue in <code>block_in_place</code> context (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7216">#7216</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/tokio/issues/7216">#7216</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/7216">tokio-rs/tokio#7216</a></p>
<h2>Tokio v1.44.0</h2>
<h1>1.44.0 (March 7th, 2025)</h1>
<p>This release changes the <code>from_std</code> method on sockets to
panic if a blocking socket is provided. We determined this change is not
a breaking change as Tokio is not intended to operate using blocking
sockets. Doing so results in runtime hangs and should be considered a
bug. Accidentally passing a blocking socket to Tokio is one of the most
common user mistakes. If this change causes an issue for you, please
comment on <a
href="https://redirect.github.com/tokio-rs/tokio/issues/7172">#7172</a>.</p>
<h3>Added</h3>
<ul>
<li>coop: add <code>task::coop</code> module (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7116">#7116</a>)</li>
<li>process: add <code>Command::get_kill_on_drop()</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7086">#7086</a>)</li>
<li>sync: add <code>broadcast::Sender::closed</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/6685">#6685</a>,
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7090">#7090</a>)</li>
<li>sync: add <code>broadcast::WeakSender</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7100">#7100</a>)</li>
<li>sync: add <code>oneshot::Receiver::is_empty()</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7153">#7153</a>)</li>
<li>sync: add <code>oneshot::Receiver::is_terminated()</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7152">#7152</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>fs: empty reads on <code>File</code> should not start a background
read (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7139">#7139</a>)</li>
<li>process: calling <code>start_kill</code> on exited child should not
fail (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7160">#7160</a>)</li>
<li>signal: fix <code>CTRL_CLOSE</code>, <code>CTRL_LOGOFF</code>,
<code>CTRL_SHUTDOWN</code> on windows (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7122">#7122</a>)</li>
<li>sync: properly handle panic during mpsc drop (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7094">#7094</a>)</li>
</ul>
<h3>Changes</h3>
<ul>
<li>runtime: clean up magic number in registration set (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7112">#7112</a>)</li>
<li>coop: make coop yield using waker defer strategy (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7185">#7185</a>)</li>
<li>macros: make <code>select!</code> budget-aware (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7164">#7164</a>)</li>
<li>net: panic when passing a blocking socket to <code>from_std</code>
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7166">#7166</a>)</li>
<li>io: clean up buffer casts (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7142">#7142</a>)</li>
</ul>
<h3>Changes to unstable APIs</h3>
<ul>
<li>rt: add before and after task poll callbacks (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7120">#7120</a>)</li>
<li>tracing: make the task tracing API unstable public (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/6972">#6972</a>)</li>
</ul>
<h3>Documented</h3>
<ul>
<li>docs: fix nesting of sections in top-level docs (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7159">#7159</a>)</li>
<li>fs: rename symlink and hardlink parameter names (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7143">#7143</a>)</li>
<li>io: swap reader/writer in simplex doc test (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7176">#7176</a>)</li>
<li>macros: docs about <code>select!</code> alternatives (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7110">#7110</a>)</li>
<li>net: rename the argument for <code>send_to</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7146">#7146</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d413c9c02a"><code>d413c9c</code></a>
chore: prepare Tokio v1.44.1 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7217">#7217</a>)</li>
<li><a
href="addbfb9204"><code>addbfb9</code></a>
rt: skip defer queue in <code>block_in_place</code> context (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7216">#7216</a>)</li>
<li><a
href="8182ecf262"><code>8182ecf</code></a>
chore: prepare Tokio v1.44.0 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7202">#7202</a>)</li>
<li><a
href="a258bff701"><code>a258bff</code></a>
ci: enable printing in multi thread loom tests (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7200">#7200</a>)</li>
<li><a
href="e076d21f67"><code>e076d21</code></a>
process: clarify <code>Child::kill</code> behavior (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7162">#7162</a>)</li>
<li><a
href="042433cdcc"><code>042433c</code></a>
net: debug_assert on creating a tokio socket from a blocking one (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7166">#7166</a>)</li>
<li><a
href="0284d1b5c8"><code>0284d1b</code></a>
macros: make <code>select!</code> budget-aware (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7164">#7164</a>)</li>
<li><a
href="710bc8071e"><code>710bc80</code></a>
rt: coop should yield using waker defer strategy (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7185">#7185</a>)</li>
<li><a
href="a2b12bd579"><code>a2b12bd</code></a>
readme: adjust release schedule to once per month (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7191">#7191</a>)</li>
<li><a
href="e7b593cbee"><code>e7b593c</code></a>
process: fix grammar of the <code>ChildStdin</code> struct doc comment
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7192">#7192</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tokio-rs/tokio/compare/tokio-1.43.0...tokio-1.44.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.43.0&new-version=1.44.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 14:14:15 -07:00
dependabot[bot]
de394875e4 build(deps): bump clap from 4.5.31 to 4.5.32 (#1724)
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.31 to 4.5.32.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.5.32</h2>
<h2>[4.5.32] - 2025-03-10</h2>
<h3>Features</h3>
<ul>
<li>Add <code>Error::remove</code></li>
</ul>
<h3>Documentation</h3>
<ul>
<li><em>(cookbook)</em> Switch from <code>humantime</code> to
<code>jiff</code></li>
<li><em>(tutorial)</em> Better cover required vs optional</li>
</ul>
<h3>Internal</h3>
<ul>
<li>Update <code>pulldown-cmark</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.5.32] - 2025-03-10</h2>
<h3>Features</h3>
<ul>
<li>Add <code>Error::remove</code></li>
</ul>
<h3>Documentation</h3>
<ul>
<li><em>(cookbook)</em> Switch from <code>humantime</code> to
<code>jiff</code></li>
<li><em>(tutorial)</em> Better cover required vs optional</li>
</ul>
<h3>Internal</h3>
<ul>
<li>Update <code>pulldown-cmark</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81b9db2da0"><code>81b9db2</code></a>
chore: Release</li>
<li><a
href="d3d7a17e82"><code>d3d7a17</code></a>
chore: Merge branch 'master' into <code>upstream/master</code></li>
<li><a
href="361114ef0f"><code>361114e</code></a>
chore: Release</li>
<li><a
href="b693fc0fa3"><code>b693fc0</code></a>
docs: Update changelog</li>
<li><a
href="7100091a69"><code>7100091</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/5765">#5765</a>
from epage/complete</li>
<li><a
href="e90b2daf5e"><code>e90b2da</code></a>
refactor(complete): Pull our registration writing</li>
<li><a
href="95e99ef118"><code>95e99ef</code></a>
refactor(complete): Pull out shell lookup</li>
<li><a
href="4af0cd65f1"><code>4af0cd6</code></a>
fix(complete): Loosen requirements on Command factory</li>
<li><a
href="f40b37f1d8"><code>f40b37f</code></a>
chore: Release</li>
<li><a
href="63bfe1a532"><code>63bfe1a</code></a>
docs: Update changelog</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap/compare/v4.5.31...clap_complete-v4.5.32">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.31&new-version=4.5.32)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 14:13:39 -07:00
Josh McKinney
fe8577c070 chore: remove paste dependency (#1713)
The paste crate is no longer maintained. Replaces the usages of this in
the Stylize declarative macros with hard coded values. These macros are
internal implementation deatil to ratatui and so the changes should have
no impact on users.

Fixes: https://github.com/ratatui/ratatui/issues/1712
2025-03-09 08:56:06 -07:00
Orhun Parmaksız
34fec670d3 chore(changelog): remove changelog footer (#1711)
The footer makes some noise when used with `release-plz`.
2025-03-07 12:59:09 -08:00
Josh McKinney
255e4661a8 chore: cargo update - pull in fixed version of ring crate (#1710) 2025-03-06 17:38:10 -08:00
dependabot[bot]
e8eb4c36ee build(deps): bump indoc from 2.0.5 to 2.0.6 (#1709)
Bumps [indoc](https://github.com/dtolnay/indoc) from 2.0.5 to 2.0.6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/indoc/releases">indoc's
releases</a>.</em></p>
<blockquote>
<h2>2.0.6</h2>
<ul>
<li>Documentation improvements</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f5934e4a74"><code>f5934e4</code></a>
Release 2.0.6</li>
<li><a
href="382de61bc5"><code>382de61</code></a>
Point standard library links to stable</li>
<li><a
href="aed1b60b74"><code>aed1b60</code></a>
Unset doc-scrape-examples for lib target</li>
<li><a
href="3840e47a7a"><code>3840e47</code></a>
More precise gitignore patterns</li>
<li><a
href="8304a10e23"><code>8304a10</code></a>
Prevent upload-artifact step from causing CI failure</li>
<li><a
href="eac624b58b"><code>eac624b</code></a>
Work around needless_raw_string_hashes pedantic clippy lint in test</li>
<li><a
href="64949e1de5"><code>64949e1</code></a>
Resolve needless_lifetimes clippy lint</li>
<li><a
href="0d37b42929"><code>0d37b42</code></a>
Ignore needless_lifetimes clippy lint</li>
<li><a
href="78289e31d8"><code>78289e3</code></a>
Upload CI Cargo.lock for reproducing failures</li>
<li><a
href="9ee9ca95d4"><code>9ee9ca9</code></a>
Fill in ignore reasons in all #[ignore] attributes</li>
<li>Additional commits viewable in <a
href="https://github.com/dtolnay/indoc/compare/2.0.5...2.0.6">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=indoc&package-manager=cargo&previous-version=2.0.5&new-version=2.0.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-06 17:35:43 -08:00
dependabot[bot]
83774eecf0 build(deps): bump time from 0.3.37 to 0.3.39 (#1708)
Bumps [time](https://github.com/time-rs/time) from 0.3.37 to 0.3.39.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/time-rs/time/releases">time's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.39</h2>
<p>See the <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">changelog</a>
for details.</p>
<h2>v0.3.38</h2>
<p>See the <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">changelog</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/time-rs/time/blob/main/CHANGELOG.md">time's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.39 [2025-03-06]</h2>
<h3>Fixed</h3>
<ul>
<li>Doc tests run successfully with the default feature set.</li>
<li>wasm builds work again.</li>
</ul>
<p>Both of these were regressions in v0.3.38 and are now checked in
CI.</p>
<h2>0.3.38 [2025-03-05]</h2>
<h3>Added</h3>
<ul>
<li>
<p>The <code>[year]</code> component (in format descriptions) now
supports a <code>range</code> modifier, which can be
either <code>standard</code> or <code>extended</code>. The default is
<code>extended</code> for backwards compatibility. This is
intended as a manner to opt <em>out</em> of the extended range when the
<code>large-dates</code> feature is enabled.
When the <code>large-dates</code> feature is not enabled, the modifier
has no effect.</p>
</li>
<li>
<p><code>UtcDateTime</code>, which is semantically equivalent to an
<code>OffsetDateTime</code> with UTC as its offset. The
advantage is that it is the same size as a
<code>PrimitiveDateTime</code> and has improved operability with
well-known formats.</p>
<p>As part of this, there were some other additions:</p>
<ul>
<li><code>utc_datetime!</code> macro, which is similar to the
<code>datetime!</code> macro but constructs a
<code>UtcDateTime</code>.</li>
<li><code>PrimitiveDateTime::as_utc</code></li>
<li><code>OffsetDateTime::to_utc</code></li>
<li><code>OffsetDateTime::checked_to_utc</code></li>
</ul>
</li>
<li>
<p><code>time::serde::timestamp::milliseconds_i64</code>, which is a
module to serialize/deserialize timestamps
as the Unix timestamp. The pre-existing module does this as an
<code>i128</code> where an <code>i64</code> would
suffice. This new module should be preferred.</p>
</li>
</ul>
<h3>Changed</h3>
<ul>
<li><code>error::Format</code> has had its <code>source()</code>
implementation changed to no longer return a boxed value
from the <code>ComponentRange</code> variant. If you were explicitly
expecting this, you will need to update
your code. The method API remains unchanged.</li>
<li><code>[year repr:century]</code> supports single-digit values.</li>
<li>All <code>format_into</code> methods accept <code>?Sized</code>
references.</li>
</ul>
<h3>Miscellaneous</h3>
<ul>
<li>Some non-exhaustive enum variants that are no longer used have been
modified to be statically
proven as uninhabited. The relevant fields are doc-hidden and not
semver-guaranteed to remain as
such, though it is unlikely to change.</li>
<li>An unnecessary check when parsing RFC 2822 has been removed.</li>
<li>Various methods have had their implementations changed, resulting in
significant performance
gains. Among the methods changed are
<ul>
<li><code>util::is_leap_year</code></li>
<li><code>util::weeks_in_year</code></li>
<li><code>Month::length</code></li>
<li><code>Date::to_calendar_date</code></li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7949d2c2e8"><code>7949d2c</code></a>
v0.3.39 release</li>
<li><a
href="f51623b653"><code>f51623b</code></a>
Fix breakage from v0.3.38</li>
<li><a
href="1a31c0595b"><code>1a31c05</code></a>
v0.3.38 release</li>
<li><a
href="addf231ef5"><code>addf231</code></a>
Permit unsized writers for <code>format_into</code></li>
<li><a
href="338f84f545"><code>338f84f</code></a>
Allow clippy::ref_option lint for serde::format_description.</li>
<li><a
href="f8ecd81e8f"><code>f8ecd81</code></a>
feat: timestamp::milliseconds_i64 serializer</li>
<li><a
href="ce03bcab8f"><code>ce03bca</code></a>
Update Unicode license for cargo-audit</li>
<li><a
href="3d0b981381"><code>3d0b981</code></a>
Add parentheses for clarity</li>
<li><a
href="3096301eb3"><code>3096301</code></a>
Remove specific year from license</li>
<li><a
href="ec327a26db"><code>ec327a2</code></a>
Optimize Julian day calculations</li>
<li>Additional commits viewable in <a
href="https://github.com/time-rs/time/compare/v0.3.37...v0.3.39">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=time&package-manager=cargo&previous-version=0.3.37&new-version=0.3.39)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-06 17:35:39 -08:00
Orhun Parmaksız
4bd7c6dfa9 chore(changelog): skip placeholder commits in changelog (#1704) 2025-03-06 01:49:10 +03:00
Tayfun Bocek
92a19cb604 feat(list)!: highlight symbol styling (#1595)
Allow styling for `List`'s highlight symbol

This change makes it so anything that implements `Into<Line>` can be
used as a highlight symbol.

BREAKING CHANGE: `List::highlight_symbol` can no longer be used in const
context
BREAKING CHANGE: `List::highlight_symbol` accepted `&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

---------

Co-authored-by: Josh McKinney <joshka@users.noreply.github.com>
2025-03-04 14:26:59 -08:00
dependabot[bot]
5710b7a8d9 build(deps): bump rstest from 0.24.0 to 0.25.0 (#1695)
Bumps [rstest](https://github.com/la10736/rstest) from 0.24.0 to 0.25.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/la10736/rstest/releases">rstest's
releases</a>.</em></p>
<blockquote>
<h2>0.25.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Append generated test macro so next test macros are aware of it by
<a href="https://github.com/kezhuw"><code>@​kezhuw</code></a> in <a
href="https://redirect.github.com/la10736/rstest/pull/291">la10736/rstest#291</a></li>
<li>feat: add <code>include_str</code> and <code>include_bytes</code>
file input behaviour by <a
href="https://github.com/lucascool12"><code>@​lucascool12</code></a> in
<a
href="https://redirect.github.com/la10736/rstest/pull/297">la10736/rstest#297</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/kezhuw"><code>@​kezhuw</code></a> made
their first contribution in <a
href="https://redirect.github.com/la10736/rstest/pull/291">la10736/rstest#291</a></li>
<li><a
href="https://github.com/lucascool12"><code>@​lucascool12</code></a>
made their first contribution in <a
href="https://redirect.github.com/la10736/rstest/pull/297">la10736/rstest#297</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/la10736/rstest/compare/v0.24.0...v0.25.0">https://github.com/la10736/rstest/compare/v0.24.0...v0.25.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/la10736/rstest/blob/master/CHANGELOG.md">rstest's
changelog</a>.</em></p>
<blockquote>
<h2>[0.25.0] 2025/3/2</h2>
<h3>Changed</h3>
<ul>
<li>Append generated test macro so next test macros are aware of it
(see <a
href="https://redirect.github.com/la10736/rstest/pull/291">#291</a>
thanks to <a
href="https://github.com/kezhuw"><code>@​kezhuw</code></a>).</li>
</ul>
<h3>Add</h3>
<ul>
<li>Added a <code>#[mode = ...]</code> attribute to be used with the
<code>#[files(...)]</code> attribute to change the way
the files get passed to the test.
(see <a
href="https://redirect.github.com/la10736/rstest/issues/295">#295</a>
thanks to <a
href="https://github.com/lucascool12"><code>@​lucascool12</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8d80cea389"><code>8d80cea</code></a>
Prepare release</li>
<li><a
href="eb1f228eac"><code>eb1f228</code></a>
Make clippy happy</li>
<li><a
href="f570b0605b"><code>f570b06</code></a>
Avoid concurrent manifest changes in integration tests</li>
<li><a
href="8551eb8e29"><code>8551eb8</code></a>
feat: add <code>include_str</code> and <code>include_bytes</code> file
input behaviour</li>
<li><a
href="e0b735e9c2"><code>e0b735e</code></a>
Append generated test macro so next test macros are aware of it</li>
<li><a
href="154d0b0d3f"><code>154d0b0</code></a>
Prepare develop</li>
<li>See full diff in <a
href="https://github.com/la10736/rstest/compare/v0.24.0...v0.25.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rstest&package-manager=cargo&previous-version=0.24.0&new-version=0.25.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 12:38:06 -08:00
Josh McKinney
4eac5b2849 fix: make deprecation notes more helpful (#1702)
AI coding assistants use the deprecation notes to automatically suggest
fixes. This commit updates the deprecation notes to push those tools to
suggest the correct replacement methods and types.

Specifically, AI tools often suggest using `Buffer::get(x, y)`, because
of their training data where this was prevalent. When fixing these
deprecations, they often incorrectly suggest using `Buffer::get(x, y)`
instead of `Buffer[(x, y)]`.
2025-03-04 11:56:44 -08:00
Josh McKinney
2714d6b9c3 feat: add array and tuple RGB color conversion methods (#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::Rgb` instance. Any alpha value is ignored.

```rust
Color::from([255, 0, 0]);
Color::from((255, 0, 0));
Color::from([255, 0, 0, 255]);
Color::from((255, 0, 0, 255));
```
2025-03-04 11:52:54 -08:00
Orhun Parmaksız
0919c72f89 chore(changelog): bring back commit details (#1694)
see https://github.com/ratatui/ratatui/pull/1671#issuecomment-2692469384
2025-03-04 02:17:29 +03:00
dependabot[bot]
48dd4762ab build(deps): bump dawidd6/action-download-artifact from 8 to 9 (#1700)
Bumps
[dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
from 8 to 9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dawidd6/action-download-artifact/releases">dawidd6/action-download-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v9</h2>
<h2>What's Changed</h2>
<ul>
<li>add merge_multiple option by <a
href="https://github.com/timostroehlein"><code>@​timostroehlein</code></a>
in <a
href="https://redirect.github.com/dawidd6/action-download-artifact/pull/327">dawidd6/action-download-artifact#327</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/timostroehlein"><code>@​timostroehlein</code></a>
made their first contribution in <a
href="https://redirect.github.com/dawidd6/action-download-artifact/pull/327">dawidd6/action-download-artifact#327</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/dawidd6/action-download-artifact/compare/v8...v9">https://github.com/dawidd6/action-download-artifact/compare/v8...v9</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="07ab29fd4a"><code>07ab29f</code></a>
add merge_multiple option (<a
href="https://redirect.github.com/dawidd6/action-download-artifact/issues/327">#327</a>)</li>
<li>See full diff in <a
href="https://github.com/dawidd6/action-download-artifact/compare/v8...v9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dawidd6/action-download-artifact&package-manager=github_actions&previous-version=8&new-version=9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 01:42:44 +03:00
dependabot[bot]
1ca877da39 build(deps): bump bnjbvr/cargo-machete from 0.7.0 to 0.8.0 (#1699)
Bumps [bnjbvr/cargo-machete](https://github.com/bnjbvr/cargo-machete)
from 0.7.0 to 0.8.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bnjbvr/cargo-machete/releases">bnjbvr/cargo-machete's
releases</a>.</em></p>
<blockquote>
<h2>v0.8.0</h2>
<h2>What's Changed</h2>
<ul>
<li>readme: bump checkout action by <a
href="https://github.com/marcoieni"><code>@​marcoieni</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/142">bnjbvr/cargo-machete#142</a></li>
<li>chore: make clippy happy on nightly builds by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/146">bnjbvr/cargo-machete#146</a></li>
<li>Update cargo_toml to 0.21, making it compatible with the resolver=3
option (fixes <a
href="https://redirect.github.com/bnjbvr/cargo-machete/issues/144">#144</a>)
by <a href="https://github.com/AMDmi3"><code>@​AMDmi3</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/145">bnjbvr/cargo-machete#145</a></li>
<li>chore: bump dependencies by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/147">bnjbvr/cargo-machete#147</a></li>
<li>chore: test ignored directories correctly by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/149">bnjbvr/cargo-machete#149</a></li>
<li>fix: canonicalize relative paths when looking for the workspace
manifest by <a
href="https://github.com/bnjbvr"><code>@​bnjbvr</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/148">bnjbvr/cargo-machete#148</a></li>
<li>Build Docker image for both amd64 and arm64 by <a
href="https://github.com/popen2"><code>@​popen2</code></a> in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/151">bnjbvr/cargo-machete#151</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/marcoieni"><code>@​marcoieni</code></a>
made their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/142">bnjbvr/cargo-machete#142</a></li>
<li><a href="https://github.com/AMDmi3"><code>@​AMDmi3</code></a> made
their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/145">bnjbvr/cargo-machete#145</a></li>
<li><a href="https://github.com/popen2"><code>@​popen2</code></a> made
their first contribution in <a
href="https://redirect.github.com/bnjbvr/cargo-machete/pull/151">bnjbvr/cargo-machete#151</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bnjbvr/cargo-machete/compare/v0.7.0...v0.8.0">https://github.com/bnjbvr/cargo-machete/compare/v0.7.0...v0.8.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b54422fa33"><code>b54422f</code></a>
chore: release 0.8.0</li>
<li><a
href="8dcd31b5bc"><code>8dcd31b</code></a>
chore: run cargo fmt</li>
<li><a
href="27e694d196"><code>27e694d</code></a>
chore: bump dependencies</li>
<li><a
href="e80e988a28"><code>e80e988</code></a>
chore: bump to edition 2024</li>
<li><a
href="929a77bed5"><code>929a77b</code></a>
Build Docker image for both amd64 and arm64</li>
<li><a
href="d46205148b"><code>d462051</code></a>
fix: canonicalize a path before trying to find the workspace's
manifest</li>
<li><a
href="91fcd211a1"><code>91fcd21</code></a>
chore: better display errors when handling a given dependency</li>
<li><a
href="e550550db1"><code>e550550</code></a>
chore: test ignored directories correctly</li>
<li><a
href="83604af7f1"><code>83604af</code></a>
chore: bump dependencies</li>
<li><a
href="2ac2f4ce67"><code>2ac2f4c</code></a>
Update cargo_toml to 0.21 (fixes <a
href="https://redirect.github.com/bnjbvr/cargo-machete/issues/144">#144</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/bnjbvr/cargo-machete/compare/v0.7.0...v0.8.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bnjbvr/cargo-machete&package-manager=github_actions&previous-version=0.7.0&new-version=0.8.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 01:42:25 +03:00
dependabot[bot]
31b53c3e59 build(deps): bump bitflags from 2.8.0 to 2.9.0 (#1698)
Bumps [bitflags](https://github.com/bitflags/bitflags) from 2.8.0 to
2.9.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bitflags/bitflags/releases">bitflags's
releases</a>.</em></p>
<blockquote>
<h2>2.9.0</h2>
<h2>What's Changed</h2>
<ul>
<li><code>Flags</code> trait: add <code>clear(&amp;mut self)</code>
method by <a
href="https://github.com/wysiwys"><code>@​wysiwys</code></a> in <a
href="https://redirect.github.com/bitflags/bitflags/pull/437">bitflags/bitflags#437</a></li>
<li>Fix up UI tests by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/bitflags/bitflags/pull/438">bitflags/bitflags#438</a></li>
<li>Prepare for 2.9.0 release by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/bitflags/bitflags/pull/439">bitflags/bitflags#439</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bitflags/bitflags/compare/2.8.0...2.9.0">https://github.com/bitflags/bitflags/compare/2.8.0...2.9.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bitflags/bitflags/blob/main/CHANGELOG.md">bitflags's
changelog</a>.</em></p>
<blockquote>
<h1>2.9.0</h1>
<h2>What's Changed</h2>
<ul>
<li><code>Flags</code> trait: add <code>clear(&amp;mut self)</code>
method by <a
href="https://github.com/wysiwys"><code>@​wysiwys</code></a> in <a
href="https://redirect.github.com/bitflags/bitflags/pull/437">bitflags/bitflags#437</a></li>
<li>Fix up UI tests by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/bitflags/bitflags/pull/438">bitflags/bitflags#438</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/bitflags/bitflags/compare/2.8.0...2.9.0">https://github.com/bitflags/bitflags/compare/2.8.0...2.9.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e197bf5039"><code>e197bf5</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/439">#439</a>
from KodrAus/cargo/2.9.0</li>
<li><a
href="8df6e80770"><code>8df6e80</code></a>
prepare for 2.9.0 release</li>
<li><a
href="e92f0ae4b6"><code>e92f0ae</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/438">#438</a>
from KodrAus/fix/ui-tests</li>
<li><a
href="226ff75b99"><code>226ff75</code></a>
fix up UI tests</li>
<li><a
href="2170a26558"><code>2170a26</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/437">#437</a>
from wysiwys/wysiwys/add-clear-method</li>
<li><a
href="76dde58498"><code>76dde58</code></a>
add tests for <code>clear()</code> trait method</li>
<li><a
href="ce5d4207bb"><code>ce5d420</code></a>
add <code>clear()</code> method to trait</li>
<li><a
href="9e45d36e0a"><code>9e45d36</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/434">#434</a>
from bitflags/KodrAus-patch-1</li>
<li><a
href="617645aa45"><code>617645a</code></a>
pin checkout action for miri job</li>
<li><a
href="2c836f230d"><code>2c836f2</code></a>
Merge pull request <a
href="https://redirect.github.com/bitflags/bitflags/issues/433">#433</a>
from bitflags/ci/remove-scorecard</li>
<li>Additional commits viewable in <a
href="https://github.com/bitflags/bitflags/compare/2.8.0...2.9.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bitflags&package-manager=cargo&previous-version=2.8.0&new-version=2.9.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 01:42:07 +03:00
dependabot[bot]
a8be13c9c7 build(deps): bump serde_json from 1.0.139 to 1.0.140 (#1697)
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.139 to
1.0.140.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/serde-rs/json/releases">serde_json's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.140</h2>
<ul>
<li>Documentation improvements</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="762783414e"><code>7627834</code></a>
Release 1.0.140</li>
<li><a
href="d77a498c80"><code>d77a498</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/json/issues/1245">#1245</a>
from serde-rs/powerpc</li>
<li><a
href="b34d317089"><code>b34d317</code></a>
Delete unused gcc installation</li>
<li><a
href="f7200c3cf6"><code>f7200c3</code></a>
Ignore unbuffered_bytes clippy lint</li>
<li><a
href="76cd4fb383"><code>76cd4fb</code></a>
Ignore elidable_lifetime_names pedantic clippy lint</li>
<li><a
href="400eaa977f"><code>400eaa9</code></a>
Point standard library links to stable</li>
<li>See full diff in <a
href="https://github.com/serde-rs/json/compare/v1.0.139...v1.0.140">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.139&new-version=1.0.140)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 01:41:49 +03:00
dependabot[bot]
9c7f10d2d0 build(deps): bump cargo_metadata from 0.19.1 to 0.19.2 (#1696)
Bumps [cargo_metadata](https://github.com/oli-obk/cargo_metadata) from
0.19.1 to 0.19.2.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0b4be024c5"><code>0b4be02</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/285">#285</a>
from fenhl/version-bump</li>
<li><a
href="8196734cb7"><code>8196734</code></a>
Version bump</li>
<li><a
href="0056e020b8"><code>0056e02</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/284">#284</a>
from HTGAzureX1212/edition-2024-stable</li>
<li><a
href="e3e9cd3bc6"><code>e3e9cd3</code></a>
feat: <code>2024</code> edition stabilized</li>
<li><a
href="806a3ea482"><code>806a3ea</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/282">#282</a>
from foresterre/workspace-default-members</li>
<li><a
href="cdf42230d4"><code>cdf4223</code></a>
Add methods is_available and is_missing to WorkspaceDefaultMembers</li>
<li><a
href="d6b186c26f"><code>d6b186c</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/280">#280</a>
from paolobarbolini/z-minimal-versions</li>
<li><a
href="59f0651fb3"><code>59f0651</code></a>
build: fix -Zminimal-versions</li>
<li><a
href="9d84a017c8"><code>9d84a01</code></a>
Merge pull request <a
href="https://redirect.github.com/oli-obk/cargo_metadata/issues/266">#266</a>
from os-checker/workspace_default_members-serde-default</li>
<li><a
href="45ceca0262"><code>45ceca0</code></a>
clippy: fix first doc comment paragraph is too long</li>
<li>Additional commits viewable in <a
href="https://github.com/oli-obk/cargo_metadata/compare/0.19.1...0.19.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cargo_metadata&package-manager=cargo&previous-version=0.19.1&new-version=0.19.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 01:41:35 +03:00
261 changed files with 17240 additions and 5685 deletions

81
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,81 @@
# GitHub Copilot Code Review Instructions
## General Review Principles
### Pull Request Size and Scope
- **Flag large PRs**: Comment if a PR changes more than 500 lines or touches many unrelated areas
- **Suggest splitting**: Recommend breaking large changes into smaller, focused PRs
- **Question scope creep**: Ask about unrelated changes that seem outside the PR's stated purpose
### Code Quality and Style
- **Check adherence to style guidelines**: Verify changes follow the project's Rust conventions in [CONTRIBUTING.md](https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md#code-formatting)
- **Verify xtask compliance**: Ensure `cargo xtask format` and `cargo xtask lint` would pass
- **Look for AI-generated patterns**: Be suspicious of verbose, overly-commented, or non-idiomatic code
### Architectural Considerations
- **Reference ARCHITECTURE.md**: Point to [ARCHITECTURE.md](https://github.com/ratatui/ratatui/blob/main/ARCHITECTURE.md) for changes affecting crate boundaries
- **Question fundamental changes**: Flag modifications to core configuration, linting rules, or build setup without clear justification
- **Verify appropriate crate placement**: Ensure changes are in the correct crate per the modular structure
### Breaking Changes and Deprecation
- **Require deprecation**: Insist on deprecation warnings rather than immediate removal of public APIs
- **Ask for migration path**: Request clear upgrade instructions for breaking changes
- **Suggest feature flags**: Recommend feature flags for experimental or potentially disruptive changes
- **Reference versioning policy**: Point to the requirement of at least one version notice before removal
### Testing and Documentation
- **Verify test coverage**: Ensure new functionality includes appropriate tests
- **Check for test removal**: Question any removal of existing tests without clear justification
- **Require documentation**: Ensure public APIs are documented with examples
- **Validate examples**: Check that code examples are minimal and follow project style
### Specific Areas of Concern
#### Configuration Changes
- **Lint configuration**: Question changes to `.clippy.toml`, `rustfmt.toml`, or CI configuration
- **Cargo.toml modifications**: Scrutinize dependency changes or workspace modifications
- **Build system changes**: Require justification for xtask or build process modifications
#### Large Code Additions
- **Question necessity**: Ask if large code additions could be implemented more simply
- **Check for duplication**: Look for code that duplicates existing functionality
- **Verify integration**: Ensure new code integrates well with existing patterns
#### File Organization
- **Validate module structure**: Ensure new modules follow the project's organization
- **Check import organization**: Verify imports follow the std/external/local grouping pattern
- **Review file placement**: Confirm files are in appropriate locations per ARCHITECTURE.md
## Comment Templates
### For Large PRs
```
This PR seems quite large with changes across multiple areas. Consider splitting it into smaller, focused PRs:
- Core functionality changes
- Documentation updates
- Test additions
- Configuration changes
See our [contribution guidelines](https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md#keep-prs-small-intentional-and-focused) for more details.
```
### For Breaking Changes
```
This appears to introduce breaking changes. Please consider:
- Adding deprecation warnings instead of immediate removal
- Providing a clear migration path in the PR description
- Following our [deprecation policy](https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md#deprecation-notice)
```
### For Configuration Changes
```
Changes to project configuration (linting, formatting, build) should be discussed first. Please explain:
- Why this change is necessary
- What problem it solves
- Whether it affects contributor workflow
```
### For Style Issues
```
Please run `cargo xtask format` and `cargo xtask lint` to ensure code follows our style guidelines. See [CONTRIBUTING.md](https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md#code-formatting) for details.
```

View File

@@ -1,25 +0,0 @@
name: Run Benchmarks
on:
push:
branches:
- main
jobs:
benchmark_base_branch:
name: Continuous Benchmarking with Bencher
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: bencherdev/bencher@main
- name: Track base branch benchmarks with Bencher
run: |
bencher run \
--project ratatui-org \
--token '${{ secrets.BENCHER_API_TOKEN }}' \
--branch main \
--testbed ubuntu-latest \
--adapter rust_criterion \
--err \
cargo bench

View File

@@ -1,25 +0,0 @@
name: Run and Cache Benchmarks
on:
pull_request:
types: [opened, reopened, edited, synchronize]
jobs:
benchmark_fork_pr_branch:
name: Run Fork PR Benchmarks
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Run Benchmarks
run: cargo bench > benchmark_results.txt
- name: Upload Benchmark Results
uses: actions/upload-artifact@v4
with:
name: benchmark_results.txt
path: ./benchmark_results.txt
- name: Upload GitHub Pull Request Event
uses: actions/upload-artifact@v4
with:
name: event.json
path: ${{ github.event_path }}

View File

@@ -1,56 +0,0 @@
name: Track Benchmarks with Bencher
on:
workflow_run:
workflows: [Run and Cache Benchmarks]
types: [completed]
permissions:
contents: read
pull-requests: write
jobs:
track_fork_pr_branch:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
env:
BENCHMARK_RESULTS: benchmark_results.txt
PR_EVENT: event.json
steps:
- name: Download Benchmark Results
uses: dawidd6/action-download-artifact@v8
with:
name: ${{ env.BENCHMARK_RESULTS }}
run_id: ${{ github.event.workflow_run.id }}
- name: Download PR Event
uses: dawidd6/action-download-artifact@v8
with:
name: ${{ env.PR_EVENT }}
run_id: ${{ github.event.workflow_run.id }}
- name: Export PR Event Data
uses: actions/github-script@v7
with:
script: |
let fs = require('fs');
let prEvent = JSON.parse(fs.readFileSync(process.env.PR_EVENT, {encoding: 'utf8'}));
core.exportVariable("PR_HEAD", prEvent.pull_request.head.ref);
core.exportVariable("PR_BASE", prEvent.pull_request.base.ref);
core.exportVariable("PR_BASE_SHA", prEvent.pull_request.base.sha);
core.exportVariable("PR_NUMBER", prEvent.number);
- uses: bencherdev/bencher@main
- name: Track Benchmarks with Bencher
run: |
bencher run \
--project ratatui-org \
--token '${{ secrets.BENCHER_API_TOKEN }}' \
--branch "$PR_HEAD" \
--start-point "$PR_BASE" \
--start-point-hash "$PR_BASE_SHA" \
--start-point-clone-thresholds \
--start-point-reset \
--testbed ubuntu-latest \
--adapter rust_criterion \
--err \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
--ci-number "$PR_NUMBER" \
--file "$BENCHMARK_RESULTS"

View File

@@ -1,52 +0,0 @@
#!/bin/bash
# Exit on error. Append "|| true" if you expect an error.
set -o errexit
# Exit on error inside any functions or subshells.
set -o errtrace
# Do not allow use of undefined vars. Use ${VAR:-} to use an undefined VAR
set -o nounset
# Catch the error in case mysqldump fails (but gzip succeeds) in `mysqldump |gzip`
set -o pipefail
# Turn on traces, useful while debugging but commented out by default
# set -o xtrace
last_release="$(git tag --sort=committerdate | grep -P "v0+\.\d+\.\d+$" | tail -1)"
echo "🐭 Last release: ${last_release}"
# detect breaking changes
if [ -n "$(git log --oneline ${last_release}..HEAD | grep '!:')" ]; then
echo "🐭 Breaking changes detected since ${last_release}"
git log --oneline ${last_release}..HEAD | grep '!:'
# increment the minor version
minor="${last_release##v0.}"
minor="${minor%.*}"
next_minor="$((minor + 1))"
next_release="v0.${next_minor}.0"
else
# increment the patch version
patch="${last_release##*.}"
next_patch="$((patch + 1))"
next_release="${last_release/%${patch}/${next_patch}}"
fi
echo "🐭 Next release: ${next_release}"
suffix="alpha"
last_tag="$(git tag --sort=committerdate | tail -1)"
if [[ "${last_tag}" = "${next_release}-${suffix}"* ]]; then
echo "🐭 Last alpha release: ${last_tag}"
# increment the alpha version
# e.g. v0.22.1-alpha.12 -> v0.22.1-alpha.13
alpha="${last_tag##*-${suffix}.}"
next_alpha="$((alpha + 1))"
next_tag="${last_tag/%${alpha}/${next_alpha}}"
else
# increment the patch and start the alpha version from 0
# e.g. v0.22.0 -> v0.22.1-alpha.0
next_tag="${next_release}-${suffix}.0"
fi
# update the crate version
msg="# crate version"
sed -E -i "s/^version = .* ${msg}$/version = \"${next_tag#v}\" ${msg}/" Cargo.toml
echo "NEXT_TAG=${next_tag}" >> $GITHUB_ENV
echo "🐭 Next alpha release: ${next_tag}"

View File

@@ -1,6 +1,13 @@
name: Check Pull Requests
# Set the permissions of the github token to the minimum and only enable what is needed
# See https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions
permissions: {}
on:
# this workflow is required to be run on pull_request_target as it modifies the PR comments
# care should be taken that the jobs do not run any untrusted input
# zizmor: ignore[dangerous-triggers]
pull_request_target:
types:
- opened
@@ -8,23 +15,21 @@ on:
- synchronize
- labeled
- unlabeled
merge_group:
permissions:
pull-requests: write
jobs:
check-title:
permissions:
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: Check PR title
if: github.event_name == 'pull_request_target'
uses: amannn/action-semantic-pull-request@v5
uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v5
id: check_pr_title
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Add comment indicating we require pull request titles to follow conventional commits specification
- uses: marocchino/sticky-pull-request-comment@v2
- uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2
if: always() && (steps.check_pr_title.outputs.error_message != null)
with:
header: pr-title-lint-error
@@ -39,40 +44,42 @@ jobs:
# Delete a previous comment when the issue has been resolved
- if: ${{ steps.check_pr_title.outputs.error_message == null }}
uses: marocchino/sticky-pull-request-comment@v2
uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2
with:
header: pr-title-lint-error
delete: true
check-breaking-change-label:
permissions:
pull-requests: write
runs-on: ubuntu-latest
env:
# use an environment variable to pass untrusted input to the script
# see https://securitylab.github.com/research/github-actions-untrusted-input/
PR_TITLE: ${{ github.event.pull_request.title }}
steps:
- name: Check breaking change label
id: check_breaking_change
run: |
pattern='^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\(\w+\))?!:'
# Check if pattern matches
if echo "${PR_TITLE}" | grep -qE "$pattern"; then
echo "breaking_change=true" >> $GITHUB_OUTPUT
else
echo "breaking_change=false" >> $GITHUB_OUTPUT
fi
- name: Add label
if: steps.check_breaking_change.outputs.breaking_change == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['Type: Breaking Change']
})
- name: Check breaking change label
id: check_breaking_change
run: |
pattern='^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\(\w+\))?!:'
# Check if pattern matches
if echo "${PR_TITLE}" | grep -qE "$pattern"; then
echo "breaking_change=true" >> $GITHUB_OUTPUT
else
echo "breaking_change=false" >> $GITHUB_OUTPUT
fi
- name: Add label
if: steps.check_breaking_change.outputs.breaking_change == 'true'
uses: actions/github-script@v8
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['Type: Breaking Change']
})
do-not-merge:
if: ${{ contains(github.event.*.labels.*.name, 'do not merge') }}

View File

@@ -1,5 +1,9 @@
name: Check Semver
# Set the permissions of the github token to the minimum and only enable what is needed
# See https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions
permissions: {}
on:
pull_request:
branches:
@@ -11,6 +15,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v4
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Check semver
uses: obi1kenobi/cargo-semver-checks-action@v2
uses: obi1kenobi/cargo-semver-checks-action@5b298c9520f7096a4683c0bd981a7ac5a7e249ae # v2

View File

@@ -1,5 +1,9 @@
name: Continuous Integration
# Set the permissions of the github token to the minimum and only enable what is needed
# See https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions
permissions: {}
on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
@@ -25,11 +29,15 @@ jobs:
name: Check Formatting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
with: { components: rustfmt }
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: nightly
components: rustfmt
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: taplo-cli
- run: cargo xtask format --check
@@ -40,8 +48,10 @@ jobs:
name: Check Typos
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crate-ci/typos@master
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: crate-ci/typos@85f62a8a84f939ae994ab3763f01a0296d61a7ee # master
# Check for any disallowed dependencies in the codebase due to license / security issues.
# See <https://github.com/EmbarkStudios/cargo-deny>
@@ -49,9 +59,15 @@ jobs:
name: Check Dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@cargo-deny
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-deny
- run: cargo deny --log-level info --all-features check
# Check for any unused dependencies in the codebase.
@@ -60,18 +76,33 @@ jobs:
name: Check Unused Dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: bnjbvr/cargo-machete@v0.7.0
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: bnjbvr/cargo-machete@7959c845782fed02ee69303126d4a12d64f1db18 # v0.9.1
# Run cargo clippy.
#
# We check for clippy warnings on beta, but these are not hard failures. They should often be
# fixed to prevent clippy failing on the next stable release, but don't block PRs on them unless
# they are introduced by the PR.
lint-clippy:
name: Check Clippy
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain: ["stable", "beta"]
continue-on-error: ${{ matrix.toolchain == 'beta' }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with: { components: clippy }
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: ${{ matrix.toolchain }}
components: clippy
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask clippy
# Run markdownlint on all markdown files in the repository.
@@ -79,8 +110,10 @@ jobs:
name: Check Markdown
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DavidAnson/markdownlint-cli2-action@v19
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: DavidAnson/markdownlint-cli2-action@992badcdf24e3b8eb7e87ff9287fe931bcb00c6e # v20
with:
globs: |
'**/*.md'
@@ -92,14 +125,19 @@ jobs:
name: Coverage Report
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
components: llvm-tools
- uses: taiki-e/install-action@cargo-llvm-cov
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-llvm-cov
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask coverage
- uses: codecov/codecov-action@v5
- uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
@@ -111,24 +149,55 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
toolchain: ["1.74.0", "stable"]
toolchain: ["1.85.0", "stable"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: ${{ matrix.toolchain }}
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-hack
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask check --all-features
build-no-std:
name: Build No-Std
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
targets: x86_64-unknown-none
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
# This makes it easier to debug the exact versions of the dependencies
- run: cargo tree --target x86_64-unknown-none -p ratatui-core
- run: cargo tree --target x86_64-unknown-none -p ratatui-widgets
- run: cargo tree --target x86_64-unknown-none -p ratatui-macros
- run: cargo tree --target x86_64-unknown-none -p ratatui --no-default-features
- run: cargo build --target x86_64-unknown-none -p ratatui-core
- run: cargo build --target x86_64-unknown-none -p ratatui-widgets
- run: cargo build --target x86_64-unknown-none -p ratatui-macros
- run: cargo build --target x86_64-unknown-none -p ratatui --no-default-features
# Check if README.md is up-to-date with the crate's documentation.
check-readme:
name: Check README
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@cargo-rdme
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-rdme
- run: cargo xtask readme --check
# Run cargo rustdoc with the same options that would be used by docs.rs, taking into account the
@@ -139,10 +208,19 @@ jobs:
env:
RUSTDOCFLAGS: -Dwarnings
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: dtolnay/install@cargo-docs-rs
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: nightly
- uses: dtolnay/install@74f735cdf643820234e37ae1c4089a08fd266d8a # master
with:
crate: cargo-docs-rs
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-hack
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask docs
# Run cargo test on the documentation of the crate. This will catch any code examples that don't
@@ -151,9 +229,16 @@ jobs:
name: Test Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-hack
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask test-docs
# Run cargo test on the libraries of the crate.
@@ -163,11 +248,18 @@ jobs:
strategy:
fail-fast: false
matrix:
toolchain: ["1.74.0", "stable"]
toolchain: ["1.85.0", "stable"]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- uses: taiki-e/install-action@4575ae687efd0e2c78240087f26013fb2484987f # v2
with:
tool: cargo-hack
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask test-libs
# Run cargo test on all the backends.
@@ -184,7 +276,11 @@ jobs:
- os: windows-latest
backend: termion
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2
- run: cargo xtask test-backend ${{ matrix.backend }}

View File

@@ -1,48 +0,0 @@
name: Release alpha version
on:
workflow_dispatch:
schedule:
# At 00:00 on Saturday
# https://crontab.guru/#0_0_*_*_6
- cron: "0 0 * * 6"
defaults:
run:
shell: bash
jobs:
publish-alpha:
name: Create an alpha release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout the repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Calculate the next release
run: .github/workflows/calculate-alpha-release.bash
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Publish
run: cargo publish --allow-dirty --token ${{ secrets.CARGO_TOKEN }}
- name: Generate a changelog
uses: orhun/git-cliff-action@v4
with:
config: cliff.toml
args: --unreleased --tag ${{ env.NEXT_TAG }} --strip header
env:
OUTPUT: BODY.md
- name: Publish on GitHub
uses: ncipollo/release-action@v1
with:
tag: ${{ env.NEXT_TAG }}
prerelease: true
bodyFile: BODY.md

View File

@@ -1,8 +1,8 @@
name: Release-plz
permissions:
pull-requests: write
contents: write
# Set the permissions of the github token to the minimum and only enable what is needed
# See https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions
permissions: {}
on:
push:
@@ -14,38 +14,55 @@ jobs:
# Release unpublished packages.
release-plz-release:
name: Release-plz release
environment: release
permissions:
pull-requests: write
contents: write
id-token: write
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'ratatui' }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
fetch-depth: 0
persist-credentials: false
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- uses: rust-lang/crates-io-auth-action@e919bc7605cde86df457cf5b93c5e103838bd879 # v1
id: auth
- name: Run release-plz
uses: release-plz/action@v0.5
uses: release-plz/action@acb9246af4d59a270d1d4058a8b9af8c3f3a2559 # v0.5
with:
command: release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_TOKEN }}
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
# Create a PR with the new versions and changelog, preparing the next release.
release-plz-pr:
name: Release-plz PR
permissions:
pull-requests: write
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'ratatui' }}
concurrency:
group: release-plz-${{ github.ref }}
cancel-in-progress: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
fetch-depth: 0
persist-credentials: false
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- name: Run release-plz
uses: release-plz/action@v0.5
uses: release-plz/action@acb9246af4d59a270d1d4058a8b9af8c3f3a2559 # v0.5
with:
command: release-pr
env:

View File

@@ -1,45 +0,0 @@
name: Release stable version
on:
push:
tags:
- "v*.*.*"
jobs:
publish-stable:
name: Create an stable release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout the repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate a changelog
uses: orhun/git-cliff-action@v4
with:
config: cliff.toml
args: --latest --strip header
env:
OUTPUT: BODY.md
- name: Publish on GitHub
uses: ncipollo/release-action@v1
with:
prerelease: false
bodyFile: BODY.md
publish-crate:
name: Publish crate
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v4
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Publish
run: cargo publish --token ${{ secrets.CARGO_TOKEN }}

35
.github/workflows/vhs-test.yml vendored Normal file
View File

@@ -0,0 +1,35 @@
name: vhs
on:
push:
branches:
- vhs-test
jobs:
vhs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@6d653acede28d24f02e3cd41383119e8b1b35921 # master
with:
toolchain: stable
- uses: FedericoCarboni/setup-ffmpeg@v3
id: setup-ffmpeg
- uses: actions/setup-go@v6
with:
go-version: "^1.13.1" # The Go version to download (if necessary) and use.
- run: |
cargo build -p demo2
sudo apt update
sudo apt install -y ffmpeg ttyd
go install github.com/charmbracelet/vhs@latest
vhs ./examples/vhs/demo2.tape
- name: Upload GIF artifact
uses: actions/upload-artifact@v4
with:
name: demo2-gif
path: ./target/demo2.gif

26
.github/workflows/zizmor.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: GitHub Actions Security Analysis with zizmor 🌈
# docs https://docs.zizmor.sh/integrations/#github-actions
on:
push:
branches: ["main"]
pull_request:
branches: ["**"]
permissions: {}
jobs:
zizmor:
name: Run zizmor 🌈
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@e673c3917a1aef3c65c972347ed84ccd013ecda4 # v0.2.0

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ target
*.rs.rustfmt
.gdb_history
.idea/
.env

203
ARCHITECTURE.md Normal file
View File

@@ -0,0 +1,203 @@
# Ratatui Architecture
This document provides a comprehensive overview of Ratatui's architecture and crate
organization, introduced in version 0.30.0.
## Overview
Starting with Ratatui 0.30.0, the project was reorganized from a single monolithic crate into
a modular workspace consisting of multiple specialized crates. This architectural decision was
made to improve modularity, reduce compilation times, enable more flexible dependency
management, and provide better API stability for third-party widget libraries.
## Crate Organization
The Ratatui project is now organized as a Cargo workspace containing the following crates:
### Core Crates
#### `ratatui` (Main Crate)
- **Purpose**: The main entry point that most applications should use
- **Contents**: Re-exports everything from other crates for convenience, plus experimental features
- **Target Users**: Application developers building terminal UIs
- **Key Features**:
- Complete widget ecosystem
- Backend implementations
- Layout system
- Terminal management
- Experimental `WidgetRef` and `StatefulWidgetRef` traits
#### `ratatui-core`
- **Purpose**: Foundational types and traits for the Ratatui ecosystem
- **Contents**: Core widget traits, text types, buffer, layout, style, and symbols
- **Target Users**: Widget library authors, minimalist projects
- **Key Features**:
- `Widget` and `StatefulWidget` traits
- Text rendering (`Text`, `Line`, `Span`)
- Buffer management
- Layout system
- Style and color definitions
- Symbol collections
#### `ratatui-widgets`
- **Purpose**: Built-in widget implementations
- **Contents**: All standard widgets like `Block`, `Paragraph`, `List`, `Chart`, etc.
- **Target Users**: Applications needing standard widgets, widget library authors
- **Key Features**:
- Complete set of built-in widgets
- Optimized implementations
- Comprehensive documentation and examples
### Backend Crates
#### `ratatui-crossterm`
- **Purpose**: Crossterm backend implementation
- **Contents**: Cross-platform terminal backend using the `crossterm` crate
- **Target Users**: Applications targeting multiple platforms
#### `ratatui-termion`
- **Purpose**: Termion backend implementation
- **Contents**: Unix-specific terminal backend using the `termion` crate
- **Target Users**: Unix-specific applications requiring low-level control
#### `ratatui-termwiz`
- **Purpose**: Termwiz backend implementation
- **Contents**: Terminal backend using the `termwiz` crate
- **Target Users**: Applications needing advanced terminal features
### Utility Crates
#### `ratatui-macros`
- **Purpose**: Declarative macros for common patterns and boilerplate reduction
- **Contents**: Macros for common patterns and boilerplate reduction
- **Target Users**: Applications and libraries wanting macro support
## Dependency Relationships
```text
ratatui
├── ratatui-core
├── ratatui-widgets → ratatui-core
├── ratatui-crossterm → ratatui-core
├── ratatui-termion → ratatui-core
├── ratatui-termwiz → ratatui-core
└── ratatui-macros
```
### Key Dependencies
- **ratatui-core**: Foundation for all other crates
- **ratatui-widgets**: Depends on `ratatui-core` for widget traits and types
- **Backend crates**: Each depends on `ratatui-core` for backend traits and types
- **ratatui**: Depends on all other crates and re-exports their public APIs
## Design Principles
### Stability and Compatibility
The modular architecture provides different levels of API stability:
- **ratatui-core**: Designed for maximum stability to minimize breaking changes for widget
libraries
- **ratatui-widgets**: Focused on widget implementations with moderate stability requirements
- **Backend crates**: Isolated from core changes, allowing backend-specific updates
- **ratatui**: Main crate that can evolve more freely while maintaining backward compatibility
through re-exports
### Compilation Performance
The split architecture enables:
- **Reduced compilation times**: Widget libraries only need to compile core types
- **Parallel compilation**: Different crates can be compiled in parallel
- **Selective compilation**: Applications can exclude unused backends or widgets
### Ecosystem Benefits
- **Widget Library Authors**: Can depend on stable `ratatui-core` without frequent updates
- **Application Developers**: Can use the convenient `ratatui` crate with everything included
- **Minimalist Projects**: Can use only `ratatui-core` for lightweight applications
## Migration Guide
### For Application Developers
Most applications should continue using the main `ratatui` crate with minimal changes:
```rust
// No changes needed - everything is re-exported
use ratatui::{
widgets::{Block, Paragraph},
layout::{Layout, Constraint},
Terminal,
};
```
### For Widget Library Authors
Consider migrating to `ratatui-core` for better stability:
```rust
// Before (0.29.x and earlier)
use ratatui::{
widgets::{Widget, StatefulWidget},
buffer::Buffer,
layout::Rect,
};
// After (0.30.0+)
use ratatui_core::{
widgets::{Widget, StatefulWidget},
buffer::Buffer,
layout::Rect,
};
```
### Backwards Compatibility
All existing code using the `ratatui` crate will continue to work unchanged, as the main crate
re-exports all public APIs from the specialized crates.
## Future Considerations
### Potential Enhancements
- **Widget-specific crates**: Further split widgets into individual crates for even more
granular dependencies
- **Plugin system**: Enable dynamic widget loading and third-party widget ecosystems
- **Feature flags**: More granular feature flags for compile-time customization
### Version Synchronization
Currently, all crates are versioned together for simplicity. Future versions may adopt
independent versioning once the API stabilizes further.
## Related Issues and PRs
This architecture was developed through extensive discussion and implementation across multiple
PRs:
- [Issue #1388](https://github.com/ratatui/ratatui/issues/1388): Original RFC for modularization
- [PR #1459](https://github.com/ratatui/ratatui/pull/1459): Move ratatui crate into workspace
folder
- [PR #1460](https://github.com/ratatui/ratatui/pull/1460): Move core types to ratatui-core
- [PR #1474](https://github.com/ratatui/ratatui/pull/1474): Move widgets into ratatui-widgets
crate
## Contributing
When contributing to the Ratatui project, please consider:
- **Core changes**: Submit PRs against `ratatui-core` for fundamental improvements
- **Widget changes**: Submit PRs against `ratatui-widgets` for widget-specific improvements
- **Backend changes**: Submit PRs against the appropriate backend crate
- **Integration changes**: Submit PRs against the main `ratatui` crate
See the [CONTRIBUTING.md](CONTRIBUTING.md) guide for more details on the contribution process.

View File

@@ -10,11 +10,26 @@ GitHub with a [breaking change] label.
This is a quick summary of the sections below:
- [Unreleased](#unreleased)
- [v0.30.0 Unreleased](#v0300-unreleased)
- `Flex::SpaceAround` now mirrors flexbox: space between items is twice the size of the outer gaps
are twice the size of first and last elements
- `block::Title` no longer exists
- The `From` impls for backend types are now replaced with more specific traits
- `FrameExt` trait for `unstable-widget-ref` feature
- `List::highlight_symbol` now accepts `Into<Line>` instead of `&str`
- 'layout::Alignment' is renamed to 'layout::HorizontalAlignment'
- The MSRV is now 1.85.0
- `Backend` now requires an associated `Error` type and `clear_region` method
- `TestBackend` now uses `core::convert::Infallible` for error handling instead of `std::io::Error`
- Disabling `default-features` will now disable layout cache, which can have a negative impact on performance
- `Layout::init_cache` and `Layout::DEFAULT_CACHE_SIZE` are now only available if `layout-cache`
feature is enabled
- Disabling `default-features` suppresses the error message if `show_cursor()` fails when dropping
`Terminal`
- Support a broader range for `unicode-width` version
- [v0.29.0](#v0290)
- `Sparkline::data` takes `IntoIterator<Item = SparklineBar>` instead of `&[u64]` and is no longer const
- `Sparkline::data` takes `IntoIterator<Item = SparklineBar>` instead of `&[u64]` and is no longer
const
- Removed public fields from `Rect` iterators
- `Line` now implements `From<Cow<str>`
- `Table::highlight_style` is now `Table::row_highlight_style`
@@ -75,7 +90,183 @@ This is a quick summary of the sections below:
- MSRV is now 1.63.0
- `List` no longer ignores empty strings
## Unreleased (0.30.0)
## v0.30.0 Unreleased
### `Flex::SpaceAround` now mirrors flexbox: space between items is twice the size of the outer gaps ([#1952])
[#1952]: https://github.com/ratatui/ratatui/pull/1952
The old `Flex::SpaceAround` behavior has been changed to distribute space evenly around each
element, with the middle spacers being twice the size of the first and last one. The old
behavior can be achieved by using `Flex::SpaceEvenly` instead.
```diff
- let rects = Layout::horizontal([Length(1), Length(2)]).flex(Flex::SpaceAround).split(area);
+ let rects = Layout::horizontal([Length(1), Length(2)]).flex(Flex::SpaceEvenly).split(area);
```
### `block::Title` no longer exists ([#1926])
[#1926]: https://github.com/ratatui/ratatui/pull/1926
The title alignment is better expressed in the `Line` as this fits more coherently with the rest of
the library.
- `widgets::block` is no longer exported
- `widgets::block::Title` no longer exists
- `widgets::block::Position` is now `widgets::TitlePosition`
- `Block::title()` now accepts `Into::<Line>` instead of `Into<Title>`
- `BlockExt` is now exported at widgets::`BlockExt` instead of `widgets::block::BlockExt`
```diff
- use ratatui::widgets::{Block, block::{Title, Position}};
+ use ratatui::widgets::{Block, TitlePosition};
let block = Block::default()
- .title(Title::from("Hello"))
- .title(Title::from("Hello").position(Position::Bottom).alignment(Alignment::Center))
- .title_position(Position::Bottom);
+ .title(Line::from("Hello"))
+ .title_bottom(Line::from("Hello").centered());
+ .title_position(TitlePosition::Bottom);
- use ratatui::widgets::block::BlockExt;
+ use ratatui::widgets::BlockExt;
struct MyWidget {
block: Option<Block>,
}
impl Widget for &MyWidget {
fn render(self, area: Rect, buf: &mut Buffer) {
self.block.as_ref().render(area, buf);
let area = self.block.inner_if_some();
// ...
}
}
```
### `Style` no longer implements `Styled` ([#1572])
[#1572]: https://github.com/ratatui/ratatui/pull/1572
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.
```diff
- use ratatui::style::Stylize;
let style = Style::new().red();
```
The `reset()` method does not have a direct replacement, as it clashes with the existing `reset()`
method. Use the `Style::reset()` method instead.
```diff
- some_style.reset();
+ Style::reset();
```
### Disabling `default-features` suppresses the error message if `show_cursor()` fails when dropping `Terminal` ([#1794])
[#1794]: https://github.com/ratatui/ratatui/pull/1794
Since disabling `default-features` disables `std`, printing to stderr is not possible. It is
recommended to re-enable `std` when not using Ratatui in `no_std` environment.
### `Layout::init_cache` and `Layout::DEFAULT_CACHE_SIZE` are now only available if `layout-cache` feature is enabled ([#1795])
[#1795]: https://github.com/ratatui/ratatui/pull/1795
Previously, `Layout::init_cache` and `Layout::DEFAULT_CACHE_SIZE` were available independently of
enabled feature flags.
### Disabling `default-features` will now disable layout cache, which can have a negative impact on performance ([#1795])
Layout cache is now opt-in in `ratatui-core` and enabled by default in `ratatui`. If app doesn't
make use of `no_std`-compatibility, and disables `default-feature`, it is recommended to explicitly
re-enable layout cache. Not doing so may impact performance.
```diff
- ratatui = { version = "0.29.0", default-features = false }
+ ratatui = { version = "0.30.0", default-features = false, features = ["layout-cache"] }
```
### `TestBackend` now uses `core::convert::Infallible` for error handling instead of `std::io::Error` ([#1823])
[#1823]: https://github.com/ratatui/ratatui/pull/1823
Since `TestBackend` never fails, it now uses `Infallible` as associated `Error`. This may require
changes in test cases that use `TestBackend`.
### `Backend` now requires an associated `Error` type and `clear_region` method ([#1778])
[#1778]: https://github.com/ratatui/ratatui/pull/1778
Custom `Backend` implementations must now define an associated `Error` type for method `Result`s
and implement the `clear_region` method, which no longer has a default implementation.
This change was made to provide greater flexibility for custom backends, particularly to remove the
explicit dependency on `std::io` for backends that want to support `no_std` targets.
If your app or library uses the `Backend` trait directly - for example, by providing a generic
implementation for many backends - you may need to update the referenced error type.
```diff
- fn run<B: Backend>(mut terminal: Terminal<B>) -> io::Result<()> {
+ fn run<B: Backend>(mut terminal: Terminal<B>) -> Result<(), B::Error> {
```
Alternatively, you can explicitly require the associated error to be `std::io::Error`. This approach
may require fewer changes in user code but is generally not recommended, as it limits compatibility
with third-party backends. Additionally, the error type used by built-in backends may or may not
change in the future, making this approach less future-proof compared to the previous one.
```diff
- fn run<B: Backend>(mut terminal: Terminal<B>) -> io::Result<()> {
+ fn run<B: Backend<Error = io::Error>>(mut terminal: Terminal<B>) -> io::Result<()> {
```
If your application uses a concrete backend implementation, prefer specifying it explicitly
instead.
```diff
- fn run<B: Backend>(mut terminal: Terminal<B>) -> io::Result<()> {
+ fn run(mut terminal: DefaultTerminal) -> io::Result<()> {
```
### The MSRV is now 1.85.0 ([#1860])
[#1860]: https://github.com/ratatui/ratatui/pull/1860
The minimum supported Rust version (MSRV) is now 1.85.0.
### `layout::Alignment` is renamed to `layout::HorizontalAlignment` ([#1735])
[#1735]: https://github.com/ratatui/ratatui/pull/1691
The `Alignment` enum has been renamed to `HorizontalAlignment` to 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.
We don't expect to remove or deprecate the type alias in the near future, but it is recommended to
update your imports to use the new name.
```diff
- use ratatui::layout::Alignment;
+ use ratatui::layout::HorizontalAlignment;
- use Alignment::*;
+ use HorizontalAlignment::*;
```
### `List::highlight_symbol` accepts `Into<Line>` ([#1595])
[#1595]: https://github.com/ratatui/ratatui/pull/1595
Previously `List::highlight_symbol` accepted `&str`. Any code that uses conversion methods will need
to be rewritten. Since `Into::into` is not const, this function cannot be called in const context.
### `FrameExt` trait for `unstable-widget-ref` feature ([#1530])
@@ -187,6 +378,17 @@ The `termwiz` backend is upgraded from 0.22.0 to 0.23.0.
This release has a few fixes for hyperlinks and input handling, plus some dependency updates.
See the [commits](https://github.com/wezterm/wezterm/commits/main/termwiz) for more details.
### Support a broader range for `unicode-width` version ([#1999])
[#1999]: https://github.com/ratatui/ratatui/pull/1999
Ratatui's dependency on `unicode-width`, previously pinned to 0.2.0, has
expanded to allow version 0.2.1. This comes with 2 behavior changes described in
[unicode-width#61] and [unicode-width#74].
[unicode-width#61]: https://github.com/unicode-rs/unicode-width/pull/61
[unicode-width#74]: https://github.com/unicode-rs/unicode-width/pull/74
## [v0.29.0](https://github.com/ratatui/ratatui/releases/tag/v0.29.0)
### `Sparkline::data` takes `IntoIterator<Item = SparklineBar>` instead of `&[u64]` and is no longer const ([#1326])

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,23 @@ If your contribution is not straightforward, please first discuss the change you
creating a new issue before making the change, or starting a discussion on
[discord](https://discord.gg/pMCEU9hNEj).
## AI Generated Content
We welcome high quality PRs, whether they are human generated or made with the assistance of AI
tools, but we ask that you follow these guidelines:
- **Attribution**: Tell us about your use of AI tools, don't make us guess whether you're using it.
- **Review**: Make sure you review every line of AI generated content for correctness and relevance.
- **Quality**: AI-generated content should meet the same quality standards as human-written content.
- **Quantity**: Avoid submitting large amounts of AI generated content in a single PR. Remember that
quality is usually more important than quantity.
- **License**: Ensure that the AI-generated content is compatible with Ratatui's
[License](./LICENSE).
> [!IMPORTANT]
> Remember that AI tools can assist in generating content, but you are responsible for the final
> quality and accuracy of the contributions and communicating about it.
## Reporting issues
Before reporting an issue on the [issue tracker](https://github.com/ratatui/ratatui/issues),
@@ -22,17 +39,48 @@ on the crate or its users should ideally be discussed in a "Feature Request" iss
### Keep PRs small, intentional, and focused
Try to do one pull request per change. The time taken to review a PR grows exponential with the size
of the change. Small focused PRs will generally be much more faster to review. PRs that include both
Try to do one pull request per change. The time taken to review a PR grows exponentially with the size
of the change. Small focused PRs will generally be much faster to review. PRs that include both
refactoring (or reformatting) with actual changes are more difficult to review as every line of the
change becomes a place where a bug may have been introduced. Consider splitting refactoring /
reformatting changes into a separate PR from those that make a behavioral change, as the tests help
guarantee that the behavior is unchanged.
Guidelines for PR size:
- Aim for PRs under 500 lines of changes when possible.
- Split large features into incremental PRs that build on each other.
- Separate refactoring, formatting, and functional changes into different PRs.
- If a large PR is unavoidable, clearly explain why in the PR description.
### Breaking changes and backwards compatibility
We prioritize maintaining backwards compatibility and minimizing disruption to users:
- **Prefer deprecation over removal**: Add deprecation warnings rather than immediately removing
public APIs
- **Provide migration paths**: Include clear upgrade instructions for any breaking changes
- **Follow our deprecation policy**: Wait at least two versions before removing deprecated items
- **Consider feature flags**: Use feature flags for experimental or potentially disruptive changes
- **Document breaking changes**: Clearly mark breaking changes in commit messages and PR descriptions
See our [deprecation notice policy](#deprecation-notice) for more details.
### Code formatting
Run `cargo xtask format` before committing to ensure that code is consistently formatted with
rustfmt. Configuration is in [`rustfmt.toml`](./rustfmt.toml).
rustfmt. Configuration is in [`rustfmt.toml`](./rustfmt.toml). We use some unstable formatting
options as they lead to subjectively better formatting. These require a nightly version of Rust
to be installed when running rustfmt. You can install the nightly version of Rust using
[`rustup`](https://rustup.rs/):
```shell
rustup install nightly
```
> [!IMPORTANT]
> Do not modify formatting configuration (`rustfmt.toml`, `.clippy.toml`) without
> prior discussion. These changes affect all contributors and should be carefully considered.
### Search `tui-rs` for similar work
@@ -60,6 +108,15 @@ Running `cargo xtask ci` before pushing will perform the same checks that we do
It's not mandatory to do this before pushing, however it may save you time to do so instead of
waiting for GitHub to run the checks.
Available xtask commands:
- `cargo xtask ci` - Run all CI checks
- `cargo xtask format` - Format code
- `cargo xtask lint` - Run linting checks
- `cargo xtask test` - Run all tests
Run `cargo xtask --help` to see all available commands.
### Sign your commits
We use commit signature verification, which will block commits from being merged via the UI unless
@@ -67,6 +124,25 @@ they are signed. To set up your machine to sign commits, see [managing commit si
verification](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification)
in GitHub docs.
### Configuration and build system changes
Changes to project configuration files require special consideration:
- Linting configuration (`.clippy.toml`, `rustfmt.toml`): Affects all contributors.
- CI configuration (`.github/workflows/`): Affects build and deployment.
- Build system (`xtask/`, `Cargo.toml` workspace config): Affects development workflow.
- Dependencies: Consider MSRV compatibility and licensing.
Please discuss these changes in an issue before implementing them.
### Collaborative development
We may occasionally make changes directly to your branch—such as force-pushes—to help move a PR
forward, speed up review, or ensure it meets our quality standards. If you would prefer we do not do
this, or if your workflow depends on us avoiding force-pushes (for example, if your app points to
your branch in `Cargo.toml`), please mention this in your PR description and we will respect your
preference.
## Implementation Guidelines
### Setup
@@ -84,6 +160,20 @@ cd ratatui
cargo xtask build
```
### Architecture
For an understanding of the crate organization and design decisions, see [ARCHITECTURE.md]. This
document explains the modular workspace structure introduced in version 0.30.0 and provides
guidance on which crate to use for different use cases.
When making changes, consider:
- Which crate should contain your changes per the modular structure,
- Whether your changes affect the public API of `ratatui-core` (requires extra care),
- And how your changes fit into the overall architecture.
[ARCHITECTURE.md]: https://github.com/ratatui/ratatui/blob/main/ARCHITECTURE.md
### Tests
The [test coverage](https://app.codecov.io/gh/ratatui/ratatui) of the crate is reasonably
@@ -91,7 +181,7 @@ good, but this can always be improved. Focus on keeping the tests simple and obv
tests for all new or modified code. Beside the usual doc and unit tests, one of the most valuable
test you can write for Ratatui is a test against the `TestBackend`. It allows you to assert the
content of the output buffer that would have been flushed to the terminal after a given draw call.
See `widgets_block_renders` in [tests/widgets_block.rs](./tests/widget_block.rs) for an example.
See `widgets_block_renders` in [ratatui/tests/widgets_block.rs](./ratatui/tests/widgets_block.rs) for an example.
When writing tests, generally prefer to write unit tests and doc tests directly in the code file
being tested rather than integration tests in the `tests/` folder.
@@ -100,6 +190,10 @@ If an area that you're making a change in is not tested, write tests to characte
behavior before changing it. This helps ensure that we don't introduce bugs to existing software
using Ratatui (and helps make it easy to migrate apps still using `tui-rs`).
> [!IMPORTANT]
> Do not remove existing tests without clear justification. If tests need to be
> modified due to API changes, explain why in your PR description.
For coverage, we have two [bacon](https://dystroy.org/bacon/) jobs (one for all tests, and one for
unit tests, keyboard shortcuts `v` and `u` respectively) that run
[cargo-llvm-cov](https://github.com/taiki-e/cargo-llvm-cov) to report the coverage. Several plugins
@@ -167,6 +261,14 @@ We generally want to wait at least two versions before removing deprecated items
time to update. However, if a deprecation is blocking for us to implement a new feature we may
*consider* removing it in a one version notice.
Deprecation process:
1. Add `#[deprecated]` attribute with a clear message.
2. Update documentation to point to the replacement.
3. Add an entry to `BREAKING-CHANGES.md` if applicable.
4. Wait at least two versions before removal.
5. Consider the impact on the ecosystem before removing.
### Use of unsafe for optimization purposes
We don't currently use any unsafe code in Ratatui, and would like to keep it that way. However, there

1720
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[workspace]
resolver = "2"
members = ["ratatui", "ratatui-*", "xtask", "examples/apps/*"]
members = ["ratatui", "ratatui-*", "xtask", "examples/apps/*", "examples/concepts/*"]
default-members = [
"ratatui",
"ratatui-core",
@@ -11,6 +11,7 @@ default-members = [
"ratatui-termwiz",
"ratatui-widgets",
"examples/apps/*",
"examples/concepts/*",
]
[workspace.package]
@@ -23,34 +24,57 @@ categories = ["command-line-interface"]
readme = "README.md"
license = "MIT"
exclude = ["assets/*", ".github", "Makefile.toml", "CONTRIBUTING.md", "*.log", "tags"]
edition = "2021"
rust-version = "1.74.0"
edition = "2024"
rust-version = "1.85.0"
[workspace.dependencies]
bitflags = "2.7.0"
color-eyre = "0.6.3"
crossterm = "0.28.1"
document-features = "0.2.11"
indoc = "2.0.5"
instability = "0.3.7"
itertools = "0.13.0"
pretty_assertions = "1.4.1"
ratatui = { path = "ratatui", version = "0.30.0-alpha.2" }
ratatui-core = { path = "ratatui-core", version = "0.1.0-alpha.3" }
ratatui-crossterm = { path = "ratatui-crossterm", version = "0.1.0-alpha.2" }
ratatui-macros = { path = "ratatui-macros", version = "0.7.0-alpha.1" }
ratatui-termion = { path = "ratatui-termion", version = "0.1.0-alpha.2" }
ratatui-termwiz = { path = "ratatui-termwiz", version = "0.1.0-alpha.2" }
ratatui-widgets = { path = "ratatui-widgets", version = "0.3.0-alpha.2" }
rstest = "0.24.0"
serde = { version = "1.0.218", features = ["derive"] }
serde_json = "1.0.139"
strum = { version = "0.26.3", features = ["derive"] }
termion = "4.0.4"
termwiz = { version = "0.23.0" }
unicode-segmentation = "1.12.0"
anstyle = "1"
bitflags = "2.9"
clap = { version = "4.5", features = ["derive"] }
color-eyre = "0.6"
compact_str = { version = "0.9", default-features = false }
criterion = { version = "0.7", features = ["html_reports"] }
crossterm = "0.29"
document-features = "0.2"
fakeit = "1"
futures = "0.3"
hashbrown = "0.16"
indoc = "2"
instability = "0.3"
itertools = { version = "0.14", default-features = false, features = ["use_alloc"] }
kasuari = { version = "0.4", default-features = false }
line-clipping = "0.3"
lru = "0.16"
octocrab = "0.44"
palette = "0.7"
pretty_assertions = "1"
rand = "0.9"
rand_chacha = "0.9"
ratatui = { path = "ratatui", version = "0.30.0-beta.0" }
ratatui-core = { path = "ratatui-core", version = "0.1.0-beta.0" }
ratatui-crossterm = { path = "ratatui-crossterm", version = "0.1.0-beta.0" }
ratatui-macros = { path = "ratatui-macros", version = "0.7.0-beta.0" }
ratatui-termion = { path = "ratatui-termion", version = "0.1.0-beta.0" }
ratatui-termwiz = { path = "ratatui-termwiz", version = "0.1.0-beta.0" }
ratatui-widgets = { path = "ratatui-widgets", version = "0.3.0-beta.0" }
rstest = "0.26"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
strum = { version = "0.27", default-features = false, features = ["derive"] }
termion = "4"
termwiz = "0.23"
thiserror = { version = "2", default-features = false }
time = { version = "0.3", default-features = false }
tokio = "1"
tokio-stream = "0.1"
tracing = "0.1"
tracing-appender = "0.2"
tracing-subscriber = "0.3"
trybuild = "1"
unicode-segmentation = "1"
unicode-truncate = { version = "2", default-features = false }
# See <https://github.com/ratatui/ratatui/issues/1271> for information about why we pin unicode-width
unicode-width = "=0.2.0"
unicode-width = ">=0.2.0, <=0.2.1"
# Improve benchmark consistency
[profile.bench]

View File

@@ -12,7 +12,7 @@
</details>
![Demo](https://github.com/ratatui/ratatui/blob/87ae72dbc756067c97f6400d3e2a58eeb383776e/examples/demo2-destroy.gif?raw=true)
![Release header](https://github.com/ratatui/ratatui/blob/b23480adfa9430697071c906c7ba4d4f9bd37a73/assets/release-header.png?raw=true)
<div align="center">
@@ -73,6 +73,7 @@ fn render(frame: &mut Frame) {
- [Ratatui Forum] - a place to ask questions and discuss the library.
- [Widget Examples] - a collection of examples that demonstrate how to use the library.
- [App Examples] - a collection of more complex examples that demonstrate how to build apps.
- [ARCHITECTURE.md] - explains the crate organization and modular workspace structure.
- [Changelog] - generated by [git-cliff] utilizing [Conventional Commits].
- [Breaking Changes] - a list of breaking changes in the library.
@@ -112,7 +113,16 @@ There is also a [Matrix](https://matrix.org/) bridge available at
We rely on GitHub for [bugs][Report a bug] and [feature requests][Request a Feature].
Please make sure you read the [contributing](./CONTRIBUTING.md) guidelines before [creating a pull
request][Create a Pull Request].
request][Create a Pull Request]. We accept AI generated code, but please read the [AI Contributions]
guidelines to ensure compliance.
If you'd like to show your support, you can add the Ratatui badge to your project's README:
```md
[![Built With Ratatui](https://img.shields.io/badge/Built_With_Ratatui-000?logo=ratatui&logoColor=fff)](https://ratatui.rs/)
```
[![Built With Ratatui](https://img.shields.io/badge/Built_With_Ratatui-000?logo=ratatui&logoColor=fff)](https://ratatui.rs/)
## Acknowledgements
@@ -133,6 +143,7 @@ This project is licensed under the [MIT License][License].
[Docs]: https://docs.rs/ratatui
[Widget Examples]: https://github.com/ratatui/ratatui/tree/main/ratatui-widgets/examples
[App Examples]: https://github.com/ratatui/ratatui/tree/main/examples
[ARCHITECTURE.md]: https://github.com/ratatui/ratatui/blob/main/ARCHITECTURE.md
[Changelog]: https://github.com/ratatui/ratatui/blob/main/CHANGELOG.md
[git-cliff]: https://git-cliff.org
[Conventional Commits]: https://www.conventionalcommits.org
@@ -142,6 +153,7 @@ This project is licensed under the [MIT License][License].
[Request a Feature]: https://github.com/ratatui/ratatui/issues/new?labels=enhancement&projects=&template=feature_request.md
[Create a Pull Request]: https://github.com/ratatui/ratatui/compare
[Contributing]: https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md
[AI Contributions]: https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md#ai-generated-content
[Crate]: https://crates.io/crates/ratatui
[tui-rs]: https://crates.io/crates/tui
[Sponsors]: https://github.com/sponsors/ratatui

View File

@@ -36,7 +36,7 @@ actions](.github/workflows/cd.yml) and triggered by pushing a tag.
## Alpha Releases
Alpha releases are automatically released every Saturday via [cd.yml](./.github/workflows/cd.yml)
and can be manually be created when necessary by triggering the [Continuous
and can be manually created when necessary by triggering the [Continuous
Deployment](https://github.com/ratatui/ratatui/actions/workflows/cd.yml) workflow.
We automatically release an alpha release with a patch level bump + alpha.num weekly (and when we

1
assets/logo-simple.svg Normal file
View File

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg"><title>Ratatui</title><path d="M17 29h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1H5v-1H4v-1H3v-1H2v-1H1v-1H0v-2h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h2zm-2 14h1v1h1v1h1v-2h-1v-1h-1v-1h-1zm0-6h-3v1h1v1h4v-4h-1v-1h-1zm35-21h-1v4h-1v1h-1v1h-1v1h-2v1h-1v1h-1v1h-1v1h-2v9h5v1h1v9h-1v1h-1v2h-1v1h-1v-1h-1v-1h-1v-1h1v-1h1v-1h1v-5h-1v1h-3v1h-1v3h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-2h1v-2h1v-1h-2v1h-4v-1h-1v-1h-1v-1h-1v-2h1v-1h1v-1h2v-1h7v-1h1v-1h1v-1h1v-1h1v-1h1v-1h4v-1h3v-1h10zm-17 2h-1v2h1v1h2v-1h1v-2h-1v-1h-2zM29 1h1v9h1v1h1v2h1v2h-1v1h-1v1h-1v1h-1v1h-1v1h-3v-1h-1v-1h-2v-1h-1v-1h-1v-1h-6v-1h-1V9h1V8h1V7h1V6h1V5h1V4h1V3h1V2h1V1h2V0h6z"/></svg>

After

Width:  |  Height:  |  Size: 831 B

1
assets/logo.svg Normal file
View File

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg"><title>Ratatui</title><path d="M50 16h-1v4h-1v1h-1v1h-1v1h-2v1h-1v1h-1v1h-1v1h-2v9h5v1h1v9h-1v1h-1v2h-1v1h-1v-1h-1v1h-2v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1H9v1H8v1H7v1H6v1H5v1H4v1H3v1H2v2h1v1h1v1h1v1h1v1h1v1H5v-1H4v-1H3v-1H2v-1H1v-1H0v-2h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h2v1h1v-1h-1v-1h-1v-2h1v-1h1v-1h2v-1h7v-1h1v-1h1v-1h1v-1h1v-1h1v-1h4v-1h3v-1h10zM39 49h1v-1h-1zm2-8h-3v1h-1v3h-1v-1h-1v1h1v1h1v1h1v1h1v-1h1v-1h1v-1h1v-5h-1zm-7 3h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-1-1h1v-1h-1zm-5-5h1v1h1v1h1v1h1v1h1v-2h1v-2h1v-1h-2v1h-4v-1h-1zm14-11h-1v2h1v1h2v-1h1v-2h-1v-1h-2zM18 40h1v1h1v2h-1v-1h-1v-1h-1v-2h1zm0-7h1v4h-4v-1h-1v-1h3v-3h1zM29 1h1v9h1v1h1v2h1v2h-1v1h-1v1h-1v1h-1v1h-1v1h-3v-1h-1v-1h-2v-1h-1v-1h-1v-1h-6v-1h-1V9h1V8h1V7h1V6h1V5h1V4h1V3h1V2h1V1h2V0h6z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -60,6 +60,22 @@ command = ["cargo", "xtask", "hack"]
[jobs.format]
command = ["cargo", "xtask", "format"]
[jobs.zizmor-offline]
# zizmor checks the workflow files for security issues. The offline version is generally faster, but
# checks for fewer issues.
command = ["zizmor", "--color", "always", ".github/workflows", "--offline"]
need_stdout = true
default_watch = false
watch = [".github/workflows/"]
[jobs.zizmor-online]
# zizmor checks the workflow files for security issues. The online version is a bit slower, but it
# checks for more issues
command = ["zizmor", "--color", "always", ".github/workflows"]
need_stdout = true
default_watch = false
watch = [".github/workflows/"]
# You may define here keybindings that would be specific to
# a project, for example a shortcut to launch a specific job.
# Shortcuts to internal functions (scrolling, toggling, etc.)
@@ -74,3 +90,5 @@ ctrl-v = "job:coverage-unit-tests-only"
u = "job:test-unit"
n = "job:nextest"
f = "job:format"
z = "job:zizmor-offline"
shift-z = "job:zizmor-online"

View File

@@ -24,7 +24,11 @@ body = """
{%- if not version %}
## [unreleased]
{% else -%}
{%- if package -%} {# release-plz specific variable #}
## {{ package }} - [{{ version }}]({{ release_link }}) - {{ timestamp | date(format="%Y-%m-%d") }}
{%- else -%}
## [{{ version }}]({{ self::remote_url() }}/releases/tag/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
{%- endif %}
{% endif -%}
{% macro commit(commit) -%}
@@ -33,6 +37,16 @@ body = """
{% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%}\
{% if commit.remote.pr_number %} in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}){%- endif %}\
{%- if commit.breaking %} [**breaking**]{% endif %}
{%- if commit.body %}\n\n{{ commit.body | indent(prefix=" > ", first=true, blank=true) }}
{%- endif %}
{%- for footer in commit.footers %}\n
{%- if footer.token != "Signed-off-by" and footer.token != "Co-authored-by" %}
>
{{ footer.token | indent(prefix=" > ", first=true, blank=true) }}
{{- footer.separator }}
{{- footer.value| indent(prefix=" > ", first=false, blank=true) }}
{%- endif %}
{%- endfor %}
{% endmacro -%}
{% for group, commits in commits | group_by(attribute="group") %}
@@ -49,24 +63,27 @@ body = """
{% if version %}
{% if previous.version %}
**Full Changelog**: {{ release_link }}
{%- if release_link -%}
**Full Changelog**: {{ release_link }} {# release-plz specific variable #}
{%- else -%}
**Full Changelog**: {{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}
{% endif %}
{% endif %}
{% else -%}
{% raw %}\n{% endraw %}
{% endif %}
{%- macro remote_url() -%}
{%- if remote.owner -%} {# release-plz specific variable #}
https://github.com/{{ remote.owner }}/{{ remote.repo }}\
{%- else -%}
https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}\
{%- endif -%}
{% endmacro %}
"""
# remove the leading and trailing whitespace from the template
trim = false
# changelog footer
footer = """
<!-- generated by git-cliff -->
"""
# postprocessors for the changelog body
postprocessors = [
{ pattern = '<!-- Please read CONTRIBUTING.md before submitting any pull request. -->', replace = "" },
{ pattern = '>---+\n', replace = '' },
@@ -87,9 +104,15 @@ commit_preprocessors = [
{ pattern = '(Clarify README.md)', replace = "docs(readme): ${1}" },
{ pattern = '(Update README.md)', replace = "docs(readme): ${1}" },
{ pattern = '(fix typos|Fix typos)', replace = "fix: ${1}" },
# a small typo that squeaked through and which would otherwise trigger the typos linter.
# Regex obsfucation is to avoid triggering the linter in this file until there's a per file config
# See https://github.com/crate-ci/typos/issues/724
{ pattern = '\<[d]eatil\>', replace = "detail" },
]
# regex for parsing and grouping commits
commit_parsers = [
# release-plz adds 000000 as a placeholder for release commits
{ field = "id", pattern = "0000000", skip = true },
{ message = "^feat", group = "<!-- 00 -->Features" },
{ message = "^[fF]ix", group = "<!-- 01 -->Bug Fixes" },
{ message = "^refactor", group = "<!-- 02 -->Refactor" },
@@ -103,8 +126,9 @@ commit_parsers = [
{ message = "^chore\\(deps\\)", skip = true },
{ message = "^chore\\(changelog\\)", skip = true },
{ message = "^[cC]hore", group = "<!-- 07 -->Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 08 -->Security" },
{ message = "^build", group = "<!-- 09 -->Build" },
{ message = "^build\\(deps\\)", skip = true },
{ message = "^build", group = "<!-- 08 -->Build" },
{ body = ".*security", group = "<!-- 09 -->Security" },
{ message = "^ci", group = "<!-- 10 -->Continuous Integration" },
{ message = "^revert", group = "<!-- 11 -->Reverted Commits" },
# handle some old commits styles from pre 0.4
@@ -119,9 +143,9 @@ filter_commits = false
# glob pattern for matching git tags
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-rc.1"
skip_tags = "beta|alpha|v0.1.0-rc.1"
# regex for ignoring tags
ignore_tags = "alpha"
ignore_tags = "rc"
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order

View File

@@ -9,7 +9,6 @@ allow = [
"BSD-3-Clause",
"ISC",
"MIT",
"OpenSSL",
"Unicode-3.0",
"Unicode-DFS-2016",
"WTFPL",

View File

@@ -12,21 +12,16 @@
use std::time::{Duration, Instant};
use color_eyre::Result;
use crossterm::event::{self, Event, KeyCode};
use ratatui::{
buffer::Buffer,
layout::{Constraint, Layout, Position, Rect, Size},
style::{Color, Style},
widgets::{Widget, WidgetRef},
DefaultTerminal,
};
use crossterm::event;
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Position, Rect, Size};
use ratatui::style::{Color, Style};
use ratatui::widgets::{Widget, WidgetRef};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let result = App::default().run(terminal);
ratatui::restore();
result
ratatui::run(|terminal| App::default().run(terminal))
}
#[derive(Default)]
@@ -38,15 +33,15 @@ struct App {
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
while !self.should_quit {
self.draw(&mut terminal)?;
self.render(terminal)?;
self.handle_events()?;
}
Ok(())
}
fn draw(&mut self, tui: &mut DefaultTerminal) -> Result<()> {
fn render(&mut self, tui: &mut DefaultTerminal) -> Result<()> {
tui.draw(|frame| frame.render_widget(self, frame.area()))?;
Ok(())
}
@@ -57,11 +52,8 @@ impl App {
if !event::poll(timeout)? {
return Ok(());
}
if let Event::Key(key) = event::read()? {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
_ => {}
}
if event::read()?.is_key_press() {
self.should_quit = true;
}
Ok(())
}
@@ -76,7 +68,7 @@ impl App {
impl Widget for &mut App {
fn render(self, area: Rect, buf: &mut Buffer) {
let constraints = Constraint::from_lengths([1, 1, 2, 1]);
let [greeting, timer, squares, position] = Layout::vertical(constraints).areas(area);
let [greeting, timer, squares, position] = area.layout(&Layout::vertical(constraints));
// render an ephemeral greeting widget
Greeting::new("Ratatui!").render(greeting, buf);
@@ -182,9 +174,9 @@ struct BlueSquare;
impl Widget for &BoxedSquares {
fn render(self, area: Rect, buf: &mut Buffer) {
let constraints = vec![Constraint::Length(4); self.squares.len()];
let areas = Layout::horizontal(constraints).split(area);
for (widget, area) in self.squares.iter().zip(areas.iter()) {
widget.render_ref(*area, buf);
let areas = area.layout_vec(&Layout::horizontal(constraints));
for (widget, area) in self.squares.iter().zip(areas) {
widget.render_ref(area, buf);
}
}
}

View File

@@ -14,9 +14,9 @@ edition.workspace = true
rust-version.workspace = true
[dependencies]
color-eyre = "0.6.3"
color-eyre.workspace = true
crossterm = { workspace = true, features = ["event-stream"] }
octocrab = "0.43.0"
octocrab.workspace = true
ratatui.workspace = true
tokio = { version = "1.43.0", features = ["rt-multi-thread", "macros"] }
tokio-stream = "0.1.17"
tokio = { workspace = true, features = ["rt-multi-thread", "macros"] }
tokio-stream.workspace = true

View File

@@ -27,25 +27,20 @@
//! [Ratatui]: https://github.com/ratatui/ratatui
//! [examples]: https://github.com/ratatui/ratatui/blob/main/examples
//! [examples readme]: https://github.com/ratatui/ratatui/blob/main/examples/README.md
use std::{
sync::{Arc, RwLock},
time::Duration,
};
use std::sync::{Arc, RwLock};
use std::time::Duration;
use color_eyre::Result;
use octocrab::{
params::{pulls::Sort, Direction},
Page,
};
use ratatui::{
buffer::Buffer,
crossterm::event::{Event, EventStream, KeyCode, KeyEventKind},
layout::{Constraint, Layout, Rect},
style::{Style, Stylize},
text::Line,
widgets::{Block, HighlightSpacing, Row, StatefulWidget, Table, TableState, Widget},
DefaultTerminal, Frame,
};
use crossterm::event::{Event, EventStream, KeyCode};
use octocrab::Page;
use octocrab::params::Direction;
use octocrab::params::pulls::Sort;
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{Block, HighlightSpacing, Row, StatefulWidget, Table, TableState, Widget};
use ratatui::{DefaultTerminal, Frame};
use tokio_stream::StreamExt;
#[tokio::main]
@@ -75,30 +70,28 @@ impl App {
while !self.should_quit {
tokio::select! {
_ = interval.tick() => { terminal.draw(|frame| self.draw(frame))?; },
_ = interval.tick() => { terminal.draw(|frame| self.render(frame))?; },
Some(Ok(event)) = events.next() => self.handle_event(&event),
}
}
Ok(())
}
fn draw(&self, frame: &mut Frame) {
let vertical = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]);
let [title_area, body_area] = vertical.areas(frame.area());
fn render(&self, frame: &mut Frame) {
let layout = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]);
let [title_area, body_area] = frame.area().layout(&layout);
let title = Line::from("Ratatui async example").centered().bold();
frame.render_widget(title, title_area);
frame.render_widget(&self.pull_requests, body_area);
}
fn handle_event(&mut self, event: &Event) {
if let Event::Key(key) = event {
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
KeyCode::Char('j') | KeyCode::Down => self.pull_requests.scroll_down(),
KeyCode::Char('k') | KeyCode::Up => self.pull_requests.scroll_up(),
_ => {}
}
if let Some(key) = event.as_key_press_event() {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
KeyCode::Char('j') | KeyCode::Down => self.pull_requests.scroll_down(),
KeyCode::Char('k') | KeyCode::Up => self.pull_requests.scroll_up(),
_ => {}
}
}
}

View File

@@ -9,7 +9,7 @@ rust-version.workspace = true
color-eyre.workspace = true
crossterm.workspace = true
ratatui.workspace = true
time = { version = "0.3.37", features = ["formatting", "parsing"] }
time = { workspace = true, features = ["formatting", "parsing"] }
[lints]
workspace = true

View File

@@ -11,45 +11,37 @@
use std::fmt;
use color_eyre::Result;
use crossterm::event::{self, Event, KeyCode, KeyEventKind};
use ratatui::{
layout::{Constraint, Layout, Margin, Rect},
style::{Color, Modifier, Style, Stylize},
text::{Line, Text},
widgets::calendar::{CalendarEventStore, Monthly},
DefaultTerminal, Frame,
};
use time::{ext::NumericalDuration, Date, Month, OffsetDateTime};
use crossterm::event::{self, KeyCode};
use ratatui::layout::{Constraint, Layout, Margin, Rect};
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::text::{Line, Text};
use ratatui::widgets::calendar::{CalendarEventStore, Monthly};
use ratatui::{DefaultTerminal, Frame};
use time::ext::NumericalDuration;
use time::{Date, Month, OffsetDateTime};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let result = run(terminal);
ratatui::restore();
result
ratatui::run(run)
}
/// Run the application.
fn run(mut terminal: DefaultTerminal) -> Result<()> {
fn run(terminal: &mut DefaultTerminal) -> Result<()> {
let mut selected_date = OffsetDateTime::now_local()?.date();
let mut calendar_style = StyledCalendar::Default;
loop {
terminal.draw(|frame| render(frame, calendar_style, selected_date))?;
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Char('q') => break Ok(()),
KeyCode::Char('s') => calendar_style = calendar_style.next(),
KeyCode::Char('n') | KeyCode::Tab => selected_date = next_month(selected_date),
KeyCode::Char('p') | KeyCode::BackTab => {
selected_date = previous_month(selected_date);
}
KeyCode::Char('h') | KeyCode::Left => selected_date -= 1.days(),
KeyCode::Char('j') | KeyCode::Down => selected_date += 1.weeks(),
KeyCode::Char('k') | KeyCode::Up => selected_date -= 1.weeks(),
KeyCode::Char('l') | KeyCode::Right => selected_date += 1.days(),
_ => {}
}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') => break Ok(()),
KeyCode::Char('s') => calendar_style = calendar_style.next(),
KeyCode::Char('n') | KeyCode::Tab => selected_date = next_month(selected_date),
KeyCode::Char('p') | KeyCode::BackTab => selected_date = prev_month(selected_date),
KeyCode::Char('h') | KeyCode::Left => selected_date -= 1.days(),
KeyCode::Char('j') | KeyCode::Down => selected_date += 1.weeks(),
KeyCode::Char('k') | KeyCode::Up => selected_date -= 1.weeks(),
KeyCode::Char('l') | KeyCode::Right => selected_date += 1.days(),
_ => {}
}
}
}
@@ -66,7 +58,7 @@ fn next_month(date: Date) -> Date {
}
}
fn previous_month(date: Date) -> Date {
fn prev_month(date: Date) -> Date {
if date.month() == Month::January {
date.replace_month(Month::December)
.unwrap()
@@ -77,7 +69,7 @@ fn previous_month(date: Date) -> Date {
}
}
/// Draw the UI with a calendar.
/// Render the UI with a calendar.
fn render(frame: &mut Frame, calendar_style: StyledCalendar, selected_date: Date) {
let header = Text::from_iter([
Line::from("Calendar Example".bold()),
@@ -89,11 +81,10 @@ fn render(frame: &mut Frame, calendar_style: StyledCalendar, selected_date: Date
)),
]);
let vertical = Layout::vertical([
let [text_area, area] = frame.area().layout(&Layout::vertical([
Constraint::Length(header.height() as u16),
Constraint::Fill(1),
]);
let [text_area, area] = vertical.areas(frame.area());
]));
frame.render_widget(header.centered(), text_area);
calendar_style
.render_year(frame, area, selected_date)
@@ -141,16 +132,13 @@ impl StyledCalendar {
fn render_year(self, frame: &mut Frame, area: Rect, date: Date) -> Result<()> {
let events = events(date)?;
let area = area.inner(Margin {
vertical: 1,
horizontal: 1,
});
let rows = Layout::vertical([Constraint::Ratio(1, 3); 3]).split(area);
let areas = rows.iter().flat_map(|row| {
Layout::horizontal([Constraint::Ratio(1, 4); 4])
.split(*row)
.to_vec()
});
let vertical = Layout::vertical([Constraint::Ratio(1, 3); 3]);
let horizontal = &Layout::horizontal([Constraint::Ratio(1, 4); 4]);
let areas = area
.inner(Margin::new(1, 1))
.layout_vec(&vertical)
.into_iter()
.flat_map(|row| row.layout_vec(horizontal));
for (i, area) in areas.enumerate() {
let month = date
.replace_day(1)

View File

@@ -14,23 +14,18 @@ use std::{
};
use color_eyre::Result;
use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture, KeyEventKind},
ExecutableCommand,
use crossterm::ExecutableCommand;
use crossterm::event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, MouseEventKind,
};
use itertools::Itertools;
use ratatui::{
crossterm::event::{self, Event, KeyCode, MouseEventKind},
layout::{Constraint, Layout, Position, Rect},
style::{Color, Stylize},
symbols::Marker,
text::Text,
widgets::{
canvas::{Canvas, Circle, Map, MapResolution, Points, Rectangle},
Block, Widget,
},
DefaultTerminal, Frame,
};
use ratatui::layout::{Constraint, Layout, Position, Rect};
use ratatui::style::{Color, Stylize};
use ratatui::symbols::Marker;
use ratatui::text::Text;
use ratatui::widgets::canvas::{Canvas, Circle, Map, MapResolution, Points, Rectangle};
use ratatui::widgets::{Block, Widget};
use ratatui::{DefaultTerminal, Frame};
fn main() -> Result<()> {
color_eyre::install()?;
@@ -80,43 +75,33 @@ impl App {
let tick_rate = Duration::from_millis(16);
let mut last_tick = Instant::now();
while !self.exit {
terminal.draw(|frame| self.draw(frame))?;
terminal.draw(|frame| self.render(frame))?;
let timeout = tick_rate.saturating_sub(last_tick.elapsed());
if event::poll(timeout)? {
match event::read()? {
Event::Key(key) => self.handle_key_press(key),
Event::Mouse(event) => self.handle_mouse_event(event),
_ => (),
}
}
if last_tick.elapsed() >= tick_rate {
if !event::poll(timeout)? {
self.on_tick();
last_tick = Instant::now();
continue;
}
match event::read()? {
Event::Key(key) => self.handle_key_event(key),
Event::Mouse(event) => self.handle_mouse_event(event),
_ => (),
}
}
Ok(())
}
fn handle_key_press(&mut self, key: event::KeyEvent) {
if key.kind != KeyEventKind::Press {
fn handle_key_event(&mut self, key: KeyEvent) {
if !key.is_press() {
return;
}
match key.code {
KeyCode::Char('q') => self.exit = true,
KeyCode::Down | KeyCode::Char('j') => self.y += 1.0,
KeyCode::Up | KeyCode::Char('k') => self.y -= 1.0,
KeyCode::Right | KeyCode::Char('l') => self.x += 1.0,
KeyCode::Left | KeyCode::Char('h') => self.x -= 1.0,
KeyCode::Enter => {
self.marker = match self.marker {
Marker::Dot => Marker::Braille,
Marker::Braille => Marker::Block,
Marker::Block => Marker::HalfBlock,
Marker::HalfBlock => Marker::Bar,
Marker::Bar => Marker::Dot,
};
}
KeyCode::Char('q') | KeyCode::Esc => self.exit = true,
KeyCode::Char('j') | KeyCode::Down => self.y += 1.0,
KeyCode::Char('k') | KeyCode::Up => self.y -= 1.0,
KeyCode::Char('l') | KeyCode::Right => self.x += 1.0,
KeyCode::Char('h') | KeyCode::Left => self.x -= 1.0,
KeyCode::Enter => self.cycle_marker(),
_ => {}
}
}
@@ -132,6 +117,16 @@ impl App {
}
}
const fn cycle_marker(&mut self) {
self.marker = match self.marker {
Marker::Dot => Marker::Braille,
Marker::Braille => Marker::Block,
Marker::Block => Marker::HalfBlock,
Marker::HalfBlock => Marker::Bar,
Marker::Bar => Marker::Dot,
};
}
fn on_tick(&mut self) {
// bounce the ball by flipping the velocity vector
let ball = &self.ball;
@@ -150,7 +145,7 @@ impl App {
self.ball.y += self.vy;
}
fn draw(&self, frame: &mut Frame) {
fn render(&self, frame: &mut Frame) {
let header = Text::from_iter([
"Canvas Example".bold(),
"<q> Quit | <enter> Change Marker | <hjkl> Move".into(),
@@ -158,16 +153,15 @@ impl App {
let vertical = Layout::vertical([
Constraint::Length(header.height() as u16),
Constraint::Percentage(50),
Constraint::Percentage(50),
Constraint::Fill(1),
Constraint::Fill(1),
]);
let [text_area, up, down] = vertical.areas(frame.area());
let [text_area, up, down] = frame.area().layout(&vertical);
frame.render_widget(header.centered(), text_area);
let horizontal =
Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)]);
let [draw, pong] = horizontal.areas(up);
let [map, boxes] = horizontal.areas(down);
let horizontal = Layout::horizontal([Constraint::Fill(1); 2]);
let [draw, pong] = up.layout(&horizontal);
let [map, boxes] = down.layout(&horizontal);
frame.render_widget(self.map_canvas(), map);
frame.render_widget(self.draw_canvas(draw), draw);

View File

@@ -11,22 +11,17 @@
use std::time::{Duration, Instant};
use color_eyre::Result;
use ratatui::{
crossterm::event::{self, Event, KeyCode},
layout::{Constraint, Layout, Rect},
style::{Color, Modifier, Style, Stylize},
symbols::{self, Marker},
text::{Line, Span},
widgets::{Axis, Block, Chart, Dataset, GraphType, LegendPosition},
DefaultTerminal, Frame,
};
use crossterm::event::{self, KeyCode};
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::symbols::{self, Marker};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Axis, Block, Chart, Dataset, GraphType, LegendPosition};
use ratatui::{DefaultTerminal, Frame};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::new().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::new().run(terminal))
}
struct App {
@@ -80,23 +75,23 @@ impl App {
}
}
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
let tick_rate = Duration::from_millis(250);
let mut last_tick = Instant::now();
loop {
terminal.draw(|frame| self.draw(frame))?;
terminal.draw(|frame| self.render(frame))?;
let timeout = tick_rate.saturating_sub(last_tick.elapsed());
if event::poll(timeout)? {
if let Event::Key(key) = event::read()? {
if key.code == KeyCode::Char('q') {
return Ok(());
}
}
}
if last_tick.elapsed() >= tick_rate {
if !event::poll(timeout)? {
self.on_tick();
last_tick = Instant::now();
continue;
}
if event::read()?
.as_key_press_event()
.is_some_and(|key| key.code == KeyCode::Char('q'))
{
return Ok(());
}
}
}
@@ -112,11 +107,12 @@ impl App {
self.window[1] += 1.0;
}
fn draw(&self, frame: &mut Frame) {
let [top, bottom] = Layout::vertical([Constraint::Fill(1); 2]).areas(frame.area());
let [animated_chart, bar_chart] =
Layout::horizontal([Constraint::Fill(1), Constraint::Length(29)]).areas(top);
let [line_chart, scatter] = Layout::horizontal([Constraint::Fill(1); 2]).areas(bottom);
fn render(&self, frame: &mut Frame) {
let vertical = Layout::vertical([Constraint::Fill(1); 2]);
let [top, bottom] = frame.area().layout(&vertical);
let horizontal = Layout::horizontal([Constraint::Fill(1), Constraint::Length(29)]);
let [animated_chart, bar_chart] = top.layout(&horizontal);
let [line_chart, scatter] = bottom.layout(&Layout::horizontal([Constraint::Fill(1); 2]));
self.render_animated_chart(frame, animated_chart);
render_barchart(frame, bar_chart);
@@ -130,7 +126,7 @@ impl App {
format!("{}", self.window[0]),
Style::default().add_modifier(Modifier::BOLD),
),
Span::raw(format!("{}", (self.window[0] + self.window[1]) / 2.0)),
Span::raw(format!("{}", f64::midpoint(self.window[0], self.window[1]))),
Span::styled(
format!("{}", self.window[1]),
Style::default().add_modifier(Modifier::BOLD),
@@ -210,12 +206,14 @@ fn render_barchart(frame: &mut Frame, bar_chart: Rect) {
}
fn render_line_chart(frame: &mut Frame, area: Rect) {
let datasets = vec![Dataset::default()
.name("Line from only 2 points".italic())
.marker(symbols::Marker::Braille)
.style(Style::default().fg(Color::Yellow))
.graph_type(GraphType::Line)
.data(&[(1., 1.), (4., 4.)])];
let datasets = vec![
Dataset::default()
.name("Line from only 2 points".italic())
.marker(symbols::Marker::Braille)
.style(Style::default().fg(Color::Yellow))
.graph_type(GraphType::Line)
.data(&[(1., 1.), (4., 4.)]),
];
let chart = Chart::new(datasets)
.block(Block::bordered().title(Line::from("Line chart").cyan().bold().centered()))

View File

@@ -9,46 +9,37 @@
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use crossterm::event;
use itertools::Itertools;
use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Alignment, Constraint, Layout, Rect},
style::{Color, Style, Stylize},
text::Line,
widgets::{Block, Borders, Paragraph},
DefaultTerminal, Frame,
};
use ratatui::Frame;
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::{Color, Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{Block, Borders, Paragraph};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = run(terminal);
ratatui::restore();
app_result
}
fn run(mut terminal: DefaultTerminal) -> Result<()> {
loop {
terminal.draw(draw)?;
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') {
ratatui::run(|terminal| {
loop {
terminal.draw(render)?;
if event::read()?.is_key_press() {
return Ok(());
}
}
}
})
}
fn draw(frame: &mut Frame) {
let layout = Layout::vertical([
fn render(frame: &mut Frame) {
let [named, indexed_colors, indexed_greys] = Layout::vertical([
Constraint::Length(30),
Constraint::Length(17),
Constraint::Length(2),
])
.split(frame.area());
.areas(frame.area());
render_named_colors(frame, layout[0]);
render_indexed_colors(frame, layout[1]);
render_indexed_grayscale(frame, layout[2]);
render_named_colors(frame, named);
render_indexed_colors(frame, indexed_colors);
render_indexed_grayscale(frame, indexed_greys);
}
const NAMED_COLORS: [Color; 16] = [
@@ -91,12 +82,12 @@ fn render_fg_named_colors(frame: &mut Frame, bg: Color, area: Rect) {
let inner = block.inner(area);
frame.render_widget(block, area);
let vertical = Layout::vertical([Constraint::Length(1); 2]).split(inner);
let areas = vertical.iter().flat_map(|area| {
Layout::horizontal([Constraint::Ratio(1, 8); 8])
.split(*area)
.to_vec()
});
let vertical = Layout::vertical([Constraint::Length(1); 2]);
let horizontal = Layout::horizontal([Constraint::Ratio(1, 8); 8]);
let areas = inner
.layout_vec(&vertical)
.into_iter()
.flat_map(|area| area.layout_vec(&horizontal));
for (fg, area) in NAMED_COLORS.into_iter().zip(areas) {
let color_name = fg.to_string();
let paragraph = Paragraph::new(color_name).fg(fg).bg(bg);
@@ -109,12 +100,12 @@ fn render_bg_named_colors(frame: &mut Frame, fg: Color, area: Rect) {
let inner = block.inner(area);
frame.render_widget(block, area);
let vertical = Layout::vertical([Constraint::Length(1); 2]).split(inner);
let areas = vertical.iter().flat_map(|area| {
Layout::horizontal([Constraint::Ratio(1, 8); 8])
.split(*area)
.to_vec()
});
let vertical = Layout::vertical([Constraint::Length(1); 2]);
let horizontal = Layout::horizontal([Constraint::Ratio(1, 8); 8]);
let areas = inner
.layout_vec(&vertical)
.into_iter()
.flat_map(|area| area.layout_vec(&horizontal));
for (bg, area) in NAMED_COLORS.into_iter().zip(areas) {
let color_name = bg.to_string();
let paragraph = Paragraph::new(color_name).fg(fg).bg(bg);
@@ -206,7 +197,7 @@ fn title_block(title: String) -> Block<'static> {
.borders(Borders::TOP)
.title_alignment(Alignment::Center)
.border_style(Style::new().dark_gray())
.title_style(Style::new().reset())
.title_style(Style::reset())
.title(title)
}

View File

@@ -7,7 +7,8 @@ rust-version.workspace = true
[dependencies]
color-eyre.workspace = true
palette = "0.7.6"
crossterm.workspace = true
palette.workspace = true
ratatui.workspace = true
[lints]

View File

@@ -19,23 +19,19 @@
use std::time::{Duration, Instant};
use color_eyre::Result;
use palette::{convert::FromColorUnclamped, Okhsv, Srgb};
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Constraint, Layout, Position, Rect},
style::Color,
text::Text,
widgets::Widget,
DefaultTerminal,
};
use crossterm::event;
use palette::convert::FromColorUnclamped;
use palette::{Okhsv, Srgb};
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Position, Rect};
use ratatui::style::Color;
use ratatui::text::Text;
use ratatui::widgets::Widget;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
#[derive(Debug, Default)]
@@ -92,7 +88,7 @@ impl App {
/// Run the app
///
/// This is the main event loop for the app.
pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
pub fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
while self.is_running() {
terminal.draw(|frame| frame.render_widget(&mut self, frame.area()))?;
self.handle_events()?;
@@ -105,19 +101,16 @@ impl App {
}
/// Handle any events that have occurred since the last time the app was rendered.
///
/// Currently, this only handles the q key to quit the app.
fn handle_events(&mut self) -> Result<()> {
// Ensure that the app only blocks for a period that allows the app to render at
// approximately 60 FPS (this doesn't account for the time to render the frame, and will
// also update the app immediately any time an event occurs)
let timeout = Duration::from_secs_f32(1.0 / 60.0);
if event::poll(timeout)? {
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') {
self.state = AppState::Quit;
};
}
if !event::poll(timeout)? {
return Ok(());
}
if event::read()?.is_key_press() {
self.state = AppState::Quit;
}
Ok(())
}
@@ -131,8 +124,8 @@ impl App {
impl Widget for &mut App {
fn render(self, area: Rect, buf: &mut Buffer) {
use Constraint::{Length, Min};
let [top, colors] = Layout::vertical([Length(1), Min(0)]).areas(area);
let [title, fps] = Layout::horizontal([Min(0), Length(8)]).areas(top);
let [top, colors] = area.layout(&Layout::vertical([Length(1), Min(0)]));
let [title, fps] = top.layout(&Layout::horizontal([Min(0), Length(8)]));
Text::from("colors_rgb example. Press q to quit")
.centered()
.render(title, buf);
@@ -175,7 +168,7 @@ impl FpsWidget {
/// This updates the fps once a second, but only if the widget has rendered at least 2 frames
/// since the last calculation. This avoids noise in the fps calculation when rendering on slow
/// machines that can't render at least 2 frames per second.
#[allow(clippy::cast_precision_loss)]
#[expect(clippy::cast_precision_loss)]
fn calculate_fps(&mut self) {
self.frame_count += 1;
let elapsed = self.last_instant.elapsed();
@@ -217,7 +210,7 @@ impl ColorsWidget {
///
/// This is called once per frame to setup the colors to render. It caches the colors so that
/// they don't need to be recalculated every frame.
#[allow(clippy::cast_precision_loss)]
#[expect(clippy::cast_precision_loss)]
fn setup_colors(&mut self, size: Rect) {
let Rect { width, height, .. } = size;
// double the height because each screen row has two rows of half block pixels

View File

@@ -9,31 +9,22 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use crossterm::event::{self, KeyCode};
use itertools::Itertools;
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{
Constraint::{self, Fill, Length, Max, Min, Percentage, Ratio},
Flex, Layout, Rect,
},
style::{
palette::tailwind::{BLUE, SKY, SLATE, STONE},
Color, Style, Stylize,
},
symbols::{self, line},
text::{Line, Span, Text},
widgets::{Block, Paragraph, Widget, Wrap},
DefaultTerminal,
};
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::Constraint::{self, Fill, Length, Max, Min, Percentage, Ratio};
use ratatui::layout::{Flex, Layout, Rect};
use ratatui::style::palette::tailwind::{BLUE, SKY, SLATE, STONE};
use ratatui::style::{Color, Style, Stylize};
use ratatui::symbols::{self, line};
use ratatui::text::{Line, Span, Text};
use ratatui::widgets::{Block, Paragraph, Widget, Wrap};
use strum::{Display, EnumIter, FromRepr};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
#[derive(Default)]
@@ -88,7 +79,7 @@ struct SpacerBlock;
// App behaviour
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
self.insert_test_defaults();
while self.is_running() {
@@ -113,8 +104,8 @@ impl App {
}
fn handle_events(&mut self) -> Result<()> {
match event::read()? {
Event::Key(key) if key.kind == KeyEventKind::Press => match key.code {
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.exit(),
KeyCode::Char('1') => self.swap_constraint(ConstraintName::Min),
KeyCode::Char('2') => self.swap_constraint(ConstraintName::Max),
@@ -131,8 +122,7 @@ impl App {
KeyCode::Char('h') | KeyCode::Left => self.prev_block(),
KeyCode::Char('l') | KeyCode::Right => self.next_block(),
_ => {}
},
_ => {}
}
}
Ok(())
}
@@ -148,7 +138,7 @@ impl App {
| Constraint::Fill(v)
| Constraint::Percentage(v) => *v = v.saturating_add(1),
Constraint::Ratio(_n, d) => *d = d.saturating_add(1),
};
}
}
fn decrement_value(&mut self) {
@@ -162,7 +152,7 @@ impl App {
| Constraint::Fill(v)
| Constraint::Percentage(v) => *v = v.saturating_sub(1),
Constraint::Ratio(_n, d) => *d = d.saturating_sub(1),
};
}
}
/// select the next block with wrap around
@@ -203,15 +193,15 @@ impl App {
self.selected_index = index;
}
fn increment_spacing(&mut self) {
const fn increment_spacing(&mut self) {
self.spacing = self.spacing.saturating_add(1);
}
fn decrement_spacing(&mut self) {
const fn decrement_spacing(&mut self) {
self.spacing = self.spacing.saturating_sub(1);
}
fn exit(&mut self) {
const fn exit(&mut self) {
self.mode = AppMode::Quit;
}
@@ -246,15 +236,19 @@ impl From<Constraint> for ConstraintName {
impl Widget for &App {
fn render(self, area: Rect, buf: &mut Buffer) {
let [header_area, instructions_area, swap_legend_area, _, blocks_area] =
Layout::vertical([
Length(2), // header
Length(2), // instructions
Length(1), // swap key legend
Length(1), // gap
Fill(1), // blocks
])
.areas(area);
let [
header_area,
instructions_area,
swap_legend_area,
_,
blocks_area,
] = area.layout(&Layout::vertical([
Length(2), // header
Length(2), // instructions
Length(1), // swap key legend
Length(1), // gap
Fill(1), // blocks
]));
App::header().render(header_area, buf);
App::instructions().render(instructions_area, buf);
@@ -283,7 +277,7 @@ impl App {
}
fn swap_legend() -> impl Widget {
#[allow(unstable_name_collisions)]
#[expect(unstable_name_collisions)]
Paragraph::new(
Line::from(
[
@@ -324,20 +318,26 @@ impl App {
}
fn render_layout_blocks(&self, area: Rect, buf: &mut Buffer) {
let [user_constraints, area] = Layout::vertical([Length(3), Fill(1)])
.spacing(1)
.areas(area);
let main_layout = Layout::vertical([Length(3), Fill(1)]).spacing(1);
let [user_constraints, area] = area.layout(&main_layout);
self.render_user_constraints_legend(user_constraints, buf);
let [start, center, end, space_around, space_between] =
Layout::vertical([Length(7); 5]).areas(area);
let [
start,
center,
end,
space_between,
space_around,
space_evenly,
] = area.layout(&Layout::vertical([Length(7); 6]));
self.render_layout_block(Flex::Start, start, buf);
self.render_layout_block(Flex::Center, center, buf);
self.render_layout_block(Flex::End, end, buf);
self.render_layout_block(Flex::SpaceAround, space_around, buf);
self.render_layout_block(Flex::SpaceBetween, space_between, buf);
self.render_layout_block(Flex::SpaceAround, space_around, buf);
self.render_layout_block(Flex::SpaceEvenly, space_evenly, buf);
}
fn render_user_constraints_legend(&self, area: Rect, buf: &mut Buffer) {
@@ -351,8 +351,8 @@ impl App {
}
fn render_layout_block(&self, flex: Flex, area: Rect, buf: &mut Buffer) {
let [label_area, axis_area, blocks_area] =
Layout::vertical([Length(1), Max(1), Length(4)]).areas(area);
let layout = Layout::vertical([Length(1), Max(1), Length(4)]);
let [label_area, axis_area, blocks_area] = area.layout(&layout);
if label_area.height > 0 {
format!("Flex::{flex:?}").bold().render(label_area, buf);
@@ -472,7 +472,7 @@ impl ConstraintBlock {
} else {
main_color
};
if let Some(last_row) = area.rows().last() {
if let Some(last_row) = area.rows().next_back() {
buf.set_style(last_row, border_color);
}
}

View File

@@ -6,22 +6,18 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{
Constraint::{self, Fill, Length, Max, Min, Percentage, Ratio},
Layout, Rect,
},
style::{palette::tailwind, Color, Modifier, Style, Stylize},
symbols,
text::Line,
widgets::{
Block, Padding, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget,
Tabs, Widget,
},
DefaultTerminal,
use crossterm::event::{self, KeyCode};
use ratatui::buffer::Buffer;
use ratatui::layout::Constraint::{self, Fill, Length, Max, Min, Percentage, Ratio};
use ratatui::layout::{Layout, Rect};
use ratatui::style::palette::tailwind;
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{
Block, Padding, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget,
Tabs, Widget,
};
use ratatui::{DefaultTerminal, symbols};
use strum::{Display, EnumIter, FromRepr, IntoEnumIterator};
const SPACER_HEIGHT: u16 = 0;
@@ -40,10 +36,7 @@ const FILL_COLOR: Color = tailwind::SLATE.c950;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
#[derive(Default, Clone, Copy)]
@@ -76,7 +69,7 @@ enum AppState {
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
self.update_max_scroll_offset();
while self.is_running() {
terminal.draw(|frame| frame.render_widget(self, frame.area()))?;
@@ -85,7 +78,7 @@ impl App {
Ok(())
}
fn update_max_scroll_offset(&mut self) {
const fn update_max_scroll_offset(&mut self) {
self.max_scroll_offset = (self.selected_tab.get_example_count() - 1) * EXAMPLE_HEIGHT;
}
@@ -94,10 +87,7 @@ impl App {
}
fn handle_events(&mut self) -> Result<()> {
if let Event::Key(key) = event::read()? {
if key.kind != KeyEventKind::Press {
return Ok(());
}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.quit(),
KeyCode::Char('l') | KeyCode::Right => self.next(),
@@ -112,7 +102,7 @@ impl App {
Ok(())
}
fn quit(&mut self) {
const fn quit(&mut self) {
self.state = AppState::Quit;
}
@@ -128,7 +118,7 @@ impl App {
self.scroll_offset = 0;
}
fn up(&mut self) {
const fn up(&mut self) {
self.scroll_offset = self.scroll_offset.saturating_sub(1);
}
@@ -139,18 +129,18 @@ impl App {
.min(self.max_scroll_offset);
}
fn top(&mut self) {
const fn top(&mut self) {
self.scroll_offset = 0;
}
fn bottom(&mut self) {
const fn bottom(&mut self) {
self.scroll_offset = self.max_scroll_offset;
}
}
impl Widget for App {
fn render(self, area: Rect, buf: &mut Buffer) {
let [tabs, axis, demo] = Layout::vertical([Length(3), Length(3), Fill(0)]).areas(area);
let [tabs, axis, demo] = area.layout(&Layout::vertical([Length(3), Length(3), Fill(0)]));
self.render_tabs(tabs, buf);
Self::render_axis(axis, buf);
@@ -196,7 +186,7 @@ impl App {
///
/// This function renders the demo content into a separate buffer and then splices the buffer
/// into the main buffer. This is done to make it possible to handle scrolling easily.
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
fn render_demo(self, area: Rect, buf: &mut Buffer) {
// render demo content into a separate buffer so all examples fit we add an extra
// area.height to make sure the last example is fully visible even when the scroll offset is
@@ -251,7 +241,7 @@ impl SelectedTab {
}
const fn get_example_count(self) -> u16 {
#[allow(clippy::match_same_arms)]
#[expect(clippy::match_same_arms)]
match self {
Self::Length => 4,
Self::Percentage => 5,
@@ -291,8 +281,8 @@ impl Widget for SelectedTab {
impl SelectedTab {
fn render_length_example(area: Rect, buf: &mut Buffer) {
let [example1, example2, example3, _] =
Layout::vertical([Length(EXAMPLE_HEIGHT); 4]).areas(area);
let layout = Layout::vertical([Length(EXAMPLE_HEIGHT); 4]);
let [example1, example2, example3, _] = area.layout(&layout);
Example::new(&[Length(20), Length(20)]).render(example1, buf);
Example::new(&[Length(20), Min(20)]).render(example2, buf);
@@ -300,8 +290,8 @@ impl SelectedTab {
}
fn render_percentage_example(area: Rect, buf: &mut Buffer) {
let [example1, example2, example3, example4, example5, _] =
Layout::vertical([Length(EXAMPLE_HEIGHT); 6]).areas(area);
let layout = Layout::vertical([Length(EXAMPLE_HEIGHT); 6]);
let [example1, example2, example3, example4, example5, _] = area.layout(&layout);
Example::new(&[Percentage(75), Fill(0)]).render(example1, buf);
Example::new(&[Percentage(25), Fill(0)]).render(example2, buf);
@@ -311,8 +301,8 @@ impl SelectedTab {
}
fn render_ratio_example(area: Rect, buf: &mut Buffer) {
let [example1, example2, example3, example4, _] =
Layout::vertical([Length(EXAMPLE_HEIGHT); 5]).areas(area);
let layout = Layout::vertical([Length(EXAMPLE_HEIGHT); 5]);
let [example1, example2, example3, example4, _] = area.layout(&layout);
Example::new(&[Ratio(1, 2); 2]).render(example1, buf);
Example::new(&[Ratio(1, 4); 4]).render(example2, buf);
@@ -321,15 +311,15 @@ impl SelectedTab {
}
fn render_fill_example(area: Rect, buf: &mut Buffer) {
let [example1, example2, _] = Layout::vertical([Length(EXAMPLE_HEIGHT); 3]).areas(area);
let [example1, example2, _] = area.layout(&Layout::vertical([Length(EXAMPLE_HEIGHT); 3]));
Example::new(&[Fill(1), Fill(2), Fill(3)]).render(example1, buf);
Example::new(&[Fill(1), Percentage(50), Fill(1)]).render(example2, buf);
}
fn render_min_example(area: Rect, buf: &mut Buffer) {
let [example1, example2, example3, example4, example5, _] =
Layout::vertical([Length(EXAMPLE_HEIGHT); 6]).areas(area);
let layout = Layout::vertical([Length(EXAMPLE_HEIGHT); 6]);
let [example1, example2, example3, example4, example5, _] = area.layout(&layout);
Example::new(&[Percentage(100), Min(0)]).render(example1, buf);
Example::new(&[Percentage(100), Min(20)]).render(example2, buf);
@@ -339,8 +329,8 @@ impl SelectedTab {
}
fn render_max_example(area: Rect, buf: &mut Buffer) {
let [example1, example2, example3, example4, example5, _] =
Layout::vertical([Length(EXAMPLE_HEIGHT); 6]).areas(area);
let layout = Layout::vertical([Length(EXAMPLE_HEIGHT); 6]);
let [example1, example2, example3, example4, example5, _] = area.layout(&layout);
Example::new(&[Percentage(0), Max(0)]).render(example1, buf);
Example::new(&[Percentage(0), Max(20)]).render(example2, buf);
@@ -364,9 +354,10 @@ impl Example {
impl Widget for Example {
fn render(self, area: Rect, buf: &mut Buffer) {
let [area, _] =
Layout::vertical([Length(ILLUSTRATION_HEIGHT), Length(SPACER_HEIGHT)]).areas(area);
let blocks = Layout::horizontal(&self.constraints).split(area);
let vertical = Layout::vertical([Length(ILLUSTRATION_HEIGHT), Length(SPACER_HEIGHT)]);
let horizontal = Layout::horizontal(&self.constraints);
let [area, _] = area.layout(&vertical);
let blocks = area.layout_vec(&horizontal);
for (block, constraint) in blocks.iter().zip(&self.constraints) {
Self::illustration(*constraint, block.width).render(*block, buf);

View File

@@ -9,21 +9,17 @@
use std::{io::stdout, ops::ControlFlow, time::Duration};
use color_eyre::Result;
use ratatui::{
buffer::Buffer,
crossterm::{
event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, MouseButton, MouseEvent,
MouseEventKind,
},
execute,
},
layout::{Constraint, Layout, Rect},
style::{Color, Style},
text::Line,
widgets::{Paragraph, Widget},
DefaultTerminal, Frame,
use crossterm::event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, MouseButton,
MouseEvent, MouseEventKind,
};
use crossterm::execute;
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Flex, Layout, Rect};
use ratatui::style::{Color, Style};
use ratatui::text::Line;
use ratatui::widgets::{Paragraph, Widget};
use ratatui::{DefaultTerminal, Frame};
fn main() -> Result<()> {
color_eyre::install()?;
@@ -103,7 +99,7 @@ impl<'a> Button<'a> {
}
impl Widget for Button<'_> {
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
fn render(self, area: Rect, buf: &mut Buffer) {
let (background, text, shadow, highlight) = self.colors();
buf.set_style(area, Style::new().bg(background).fg(text));
@@ -151,15 +147,12 @@ fn run(mut terminal: DefaultTerminal) -> Result<()> {
let mut selected_button: usize = 0;
let mut button_states = [State::Selected, State::Normal, State::Normal];
loop {
terminal.draw(|frame| draw(frame, button_states))?;
terminal.draw(|frame| render(frame, button_states))?;
if !event::poll(Duration::from_millis(100))? {
continue;
}
match event::read()? {
Event::Key(key) => {
if key.kind != event::KeyEventKind::Press {
continue;
}
if handle_key_event(key, &mut button_states, &mut selected_button).is_break() {
break;
}
@@ -173,14 +166,14 @@ fn run(mut terminal: DefaultTerminal) -> Result<()> {
Ok(())
}
fn draw(frame: &mut Frame, states: [State; 3]) {
let vertical = Layout::vertical([
fn render(frame: &mut Frame, states: [State; 3]) {
let layout = Layout::vertical([
Constraint::Length(1),
Constraint::Max(3),
Constraint::Length(1),
Constraint::Min(0), // ignore remaining space
]);
let [title, buttons, help, _] = vertical.areas(frame.area());
let [title, buttons, help, _] = frame.area().layout(&layout);
frame.render_widget(
Paragraph::new("Custom Widget Example (mouse enabled)"),
@@ -191,13 +184,8 @@ fn draw(frame: &mut Frame, states: [State; 3]) {
}
fn render_buttons(frame: &mut Frame<'_>, area: Rect, states: [State; 3]) {
let horizontal = Layout::horizontal([
Constraint::Length(15),
Constraint::Length(15),
Constraint::Length(15),
Constraint::Min(0), // ignore remaining space
]);
let [red, green, blue, _] = horizontal.areas(area);
let layout = Layout::horizontal([Constraint::Length(15); 3]).flex(Flex::Start);
let [red, green, blue] = area.layout(&layout);
frame.render_widget(Button::new("Red").theme(RED).state(states[0]), red);
frame.render_widget(Button::new("Green").theme(GREEN).state(states[1]), green);
@@ -205,10 +193,13 @@ fn render_buttons(frame: &mut Frame<'_>, area: Rect, states: [State; 3]) {
}
fn handle_key_event(
key: event::KeyEvent,
key: KeyEvent,
button_states: &mut [State; 3],
selected_button: &mut usize,
) -> ControlFlow<()> {
if !key.is_press() {
return ControlFlow::Continue(());
}
match key.code {
KeyCode::Char('q') => return ControlFlow::Break(()),
KeyCode::Left | KeyCode::Char('h') => {

View File

@@ -7,11 +7,16 @@ rust-version.workspace = true
[features]
default = ["crossterm"]
crossterm = ["ratatui/crossterm"]
termion = ["ratatui/termion"]
termwiz = ["ratatui/termwiz"]
crossterm = ["ratatui/crossterm", "dep:crossterm"]
termion = ["ratatui/termion", "dep:termion"]
termwiz = ["ratatui/termwiz", "dep:termwiz"]
[dependencies]
clap = { version = "4.5.31", features = ["derive"] }
rand = "0.9.0"
clap.workspace = true
crossterm = { workspace = true, optional = true }
rand.workspace = true
ratatui.workspace = true
termwiz = { workspace = true, optional = true }
[target.'cfg(not(windows))'.dependencies]
termion = { workspace = true, optional = true }

View File

@@ -1,7 +1,5 @@
use rand::{
distr::{Distribution, Uniform},
rngs::ThreadRng,
};
use rand::distr::{Distribution, Uniform};
use rand::rngs::ThreadRng;
use ratatui::widgets::ListState;
const TASKS: [&str; 24] = [

View File

@@ -1,20 +1,17 @@
use std::{
error::Error,
io,
time::{Duration, Instant},
};
use std::error::Error;
use std::io;
use std::time::{Duration, Instant};
use ratatui::{
backend::{Backend, CrosstermBackend},
crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
},
Terminal,
use crossterm::event::{self, DisableMouseCapture, EnableMouseCapture, KeyCode};
use crossterm::execute;
use crossterm::terminal::{
EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
};
use ratatui::Terminal;
use ratatui::backend::{Backend, CrosstermBackend};
use crate::{app::App, ui};
use crate::app::App;
use crate::ui;
pub fn run(tick_rate: Duration, enhanced_graphics: bool) -> Result<(), Box<dyn Error>> {
// setup terminal
@@ -48,29 +45,29 @@ fn run_app<B: Backend>(
terminal: &mut Terminal<B>,
mut app: App,
tick_rate: Duration,
) -> io::Result<()> {
) -> Result<(), Box<dyn Error>>
where
B::Error: 'static,
{
let mut last_tick = Instant::now();
loop {
terminal.draw(|frame| ui::draw(frame, &mut app))?;
terminal.draw(|frame| ui::render(frame, &mut app))?;
let timeout = tick_rate.saturating_sub(last_tick.elapsed());
if event::poll(timeout)? {
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Left | KeyCode::Char('h') => app.on_left(),
KeyCode::Up | KeyCode::Char('k') => app.on_up(),
KeyCode::Right | KeyCode::Char('l') => app.on_right(),
KeyCode::Down | KeyCode::Char('j') => app.on_down(),
KeyCode::Char(c) => app.on_key(c),
_ => {}
}
}
}
}
if last_tick.elapsed() >= tick_rate {
if !event::poll(timeout)? {
app.on_tick();
last_tick = Instant::now();
continue;
}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('h') | KeyCode::Left => app.on_left(),
KeyCode::Char('j') | KeyCode::Down => app.on_down(),
KeyCode::Char('k') | KeyCode::Up => app.on_up(),
KeyCode::Char('l') | KeyCode::Right => app.on_right(),
KeyCode::Char(c) => app.on_key(c),
_ => {}
}
}
if app.should_quit {
return Ok(());

View File

@@ -13,7 +13,8 @@
//! [examples]: https://github.com/ratatui/ratatui/blob/main/examples
//! [examples readme]: https://github.com/ratatui/ratatui/blob/main/examples/README.md
use std::{error::Error, time::Duration};
use std::error::Error;
use std::time::Duration;
use clap::Parser;

View File

@@ -1,18 +1,18 @@
#![allow(dead_code)]
use std::{error::Error, io, sync::mpsc, thread, time::Duration};
use std::error::Error;
use std::sync::mpsc;
use std::time::Duration;
use std::{io, thread};
use ratatui::{
backend::{Backend, TermionBackend},
termion::{
event::Key,
input::{MouseTerminal, TermRead},
raw::IntoRawMode,
screen::IntoAlternateScreen,
},
Terminal,
};
use ratatui::Terminal;
use ratatui::backend::{Backend, TermionBackend};
use termion::event::Key;
use termion::input::{MouseTerminal, TermRead};
use termion::raw::IntoRawMode;
use termion::screen::IntoAlternateScreen;
use crate::{app::App, ui};
use crate::app::App;
use crate::ui;
pub fn run(tick_rate: Duration, enhanced_graphics: bool) -> Result<(), Box<dyn Error>> {
// setup terminal
@@ -36,10 +36,13 @@ fn run_app<B: Backend>(
terminal: &mut Terminal<B>,
mut app: App,
tick_rate: Duration,
) -> Result<(), Box<dyn Error>> {
) -> Result<(), Box<dyn Error>>
where
B::Error: 'static,
{
let events = events(tick_rate);
loop {
terminal.draw(|frame| ui::draw(frame, &mut app))?;
terminal.draw(|frame| ui::render(frame, &mut app))?;
match events.recv()? {
Event::Input(key) => match key {
@@ -75,12 +78,14 @@ fn events(tick_rate: Duration) -> mpsc::Receiver<Event> {
}
}
});
thread::spawn(move || loop {
if let Err(err) = tx.send(Event::Tick) {
eprintln!("{err}");
break;
thread::spawn(move || {
loop {
if let Err(err) = tx.send(Event::Tick) {
eprintln!("{err}");
break;
}
thread::sleep(tick_rate);
}
thread::sleep(tick_rate);
});
rx
}

View File

@@ -1,19 +1,14 @@
#![allow(dead_code)]
use std::{
error::Error,
time::{Duration, Instant},
};
use std::error::Error;
use std::time::{Duration, Instant};
use ratatui::{
backend::TermwizBackend,
termwiz::{
input::{InputEvent, KeyCode},
terminal::Terminal as TermwizTerminal,
},
Terminal,
};
use ratatui::Terminal;
use ratatui::backend::TermwizBackend;
use termwiz::input::{InputEvent, KeyCode};
use termwiz::terminal::Terminal as TermwizTerminal;
use crate::{app::App, ui};
use crate::app::App;
use crate::ui;
pub fn run(tick_rate: Duration, enhanced_graphics: bool) -> Result<(), Box<dyn Error>> {
let backend = TermwizBackend::new()?;
@@ -41,7 +36,7 @@ fn run_app(
) -> Result<(), Box<dyn Error>> {
let mut last_tick = Instant::now();
loop {
terminal.draw(|frame| ui::draw(frame, &mut app))?;
terminal.draw(|frame| ui::render(frame, &mut app))?;
let timeout = tick_rate.saturating_sub(last_tick.elapsed());
if let Some(input) = terminal

View File

@@ -1,19 +1,16 @@
use ratatui::{
layout::{Constraint, Layout, Rect},
style::{Color, Modifier, Style},
symbols,
text::{self, Span},
widgets::{
canvas::{self, Canvas, Circle, Map, MapResolution, Rectangle},
Axis, BarChart, Block, Cell, Chart, Dataset, Gauge, LineGauge, List, ListItem, Paragraph,
Row, Sparkline, Table, Tabs, Wrap,
},
Frame,
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{self, Span};
use ratatui::widgets::canvas::{self, Canvas, Circle, Map, MapResolution, Rectangle};
use ratatui::widgets::{
Axis, BarChart, Block, Cell, Chart, Dataset, Gauge, LineGauge, List, ListItem, Paragraph, Row,
Sparkline, Table, Tabs, Wrap,
};
use ratatui::{Frame, symbols};
use crate::app::App;
pub fn draw(frame: &mut Frame, app: &mut App) {
pub fn render(frame: &mut Frame, app: &mut App) {
let chunks = Layout::vertical([Constraint::Length(3), Constraint::Min(0)]).split(frame.area());
let tabs = app
.tabs
@@ -98,7 +95,7 @@ fn draw_gauges(frame: &mut Frame, app: &mut App, area: Rect) {
frame.render_widget(line_gauge, chunks[2]);
}
#[allow(clippy::too_many_lines)]
#[expect(clippy::too_many_lines)]
fn draw_charts(frame: &mut Frame, app: &mut App, area: Rect) {
let constraints = if app.show_chart {
vec![Constraint::Percentage(50), Constraint::Percentage(50)]
@@ -238,7 +235,9 @@ fn draw_charts(frame: &mut Frame, app: &mut App, area: Rect) {
fn draw_text(frame: &mut Frame, area: Rect) {
let text = vec![
text::Line::from("This is a paragraph with several lines. You can change style your text the way you want"),
text::Line::from(
"This is a paragraph with several lines. You can change style your text the way you want",
),
text::Line::from(""),
text::Line::from(vec![
Span::from("For example: "),
@@ -253,16 +252,17 @@ fn draw_text(frame: &mut Frame, area: Rect) {
Span::raw("Oh and if you didn't "),
Span::styled("notice", Style::default().add_modifier(Modifier::ITALIC)),
Span::raw(" you can "),
Span::styled("automatically", Style::default().add_modifier(Modifier::BOLD)),
Span::styled(
"automatically",
Style::default().add_modifier(Modifier::BOLD),
),
Span::raw(" "),
Span::styled("wrap", Style::default().add_modifier(Modifier::REVERSED)),
Span::raw(" your "),
Span::styled("text", Style::default().add_modifier(Modifier::UNDERLINED)),
Span::raw(".")
Span::raw("."),
]),
text::Line::from(
"One more thing is that it should display unicode characters: 10€"
),
text::Line::from("One more thing is that it should display unicode characters: 10€"),
];
let block = Block::bordered().title(Span::styled(
"Footer",

View File

@@ -6,14 +6,14 @@ edition.workspace = true
rust-version.workspace = true
[dependencies]
color-eyre = "0.6.3"
color-eyre.workspace = true
crossterm.workspace = true
indoc.workspace = true
itertools.workspace = true
palette = "0.7.6"
rand = "0.9.0"
rand_chacha = "0.9.0"
palette.workspace = true
rand.workspace = true
rand_chacha.workspace = true
ratatui = { workspace = true, features = ["all-widgets"] }
strum.workspace = true
time = "0.3.37"
unicode-width = "0.2.0"
time.workspace = true
unicode-width.workspace = true

View File

@@ -1,24 +1,19 @@
use std::time::Duration;
use color_eyre::{eyre::Context, Result};
use crossterm::event;
use color_eyre::Result;
use color_eyre::eyre::Context;
use crossterm::event::{self, KeyCode};
use itertools::Itertools;
use ratatui::{
buffer::Buffer,
crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind},
layout::{Constraint, Layout, Rect},
style::Color,
text::{Line, Span},
widgets::{Block, Tabs, Widget},
DefaultTerminal, Frame,
};
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::Color;
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Tabs, Widget};
use ratatui::{DefaultTerminal, Frame};
use strum::{Display, EnumIter, FromRepr, IntoEnumIterator};
use crate::{
destroy,
tabs::{AboutTab, EmailTab, RecipeTab, TracerouteTab, WeatherTab},
THEME,
};
use crate::tabs::{AboutTab, EmailTab, RecipeTab, TracerouteTab, WeatherTab};
use crate::{THEME, destroy};
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct App {
@@ -54,7 +49,7 @@ impl App {
pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
while self.is_running() {
terminal
.draw(|frame| self.draw(frame))
.draw(|frame| self.render(frame))
.wrap_err("terminal.draw")?;
self.handle_events()?;
}
@@ -65,8 +60,8 @@ impl App {
self.mode != Mode::Quit
}
/// Draw a single frame of the app.
fn draw(&self, frame: &mut Frame) {
/// Render a single frame of the app.
fn render(&self, frame: &mut Frame) {
frame.render_widget(self, frame.area());
if self.mode == Mode::Destroy {
destroy::destroy(frame);
@@ -82,25 +77,20 @@ impl App {
if !event::poll(timeout)? {
return Ok(());
}
match event::read()? {
Event::Key(key) if key.kind == KeyEventKind::Press => self.handle_key_press(key),
_ => {}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.mode = Mode::Quit,
KeyCode::Char('h') | KeyCode::Left => self.prev_tab(),
KeyCode::Char('l') | KeyCode::Right | KeyCode::Tab => self.next_tab(),
KeyCode::Char('k') | KeyCode::Up => self.prev(),
KeyCode::Char('j') | KeyCode::Down => self.next(),
KeyCode::Char('d') | KeyCode::Delete => self.destroy(),
_ => {}
};
}
Ok(())
}
fn handle_key_press(&mut self, key: KeyEvent) {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.mode = Mode::Quit,
KeyCode::Char('h') | KeyCode::Left => self.prev_tab(),
KeyCode::Char('l') | KeyCode::Right => self.next_tab(),
KeyCode::Char('k') | KeyCode::Up => self.prev(),
KeyCode::Char('j') | KeyCode::Down => self.next(),
KeyCode::Char('d') | KeyCode::Delete => self.destroy(),
_ => {}
};
}
fn prev(&mut self) {
match self.tab {
Tab::About => self.about_tab.prev_row(),
@@ -139,12 +129,12 @@ impl App {
/// matter, but for larger apps this can be a significant performance improvement.
impl Widget for &App {
fn render(self, area: Rect, buf: &mut Buffer) {
let vertical = Layout::vertical([
let layout = Layout::vertical([
Constraint::Length(1),
Constraint::Min(0),
Constraint::Length(1),
]);
let [title_bar, tab, bottom_bar] = vertical.areas(area);
let [title_bar, tab, bottom_bar] = area.layout(&layout);
Block::new().style(THEME.root).render(area, buf);
self.render_title_bar(title_bar, buf);
@@ -156,7 +146,7 @@ impl Widget for &App {
impl App {
fn render_title_bar(&self, area: Rect, buf: &mut Buffer) {
let layout = Layout::horizontal([Constraint::Min(0), Constraint::Length(43)]);
let [title, tabs] = layout.areas(area);
let [title, tabs] = area.layout(&layout);
Span::styled("Ratatui", THEME.app_title).render(title, buf);
let titles = Tab::iter().map(Tab::title);

View File

@@ -1,5 +1,8 @@
use palette::{IntoColor, Okhsv, Srgb};
use ratatui::{buffer::Buffer, layout::Rect, style::Color, widgets::Widget};
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::style::Color;
use ratatui::widgets::Widget;
/// A widget that renders a color swatch of RGB colors.
///
@@ -9,7 +12,7 @@ use ratatui::{buffer::Buffer, layout::Rect, style::Color, widgets::Widget};
pub struct RgbSwatch;
impl Widget for RgbSwatch {
#[allow(clippy::cast_precision_loss, clippy::similar_names)]
#[expect(clippy::cast_precision_loss, clippy::similar_names)]
fn render(self, area: Rect, buf: &mut Buffer) {
for (yi, y) in (area.top()..area.bottom()).enumerate() {
let value = f32::from(area.height) - yi as f32;

View File

@@ -1,13 +1,11 @@
use rand::Rng;
use rand_chacha::rand_core::SeedableRng;
use ratatui::{
buffer::Buffer,
layout::{Flex, Layout, Rect},
style::{Color, Style},
text::Text,
widgets::Widget,
Frame,
};
use ratatui::Frame;
use ratatui::buffer::Buffer;
use ratatui::layout::{Flex, Layout, Rect};
use ratatui::style::{Color, Style};
use ratatui::text::Text;
use ratatui::widgets::Widget;
/// delay the start of the animation so it doesn't start immediately
const DELAY: usize = 120;
@@ -34,7 +32,7 @@ pub fn destroy(frame: &mut Frame<'_>) {
///
/// Each pick some random pixels and move them each down one row. This is a very inefficient way to
/// do this, but it works well enough for this demo.
#[allow(
#[expect(
clippy::cast_possible_truncation,
clippy::cast_precision_loss,
clippy::cast_sign_loss
@@ -76,7 +74,7 @@ fn drip(frame_count: usize, area: Rect, buf: &mut Buffer) {
}
/// draw some text fading in and out from black to red and back
#[allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)]
#[expect(clippy::cast_possible_truncation, clippy::cast_precision_loss)]
fn text(frame_count: usize, area: Rect, buf: &mut Buffer) {
let sub_frame = frame_count.saturating_sub(TEXT_DELAY);
if sub_frame == 0 {
@@ -128,7 +126,7 @@ fn blend(mask_color: Color, cell_color: Color, percentage: f64) -> Color {
let green = f64::from(mask_green).mul_add(percentage, f64::from(cell_green) * remain);
let blue = f64::from(mask_blue).mul_add(percentage, f64::from(cell_blue) * remain);
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
#[expect(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
Color::Rgb(red as u8, green as u8, blue as u8)
}
@@ -136,7 +134,7 @@ fn blend(mask_color: Color, cell_color: Color, percentage: f64) -> Color {
fn centered_rect(area: Rect, width: u16, height: u16) -> Rect {
let horizontal = Layout::horizontal([width]).flex(Flex::Center);
let vertical = Layout::vertical([height]).flex(Flex::Center);
let [area] = vertical.areas(area);
let [area] = horizontal.areas(area);
let [area] = area.layout(&vertical);
let [area] = area.layout(&horizontal);
area
}

View File

@@ -29,16 +29,13 @@ use std::io::stdout;
use app::App;
use color_eyre::Result;
use crossterm::{
execute,
terminal::{EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{layout::Rect, TerminalOptions, Viewport};
use crossterm::execute;
use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen};
use ratatui::layout::Rect;
use ratatui::{TerminalOptions, Viewport};
pub use self::{
colors::{color_from_oklab, RgbSwatch},
theme::THEME,
};
pub use self::colors::{RgbSwatch, color_from_oklab};
pub use self::theme::THEME;
fn main() -> Result<()> {
color_eyre::install()?;

View File

@@ -1,9 +1,7 @@
use ratatui::{
buffer::Buffer,
layout::{Alignment, Constraint, Layout, Margin, Rect},
widgets::{
Block, Borders, Clear, MascotEyeColor, Padding, Paragraph, RatatuiMascot, Widget, Wrap,
},
use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Constraint, Layout, Margin, Rect};
use ratatui::widgets::{
Block, Borders, Clear, MascotEyeColor, Padding, Paragraph, RatatuiMascot, Widget, Wrap,
};
use crate::{RgbSwatch, THEME};
@@ -26,8 +24,8 @@ impl AboutTab {
impl Widget for AboutTab {
fn render(self, area: Rect, buf: &mut Buffer) {
RgbSwatch.render(area, buf);
let horizontal = Layout::horizontal([Constraint::Length(34), Constraint::Min(0)]);
let [logo_area, description] = horizontal.areas(area);
let layout = Layout::horizontal([Constraint::Length(34), Constraint::Min(0)]);
let [logo_area, description] = area.layout(&layout);
render_crate_description(description, buf);
let eye_state = if self.row_index % 2 == 0 {
MascotEyeColor::Default

View File

@@ -1,13 +1,11 @@
use itertools::Itertools;
use ratatui::{
buffer::Buffer,
layout::{Constraint, Layout, Margin, Rect},
style::{Styled, Stylize},
text::Line,
widgets::{
Block, BorderType, Borders, Clear, List, ListItem, ListState, Padding, Paragraph,
Scrollbar, ScrollbarState, StatefulWidget, Tabs, Widget,
},
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Margin, Rect};
use ratatui::style::{Styled, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{
Block, BorderType, Borders, Clear, List, ListItem, ListState, Padding, Paragraph, Scrollbar,
ScrollbarState, StatefulWidget, Tabs, Widget,
};
use unicode_width::UnicodeWidthStr;
@@ -73,15 +71,15 @@ impl Widget for EmailTab {
horizontal: 2,
});
Clear.render(area, buf);
let vertical = Layout::vertical([Constraint::Length(5), Constraint::Min(0)]);
let [inbox, email] = vertical.areas(area);
let layout = Layout::vertical([Constraint::Length(5), Constraint::Min(0)]);
let [inbox, email] = area.layout(&layout);
render_inbox(self.row_index, inbox, buf);
render_email(self.row_index, email, buf);
}
}
fn render_inbox(selected_index: usize, area: Rect, buf: &mut Buffer) {
let vertical = Layout::vertical([Constraint::Length(1), Constraint::Min(0)]);
let [tabs, inbox] = vertical.areas(area);
let layout = Layout::vertical([Constraint::Length(1), Constraint::Min(0)]);
let [tabs, inbox] = area.layout(&layout);
let theme = THEME.email;
Tabs::new(vec![" Inbox ", " Sent ", " Drafts "])
.style(theme.tabs)
@@ -132,8 +130,8 @@ fn render_email(selected_index: usize, area: Rect, buf: &mut Buffer) {
let inner = block.inner(area);
block.render(area, buf);
if let Some(email) = email {
let vertical = Layout::vertical([Constraint::Length(3), Constraint::Min(0)]);
let [headers_area, body_area] = vertical.areas(inner);
let layout = Layout::vertical([Constraint::Length(3), Constraint::Min(0)]);
let [headers_area, body_area] = inner.layout(&layout);
let headers = vec![
Line::from(vec![
"From: ".set_style(theme.header),

View File

@@ -1,13 +1,11 @@
use itertools::Itertools;
use ratatui::{
buffer::Buffer,
layout::{Alignment, Constraint, Layout, Margin, Rect},
style::{Style, Stylize},
text::Line,
widgets::{
Block, Clear, Padding, Paragraph, Row, Scrollbar, ScrollbarOrientation, ScrollbarState,
StatefulWidget, Table, TableState, Widget, Wrap,
},
use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Constraint, Layout, Margin, Rect};
use ratatui::style::{Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{
Block, Clear, Padding, Paragraph, Row, Scrollbar, ScrollbarOrientation, ScrollbarState,
StatefulWidget, Table, TableState, Widget, Wrap,
};
use crate::{RgbSwatch, THEME};
@@ -19,7 +17,7 @@ struct Ingredient {
}
impl Ingredient {
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
fn height(&self) -> u16 {
self.name.lines().count() as u16
}
@@ -137,8 +135,8 @@ impl Widget for RecipeTab {
horizontal: 2,
vertical: 1,
});
let [recipe, ingredients] =
Layout::horizontal([Constraint::Length(44), Constraint::Min(0)]).areas(area);
let layout = Layout::horizontal([Constraint::Length(44), Constraint::Min(0)]);
let [recipe, ingredients] = area.layout(&layout);
render_recipe(recipe, buf);
render_ingredients(self.row_index, ingredients, buf);

View File

@@ -1,14 +1,12 @@
use itertools::Itertools;
use ratatui::{
buffer::Buffer,
layout::{Alignment, Constraint, Layout, Margin, Rect},
style::{Styled, Stylize},
symbols::Marker,
widgets::{
canvas::{self, Canvas, Map, MapResolution, Points},
Block, BorderType, Clear, Padding, Row, Scrollbar, ScrollbarOrientation, ScrollbarState,
Sparkline, StatefulWidget, Table, TableState, Widget,
},
use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Constraint, Layout, Margin, Rect};
use ratatui::style::{Styled, Stylize};
use ratatui::symbols::Marker;
use ratatui::widgets::canvas::{self, Canvas, Map, MapResolution, Points};
use ratatui::widgets::{
Block, BorderType, Clear, Padding, Row, Scrollbar, ScrollbarOrientation, ScrollbarState,
Sparkline, StatefulWidget, Table, TableState, Widget,
};
use crate::{RgbSwatch, THEME};
@@ -41,8 +39,8 @@ impl Widget for TracerouteTab {
Block::new().style(THEME.content).render(area, buf);
let horizontal = Layout::horizontal([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]);
let vertical = Layout::vertical([Constraint::Min(0), Constraint::Length(3)]);
let [left, map] = horizontal.areas(area);
let [hops, pings] = vertical.areas(left);
let [left, map] = area.layout(&horizontal);
let [hops, pings] = left.layout(&vertical);
render_hops(self.row_index, hops, buf);
render_ping(self.row_index, pings, buf);

View File

@@ -1,18 +1,14 @@
use itertools::Itertools;
use palette::Okhsv;
use ratatui::{
buffer::Buffer,
layout::{Constraint, Direction, Layout, Margin, Rect},
style::{Color, Style, Stylize},
symbols,
widgets::{
calendar::{CalendarEventStore, Monthly},
Bar, BarChart, BarGroup, Block, Clear, LineGauge, Padding, Widget,
},
};
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Direction, Layout, Margin, Rect};
use ratatui::style::{Color, Style};
use ratatui::symbols;
use ratatui::widgets::calendar::{CalendarEventStore, Monthly};
use ratatui::widgets::{Bar, BarChart, BarGroup, Block, Clear, LineGauge, Padding, Widget};
use time::OffsetDateTime;
use crate::{color_from_oklab, RgbSwatch, THEME};
use crate::{RgbSwatch, THEME, color_from_oklab};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct WeatherTab {
@@ -45,16 +41,16 @@ impl Widget for WeatherTab {
horizontal: 2,
vertical: 1,
});
let [main, _, gauges] = Layout::vertical([
let tab_layout = Layout::vertical([
Constraint::Min(0),
Constraint::Length(1),
Constraint::Length(1),
])
.areas(area);
let [calendar, charts] =
Layout::horizontal([Constraint::Length(23), Constraint::Min(0)]).areas(main);
let [simple, horizontal] =
Layout::vertical([Constraint::Length(29), Constraint::Min(0)]).areas(charts);
]);
let [main, _, gauges] = area.layout(&tab_layout);
let main_layout = Layout::horizontal([Constraint::Length(23), Constraint::Min(0)]);
let [calendar, charts] = main.layout(&main_layout);
let charts_layout = Layout::vertical([Constraint::Length(29), Constraint::Min(0)]);
let [simple, horizontal] = charts.layout(&charts_layout);
render_calendar(calendar, buf);
render_simple_barchart(simple, buf);
@@ -134,14 +130,14 @@ fn render_horizontal_barchart(area: Rect, buf: &mut Buffer) {
.render(area, buf);
}
#[allow(clippy::cast_precision_loss)]
#[expect(clippy::cast_precision_loss)]
pub fn render_gauge(progress: usize, area: Rect, buf: &mut Buffer) {
let percent = (progress * 3).min(100) as f64;
render_line_gauge(percent, area, buf);
}
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
fn render_line_gauge(percent: f64, area: Rect, buf: &mut Buffer) {
// cycle color hue based on the percent for a neat effect yellow -> red
let hue = 90.0 - (percent as f32 * 0.6);

View File

@@ -11,37 +11,29 @@
use std::num::NonZeroUsize;
use color_eyre::Result;
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{
Alignment,
Constraint::{self, Fill, Length, Max, Min, Percentage, Ratio},
Flex, Layout, Rect,
},
style::{palette::tailwind, Color, Modifier, Style, Stylize},
symbols::{self, line},
text::{Line, Text},
widgets::{
Block, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget, Tabs,
Widget,
},
DefaultTerminal,
use crossterm::event::{self, KeyCode};
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::Constraint::{self, Fill, Length, Max, Min, Percentage, Ratio};
use ratatui::layout::{Alignment, Flex, Layout, Rect};
use ratatui::style::palette::tailwind;
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::symbols::{self, line};
use ratatui::text::{Line, Text};
use ratatui::widgets::{
Block, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget, Tabs, Widget,
};
use strum::{Display, EnumIter, FromRepr, IntoEnumIterator};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
const EXAMPLE_DATA: &[(&str, &[Constraint])] = &[
(
"Min(u16) takes any excess space always",
&[Length(10), Min(10), Max(10), Percentage(10), Ratio(1,10)],
&[Length(10), Min(10), Max(10), Percentage(10), Ratio(1, 10)],
),
(
"Fill(u16) takes any excess space always",
@@ -49,20 +41,18 @@ const EXAMPLE_DATA: &[(&str, &[Constraint])] = &[
),
(
"Here's all constraints in one line",
&[Length(10), Min(10), Max(10), Percentage(10), Ratio(1,10), Fill(1)],
),
(
"",
&[Max(50), Min(50)],
),
(
"",
&[Max(20), Length(10)],
),
(
"",
&[Max(20), Length(10)],
&[
Length(10),
Min(10),
Max(10),
Percentage(10),
Ratio(1, 10),
Fill(1),
],
),
("", &[Max(50), Min(50)]),
("", &[Max(20), Length(10)]),
("", &[Max(20), Length(10)]),
(
"Min grows always but also allows Fill to grow",
&[Percentage(50), Fill(1), Fill(2), Min(50)],
@@ -72,44 +62,58 @@ const EXAMPLE_DATA: &[(&str, &[Constraint])] = &[
&[Length(20), Length(20), Percentage(20)],
),
("", &[Length(20), Percentage(20), Length(20)]),
("A lowest priority constraint will be broken before a high priority constraint", &[Ratio(1,4), Percentage(20)]),
("`Length` is higher priority than `Percentage`", &[Percentage(20), Length(10)]),
("`Min/Max` is higher priority than `Length`", &[Length(10), Max(20)]),
(
"A lowest priority constraint will be broken before a high priority constraint",
&[Ratio(1, 4), Percentage(20)],
),
(
"`Length` is higher priority than `Percentage`",
&[Percentage(20), Length(10)],
),
(
"`Min/Max` is higher priority than `Length`",
&[Length(10), Max(20)],
),
("", &[Length(100), Min(20)]),
("`Length` is higher priority than `Min/Max`", &[Max(20), Length(10)]),
(
"`Length` is higher priority than `Min/Max`",
&[Max(20), Length(10)],
),
("", &[Min(20), Length(90)]),
("Fill is the lowest priority and will fill any excess space", &[Fill(1), Ratio(1, 4)]),
("Fill can be used to scale proportionally with other Fill blocks", &[Fill(1), Percentage(20), Fill(2)]),
(
"Fill is the lowest priority and will fill any excess space",
&[Fill(1), Ratio(1, 4)],
),
(
"Fill can be used to scale proportionally with other Fill blocks",
&[Fill(1), Percentage(20), Fill(2)],
),
("", &[Ratio(1, 3), Percentage(20), Ratio(2, 3)]),
("Legacy will stretch the last lowest priority constraint\nStretch will only stretch equal weighted constraints", &[Length(20), Length(15)]),
(
"Legacy will stretch the last lowest priority constraint\nStretch will only stretch equal weighted constraints",
&[Length(20), Length(15)],
),
("", &[Percentage(20), Length(15)]),
("`Fill(u16)` fills up excess space, but is lower priority to spacers.\ni.e. Fill will only have widths in Flex::Stretch and Flex::Legacy", &[Fill(1), Fill(1)]),
(
"`Fill(u16)` fills up excess space, but is lower priority to spacers.\ni.e. Fill will only have widths in Flex::Stretch and Flex::Legacy",
&[Fill(1), Fill(1)],
),
("", &[Length(20), Length(20)]),
(
"When not using `Flex::Stretch` or `Flex::Legacy`,\n`Min(u16)` and `Max(u16)` collapse to their lowest values",
&[Min(20), Max(20)],
),
(
"",
&[Max(20)],
),
("", &[Max(20)]),
("", &[Min(20), Max(20), Length(20), Length(20)]),
("", &[Fill(0), Fill(0)]),
(
"`Fill(1)` can be to scale with respect to other `Fill(2)`",
&[Fill(1), Fill(2)],
),
(
"",
&[Fill(1), Min(10), Max(10), Fill(2)],
),
("", &[Fill(1), Min(10), Max(10), Fill(2)]),
(
"`Fill(0)` collapses if there are other non-zero `Fill(_)`\nconstraints. e.g. `[Fill(0), Fill(0), Fill(1)]`:",
&[
Fill(0),
Fill(0),
Fill(1),
],
&[Fill(0), Fill(0), Fill(1)],
),
];
@@ -149,11 +153,12 @@ enum SelectedTab {
Center,
End,
SpaceAround,
SpaceEvenly,
SpaceBetween,
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
// increase the layout cache to account for the number of layout events. This ensures that
// layout is not generally reprocessed on every frame (which would lead to possible janky
// results when there are more than one possible solution to the requested layout). This
@@ -173,8 +178,8 @@ impl App {
}
fn handle_events(&mut self) -> Result<()> {
match event::read()? {
Event::Key(key) if key.kind == KeyEventKind::Press => match key.code {
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.quit(),
KeyCode::Char('l') | KeyCode::Right => self.next(),
KeyCode::Char('h') | KeyCode::Left => self.previous(),
@@ -185,8 +190,7 @@ impl App {
KeyCode::Char('+') => self.increment_spacing(),
KeyCode::Char('-') => self.decrement_spacing(),
_ => (),
},
_ => {}
}
}
Ok(())
}
@@ -199,7 +203,7 @@ impl App {
self.selected_tab = self.selected_tab.previous();
}
fn up(&mut self) {
const fn up(&mut self) {
self.scroll_offset = self.scroll_offset.saturating_sub(1);
}
@@ -210,7 +214,7 @@ impl App {
.min(max_scroll_offset());
}
fn top(&mut self) {
const fn top(&mut self) {
self.scroll_offset = 0;
}
@@ -218,15 +222,15 @@ impl App {
self.scroll_offset = max_scroll_offset();
}
fn increment_spacing(&mut self) {
const fn increment_spacing(&mut self) {
self.spacing = self.spacing.saturating_add(1);
}
fn decrement_spacing(&mut self) {
const fn decrement_spacing(&mut self) {
self.spacing = self.spacing.saturating_sub(1);
}
fn quit(&mut self) {
const fn quit(&mut self) {
self.state = AppState::Quit;
}
}
@@ -252,7 +256,7 @@ fn example_height() -> u16 {
impl Widget for App {
fn render(self, area: Rect, buf: &mut Buffer) {
let layout = Layout::vertical([Length(3), Length(1), Fill(0)]);
let [tabs, axis, demo] = layout.areas(area);
let [tabs, axis, demo] = area.layout(&layout);
self.tabs().render(tabs, buf);
let scroll_needed = self.render_demo(demo, buf);
let axis_width = if scroll_needed {
@@ -298,7 +302,7 @@ impl App {
/// into the main buffer. This is done to make it possible to handle scrolling easily.
///
/// Returns bool indicating whether scroll was needed
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
fn render_demo(self, area: Rect, buf: &mut Buffer) -> bool {
// render demo content into a separate buffer so all examples fit we add an extra
// area.height to make sure the last example is fully visible even when the scroll offset is
@@ -366,8 +370,9 @@ impl SelectedTab {
Self::Start => SKY.c400,
Self::Center => SKY.c300,
Self::End => SKY.c200,
Self::SpaceAround => INDIGO.c400,
Self::SpaceEvenly => INDIGO.c400,
Self::SpaceBetween => INDIGO.c300,
Self::SpaceAround => INDIGO.c500,
};
format!(" {text} ").fg(color).bg(Color::Black).into()
}
@@ -382,8 +387,9 @@ impl StatefulWidget for SelectedTab {
Self::Start => Self::render_examples(area, buf, Flex::Start, spacing),
Self::Center => Self::render_examples(area, buf, Flex::Center, spacing),
Self::End => Self::render_examples(area, buf, Flex::End, spacing),
Self::SpaceAround => Self::render_examples(area, buf, Flex::SpaceAround, spacing),
Self::SpaceEvenly => Self::render_examples(area, buf, Flex::SpaceEvenly, spacing),
Self::SpaceBetween => Self::render_examples(area, buf, Flex::SpaceBetween, spacing),
Self::SpaceAround => Self::render_examples(area, buf, Flex::SpaceAround, spacing),
}
}
}
@@ -415,7 +421,7 @@ impl Widget for Example {
fn render(self, area: Rect, buf: &mut Buffer) {
let title_height = get_description_height(&self.description);
let layout = Layout::vertical([Length(title_height), Fill(0)]);
let [title, illustrations] = layout.areas(area);
let [title, illustrations] = area.layout(&layout);
let (blocks, spacers) = Layout::horizontal(&self.constraints)
.flex(self.flex)
@@ -515,7 +521,7 @@ const fn color_for_constraint(constraint: Constraint) -> Color {
}
}
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
fn get_description_height(s: &str) -> u16 {
if s.is_empty() {
0

View File

@@ -8,15 +8,14 @@
use std::time::Duration;
use color_eyre::Result;
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Alignment, Constraint, Layout, Rect},
style::{palette::tailwind, Color, Style, Stylize},
text::{Line, Span},
widgets::{Block, Borders, Gauge, Padding, Paragraph, Widget},
DefaultTerminal,
};
use crossterm::event::{self, KeyCode};
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::palette::tailwind;
use ratatui::style::{Color, Style, Stylize};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Gauge, Padding, Paragraph, Widget};
const GAUGE1_COLOR: Color = tailwind::RED.c800;
const GAUGE2_COLOR: Color = tailwind::GREEN.c800;
@@ -44,14 +43,11 @@ enum AppState {
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
while self.state != AppState::Quitting {
terminal.draw(|frame| frame.render_widget(&self, frame.area()))?;
self.handle_events()?;
@@ -80,38 +76,37 @@ impl App {
fn handle_events(&mut self) -> Result<()> {
let timeout = Duration::from_secs_f32(1.0 / 20.0);
if event::poll(timeout)? {
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Char(' ') | KeyCode::Enter => self.start(),
KeyCode::Char('q') | KeyCode::Esc => self.quit(),
_ => {}
}
}
if !event::poll(timeout)? {
return Ok(());
}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char(' ') | KeyCode::Enter => self.start(),
KeyCode::Char('q') | KeyCode::Esc => self.quit(),
_ => {}
}
}
Ok(())
}
fn start(&mut self) {
const fn start(&mut self) {
self.state = AppState::Started;
}
fn quit(&mut self) {
const fn quit(&mut self) {
self.state = AppState::Quitting;
}
}
impl Widget for &App {
#[allow(clippy::similar_names)]
#[expect(clippy::similar_names)]
fn render(self, area: Rect, buf: &mut Buffer) {
use Constraint::{Length, Min, Ratio};
let layout = Layout::vertical([Length(2), Min(0), Length(1)]);
let [header_area, gauge_area, footer_area] = layout.areas(area);
let [header_area, gauge_area, footer_area] = area.layout(&layout);
let layout = Layout::vertical([Ratio(1, 4); 4]);
let [gauge1_area, gauge2_area, gauge3_area, gauge4_area] = layout.areas(gauge_area);
let [gauge1_area, gauge2_area, gauge3_area, gauge4_area] = gauge_area.layout(&layout);
render_header(header_area, buf);
render_footer(footer_area, buf);
@@ -187,7 +182,7 @@ impl App {
}
}
fn title_block(title: &str) -> Block {
fn title_block(title: &str) -> Block<'_> {
let title = Line::from(title).centered();
Block::new()
.borders(Borders::NONE)

View File

@@ -7,12 +7,11 @@
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use std::time::Duration;
use color_eyre::{eyre::Context, Result};
use ratatui::{
crossterm::event::{self, Event, KeyCode},
widgets::Paragraph,
DefaultTerminal, Frame,
};
use color_eyre::Result;
use color_eyre::eyre::Context;
use crossterm::event::{self, KeyCode};
use ratatui::widgets::Paragraph;
use ratatui::{DefaultTerminal, Frame};
/// This is a bare minimum example. There are many approaches to running an application loop, so
/// this is not meant to be prescriptive. It is only meant to demonstrate the basic setup and
@@ -22,19 +21,16 @@ use ratatui::{
/// and exits when the user presses 'q'.
fn main() -> Result<()> {
color_eyre::install()?; // augment errors / panics with easy to read messages
let terminal = ratatui::init();
let app_result = run(terminal).context("app loop failed");
ratatui::restore();
app_result
ratatui::run(run).context("failed to run app")
}
/// Run the application loop. This is where you would handle events and update the application
/// state. This example exits when the user presses 'q'. Other styles of application loops are
/// possible, for example, you could have multiple application states and switch between them based
/// on events, or you could have a single application state and update it based on events.
fn run(mut terminal: DefaultTerminal) -> Result<()> {
fn run(terminal: &mut DefaultTerminal) -> Result<()> {
loop {
terminal.draw(draw)?;
terminal.draw(render)?;
if should_quit()? {
break;
}
@@ -44,7 +40,7 @@ fn run(mut terminal: DefaultTerminal) -> Result<()> {
/// Render the application. This is where you would draw the application UI. This example draws a
/// greeting.
fn draw(frame: &mut Frame) {
fn render(frame: &mut Frame) {
let greeting = Paragraph::new("Hello World! (press 'q' to quit)");
frame.render_widget(greeting, frame.area());
}
@@ -56,9 +52,11 @@ fn draw(frame: &mut Frame) {
/// updating the application state, without blocking the event loop for too long.
fn should_quit() -> Result<bool> {
if event::poll(Duration::from_millis(250)).context("event poll failed")? {
if let Event::Key(key) = event::read().context("event read failed")? {
return Ok(KeyCode::Char('q') == key.code);
}
let q_pressed = event::read()
.context("event read failed")?
.as_key_press_event()
.is_some_and(|key| key.code == KeyCode::Char('q'));
return Ok(q_pressed);
}
Ok(false)
}

View File

@@ -7,47 +7,28 @@
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
/// [OSC 8]: https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
use color_eyre::Result;
use crossterm::event;
use itertools::Itertools;
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode},
layout::Rect,
style::Stylize,
text::{Line, Text},
widgets::Widget,
DefaultTerminal,
};
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::style::Stylize;
use ratatui::text::{Line, Text};
use ratatui::widgets::Widget;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::new().run(terminal);
ratatui::restore();
app_result
}
struct App {
hyperlink: Hyperlink<'static>,
}
let text = Line::from(vec!["Example ".into(), "hyperlink".blue()]);
let hyperlink = Hyperlink::new(text, "https://example.com");
impl App {
fn new() -> Self {
let text = Line::from(vec!["Example ".into(), "hyperlink".blue()]);
let hyperlink = Hyperlink::new(text, "https://example.com");
Self { hyperlink }
}
fn run(self, mut terminal: DefaultTerminal) -> Result<()> {
ratatui::run(|terminal| {
loop {
terminal.draw(|frame| frame.render_widget(&self.hyperlink, frame.area()))?;
if let Event::Key(key) = event::read()? {
if matches!(key.code, KeyCode::Char('q') | KeyCode::Esc) {
break;
}
terminal.draw(|frame| frame.render_widget(&hyperlink, frame.area()))?;
if event::read()?.is_key_press() {
break Ok(());
}
}
Ok(())
}
})
}
/// A hyperlink widget that renders a hyperlink in the terminal using [OSC 8].

View File

@@ -8,7 +8,7 @@ rust-version.workspace = true
[dependencies]
color-eyre.workspace = true
crossterm.workspace = true
rand = "0.9.0"
rand.workspace = true
ratatui.workspace = true
[lints]

View File

@@ -15,17 +15,14 @@ use std::{
};
use color_eyre::Result;
use crossterm::event;
use rand::distr::{Distribution, Uniform};
use ratatui::{
backend::Backend,
crossterm::event,
layout::{Constraint, Layout, Rect},
style::{Color, Modifier, Style},
symbols,
text::{Line, Span},
widgets::{Block, Gauge, LineGauge, List, ListItem, Paragraph, Widget},
Frame, Terminal, TerminalOptions, Viewport,
};
use ratatui::backend::Backend;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Gauge, LineGauge, List, ListItem, Paragraph, Widget};
use ratatui::{Frame, Terminal, TerminalOptions, Viewport, symbols};
fn main() -> Result<()> {
color_eyre::install()?;
@@ -110,7 +107,7 @@ fn input_handling(tx: mpsc::Sender<Event>) {
event::Event::Key(key) => tx.send(Event::Input(key)).unwrap(),
event::Event::Resize(_, _) => tx.send(Event::Resize).unwrap(),
_ => {}
};
}
}
if last_tick.elapsed() >= tick_rate {
tx.send(Event::Tick).unwrap();
@@ -120,7 +117,7 @@ fn input_handling(tx: mpsc::Sender<Event>) {
});
}
#[allow(clippy::cast_precision_loss, clippy::needless_pass_by_value)]
#[expect(clippy::cast_precision_loss, clippy::needless_pass_by_value)]
fn workers(tx: mpsc::Sender<Event>) -> Vec<Worker> {
(0..4)
.map(|id| {
@@ -160,17 +157,20 @@ fn downloads() -> Downloads {
}
}
#[allow(clippy::needless_pass_by_value)]
fn run(
terminal: &mut Terminal<impl Backend>,
#[expect(clippy::needless_pass_by_value)]
fn run<B: Backend>(
terminal: &mut Terminal<B>,
workers: Vec<Worker>,
mut downloads: Downloads,
rx: mpsc::Receiver<Event>,
) -> Result<()> {
) -> Result<()>
where
B::Error: Send + Sync + 'static,
{
let mut redraw = true;
loop {
if redraw {
terminal.draw(|frame| draw(frame, &downloads))?;
terminal.draw(|frame| render(frame, &downloads))?;
}
redraw = true;
@@ -215,14 +215,14 @@ fn run(
break;
}
}
};
}
}
};
}
}
Ok(())
}
fn draw(frame: &mut Frame, downloads: &Downloads) {
fn render(frame: &mut Frame, downloads: &Downloads) {
let area = frame.area();
let block = Block::new().title(Line::from("Progress").centered());
@@ -230,12 +230,12 @@ fn draw(frame: &mut Frame, downloads: &Downloads) {
let vertical = Layout::vertical([Constraint::Length(2), Constraint::Length(4)]).margin(1);
let horizontal = Layout::horizontal([Constraint::Percentage(20), Constraint::Percentage(80)]);
let [progress_area, main] = vertical.areas(area);
let [list_area, gauge_area] = horizontal.areas(main);
let [progress_area, main] = area.layout(&vertical);
let [list_area, gauge_area] = main.layout(&horizontal);
// total progress
let done = NUM_DOWNLOADS - downloads.pending.len() - downloads.in_progress.len();
#[allow(clippy::cast_precision_loss)]
#[expect(clippy::cast_precision_loss)]
let progress = LineGauge::default()
.filled_style(Style::default().fg(Color::Blue))
.label(format!("{done}/{NUM_DOWNLOADS}"))
@@ -265,7 +265,7 @@ fn draw(frame: &mut Frame, downloads: &Downloads) {
let list = List::new(items);
frame.render_widget(list, list_area);
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
for (i, (_, download)) in downloads.in_progress.iter().enumerate() {
let gauge = Gauge::default()
.gauge_style(Style::default().fg(Color::Yellow))

View File

@@ -23,5 +23,5 @@ Some more ideas for handling focus can be found in:
- [`focusable`](https://crates.io/crates/focusable) (see also [Ratatui forum
post](https://forum.ratatui.rs/t/focusable-crate-manage-focus-state-for-your-widgets/73))
- [`rat-focus`](https://crates.io/crates/rat-focus)
- A useful [`Bevy` discssion](https://github.com/bevyengine/bevy/discussions/15374) about focus
- A useful [`Bevy` discussion](https://github.com/bevyengine/bevy/discussions/15374) about focus
more generally.

View File

@@ -15,25 +15,19 @@
//! [`tui-textarea`]: https://crates.io/crates/tui-textarea
use color_eyre::Result;
use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind};
use ratatui::{
buffer::Buffer,
layout::{Constraint, Layout, Offset, Rect},
style::Stylize,
text::Line,
widgets::Widget,
DefaultTerminal, Frame,
};
use crossterm::event::{self, KeyCode, KeyEvent};
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Offset, Rect};
use ratatui::style::Stylize;
use ratatui::text::Line;
use ratatui::widgets::Widget;
use ratatui::{DefaultTerminal, Frame};
use serde::Serialize;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let result = App::default().run(terminal);
ratatui::restore();
// serialize the form to JSON if the user submitted it, otherwise print "Canceled"
match result {
match ratatui::run(|terminal| App::default().run(terminal)) {
Ok(Some(form)) => println!("{}", serde_json::to_string_pretty(&form)?),
Ok(None) => println!("Canceled"),
Err(err) => eprintln!("{err}"),
@@ -56,7 +50,7 @@ enum AppState {
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<Option<InputForm>> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<Option<InputForm>> {
while self.state == AppState::Running {
terminal.draw(|frame| self.render(frame))?;
self.handle_events()?;
@@ -73,13 +67,12 @@ impl App {
}
fn handle_events(&mut self) -> Result<()> {
match event::read()? {
Event::Key(event) if event.kind == KeyEventKind::Press => match event.code {
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Esc => self.state = AppState::Cancelled,
KeyCode::Enter => self.state = AppState::Submitted,
_ => self.form.on_key_press(event),
},
_ => {}
_ => self.form.on_key_press(key),
}
}
Ok(())
}
@@ -122,8 +115,8 @@ impl InputForm {
///
/// The cursor is placed at the end of the focused field.
fn render(&self, frame: &mut Frame) {
let [first_name_area, last_name_area, age_area] =
Layout::vertical(Constraint::from_lengths([1, 1, 1])).areas(frame.area());
let layout = Layout::vertical(Constraint::from_lengths([1, 1, 1]));
let [first_name_area, last_name_area, age_area] = frame.area().layout(&layout);
frame.render_widget(&self.first_name, first_name_area);
frame.render_widget(&self.last_name, last_name_area);
@@ -192,11 +185,11 @@ impl StringField {
impl Widget for &StringField {
fn render(self, area: Rect, buf: &mut Buffer) {
let constraints = [
let layout = Layout::horizontal([
Constraint::Length(self.label.len() as u16 + 2),
Constraint::Fill(1),
];
let [label_area, value_area] = Layout::horizontal(constraints).areas(area);
]);
let [label_area, value_area] = area.layout(&layout);
let label = Line::from_iter([self.label, ": "]).bold();
label.render(label_area, buf);
self.value.clone().render(value_area, buf);
@@ -238,14 +231,14 @@ impl AgeField {
KeyCode::Up | KeyCode::Char('k') => self.increment(),
KeyCode::Down | KeyCode::Char('j') => self.decrement(),
_ => {}
};
}
}
fn increment(&mut self) {
self.value = self.value.saturating_add(1).min(Self::MAX);
}
fn decrement(&mut self) {
const fn decrement(&mut self) {
self.value = self.value.saturating_sub(1);
}
@@ -257,11 +250,11 @@ impl AgeField {
impl Widget for &AgeField {
fn render(self, area: Rect, buf: &mut Buffer) {
let constraints = [
let layout = Layout::horizontal([
Constraint::Length(self.label.len() as u16 + 2),
Constraint::Fill(1),
];
let [label_area, value_area] = Layout::horizontal(constraints).areas(area);
]);
let [label_area, value_area] = area.layout(&layout);
let label = Line::from_iter([self.label, ": "]).bold();
let value = self.value.to_string();
label.render(label_area, buf);

View File

@@ -1,31 +1,23 @@
/// A minimal example of a Ratatui application.
///
/// This is a bare minimum example. There are many approaches to running an application loop,
/// so this is not meant to be prescriptive. See the [examples] folder for more complete
/// examples. In particular, the [hello-world] example is a good starting point.
///
/// This example runs with the Ratatui library code in the branch that you are currently
/// reading. See the [`latest`] branch for the code which works with the most recent Ratatui
/// release.
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
/// [examples]: https://github.com/ratatui/ratatui/blob/main/examples
/// [hello-world]: https://github.com/ratatui/ratatui/blob/main/examples/apps/hello-world
use crossterm::event::{self, Event};
use ratatui::{text::Text, Frame};
fn main() {
let mut terminal = ratatui::init();
loop {
terminal.draw(draw).expect("failed to draw frame");
if matches!(event::read().expect("failed to read event"), Event::Key(_)) {
break;
//! A minimal example of a Ratatui application.
//!
//! This is a bare minimum example. There are many approaches to running an application loop,
//! so this is not meant to be prescriptive. See the [examples] folder for more complete
//! examples. In particular, the [hello-world] example is a good starting point.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//! [examples]: https://github.com/ratatui/ratatui/blob/main/examples
//! [hello-world]: https://github.com/ratatui/ratatui/blob/main/examples/apps/hello-world
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(());
}
}
}
ratatui::restore();
}
fn draw(frame: &mut Frame) {
let text = Text::raw("Hello World!");
frame.render_widget(text, frame.area());
})
}

View File

@@ -10,40 +10,31 @@
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use std::{error::Error, iter::once, result};
use crossterm::event;
use itertools::Itertools;
use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Constraint, Layout},
style::{Color, Modifier, Style, Stylize},
text::Line,
widgets::Paragraph,
DefaultTerminal, Frame,
};
use ratatui::Frame;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::Paragraph;
type Result<T> = result::Result<T, Box<dyn Error>>;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = run(terminal);
ratatui::restore();
app_result
}
fn run(mut terminal: DefaultTerminal) -> Result<()> {
loop {
terminal.draw(draw)?;
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') {
return Ok(());
ratatui::run(|terminal| {
loop {
terminal.draw(render)?;
if event::read()?.is_key_press() {
break Ok(());
}
}
}
})
}
fn draw(frame: &mut Frame) {
let vertical = Layout::vertical([Constraint::Length(1), Constraint::Min(0)]);
let [text_area, main_area] = vertical.areas(frame.area());
fn render(frame: &mut Frame) {
let layout = Layout::vertical([Constraint::Length(1), Constraint::Min(0)]);
let [text_area, main_area] = frame.area().layout(&layout);
frame.render_widget(
Paragraph::new("Note: not all terminals support all modifiers")
.style(Style::default().fg(Color::Red).add_modifier(Modifier::BOLD)),

View File

@@ -9,8 +9,8 @@ rust-version.workspace = true
color-eyre.workspace = true
crossterm.workspace = true
## a collection of line drawing algorithms (e.g. Bresenham's line algorithm)
line_drawing = "1.0.1"
rand = "0.9.0"
line_drawing = "1"
rand.workspace = true
ratatui.workspace = true
[lints]

View File

@@ -9,27 +9,19 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use crossterm::{
event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, MouseEvent,
MouseEventKind,
},
execute,
};
use ratatui::{
layout::{Position, Rect, Size},
style::{Color, Stylize},
symbols,
text::Line,
DefaultTerminal, Frame,
use crossterm::event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, MouseEvent,
MouseEventKind,
};
use crossterm::execute;
use ratatui::layout::{Position, Rect, Size};
use ratatui::style::{Color, Stylize};
use ratatui::text::Line;
use ratatui::{DefaultTerminal, Frame, symbols};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let result = MouseDrawingApp::default().run(terminal);
ratatui::restore();
result
ratatui::run(|terminal| MouseDrawingApp::default().run(terminal))
}
#[derive(Default)]
@@ -45,7 +37,7 @@ struct MouseDrawingApp {
}
impl MouseDrawingApp {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
execute!(std::io::stdout(), EnableMouseCapture)?;
while !self.should_exit {
terminal.draw(|frame| self.render(frame))?;
@@ -65,8 +57,11 @@ impl MouseDrawingApp {
}
/// Quit the app if the user presses 'q' or 'Esc'
fn on_key_event(&mut self, event: KeyEvent) {
match event.code {
fn on_key_event(&mut self, key: KeyEvent) {
if !key.is_press() {
return;
}
match key.code {
KeyCode::Char(' ') => {
self.current_color = Color::Rgb(rand::random(), rand::random(), rand::random());
}

View File

@@ -29,73 +29,60 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
/// [Color Eyre recipe]: https://ratatui.rs/recipes/apps/color-eyre
use color_eyre::{eyre::bail, Result};
use ratatui::{
crossterm::event::{self, Event, KeyCode},
text::Line,
widgets::{Block, Paragraph},
DefaultTerminal, Frame,
};
use color_eyre::{Result, eyre::bail};
use crossterm::event::{self, KeyCode};
use ratatui::Frame;
use ratatui::text::Line;
use ratatui::widgets::{Block, Paragraph};
#[derive(Debug)]
enum PanicHandlerState {
Enabled,
Disabled,
}
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::new().run(terminal);
ratatui::restore();
app_result
}
struct App {
hook_enabled: bool,
}
impl App {
const fn new() -> Self {
Self { hook_enabled: true }
}
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
let mut panic_hook_state = PanicHandlerState::Enabled;
ratatui::run(|terminal| {
loop {
terminal.draw(|frame| self.draw(frame))?;
if let Event::Key(key) = event::read()? {
terminal.draw(|frame| render(frame, &panic_hook_state))?;
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('p') => panic!("intentional demo panic"),
KeyCode::Char('e') => bail!("intentional demo error"),
KeyCode::Char('h') => {
let _ = std::panic::take_hook();
self.hook_enabled = false;
panic_hook_state = PanicHandlerState::Disabled;
}
KeyCode::Char('q') => return Ok(()),
_ => {}
}
}
}
}
fn draw(&self, frame: &mut Frame) {
let text = vec![
if self.hook_enabled {
Line::from("HOOK IS CURRENTLY **ENABLED**")
} else {
Line::from("HOOK IS CURRENTLY **DISABLED**")
},
Line::from(""),
Line::from("Press `p` to cause a panic"),
Line::from("Press `e` to cause an error"),
Line::from("Press `h` to disable the panic hook"),
Line::from("Press `q` to quit"),
Line::from(""),
Line::from("When your app panics without a panic hook, you will likely have to"),
Line::from("reset your terminal afterwards with the `reset` command"),
Line::from(""),
Line::from("Try first with the panic handler enabled, and then with it disabled"),
Line::from("to see the difference"),
];
let paragraph = Paragraph::new(text)
.block(Block::bordered().title("Panic Handler Demo"))
.centered();
frame.render_widget(paragraph, frame.area());
}
})
}
fn render(frame: &mut Frame, state: &PanicHandlerState) {
let text = vec![
Line::from(format!("Panic hook is currently: {state:?}")),
Line::from(""),
Line::from("Press `p` to cause a panic"),
Line::from("Press `e` to cause an error"),
Line::from("Press `h` to disable the panic hook"),
Line::from("Press `q` to quit"),
Line::from(""),
Line::from("When your app panics without a panic hook, you will likely have to"),
Line::from("reset your terminal afterwards with the `reset` command"),
Line::from(""),
Line::from("Try first with the panic handler enabled, and then with it disabled"),
Line::from("to see the difference"),
];
let paragraph = Paragraph::new(text)
.block(Block::bordered().title("Panic Handler Demo"))
.centered();
frame.render_widget(paragraph, frame.area());
}

View File

@@ -1,84 +1,70 @@
/// A Ratatui example that demonstrates how to handle popups.
// See also https://github.com/joshka/tui-popup and
// https://github.com/sephiroth74/tui-confirm-dialog
///
/// This example runs with the Ratatui library code in the branch that you are currently
/// reading. See the [`latest`] branch for the code which works with the most recent Ratatui
/// release.
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//! A Ratatui example that demonstrates how to handle popups.
//! See also:
//! - <https://github.com/joshka/tui-popup> and
//! - <https://github.com/sephiroth74/tui-confirm-dialog>
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Constraint, Flex, Layout, Rect},
style::Stylize,
widgets::{Block, Clear, Paragraph, Wrap},
DefaultTerminal, Frame,
};
use crossterm::event::{self, KeyCode};
use ratatui::Frame;
use ratatui::layout::{Constraint, Flex, Layout, Rect};
use ratatui::style::Stylize;
use ratatui::text::Line;
use ratatui::widgets::{Block, Clear};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
}
#[derive(Default)]
struct App {
show_popup: bool,
}
// This flag will be toggled when the user presses 'p'. This could be stored in an app struct
// if you have more state to manage than just this flag.
let mut show_popup = false;
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
ratatui::run(|terminal| {
loop {
terminal.draw(|frame| self.draw(frame))?;
terminal.draw(|frame| render(frame, show_popup))?;
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Char('q') => return Ok(()),
KeyCode::Char('p') => self.show_popup = !self.show_popup,
_ => {}
}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') => return Ok(()),
KeyCode::Char('p') => show_popup = !show_popup,
_ => {}
}
}
}
}
})
}
fn draw(&self, frame: &mut Frame) {
let area = frame.area();
fn render(frame: &mut Frame, show_popup: bool) {
let area = frame.area();
let vertical = Layout::vertical([Constraint::Percentage(20), Constraint::Percentage(80)]);
let [instructions, content] = vertical.areas(area);
let layout = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]);
let [instructions, content] = area.layout(&layout);
let text = if self.show_popup {
"Press p to close the popup"
} else {
"Press p to show the popup"
};
let paragraph = Paragraph::new(text.slow_blink())
.centered()
.wrap(Wrap { trim: true });
frame.render_widget(paragraph, instructions);
frame.render_widget(
Line::from("Press 'p' to toggle popup, 'q' to quit").centered(),
instructions,
);
let block = Block::bordered().title("Content").on_blue();
frame.render_widget(block, content);
frame.render_widget(Block::bordered().title("Content").on_blue(), content);
if self.show_popup {
let block = Block::bordered().title("Popup");
let area = popup_area(area, 60, 20);
frame.render_widget(Clear, area); //this clears out the background
frame.render_widget(block, area);
}
if show_popup {
let popup = Block::bordered().title("Popup");
let popup_area = centered_area(area, 60, 20);
// clears out any background in the area before rendering the popup
frame.render_widget(Clear, popup_area);
frame.render_widget(popup, popup_area);
}
}
/// helper function to create a centered rect using up certain percentage of the available rect `r`
fn popup_area(area: Rect, percent_x: u16, percent_y: u16) -> Rect {
/// Create a centered rect using up certain percentage of the available rect
fn centered_area(area: Rect, percent_x: u16, percent_y: u16) -> Rect {
let vertical = Layout::vertical([Constraint::Percentage(percent_y)]).flex(Flex::Center);
let horizontal = Layout::horizontal([Constraint::Percentage(percent_x)]).flex(Flex::Center);
let [area] = vertical.areas(area);
let [area] = horizontal.areas(area);
let [area] = area.layout(&vertical);
let [area] = area.layout(&horizontal);
area
}

View File

@@ -0,0 +1,13 @@
[package]
name = "release-header"
publish = false
license.workspace = true
edition.workspace = true
rust-version.workspace = true
[dependencies]
color-eyre.workspace = true
ratatui.workspace = true
[lints]
workspace = true

View File

@@ -0,0 +1,13 @@
# Release Header
Generates a banner for Ratatui releases featuring a Ratatui logo, version info, and a list of crates.
Used for README.md, documentation, and release materials. Updated for every release starting with v0.30.0 "Bryndza".
## Usage
```bash
cargo run --p release-header
```
Press any key to exit. Creates a fixed 68x16 terminal viewport.

View File

@@ -0,0 +1,171 @@
//! Generates a terminal banner for Ratatui releases featuring a Ratatui logo, version info, and
//! a list of crates.
//!
//! Used for README.md, documentation, and release materials. Updated for every release starting
//! with v0.30.0 "Bryndza".
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use std::io::stdout;
use std::iter::zip;
use ratatui::crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen};
use ratatui::crossterm::{event, execute};
use ratatui::layout::{Constraint, Flex, Layout, Margin, Rect, Spacing};
use ratatui::style::{Color, Stylize};
use ratatui::symbols::merge::MergeStrategy;
use ratatui::text::Line;
use ratatui::widgets::{Block, BorderType, Padding, Paragraph, RatatuiLogo};
use ratatui::{DefaultTerminal, Frame, TerminalOptions, Viewport};
const SEMVER: &str = "0.30.0";
const RELEASE_NAME: &str = "Bryndza";
const MAIN_DISHES: [&str; 4] = [
"> ratatui",
"> ratatui-core",
"> ratatui-widgets",
"> ratatui-macros",
];
const BACKENDS: [&str; 3] = [
"> ratatui-crossterm",
"> ratatui-termion",
"> ratatui-termwiz",
];
const FG_COLOR: Color = Color::Rgb(246, 214, 187); // #F6D6BB
const BG_COLOR: Color = Color::Rgb(20, 20, 50); // #141432
const MENU_BORDER_COLOR: Color = Color::Rgb(255, 255, 160); // #FFFFA0
enum Rainbow {
Red,
Orange,
Yellow,
Green,
Blue,
Indigo,
Violet,
}
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
let viewport = Viewport::Fixed(Rect::new(0, 0, 68, 16));
let terminal = ratatui::init_with_options(TerminalOptions { viewport });
execute!(stdout(), EnterAlternateScreen).expect("failed to enter alternate screen");
let result = run(terminal);
execute!(stdout(), LeaveAlternateScreen).expect("failed to leave alternate screen");
ratatui::restore();
result
}
fn run(mut terminal: DefaultTerminal) -> color_eyre::Result<()> {
loop {
terminal.draw(render)?;
if event::read()?.is_key_press() {
break Ok(());
}
}
}
fn render(frame: &mut Frame) {
let area = frame.area();
frame.buffer_mut().set_style(area, (FG_COLOR, BG_COLOR));
let logo_width = 29;
let menu_width = 23;
let padding = 2; // Padding between logo and menu
let menu_borders = 3;
let height = MAIN_DISHES.len() as u16 + BACKENDS.len() as u16 + menu_borders;
let width = logo_width + menu_width + padding;
let center_area = area.centered(Constraint::Length(width), Constraint::Length(height));
let layout = Layout::horizontal(Constraint::from_lengths([logo_width, padding, menu_width]));
let [logo_area, _, menu_area] = center_area.layout(&layout);
render_logo(frame, logo_area);
render_menu(frame, menu_area);
}
fn render_logo(frame: &mut Frame, area: Rect) {
let area = area.inner(Margin::new(1, 0));
let layout = Layout::vertical(Constraint::from_lengths([6, 2, 1])).flex(Flex::End);
let [shadow_area, logo_area, version_area] = area.layout(&layout);
// Divide the logo into letter sections for individual coloring, then render a block for each
// letter with a color based on the row index.
let letter_layout = Layout::horizontal(Constraint::from_lengths([5, 4, 4, 4, 4, 5, 1]));
for (row_index, row) in shadow_area.rows().enumerate() {
for (rainbow, letter_area) in zip(Rainbow::ROYGBIV, row.layout_vec(&letter_layout)) {
let color = rainbow.gradient_color(row_index);
frame.render_widget(Block::new().style(color), letter_area);
}
// Render the Ratatui logo truncated.
frame.render_widget(RatatuiLogo::small(), row);
}
frame.render_widget(Block::new().style(FG_COLOR), logo_area);
frame.render_widget(RatatuiLogo::small(), logo_area);
frame.render_widget(format!("v{SEMVER} \"{RELEASE_NAME}\"").dim(), version_area);
}
impl Rainbow {
const RED_GRADIENT: [u8; 6] = [41, 43, 50, 68, 104, 156];
const GREEN_GRADIENT: [u8; 6] = [24, 30, 41, 65, 105, 168];
const BLUE_GRADIENT: [u8; 6] = [55, 57, 62, 78, 113, 166];
const AMBIENT_GRADIENT: [u8; 6] = [17, 18, 20, 25, 40, 60];
const ROYGBIV: [Self; 7] = [
Self::Red,
Self::Orange,
Self::Yellow,
Self::Green,
Self::Blue,
Self::Indigo,
Self::Violet,
];
fn gradient_color(&self, row: usize) -> Color {
let ambient = Self::AMBIENT_GRADIENT[row];
let red = Self::RED_GRADIENT[row];
let green = Self::GREEN_GRADIENT[row];
let blue = Self::BLUE_GRADIENT[row];
let blue_sat = Self::AMBIENT_GRADIENT[row].saturating_mul(6 - row as u8);
let (r, g, b) = match self {
Self::Red => (red, ambient, blue_sat),
Self::Orange => (red, green / 2, blue_sat),
Self::Yellow => (red, green, blue_sat),
Self::Green => (ambient, green, blue_sat),
Self::Blue => (ambient, ambient, blue.max(blue_sat)),
Self::Indigo => (blue, ambient, blue.max(blue_sat)),
Self::Violet => (red, ambient, blue.max(blue_sat)),
};
Color::Rgb(r, g, b)
}
}
fn render_menu(frame: &mut Frame, area: Rect) {
let layout = Layout::vertical(Constraint::from_lengths([
MAIN_DISHES.len() as u16 + 2,
BACKENDS.len() as u16 + 2,
]))
.spacing(Spacing::Overlap(1)); // Overlap to merge borders
let [main_dishes_area, backends_area] = area.layout(&layout);
render_menu_block(frame, main_dishes_area, "Main Courses", &MAIN_DISHES);
render_menu_block(frame, backends_area, "Pairings", &BACKENDS);
}
fn render_menu_block(frame: &mut Frame, area: Rect, title: &str, menu_items: &[&str]) {
let menu_block = Block::bordered()
.border_type(BorderType::Rounded)
.border_style(MENU_BORDER_COLOR)
.padding(Padding::horizontal(1))
.merge_borders(MergeStrategy::Fuzzy)
.title(title);
let menu_lines: Vec<Line> = menu_items.iter().map(|&item| Line::from(item)).collect();
frame.render_widget(Paragraph::new(menu_lines).block(menu_block), area);
}

View File

@@ -11,15 +11,13 @@
use std::time::{Duration, Instant};
use color_eyre::Result;
use ratatui::{
crossterm::event::{self, Event, KeyCode},
layout::{Alignment, Constraint, Layout, Margin},
style::{Color, Style, Stylize},
symbols::scrollbar,
text::{Line, Masked, Span},
widgets::{Block, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState},
DefaultTerminal, Frame,
};
use crossterm::event::{self, KeyCode};
use ratatui::layout::{Alignment, Constraint, Layout, Margin};
use ratatui::style::{Color, Style, Stylize};
use ratatui::symbols::scrollbar;
use ratatui::text::{Line, Masked, Span};
use ratatui::widgets::{Block, Paragraph, Scrollbar, ScrollbarOrientation, ScrollbarState};
use ratatui::{DefaultTerminal, Frame};
#[derive(Default)]
struct App {
@@ -31,58 +29,60 @@ struct App {
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
let tick_rate = Duration::from_millis(250);
let mut last_tick = Instant::now();
loop {
terminal.draw(|frame| self.draw(frame))?;
terminal.draw(|frame| self.render(frame))?;
let timeout = tick_rate.saturating_sub(last_tick.elapsed());
if event::poll(timeout)? {
if let Event::Key(key) = event::read()? {
match key.code {
KeyCode::Char('q') => return Ok(()),
KeyCode::Char('j') | KeyCode::Down => {
self.vertical_scroll = self.vertical_scroll.saturating_add(1);
self.vertical_scroll_state =
self.vertical_scroll_state.position(self.vertical_scroll);
}
KeyCode::Char('k') | KeyCode::Up => {
self.vertical_scroll = self.vertical_scroll.saturating_sub(1);
self.vertical_scroll_state =
self.vertical_scroll_state.position(self.vertical_scroll);
}
KeyCode::Char('h') | KeyCode::Left => {
self.horizontal_scroll = self.horizontal_scroll.saturating_sub(1);
self.horizontal_scroll_state = self
.horizontal_scroll_state
.position(self.horizontal_scroll);
}
KeyCode::Char('l') | KeyCode::Right => {
self.horizontal_scroll = self.horizontal_scroll.saturating_add(1);
self.horizontal_scroll_state = self
.horizontal_scroll_state
.position(self.horizontal_scroll);
}
_ => {}
}
}
}
if last_tick.elapsed() >= tick_rate {
if !event::poll(timeout)? {
last_tick = Instant::now();
continue;
}
if let Some(key) = event::read()?.as_key_press_event() {
match key.code {
KeyCode::Char('q') => return Ok(()),
KeyCode::Char('j') | KeyCode::Down => self.scroll_down(),
KeyCode::Char('k') | KeyCode::Up => self.scroll_up(),
KeyCode::Char('h') | KeyCode::Left => self.scroll_left(),
KeyCode::Char('l') | KeyCode::Right => self.scroll_right(),
_ => {}
}
}
}
}
#[allow(clippy::too_many_lines, clippy::cast_possible_truncation)]
fn draw(&mut self, frame: &mut Frame) {
const fn scroll_down(&mut self) {
self.vertical_scroll = self.vertical_scroll.saturating_add(1);
self.vertical_scroll_state = self.vertical_scroll_state.position(self.vertical_scroll);
}
const fn scroll_up(&mut self) {
self.vertical_scroll = self.vertical_scroll.saturating_sub(1);
self.vertical_scroll_state = self.vertical_scroll_state.position(self.vertical_scroll);
}
const fn scroll_left(&mut self) {
self.horizontal_scroll = self.horizontal_scroll.saturating_sub(1);
self.horizontal_scroll_state = self
.horizontal_scroll_state
.position(self.horizontal_scroll);
}
const fn scroll_right(&mut self) {
self.horizontal_scroll = self.horizontal_scroll.saturating_add(1);
self.horizontal_scroll_state = self
.horizontal_scroll_state
.position(self.horizontal_scroll);
}
#[expect(clippy::too_many_lines, clippy::cast_possible_truncation)]
fn render(&mut self, frame: &mut Frame) {
let area = frame.area();
// Words made "loooong" to demonstrate line breaking.

View File

@@ -8,7 +8,7 @@ rust-version.workspace = true
[dependencies]
color-eyre.workspace = true
crossterm.workspace = true
fakeit = "1.1"
fakeit.workspace = true
itertools.workspace = true
ratatui.workspace = true
unicode-width.workspace = true

View File

@@ -6,19 +6,16 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use crossterm::event::KeyModifiers;
use crossterm::event::{self, KeyCode, KeyModifiers};
use itertools::Itertools;
use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Constraint, Layout, Margin, Rect},
style::{self, Color, Modifier, Style, Stylize},
text::Text,
widgets::{
Block, BorderType, Cell, HighlightSpacing, Paragraph, Row, Scrollbar, ScrollbarOrientation,
ScrollbarState, Table, TableState,
},
DefaultTerminal, Frame,
use ratatui::layout::{Constraint, Layout, Margin, Rect};
use ratatui::style::{self, Color, Modifier, Style, Stylize};
use ratatui::text::Text;
use ratatui::widgets::{
Block, BorderType, Cell, HighlightSpacing, Paragraph, Row, Scrollbar, ScrollbarOrientation,
ScrollbarState, Table, TableState,
};
use ratatui::{DefaultTerminal, Frame};
use style::palette::tailwind;
use unicode_width::UnicodeWidthStr;
@@ -37,10 +34,7 @@ const ITEM_HEIGHT: usize = 4;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::new().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::new().run(terminal))
}
struct TableColors {
buffer_bg: Color,
@@ -117,6 +111,7 @@ impl App {
items: data_vec,
}
}
pub fn next_row(&mut self) {
let i = match self.state.selected() {
Some(i) => {
@@ -155,46 +150,44 @@ impl App {
self.state.select_previous_column();
}
pub fn next_color(&mut self) {
pub const fn next_color(&mut self) {
self.color_index = (self.color_index + 1) % PALETTES.len();
}
pub fn previous_color(&mut self) {
pub const fn previous_color(&mut self) {
let count = PALETTES.len();
self.color_index = (self.color_index + count - 1) % count;
}
pub fn set_colors(&mut self) {
pub const fn set_colors(&mut self) {
self.colors = TableColors::new(&PALETTES[self.color_index]);
}
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
loop {
terminal.draw(|frame| self.draw(frame))?;
terminal.draw(|frame| self.render(frame))?;
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press {
let shift_pressed = key.modifiers.contains(KeyModifiers::SHIFT);
match key.code {
KeyCode::Char('q') | KeyCode::Esc => return Ok(()),
KeyCode::Char('j') | KeyCode::Down => self.next_row(),
KeyCode::Char('k') | KeyCode::Up => self.previous_row(),
KeyCode::Char('l') | KeyCode::Right if shift_pressed => self.next_color(),
KeyCode::Char('h') | KeyCode::Left if shift_pressed => {
self.previous_color();
}
KeyCode::Char('l') | KeyCode::Right => self.next_column(),
KeyCode::Char('h') | KeyCode::Left => self.previous_column(),
_ => {}
if let Some(key) = event::read()?.as_key_press_event() {
let shift_pressed = key.modifiers.contains(KeyModifiers::SHIFT);
match key.code {
KeyCode::Char('q') | KeyCode::Esc => return Ok(()),
KeyCode::Char('j') | KeyCode::Down => self.next_row(),
KeyCode::Char('k') | KeyCode::Up => self.previous_row(),
KeyCode::Char('l') | KeyCode::Right if shift_pressed => self.next_color(),
KeyCode::Char('h') | KeyCode::Left if shift_pressed => {
self.previous_color();
}
KeyCode::Char('l') | KeyCode::Right => self.next_column(),
KeyCode::Char('h') | KeyCode::Left => self.previous_column(),
_ => {}
}
}
}
}
fn draw(&mut self, frame: &mut Frame) {
let vertical = &Layout::vertical([Constraint::Min(5), Constraint::Length(4)]);
let rects = vertical.split(frame.area());
fn render(&mut self, frame: &mut Frame) {
let layout = Layout::vertical([Constraint::Min(5), Constraint::Length(4)]);
let rects = frame.area().layout_vec(&layout);
self.set_colors();
@@ -335,7 +328,7 @@ fn constraint_len_calculator(items: &[Data]) -> (u16, u16, u16) {
.max()
.unwrap_or(0);
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
(name_len as u16, address_len as u16, email_len as u16)
}

View File

@@ -6,22 +6,17 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use ratatui::{
buffer::Buffer,
crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind},
layout::{Constraint, Layout, Rect},
style::{
palette::tailwind::{BLUE, GREEN, SLATE},
Color, Modifier, Style, Stylize,
},
symbols,
text::Line,
widgets::{
Block, Borders, HighlightSpacing, List, ListItem, ListState, Padding, Paragraph,
StatefulWidget, Widget, Wrap,
},
DefaultTerminal,
use crossterm::event::{self, KeyCode, KeyEvent};
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::palette::tailwind::{BLUE, GREEN, SLATE};
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{
Block, Borders, HighlightSpacing, List, ListItem, ListState, Padding, Paragraph,
StatefulWidget, Widget, Wrap,
};
use ratatui::{DefaultTerminal, symbols};
const TODO_HEADER_STYLE: Style = Style::new().fg(SLATE.c100).bg(BLUE.c800);
const NORMAL_ROW_BG: Color = SLATE.c950;
@@ -32,10 +27,7 @@ const COMPLETED_TEXT_FG_COLOR: Color = GREEN.c500;
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::default().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::default().run(terminal))
}
/// This struct holds the current state of the app. In particular, it has the `todo_list` field
@@ -72,12 +64,36 @@ impl Default for App {
Self {
should_exit: false,
todo_list: TodoList::from_iter([
(Status::Todo, "Rewrite everything with Rust!", "I can't hold my inner voice. He tells me to rewrite the complete universe with Rust"),
(Status::Completed, "Rewrite all of your tui apps with Ratatui", "Yes, you heard that right. Go and replace your tui with Ratatui."),
(Status::Todo, "Pet your cat", "Minnak loves to be pet by you! Don't forget to pet and give some treats!"),
(Status::Todo, "Walk with your dog", "Max is bored, go walk with him!"),
(Status::Completed, "Pay the bills", "Pay the train subscription!!!"),
(Status::Completed, "Refactor list example", "If you see this info that means I completed this task!"),
(
Status::Todo,
"Rewrite everything with Rust!",
"I can't hold my inner voice. He tells me to rewrite the complete universe with Rust",
),
(
Status::Completed,
"Rewrite all of your tui apps with Ratatui",
"Yes, you heard that right. Go and replace your tui with Ratatui.",
),
(
Status::Todo,
"Pet your cat",
"Minnak loves to be pet by you! Don't forget to pet and give some treats!",
),
(
Status::Todo,
"Walk with your dog",
"Max is bored, go walk with him!",
),
(
Status::Completed,
"Pay the bills",
"Pay the train subscription!!!",
),
(
Status::Completed,
"Refactor list example",
"If you see this info that means I completed this task!",
),
]),
}
}
@@ -105,20 +121,17 @@ impl TodoItem {
}
impl App {
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
while !self.should_exit {
terminal.draw(|frame| frame.render_widget(&mut self, frame.area()))?;
if let Event::Key(key) = event::read()? {
if let Some(key) = event::read()?.as_key_press_event() {
self.handle_key(key);
};
}
}
Ok(())
}
fn handle_key(&mut self, key: KeyEvent) {
if key.kind != KeyEventKind::Press {
return;
}
match key.code {
KeyCode::Char('q') | KeyCode::Esc => self.should_exit = true,
KeyCode::Char('h') | KeyCode::Left => self.select_none(),
@@ -133,7 +146,7 @@ impl App {
}
}
fn select_none(&mut self) {
const fn select_none(&mut self) {
self.todo_list.state.select(None);
}
@@ -144,11 +157,11 @@ impl App {
self.todo_list.state.select_previous();
}
fn select_first(&mut self) {
const fn select_first(&mut self) {
self.todo_list.state.select_first();
}
fn select_last(&mut self) {
const fn select_last(&mut self) {
self.todo_list.state.select_last();
}
@@ -165,15 +178,15 @@ impl App {
impl Widget for &mut App {
fn render(self, area: Rect, buf: &mut Buffer) {
let [header_area, main_area, footer_area] = Layout::vertical([
let main_layout = Layout::vertical([
Constraint::Length(2),
Constraint::Fill(1),
Constraint::Length(1),
])
.areas(area);
]);
let [header_area, content_area, footer_area] = area.layout(&main_layout);
let [list_area, item_area] =
Layout::vertical([Constraint::Fill(1), Constraint::Fill(1)]).areas(main_area);
let content_layout = Layout::vertical([Constraint::Fill(1), Constraint::Fill(1)]);
let [list_area, item_area] = content_area.layout(&content_layout);
App::render_header(header_area, buf);
App::render_footer(footer_area, buf);

View File

@@ -9,9 +9,9 @@ rust-version.workspace = true
color-eyre.workspace = true
crossterm.workspace = true
ratatui.workspace = true
tracing = "0.1.40"
tracing-appender = "0.2.3"
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
tracing.workspace = true
tracing-appender.workspace = true
tracing-subscriber = { workspace = true, features = ["env-filter"] }
[lints]
workspace = true

View File

@@ -20,14 +20,14 @@
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use std::{fs::File, time::Duration};
use color_eyre::{eyre::Context, Result};
use ratatui::{
crossterm::event::{self, Event, KeyCode},
widgets::{Block, Paragraph},
Frame,
};
use tracing::{debug, info, instrument, trace, Level};
use tracing_appender::{non_blocking, non_blocking::WorkerGuard};
use color_eyre::Result;
use color_eyre::eyre::Context;
use crossterm::event::{self, Event, KeyCode};
use ratatui::Frame;
use ratatui::widgets::{Block, Paragraph};
use tracing::{Level, debug, info, instrument, trace};
use tracing_appender::non_blocking;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::EnvFilter;
fn main() -> Result<()> {
@@ -40,7 +40,7 @@ fn main() -> Result<()> {
let mut events = vec![]; // a buffer to store the recent events to display in the UI
while !should_exit(&events) {
handle_events(&mut events)?;
terminal.draw(|frame| draw(frame, &events))?;
terminal.draw(|frame| render(frame, &events))?;
}
ratatui::restore();
@@ -69,7 +69,7 @@ fn handle_events(events: &mut Vec<Event>) -> Result<()> {
}
#[instrument(skip_all)]
fn draw(frame: &mut Frame, events: &[Event]) {
fn render(frame: &mut Frame, events: &[Event]) {
// To view this event, run the example with `RUST_LOG=tracing=debug cargo run --example tracing`
trace!(frame_count = frame.count(), event_count = events.len());
let events = events.iter().map(|e| format!("{e:?}")).collect::<Vec<_>>();

View File

@@ -21,21 +21,16 @@
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use color_eyre::Result;
use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Constraint, Layout, Position},
style::{Color, Modifier, Style, Stylize},
text::{Line, Span, Text},
widgets::{Block, List, ListItem, Paragraph},
DefaultTerminal, Frame,
};
use crossterm::event::{self, KeyCode, KeyEventKind};
use ratatui::layout::{Constraint, Layout, Position};
use ratatui::style::{Color, Modifier, Style, Stylize};
use ratatui::text::{Line, Span, Text};
use ratatui::widgets::{Block, List, ListItem, Paragraph};
use ratatui::{DefaultTerminal, Frame};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::new().run(terminal);
ratatui::restore();
app_result
ratatui::run(|terminal| App::new().run(terminal))
}
/// App holds the state of the application
@@ -119,7 +114,7 @@ impl App {
new_cursor_pos.clamp(0, self.input.chars().count())
}
fn reset_cursor(&mut self) {
const fn reset_cursor(&mut self) {
self.character_index = 0;
}
@@ -129,11 +124,11 @@ impl App {
self.reset_cursor();
}
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
fn run(mut self, terminal: &mut DefaultTerminal) -> Result<()> {
loop {
terminal.draw(|frame| self.draw(frame))?;
terminal.draw(|frame| self.render(frame))?;
if let Event::Key(key) = event::read()? {
if let Some(key) = event::read()?.as_key_press_event() {
match self.input_mode {
InputMode::Normal => match key.code {
KeyCode::Char('e') => {
@@ -159,13 +154,13 @@ impl App {
}
}
fn draw(&self, frame: &mut Frame) {
let vertical = Layout::vertical([
fn render(&self, frame: &mut Frame) {
let layout = Layout::vertical([
Constraint::Length(1),
Constraint::Length(3),
Constraint::Min(1),
]);
let [help_area, input_area, messages_area] = vertical.areas(frame.area());
let [help_area, input_area, messages_area] = frame.area().layout(&layout);
let (msg, style) = match self.input_mode {
InputMode::Normal => (
@@ -206,7 +201,7 @@ impl App {
// Make the cursor visible and ask ratatui to put it at the specified coordinates after
// rendering
#[allow(clippy::cast_possible_truncation)]
#[expect(clippy::cast_possible_truncation)]
InputMode::Editing => frame.set_cursor_position(Position::new(
// Draw the cursor at the current position in the input field.
// This position can be controlled via the left and right arrow key

View File

@@ -8,7 +8,7 @@ rust-version.workspace = true
[dependencies]
color-eyre.workspace = true
crossterm.workspace = true
rand = "0.9.0"
rand.workspace = true
ratatui.workspace = true
[lints]

View File

@@ -9,68 +9,38 @@
//! [`BarChart`]: https://docs.rs/ratatui/latest/ratatui/widgets/struct.BarChart.html
use color_eyre::Result;
use rand::{rng, Rng};
use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyEventKind},
layout::{Constraint, Layout},
style::{Color, Style, Stylize},
text::Line,
widgets::{Bar, BarChart, BarGroup},
DefaultTerminal, Frame,
};
use crossterm::event;
use rand::{Rng, rng};
use ratatui::Frame;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style, Stylize};
use ratatui::text::Line;
use ratatui::widgets::{Bar, BarChart, BarGroup};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let app_result = App::new().run(terminal);
ratatui::restore();
app_result
}
struct App {
should_exit: bool,
temperatures: Vec<u8>,
}
impl App {
fn new() -> Self {
let mut rng = rng();
let temperatures = (0..24).map(|_| rng.random_range(50..90)).collect();
Self {
should_exit: false,
temperatures,
}
}
fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
while !self.should_exit {
terminal.draw(|frame| self.draw(frame))?;
self.handle_events()?;
}
Ok(())
}
fn handle_events(&mut self) -> Result<()> {
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') {
self.should_exit = true;
let temperatures: Vec<u8> = (0..24).map(|_| rng().random_range(50..90)).collect();
ratatui::run(|terminal| {
loop {
terminal.draw(|frame| render(frame, &temperatures))?;
if event::read()?.is_key_press() {
break Ok(());
}
}
Ok(())
}
})
}
fn draw(&self, frame: &mut Frame) {
let [title, main] = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)])
.spacing(1)
.areas(frame.area());
fn render(frame: &mut Frame, temperatures: &[u8]) {
let layout = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]).spacing(1);
let [title, main] = frame.area().layout(&layout);
frame.render_widget("Weather demo".bold().into_centered_line(), title);
frame.render_widget(vertical_barchart(&self.temperatures), main);
}
frame.render_widget("Weather demo".bold().into_centered_line(), title);
frame.render_widget(vertical_barchart(temperatures), main);
}
/// Create a vertical bar chart from the temperatures data.
fn vertical_barchart(temperatures: &[u8]) -> BarChart {
fn vertical_barchart(temperatures: &[u8]) -> BarChart<'_> {
let bars: Vec<Bar> = temperatures
.iter()
.enumerate()
@@ -81,7 +51,7 @@ fn vertical_barchart(temperatures: &[u8]) -> BarChart {
.bar_width(5)
}
fn vertical_bar(hour: usize, temperature: &u8) -> Bar {
fn vertical_bar(hour: usize, temperature: &u8) -> Bar<'_> {
Bar::default()
.value(u64::from(*temperature))
.label(Line::from(format!("{hour:>02}:00")))

View File

@@ -1,41 +1,34 @@
/// An example of how to use [`WidgetRef`] to store heterogeneous widgets in a container.
///
/// This example creates a `StackContainer` widget that can hold any number of widgets of
/// different types. It creates two widgets, `Greeting` and `Farewell`, and stores them in a
/// `StackContainer` with a vertical layout. The `StackContainer` widget renders each of its
/// child widgets in the order they were added.
///
/// This example runs with the Ratatui library code in the branch that you are currently
/// reading. See the [`latest`] branch for the code which works with the most recent Ratatui
/// release.
///
/// [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//! An example of how to use [`WidgetRef`] to store heterogeneous widgets in a container.
//!
//! This example creates a `StackContainer` widget that can hold any number of widgets of
//! different types. It creates two widgets, `Greeting` and `Farewell`, and stores them in a
//! `StackContainer` with a vertical layout. The `StackContainer` widget renders each of its
//! child widgets in the order they were added.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
use std::iter::zip;
use color_eyre::Result;
use crossterm::event;
use ratatui::{
buffer::Buffer,
layout::{Constraint, Direction, Layout, Rect},
widgets::{Block, Paragraph, Widget, WidgetRef},
DefaultTerminal, Frame,
};
use ratatui::Frame;
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use ratatui::widgets::{Block, Paragraph, Widget, WidgetRef};
fn main() -> Result<()> {
color_eyre::install()?;
let terminal = ratatui::init();
let result = run(terminal);
ratatui::restore();
result
}
fn run(mut terminal: DefaultTerminal) -> Result<()> {
loop {
terminal.draw(render)?;
if matches!(event::read()?, event::Event::Key(_)) {
break Ok(());
ratatui::run(|terminal| {
loop {
terminal.draw(render)?;
if event::read()?.is_key_press() {
return Ok(());
}
}
}
})
}
fn render(frame: &mut Frame) {

View File

@@ -0,0 +1,11 @@
[package]
name = "ratatui-state-examples"
publish = false
license.workspace = true
edition.workspace = true
rust-version.workspace = true
[dependencies]
color-eyre.workspace = true
crossterm.workspace = true
ratatui = { workspace = true, features = ["unstable-widget-ref"] }

View File

@@ -0,0 +1,179 @@
# Ratatui State Management Examples
This collection demonstrates various patterns for handling both mutable and immutable state in
Ratatui applications. Each example solves a counter problem - incrementing a counter value - but
uses different architectural approaches. These patterns represent common solutions to state
management challenges you'll encounter when building TUI applications.
For more information about widgets in Ratatui, see the [widgets module documentation](https://docs.rs/ratatui/latest/ratatui/widgets/index.html).
## When to Use Each Pattern
Choose the pattern that best fits your application's architecture and complexity:
- **Simple applications**: Use `render-function` or `mutable-widget` patterns
- **Clean separation**: Consider `stateful-widget` or `component-trait` patterns
- **Complex hierarchies**: Use `nested-*` patterns for parent-child relationships
- **Shared state**: Use `refcell` when multiple widgets need access to the same state
- **Advanced scenarios**: Use `widget-with-mutable-ref` when you understand Rust lifetimes well
## Running the Examples
To run any example, use:
```bash
cargo run --bin example-name
```
Press any key (or resize the terminal) to increment the counter. Press `<Esc>` or `q` to exit.
## Examples
### Immutable State Patterns
These patterns keep widget state immutable during rendering, with state updates happening outside
the render cycle. They're generally easier to reason about and less prone to borrowing issues.
#### [`immutable-function.rs`] - Function-Based Immutable State
**Best for**: Simple applications with pure rendering functions
**Pros**: Pure functions, easy to test, clear separation of concerns
**Cons**: Verbose parameter passing, limited integration with Ratatui ecosystem
Uses standalone functions that take immutable references to state. State updates happen in the
application loop outside of rendering.
#### [`immutable-shared-ref.rs`] - Shared Reference Pattern (Recommended)
**Best for**: Most modern Ratatui applications
**Pros**: Reusable widgets, efficient, integrates with Ratatui ecosystem, modern best practice
**Cons**: Requires external state management for dynamic behavior
Implements [`Widget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.Widget.html) for
`&T`, allowing widgets to be rendered multiple times by reference without being consumed.
#### [`immutable-consuming.rs`] - Consuming Widget Pattern
**Best for**: Compatibility with older code, simple widgets created fresh each frame
**Pros**: Simple implementation, widely compatible, familiar pattern
**Cons**: Widget consumed on each render, requires reconstruction for reuse
Implements [`Widget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.Widget.html) directly
on the owned type, consuming the widget when rendered.
### Mutable State Patterns
These patterns allow widgets to modify their state during rendering, useful for widgets that need
to update state as part of their rendering behavior.
#### [`mutable-function.rs`] - Function-Based Mutable State
**Best for**: Simple applications with minimal mutable state
**Pros**: Easy to understand, no traits to implement, direct control
**Cons**: State gets passed around as function parameters, harder to organize as complexity grows
Uses simple functions that accept mutable state references. State is managed at the application
level and passed down to render functions.
#### [`mutable-widget.rs`] - Mutable Widget Pattern
**Best for**: Self-contained widgets with their own mutable state
**Pros**: Encapsulates state within the widget, familiar OOP-style approach
**Cons**: Requires `&mut` references, can be challenging with complex borrowing scenarios
Implements [`Widget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.Widget.html) for
`&mut T`, allowing the widget to mutate its own state during rendering.
### Intermediate Patterns
#### [`stateful-widget.rs`] - Stateful Widget Pattern
**Best for**: Clean separation of widget logic from state
**Pros**: Separates widget logic from state, reusable, idiomatic Ratatui pattern
**Cons**: State must be managed externally
Uses [`StatefulWidget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.StatefulWidget.html)
to keep rendering logic separate from state management.
#### [`component-trait.rs`] - Custom Component Trait
**Best for**: Implementing consistent behavior across multiple widget types
**Pros**: Flexible, allows custom render signatures, good for widget frameworks
**Cons**: Non-standard, requires users to learn your custom API
Creates a custom trait similar to [`Widget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.Widget.html)
but with a `&mut self` render method for direct mutation.
### Advanced Patterns
#### [`nested-mutable-widget.rs`] - Nested Mutable Widgets
**Best for**: Parent-child widget relationships with mutable state
**Pros**: Hierarchical organization, each widget manages its own state
**Cons**: Complex borrowing, requires careful lifetime management
Demonstrates how to nest widgets that both need mutable access to their state.
#### [`nested-stateful-widget.rs`] - Nested Stateful Widgets
**Best for**: Complex applications with hierarchical state management
**Pros**: Clean separation, composable, scales well with application complexity
**Cons**: More boilerplate, requires understanding of nested state patterns
Shows how to compose multiple [`StatefulWidget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.StatefulWidget.html)s
in a parent-child hierarchy.
#### [`refcell.rs`] - Interior Mutability Pattern
**Best for**: Shared state across multiple widgets, complex state sharing scenarios
**Pros**: Allows shared mutable access, works with immutable widget references
**Cons**: Runtime borrow checking, potential panics, harder to debug
Uses [`Rc<RefCell<T>>`](https://doc.rust-lang.org/std/rc/struct.Rc.html) for interior mutability
when multiple widgets need access to the same state.
#### [`widget-with-mutable-ref.rs`] - Lifetime-Based Mutable References
**Best for**: Advanced users who need precise control over state lifetime
**Pros**: Zero-cost abstraction, explicit lifetime management
**Cons**: Complex lifetimes, requires deep Rust knowledge, easy to get wrong
Stores mutable references directly in widget structs using explicit lifetimes.
## Choosing the Right Pattern
**For most applications, start with immutable patterns:**
1. **Simple apps**: Use `immutable-function` for basic rendering with external state management
2. **Modern Ratatui**: Use `immutable-shared-ref` for reusable, efficient widgets (recommended)
3. **Legacy compatibility**: Use `immutable-consuming` when working with older code patterns
**Use mutable patterns when widgets need to update state during rendering:**
1. **Simple mutable state**: Begin with `mutable-function` or `mutable-widget` for prototypes
2. **Clean separation**: Use `stateful-widget` when you want to separate widget logic from state
3. **Hierarchical widgets**: Use `nested-*` patterns for complex widget relationships
4. **Shared state**: Use `refcell` when multiple widgets need the same state
5. **Performance critical**: Consider `widget-with-mutable-ref` for advanced lifetime management
## Common Pitfalls
- **Borrowing issues**: The borrow checker can be challenging with mutable state.
[`StatefulWidget`](https://docs.rs/ratatui/latest/ratatui/widgets/trait.StatefulWidget.html)
often provides the cleanest solution.
- **Overengineering**: Don't use complex patterns like `refcell` or `widget-with-mutable-ref`
unless you actually need them.
- **State organization**: Keep state close to where it's used. Don't pass state through many
layers unnecessarily.
[`component-trait.rs`]: ./src/bin/component-trait.rs
[`immutable-consuming.rs`]: ./src/bin/immutable-consuming.rs
[`immutable-function.rs`]: ./src/bin/immutable-function.rs
[`immutable-shared-ref.rs`]: ./src/bin/immutable-shared-ref.rs
[`mutable-widget.rs`]: ./src/bin/mutable-widget.rs
[`nested-mutable-widget.rs`]: ./src/bin/nested-mutable-widget.rs
[`nested-stateful-widget.rs`]: ./src/bin/nested-stateful-widget.rs
[`refcell.rs`]: ./src/bin/refcell.rs
[`mutable-function.rs`]: ./src/bin/mutable-function.rs
[`stateful-widget.rs`]: ./src/bin/stateful-widget.rs
[`widget-with-mutable-ref.rs`]: ./src/bin/widget-with-mutable-ref.rs

View File

@@ -0,0 +1,83 @@
//! # Custom Component Trait Pattern
//!
//! This example demonstrates using a custom trait instead of the standard `Widget` trait for
//! handling mutable state during rendering. This pattern is useful when you want to implement
//! consistent behavior across multiple widget types without implementing the `Widget` trait for
//! each one.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You're building a widget framework or library with custom behavior
//! - You want a consistent API across multiple widget types
//! - You need more control over the render method signature
//! - You're prototyping widget behavior before standardizing on `Widget` or `StatefulWidget`
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Flexible - you can define custom method signatures
//! - Consistent - enforces the same behavior across widget types
//! - Simple - no need to understand `StatefulWidget` complexity
//!
//! **Cons:**
//! - Non-standard - users must learn your custom API instead of Ratatui's standard traits
//! - Less discoverable - doesn't integrate with Ratatui's widget ecosystem
//! - Limited reuse - can't be used with existing Ratatui functions expecting `Widget`
//!
//! ## Example Usage
//!
//! The custom `Component` trait allows widgets to mutate their state directly during rendering
//! by taking `&mut self` instead of `self`. This is similar to the mutable widget pattern but
//! with a custom trait interface.
use ratatui::Frame;
use ratatui::layout::Rect;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the custom component trait pattern for mutable state management.
///
/// Creates a counter widget using a custom `Component` trait and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut counter = Counter::default();
loop {
terminal.draw(|frame| counter.render(frame, frame.area()))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A custom trait for components that can render themselves while mutating their state.
///
/// This trait provides an alternative to the standard `Widget` trait by allowing components to
/// take `&mut self`, enabling direct state mutation during rendering.
trait Component {
/// Render the component to the given area of the frame.
fn render(&mut self, frame: &mut Frame, area: Rect);
}
/// A simple counter component that increments its value each time it's rendered.
///
/// Demonstrates how the custom `Component` trait allows widgets to maintain and mutate
/// their own state during the rendering process.
#[derive(Default)]
struct Counter {
count: usize,
}
impl Component for Counter {
fn render(&mut self, frame: &mut Frame, area: Rect) {
self.count += 1;
frame.render_widget(format!("Counter: {count}", count = self.count), area);
}
}

View File

@@ -0,0 +1,86 @@
//! # Consuming Widget Pattern with Immutable State
//!
//! This example demonstrates implementing the `Widget` trait directly on the widget type,
//! causing it to be consumed when rendered. This was the original pattern in Ratatui and
//! is still commonly used, especially for simple widgets that are created fresh each frame.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You're working with existing code that uses this pattern
//! - Your widgets are simple and created fresh each frame
//! - You want maximum compatibility with older Ratatui code
//! - You don't need to reuse widget instances
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Simple - straightforward implementation
//! - Compatible - works with all Ratatui versions
//! - Familiar - widely used pattern in existing code
//! - No borrowing - no need to manage references
//!
//! **Cons:**
//! - Consuming - widget is destroyed after each render
//! - Inefficient - requires reconstruction for repeated use
//! - Limited reuse - cannot store and reuse widget instances
//!
//! ## Example Usage
//!
//! The widget implements `Widget` directly on the owned type, meaning it's consumed
//! when rendered and must be recreated for subsequent renders.
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the consuming widget pattern for immutable state rendering.
///
/// Creates a new counter widget instance each frame, showing how the consuming
/// pattern works with immutable state that's managed externally.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut count = 0;
loop {
terminal.draw(|frame| {
// Widget is created fresh each time and consumed when rendered
let counter = Counter::new(count);
frame.render_widget(counter, frame.area());
})?;
// State updates happen outside of widget lifecycle
count += 1;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A simple counter widget that displays a count value.
///
/// Implements `Widget` directly on the owned type, meaning the widget is consumed
/// when rendered. The count state is managed externally and passed in during construction.
struct Counter {
count: usize,
}
impl Counter {
/// Create a new counter widget with the given count.
fn new(count: usize) -> Self {
Self { count }
}
}
impl Widget for Counter {
fn render(self, area: Rect, buf: &mut Buffer) {
// Widget is consumed here - self is moved, not borrowed
format!("Counter: {}", self.count).render(area, buf);
}
}

View File

@@ -0,0 +1,82 @@
//! # Function-Based Pattern with Immutable State
//!
//! This example demonstrates using standalone functions for rendering widgets with immutable
//! state. This pattern keeps state management completely separate from widget rendering logic,
//! making it easy to test and reason about.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You prefer functional programming approaches
//! - Your rendering logic is simple and doesn't need complex widget hierarchies
//! - You want clear separation between state and rendering
//! - You're building simple UIs or prototyping quickly
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Simple - easy to understand and test
//! - Pure functions - no side effects in rendering
//! - Flexible - can easily compose multiple render functions
//! - Clear separation - state management is completely separate from rendering
//!
//! **Cons:**
//! - Limited - doesn't integrate with Ratatui's widget ecosystem
//! - Verbose - requires passing state explicitly to every function
//! - No reuse - can't be used with existing Ratatui widget infrastructure
//!
//! ## Example Usage
//!
//! The function takes immutable references to both the frame and state, ensuring that
//! rendering is a pure operation that doesn't modify state.
use ratatui::Frame;
use ratatui::layout::Rect;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the function-based pattern for immutable state rendering.
///
/// Creates a counter state and renders it using a pure function, incrementing the counter
/// in the application loop rather than during rendering.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut counter_state = Counter::default();
loop {
terminal.draw(|frame| render_counter(frame, frame.area(), &counter_state))?;
// State updates happen outside of rendering
counter_state.increment();
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// State for the counter.
///
/// This state is managed externally and passed to render functions as an immutable reference.
#[derive(Default)]
struct Counter {
count: usize,
}
impl Counter {
/// Increment the counter value.
fn increment(&mut self) {
self.count += 1;
}
}
/// Pure render function that displays the counter state.
///
/// Takes immutable references to ensure rendering has no side effects on state.
/// This function can be easily tested and composed with other render functions.
fn render_counter(frame: &mut Frame, area: Rect, state: &Counter) {
frame.render_widget(format!("Counter: {}", state.count), area);
}

View File

@@ -0,0 +1,92 @@
//! # Shared Reference Pattern with Immutable State
//!
//! This example demonstrates implementing the `Widget` trait on a shared reference (`&Widget`)
//! with immutable state. This is the recommended pattern for most widgets in modern Ratatui
//! applications, as it allows widgets to be reused without being consumed.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You want to reuse widgets across multiple renders
//! - Your widget doesn't need to modify its state during rendering
//! - You want the benefits of Ratatui's widget ecosystem
//! - You're building modern, efficient Ratatui applications
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Reusable - widget can be rendered multiple times without reconstruction
//! - Efficient - no cloning or reconstruction needed
//! - Standard - integrates with Ratatui's widget ecosystem
//! - Modern - follows current Ratatui best practices
//!
//! **Cons:**
//! - Immutable - cannot modify widget state during rendering
//! - External state - requires external state management for dynamic behavior
//!
//! ## Example Usage
//!
//! The widget implements `Widget for &Counter`, allowing it to be rendered by reference
//! while keeping its internal data immutable during rendering.
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the shared reference pattern for immutable widget rendering.
///
/// Creates a counter widget that can be rendered multiple times by reference,
/// with state updates happening outside the widget's render method.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut counter = Counter::new();
loop {
terminal.draw(|frame| {
// Widget is rendered by reference, can be reused
frame.render_widget(&counter, frame.area());
})?;
// State updates happen outside of rendering
counter.increment();
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A counter widget with immutable rendering behavior.
///
/// Implements `Widget` on a shared reference, allowing the widget to be rendered
/// multiple times without being consumed while keeping its data immutable during rendering.
struct Counter {
count: usize,
}
impl Counter {
/// Create a new counter.
fn new() -> Self {
Self { count: 0 }
}
/// Increment the counter value.
///
/// This method modifies the counter's state outside of the rendering process,
/// maintaining the separation between state updates and rendering.
fn increment(&mut self) {
self.count += 1;
}
}
impl Widget for &Counter {
fn render(self, area: Rect, buf: &mut Buffer) {
// Rendering is immutable - no state changes occur here
format!("Counter: {}", self.count).render(area, buf);
}
}

View File

@@ -0,0 +1,67 @@
//! # Render Function Pattern
//!
//! This example demonstrates the simplest approach to handling mutable state - using regular
//! functions that accept mutable state references. This pattern works well for simple applications
//! and prototypes where you don't need the complexity of widget traits.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - Simple applications with minimal state management needs
//! - Prototypes and quick experiments
//! - When you prefer functional programming over object-oriented approaches
//! - Applications where state is naturally managed at the top level
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Extremely simple - no traits to implement or understand
//! - Direct and explicit - state flow is obvious
//! - Flexible - easy to modify without interface constraints
//! - Beginner-friendly - uses basic Rust concepts
//!
//! **Cons:**
//! - State must be passed through function parameters
//! - Harder to organize as application complexity grows
//! - No encapsulation - state management is scattered
//! - Less reusable than widget-based approaches
//! - Can lead to parameter passing through many layers
//!
//! ## Example Usage
//!
//! State is managed at the application level and passed to render functions as needed.
//! This approach works well when state is simple and doesn't need complex organization.
use ratatui::Frame;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the render function pattern for mutable state management.
///
/// Creates a counter using simple functions and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut counter = 0;
loop {
terminal.draw(|frame| render(frame, &mut counter))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// Renders a counter using a simple function-based approach.
///
/// Demonstrates the functional approach to state management where state is managed externally
/// and passed in as a parameter.
fn render(frame: &mut Frame, counter: &mut usize) {
*counter += 1;
frame.render_widget(format!("Counter: {counter}"), frame.area());
}

View File

@@ -0,0 +1,74 @@
//! # Mutable Widget Pattern
//!
//! This example demonstrates implementing the `Widget` trait on a mutable reference (`&mut T`)
//! to allow direct state mutation during rendering. This is one of the simplest approaches for
//! widgets that need to maintain their own state.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You have self-contained widgets with their own state
//! - You prefer an object-oriented approach to widget design
//! - Your widget's state is simple and doesn't need complex sharing
//! - You want to encapsulate state within the widget itself
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Simple and intuitive - state is encapsulated within the widget
//! - Familiar pattern for developers coming from OOP backgrounds
//! - Direct state access without external state management
//! - Works well with Rust's ownership system for simple cases
//!
//! **Cons:**
//! - Can lead to borrowing challenges in complex scenarios
//! - Requires mutable access to the widget, which may not always be available
//! - Less flexible than `StatefulWidget` for shared or complex state patterns
//! - May require careful lifetime management in nested scenarios
//!
//! ## Example Usage
//!
//! The widget implements `Widget` for `&mut Self`, allowing it to mutate its internal state
//! during the render call. Each render increments a counter, demonstrating state mutation.
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the mutable widget pattern for mutable state management.
///
/// Creates a counter widget using `Widget` for `&mut Self` and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut counter = Counter::default();
loop {
terminal.draw(|frame| frame.render_widget(&mut counter, frame.area()))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A counter widget that maintains its own state and increments on each render.
///
/// Demonstrates the mutable widget pattern by implementing `Widget` for `&mut Self`.
#[derive(Default)]
struct Counter {
counter: usize,
}
impl Widget for &mut Counter {
fn render(self, area: Rect, buf: &mut Buffer) {
self.counter += 1;
format!("Counter: {counter}", counter = self.counter).render(area, buf);
}
}

View File

@@ -0,0 +1,96 @@
//! # Nested Mutable Widget Pattern
//!
//! This example demonstrates nesting widgets that both need mutable access to their state.
//! This pattern is useful when you have a parent-child widget relationship where both widgets
//! need to maintain and mutate their own state during rendering.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You have hierarchical widget relationships (parent-child)
//! - Each widget needs to maintain its own distinct state
//! - You prefer the mutable widget pattern over StatefulWidget
//! - Widgets have clear ownership of their state
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Clear hierarchical organization
//! - Each widget encapsulates its own state
//! - Intuitive parent-child relationships
//! - State ownership is explicit
//!
//! **Cons:**
//! - Complex borrowing scenarios can arise
//! - Requires careful lifetime management
//! - May lead to borrow checker issues in complex hierarchies
//! - Less flexible than StatefulWidget for state sharing
//!
//! ## Example Usage
//!
//! The parent `App` widget contains a child `Counter` widget. Both implement `Widget` for
//! `&mut Self`, allowing them to mutate their respective states during rendering. The parent
//! delegates rendering to the child while maintaining its own state structure.
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the nested mutable widget pattern for mutable state management.
///
/// Creates a parent-child widget hierarchy using mutable widgets and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
let app = App::default();
ratatui::run(|terminal| app.run(terminal))
}
/// The main application widget that contains and manages child widgets.
///
/// Demonstrates the parent widget in a nested mutable widget hierarchy.
#[derive(Default)]
struct App {
counter: Counter,
}
impl App {
/// Run the application with the given terminal.
fn run(mut self, terminal: &mut DefaultTerminal) -> color_eyre::Result<()> {
loop {
terminal.draw(|frame| frame.render_widget(&mut self, frame.area()))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
}
}
impl Widget for &mut App {
fn render(self, area: Rect, buf: &mut Buffer) {
self.counter.render(area, buf);
}
}
/// A counter widget that maintains its own state within a nested hierarchy.
///
/// Can be used standalone or as a child within other widgets, demonstrating
/// how mutable widgets can be composed together.
#[derive(Default)]
struct Counter {
count: usize,
}
impl Widget for &mut Counter {
fn render(self, area: Rect, buf: &mut Buffer) {
self.count += 1;
format!("Counter: {count}", count = self.count).render(area, buf);
}
}

View File

@@ -0,0 +1,103 @@
//! # Nested StatefulWidget Pattern
//!
//! This example demonstrates composing multiple `StatefulWidget`s in a parent-child hierarchy.
//! This pattern is ideal for complex applications where you need clean separation of concerns
//! and want to leverage the benefits of the StatefulWidget pattern at multiple levels.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - Complex applications with hierarchical state management needs
//! - When you want clean separation between widgets and their state
//! - Building composable widget systems
//! - Applications that need testable, reusable widget components
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Excellent separation of concerns
//! - Highly composable and reusable widgets
//! - Easy to test individual widgets and their state
//! - Scales well with application complexity
//! - Follows idiomatic Ratatui patterns
//!
//! **Cons:**
//! - More boilerplate code than simpler patterns
//! - Requires understanding of nested state management
//! - State structures can become complex
//! - May be overkill for simple applications
//!
//! ## Example Usage
//!
//! The parent `App` widget manages application-level state while delegating specific
//! functionality to child widgets like `Counter`. Each widget is responsible for its own
//! state type and rendering logic, making the system highly modular.
use ratatui::DefaultTerminal;
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::{StatefulWidget, Widget};
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the nested StatefulWidget pattern for mutable state management.
///
/// Creates a parent-child widget hierarchy using StatefulWidgets and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(App::run)
}
/// The main application widget using the StatefulWidget pattern.
///
/// Demonstrates how to compose multiple StatefulWidgets together while coordinating
/// between different child widgets.
struct App;
impl App {
/// Run the application with the given terminal.
fn run(terminal: &mut DefaultTerminal) -> color_eyre::Result<()> {
let mut state = AppState { counter: 0 };
loop {
terminal.draw(|frame| frame.render_stateful_widget(App, frame.area(), &mut state))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
}
}
/// Application state that contains all the state needed by the app and its child widgets.
///
/// Demonstrates how to organize hierarchical state in the StatefulWidget pattern.
struct AppState {
counter: usize,
}
impl StatefulWidget for App {
type State = AppState;
fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) {
Counter.render(area, buf, &mut state.counter);
}
}
/// A counter widget that uses StatefulWidget for clean state separation.
///
/// Focuses purely on rendering logic and can be reused with different state instances.
struct Counter;
impl StatefulWidget for Counter {
type State = usize;
fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) {
*state += 1;
format!("Counter: {state}").render(area, buf);
}
}

View File

@@ -0,0 +1,86 @@
//! # Interior Mutability Pattern (RefCell)
//!
//! This example demonstrates using `Rc<RefCell<T>>` for interior mutability, allowing multiple
//! widgets to share and mutate the same state. This pattern is useful when you need shared
//! mutable state but can't use mutable references due to borrowing constraints.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - Multiple widgets need to access and modify the same state
//! - You can't use mutable references due to borrowing constraints
//! - You need shared ownership of mutable data
//! - Complex widget hierarchies where state needs to be accessed from multiple locations
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Allows shared mutable access to state
//! - Works with immutable widget references
//! - Enables complex state sharing patterns
//! - Can be cloned cheaply (reference counting)
//!
//! **Cons:**
//! - Runtime borrow checking - potential for panics if you violate borrowing rules
//! - Less efficient than compile-time borrow checking
//! - Harder to debug when borrow violations occur
//! - More complex than simpler state management patterns
//! - Can lead to subtle bugs if not used carefully
//!
//! ## Important Safety Notes
//!
//! - Only one mutable borrow can exist at a time
//! - Violating this rule will cause a panic at runtime
//! - Always minimize the scope of borrows to avoid conflicts
//!
//! ## Example Usage
//!
//! The widget wraps its state in `Rc<RefCell<T>>`, allowing the state to be shared and mutated
//! even when the widget itself is used by value (as required by the `Widget` trait).
use std::cell::RefCell;
use std::ops::AddAssign;
use std::rc::Rc;
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the interior mutability pattern for mutable state management.
///
/// Creates a counter widget using `Rc<RefCell<T>>` and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let counter = Counter::default();
loop {
terminal.draw(|frame| frame.render_widget(counter.clone(), frame.area()))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A counter widget that uses interior mutability for shared state management.
///
/// Demonstrates how `Rc<RefCell<T>>` enables mutable state access even when the
/// widget itself is used by value.
#[derive(Default, Clone)]
struct Counter {
count: Rc<RefCell<usize>>,
}
impl Widget for Counter {
fn render(self, area: Rect, buf: &mut Buffer) {
self.count.borrow_mut().add_assign(1);
format!("Counter: {count}", count = self.count.borrow()).render(area, buf);
}
}

View File

@@ -0,0 +1,78 @@
//! # StatefulWidget Pattern (Recommended)
//!
//! This example demonstrates the `StatefulWidget` trait, which is the recommended approach for
//! handling mutable state in Ratatui applications. This pattern separates the widget's rendering
//! logic from its state, making it more flexible and reusable.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - Most Ratatui applications (this is the recommended default)
//! - When building reusable widget libraries
//! - When you need clean separation between rendering logic and state
//! - When multiple widgets might share similar state structures
//! - When you want to follow idiomatic Ratatui patterns
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Clean separation of concerns between widget and state
//! - Reusable - the same widget can work with different state instances
//! - Testable - state and rendering logic can be tested independently
//! - Composable - works well with complex application architectures
//! - Idiomatic - follows Ratatui's recommended patterns
//!
//! **Cons:**
//! - Slightly more verbose than direct mutation patterns
//! - Requires understanding of the `StatefulWidget` trait
//! - State must be managed externally
//!
//! ## Example Usage
//!
//! The widget defines its rendering behavior through `StatefulWidget`, while the state is
//! managed separately. This allows the same widget to be used with different state instances
//! and makes testing easier.
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::{StatefulWidget, Widget};
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the StatefulWidget pattern for mutable state management.
///
/// Creates a counter widget using `StatefulWidget` and runs the application loop,
/// updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut counter = 0;
loop {
terminal.draw(|frame| {
frame.render_stateful_widget(CounterWidget, frame.area(), &mut counter)
})?;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A counter widget that uses the StatefulWidget pattern for state management.
///
/// Demonstrates the separation of rendering logic from state, making the widget reusable
/// with different state instances and easier to test.
struct CounterWidget;
impl StatefulWidget for CounterWidget {
type State = usize;
fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) {
*state += 1;
format!("Counter: {state}").render(area, buf);
}
}

View File

@@ -0,0 +1,84 @@
//! # Lifetime-Based Mutable References Pattern
//!
//! This example demonstrates storing mutable references directly in widget structs using explicit
//! lifetimes. This is an advanced pattern that provides zero-cost state access but requires
//! careful lifetime management.
//!
//! This example runs with the Ratatui library code in the branch that you are currently
//! reading. See the [`latest`] branch for the code which works with the most recent Ratatui
//! release.
//!
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
//!
//! ## When to Use This Pattern
//!
//! - You need maximum performance with zero runtime overhead
//! - You have a good understanding of Rust lifetimes and borrowing
//! - State lifetime is clearly defined and relatively simple
//! - You're building performance-critical applications
//!
//! ## Trade-offs
//!
//! **Pros:**
//! - Zero runtime cost - no reference counting or runtime borrow checking
//! - Compile-time safety - borrow checker ensures memory safety
//! - Direct access to state without indirection
//! - Maximum performance for state access
//!
//! **Cons:**
//! - Complex lifetime management - requires deep Rust knowledge
//! - Easy to create compilation errors that are hard to understand
//! - Inflexible - lifetime constraints can make code harder to refactor
//! - Not suitable for beginners - requires advanced Rust skills
//! - Widget structs become less reusable due to lifetime constraints
//!
//! ## Important Considerations
//!
//! - The widget's lifetime is tied to the state's lifetime
//! - You must ensure the state outlives the widget
//! - Lifetime annotations can become complex in larger applications
//! - Consider simpler patterns unless performance is critical
//!
//! ## Example Usage
//!
//! The widget stores a mutable reference to external state, allowing direct access without
//! runtime overhead. The widget must be recreated for each render call due to the lifetime
//! constraints.
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;
use ratatui_state_examples::is_exit_key_pressed;
/// Demonstrates the lifetime-based mutable references pattern for mutable state management.
///
/// Creates a counter widget using mutable references with explicit lifetimes and runs the
/// application loop, updating the counter on each render cycle until the user exits.
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
ratatui::run(|terminal| {
let mut count = 0;
loop {
let counter = CounterWidget { count: &mut count };
terminal.draw(|frame| frame.render_widget(counter, frame.area()))?;
if is_exit_key_pressed()? {
break Ok(());
}
}
})
}
/// A counter widget that holds a mutable reference to external state.
///
/// Demonstrates the lifetime-based pattern where the widget directly stores a
/// mutable reference to external state.
struct CounterWidget<'a> {
count: &'a mut usize,
}
impl Widget for CounterWidget<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
*self.count += 1;
format!("Counter: {count}", count = self.count).render(area, buf);
}
}

View File

@@ -0,0 +1,8 @@
//! Helper functions for checking if exit keys are pressed
use crossterm::event::{self, KeyCode};
pub fn is_exit_key_pressed() -> std::io::Result<bool> {
Ok(event::read()?
.as_key_press_event()
.is_some_and(|key| matches!(key.code, KeyCode::Esc | KeyCode::Char('q'))))
}

View File

@@ -0,0 +1,19 @@
# This is a vhs script. See https://github.com/charmbracelet/vhs for more info.
# To run this script, install vhs and run `vhs ./examples/vhs/release-header.tape`
# NOTE: Requires VHS 0.6.1 or later for Screenshot support
# The reason for this strange size is that the social preview image for this
# demo is 1280x64 with 80 pixels of padding on each side. We want a version
# without the padding for README.md, etc.
Set Theme {"background": "#141432"}
Set FontSize 25
Set Width 1120
Set Height 480
Set Padding 0
Hide
Type "cargo run -p release-header"
Enter
Sleep 1s
Show
Sleep 1s
Screenshot assets/release-header.png
Sleep 1s

View File

@@ -4,7 +4,7 @@ description = """
Core types and traits for the Ratatui Terminal UI library.
Widget libraries should use this crate. Applications should use the main Ratatui crate.
"""
version = "0.1.0-alpha.3"
version = "0.1.0-beta.0"
readme = "README.md"
authors.workspace = true
documentation.workspace = true
@@ -24,11 +24,27 @@ rustdoc-args = ["--cfg", "docsrs"]
[features]
default = []
## enables std
std = [
"itertools/use_std",
"thiserror/std",
"kasuari/std",
"compact_str/std",
"unicode-truncate/std",
"strum/std",
]
## enables layout cache
layout-cache = ["std"]
## enables conversions to / from colors, modifiers, and styles in the ['anstyle'] crate
anstyle = ["dep:anstyle"]
## enables conversions from colors in the [`palette`] crate to [`Color`](crate::style::Color).
palette = ["dep:palette"]
palette = ["std", "dep:palette"]
## enables portable-atomic integration for targets that don't support atomic types.
portable-atomic = ["kasuari/portable-atomic"]
## enables the backend code that sets the underline color. Underline color is only supported by
## the Crossterm backend, and is not supported on Windows 7.
@@ -40,24 +56,24 @@ scrolling-regions = []
## enables serialization and deserialization of style and color types using the [`serde`] crate.
## This is useful if you want to save themes to a file.
serde = ["dep:serde", "bitflags/serde", "compact_str/serde"]
serde = ["std", "dep:serde", "bitflags/serde", "compact_str/serde"]
[dependencies]
anstyle = { version = "1", optional = true }
bitflags = "2.3"
cassowary = "0.3"
compact_str = "0.8.0"
anstyle = { workspace = true, optional = true }
bitflags.workspace = true
compact_str.workspace = true
document-features = { workspace = true, optional = true }
hashbrown.workspace = true
indoc.workspace = true
itertools.workspace = true
lru = "0.12.0"
palette = { version = "0.7.6", optional = true }
paste = "1.0.2"
kasuari = { workspace = true, default-features = false }
lru.workspace = true
palette = { workspace = true, optional = true }
serde = { workspace = true, optional = true }
strum.workspace = true
thiserror = "2"
thiserror = { workspace = true, default-features = false }
unicode-segmentation.workspace = true
unicode-truncate = "2"
unicode-truncate = { workspace = true, default-features = false }
unicode-width.workspace = true
[dev-dependencies]

Some files were not shown because too many files have changed in this diff Show More