ktsu.ImGuiNodeEditor
2.7.0
Prefix Reserved
See the version list below for details.
dotnet add package ktsu.ImGuiNodeEditor --version 2.7.0
NuGet\Install-Package ktsu.ImGuiNodeEditor -Version 2.7.0
<PackageReference Include="ktsu.ImGuiNodeEditor" Version="2.7.0" />
<PackageVersion Include="ktsu.ImGuiNodeEditor" Version="2.7.0" />
<PackageReference Include="ktsu.ImGuiNodeEditor" />
paket add ktsu.ImGuiNodeEditor --version 2.7.0
#r "nuget: ktsu.ImGuiNodeEditor, 2.7.0"
#:package ktsu.ImGuiNodeEditor@2.7.0
#addin nuget:?package=ktsu.ImGuiNodeEditor&version=2.7.0
#tool nuget:?package=ktsu.ImGuiNodeEditor&version=2.7.0
ktsu.ImGuiApp
A comprehensive collection of .NET libraries for building modern, feature-rich desktop applications with Dear ImGui.
Introduction
ktsu.ImGui.App is a suite of .NET libraries that provides everything you need to build desktop applications with Dear ImGui. The suite includes application scaffolding, custom widgets, modal dialogs, a theming system, and a node graph editor framework. Built on Hexa.NET.ImGui bindings and Silk.NET for cross-platform windowing, it supports .NET 10, 9, and 8.
Features
- Application Foundation: Complete application scaffolding with windowing, OpenGL rendering, font management, texture caching, and DPI awareness via
ktsu.ImGui.App - PID Frame Limiting: High-precision PID-controlled frame rate limiting with auto-tuning and adaptive throttling for focused, unfocused, idle, and minimized states
- Custom Widgets: Rich collection of UI components including TabPanel, Knob, SearchBox with fuzzy matching, RadialProgressBar with countdown/count-up timers, Grid layouts, DividerContainer with resizable sections, Combo, Tree, and Icons via
ktsu.ImGui.Widgets - Modal Dialogs: Professional popup system with MessageOK, Prompt, InputString/Int/Float, FilesystemBrowser, and SearchableList via
ktsu.ImGui.Popups - Theming System: 50+ built-in themes (Catppuccin, Tokyo Night, Gruvbox, Dracula, and more) with scoped styling, semantic text colors, button alignment, color palettes, and an interactive theme browser via
ktsu.ImGui.Styler - Node Graph Framework: Attribute-based node declaration system with UI-agnostic
ktsu.NodeGraphmetadata library and ImNodes-based visual editorktsu.ImGuiNodeEditorwith physics-based layout - Font Management: Unicode, emoji, and Nerd Font support with GPU memory management via
FontMemoryGuardand dynamic font scaling - Scoped Styling: RAII-pattern disposable wrappers for colors, styles, fonts, themes, disable states, and UI scaling
- Color Utilities: HSL/HSLA color creation, accessibility-focused contrast calculations, color manipulation extensions, and semantic color palettes
Libraries
ImGui.App - Application Foundation
Complete application scaffolding for Dear ImGui applications with windowing, rendering, font/texture management, and performance tuning.
ImGui.Widgets - Custom UI Components
Rich collection of custom widgets: TabPanel, Knob, SearchBox, RadialProgressBar, Grid, DividerContainer, Combo, Tree, Icons, ColorIndicator, Text, Image, ScopedDisable, and ScopedId.
ImGui.Popups - Modal Dialogs
Professional modal dialogs: MessageOK, Prompt, InputString/Int/Float with validation, FilesystemBrowser with glob filtering, and SearchableList with type-safe generics.
ImGui.Styler - Themes and Styling
Advanced theming system with 50+ built-in themes, scoped styling, semantic text colors, button alignment, color palettes, and an interactive theme browser.
NodeGraph - Node Metadata (UI-Agnostic)
Generic attribute-based system for declaring node graphs. Decorate classes, structs, and methods with node metadata (pins, execution modes, visibility, deprecation) without coupling to a specific editor implementation.
ImGuiNodeEditor - Visual Node Editor
Attribute-driven visual node editor built on ImNodes. Includes NodeEditorEngine for business logic, AttributeBasedNodeFactory for node creation from decorated types, physics-based layout simulation, and NodeEditorRenderer/NodeEditorInputHandler for rendering and interaction.
Installation
Package Manager Console
Install-Package ktsu.ImGui.App
Install-Package ktsu.ImGui.Widgets
Install-Package ktsu.ImGui.Popups
Install-Package ktsu.ImGui.Styler
Install-Package ktsu.NodeGraph
.NET CLI
dotnet add package ktsu.ImGui.App
dotnet add package ktsu.ImGui.Widgets
dotnet add package ktsu.ImGui.Popups
dotnet add package ktsu.ImGui.Styler
dotnet add package ktsu.NodeGraph
Package Reference
<PackageReference Include="ktsu.ImGui.App" Version="x.y.z" />
<PackageReference Include="ktsu.ImGui.Widgets" Version="x.y.z" />
<PackageReference Include="ktsu.ImGui.Popups" Version="x.y.z" />
<PackageReference Include="ktsu.ImGui.Styler" Version="x.y.z" />
<PackageReference Include="ktsu.NodeGraph" Version="x.y.z" />
Usage Examples
Basic Application
using ktsu.ImGui.App;
using Hexa.NET.ImGui;
ImGuiApp.Start(new ImGuiAppConfig
{
Title = "My Application",
OnRender = delta =>
{
ImGui.Text("Hello, ImGui!");
}
});
Application with Menu and Performance Settings
using ktsu.ImGui.App;
using ktsu.ImGui.Styler;
using Hexa.NET.ImGui;
ImGuiApp.Start(new ImGuiAppConfig
{
Title = "Full Application",
OnStart = () =>
{
Theme.Apply("Tokyo Night");
},
OnRender = delta =>
{
ImGui.Text("Content goes here");
},
OnAppMenu = () =>
{
if (ImGui.BeginMenu("File"))
{
if (ImGui.MenuItem("Exit"))
{
ImGuiApp.Stop();
}
ImGui.EndMenu();
}
},
PerformanceSettings = new ImGuiAppPerformanceSettings
{
FocusedFps = 60.0,
UnfocusedFps = 10.0,
IdleTimeoutSeconds = 30.0
}
});
Overlay Mode (Always-On-Top HUD)
Overlay mode turns the application window into a borderless, always-on-top, translucent HUD
with optional click-through — ideal for live status displays that sit over other apps. Drive
it from your render callback; the calls are cheap to make every frame (the native window is
only restyled when something actually changes). A dedicated OverlayFps keeps the overlay
animating smoothly even while unfocused, bypassing the normal focus/idle/visibility throttling.
bool overlayEnabled = true;
ImGuiApp.Start(new ImGuiAppConfig
{
Title = "Status HUD",
PerformanceSettings = new ImGuiAppPerformanceSettings { OverlayFps = 60.0 },
OnRender = delta =>
{
if (overlayEnabled)
{
// opacity 0.2–1.0, plus optional click-through (mouse passes through to apps behind it).
ImGuiApp.EnableOverlay(opacity: 0.9f, clickThrough: false);
// Optional: lock it to a corner of the monitor work area (Windows).
ImGuiApp.SetOverlayGeometry(OverlayCorner.TopRight, offsetX: 24, offsetY: 24, width: 360, height: 280);
}
else
{
ImGuiApp.DisableOverlay(); // restores the decorated window
}
ImGui.Text("Live status…");
}
});
Overlay window styling (borderless / topmost / translucency / click-through) is implemented on
Windows. On other platforms IsOverlayActive and OverlayFps still apply, but the window is
not restyled.
Widgets
using ktsu.ImGui.Widgets;
using Hexa.NET.ImGui;
// Tabbed interface
ImGuiWidgets.TabPanel tabPanel = new("MyTabs", closable: true, reorderable: true);
tabPanel.AddTab("tab1", "First Tab", () => ImGui.Text("Content 1"));
tabPanel.Draw();
// Search box with filtering
string searchTerm = "";
TextFilterType filterType = TextFilterType.Glob;
TextFilterMatchOptions matchOptions = TextFilterMatchOptions.ByWholeString;
ImGuiWidgets.SearchBox("##Search", ref searchTerm, ref filterType, ref matchOptions);
// Radial countdown timer
float timeRemaining = 300.0f;
ImGuiWidgets.RadialCountdown(timeRemaining, 300.0f);
// Resizable divider layout
ImGuiWidgets.DividerContainer divider = new("MySplit", ImGuiWidgets.DividerLayout.Columns);
divider.Add("left", 200f, true, dt => ImGui.Text("Left pane"));
divider.Add("right", 400f, true, dt => ImGui.Text("Right pane"));
divider.Tick(deltaTime);
Popups and Dialogs
using ktsu.ImGui.Popups;
// Message dialog
ImGuiPopups.MessageOK messageOK = new();
messageOK.Open("Hello!", "This is a message.");
messageOK.ShowIfOpen();
// String input dialog
ImGuiPopups.InputString inputString = new();
inputString.Open("Enter Name", "Name:", "Default", result => ProcessName(result));
inputString.ShowIfOpen();
// File browser
ImGuiPopups.FilesystemBrowser browser = new();
browser.FileOpen("Open File", path => LoadFile(path), "*.txt");
browser.ShowIfOpen();
// Searchable list
ImGuiPopups.SearchableList<string> list = new();
list.Open("Select Item", "Choose:", items, item => OnSelected(item));
list.ShowIfOpen();
Theming and Styling
using ktsu.ImGui.Styler;
using Hexa.NET.ImGui;
// Apply a built-in theme
Theme.Apply("Catppuccin Mocha");
// Show interactive theme browser
Theme.ShowThemeSelector("Select Theme");
// Scoped color styling (auto-restored after block)
using (new ScopedColor(ImGuiCol.Text, Color.FromHex("#ff6b6b")))
{
ImGui.Text("This text is red!");
}
// Semantic text colors
using (Text.Color.Error())
{
ImGui.Text("Error message");
}
using (Text.Color.Success())
{
ImGui.Text("Success message");
}
// Center content
using (new Alignment.Center(ImGui.CalcTextSize("Centered!")))
{
ImGui.Text("Centered!");
}
// Button text alignment
using (Button.Alignment.Center())
{
ImGui.Button("Centered text", new Vector2(200, 30));
}
// Scoped theme for a section
using (new ScopedTheme(myTheme))
{
ImGui.Text("This section uses a different theme");
}
Node Graph (Attribute-Based Declaration)
using ktsu.NodeGraph;
[Node("Math Add")]
[NodeBehavior(NodeExecutionMode.OnInputChange, IsDeterministic = true)]
public class AddNode
{
[InputPin("A")]
public float A { get; set; }
[InputPin("B")]
public float B { get; set; }
[OutputPin("Result")]
public float Result { get; set; }
[NodeExecute]
public void Execute()
{
Result = A + B;
}
}
Visual Node Editor
using ktsu.ImGuiNodeEditor;
// Create engine and factory
NodeEditorEngine engine = new();
AttributeBasedNodeFactory factory = new(engine);
// Register node types
factory.RegisterNodeType<AddNode>();
factory.RegisterNodeTypesFromAssembly(typeof(AddNode).Assembly);
// Create nodes
Node nodeA = factory.CreateNode<AddNode>(new Vector2(100, 100));
// Render in ImGui loop
NodeEditorRenderer renderer = new();
NodeEditorInputHandler inputHandler = new();
renderer.Render(engine, editorSize);
API Reference
ImGuiApp (Static)
Application lifecycle and utilities.
Methods
| Name | Return Type | Description |
|---|---|---|
Start(ImGuiAppConfig) |
void |
Initialize and run the application |
Stop() |
void |
Close the application window |
Show() / Hide() |
void |
Show or hide the window without stopping the render loop |
EnableOverlay(float, bool) |
void |
Enter overlay mode: borderless, always-on-top, translucent, optional click-through |
SetOverlayGeometry(OverlayCorner, int, int, int, int) |
void |
Lock the overlay to a work-area corner at an offset and size |
DisableOverlay() |
void |
Restore the decorated, non-topmost, opaque window |
SetGlobalScale(float) |
void |
Set accessibility UI scale (0.5-3.0) |
SetWindowIcon(string) |
void |
Set window icon from image file |
GetOrLoadTexture(AbsoluteFilePath) |
ImGuiAppTextureInfo |
Load or retrieve cached GPU texture |
DeleteTexture(uint) |
void |
Remove texture from GPU |
EmsToPx(float) |
int |
Convert EMs to pixels |
PtsToPx(int) |
int |
Convert points to pixels |
Properties
| Name | Type | Description |
|---|---|---|
IsFocused |
bool |
Whether the window has focus |
IsVisible |
bool |
Whether the window is visible |
IsIdle |
bool |
Whether the app is idle |
IsOverlayActive |
bool |
Whether the window is in overlay mode |
ScaleFactor |
float |
DPI-based scale factor |
GlobalScale |
float |
User-adjustable UI scale |
Invoker |
Invoker |
Delegate invocation for window thread |
ImGuiAppConfig
Configuration for ImGuiApp.Start().
Configuration Properties
| Name | Type | Description |
|---|---|---|
Title |
string |
Window title (default: "ImGuiApp") |
IconPath |
string |
Path to window icon |
OnStart |
Action |
Initialization callback |
OnUpdate |
Action<float> |
Per-frame update callback |
OnRender |
Action<float> |
Per-frame render callback |
OnAppMenu |
Action |
Menu bar rendering callback |
OnMoveOrResize |
Action |
Window moved/resized callback |
OnGlobalScaleChanged |
Action<float> |
Scale changed callback |
Fonts |
Dictionary<string, byte[]> |
Custom fonts to load |
EnableUnicodeSupport |
bool |
Include extended Unicode ranges (default: true) |
PerformanceSettings |
ImGuiAppPerformanceSettings |
Throttling configuration |
FontMemoryConfig |
FontMemoryGuard.FontMemoryConfig |
Font memory limits |
InitialWindowState |
ImGuiAppWindowState |
Initial window size/position |
ImGuiAppPerformanceSettings
Frame rate throttling configuration.
| Name | Type | Description |
|---|---|---|
EnableThrottledRendering |
bool |
Enable adaptive frame limiting (default: true) |
FocusedFps |
double |
Target FPS when focused (default: 30) |
UnfocusedFps |
double |
Target FPS when unfocused (default: 5) |
IdleFps |
double |
Target FPS when idle (default: 10) |
NotVisibleFps |
double |
Target FPS when minimized (default: 2) |
OverlayFps |
double |
Target FPS in overlay mode, bypassing focus/idle/visibility throttling (default: 30) |
IdleTimeoutSeconds |
double |
Seconds before idle state (default: 30) |
ImGuiWidgets (Static)
Custom UI components.
| Name | Return Type | Description |
|---|---|---|
SearchBox(...) |
bool |
Search box with Glob/Regex/Fuzzy filtering |
SearchBox<T>(...) |
IEnumerable<T> |
Filtered item selection |
SearchBoxRanked<T>(...) |
IEnumerable<T> |
Fuzzy-ranked item selection |
Knob(...) |
bool |
Rotary knob control (float or int) |
RadialProgressBar(...) |
void |
Radial progress indicator |
RadialCountdown(...) |
void |
Countdown timer display |
RadialCountUp(...) |
void |
Count-up timer display |
Combo<TEnum>(...) |
bool |
Enum selection combo |
Combo<TString>(...) |
bool |
String selection combo |
Icon(...) |
bool |
Icon with label and events |
Image(...) |
bool |
Clickable image display |
ColorIndicator(...) |
void |
Colored square indicator |
RowMajorGrid<T>(...) |
void |
Row-major grid layout |
ColumnMajorGrid<T>(...) |
void |
Column-major grid layout |
Widget Instance Classes
| Class | Description |
|---|---|
TabPanel |
Tabbed interface with closable, reorderable tabs |
DividerContainer |
Resizable split pane layout (columns or rows) |
ScopedDisable |
RAII wrapper to disable UI elements |
ScopedId |
RAII wrapper to push ImGui IDs |
Tree |
Tree view with nested children |
ImGuiPopups Classes
| Class | Description |
|---|---|
Modal |
Generic modal dialog |
MessageOK |
Simple message with OK button |
Prompt |
Multi-button prompt dialog |
InputString |
String input with confirmation |
InputInt |
Integer input with confirmation |
InputFloat |
Float input with confirmation |
FilesystemBrowser |
File/directory browser with glob filtering |
SearchableList<T> |
Searchable item selection list |
Theme (Static)
Theme management from ImGui.Styler.
| Name | Return Type | Description |
|---|---|---|
Apply(string) |
bool |
Apply a named theme |
Apply(ISemanticTheme) |
void |
Apply a theme instance |
ResetToDefault() |
void |
Reset to default ImGui theme |
ShowThemeSelector(...) |
void |
Show interactive theme browser |
RenderMenu(...) |
bool |
Render theme selection menu |
FindTheme(string) |
ThemeInfo? |
Look up theme by name |
AllThemes |
IReadOnlyList<ThemeInfo> |
All available themes |
DarkThemes |
IReadOnlyList<ThemeInfo> |
Dark themes only |
LightThemes |
IReadOnlyList<ThemeInfo> |
Light themes only |
Families |
IReadOnlyList<string> |
Theme family names |
Styling Utilities
| Class | Description |
|---|---|
ScopedColor |
RAII scoped ImGui color override |
ScopedTextColor |
RAII scoped text color |
ScopedStyleVar |
RAII scoped style variable |
ScopedThemeColor |
RAII scoped theme-aware color |
ScopedTheme |
RAII scoped full theme |
FontAppearance |
RAII scoped font styling |
UIScaler |
RAII scoped UI scaling |
Alignment.Center |
RAII scoped content centering |
Button.Alignment |
RAII scoped button text alignment |
Text.Color |
Semantic text colors (Error, Warning, Info, Success) |
Indent |
Scoped indentation utilities |
Color |
Color creation (Hex, RGB, HSL) with palettes |
Color Extensions (on ImColor)
| Name | Description |
|---|---|
DesaturateBy(float) |
Reduce saturation |
SaturateBy(float) |
Increase saturation |
LightenBy(float) |
Increase luminance |
DarkenBy(float) |
Decrease luminance |
WithAlpha(float) |
Set alpha channel |
ToGrayscale() |
Convert to grayscale |
CalculateOptimalContrastingColor() |
Get best contrast text color |
GetContrastRatioOver(ImColor) |
WCAG contrast ratio |
NodeEditorEngine
Core node graph business logic.
| Name | Return Type | Description |
|---|---|---|
CreateNode(...) |
Node |
Create a node with pins |
RemoveNode(int) |
bool |
Remove a node |
TryCreateLink(int, int) |
LinkCreationResult |
Create a link between pins |
RemoveLink(int) |
bool |
Remove a link |
UpdatePhysics(float) |
void |
Run physics simulation step |
Clear() |
void |
Remove all nodes and links |
Nodes |
IReadOnlyList<Node> |
All nodes |
Links |
IReadOnlyList<Link> |
All links |
IsStable |
bool |
Whether physics is stable |
Node Graph Attributes
| Attribute | Target | Description |
|---|---|---|
[Node] |
Class/Struct/Method | Marks type as a node |
[NodeBehavior] |
Class/Struct | Specifies execution mode |
[NodeExecute] |
Method | Marks execution method |
[InputPin] |
Property/Field/Parameter | Declares an input pin |
[OutputPin] |
Property/Field/Method | Declares an output pin |
[ExecutionInput] |
Property/Field | Declares execution input flow |
[ExecutionOutput] |
Property/Field | Declares execution output flow |
[NodeDeprecated] |
Class/Struct | Marks node as deprecated |
[NodeVisibility] |
Class/Struct | Controls menu visibility |
[WildcardPin] |
Property/Field | Accepts wildcard connections |
Demo Applications
The repository includes demo applications showcasing all features:
# Run the main demo
dotnet run --project examples/ImGuiAppDemo
# Run individual library demos
dotnet run --project examples/ImGuiWidgetsDemo
dotnet run --project examples/ImGuiPopupsDemo
dotnet run --project examples/ImGuiStylerDemo
Contributing
Contributions are welcome! Feel free to open issues or submit pull requests.
License
This project is licensed under the MIT License. See the LICENSE.md file for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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)
- Hexa.NET.ImNodes (>= 2.2.9)
- ktsu.ForceDirectedLayout (>= 2.7.0)
- ktsu.NodeGraph (>= 1.0.0)
- ktsu.Semantics.Quantities (>= 1.0.35)
- Microsoft.SourceLink.AzureRepos.Git (>= 10.0.300)
- Microsoft.SourceLink.GitHub (>= 10.0.300)
- Polyfill (>= 10.7.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
## v2.7.0 (minor)
Changes since v2.6.0:
- 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))
## v2.6.0 (minor)
Changes since v2.5.0:
- 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))
## v2.5.0 (minor)
Changes since v2.4.0:
- 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))
## v2.4.0 (minor)
Changes since v2.3.0:
- 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))
## v2.3.3 (patch)
Changes since v2.3.2:
- Remove legacy build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.3.2 (patch)
Changes since v2.3.1:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.3.1 (patch)
Changes since v2.3.0:
- 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))
## v2.3.0 (minor)
Changes since v2.2.0:
- [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))
## v2.2.12-pre.1 (prerelease)
Changes since v2.2.11:
- Fix all formatting errors to make build green ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Change default direction to clockwise and add StartAtBottom option ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Update README example function name to follow conventions ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Add input validation and optimize string allocation ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Fix clockwise/counter-clockwise logic and remove empty if block ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Add RadialProgressBar widget implementation and demo ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
- Initial plan ([@copilot-swe-agent[bot]](https://github.com/copilot-swe-agent[bot]))
## v2.2.11 (patch)
Changes since v2.2.10:
- Add visibility control for tabs in TabPanel ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.11-pre.2 (prerelease)
Changes since v2.2.11-pre.1:
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\update-winget-manifests.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.2.11-pre.1 (prerelease)
No significant changes detected since v2.2.11.
## v2.2.10 (patch)
Changes since v2.2.9:
- Exclude test projects from packaging and publishing processes in Invoke-DotNetPack and Invoke-DotNetPublish functions ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.10-pre.2 (prerelease)
Changes since v2.2.10-pre.1:
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.2.10-pre.1 (prerelease)
No significant changes detected since v2.2.10.
## v2.2.9 (patch)
Changes since v2.2.8:
- Add compatibility suppressions for DefaultInterpolatedStringHandler in multiple modules ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.9-pre.2 (prerelease)
Changes since v2.2.9-pre.1:
- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync COPYRIGHT.md ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.2.9-pre.1 (prerelease)
No significant changes detected since v2.2.9.
## v2.2.8 (patch)
Changes since v2.2.7:
- 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))
## v2.2.7 (patch)
Changes since v2.2.6:
- Remove .github\workflows\project.yml ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.6 (patch)
Changes since v2.2.5:
- Enhance project name matching to handle variations in repository naming conventions ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.5 (patch)
Changes since v2.2.4:
- Enhance CalculateOptimalPixelSize to consider global accessibility scale for improved rendering ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.4 (patch)
Changes since v2.2.3:
- Refactor null argument checks to use Ensure.NotNull for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.3 (patch)
Changes since v2.2.2:
- 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))
## v2.2.2 (patch)
Changes since v2.2.1:
- migrate to dotnet 10 ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.1 (patch)
Changes since v2.2.0:
- Dont show the close button on tabs inside a non-closable tab bar ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.1-pre.1 (prerelease)
No significant changes detected since v2.2.1.
## v2.2.0 (minor)
Changes since v2.1.0:
- 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))
## v2.1.10 (patch)
Changes since v2.1.9:
- 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))
## v2.1.10-pre.2 (prerelease)
Changes since v2.1.10-pre.1:
- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\update-winget-manifests.ps1 ([@ktsu[bot]](https://github.com/ktsu[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\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitattributes ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.1.10-pre.1 (prerelease)
No significant changes detected since v2.1.10.
## v2.1.9 (patch)
Changes since v2.1.8:
- Fix missing package references ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.8 (patch)
Changes since v2.1.7:
- 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))
## v2.1.7 (patch)
Changes since v2.1.6:
- 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))
## v2.1.6 (patch)
Changes since v2.1.5:
- 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))
## v2.1.5 (patch)
Changes since v2.1.4:
- 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))
## v2.1.4 (patch)
Changes since v2.1.3:
- 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))
## v2.1.3 (patch)
Changes since v2.1.2:
- Add manual trigger support to GitHub Actions workflow: Enabled workflow_dispatch to allow manual execution of the .NET CI pipeline. ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.2 (patch)
Changes since v2.1.1:
- 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))
## v2.1.1 (patch)
Changes since v2.1.0:
- 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))
## v2.1.0 (minor)
Changes since v2.0.0:
- [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://github.com/Cursor Agent))
- Remove focus checks from input event handlers ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix input focus detection to prevent incorrect idle state management ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve window focus detection and add debug logging for throttling ([@Cursor Agent](https://github.com/Cursor Agent))
- Refactor test suite into focused, organized test classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement lowest frame rate throttling with comprehensive condition evaluation ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Add comprehensive unit tests for ImGuiApp and related classes ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Add window visibility throttling for ultra-low resource usage ([@Cursor Agent](https://github.com/Cursor Agent))
- Simplify performance update logic and remove unnecessary tracking ([@Cursor Agent](https://github.com/Cursor Agent))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove documentation for deferred FPS/UPS update fix. ([@Cursor Agent](https://github.com/Cursor Agent))
- Implement deferred performance updates to prevent mid-cycle rate changes ([@Cursor Agent](https://github.com/Cursor Agent))
- Style cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Cleanup ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix performance rate sync and update throttling to prevent ImGui crashes ([@Cursor Agent](https://github.com/Cursor Agent))
- Remove blank lines ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove VSync throttling configuration and related code ([@Cursor Agent](https://github.com/Cursor Agent))
- Simplify VSync management and remove unnecessary context checks ([@Cursor Agent](https://github.com/Cursor Agent))
- Checkpoint before follow-up message ([@Cursor Agent](https://github.com/Cursor Agent))
- Fix VSync to prevent resource spikes when unfocused; update .NET SDK. ([@Cursor Agent](https://github.com/Cursor Agent))
- Add test coverage for ImGuiApp and related components ([@Cursor Agent](https://github.com/Cursor Agent))
- Improve VSync and resource management for unfocused application states ([@Cursor Agent](https://github.com/Cursor Agent))
- Update default font size check in ImGuiApp to use FontAppearance.DefaultFontPointSize for improved consistency in font handling. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper and ImGuiApp to simplify character addition and update default font key for compatibility. Removed unnecessary type checks in FontHelper for character ranges and adjusted font index storage in ImGuiApp to dynamically reflect the default font point size. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update default font point size in FontAppearance to 14 for improved readability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor font loading in ImGuiApp to utilize pre-allocated memory for both main and emoji fonts. This change improves memory management by reusing allocated handles, enhancing performance and reducing memory overhead during font loading. Updated related methods to reflect the new memory handling approach. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance FontHelper by adding support for extended Unicode and emoji glyph ranges. Introduced initialization flags and cleanup methods to manage memory more effectively. This refactor improves glyph range handling and prevents memory deallocation issues. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor FontHelper to simplify glyph range additions by removing unnecessary type casting to ushort. This change enhances the handling of character ranges for emoji and Latin Extended characters, improving code clarity and maintainability. ([@ma... (truncated due to NuGet length limits)