ktsu.ForceDirectedLayout 2.7.0

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package ktsu.ForceDirectedLayout --version 2.7.0
                    
NuGet\Install-Package ktsu.ForceDirectedLayout -Version 2.7.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ktsu.ForceDirectedLayout" Version="2.7.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ktsu.ForceDirectedLayout" Version="2.7.0" />
                    
Directory.Packages.props
<PackageReference Include="ktsu.ForceDirectedLayout" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ktsu.ForceDirectedLayout --version 2.7.0
                    
#r "nuget: ktsu.ForceDirectedLayout, 2.7.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ktsu.ForceDirectedLayout@2.7.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ktsu.ForceDirectedLayout&version=2.7.0
                    
Install as a Cake Addin
#tool nuget:?package=ktsu.ForceDirectedLayout&version=2.7.0
                    
Install as a Cake Tool

ktsu.ImGuiApp

A comprehensive collection of .NET libraries for building modern, feature-rich desktop applications with Dear ImGui.

License NuGet Version NuGet Version NuGet Downloads GitHub commit activity GitHub contributors GitHub Actions Workflow Status

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.NodeGraph metadata library and ImNodes-based visual editor ktsu.ImGuiNodeEditor with physics-based layout
  • Font Management: Unicode, emoji, and Nerd Font support with GPU memory management via FontMemoryGuard and 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

NuGet

Complete application scaffolding for Dear ImGui applications with windowing, rendering, font/texture management, and performance tuning.

ImGui.Widgets - Custom UI Components

NuGet

Rich collection of custom widgets: TabPanel, Knob, SearchBox, RadialProgressBar, Grid, DividerContainer, Combo, Tree, Icons, ColorIndicator, Text, Image, ScopedDisable, and ScopedId.

ImGui.Popups - Modal Dialogs

NuGet

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

NuGet

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)

NuGet

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on ktsu.ForceDirectedLayout:

Package Downloads
ktsu.ImGuiNodeEditor

A comprehensive .NET library suite for building desktop applications with Dear ImGui. Provides application scaffolding with PID-controlled frame limiting, custom widgets (TabPanel, SearchBox, Knob, RadialProgressBar, DividerContainer, Grid), modal dialogs (file browser, input prompts, searchable lists), a theming system with 50+ built-in themes and scoped styling, and an attribute-based node graph editor with physics-based layout. Built on Hexa.NET.ImGui bindings and Silk.NET for cross-platform windowing.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.9.0 0 6/2/2026
2.8.0 60 6/1/2026
2.7.0 97 6/1/2026
2.6.0 101 5/31/2026
2.5.0 99 5/29/2026

## 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)