Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
[![GitHub contributors](https://img.shields.io/github/contributors/ktsu-dev/ThemeProvider?label=Contributors&logo=github)](https://github.com/ktsu-dev/ThemeProvider/graphs/contributors)
[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/ktsu-dev/ThemeProvider/dotnet.yml?branch=main&label=Build&logo=github)](https://github.com/ktsu-dev/ThemeProvider/actions)

[![Every ThemeProvider theme drawn by Dear ImGui](docs/gallery/overview.png)](docs/gallery/README.md)

## Introduction

`ktsu.ThemeProvider` is a comprehensive theming system that uses semantic color specifications rather than arbitrary color names. Instead of hardcoding colors like "blue" or "red", you define colors by their purpose (Primary, Error, Warning) and priority level, and the library generates consistent, accessible color palettes. It includes 38 carefully crafted themes from popular color schemes and provides built-in Dear ImGui integration with an extensible architecture for other UI frameworks.
Expand Down
100 changes: 50 additions & 50 deletions ThemeProvider.Test/ThemeSnapshot.approved.txt
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Tokyo Night Day [family=Tokyo Night, variant=Day, isDark=false, themeIsDark=fals
Failure = #F52A65
Debug = #9854F1
Gruvbox Dark [family=Gruvbox, variant=Dark, isDark=true, themeIsDark=true]
Neutral = #EBDBB2 #1D2021
Neutral = #EBDBB2 #282828
Primary = #FE8019
Alternate = #D3869B
Success = #B8BB26
Expand Down Expand Up @@ -119,7 +119,7 @@ Gruvbox Dark Soft [family=Gruvbox, variant=Dark Soft, isDark=true, themeIsDark=t
Failure = #FB4934
Debug = #D3869B
Gruvbox Light [family=Gruvbox, variant=Light, isDark=false, themeIsDark=false]
Neutral = #1D2021 #F9F5D7
Neutral = #1D2021 #FBF1C7
Primary = #D65D0E
Alternate = #B16286
Success = #98971A
Expand Down Expand Up @@ -162,7 +162,7 @@ Everforest Dark [family=Everforest, variant=Dark, isDark=true, themeIsDark=true]
CallToAction = #83C092
Information = #D699B6
Caution = #DBBC7F
Warning = #E67E80
Warning = #E69875
Error = #E67E80
Failure = #E67E80
Debug = #D699B6
Expand All @@ -174,7 +174,7 @@ Everforest Dark Hard [family=Everforest, variant=Dark Hard, isDark=true, themeIs
CallToAction = #83C092
Information = #D699B6
Caution = #DBBC7F
Warning = #E67E80
Warning = #E69875
Error = #E67E80
Failure = #E67E80
Debug = #D699B6
Expand All @@ -186,43 +186,43 @@ Everforest Dark Soft [family=Everforest, variant=Dark Soft, isDark=true, themeIs
CallToAction = #83C092
Information = #D699B6
Caution = #DBBC7F
Warning = #E67E80
Warning = #E69875
Error = #E67E80
Failure = #E67E80
Debug = #D699B6
Everforest Light [family=Everforest, variant=Light, isDark=false, themeIsDark=false]
Neutral = #5C6A72 #F3EFDA
Neutral = #5C6A72 #EFEBD4
Primary = #8DA101
Alternate = #F57D26
Success = #3A94C5
CallToAction = #35A77C
Information = #DF69BA
Caution = #DFA000
Warning = #F85552
Warning = #F57D26
Error = #F85552
Failure = #F85552
Debug = #DF69BA
Everforest Light Hard [family=Everforest, variant=Light Hard, isDark=false, themeIsDark=false]
Neutral = #5C6A72 #F8F4E6
Neutral = #5C6A72 #F2EFDF
Primary = #8DA101
Alternate = #F57D26
Success = #3A94C5
CallToAction = #35A77C
Information = #DF69BA
Caution = #DFA000
Warning = #F85552
Warning = #F57D26
Error = #F85552
Failure = #F85552
Debug = #DF69BA
Everforest Light Soft [family=Everforest, variant=Light Soft, isDark=false, themeIsDark=false]
Neutral = #5C6A72 #F0F0E2
Neutral = #5C6A72 #E5DFC5
Primary = #8DA101
Alternate = #F57D26
Success = #3A94C5
CallToAction = #35A77C
Information = #DF69BA
Caution = #DFA000
Warning = #F85552
Warning = #F57D26
Error = #F85552
Failure = #F85552
Debug = #DF69BA
Expand All @@ -239,29 +239,29 @@ Nightfox [family=Nightfox, variant=-, isDark=true, themeIsDark=true]
Failure = #C94F6D
Debug = #9D79D6
Dayfox [family=Nightfox, variant=Dayfox, isDark=false, themeIsDark=false]
Neutral = #1D344F #EFEAE6
Neutral = #3D2B5A #E4DCD4
Primary = #2848A9
Alternate = #955F20
Alternate = #955F61
Success = #396847
CallToAction = #287980
Information = #2848A9
Caution = #986936
Warning = #955F20
Caution = #AC5402
Warning = #955F61
Error = #A5222F
Failure = #A5222F
Debug = #7847BD
Debug = #6E33CE
Duskfox [family=Nightfox, variant=Duskfox, isDark=true, themeIsDark=true]
Neutral = #E0DEF4 #1A1826
Primary = #9CCFD8
Neutral = #E0DEF4 #191726
Primary = #569FBA
Alternate = #C4A7E7
Success = #A3BE8C
CallToAction = #9CCFD8
Information = #9CCFD8
Information = #569FBA
Caution = #F6C177
Warning = #EA9A97
Error = #EB6F92
Failure = #EB6F92
Debug = #F5C2E7
Debug = #EB98C3
Nordfox [family=Nightfox, variant=Nordfox, isDark=true, themeIsDark=true]
Neutral = #CDCECF #232831
Primary = #81A1C1
Expand All @@ -270,19 +270,19 @@ Nordfox [family=Nightfox, variant=Nordfox, isDark=true, themeIsDark=true]
CallToAction = #88C0D0
Information = #81A1C1
Caution = #EBCB8B
Warning = #D08770
Warning = #C9826B
Error = #BF616A
Failure = #BF616A
Debug = #B48EAD
Terafox [family=Nightfox, variant=Terafox, isDark=true, themeIsDark=true]
Neutral = #FBEBD3 #0F1C1E
Neutral = #E6EAEA #0F1C1E
Primary = #7AA4A1
Alternate = #FFA500
Alternate = #FF8349
Success = #7AA4A1
CallToAction = #A1CDD8
Information = #5A93AA
Caution = #FDB292
Warning = #FFA500
Caution = #FDA47F
Warning = #FF8349
Error = #E85C51
Failure = #E85C51
Debug = #AD5C7C
Expand All @@ -299,14 +299,14 @@ Carbonfox [family=Nightfox, variant=Carbonfox, isDark=true, themeIsDark=true]
Failure = #EE5396
Debug = #BE95FF
Dawnfox [family=Nightfox, variant=Dawnfox, isDark=false, themeIsDark=false]
Neutral = #575279 #F4EDE4
Primary = #56949F
Neutral = #575279 #EBE5DF
Primary = #286983
Alternate = #D685AF
Success = #286983
Success = #618774
CallToAction = #56949F
Information = #56949F
Caution = #D7827E
Warning = #EA9D34
Caution = #EA9D34
Warning = #D7827E
Error = #B4637A
Failure = #B4637A
Debug = #907AA9
Expand Down Expand Up @@ -335,19 +335,19 @@ Kanagawa Dragon [family=Kanagawa, variant=Dragon, isDark=true, themeIsDark=true]
Failure = #C4746E
Debug = #C4746E
Kanagawa Lotus [family=Kanagawa, variant=Lotus, isDark=false, themeIsDark=false]
Neutral = #545464 #F7F4DD
Neutral = #545464 #F2ECBC
Primary = #4D699B
Alternate = #B35B79
Success = #6F894E
CallToAction = #5E857A
Information = #7E9FB8
Information = #5A7785
Caution = #77713F
Warning = #B98F56
Error = #CC5D73
Failure = #CC5D73
Warning = #E98A00
Error = #E82424
Failure = #E82424
Debug = #B35B79
PaperColor Light [family=PaperColor, variant=Light, isDark=false, themeIsDark=false]
Neutral = #444444 #FFFFFF
Neutral = #444444 #EEEEEE
Primary = #0087AF
Alternate = #8700AF
Success = #008700
Expand All @@ -360,16 +360,16 @@ PaperColor Light [family=PaperColor, variant=Light, isDark=false, themeIsDark=fa
Debug = #D70087
PaperColor Dark [family=PaperColor, variant=Dark, isDark=true, themeIsDark=true]
Neutral = #D0D0D0 #1C1C1C
Primary = #0087D7
Primary = #5FAFD7
Alternate = #AF87D7
Success = #5FAF00
CallToAction = #00AFAF
Information = #0087D7
Information = #5FAFD7
Caution = #FFAF00
Warning = #FF8700
Error = #AF005F
Failure = #AF005F
Debug = #D70087
Debug = #FF5FAF
Nord [family=Nord, variant=-, isDark=true, themeIsDark=true]
Neutral = #ECEFF4 #2E3440
Primary = #88C0D0
Expand Down Expand Up @@ -400,26 +400,26 @@ VSCode Dark [family=VSCode, variant=Dark, isDark=true, themeIsDark=true]
Alternate = #C586C0
Success = #B5CEA8
CallToAction = #B5CEA8
Information = #75BEFF
Information = #59A4F9
Caution = #CE9178
Warning = #FFCC02
Error = #F44747
Failure = #F44747
Warning = #CCA700
Error = #F14C4C
Failure = #F14C4C
Debug = #C586C0
VSCode Light [family=VSCode, variant=Light, isDark=false, themeIsDark=false]
Neutral = #000000 #FFFFFF
Primary = #0000FF
Alternate = #AF00DB
Success = #098658
CallToAction = #098658
Information = #316BCD
Information = #0063D3
Caution = #A31515
Warning = #BF8803
Error = #CD3131
Failure = #CD3131
Error = #E51400
Failure = #E51400
Debug = #AF00DB
One Dark [family=One Dark, variant=-, isDark=true, themeIsDark=true]
Neutral = #FFFFFF #181A1F
Neutral = #ABB2BF #181A1F
Primary = #61AFEF
Alternate = #C678DD
Success = #98C379
Expand All @@ -443,11 +443,11 @@ Monokai [family=Monokai, variant=-, isDark=true, themeIsDark=true]
Failure = #F92672
Debug = #AE81FF
Nightfly [family=Nightfly, variant=-, isDark=true, themeIsDark=true]
Neutral = #FFFFFF #011627
Neutral = #C3CCDC #011627
Primary = #82AAFF
Alternate = #C792EA
Success = #ADDB67
CallToAction = #ADDB67
Success = #A1CD5E
CallToAction = #A1CD5E
Information = #7FDBCA
Caution = #F78C6C
Warning = #E3D18A
Expand Down
5 changes: 3 additions & 2 deletions ThemeProvider/Themes/Everforest/EverforestDark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,20 @@ public class EverforestDark : ISemanticTheme
{
// Colors shared by several meanings are named once, after the palette entry they come from.
private const string Red = "#e67e80";
private const string Orange = "#e69875";

// Hex values are the palette this theme mirrors; the trailing comment on each line is
// that palette's own name for the color.
private static readonly SemanticPalette Palette = new()
{
Neutrals = ["#d3c6aa", "#232a2e"], // Fg, BgDim
Primary = "#a7c080", // Green
Alternate = "#e69875", // Orange
Alternate = Orange,
Success = "#7fbbb3", // Blue
CallToAction = "#83c092", // Aqua
Information = "#d699b6", // Purple
Caution = "#dbbc7f", // Yellow
Warning = Red,
Warning = Orange,
Error = Red,
Failure = Red,
Debug = "#d699b6", // Purple
Expand Down
5 changes: 3 additions & 2 deletions ThemeProvider/Themes/Everforest/EverforestDarkHard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,20 @@ public class EverforestDarkHard : ISemanticTheme
{
// Colors shared by several meanings are named once, after the palette entry they come from.
private const string Red = "#e67e80";
private const string Orange = "#e69875";

// Hex values are the palette this theme mirrors; the trailing comment on each line is
// that palette's own name for the color.
private static readonly SemanticPalette Palette = new()
{
Neutrals = ["#d3c6aa", "#1e2326"], // Fg, BgDim
Primary = "#a7c080", // Green
Alternate = "#e69875", // Orange
Alternate = Orange,
Success = "#7fbbb3", // Blue
CallToAction = "#83c092", // Aqua
Information = "#d699b6", // Purple
Caution = "#dbbc7f", // Yellow
Warning = Red,
Warning = Orange,
Error = Red,
Failure = Red,
Debug = "#d699b6", // Purple
Expand Down
5 changes: 3 additions & 2 deletions ThemeProvider/Themes/Everforest/EverforestDarkSoft.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,20 @@ public class EverforestDarkSoft : ISemanticTheme
{
// Colors shared by several meanings are named once, after the palette entry they come from.
private const string Red = "#e67e80";
private const string Orange = "#e69875";

// Hex values are the palette this theme mirrors; the trailing comment on each line is
// that palette's own name for the color.
private static readonly SemanticPalette Palette = new()
{
Neutrals = ["#d3c6aa", "#293136"], // Fg, BgDim
Primary = "#a7c080", // Green
Alternate = "#e69875", // Orange
Alternate = Orange,
Success = "#7fbbb3", // Blue
CallToAction = "#83c092", // Aqua
Information = "#d699b6", // Purple
Caution = "#dbbc7f", // Yellow
Warning = Red,
Warning = Orange,
Error = Red,
Failure = Red,
Debug = "#d699b6", // Purple
Expand Down
7 changes: 4 additions & 3 deletions ThemeProvider/Themes/Everforest/EverforestLight.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,20 @@ public class EverforestLight : ISemanticTheme
{
// Colors shared by several meanings are named once, after the palette entry they come from.
private const string Red = "#f85552";
private const string Orange = "#f57d26";

// Hex values are the palette this theme mirrors; the trailing comment on each line is
// that palette's own name for the color.
private static readonly SemanticPalette Palette = new()
{
Neutrals = ["#5c6a72", "#f3efda"], // Fg, BgDim
Neutrals = ["#5c6a72", "#efebd4"], // Fg, BgDim
Primary = "#8da101", // Green
Alternate = "#f57d26", // Orange
Alternate = Orange,
Success = "#3a94c5", // Blue
CallToAction = "#35a77c", // Aqua
Information = "#df69ba", // Purple
Caution = "#dfa000", // Yellow
Warning = Red,
Warning = Orange,
Error = Red,
Failure = Red,
Debug = "#df69ba", // Purple
Expand Down
7 changes: 4 additions & 3 deletions ThemeProvider/Themes/Everforest/EverforestLightHard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,20 @@ public class EverforestLightHard : ISemanticTheme
{
// Colors shared by several meanings are named once, after the palette entry they come from.
private const string Red = "#f85552";
private const string Orange = "#f57d26";

// Hex values are the palette this theme mirrors; the trailing comment on each line is
// that palette's own name for the color.
private static readonly SemanticPalette Palette = new()
{
Neutrals = ["#5c6a72", "#f8f4e6"], // Fg, BgDim
Neutrals = ["#5c6a72", "#f2efdf"], // Fg, BgDim
Primary = "#8da101", // Green
Alternate = "#f57d26", // Orange
Alternate = Orange,
Success = "#3a94c5", // Blue
CallToAction = "#35a77c", // Aqua
Information = "#df69ba", // Purple
Caution = "#dfa000", // Yellow
Warning = Red,
Warning = Orange,
Error = Red,
Failure = Red,
Debug = "#df69ba", // Purple
Expand Down
Loading
Loading