ktsu.ImGui.Styler
3.3.8
Prefix Reserved
See the version list below for details.
dotnet add package ktsu.ImGui.Styler --version 3.3.8
NuGet\Install-Package ktsu.ImGui.Styler -Version 3.3.8
<PackageReference Include="ktsu.ImGui.Styler" Version="3.3.8" />
<PackageVersion Include="ktsu.ImGui.Styler" Version="3.3.8" />
<PackageReference Include="ktsu.ImGui.Styler" />
paket add ktsu.ImGui.Styler --version 3.3.8
#r "nuget: ktsu.ImGui.Styler, 3.3.8"
#:package ktsu.ImGui.Styler@3.3.8
#addin nuget:?package=ktsu.ImGui.Styler&version=3.3.8
#tool nuget:?package=ktsu.ImGui.Styler&version=3.3.8
ktsu.ImGui.Styler 🎨
A powerful, expressive styling library for ImGui.NET interfaces that simplifies theme management, provides scoped styling utilities, and offers advanced color manipulation with accessibility features.
✨ Features
🎨 Advanced Theme System
- 50+ Built-in Themes: Comprehensive collection including Catppuccin, Dracula, Gruvbox, Tokyo Night, Nord, and many more
- Interactive Theme Browser: Visual theme selection with live preview and categorization
- Semantic Theme Support: Leverages
ktsu.ThemeProviderfor consistent, semantic color theming - Scoped Theme Application: Apply themes to specific UI sections without affecting the global style
🎯 Precise Alignment Tools
- Automatic Content Centering: Center any content within containers or available regions
- Flexible Container Alignment: Align content within custom-sized containers
- Layout Integration: Seamlessly works with ImGui's existing layout system
🌈 Advanced Color Management
- Hex Color Support: Direct conversion from hex strings to ImGui colors
- Accessibility-First: Automatic contrast calculation and optimal text color selection
- Color Manipulation: Lighten, darken, and adjust colors programmatically
- Scoped Color Application: Apply colors to specific UI elements without side effects
🔧 Scoped Styling System
- Style Variables: Apply temporary style modifications with automatic cleanup
- Text Colors: Scoped text color changes with proper restoration
- Theme Colors: Apply theme-based colors to specific UI sections
- Memory Safe: Automatic resource management and style restoration
📦 Installation
Add ImGuiStyler to your project via NuGet:
<PackageReference Include="ktsu.ImGui.Styler" Version="x.y.z" />
Or via Package Manager Console:
Install-Package ktsu.ImGui.Styler
🚀 Quick Start
using ktsu.ImGui.Styler;
using Hexa.NET.ImGui;
// Apply a global theme
Theme.Apply("Tokyo Night");
// Use scoped styling for specific elements
using (new ScopedColor(ImGuiCol.Text, Color.FromHex("#ff6b6b")))
{
ImGui.Text("This text is red!");
}
// Center content automatically
using (new Alignment.Center(ImGui.CalcTextSize("Centered!")))
{
ImGui.Text("Centered!");
}
📚 Comprehensive Usage Guide
🎨 Theme Management
Applying Global Themes
// Apply any of the 50+ built-in themes
Theme.Apply("Catppuccin Mocha");
Theme.Apply("Gruvbox Dark");
Theme.Apply("Tokyo Night");
// Get the name of the currently applied theme
string? currentTheme = Theme.CurrentThemeName;
// Reset to default ImGui theme
Theme.ResetToDefault();
Interactive Theme Browser
// Show the theme browser modal
if (ImGui.Button("Choose Theme"))
{
Theme.ShowThemeSelector("Select a Theme");
}
// Render the theme selector (call this in your main render loop)
if (Theme.RenderThemeSelector())
{
Console.WriteLine($"Theme changed to: {Theme.CurrentThemeName}");
}
Scoped Theme Application
// ScopedTheme takes an ISemanticTheme instance; resolve one by name from the registry
ISemanticTheme dracula = Theme.FindTheme("Dracula")!.CreateInstance();
ISemanticTheme nord = Theme.FindTheme("Nord")!.CreateInstance();
using (new ScopedTheme(dracula))
{
ImGui.Text("This text uses Dracula theme");
ImGui.Button("Themed button");
using (new ScopedTheme(nord))
{
ImGui.Text("Nested Nord theme");
}
// Automatically reverts to Dracula
}
// Automatically reverts to previous theme
🌈 Color Management
Creating Colors
// From hex strings
ImColor red = Color.FromHex("#ff0000");
ImColor blueWithAlpha = Color.FromHex("#0066ffcc");
// From RGB values
ImColor green = Color.FromRGB(0, 255, 0);
ImColor customColor = Color.FromRGBA(255, 128, 64, 200);
// From HSL (hue, saturation, lightness)
ImColor purple = Color.FromHSL(0.83f, 1.0f, 0.5f);
Color Manipulation
Color manipulation is provided as extension methods on ImColor:
ImColor baseColor = Color.FromHex("#3498db");
// Adjust brightness
ImColor lighter = baseColor.LightenBy(0.3f);
ImColor darker = baseColor.DarkenBy(0.2f);
// Accessibility-focused text color (best contrast over baseColor)
ImColor optimalText = baseColor.CalculateOptimalContrastingColor();
// WCAG contrast ratio between two colors
float ratio = optimalText.GetContrastRatioOver(baseColor);
Scoped Color Application
// Scoped text color
using (new ScopedTextColor(Color.FromHex("#e74c3c")))
{
ImGui.Text("Red text");
}
// Scoped UI element color
using (new ScopedColor(ImGuiCol.Button, Color.FromHex("#2ecc71")))
{
ImGui.Button("Green button");
}
// Multiple scoped colors
using (new ScopedColor(ImGuiCol.Button, Color.FromHex("#9b59b6")))
using (new ScopedColor(ImGuiCol.ButtonHovered, Color.FromHex("#8e44ad")))
using (new ScopedColor(ImGuiCol.ButtonActive, Color.FromHex("#71368a")))
{
ImGui.Button("Fully styled button");
}
🎯 Alignment and Layout
Content Centering
// Center text
string text = "Perfectly centered!";
using (new Alignment.Center(ImGui.CalcTextSize(text)))
{
ImGui.Text(text);
}
// Center buttons
using (new Alignment.Center(new Vector2(120, 30)))
{
ImGui.Button("Centered Button", new Vector2(120, 30));
}
Custom Container Alignment
Vector2 containerSize = new(400, 200);
Vector2 contentSize = new(100, 50);
// Center content within a specific container
using (new Alignment.CenterWithin(contentSize, containerSize))
{
ImGui.Button("Centered in Container", contentSize);
}
🔧 Advanced Styling
Button Alignment
Align button text within buttons:
// Left-aligned button text
using (Button.Alignment.Left())
{
ImGui.Button("Left Aligned", new Vector2(200, 30));
}
// Center-aligned button text (default in most themes)
using (Button.Alignment.Center())
{
ImGui.Button("Center Aligned", new Vector2(200, 30));
}
Text Colors
Apply semantic text colors for consistent messaging:
// Normal text
using (Text.Color.Normal())
{
ImGui.Text("This is normal text");
}
// Error messages
using (Text.Color.Error())
{
ImGui.Text("Error: Something went wrong!");
}
// Warning messages
using (Text.Color.Warning())
{
ImGui.Text("Warning: Please be careful");
}
// Info messages
using (Text.Color.Info())
{
ImGui.Text("Info: Here's some information");
}
// Success messages
using (Text.Color.Success())
{
ImGui.Text("Success: Operation completed!");
}
// Customize the color definitions globally
Text.Color.Definitions.Error = Color.FromHex("#e74c3c");
Text.Color.Definitions.Success = Color.FromHex("#2ecc71");
Indentation
Create indented content blocks:
// Default indent
ImGui.Text("Normal text");
using (Indent.ByDefault())
{
ImGui.Text("Indented text");
using (Indent.ByDefault())
{
ImGui.Text("Double indented");
}
}
// Custom indent width
ImGui.Text("Normal text");
using (Indent.By(40.0f))
{
ImGui.Text("Indented by 40 pixels");
}
Scoped Style Variables
// Rounded buttons
using (new ScopedStyleVar(ImGuiStyleVar.FrameRounding, 8.0f))
{
ImGui.Button("Rounded Button");
}
// Multiple style modifications
using (new ScopedStyleVar(ImGuiStyleVar.FrameRounding, 12.0f))
using (new ScopedStyleVar(ImGuiStyleVar.FramePadding, new Vector2(20, 10)))
using (new ScopedStyleVar(ImGuiStyleVar.ItemSpacing, new Vector2(10, 8)))
{
ImGui.Button("Highly Styled Button");
ImGui.Button("Another Styled Button");
}
Theme-Based Styling
// Use semantic colors from current theme
using (new ScopedThemeColor(Color.Primary))
{
ImGui.Text("Primary theme color");
}
using (new ScopedThemeColor(Color.Secondary))
{
ImGui.Button("Secondary theme button");
}
🎨 Available Themes
ImGuiStyler includes 50+ carefully crafted themes across multiple families:
🌙 Dark Themes
- Catppuccin: Mocha, Macchiato, Frappe
- Tokyo Night: Classic, Storm
- Gruvbox: Dark, Dark Hard, Dark Soft
- Dracula: Classic vampire theme
- Nord: Arctic, frost-inspired theme
- Nightfox: Carbonfox, Nightfox, Terafox
- OneDark: Popular dark theme
- Kanagawa: Wave, Dragon variants
- Everforest: Dark, Dark Hard, Dark Soft
☀️ Light Themes
- Catppuccin: Latte
- Tokyo Night: Day
- Gruvbox: Light, Light Hard, Light Soft
- Nord: Light variant
- Nightfox: Dawnfox, Dayfox
- PaperColor: Light
- Everforest: Light, Light Hard, Light Soft
- VSCode: Light theme
🎨 Specialty Themes
- Monokai: Classic editor theme
- Nightfly: Smooth dark theme
- VSCode: Dark theme recreation
🛠️ API Reference
Theme Class
Theme.Apply(string themeName)- Apply a global theme (returnsfalseif not found)Theme.Apply(ISemanticTheme theme)- Apply a semantic themeTheme.ResetToDefault()- Reset to default ImGui themeTheme.ShowThemeSelector(string title)- Show theme browser modalTheme.RenderThemeSelector()- Render theme browser (returns true if theme changed)Theme.RenderMenu(string menuLabel)- Render a theme selection menuTheme.FindTheme(string name)- Look up a theme by name (returnsThemeInfo?)Theme.AllThemes/Theme.DarkThemes/Theme.LightThemes- Available themesTheme.Families- Get all theme familiesTheme.CurrentThemeName- Get current theme name
Color Class
Color.FromHex(string hex)- Create color from hex stringColor.FromRGB(byte r, byte g, byte b)- Create color from RGBColor.FromRGBA(byte r, byte g, byte b, byte a)- Create color from RGBAColor.FromHSL(float h, float s, float l)- Create color from HSL
Color Extension Methods (on ImColor)
color.LightenBy(float amount)- Lighten colorcolor.DarkenBy(float amount)- Darken colorcolor.WithAlpha(float amount)- Set alpha channelcolor.CalculateOptimalContrastingColor()- Get accessible (max-contrast) text colorcolor.GetContrastRatioOver(ImColor background)- WCAG contrast ratio
Alignment Classes
new Alignment.Center(Vector2 contentSize)- Center in available regionnew Alignment.CenterWithin(Vector2 contentSize, Vector2 containerSize)- Center in container
Scoped Classes
new ScopedColor(ImGuiCol col, ImColor color)- Scoped color application (also accepts a semanticColororSrgb)new ScopedTextColor(ImColor color)- Scoped text color (also accepts a semanticColororSrgb)new ScopedStyleVar(ImGuiStyleVar var, float value)- Scoped style variablenew ScopedTheme(ISemanticTheme theme)- Scoped theme applicationnew ScopedThemeColor(Color semanticColor)- Scoped semantic color
Button Class
Button.Alignment.Left()- Left-align button textButton.Alignment.Center()- Center-align button text
Text Class
Text.Color.Normal()- Apply normal text colorText.Color.Error()- Apply error text color (red)Text.Color.Warning()- Apply warning text color (yellow)Text.Color.Info()- Apply info text color (cyan)Text.Color.Success()- Apply success text color (green)Text.Color.Definitions- Customize default colors
Indent Class
Indent.ByDefault()- Create default indentIndent.By(float width)- Create indent with custom width
🎯 Demo Application
The included demo application showcases all features:
dotnet run --project examples/ImGuiStylerDemo
Features demonstrated:
- Interactive theme browser with live preview
- All 50+ themes with family categorization
- Scoped styling examples
- Color manipulation demos
- Alignment showcases
- Accessibility features
🤝 Contributing
We welcome contributions! Please see our contributing guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Setup
git clone https://github.com/ktsu-dev/ImGuiApp.git
cd ImGuiApp
dotnet restore
dotnet build
📄 License
This project is licensed under the MIT License - see the LICENSE.md file for details.
🙏 Acknowledgments
- ImGui.NET - .NET bindings for Dear ImGui
- Hexa.NET.ImGui - Modern ImGui bindings
- Theme Inspirations: Catppuccin, Tokyo Night, Gruvbox, and other amazing color schemes
- Community Contributors - Thank you for your themes, bug reports, and improvements!
🔗 Related Projects
- ktsu.ThemeProvider - Semantic theming foundation
- ktsu.ImGui.Popups - Modal and popup utilities (part of this suite)
- ktsu.ImGui.Widgets - Custom widgets (part of this suite)
Made with ❤️ by the ktsu.dev team
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Hexa.NET.ImGui (>= 2.2.9)
- ktsu.ImGui.Color (>= 3.3.8)
- ktsu.ImGui.Popups (>= 3.3.8)
- ktsu.ScopedAction (>= 1.1.27)
- ktsu.Semantics.Color (>= 2.9.1)
- ktsu.ThemeProvider (>= 2.0.26)
- ktsu.ThemeProvider.ImGui (>= 2.0.26)
- Polyfill (>= 11.0.1)
-
net8.0
- Hexa.NET.ImGui (>= 2.2.9)
- ktsu.ImGui.Color (>= 3.3.8)
- ktsu.ImGui.Popups (>= 3.3.8)
- ktsu.ScopedAction (>= 1.1.27)
- ktsu.Semantics.Color (>= 2.9.1)
- ktsu.ThemeProvider (>= 2.0.26)
- ktsu.ThemeProvider.ImGui (>= 2.0.26)
- Polyfill (>= 11.0.1)
-
net9.0
- Hexa.NET.ImGui (>= 2.2.9)
- ktsu.ImGui.Color (>= 3.3.8)
- ktsu.ImGui.Popups (>= 3.3.8)
- ktsu.ScopedAction (>= 1.1.27)
- ktsu.Semantics.Color (>= 2.9.1)
- ktsu.ThemeProvider (>= 2.0.26)
- ktsu.ThemeProvider.ImGui (>= 2.0.26)
- Polyfill (>= 11.0.1)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on ktsu.ImGui.Styler:
| Package | Downloads |
|---|---|
|
ktsu.ImGui.Widgets
A comprehensive library of custom widgets and UI components for ImGui.NET, featuring radial progress bars with countdown/count-up timers, tabbed interfaces with drag-and-drop support, type-safe combo boxes, resizable divider containers, powerful search boxes with fuzzy matching, icons with event handling, flexible grid layouts, and scoped utilities for IDs and disabling elements. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.16.5 | 69 | 9/3/2026 |
| 3.16.4 | 134 | 9/1/2026 |
| 3.16.3 | 135 | 8/31/2026 |
| 3.16.2 | 155 | 8/28/2026 |
| 3.16.1 | 120 | 8/28/2026 |
| 3.16.0 | 102 | 8/28/2026 |
| 3.15.1 | 108 | 8/28/2026 |
| 3.15.0 | 176 | 8/27/2026 |
| 3.14.1 | 161 | 8/27/2026 |
| 3.14.0 | 118 | 8/26/2026 |
| 3.13.2 | 122 | 8/26/2026 |
| 3.13.1 | 142 | 8/26/2026 |
| 3.13.0 | 114 | 8/26/2026 |
| 3.12.1 | 190 | 8/25/2026 |
| 3.12.0 | 124 | 8/25/2026 |
| 3.11.1 | 138 | 8/25/2026 |
| 3.11.0 | 152 | 8/24/2026 |
| 3.10.0 | 186 | 8/21/2026 |
| 3.9.3 | 150 | 8/20/2026 |
| 3.3.8 | 122 | 8/6/2026 |
## v3.3.8 (patch)
Changes since v3.3.7:
- Bump the ktsu group with 19 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync .github\workflows\update-sdks.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v3.3.8-pre.1 (prerelease)
Changes since v3.3.7:
- Sync .github\workflows\update-sdks.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v3.3.7 (patch)
Changes since v3.3.6:
- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.3.6 (patch)
Changes since v3.3.5:
- [patch] Fix crash navigating to the parent directory in the filesystem browser ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.3.5 (patch)
Changes since v3.3.4:
- Bump the ktsu group with 6 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.3.4 (patch)
Changes since v3.3.3:
- Bump the ktsu group with 2 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.3.3 (patch)
Changes since v3.3.2:
- Bump the ktsu group with 5 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.3.2 (patch)
Changes since v3.3.1:
- [patch] Upgrade to ktsu.Semantics 2.8.0 and simplify path access ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.3.1 (patch)
Changes since v3.3.0:
- [patch] Fix file dialog crash and drive list on Linux ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.3.0 (minor)
Changes since v3.2.0:
- Fix rendering and window geometry under tiling/Wayland compositors ([@matt-edmondson](https://github.com/matt-edmondson))
- Update gitattributes to match editorconfig for cs files ([@matt-edmondson](https://github.com/matt-edmondson))
- test(app): cover macOS DPI scale math, exclude native orchestration ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into fix/macos-dpi-detection ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Add native macOS DPI detection path ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.2.6 (patch)
Changes since v3.2.5:
- Update gitattributes to match editorconfig for cs files ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.2.5 (patch)
Changes since v3.2.4:
- Bump the ktsu group with 9 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.2.4 (patch)
Changes since v3.2.3:
- Bump MSTest.Sdk from 4.3.2 to 4.3.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 6 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.2.3 (patch)
Changes since v3.2.2:
- Bump the ktsu group with 6 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.2.2 (patch)
Changes since v3.2.1:
- Bump HexaGen.Runtime from 1.1.21 to 1.1.24 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 7 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.2.1 (patch)
Changes since v3.2.0:
- test(app): cover macOS DPI scale math, exclude native orchestration ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into fix/macos-dpi-detection ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Add native macOS DPI detection path ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.2.0 (minor)
Changes since v3.1.0:
- ci(ios): pin newest installed Xcode instead of hardcoded 26.5 ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(app): add direct HexaGen.Runtime reference for iOS build ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(markdown): correct list marker gutter and code-block vertical padding ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(markdown): correct inline cursor reservation, table ids, role-aware measure; drop unused deps ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(markdown): add package README and update suite docs ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add ImGuiMarkdownDemo example ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(markdown): task-list text, image line height, table columns; drop dead heading branch ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add block/inline renderers and public Render entry points ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(markdown): guard System.Threading.Lock for net9+ so net9 build passes ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add theme color resolution and scoped font pushing ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): flatten AST inlines into styled runs ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add pure sizing and list-marker helpers ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add Markdig pipeline, bounded parse cache, MarkdownDocument ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add pure InlineLayout word-wrap engine ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(markdown): broaden LinkPolicy exception filter and align test usings ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add LinkPolicy for scheme filtering and safe OS-open ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): add MarkdownConfig, MarkdownFontRole, MarkdownImageResult ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(markdown): scaffold ktsu.ImGui.Markdown package with Markdig ([@matt-edmondson](https://github.com/matt-edmondson))
- Add implementation plan for ktsu.ImGui.Markdown ([@matt-edmondson](https://github.com/matt-edmondson))
- Add design spec for ktsu.ImGui.Markdown package ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Use WCAG relative luminance to pick contrasting text color ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Fix CI annotations: package validation, workflow deprecations, code smells ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor color conversion methods to use ToSrgb; add new ToHsl and ToImGuiVector4 methods ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.1.10 (patch)
Changes since v3.1.9:
- Bump the ktsu group with 9 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.9 (patch)
Changes since v3.1.8:
- Bump the ktsu group with 9 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.8 (patch)
Changes since v3.1.7:
- Bump the ktsu group with 14 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.7 (patch)
Changes since v3.1.6:
- Bump the ktsu group with 6 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.6 (patch)
Changes since v3.1.5:
- Bump the ktsu group with 9 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.5 (patch)
Changes since v3.1.4:
- Bump the ktsu group with 12 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.4 (patch)
Changes since v3.1.3:
- Bump the ktsu group with 8 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.1.3 (patch)
Changes since v3.1.2:
- [patch] Use WCAG relative luminance to pick contrasting text color ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.1.2 (patch)
Changes since v3.1.1:
- [patch] Fix CI annotations: package validation, workflow deprecations, code smells ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.1.1 (patch)
Changes since v3.1.0:
- Refactor color conversion methods to use ToSrgb; add new ToHsl and ToImGuiVector4 methods ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.1.0 (minor)
Changes since v3.0.0:
- [minor] Strengthen color-vector typing with ImGuiVector4; docs ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Replace ImColors factory with Srgb/Color bridge conversions ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Flatten palette to Palette, drop alias, add ImColor.ToImGuiU32 ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Route library colors through the semantic color bridge ([@matt-edmondson](https://github.com/matt-edmondson))
## v3.0.1 (patch)
Changes since v3.0.0:
- Bump the system group with 1 update ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the microsoft group with 1 update ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 4 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v3.0.0 (major)
Changes since v2.0.0:
- [major] Extract color adapter to ImGui.Color; thin Styler to theming ([@matt-edmondson](https://github.com/matt-edmondson))
- Renormalize icon LFS pointers ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add FullWidth option to SearchBox ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add ReturnAllWhenEmpty option to SearchBox ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Refactor SearchBox to options-record API ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color)!: migrate ImGui.Styler to ktsu.Semantics.Color via ThemeProvider 2.0 ([@matt-edmondson](https://github.com/matt-edmondson))
- test(app): de-flake high-precision sleep timing assertions ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(imgui-color): add ktsu.ImGui.Color adapter (Color <-> ImColor/Vector4) ([@matt-edmondson](https://github.com/matt-edmondson))
- chore: remove unused SourceLink package versions ([@matt-edmondson](https://github.com/matt-edmondson))
- chore: remove redundant SourceLink package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility suppressions for new APIs in ImGui libraries ([@matt-edmondson](https://github.com/matt-edmondson))
- Add tests for multi-line icon size calculations ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Icon widget methods to use 'textBlock' parameter and update demo to reflect changes ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix collection initialisation ([@Damon3000s](https://github.com/Damon3000s))
- Add required system.text.json package ([@Damon3000s](https://github.com/Damon3000s))
- Always "correctly" align grids in demo ([@Damon3000s](https://github.com/Damon3000s))
- Update demo to show off multi line label Icon widget ([@Damon3000s](https://github.com/Damon3000s))
- Support multiple lines for Icon widget ([@Damon3000s](https://github.com/Damon3000s))
- [patch] Revert SixLabors.ImageSharp to 3.1.12 to avoid license key ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove stale files ([@matt-edmondson](https://github.com/matt-edmondson))
- Add direct PackageReferences to example projects ([@Claude](https://github.com/Claude))
- Add direct PackageReferences for directly-used transitive packages ([@Claude](https://github.com/Claude))
- Remove unused package versions from Directory.Packages.props ([@Claude](https://github.com/Claude))
- Make divider container respect the ImGui draw cursor ([@Claude](https://github.com/Claude))
- Move iOS jobs out of dotnet.yml into a dedicated ios.yml workflow ([@Claude](https://github.com/Claude))
- [patch] Fix FilesystemBrowser crash on open ([@matt-edmondson](https://github.com/matt-edmondson))
- ci: supply SixLabors.ImageSharp 4 license key via SIXLABORS_LICENSE_KEY ([@Claude](https://github.com/Claude))
- Fix floating-point equality reliability issue in XYPad ([@Claude](https://github.com/Claude))
- Fix analyzer errors in embedded hosting and audio widgets ([@Claude](https://github.com/Claude))
- Add embedded-window hosting and audio widgets ([@Claude](https://github.com/Claude))
- feat(ios): curated ImGuiAppDemo.iOS showcase + simulator CI (Task 8, part 3) (#213) ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(ios): import ktsu.Semantics.Strings for string.As<AbsoluteFilePath> ([@Claude](https://github.com/Claude))
- feat(ios): public texture loading via the Metal backend (Task 8, part 2) ([@Claude](https://github.com/Claude))
- feat(ios): AutoDiscoverExtensions flag (Task 8, part 1) (#211) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(ios): app menu (iPad) + Stop() semantics + no-op surface (Task 7) (#210) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(ios): font parity + imgui.ini redirect (Task 6) (#209) ([@matt-edmondson](https://github.com/matt-edmondson))
- ci: fix intermittent coverage broken-pipe flake (exit code 7) (#208) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(ios): touch + keyboard input (Task 5) (#207) ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(ios): mark Task 4 (Metal renderer) complete in the port plan ([@Claude](https://github.com/Claude))
- chore(ios): remove renderer bring-up diagnostics ([@Claude](https://github.com/Claude))
- fix(ios): use TextUnformatted to avoid the variadic igText ARM64 crash ([@Claude](https://github.com/Claude))
- diag(ios): trace OnRender draw calls + log font atlas dims ([@Claude](https://github.com/Claude))
- diag(ios): trace the frame loop to localise the render SIGSEGV ([@Claude](https://github.com/Claude))
- fix(ios): use non-normalized UChar4 for the ImGui vertex colour ([@Claude](https://github.com/Claude))
- fix(ios): write cimgui.dylib to an absolute path (root cause) ([@Claude](https://github.com/Claude))
- fix(ios): stash cimgui.dylib in RUNNER_TEMP so the embed step finds it ([@Claude](https://github.com/Claude))
- fix(ios): copy cimgui.dylib into the .app and dlopen by bundle path ([@Claude](https://github.com/Claude))
- fix(ios): ship cimgui as an embedded dynamic library, dlopen it ([@Claude](https://github.com/Claude))
- diag(ios): inspect the app binary for cimgui link/export status ([@Claude](https://github.com/Claude))
- fix(ios): export dynamic symbols so dlsym resolves static cimgui ([@Claude](https://github.com/Claude))
- diag(ios): probe cimgui symbol resolution before first ImGui call ([@Claude](https://github.com/Claude))
- fix(ios): use ImGui.GetVersionS() for the smoke version probe ([@Claude](https://github.com/Claude))
- fix(ios): pin cimgui to a consistent 1.92.3 docking commit ([@Claude](https://github.com/Claude))
- feat(ios): statically link cimgui so ImGui runs on iOS ([@Claude](https://github.com/Claude))
- fix(ios): satisfy KTSU0003/CA2000 analyzers in the Metal backend ([@Claude](https://github.com/Claude))
- feat(ios): Metal renderer backend (Task 4) - stand up ImGui frames on iOS ([@Claude](https://github.com/Claude))
- wip(ios): begin Metal renderer (Task 4) - shader + frame-loop scaffolding ([@Claude](https://github.com/Claude))
- ci(ios): iOS-simulator smoke test for the lifecycle (#205) ([@matt-edmondson](https://github.com/matt-edmondson))
- ci: re-trigger (flaky ForceDirectedLayout test-host abort) ([@Claude](https://github.com/Claude))
- test: drop redundant (nint) casts on int literals (IDE0004) ([@Claude](https://github.com/Claude))
- [minor] Make GPU texture handles nint end-to-end for the Metal backend ([@Claude](https://github.com/Claude))
- iOS: satisfy analyzers/nullability in the UIKit lifecycle ([@Claude](https://github.com/Claude))
- docs: record resolved iOS-port design decisions ([@Claude](https://github.com/Claude))
- iOS: native UIKit lifecycle (UIApplicationDelegate + CADisplayLink) ([@Claude](https://github.com/Claude))
- ci: re-trigger workflow (flaky unrelated tests) ([@Claude](https://github.com/Claude))
- iOS: fix net10.0-ios compile errors from the config decoupling ([@Claude](https://github.com/Claude))
- iOS: make the config surface platform-neutral and align Start signature ([@Claude](https://github.com/Claude))
- Exclude ImGuiAppBlend.cs from the iOS build ([@Claude](https://github.com/Claude))
- Honor ImGui draw-command callbacks; add per-region blend modes ([@Claude](https://github.com/Claude))
- Remap canvas and restore window on overlay enter/exit ([@Claude](https://github.com/Claude))
- Refactor SuppressMessage attributes for static fields in ImGuiApp ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Fix "Renderer backend is not initialized" when loading textures from OnStart ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Fix SonarQube issues: safe fixes and justified suppressions (round 2/2) ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Fix SonarQube issues: safe fixes and justified suppressions (round 1/2) ([@matt-edmondson](https://github.com/matt-edmondson))
- Exclude native C ABI shim from code coverage to fix CI test crash ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix IDE0055 formatting in demo overlay settings ([@Claude](https://github.com/Claude))
- [minor] Add canonical overlay-mode window support ([@Claude](https://github.com/Claude))
- Fix typo in library name in README.md ([@matt-edmondson](https://github.com/matt-edmondson))
- docs: correct package names and audit documentation ([@Claude](https://github.com/Claude))
- Remove version number from VERSION.md ([@matt-edmondson](https://github.com/matt-edmondson))
- style: drop unused using and use id for skeleton shimmer offset ([@Claude](https://github.com/Claude))
- [minor] Add hidden-start and hide-on-close window support ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: add Card, SkeletonLoader, and PinInput mobile widgets ([@Claude](https://github.com/Claude))
- style: remove redundant parentheses in Avatar hue calc (IDE0047) ([@Claude](https://github.com/Claude))
- feat: add mobile decorator widgets (Avatar, Badge, Rating, PageIndicator) ([@Claude](https://github.com/Claude))
- ci: re-trigger after flaky code-coverage pipe-disconnect at test session end ([@Claude](https://github.com/Claude))
- ci: re-trigger after flaky NodeGraph.Tests coverage pipe disconnect ([@Claude](https://github.com/Claude))
- style: drop redundant parentheses in RangeSlider tooltip guard (IDE0047) ([@Claude](https://github.com/Claude))
- Fix knob drag value accumulation and stale indicator ([@Claude](https://github.com/Claude))
- feat: add mobile form-control widgets [minor] ([@Claude](https://github.com/Claude))
- feat: add OverlayHost z-ordered overlay manager for ImGui.Widgets ([@Claude](https://github.com/Claude))
- ci: re-trigger after flaky PidFrameLimiter sleep-timing test ([@Claude](https://github.com/Claude))
- style: drop unused System using from InertialScrollTests ([@Claude](https://github.com/Claude))
- style: split inline if-statements in InertialScrollTests for IDE2001 ([@Claude](https://github.com/Claude))
- feat: add InertialScroll helper for ImGui.Widgets ([@Claude](https://github.com/Claude))
- docs: degrade ImGuiController cref to <c> for iOS-tfm doc-build ([@Claude](https://github.com/Claude))
- ci: make the iOS stub actually compile on macos-14 ([@Claude](https://github.com/Claude))
- fix: collapse Spring construction into object initializers (IDE0017) ([@Claude](https://github.com/Claude))
- ci: also clear ktsu.Sdk's forced RuntimeIdentifiers on the macOS iOS build ([@Claude](https://github.com/Claude))
- ci: scope iOS restore/build to net10.0-ios only ([@Claude](https://github.com/Claude))
- feat: add Tween, Spring, and Easing animation primitives ([@Claude](https://github.com/Claude))
- ci: add macos-14 job that compile-checks net10.0-ios ([@Claude](https://github.com/Claude))
- feat: add gesture detection foundation for ImGui.Widgets [minor] ([@Claude](https://github.com/Claude))
- docs: plan for mobile UI widgets in ImGui.Widgets ([@Claude](https://github.com/Claude))
- refactor: introduce IRendererBackend seam for the iOS port ([@Claude](https://github.com/Claude))
- docs: design plan for iOS platform port ([@Claude](https://github.com/Claude))
- fix: downgrade SixLabors.ImageSharp to 3.1.12 to restore CI ([@Claude](https://github.com/Claude))
- feat: scaffold net10.0-ios target for ImGui.App ([@Claude](https://github.com/Claude))
- fix: resolve IDE0221 and IDE0380 warnings treated as errors ([@Claude](https://github.com/Claude))
- fix: downgrade SixLabors.ImageSharp from 4.0.0 to 3.1.12 ([@Claude](https://github.com/Claude))
- fix: exclude NativeExports.cs from all SonarCloud analysis ([@Claude](https://github.com/Claude))
- fix: add InternalsVisibleTo for test project (KTSU0002) ([@Claude](https://github.com/Claude))
- fix: suppress CA1823 for intentional ABI struct padding fields ([@Claude](https://github.com/Claude))
- fix: exclude NativeExports.cs from SonarCloud coverage analysis ([@Claude](https://github.com/Claude))
- fix: address MSTest and code analysis violations in ForceDirectedLayout.Tests ([@Claude](https://github.com/Claude))
- fix: convert array initializers to collection expressions in ForceLayoutTests ([@Claude](https://github.com/Claude))
- Fix CI exit code propagation and SonarCloud quality gate failures ([@Claude](https://github.com/Claude))
- Add C ABI surface and AOT-friendly double-precision core ([@Claude](https://github.com/Claude))
- Extract force-directed layout into ktsu.ForceDirectedLayout ([@Claude](https://github.com/Claude))
- Update base directory path ([@Damon3000s](https://github.com/Damon3000s))
- Copy ktsu.png to output directory for ImGuiWidgetsDemo ([@Damon3000s](https://github.com/Damon3000s))
- Fix ImGuiPopupsDemo csproj inclusion ([@Damon3000s](https://github.com/Damon3000s))
- Missed file from dotnet format ([@Damon3000s](https://github.com/Damon3000s))
- Results from dotnet format ([@Damon3000s](https://github.com/Damon3000s))
- Add DESCRIPTION.md and TAGS.md files; update README.md with comprehensive library details and usage examples ([@matt-edmondson](https://github.com/matt-edmondson))
- Add SonarLint configuration for connected mode ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(timers): Add countdown and count-up timer demos with radial progress indicators ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove legacy build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Increase MaxForce values in PhysicsSettings and demo to enhance simulation capabilities ([@matt-edmondson](https://github.com/matt-edmondson))
- Add directional bias setting and calculation for horizontal link forces ([@matt-edmondson](https://github.com/matt-edmondson))
- Update physics settings: adjust repulsion strength, origin anchor weight, damping factor, and link length for improved simulation dynamics ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance physics settings: add OriginAnchorWeight for gravity target blending and initialize world origin to centroid for improved simulation accuracy ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor gravity force calculation: simplify magnitude computation by removing distance factor ([@matt-edmondson](https://github.com/matt-edmondson))
- Update repulsion strength in physics settings for enhanced simulation performance ([@matt-edmondson](https://github.com/matt-edmondson))
- Adjust repulsion strength limits in physics settings for improved simulation accuracy ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor gravity calculations: update to use centroid for cohesion force and improve rendering of gravity center ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine physics settings: adjust damping factor description and clamp minimum repulsion distance to prevent force explosions ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance physics simulation: add node pinning and stability detection features ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Guard BeginFrame against calling native extensions without ImGui context ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add CleanImNodesDemo with physics simulation and attribute-based node editor ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add ImGuiNodeEditor with physics simulation and attribute-based node factory ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add NodeGraph test suite with 106 tests covering attributes, pins, type system, and validation ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add NodeGraph library with attribute-based node definitions ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Refactor demo app with modular tab-based architecture and extension demos ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add unit tests for ImGuiExtensionManager ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Integrate ImGuiExtensionManager into ImGuiController lifecycle ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add ImGuiExtensionManager for optional ImGuizmo, ImNodes, and ImPlot support ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add Hexa.NET.ImGuizmo, ImNodes, and ImPlot package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Add visibility control for tabs in TabPanel ([@matt-edmondson](https://github.com/matt-edmondson))
- Exclude test projects from packaging and publishing processes in Invoke-DotNetPack and Invoke-DotNetPublish functions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility suppressions for DefaultInterpolatedStringHandler in multiple modules ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility suppressions for DynamicallyAccessedMemberTypes and ExperimentalAttribute in ImGui.Popups, ImGui.Styler, and ImGui.Widgets for .NET 10.0 ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine glyph area calculations and atlas fitting checks for improved memory management ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor null checks to use Ensure.NotNull for improved readability and consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project name matching to handle variations in repository naming conventions ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance CalculateOptimalPixelSize to consider global accessibility scale for improved rendering ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor null argument checks to use Ensure.NotNull for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve search box hint display logic based on available width ([@matt-edmondson](https://github.com/matt-edmondson))
- Add CLAUDE.md for project guidance and architecture overview ([@matt-edmondson](https://github.com/matt-edmondson))
- migrate to dotnet 10 ([@matt-edmondson](https://github.com/matt-edmondson))
- Dont show the close button on tabs inside a non-closable tab bar ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor glyph calculation for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Add dynamic atlas sizing and glyph limit calculation ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix gpu detection priority ([@matt-edmondson](https://github.com/matt-edmondson))
- Update tests/ImGui.App.Tests/FontMemoryGuardTests.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGui.App/FontMemoryGuard.cs to improve null checking ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGui.App/FontMemoryGuard.cs to have more specific matching criteria ([@matt-edmondson](https://github.com/matt-edmondson))
- Update variable name ImGui.App/ImGuiApp.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance font initialization with memory management features ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix missing package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Increase timeout for build job to 20 minutes ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project structure and testing: Added new dependencies in Directory.Packages.props, introduced a new Tests project in the solution, and updated project references. Refactored namespaces for consistency across multiple files. Updated test configurations and example projects to align with the new structure. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project structure and dependencies: Added new package versions in Directory.Packages.props, updated SDK versions in global.json, and refactored namespaces across multiple files for consistency. Removed the ImGui.Popups.Credential project and adjusted related references in the solution and project files. Enhanced test project configurations and updated example projects to reflect the new structure. ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial combined commit ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix NuGet package source URL in Invoke-NuGetPublish function: Updated the source URL to ensure correct package publishing to packages.ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Ktsu package key support in build configuration: Updated the .NET CI workflow and PowerShell script to include an optional Ktsu package key for publishing. Enhanced documentation for the new parameter and added conditional publishing logic for Ktsu.dev. ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement modern DPI awareness handling in Windows: Updated ForceDpiAware to utilize the latest DPI awareness APIs for better compatibility with windowing libraries. Added fallback mechanisms for older Windows versions and enhanced NativeMethods with new DPI awareness context functions. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance window position validation logic: Implemented performance optimizations to skip unnecessary checks when window position and size remain unchanged. Added methods for better multi-monitor support, ensuring windows are relocated when insufficiently visible. Updated tests to verify new behavior and performance improvements. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package versions and clean up validation logic: Bump versions for Hexa.NET.ImGui, ktsu.ScopedAction, SixLabors.ImageSharp, System.Text.Json, and MSTest packages. Remove redundant validation checks from ImGuiApp configuration and corresponding tests. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor ImGuiApp configuration handling: Introduced AdjustConfigForStartup method to automatically convert minimized window state to normal during startup, improving application reliability. Updated tests to validate this new behavior. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ImGuiApp configuration validation: Automatically convert minimized and fullscreen window states to normal during startup to prevent issues. Updated tests to reflect this change, ensuring proper state handling without exceptions. ([@matt-edmondson](https://github.com/matt-edmondson))
- Additional tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
- Move debug logger into its own file and make it output to the appdata dir ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] Implement PID-based frame limiting in ImGuiApp: Introduced a new PidFrameLimiter class for precise frame rate control, enhancing performance optimization. Updated documentation to reflect new features, including auto-tuning capabilities and real-time diagnostics. Adjusted rendering settings to disable VSync for improved frame limiting accuracy. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance ImGuiApp documentation and features: Updated project overview, added detailed descriptions for performance optimization, debug logging, and Unicode support. Introduced performance monitoring capabilities with real-time FPS tracking and throttling visualization. Improved font management and DPI handling. Refactored configuration settings for better usability. Updated demo application to showcase new features. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor performance settings: remove Ups, add NotVisibleFps and flags ([@Cursor Agent](https://github.com/Cursor Agent))
- Auto-commit pending changes before rebase - PR synchronize ([@Cursor Agent](https://github.com/Cursor Agent))
- Merge remote-tracking branch 'origin/main' into cursor/increase-imguiapp-test-coverage-c9d4 ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix test paths using Path.GetFullPath for consistent texture testing ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test for preventing multiple ImGuiApp starts ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance performance throttling with lowest-rate selection logic ([@Cursor Agent](https://github.com/Cursor Agent))
- Increase NotVisibleFps from 0.2 to 2.0 for better background performance ([@Cursor Agent](https://github.com/Cursor Agent))
- Add real-time FPS graph with throttling state visualization ([@Cursor Agent](https://github.com/Cursor Agent))
- Add NotVisibleFps setting for ultra-low frame rate when minimized ([@Cursor Agent](https://github.com/Cursor Agent))
- Adjust not visible frame rate to 0.2 FPS for better resource conservation ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor ImGuiApp tests to use Assert.ThrowsException method ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement sleep-based frame rate throttling and remove UPS settings ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Update ImGuiFontConfig test to allow empty font path ([@Cursor Agent](https://github.com/Cursor Agent))
- Use PackageReleaseNotesFile to handle changelog release notes more robustly ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve performance throttling with multi-condition rate selection ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove debug throttling properties and simplify focus handling ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection and add throttling debug info ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive test coverage for ImGuiApp components and edge cases ([@Cursor Agent](https:... (truncated due to NuGet length limits)