Ratatui v0.30 will introduce block border merging, a feature that previously required manual handling.

You can now set the border merge strategy using Blockโ€™s new method: merge_borders

๐Ÿ“š From the docs:

use ratatui::symbols::merge::MergeStrategy;

// Given several blocks with plain borders (1)
Block::bordered();
// and other blocks with thick borders (2) which are rendered on top of the first
Block::bordered()
    .border_type(BorderType::Thick)
    .merge_borders(MergeStrategy::Exact);
โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”ฒโ”โ”โ”โ”“โ”Œโ”€โ”€โ”€โ”
โ”‚   โ”‚    โ”‚ 1 โ”‚  โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚
โ”‚ 1 โ”‚    โ”‚ โ”โ”โ”ฟโ”โ”“โ”‚ 1 โ”ƒ 2 โ”ƒโ”‚ 1 โ”‚
โ”‚   โ”‚    โ”‚ โ”ƒ โ”‚ โ”ƒโ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚
โ””โ”€โ”€โ”€โ•†โ”โ”โ”โ”“โ””โ”€โ•‚โ”€โ”˜ โ”ƒโ””โ”€โ”€โ”€โ”บโ”โ”โ”โ”›โ”ขโ”โ”โ”โ”ช
    โ”ƒ   โ”ƒ  โ”ƒ 2 โ”ƒ         โ”ƒ   โ”ƒ
    โ”ƒ 2 โ”ƒ  โ”—โ”โ”โ”โ”›         โ”ƒ 2 โ”ƒ
    โ”ƒ   โ”ƒ                โ”ƒ   โ”ƒ
    โ”—โ”โ”โ”โ”›                โ”—โ”โ”โ”โ”›

๐Ÿ™Œ Acknowledgments

Big thanks to:

They helped make this feature a reality.

๐Ÿ”— View the final PR: #1874
๐Ÿ”— Original PR by @pauladam94: #1729
Lots of insightful discussion in both!


๐Ÿงช Merge Strategy Comparison

Below is a full comparison of the three MergeStrategy variants.

๐Ÿ“˜ For detailed behavior, refer to the API docs.

โ–ˆ      MergeStrategy::Replace      โ–ˆ       MergeStrategy::Exact       โ–ˆ       MergeStrategy::Fuzzy       โ–ˆ
โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆ
โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”โ”โ”โ”โ”“โ”Œโ”€โ”€โ”€โ”  โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”ฒโ”โ”โ”โ”“โ”Œโ”€โ”€โ”€โ”  โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”ฒโ”โ”โ”โ”“โ”Œโ”€โ”€โ”€โ”  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚ โ”โ”โ”โ”โ”“โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ”โ”โ”ฟโ”โ”“โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ”โ”โ”ฟโ”โ”“โ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚ โ”ƒ โ”‚ โ”ƒโ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ”ƒ โ”‚ โ”ƒโ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ”ƒ โ”‚ โ”ƒโ”‚   โ”ƒ   โ”ƒโ”‚   โ”‚  โ–ˆ
โ–ˆ  โ””โ”€โ”€โ”€โ”โ”โ”โ”โ”“โ””โ”€โ”ƒโ”€โ”˜ โ”ƒโ””โ”€โ”€โ”€โ”—โ”โ”โ”โ”›โ”โ”โ”โ”โ”“  โ–ˆ  โ””โ”€โ”€โ”€โ•†โ”โ”โ”โ”“โ””โ”€โ•‚โ”€โ”˜ โ”ƒโ””โ”€โ”€โ”€โ”บโ”โ”โ”โ”›โ”ขโ”โ”โ”โ”ช  โ–ˆ  โ””โ”€โ”€โ”€โ•†โ”โ”โ”โ”“โ””โ”€โ•‚โ”€โ”˜ โ”ƒโ””โ”€โ”€โ”€โ”บโ”โ”โ”โ”›โ”ขโ”โ”โ”โ”ช  โ–ˆ
โ–ˆ      โ”ƒ   โ”ƒ  โ”ƒ   โ”ƒ         โ”ƒ   โ”ƒ  โ–ˆ      โ”ƒ   โ”ƒ  โ”ƒ   โ”ƒ         โ”ƒ   โ”ƒ  โ–ˆ      โ”ƒ   โ”ƒ  โ”ƒ   โ”ƒ         โ”ƒ   โ”ƒ  โ–ˆ
โ–ˆ      โ”ƒ   โ”ƒ  โ”—โ”โ”โ”โ”›         โ”ƒ   โ”ƒ  โ–ˆ      โ”ƒ   โ”ƒ  โ”—โ”โ”โ”โ”›         โ”ƒ   โ”ƒ  โ–ˆ      โ”ƒ   โ”ƒ  โ”—โ”โ”โ”โ”›         โ”ƒ   โ”ƒ  โ–ˆ
โ–ˆ      โ”ƒ   โ”ƒ                โ”ƒ   โ”ƒ  โ–ˆ      โ”ƒ   โ”ƒ                โ”ƒ   โ”ƒ  โ–ˆ      โ”ƒ   โ”ƒ                โ”ƒ   โ”ƒ  โ–ˆ
โ–ˆ      โ”—โ”โ”โ”โ”›                โ”—โ”โ”โ”โ”›  โ–ˆ      โ”—โ”โ”โ”โ”›                โ”—โ”โ”โ”โ”›  โ–ˆ      โ”—โ”โ”โ”โ”›                โ”—โ”โ”โ”โ”›  โ–ˆ
โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ•”โ•โ•โ•โ•—โ”Œโ”€โ”€โ”€โ”  โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ•”โ•โ•โ•โ•—โ”Œโ”€โ”€โ”€โ”  โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ•ฆโ•โ•โ•โ•—โ”Œโ”€โ”€โ”€โ”  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚ โ•”โ•โ•โ•โ•—โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ•”โ•โ•ชโ•โ•—โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ•”โ•โ•ชโ•โ•—โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚ โ•‘ โ”‚ โ•‘โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ•‘ โ”‚ โ•‘โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ•‘ โ”‚ โ•‘โ”‚   โ•‘   โ•‘โ”‚   โ”‚  โ–ˆ
โ–ˆ  โ””โ”€โ”€โ”€โ•”โ•โ•โ•โ•—โ””โ”€โ•‘โ”€โ”˜ โ•‘โ””โ”€โ”€โ”€โ•šโ•โ•โ•โ•โ•”โ•โ•โ•โ•—  โ–ˆ  โ””โ”€โ”€โ”€โ•”โ•โ•โ•โ•—โ””โ”€โ•ซโ”€โ”˜ โ•‘โ””โ”€โ”€โ”€โ•šโ•โ•โ•โ•โ•”โ•โ•โ•โ•—  โ–ˆ  โ””โ”€โ”€โ”€โ•ฌโ•โ•โ•โ•—โ””โ”€โ•ซโ”€โ”˜ โ•‘โ””โ”€โ”€โ”€โ•ฉโ•โ•โ•โ•โ• โ•โ•โ•โ•ฃ  โ–ˆ
โ–ˆ      โ•‘   โ•‘  โ•‘   โ•‘         โ•‘   โ•‘  โ–ˆ      โ•‘   โ•‘  โ•‘   โ•‘         โ•‘   โ•‘  โ–ˆ      โ•‘   โ•‘  โ•‘   โ•‘         โ•‘   โ•‘  โ–ˆ
โ–ˆ      โ•‘   โ•‘  โ•šโ•โ•โ•โ•         โ•‘   โ•‘  โ–ˆ      โ•‘   โ•‘  โ•šโ•โ•โ•โ•         โ•‘   โ•‘  โ–ˆ      โ•‘   โ•‘  โ•šโ•โ•โ•โ•         โ•‘   โ•‘  โ–ˆ
โ–ˆ      โ•‘   โ•‘                โ•‘   โ•‘  โ–ˆ      โ•‘   โ•‘                โ•‘   โ•‘  โ–ˆ      โ•‘   โ•‘                โ•‘   โ•‘  โ–ˆ
โ–ˆ      โ•šโ•โ•โ•โ•                โ•šโ•โ•โ•โ•  โ–ˆ      โ•šโ•โ•โ•โ•                โ•šโ•โ•โ•โ•  โ–ˆ      โ•šโ•โ•โ•โ•                โ•šโ•โ•โ•โ•  โ–ˆ
โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”Œโ•Œโ•Œโ•Œโ”โ”Œโ”€โ”€โ”€โ”  โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”ฌโ•Œโ•Œโ•Œโ”โ”Œโ”€โ”€โ”€โ”  โ–ˆ  โ”Œโ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”ฌโ•Œโ•Œโ•Œโ”โ”Œโ”€โ”€โ”€โ”  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚   โ”‚  โ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚ โ”Œโ•Œโ•Œโ•Œโ”โ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ”Œโ•Œโ•Œโ•Œโ”โ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ”Œโ•Œโ”ผโ•Œโ”โ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ
โ–ˆ  โ”‚   โ”‚    โ”‚ โ•Ž โ”‚ โ•Žโ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ•Ž โ”‚ โ•Žโ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ  โ”‚   โ”‚    โ”‚ โ•Ž โ”‚ โ•Žโ”‚   โ•Ž   โ•Žโ”‚   โ”‚  โ–ˆ
โ–ˆ  โ””โ”€โ”€โ”€โ”Œโ•Œโ•Œโ•Œโ”โ””โ”€โ•Žโ”€โ”˜ โ•Žโ””โ”€โ”€โ”€โ””โ•Œโ•Œโ•Œโ”˜โ”Œโ•Œโ•Œโ•Œโ”  โ–ˆ  โ””โ”€โ”€โ”€โ”ผโ•Œโ•Œโ•Œโ”โ””โ”€โ•Žโ”€โ”˜ โ•Žโ””โ”€โ”€โ”€โ”ดโ•Œโ•Œโ•Œโ”˜โ”œโ•Œโ•Œโ•Œโ”ค  โ–ˆ  โ””โ”€โ”€โ”€โ”ผโ•Œโ•Œโ•Œโ”โ””โ”€โ”ผโ”€โ”˜ โ•Žโ””โ”€โ”€โ”€โ”ดโ•Œโ•Œโ•Œโ”˜โ”œโ•Œโ•Œโ•Œโ”ค  โ–ˆ
โ–ˆ      โ•Ž   โ•Ž  โ•Ž   โ•Ž         โ•Ž   โ•Ž  โ–ˆ      โ•Ž   โ•Ž  โ•Ž   โ•Ž         โ•Ž   โ•Ž  โ–ˆ      โ•Ž   โ•Ž  โ•Ž   โ•Ž         โ•Ž   โ•Ž  โ–ˆ
โ–ˆ      โ•Ž   โ•Ž  โ””โ•Œโ•Œโ•Œโ”˜         โ•Ž   โ•Ž  โ–ˆ      โ•Ž   โ•Ž  โ””โ•Œโ•Œโ•Œโ”˜         โ•Ž   โ•Ž  โ–ˆ      โ•Ž   โ•Ž  โ””โ•Œโ•Œโ•Œโ”˜         โ•Ž   โ•Ž  โ–ˆ
โ–ˆ      โ•Ž   โ•Ž                โ•Ž   โ•Ž  โ–ˆ      โ•Ž   โ•Ž                โ•Ž   โ•Ž  โ–ˆ      โ•Ž   โ•Ž                โ•Ž   โ•Ž  โ–ˆ
โ–ˆ      โ””โ•Œโ•Œโ•Œโ”˜                โ””โ•Œโ•Œโ•Œโ”˜  โ–ˆ      โ””โ•Œโ•Œโ•Œโ”˜                โ””โ•Œโ•Œโ•Œโ”˜  โ–ˆ      โ””โ•Œโ•Œโ•Œโ”˜                โ””โ•Œโ•Œโ•Œโ”˜  โ–ˆ
โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆ

๐Ÿ“„ View full comparison:
border_merging.txt (gist)