diff --git a/src/graphics/TFTColorRegions.cpp b/src/graphics/TFTColorRegions.cpp index 25ab34cb6..d04df4a38 100644 --- a/src/graphics/TFTColorRegions.cpp +++ b/src/graphics/TFTColorRegions.cpp @@ -215,6 +215,34 @@ static const TFTThemeDef kThemes[] = { TFTPalette::White, // bodyFg false, // fullFrameInvert }, + + // ── Creamsicle (ThemeID::Creamsicle = 5) — light variant ───────── + { + ThemeID::Creamsicle, // id + "Creamsicle", // name + { + {TFTPalette::CreamOrange, TFTPalette::Black}, // HeaderBackground + {TFTPalette::CreamOrange, TFTPalette::White}, // HeaderTitle + {TFTPalette::CreamOrange, TFTPalette::White}, // HeaderStatus + {TFTPalette::DeepOrange, TFTPalette::Cream}, // SignalBars + {TFTPalette::DeepOrange, TFTPalette::Cream}, // BatteryFill + {TFTPalette::CreamOrange, TFTPalette::Cream}, // ConnectionIcon + {TFTPalette::DeepOrange, TFTPalette::Cream}, // UtilizationFill + {TFTPalette::Black, TFTPalette::CreamOrange}, // FavoriteNode + {TFTPalette::CreamOrange, TFTPalette::Cream}, // ActionMenuBorder + {TFTPalette::Black, TFTPalette::Cream}, // ActionMenuBody + {TFTPalette::CreamOrange, TFTPalette::White}, // ActionMenuTitle + {TFTPalette::Black, TFTPalette::White}, // FrameMono + {TFTPalette::White, TFTPalette::CreamOrange}, // BootSplash + {TFTPalette::Black, TFTPalette::CreamOrange}, // BodyYellow + }, + TFTPalette::CreamOrange, // headerBg + TFTPalette::White, // headerText + TFTPalette::White, // headerStatus + TFTPalette::Cream, // bodyBg + TFTPalette::Black, // bodyFg + true, // fullFrameInvert + }, }; static constexpr size_t kInternalThemeCount = sizeof(kThemes) / sizeof(kThemes[0]); @@ -388,6 +416,11 @@ void setTFTColorRole(TFTColorRole role, uint16_t onColor, uint16_t offColor) if (offColor == TFTPalette::Black) offColor = TFTPalette::Navy; break; + case ThemeID::Creamsicle: + // Orange-on-cream: high-contrast dark on orange. + onColor = TFTPalette::Black; + offColor = TFTPalette::CreamOrange; + break; default: break; } @@ -429,6 +462,18 @@ void setTFTColorRole(TFTColorRole role, uint16_t onColor, uint16_t offColor) if (offColor == TFTPalette::Black) offColor = TFTPalette::Navy; break; + case ThemeID::Creamsicle: + // Invert body colours for readability on cream frames. + if (offColor == TFTPalette::Black) { + offColor = TFTPalette::Cream; + } + if (onColor == TFTPalette::White) { + onColor = TFTPalette::Black; + } + if (onColor == TFTPalette::Yellow) { + onColor = TFTPalette::DeepOrange; + } + break; default: break; } diff --git a/src/graphics/TFTColorRegions.h b/src/graphics/TFTColorRegions.h index 641801877..1dce71592 100644 --- a/src/graphics/TFTColorRegions.h +++ b/src/graphics/TFTColorRegions.h @@ -69,6 +69,7 @@ constexpr uint32_t DefaultLight = 1; constexpr uint32_t Christmas = 2; constexpr uint32_t Pink = 3; constexpr uint32_t Blue = 4; +constexpr uint32_t Creamsicle = 5; } // namespace ThemeID // Per-role color pair stored in native (little-endian) RGB565 format. diff --git a/src/graphics/TFTPalette.h b/src/graphics/TFTPalette.h index 33ae686bb..038b4cdd4 100644 --- a/src/graphics/TFTPalette.h +++ b/src/graphics/TFTPalette.h @@ -46,5 +46,10 @@ constexpr uint16_t SkyBlue = rgb565(100, 180, 255); constexpr uint16_t Navy = rgb565(15, 15, 50); constexpr uint16_t DeepBlue = rgb565(30, 60, 120); +// Creamsicle theme colors (light variant) +constexpr uint16_t CreamOrange = rgb565(255, 140, 50); +constexpr uint16_t DeepOrange = rgb565(220, 100, 20); +constexpr uint16_t Cream = rgb565(255, 248, 235); + } // namespace TFTPalette } // namespace graphics