Phase 6: Plattformprüfungen und absolute RGB-Farben, Change 05 archivieren

This commit is contained in:
2026-09-07 21:12:25 +02:00
parent 5aa920b768
commit 796564795a
55 changed files with 3772 additions and 200 deletions

View File

@@ -11,74 +11,9 @@ use ratatui::{
};
use unicode_width::{UnicodeWidthChar, UnicodeWidthStr};
/// DOS-Farben der IDE. Die ersten 16 ANSI-Einträge gehören dem Terminalprofil.
/// BASIC-Ausgabe verwendet weiterhin ihre eigene Farbabbildung in tb-ui.
/// Feste DOS-RGB-Farben, identisch für IDE und BASIC-Ausgabe.
pub fn dos(n: u8) -> Color {
static COLORS: std::sync::OnceLock<u16> = std::sync::OnceLock::new();
dos_color(
n,
*COLORS.get_or_init(|| {
let detected = crossterm::style::available_color_count();
// Ein generisches COLORTERM (z.B. "yes") verdeckt bei crossterm TERM.
if detected < 256 && std::env::var("TERM").is_ok_and(|s| s.contains("256")) {
256
} else {
detected
}
}),
)
}
pub fn dos_color(n: u8, colors: u16) -> Color {
let n = n.min(15) as usize;
const RGB: [(u8, u8, u8); 16] = [
(0, 0, 0),
(0, 0, 170),
(0, 170, 0),
(0, 170, 170),
(170, 0, 0),
(170, 0, 170),
(170, 85, 0),
(170, 170, 170),
(85, 85, 85),
(85, 85, 255),
(85, 255, 85),
(85, 255, 255),
(255, 85, 85),
(255, 85, 255),
(255, 255, 85),
(255, 255, 255),
];
if colors > 256 {
let (r, g, b) = RGB[n];
Color::Rgb(r, g, b)
} else if colors >= 256 {
// Fester 6x6x6-Farbwürfel / Graurampe statt profilabhängiger Systemfarben.
Color::Indexed(
[
16, 19, 34, 37, 124, 127, 130, 248, 240, 63, 83, 87, 203, 207, 227, 231,
][n],
)
} else {
[
Color::Black,
Color::Blue,
Color::Green,
Color::Cyan,
Color::Red,
Color::Magenta,
Color::Yellow,
Color::Gray,
Color::DarkGray,
Color::LightBlue,
Color::LightGreen,
Color::LightCyan,
Color::LightRed,
Color::LightMagenta,
Color::LightYellow,
Color::White,
][n]
}
tb_ui::screen::basic_color(n.min(15))
}
pub(crate) fn pair(fg: u8, bg: u8) -> Style {
@@ -160,6 +95,8 @@ impl App {
5
},
);
// Block/Paragraph ändern Stile, löschen aber keine vorhandenen Zeichen.
f.render_widget(Clear, rect);
f.render_widget(
Block::default()
.borders(Borders::ALL)