Add new GUI themes and update documentation.
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
Release / Build Linux amd64 (push) Has been cancelled
Release / Build Linux arm64 (push) Has been cancelled
Release / Build macOS arm64 (.app) (push) Has been cancelled
Release / Create GitHub Release (push) Has been cancelled

- Amber
- LCARS
- Orbital
- Weyland-Yutani
- Kanagawa Paper (dark mode extension)

Update help text to reflect additions.
This commit is contained in:
2025-12-03 00:36:01 -08:00
parent 64022766c5
commit c864af7daa
10 changed files with 846 additions and 81 deletions

View File

@@ -155,7 +155,11 @@ set(THEME_HEADERS
themes/Nord.h themes/Nord.h
themes/Everforest.h themes/Everforest.h
themes/KanagawaPaper.h themes/KanagawaPaper.h
themes/LCARS.h
themes/OldBook.h themes/OldBook.h
themes/Amber.h
themes/Orbital.h
themes/WeylandYutani.h
themes/Zenburn.h themes/Zenburn.h
) )

View File

@@ -20,16 +20,20 @@ static inline auto gBackgroundMode = BackgroundMode::Dark;
// Basic theme identifier (kept minimal; some ids are aliases) // Basic theme identifier (kept minimal; some ids are aliases)
enum class ThemeId { enum class ThemeId {
EInk = 0, EInk = 0,
GruvboxDarkMedium = 1, GruvboxDarkMedium = 1,
GruvboxLightMedium = 1, // alias to unified gruvbox index GruvboxLightMedium = 1, // alias to unified gruvbox index
Nord = 2, Nord = 2,
Plan9 = 3, Plan9 = 3,
Solarized = 4, Solarized = 4,
Everforest = 5, Everforest = 5,
KanagawaPaper = 6, KanagawaPaper = 6,
OldBook = 7, LCARS = 7,
Zenburn = 8, OldBook = 8,
Zenburn = 9,
Amber = 10,
WeylandYutani = 11,
Orbital = 12,
}; };
// Current theme tracking // Current theme tracking
@@ -71,8 +75,12 @@ BackgroundModeName()
#include "themes/EInk.h" #include "themes/EInk.h"
#include "themes/Everforest.h" #include "themes/Everforest.h"
#include "themes/KanagawaPaper.h" #include "themes/KanagawaPaper.h"
#include "themes/LCARS.h"
#include "themes/OldBook.h" #include "themes/OldBook.h"
#include "themes/Amber.h"
#include "themes/WeylandYutani.h"
#include "themes/Zenburn.h" #include "themes/Zenburn.h"
#include "themes/Orbital.h"
// Theme abstraction and registry (generalized theme system) // Theme abstraction and registry (generalized theme system)
@@ -86,6 +94,25 @@ public:
}; };
namespace detail { namespace detail {
struct LCARSTheme final : Theme {
[[nodiscard]] const char *Name() const override
{
return "lcars";
}
void Apply() const override
{
ApplyLcarsTheme();
}
ThemeId Id() override
{
return ThemeId::LCARS;
}
};
struct EverforestTheme final : Theme { struct EverforestTheme final : Theme {
[[nodiscard]] const char *Name() const override [[nodiscard]] const char *Name() const override
{ {
@@ -133,7 +160,10 @@ struct OldBookTheme final : Theme {
void Apply() const override void Apply() const override
{ {
ApplyOldBookTheme(); if (gBackgroundMode == BackgroundMode::Dark)
ApplyOldBookDarkTheme();
else
ApplyOldBookLightTheme();
} }
@@ -143,6 +173,25 @@ struct OldBookTheme final : Theme {
} }
}; };
struct OrbitalTheme final : Theme {
[[nodiscard]] const char *Name() const override
{
return "orbital";
}
void Apply() const override
{
ApplyOrbitalTheme();
}
ThemeId Id() override
{
return ThemeId::Orbital;
}
};
struct ZenburnTheme final : Theme { struct ZenburnTheme final : Theme {
[[nodiscard]] const char *Name() const override [[nodiscard]] const char *Name() const override
{ {
@@ -161,6 +210,7 @@ struct ZenburnTheme final : Theme {
return ThemeId::Zenburn; return ThemeId::Zenburn;
} }
}; };
struct NordTheme final : Theme { struct NordTheme final : Theme {
[[nodiscard]] const char *Name() const override [[nodiscard]] const char *Name() const override
{ {
@@ -180,6 +230,44 @@ struct NordTheme final : Theme {
} }
}; };
struct AmberTheme final : Theme {
[[nodiscard]] const char *Name() const override
{
return "amber";
}
void Apply() const override
{
ApplyAmberTheme();
}
ThemeId Id() override
{
return ThemeId::Amber;
}
};
struct WeylandYutaniTheme final : Theme {
[[nodiscard]] const char *Name() const override
{
return "weyland-yutani";
}
void Apply() const override
{
ApplyWeylandYutaniTheme();
}
ThemeId Id() override
{
return ThemeId::WeylandYutani;
}
};
struct GruvboxTheme final : Theme { struct GruvboxTheme final : Theme {
[[nodiscard]] const char *Name() const override [[nodiscard]] const char *Name() const override
{ {
@@ -270,21 +358,25 @@ struct Plan9Theme final : Theme {
static const std::vector<std::unique_ptr<Theme> > & static const std::vector<std::unique_ptr<Theme> > &
ThemeRegistry() ThemeRegistry()
{ {
static std::vector<std::unique_ptr<Theme> > reg; static std::vector<std::unique_ptr<Theme> > reg;
if (reg.empty()) { if (reg.empty()) {
// Alphabetical by canonical name: // Alphabetical by canonical name:
// eink, everforest, gruvbox, kanagawa-paper, nord, old-book, plan9, solarized, zenburn // amber, eink, everforest, gruvbox, kanagawa-paper, lcars, nord, old-book, orbital, plan9, solarized, weyland-yutani, zenburn
reg.emplace_back(std::make_unique<detail::EInkTheme>()); reg.emplace_back(std::make_unique<detail::AmberTheme>());
reg.emplace_back(std::make_unique<detail::EverforestTheme>()); reg.emplace_back(std::make_unique<detail::EInkTheme>());
reg.emplace_back(std::make_unique<detail::GruvboxTheme>()); reg.emplace_back(std::make_unique<detail::EverforestTheme>());
reg.emplace_back(std::make_unique<detail::KanagawaPaperTheme>()); reg.emplace_back(std::make_unique<detail::GruvboxTheme>());
reg.emplace_back(std::make_unique<detail::NordTheme>()); reg.emplace_back(std::make_unique<detail::KanagawaPaperTheme>());
reg.emplace_back(std::make_unique<detail::OldBookTheme>()); reg.emplace_back(std::make_unique<detail::LCARSTheme>());
reg.emplace_back(std::make_unique<detail::Plan9Theme>()); reg.emplace_back(std::make_unique<detail::NordTheme>());
reg.emplace_back(std::make_unique<detail::SolarizedTheme>()); reg.emplace_back(std::make_unique<detail::OldBookTheme>());
reg.emplace_back(std::make_unique<detail::ZenburnTheme>()); reg.emplace_back(std::make_unique<detail::OrbitalTheme>());
} reg.emplace_back(std::make_unique<detail::Plan9Theme>());
return reg; reg.emplace_back(std::make_unique<detail::SolarizedTheme>());
reg.emplace_back(std::make_unique<detail::WeylandYutaniTheme>());
reg.emplace_back(std::make_unique<detail::ZenburnTheme>());
}
return reg;
} }
@@ -398,9 +490,20 @@ ApplyThemeByName(const std::string &name)
} else if (n == "oldbook") { } else if (n == "oldbook") {
// alias to old-book // alias to old-book
n = "old-book"; n = "old-book";
} else if (n == "kanagawa" || n == "kanagawa-paper-light" || n == "kanagawa-light") { } else if (n == "old-book-dark" || n == "oldbook-dark") {
// map to canonical kanagawa-paper (it's a light theme) SetBackgroundMode(BackgroundMode::Dark);
n = "old-book";
} else if (n == "old-book-light" || n == "oldbook-light") {
SetBackgroundMode(BackgroundMode::Light);
n = "old-book";
} else if (n == "kanagawa" || n == "kanagawa-paper-light" || n == "kanagawa-light"
|| n == "kanagawa-dark" || n == "kanagawa-paper-dark") {
// map to canonical kanagawa-paper; background controls light/dark
n = "kanagawa-paper"; n = "kanagawa-paper";
} else if (n == "vim-amber") {
n = "amber";
} else if (n == "weyland") {
n = "weyland-yutani";
} }
const auto &reg = ThemeRegistry(); const auto &reg = ThemeRegistry();
@@ -433,54 +536,70 @@ CurrentThemeName()
static size_t static size_t
ThemeIndexFromId(const ThemeId id) ThemeIndexFromId(const ThemeId id)
{ {
switch (id) { switch (id) {
case ThemeId::EInk: case ThemeId::Amber:
return 0; return 0;
case ThemeId::Everforest: case ThemeId::EInk:
return 1; return 1;
case ThemeId::GruvboxDarkMedium: case ThemeId::Everforest:
return 2; return 2;
case ThemeId::KanagawaPaper: case ThemeId::GruvboxDarkMedium:
return 3; return 3;
case ThemeId::Nord: case ThemeId::KanagawaPaper:
return 4; return 4;
case ThemeId::OldBook: case ThemeId::LCARS:
return 5; return 5;
case ThemeId::Plan9: case ThemeId::Nord:
return 6; return 6;
case ThemeId::Solarized: case ThemeId::OldBook:
return 7; return 7;
case ThemeId::Zenburn: case ThemeId::Orbital:
return 8; return 8;
} case ThemeId::Plan9:
return 0; return 9;
case ThemeId::Solarized:
return 10;
case ThemeId::WeylandYutani:
return 11;
case ThemeId::Zenburn:
return 12;
}
return 0;
} }
static ThemeId static ThemeId
ThemeIdFromIndex(const size_t idx) ThemeIdFromIndex(const size_t idx)
{ {
switch (idx) { switch (idx) {
default: default:
case 0: case 0:
return ThemeId::EInk; return ThemeId::Amber;
case 1: case 1:
return ThemeId::Everforest; return ThemeId::EInk;
case 2: case 2:
return ThemeId::GruvboxDarkMedium; // unified gruvbox return ThemeId::Everforest;
case 3: case 3:
return ThemeId::KanagawaPaper; return ThemeId::GruvboxDarkMedium; // unified gruvbox
case 4: case 4:
return ThemeId::Nord; return ThemeId::KanagawaPaper;
case 5: case 5:
return ThemeId::OldBook; return ThemeId::LCARS;
case 6: case 6:
return ThemeId::Plan9; return ThemeId::Nord;
case 7: case 7:
return ThemeId::Solarized; return ThemeId::OldBook;
case 8: case 8:
return ThemeId::Zenburn; return ThemeId::Orbital;
} case 9:
return ThemeId::Plan9;
case 10:
return ThemeId::Solarized;
case 11:
return ThemeId::WeylandYutani;
case 12:
return ThemeId::Zenburn;
}
} }
@@ -525,4 +644,4 @@ SyntaxInk(const TokenKind k)
return def; return def;
} }
} }
} // namespace kte } // namespace kte

View File

@@ -75,7 +75,7 @@ HelpText::Text()
"Buffers:\n +HELP+ is read-only. Press C-k ' to toggle; C-k h restores it.\n" "Buffers:\n +HELP+ is read-only. Press C-k ' to toggle; C-k h restores it.\n"
"\n" "\n"
"GUI appearance (command prompt):\n" "GUI appearance (command prompt):\n"
" : theme NAME Set GUI theme (eink, everforest, gruvbox, kanagawa-paper, nord, old-book, plan9, solarized, zenburn)\n" " : theme NAME Set GUI theme (amber, eink, everforest, gruvbox, kanagawa-paper, lcars, nord, old-book, plan9, solarized, weyland-yutani, zenburn)\n"
" : background MODE Set background: light | dark (affects eink, gruvbox, solarized)\n" " : background MODE Set background: light | dark (affects eink, gruvbox, old-book, solarized)\n"
); );
} }

View File

@@ -146,15 +146,16 @@ When running the GUI frontend, you can control appearance via the generic
command prompt (type "C-k ;" then enter commands): command prompt (type "C-k ;" then enter commands):
.TP .TP
.B : theme NAME .B : theme NAME
Set the GUI theme. Available names: "eink", "everforest", "gruvbox", "kanagawa-paper", "nord", "old-book", "plan9", "solarized", "zenburn". Set the GUI theme. Available names: "amber", "eink", "everforest", "gruvbox", "kanagawa-paper", "lcars", "nord", "old-book", "orbital", "plan9", "solarized", "weyland-yutani", "zenburn".
Compatibility aliases are also accepted: "gruvbox-dark", "gruvbox-light", Compatibility aliases are also accepted: "gruvbox-dark", "gruvbox-light",
"solarized-dark", "solarized-light", "eink-dark", "eink-light", "solarized-dark", "solarized-light", "eink-dark", "eink-light",
"everforest-hard", "oldbook", "kanagawa", "kanagawa-light", "kanagawa-paper-light". "everforest-hard", "oldbook", "old-book-dark", "old-book-light",
"kanagawa", "kanagawa-light", "kanagawa-paper-light", "vim-amber", "weyland".
.TP .TP
.B : background MODE .B : background MODE
Set background mode for supported themes. MODE is either "light" or "dark". Set background mode for supported themes. MODE is either "light" or "dark".
Themes that respond to background: eink, gruvbox, solarized. The Themes that respond to background: eink, gruvbox, kanagawa-paper, old-book, solarized. The
"nord" and "plan9" themes do not vary with background. "lcars", "nord" and "plan9" themes do not vary with background.
.SH CONFIGURATION .SH CONFIGURATION
The GUI reads a simple configuration file at The GUI reads a simple configuration file at

107
themes/Amber.h Normal file
View File

@@ -0,0 +1,107 @@
// themes/Amber.h — Vim Amber inspired ImGui theme (header-only)
#pragma once
#include "ThemeHelpers.h"
// Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper
static inline void
ApplyAmberTheme()
{
// Amber: dark background with amber/orange highlights and warm text
const ImVec4 bg0 = RGBA(0x141414);
const ImVec4 bg1 = RGBA(0x1E1E1E);
const ImVec4 bg2 = RGBA(0x2A2A2A);
const ImVec4 bg3 = RGBA(0x343434);
const ImVec4 text = RGBA(0xE6D5A3); // warm parchment-like text
const ImVec4 text2 = RGBA(0xFFF2C2);
const ImVec4 amber = RGBA(0xFFB000);
const ImVec4 orange = RGBA(0xFF8C32);
const ImVec4 yellow = RGBA(0xFFD166);
const ImVec4 teal = RGBA(0x3AAFA9);
const ImVec4 cyan = RGBA(0x4CC9F0);
ImGuiStyle &style = ImGui::GetStyle();
style.WindowPadding = ImVec2(8.0f, 8.0f);
style.FramePadding = ImVec2(6.0f, 4.0f);
style.CellPadding = ImVec2(6.0f, 4.0f);
style.ItemSpacing = ImVec2(6.0f, 6.0f);
style.ItemInnerSpacing = ImVec2(6.0f, 4.0f);
style.ScrollbarSize = 14.0f;
style.GrabMinSize = 10.0f;
style.WindowRounding = 4.0f;
style.FrameRounding = 3.0f;
style.PopupRounding = 4.0f;
style.GrabRounding = 3.0f;
style.TabRounding = 4.0f;
style.WindowBorderSize = 1.0f;
style.FrameBorderSize = 1.0f;
ImVec4 *colors = style.Colors;
colors[ImGuiCol_Text] = text;
colors[ImGuiCol_TextDisabled] = ImVec4(text.x, text.y, text.z, 0.55f);
colors[ImGuiCol_WindowBg] = bg0;
colors[ImGuiCol_ChildBg] = bg0;
colors[ImGuiCol_PopupBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.98f);
colors[ImGuiCol_Border] = bg3;
colors[ImGuiCol_BorderShadow] = RGBA(0x000000, 0.0f);
colors[ImGuiCol_FrameBg] = bg2;
colors[ImGuiCol_FrameBgHovered] = ImVec4(amber.x, amber.y, amber.z, 0.20f);
colors[ImGuiCol_FrameBgActive] = ImVec4(orange.x, orange.y, orange.z, 0.25f);
colors[ImGuiCol_TitleBg] = bg1;
colors[ImGuiCol_TitleBgActive] = bg2;
colors[ImGuiCol_TitleBgCollapsed] = bg1;
colors[ImGuiCol_MenuBarBg] = bg1;
colors[ImGuiCol_ScrollbarBg] = bg0;
colors[ImGuiCol_ScrollbarGrab] = bg3;
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(amber.x, amber.y, amber.z, 0.50f);
colors[ImGuiCol_ScrollbarGrabActive] = amber;
colors[ImGuiCol_CheckMark] = amber;
colors[ImGuiCol_SliderGrab] = amber;
colors[ImGuiCol_SliderGrabActive] = orange;
colors[ImGuiCol_Button] = bg3;
colors[ImGuiCol_ButtonHovered] = ImVec4(amber.x, amber.y, amber.z, 0.25f);
colors[ImGuiCol_ButtonActive] = ImVec4(amber.x, amber.y, amber.z, 0.40f);
colors[ImGuiCol_Header] = ImVec4(amber.x, amber.y, amber.z, 0.25f);
colors[ImGuiCol_HeaderHovered] = ImVec4(yellow.x, yellow.y, yellow.z, 0.30f);
colors[ImGuiCol_HeaderActive] = ImVec4(orange.x, orange.y, orange.z, 0.30f);
colors[ImGuiCol_Separator] = bg3;
colors[ImGuiCol_SeparatorHovered] = amber;
colors[ImGuiCol_SeparatorActive] = orange;
colors[ImGuiCol_ResizeGrip] = ImVec4(text2.x, text2.y, text2.z, 0.12f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(amber.x, amber.y, amber.z, 0.67f);
colors[ImGuiCol_ResizeGripActive] = orange;
colors[ImGuiCol_Tab] = bg2;
colors[ImGuiCol_TabHovered] = ImVec4(amber.x, amber.y, amber.z, 0.25f);
colors[ImGuiCol_TabActive] = ImVec4(yellow.x, yellow.y, yellow.z, 0.30f);
colors[ImGuiCol_TabUnfocused] = bg2;
colors[ImGuiCol_TabUnfocusedActive] = bg3;
colors[ImGuiCol_TableHeaderBg] = bg2;
colors[ImGuiCol_TableBorderStrong] = bg1;
colors[ImGuiCol_TableBorderLight] = ImVec4(bg1.x, bg1.y, bg1.z, 0.6f);
colors[ImGuiCol_TableRowBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.2f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(bg1.x, bg1.y, bg1.z, 0.35f);
colors[ImGuiCol_TextSelectedBg] = ImVec4(amber.x, amber.y, amber.z, 0.28f);
colors[ImGuiCol_DragDropTarget] = orange;
colors[ImGuiCol_NavHighlight] = cyan;
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(text2.x, text2.y, text2.z, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.45f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.45f);
colors[ImGuiCol_PlotLines] = teal;
colors[ImGuiCol_PlotLinesHovered] = cyan;
colors[ImGuiCol_PlotHistogram] = amber;
colors[ImGuiCol_PlotHistogramHovered] = orange;
}

View File

@@ -5,7 +5,7 @@
// Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper // Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper
static void static void
ApplyKanagawaPaperTheme() ApplyKanagawaPaperLightTheme()
{ {
// Approximate Kanagawa Paper (light) palette // Approximate Kanagawa Paper (light) palette
const ImVec4 bg0 = RGBA(0xF2EAD3); // paper const ImVec4 bg0 = RGBA(0xF2EAD3); // paper
@@ -102,4 +102,105 @@ ApplyKanagawaPaperTheme()
colors[ImGuiCol_PlotLinesHovered] = blue; colors[ImGuiCol_PlotLinesHovered] = blue;
colors[ImGuiCol_PlotHistogram] = yellow; colors[ImGuiCol_PlotHistogram] = yellow;
colors[ImGuiCol_PlotHistogramHovered] = orange; colors[ImGuiCol_PlotHistogramHovered] = orange;
}
static void
ApplyKanagawaPaperDarkTheme()
{
// Approximate Kanagawa (dark) with paper-inspired warmth
const ImVec4 bg0 = RGBA(0x1F1E1A); // deep warm black
const ImVec4 bg1 = RGBA(0x25241F);
const ImVec4 bg2 = RGBA(0x2E2C26);
const ImVec4 bg3 = RGBA(0x3A372F);
const ImVec4 fg0 = RGBA(0xDCD7BA); // warm ivory ink (kanagawa fg)
const ImVec4 fg1 = RGBA(0xC8C093);
// Accents similar to kanagawa-wave
const ImVec4 teal = RGBA(0x7AA89F);
const ImVec4 orange = RGBA(0xFFA066);
const ImVec4 blue = RGBA(0x7E9CD8);
const ImVec4 yellow = RGBA(0xE6C384);
ImGuiStyle &style = ImGui::GetStyle();
style.WindowPadding = ImVec2(8.0f, 8.0f);
style.FramePadding = ImVec2(6.0f, 4.0f);
style.CellPadding = ImVec2(6.0f, 4.0f);
style.ItemSpacing = ImVec2(6.0f, 6.0f);
style.ItemInnerSpacing = ImVec2(6.0f, 4.0f);
style.ScrollbarSize = 14.0f;
style.GrabMinSize = 10.0f;
style.WindowRounding = 4.0f;
style.FrameRounding = 3.0f;
style.PopupRounding = 4.0f;
style.GrabRounding = 3.0f;
style.TabRounding = 4.0f;
style.WindowBorderSize = 1.0f;
style.FrameBorderSize = 1.0f;
ImVec4 *c = style.Colors;
c[ImGuiCol_Text] = fg0;
c[ImGuiCol_TextDisabled] = ImVec4(fg1.x, fg1.y, fg1.z, 0.6f);
c[ImGuiCol_WindowBg] = bg0;
c[ImGuiCol_ChildBg] = bg0;
c[ImGuiCol_PopupBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.98f);
c[ImGuiCol_Border] = bg2;
c[ImGuiCol_BorderShadow] = RGBA(0x000000, 0.0f);
c[ImGuiCol_FrameBg] = bg2;
c[ImGuiCol_FrameBgHovered] = bg3;
c[ImGuiCol_FrameBgActive] = bg1;
c[ImGuiCol_TitleBg] = bg1;
c[ImGuiCol_TitleBgActive] = bg2;
c[ImGuiCol_TitleBgCollapsed] = bg1;
c[ImGuiCol_MenuBarBg] = bg1;
c[ImGuiCol_ScrollbarBg] = bg0;
c[ImGuiCol_ScrollbarGrab] = bg3;
c[ImGuiCol_ScrollbarGrabHovered] = bg2;
c[ImGuiCol_ScrollbarGrabActive] = bg1;
c[ImGuiCol_CheckMark] = teal;
c[ImGuiCol_SliderGrab] = teal;
c[ImGuiCol_SliderGrabActive] = blue;
c[ImGuiCol_Button] = bg3;
c[ImGuiCol_ButtonHovered] = bg2;
c[ImGuiCol_ButtonActive] = bg1;
c[ImGuiCol_Header] = bg3;
c[ImGuiCol_HeaderHovered] = bg2;
c[ImGuiCol_HeaderActive] = bg2;
c[ImGuiCol_Separator] = bg2;
c[ImGuiCol_SeparatorHovered] = bg1;
c[ImGuiCol_SeparatorActive] = teal;
c[ImGuiCol_ResizeGrip] = ImVec4(fg1.x, fg1.y, fg1.z, 0.15f);
c[ImGuiCol_ResizeGripHovered] = ImVec4(teal.x, teal.y, teal.z, 0.67f);
c[ImGuiCol_ResizeGripActive] = blue;
c[ImGuiCol_Tab] = bg2;
c[ImGuiCol_TabHovered] = bg1;
c[ImGuiCol_TabActive] = bg3;
c[ImGuiCol_TabUnfocused] = bg2;
c[ImGuiCol_TabUnfocusedActive] = bg3;
c[ImGuiCol_TableHeaderBg] = bg2;
c[ImGuiCol_TableBorderStrong] = bg1;
c[ImGuiCol_TableBorderLight] = ImVec4(bg1.x, bg1.y, bg1.z, 0.6f);
c[ImGuiCol_TableRowBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.12f);
c[ImGuiCol_TableRowBgAlt] = ImVec4(bg1.x, bg1.y, bg1.z, 0.22f);
c[ImGuiCol_TextSelectedBg] = ImVec4(orange.x, orange.y, orange.z, 0.28f);
c[ImGuiCol_DragDropTarget] = orange;
c[ImGuiCol_NavHighlight] = orange;
c[ImGuiCol_NavWindowingHighlight] = ImVec4(fg1.x, fg1.y, fg1.z, 0.70f);
c[ImGuiCol_NavWindowingDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.35f);
c[ImGuiCol_ModalWindowDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.35f);
c[ImGuiCol_PlotLines] = teal;
c[ImGuiCol_PlotLinesHovered] = blue;
c[ImGuiCol_PlotHistogram] = yellow;
c[ImGuiCol_PlotHistogramHovered] = orange;
}
// Back-compat name kept; select by global background
static inline void
ApplyKanagawaPaperTheme()
{
if (GetBackgroundMode() == BackgroundMode::Dark)
ApplyKanagawaPaperDarkTheme();
else
ApplyKanagawaPaperLightTheme();
} }

108
themes/LCARS.h Normal file
View File

@@ -0,0 +1,108 @@
// themes/LCARS.h — LCARS-inspired ImGui theme (header-only)
#pragma once
#include "ThemeHelpers.h"
// Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper
static void
ApplyLcarsTheme()
{
// LCARS-inspired palette: dark background with vibrant pastel accents
const ImVec4 bg0 = RGBA(0x0E0E10); // near-black background
const ImVec4 bg1 = RGBA(0x1A1A1F);
const ImVec4 bg2 = RGBA(0x26262C);
const ImVec4 bg3 = RGBA(0x33333A);
const ImVec4 fg0 = RGBA(0xECECEC); // primary text
const ImVec4 fg1 = RGBA(0xBFBFC4);
// LCARS accent colors (approximations)
const ImVec4 lcars_orange = RGBA(0xFF9966);
const ImVec4 lcars_yellow = RGBA(0xFFCC66);
const ImVec4 lcars_pink = RGBA(0xFF99CC);
const ImVec4 lcars_purple = RGBA(0xCC99FF);
const ImVec4 lcars_blue = RGBA(0x66CCFF);
ImGuiStyle &style = ImGui::GetStyle();
style.WindowPadding = ImVec2(10.0f, 10.0f);
style.FramePadding = ImVec2(8.0f, 6.0f);
style.CellPadding = ImVec2(6.0f, 4.0f);
style.ItemSpacing = ImVec2(8.0f, 8.0f);
style.ItemInnerSpacing = ImVec2(6.0f, 4.0f);
style.ScrollbarSize = 16.0f;
style.GrabMinSize = 12.0f;
style.WindowRounding = 6.0f;
style.FrameRounding = 6.0f;
style.PopupRounding = 6.0f;
style.GrabRounding = 6.0f;
style.TabRounding = 6.0f;
style.WindowBorderSize = 1.0f;
style.FrameBorderSize = 1.0f;
ImVec4 *colors = style.Colors;
colors[ImGuiCol_Text] = fg0;
colors[ImGuiCol_TextDisabled] = ImVec4(fg0.x, fg0.y, fg0.z, 0.55f);
colors[ImGuiCol_WindowBg] = bg0;
colors[ImGuiCol_ChildBg] = bg0;
colors[ImGuiCol_PopupBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.98f);
colors[ImGuiCol_Border] = bg3;
colors[ImGuiCol_BorderShadow] = RGBA(0x000000, 0.0f);
colors[ImGuiCol_FrameBg] = bg2;
colors[ImGuiCol_FrameBgHovered] = ImVec4(lcars_purple.x, lcars_purple.y, lcars_purple.z, 0.35f);
colors[ImGuiCol_FrameBgActive] = ImVec4(lcars_orange.x, lcars_orange.y, lcars_orange.z, 0.35f);
colors[ImGuiCol_TitleBg] = bg1;
colors[ImGuiCol_TitleBgActive] = ImVec4(bg2.x, bg2.y, bg2.z, 1.0f);
colors[ImGuiCol_TitleBgCollapsed] = bg1;
colors[ImGuiCol_MenuBarBg] = bg1;
colors[ImGuiCol_ScrollbarBg] = bg0;
colors[ImGuiCol_ScrollbarGrab] = bg3;
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(lcars_blue.x, lcars_blue.y, lcars_blue.z, 0.6f);
colors[ImGuiCol_ScrollbarGrabActive] = lcars_blue;
colors[ImGuiCol_CheckMark] = lcars_orange;
colors[ImGuiCol_SliderGrab] = lcars_orange;
colors[ImGuiCol_SliderGrabActive] = lcars_pink;
colors[ImGuiCol_Button] = ImVec4(bg3.x, bg3.y, bg3.z, 1.0f);
colors[ImGuiCol_ButtonHovered] = ImVec4(lcars_orange.x, lcars_orange.y, lcars_orange.z, 0.35f);
colors[ImGuiCol_ButtonActive] = ImVec4(lcars_orange.x, lcars_orange.y, lcars_orange.z, 0.55f);
colors[ImGuiCol_Header] = ImVec4(lcars_purple.x, lcars_purple.y, lcars_purple.z, 0.30f);
colors[ImGuiCol_HeaderHovered] = ImVec4(lcars_blue.x, lcars_blue.y, lcars_blue.z, 0.35f);
colors[ImGuiCol_HeaderActive] = ImVec4(lcars_orange.x, lcars_orange.y, lcars_orange.z, 0.35f);
colors[ImGuiCol_Separator] = bg3;
colors[ImGuiCol_SeparatorHovered] = lcars_blue;
colors[ImGuiCol_SeparatorActive] = lcars_pink;
colors[ImGuiCol_ResizeGrip] = ImVec4(fg1.x, fg1.y, fg1.z, 0.12f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(lcars_yellow.x, lcars_yellow.y, lcars_yellow.z, 0.67f);
colors[ImGuiCol_ResizeGripActive] = lcars_orange;
colors[ImGuiCol_Tab] = bg2;
colors[ImGuiCol_TabHovered] = ImVec4(lcars_blue.x, lcars_blue.y, lcars_blue.z, 0.35f);
colors[ImGuiCol_TabActive] = ImVec4(lcars_purple.x, lcars_purple.y, lcars_purple.z, 0.35f);
colors[ImGuiCol_TabUnfocused] = bg2;
colors[ImGuiCol_TabUnfocusedActive] = ImVec4(bg3.x, bg3.y, bg3.z, 1.0f);
colors[ImGuiCol_TableHeaderBg] = bg2;
colors[ImGuiCol_TableBorderStrong] = bg1;
colors[ImGuiCol_TableBorderLight] = ImVec4(bg1.x, bg1.y, bg1.z, 0.6f);
colors[ImGuiCol_TableRowBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.2f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(bg1.x, bg1.y, bg1.z, 0.35f);
colors[ImGuiCol_TextSelectedBg] = ImVec4(lcars_yellow.x, lcars_yellow.y, lcars_yellow.z, 0.30f);
colors[ImGuiCol_DragDropTarget] = lcars_orange;
colors[ImGuiCol_NavHighlight] = lcars_blue;
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(fg0.x, fg0.y, fg0.z, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.45f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.45f);
colors[ImGuiCol_PlotLines] = lcars_blue;
colors[ImGuiCol_PlotLinesHovered] = lcars_purple;
colors[ImGuiCol_PlotHistogram] = lcars_yellow;
colors[ImGuiCol_PlotHistogramHovered] = lcars_orange;
}

View File

@@ -4,10 +4,11 @@
// Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper // Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper
static void // Light variant (existing)
ApplyOldBookTheme() static inline void
ApplyOldBookLightTheme()
{ {
// Sepia old paper aesthetic // Sepia old paper aesthetic (light)
const ImVec4 bg0 = RGBA(0xF5E6C8); // paper const ImVec4 bg0 = RGBA(0xF5E6C8); // paper
const ImVec4 bg1 = RGBA(0xEAD9B8); const ImVec4 bg1 = RGBA(0xEAD9B8);
const ImVec4 bg2 = RGBA(0xDECBA6); const ImVec4 bg2 = RGBA(0xDECBA6);
@@ -102,4 +103,118 @@ ApplyOldBookTheme()
colors[ImGuiCol_PlotLinesHovered] = blue; colors[ImGuiCol_PlotLinesHovered] = blue;
colors[ImGuiCol_PlotHistogram] = yellow; colors[ImGuiCol_PlotHistogram] = yellow;
colors[ImGuiCol_PlotHistogramHovered] = red; colors[ImGuiCol_PlotHistogramHovered] = red;
}
// Dark variant (new)
static inline void
ApplyOldBookDarkTheme()
{
// Old Book 8 (vim-oldbook8) — exact dark palette mapping
// Source: oldbook8.vim (background=dark)
const ImVec4 bg0 = RGBA(0x3C4855); // Normal guibg
const ImVec4 bg1 = RGBA(0x445160); // Fold/Pmenu bg
const ImVec4 bg2 = RGBA(0x626C77); // StatusLine/MatchParen bg
const ImVec4 bg3 = RGBA(0x85939B); // Delimiter (used as a lighter hover tier)
const ImVec4 fg0 = RGBA(0xD5D4D2); // Normal guifg
const ImVec4 fg1 = RGBA(0x626C77); // Comment/secondary text
const ImVec4 fg2 = RGBA(0xA5A6A4); // Type/Function (used for active controls)
// Accents from scheme
const ImVec4 yellow = RGBA(0xDDD668); // Search
const ImVec4 yellow2 = RGBA(0xD5BC02); // IncSearch
const ImVec4 cyan = RGBA(0x87D7FF); // Visual selection
const ImVec4 green = RGBA(0x5BB899); // DiffAdd
const ImVec4 red = RGBA(0xDB6C6C); // Error/DiffDelete
ImGuiStyle &style = ImGui::GetStyle();
style.WindowPadding = ImVec2(8.0f, 8.0f);
style.FramePadding = ImVec2(6.0f, 4.0f);
style.CellPadding = ImVec2(6.0f, 4.0f);
style.ItemSpacing = ImVec2(6.0f, 6.0f);
style.ItemInnerSpacing = ImVec2(6.0f, 4.0f);
style.ScrollbarSize = 14.0f;
style.GrabMinSize = 10.0f;
style.WindowRounding = 4.0f;
style.FrameRounding = 3.0f;
style.PopupRounding = 4.0f;
style.GrabRounding = 3.0f;
style.TabRounding = 4.0f;
style.WindowBorderSize = 1.0f;
style.FrameBorderSize = 1.0f;
ImVec4 *colors = style.Colors;
colors[ImGuiCol_Text] = fg0;
colors[ImGuiCol_TextDisabled] = fg1;
colors[ImGuiCol_WindowBg] = bg0;
colors[ImGuiCol_ChildBg] = bg0;
colors[ImGuiCol_PopupBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.98f);
colors[ImGuiCol_Border] = bg2;
colors[ImGuiCol_BorderShadow] = RGBA(0x000000, 0.0f);
colors[ImGuiCol_FrameBg] = bg1;
colors[ImGuiCol_FrameBgHovered] = bg2;
colors[ImGuiCol_FrameBgActive] = fg2;
colors[ImGuiCol_TitleBg] = bg1;
colors[ImGuiCol_TitleBgActive] = bg2;
colors[ImGuiCol_TitleBgCollapsed] = bg1;
colors[ImGuiCol_MenuBarBg] = bg1;
colors[ImGuiCol_ScrollbarBg] = bg0;
colors[ImGuiCol_ScrollbarGrab] = bg2;
colors[ImGuiCol_ScrollbarGrabHovered] = bg3;
colors[ImGuiCol_ScrollbarGrabActive] = fg2;
colors[ImGuiCol_CheckMark] = yellow;
colors[ImGuiCol_SliderGrab] = yellow;
colors[ImGuiCol_SliderGrabActive] = cyan;
colors[ImGuiCol_Button] = bg2;
colors[ImGuiCol_ButtonHovered] = bg3;
colors[ImGuiCol_ButtonActive] = fg2;
colors[ImGuiCol_Header] = bg2;
colors[ImGuiCol_HeaderHovered] = bg3;
colors[ImGuiCol_HeaderActive] = bg3;
colors[ImGuiCol_Separator] = bg2;
colors[ImGuiCol_SeparatorHovered] = yellow;
colors[ImGuiCol_SeparatorActive] = yellow2;
colors[ImGuiCol_ResizeGrip] = ImVec4(fg1.x, fg1.y, fg1.z, 0.12f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(cyan.x, cyan.y, cyan.z, 0.67f);
colors[ImGuiCol_ResizeGripActive] = cyan;
colors[ImGuiCol_Tab] = bg1;
colors[ImGuiCol_TabHovered] = bg2;
colors[ImGuiCol_TabActive] = bg2;
colors[ImGuiCol_TabUnfocused] = bg1;
colors[ImGuiCol_TabUnfocusedActive] = bg2;
colors[ImGuiCol_TableHeaderBg] = bg2;
colors[ImGuiCol_TableBorderStrong] = bg1;
colors[ImGuiCol_TableBorderLight] = ImVec4(bg1.x, bg1.y, bg1.z, 0.6f);
colors[ImGuiCol_TableRowBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.2f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(bg1.x, bg1.y, bg1.z, 0.35f);
colors[ImGuiCol_TextSelectedBg] = ImVec4(cyan.x, cyan.y, cyan.z, 0.28f);
colors[ImGuiCol_DragDropTarget] = yellow;
colors[ImGuiCol_NavHighlight] = yellow;
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(fg1.x, fg1.y, fg1.z, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.35f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.35f);
colors[ImGuiCol_PlotLines] = green;
colors[ImGuiCol_PlotLinesHovered] = cyan;
colors[ImGuiCol_PlotHistogram] = yellow;
colors[ImGuiCol_PlotHistogramHovered] = red;
}
static void
ApplyOldBookTheme()
{
// Back-compat: keep calling light by default; GUITheme dispatches variants
ApplyOldBookLightTheme();
} }

105
themes/Orbital.h Normal file
View File

@@ -0,0 +1,105 @@
// themes/Orbital.h — Orbital (dark) inspired ImGui theme (header-only)
#pragma once
#include "ThemeHelpers.h"
// Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper
static inline void
ApplyOrbitalTheme()
{
// Orbital: deep-space dark with cool blues and magentas
const ImVec4 bg0 = RGBA(0x0C0F12); // background
const ImVec4 bg1 = RGBA(0x12161B);
const ImVec4 bg2 = RGBA(0x192029);
const ImVec4 bg3 = RGBA(0x212A36);
const ImVec4 fg0 = RGBA(0xC8D3E5); // primary text
const ImVec4 fg1 = RGBA(0x9FB2CC); // secondary text
const ImVec4 blue = RGBA(0x6AA2FF); // primary accent
const ImVec4 cyan = RGBA(0x5AD1E6);
const ImVec4 magenta = RGBA(0xD681F8);
const ImVec4 yellow = RGBA(0xE6C17D);
ImGuiStyle &style = ImGui::GetStyle();
style.WindowPadding = ImVec2(8.0f, 8.0f);
style.FramePadding = ImVec2(6.0f, 4.0f);
style.CellPadding = ImVec2(6.0f, 4.0f);
style.ItemSpacing = ImVec2(6.0f, 6.0f);
style.ItemInnerSpacing = ImVec2(6.0f, 4.0f);
style.ScrollbarSize = 14.0f;
style.GrabMinSize = 10.0f;
style.WindowRounding = 4.0f;
style.FrameRounding = 3.0f;
style.PopupRounding = 4.0f;
style.GrabRounding = 3.0f;
style.TabRounding = 4.0f;
style.WindowBorderSize = 1.0f;
style.FrameBorderSize = 1.0f;
ImVec4 *c = style.Colors;
c[ImGuiCol_Text] = fg0;
c[ImGuiCol_TextDisabled] = ImVec4(fg1.x, fg1.y, fg1.z, 0.7f);
c[ImGuiCol_WindowBg] = bg0;
c[ImGuiCol_ChildBg] = bg0;
c[ImGuiCol_PopupBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.98f);
c[ImGuiCol_Border] = bg2;
c[ImGuiCol_BorderShadow] = RGBA(0x000000, 0.0f);
c[ImGuiCol_FrameBg] = bg2;
c[ImGuiCol_FrameBgHovered] = bg3;
c[ImGuiCol_FrameBgActive] = bg1;
c[ImGuiCol_TitleBg] = bg1;
c[ImGuiCol_TitleBgActive] = bg2;
c[ImGuiCol_TitleBgCollapsed] = bg1;
c[ImGuiCol_MenuBarBg] = bg1;
c[ImGuiCol_ScrollbarBg] = bg0;
c[ImGuiCol_ScrollbarGrab] = bg3;
c[ImGuiCol_ScrollbarGrabHovered] = bg2;
c[ImGuiCol_ScrollbarGrabActive] = bg1;
c[ImGuiCol_CheckMark] = cyan;
c[ImGuiCol_SliderGrab] = cyan;
c[ImGuiCol_SliderGrabActive] = blue;
c[ImGuiCol_Button] = ImVec4(blue.x, blue.y, blue.z, 0.18f);
c[ImGuiCol_ButtonHovered] = ImVec4(blue.x, blue.y, blue.z, 0.28f);
c[ImGuiCol_ButtonActive] = ImVec4(blue.x, blue.y, blue.z, 0.40f);
c[ImGuiCol_Header] = ImVec4(magenta.x, magenta.y, magenta.z, 0.18f);
c[ImGuiCol_HeaderHovered] = ImVec4(magenta.x, magenta.y, magenta.z, 0.28f);
c[ImGuiCol_HeaderActive] = ImVec4(magenta.x, magenta.y, magenta.z, 0.40f);
c[ImGuiCol_Separator] = bg2;
c[ImGuiCol_SeparatorHovered] = cyan;
c[ImGuiCol_SeparatorActive] = blue;
c[ImGuiCol_ResizeGrip] = ImVec4(fg1.x, fg1.y, fg1.z, 0.10f);
c[ImGuiCol_ResizeGripHovered] = ImVec4(cyan.x, cyan.y, cyan.z, 0.67f);
c[ImGuiCol_ResizeGripActive] = blue;
c[ImGuiCol_Tab] = bg2;
c[ImGuiCol_TabHovered] = bg1;
c[ImGuiCol_TabActive] = bg3;
c[ImGuiCol_TabUnfocused] = bg2;
c[ImGuiCol_TabUnfocusedActive] = bg3;
c[ImGuiCol_TableHeaderBg] = bg2;
c[ImGuiCol_TableBorderStrong] = bg1;
c[ImGuiCol_TableBorderLight] = ImVec4(bg1.x, bg1.y, bg1.z, 0.6f);
c[ImGuiCol_TableRowBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.12f);
c[ImGuiCol_TableRowBgAlt] = ImVec4(bg1.x, bg1.y, bg1.z, 0.22f);
c[ImGuiCol_TextSelectedBg] = ImVec4(blue.x, blue.y, blue.z, 0.28f);
c[ImGuiCol_DragDropTarget] = yellow;
c[ImGuiCol_NavHighlight] = blue;
c[ImGuiCol_NavWindowingHighlight] = ImVec4(fg1.x, fg1.y, fg1.z, 0.70f);
c[ImGuiCol_NavWindowingDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.35f);
c[ImGuiCol_ModalWindowDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.35f);
c[ImGuiCol_PlotLines] = cyan;
c[ImGuiCol_PlotLinesHovered] = blue;
c[ImGuiCol_PlotHistogram] = yellow;
c[ImGuiCol_PlotHistogramHovered] = magenta;
}

105
themes/WeylandYutani.h Normal file
View File

@@ -0,0 +1,105 @@
// themes/WeylandYutani.h — Weyland-Yutani inspired ImGui theme (header-only)
#pragma once
#include "ThemeHelpers.h"
// Expects to be included from GUITheme.h after <imgui.h> and RGBA() helper
static inline void
ApplyWeylandYutaniTheme()
{
// Corporate sci-fi aesthetic: near-black with hazard yellow accents
const ImVec4 bg0 = RGBA(0x0A0A0A);
const ImVec4 bg1 = RGBA(0x151515);
const ImVec4 bg2 = RGBA(0x202020);
const ImVec4 bg3 = RGBA(0x2B2B2B);
const ImVec4 fg0 = RGBA(0xE6E6E6);
const ImVec4 fg1 = RGBA(0xBDBDBD);
const ImVec4 hazard = RGBA(0xFFC300); // Weyland-Yutani yellow
const ImVec4 orange = RGBA(0xFF8C00);
const ImVec4 cyan = RGBA(0x4CC9F0);
ImGuiStyle &style = ImGui::GetStyle();
style.WindowPadding = ImVec2(10.0f, 8.0f);
style.FramePadding = ImVec2(8.0f, 5.0f);
style.CellPadding = ImVec2(6.0f, 4.0f);
style.ItemSpacing = ImVec2(8.0f, 6.0f);
style.ItemInnerSpacing = ImVec2(6.0f, 4.0f);
style.ScrollbarSize = 14.0f;
style.GrabMinSize = 10.0f;
style.WindowRounding = 2.0f;
style.FrameRounding = 2.0f;
style.PopupRounding = 2.0f;
style.GrabRounding = 2.0f;
style.TabRounding = 2.0f;
style.WindowBorderSize = 1.0f;
style.FrameBorderSize = 1.0f;
ImVec4 *colors = style.Colors;
colors[ImGuiCol_Text] = fg0;
colors[ImGuiCol_TextDisabled] = ImVec4(fg0.x, fg0.y, fg0.z, 0.55f);
colors[ImGuiCol_WindowBg] = bg0;
colors[ImGuiCol_ChildBg] = bg0;
colors[ImGuiCol_PopupBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.98f);
colors[ImGuiCol_Border] = bg3;
colors[ImGuiCol_BorderShadow] = RGBA(0x000000, 0.0f);
colors[ImGuiCol_FrameBg] = bg2;
colors[ImGuiCol_FrameBgHovered] = ImVec4(hazard.x, hazard.y, hazard.z, 0.20f);
colors[ImGuiCol_FrameBgActive] = ImVec4(orange.x, orange.y, orange.z, 0.25f);
colors[ImGuiCol_TitleBg] = bg1;
colors[ImGuiCol_TitleBgActive] = bg2;
colors[ImGuiCol_TitleBgCollapsed] = bg1;
colors[ImGuiCol_MenuBarBg] = bg1;
colors[ImGuiCol_ScrollbarBg] = bg0;
colors[ImGuiCol_ScrollbarGrab] = bg3;
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(hazard.x, hazard.y, hazard.z, 0.50f);
colors[ImGuiCol_ScrollbarGrabActive] = hazard;
colors[ImGuiCol_CheckMark] = hazard;
colors[ImGuiCol_SliderGrab] = hazard;
colors[ImGuiCol_SliderGrabActive] = orange;
colors[ImGuiCol_Button] = bg3;
colors[ImGuiCol_ButtonHovered] = ImVec4(hazard.x, hazard.y, hazard.z, 0.25f);
colors[ImGuiCol_ButtonActive] = ImVec4(hazard.x, hazard.y, hazard.z, 0.40f);
colors[ImGuiCol_Header] = ImVec4(hazard.x, hazard.y, hazard.z, 0.25f);
colors[ImGuiCol_HeaderHovered] = ImVec4(cyan.x, cyan.y, cyan.z, 0.30f);
colors[ImGuiCol_HeaderActive] = ImVec4(orange.x, orange.y, orange.z, 0.30f);
colors[ImGuiCol_Separator] = bg3;
colors[ImGuiCol_SeparatorHovered] = hazard;
colors[ImGuiCol_SeparatorActive] = orange;
colors[ImGuiCol_ResizeGrip] = ImVec4(fg1.x, fg1.y, fg1.z, 0.12f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(hazard.x, hazard.y, hazard.z, 0.67f);
colors[ImGuiCol_ResizeGripActive] = orange;
colors[ImGuiCol_Tab] = bg2;
colors[ImGuiCol_TabHovered] = ImVec4(hazard.x, hazard.y, hazard.z, 0.25f);
colors[ImGuiCol_TabActive] = ImVec4(cyan.x, cyan.y, cyan.z, 0.30f);
colors[ImGuiCol_TabUnfocused] = bg2;
colors[ImGuiCol_TabUnfocusedActive] = bg3;
colors[ImGuiCol_TableHeaderBg] = bg2;
colors[ImGuiCol_TableBorderStrong] = bg1;
colors[ImGuiCol_TableBorderLight] = ImVec4(bg1.x, bg1.y, bg1.z, 0.6f);
colors[ImGuiCol_TableRowBg] = ImVec4(bg1.x, bg1.y, bg1.z, 0.2f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(bg1.x, bg1.y, bg1.z, 0.35f);
colors[ImGuiCol_TextSelectedBg] = ImVec4(hazard.x, hazard.y, hazard.z, 0.28f);
colors[ImGuiCol_DragDropTarget] = orange;
colors[ImGuiCol_NavHighlight] = cyan;
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(fg0.x, fg0.y, fg0.z, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.45f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.0f, 0.0f, 0.0f, 0.45f);
colors[ImGuiCol_PlotLines] = cyan;
colors[ImGuiCol_PlotLinesHovered] = hazard;
colors[ImGuiCol_PlotHistogram] = hazard;
colors[ImGuiCol_PlotHistogramHovered] = orange;
}