VOOZH about

URL: https://www.nuget.org/packages/ktsu.ImGui.Widgets/

⇱ NuGet Gallery | ktsu.ImGui.Widgets 2.15.2




👁 Image
ktsu.ImGui.Widgets 2.15.2

Prefix Reserved
dotnet add package ktsu.ImGui.Widgets --version 2.15.2
 
 
NuGet\Install-Package ktsu.ImGui.Widgets -Version 2.15.2
 
 
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.ImGui.Widgets" Version="2.15.2" />
 
 
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ktsu.ImGui.Widgets" Version="2.15.2" />
 
Directory.Packages.props
<PackageReference Include="ktsu.ImGui.Widgets" />
 
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.ImGui.Widgets --version 2.15.2
 
 
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: ktsu.ImGui.Widgets, 2.15.2"
 
 
#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.ImGui.Widgets@2.15.2
 
 
#: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.ImGui.Widgets&version=2.15.2
 
Install as a Cake Addin
#tool nuget:?package=ktsu.ImGui.Widgets&version=2.15.2
 
Install as a Cake Tool
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

ktsu.ImGui.Widgets

ImGuiWidgets is a library of custom widgets using ImGui.NET. This library provides a variety of widgets and utilities to enhance your ImGui-based applications.

Features

  • Knobs: Ported to .NET from ImGui-works/ImGui-knobs-dial-gauge-meter
  • Radial Progress Bar: Circular progress indicators for visualizing loading and progress with countdown/count-up timers
  • Resizable Layout Dividers: Draggable layout dividers for resizable layouts (DividerContainer)
  • TabPanel: Tabbed interface with closable, reorderable tabs and dirty indicator support
  • Combo: Type-safe combo boxes for enums, strings, and strong strings
  • Icons: Customizable icons with various alignment options and event delegates
  • Grid: Flexible grid layout for displaying items
  • Color Indicator: An indicator that displays a color when enabled
  • Image: An image widget with alignment options
  • Text: A text widget with alignment options
  • Tree: A tree widget for displaying hierarchical data
  • Scoped Id: A utility class for creating scoped IDs
  • Scoped Disable: Temporarily disable UI elements within a scope
  • SearchBox: A powerful search box with support for various filter types (Glob, Regex, Fuzzy) and matching options

Installation

To install ImGuiWidgets, you can add the library to your .NET project using the following command:

dotnet add package ktsu.ImGui.Widgets

Usage

To use ImGuiWidgets, you need to include the ktsu.ImGui.Widgets namespace in your code:

using ktsu.ImGui.Widgets;

Then, you can start using the widgets provided by ImGuiWidgets in your ImGui-based applications.

Examples

Here are some examples of using ImGuiWidgets:

Knobs

Knobs are useful for creating dial-like controls:

float value = 0.5f;
float minValue = 0.0f;
float maxValue = 1.0f;

ImGuiWidgets.Knob("Knob", ref value, minValue, maxValue);

Radial Progress Bar

The RadialProgressBar widget displays circular progress indicators perfect for loading states, progress tracking, countdowns, and timers:

float progress = 0.65f; // Progress from 0.0 to 1.0

// Basic usage - displays with default size and settings (clockwise from top, percentage text)
ImGuiWidgets.RadialProgressBar(progress);

// Custom size (radius in pixels)
ImGuiWidgets.RadialProgressBar(progress, radius: 50);

// Custom thickness
ImGuiWidgets.RadialProgressBar(progress, radius: 50, thickness: 10);

// Without text in center
ImGuiWidgets.RadialProgressBar(progress, 50, 0, 32, ImGuiRadialProgressBarOptions.NoText);

// Counter-clockwise direction (default is clockwise)
ImGuiWidgets.RadialProgressBar(progress, 50, 0, 32, ImGuiRadialProgressBarOptions.CounterClockwise);

// Start at bottom instead of top
ImGuiWidgets.RadialProgressBar(progress, 50, 0, 32, ImGuiRadialProgressBarOptions.StartAtBottom);

// Combine options: counter-clockwise starting at bottom
ImGuiWidgets.RadialProgressBar(progress, 50, 0, 32,
 ImGuiRadialProgressBarOptions.CounterClockwise | ImGuiRadialProgressBarOptions.StartAtBottom);

// Animated progress example
float animatedProgress = 0.0f;
void UpdateProgress(float deltaTime)
{
 animatedProgress += deltaTime * 0.2f;
 if (animatedProgress > 1.0f) animatedProgress = 0.0f;

 ImGuiWidgets.RadialProgressBar(animatedProgress);
}
Text Display Modes

The RadialProgressBar supports three text display modes:

// Percentage mode (default) - displays "65%"
ImGuiWidgets.RadialProgressBar(0.65f);

// Time mode - displays time in MM:SS or HH:MM:SS format
ImGuiWidgets.RadialProgressBar(
 progress: 0.5f,
 textMode: ImGuiRadialProgressBarTextMode.Time,
 timeValue: 150.0f // Displays "02:30"
);

// Time mode with hours - displays "01:05:30"
ImGuiWidgets.RadialProgressBar(
 progress: 0.7f,
 textMode: ImGuiRadialProgressBarTextMode.Time,
 timeValue: 3930.0f // 1 hour, 5 minutes, 30 seconds
);

// Custom text mode - displays any string you provide
ImGuiWidgets.RadialProgressBar(
 progress: 0.3f,
 textMode: ImGuiRadialProgressBarTextMode.Custom,
 customText: "Loading..."
);
Countdown Timer

Use RadialCountdown for countdown timers showing time remaining:

float countdownTime = 300.0f; // 5 minutes in seconds
const float CountdownTotal = 300.0f;
bool isRunning = false;

// Update countdown
if (isRunning && countdownTime > 0.0f)
{
 countdownTime -= deltaTime;
 if (countdownTime < 0.0f)
 {
 countdownTime = 0.0f;
 isRunning = false;
 }
}

// Display countdown - shows time remaining (e.g., "05:00", "04:30", etc.)
ImGuiWidgets.RadialCountdown(countdownTime, CountdownTotal);

// With custom options
ImGuiWidgets.RadialCountdown(
 countdownTime,
 CountdownTotal,
 radius: 60,
 thickness: 12,
 segments: 64,
 options: ImGuiRadialProgressBarOptions.CounterClockwise
);

// Reset button
if (ImGui.Button("Reset"))
{
 countdownTime = CountdownTotal;
 isRunning = false;
}
Count-Up Timer

Use RadialCountUp for timers showing elapsed time:

float elapsedTime = 0.0f;
const float TotalTime = 180.0f; // 3 minutes
bool isRunning = false;

// Update timer
if (isRunning && elapsedTime < TotalTime)
{
 elapsedTime += deltaTime;
 if (elapsedTime > TotalTime)
 {
 elapsedTime = TotalTime;
 isRunning = false;
 }
}

// Display count-up timer - shows elapsed time (e.g., "00:00", "00:15", etc.)
ImGuiWidgets.RadialCountUp(elapsedTime, TotalTime);

// With custom size and options
ImGuiWidgets.RadialCountUp(
 elapsedTime,
 TotalTime,
 radius: 70,
 options: ImGuiRadialProgressBarOptions.StartAtBottom
);

// Start/stop controls
if (ImGui.Button(isRunning ? "Stop" : "Start"))
{
 isRunning = !isRunning;
}

if (ImGui.Button("Reset"))
{
 elapsedTime = 0.0f;
 isRunning = false;
}
Advanced Timer Examples
// Pomodoro timer (25 minutes work, 5 minutes break)
const float WorkDuration = 1500.0f; // 25 minutes
const float BreakDuration = 300.0f; // 5 minutes
float currentTime = WorkDuration;
bool isWorkSession = true;

if (isWorkSession)
{
 ImGuiWidgets.RadialCountdown(currentTime, WorkDuration, radius: 80);
}
else
{
 ImGuiWidgets.RadialCountdown(currentTime, BreakDuration, radius: 80);
}

// Stopwatch with custom display
float stopwatchTime = 0.0f;
ImGuiWidgets.RadialProgressBar(
 progress: 0.0f, // No progress bar fill
 radius: 60,
 textMode: ImGuiRadialProgressBarTextMode.Time,
 timeValue: stopwatchTime,
 options: ImGuiRadialProgressBarOptions.NoText // Hide text if desired
);
ImGui.Text($"Elapsed: {stopwatchTime:F2}s");

// Combined progress and time display
float taskProgress = 0.35f;
float taskTimeRemaining = 120.0f; // 2 minutes remaining

ImGui.Columns(2);
ImGuiWidgets.RadialProgressBar(taskProgress);
ImGui.TextUnformatted("Progress");
ImGui.NextColumn();

ImGuiWidgets.RadialProgressBar(
 taskProgress,
 textMode: ImGuiRadialProgressBarTextMode.Time,
 timeValue: taskTimeRemaining
);
ImGui.TextUnformatted("Time Remaining");
ImGui.Columns(1);

SearchBox

The SearchBox widget provides a powerful search interface with multiple filter type options:

// Static fields to maintain filter state between renders
private static string searchTerm = string.Empty;
private static TextFilterType filterType = TextFilterType.Glob;
private static TextFilterMatchOptions matchOptions = TextFilterMatchOptions.ByWholeString;

// List of items to search
var items = new List<string> { "Apple", "Banana", "Cherry", "Date", "Elderberry" };

// Basic search box with right-click context menu for filter options
ImGuiWidgets.SearchBox("##BasicSearch", ref searchTerm, ref filterType, ref matchOptions);

// Display results
if (!string.IsNullOrEmpty(searchTerm))
{
 ImGui.TextUnformatted($"Search results for: {searchTerm}");
}

// Search box that returns filtered results directly
var filteredResults = ImGuiWidgets.SearchBox(
 "##FilteredSearch",
 ref searchTerm,
 items, // Collection to filter
 item => item, // Selector function to extract string from each item
 ref filterType,
 ref matchOptions).ToList();

// Ranked search box for fuzzy matching and ranked results
var rankedResults = ImGuiWidgets.SearchBoxRanked(
 "##RankedSearch",
 ref searchTerm,
 items,
 item => item).ToList();

TabPanel

TabPanel creates a tabbed interface with support for closable tabs, reordering, and dirty state indication:

// Create a tab panel with closable and reorderable tabs
var tabPanel = new ImGuiWidgets.TabPanel("MyTabPanel", true, true);

// Add tabs with explicit IDs (recommended for stability when tabs are reordered)
string tab1Id = tabPanel.AddTab("tab1", "First Tab", RenderTab1Content);
string tab2Id = tabPanel.AddTab("tab2", "Second Tab", RenderTab2Content);
string tab3Id = tabPanel.AddTab("tab3", "Third Tab", RenderTab3Content);

// Draw the tab panel in your render loop
tabPanel.Draw();

// Methods to render tab content
void RenderTab1Content()
{
 ImGui.Text("Tab 1 Content");

 // Mark tab as dirty when content changes
 if (ImGui.Button("Edit"))
 {
 tabPanel.MarkTabDirty(tab1Id);
 }

 // Mark tab as clean when content is saved
 if (ImGui.Button("Save"))
 {
 tabPanel.MarkTabClean(tab1Id);
 }
}

void RenderTab2Content()
{
 ImGui.Text("Tab 2 Content");
}

void RenderTab3Content()
{
 ImGui.Text("Tab 3 Content");
}

Icons

Icons can be used to display images with various alignment options and event delegates:

float iconWidthEms = 7.5f;
float iconWidthPx = ImGuiApp.EmsToPx(iconWidthEms);

// GetOrLoadTexture returns an ImGuiAppTextureInfo; use its TextureId
ImGuiAppTextureInfo texture = ImGuiApp.GetOrLoadTexture("icon.png");

ImGuiWidgets.Icon("Click Me", texture.TextureId, iconWidthPx, ImGuiWidgets.IconAlignment.Vertical, new ImGuiWidgets.IconOptions()
{
 OnClick = () => Console.WriteLine("You clicked")
});

ImGui.SameLine();
ImGuiWidgets.Icon("Double Click Me", texture.TextureId, iconWidthPx, ImGuiWidgets.IconAlignment.Vertical, new ImGuiWidgets.IconOptions()
{
 OnDoubleClick = () => Console.WriteLine("You clicked twice")
});

ImGui.SameLine();
ImGuiWidgets.Icon("Right Click Me", texture.TextureId, iconWidthPx, ImGuiWidgets.IconAlignment.Vertical, new ImGuiWidgets.IconOptions()
{
 OnContextMenu = () =>
 {
 ImGui.MenuItem("Context Menu Item 1");
 ImGui.MenuItem("Context Menu Item 2");
 ImGui.MenuItem("Context Menu Item 3");
 },
});

Grid

The grid layout allows you to display items in a flexible grid:

float iconSizeEms = 7.5f;
float iconSizePx = ImGuiApp.EmsToPx(iconSizeEms);

ImGuiAppTextureInfo texture = ImGuiApp.GetOrLoadTexture("icon.png");

// RowMajorGrid (or ColumnMajorGrid) takes an id, the items, a measure delegate, and a draw delegate
ImGuiWidgets.RowMajorGrid(
 "MyGrid",
 items,
 item => ImGuiWidgets.CalcIconSize(item, iconSizePx, ImGuiWidgets.IconAlignment.Vertical),
 (item, cellSize, itemSize) =>
 {
 ImGuiWidgets.Icon(item, texture.TextureId, iconSizePx, ImGuiWidgets.IconAlignment.Vertical);
 });

Color Indicator

The color indicator widget displays a color when enabled:

// color is a Hexa.NET.ImGui.ImColor (for example, from ktsu.ImGui.Styler's Color helpers)
ImColor color = Color.FromHex("#ff0000");
bool enabled = true;

ImGuiWidgets.ColorIndicator(color, enabled);

Image

The image widget allows you to display images with alignment options:

ImGuiAppTextureInfo texture = ImGuiApp.GetOrLoadTexture("image.png");

ImGuiWidgets.Image(texture.TextureId, new Vector2(100, 100));

Text

The text widget allows you to display text with alignment options:

ImGuiWidgets.Text("Hello, ImGuiWidgets!");
ImGuiWidgets.TextCentered("Hello, ImGuiWidgets!");
ImGuiWidgets.TextCenteredWithin("Hello, ImGuiWidgets!", new Vector2(100, 100));

Tree

The tree widget allows you to display hierarchical data:

using (var tree = new ImGuiWidgets.Tree())
{
 for (int i = 0; i < 5; i++)
 {
 using (tree.Child)
 {
 ImGui.Button($"Hello, Child {i}!");
 using (var subtree = new ImGuiWidgets.Tree())
 {
 using (subtree.Child)
 {
 ImGui.Button($"Hello, Grandchild!");
 }
 }
 }
 }
}

Scoped Id

The scoped ID utility class helps in creating scoped IDs for ImGui elements and ensuring they get popped appropriately:

using (new ImGuiWidgets.ScopedId())
{
 ImGui.Button("Hello, Scoped ID!");
}

Scoped Disable

Temporarily disable UI elements within a scope. Disabled elements are visually grayed out and non-interactive:

bool shouldDisable = true;

// Disable buttons within this scope
using (new ScopedDisable(shouldDisable))
{
 ImGui.Button("I'm disabled!");
 ImGui.InputText("Disabled Input", ref someText, 256);
}

// Elements outside the scope are enabled normally
ImGui.Button("I'm enabled!");

// Nested disables work as expected (per Dear ImGui rules)
using (new ScopedDisable(false))
{
 ImGui.Text("Enabled section");

 using (new ScopedDisable(true))
 {
 ImGui.Button("Disabled button");
 }
}

Note: As per Dear ImGui documentation, nested BeginDisabled calls cannot re-enable an already disabled section - a single BeginDisabled(true) in the stack is enough to keep everything disabled.

Combo

Type-safe combo box widgets for enums, strings, and strong strings:

// Enum combo box
enum Season { Spring, Summer, Fall, Winter }
Season selectedSeason = Season.Summer;

if (ImGuiWidgets.Combo("Season", ref selectedSeason))
{
 Console.WriteLine($"Selected: {selectedSeason}");
}

// String combo box
string selectedFruit = "Apple";
var fruits = new Collection<string> { "Apple", "Banana", "Cherry", "Date" };

if (ImGuiWidgets.Combo("Fruit", ref selectedFruit, fruits))
{
 Console.WriteLine($"Selected: {selectedFruit}");
}

// Strong string combo box (using ktsu.Semantics.Strings)
using ktsu.Semantics.Strings;

MyStrongString selected = new("Value1");
var options = new Collection<MyStrongString>
{
 new("Value1"),
 new("Value2"),
 new("Value3")
};

if (ImGuiWidgets.Combo("Option", ref selected, options))
{
 Console.WriteLine($"Selected: {selected}");
}

DividerContainer

Create resizable layouts with draggable dividers between content regions:

// Create a column-based divider container (side-by-side zones)
var dividerContainer = new ImGuiWidgets.DividerContainer(
 "MyContainer",
 ImGuiWidgets.DividerLayout.Columns
);

// Add zones with: id, initial size (relative weight), resizable, and a tick delegate (receives delta time)
dividerContainer.Add("Left Panel", 0.33f, true, dt =>
{
 ImGui.Text("Left side content");
 ImGui.Button("Left Button");
});

dividerContainer.Add("Right Panel", 0.67f, true, dt =>
{
 ImGui.Text("Right side content");
 ImGui.Button("Right Button");
});

// Tick the container each frame in your render loop
dividerContainer.Tick(deltaTime);

// For a stacked (top/bottom) layout, use DividerLayout.Rows:
var stackedContainer = new ImGuiWidgets.DividerContainer(
 "StackedContainer",
 ImGuiWidgets.DividerLayout.Rows
);

stackedContainer.Add("Top Panel", 0.5f, true, dt =>
{
 ImGui.Text("Top content");
});

stackedContainer.Add("Bottom Panel", 0.5f, true, dt =>
{
 ImGui.Text("Bottom content");
});

stackedContainer.Tick(deltaTime);

The dividers can be dragged by the user to resize the content regions dynamically.

Contributing

Contributions are welcome! For feature requests, bug reports, or questions, please open an issue on the GitHub repository. If you would like to contribute code, please open a pull request with your changes.

Acknowledgements

ImGuiWidgets is inspired by the following projects:

License

ImGuiWidgets is licensed under the MIT License. See for more information.

Product Versions Compatible and additional computed target framework versions.
.NET net8.0 net8.0 is compatible.  net8.0-android net8.0-android was computed.  net8.0-browser net8.0-browser was computed.  net8.0-ios net8.0-ios was computed.  net8.0-maccatalyst net8.0-maccatalyst was computed.  net8.0-macos net8.0-macos was computed.  net8.0-tvos net8.0-tvos was computed.  net8.0-windows net8.0-windows was computed.  net9.0 net9.0 is compatible.  net9.0-android net9.0-android was computed.  net9.0-browser net9.0-browser was computed.  net9.0-ios net9.0-ios was computed.  net9.0-maccatalyst net9.0-maccatalyst was computed.  net9.0-macos net9.0-macos was computed.  net9.0-tvos net9.0-tvos was computed.  net9.0-windows net9.0-windows was computed.  net10.0 net10.0 is compatible.  net10.0-android net10.0-android was computed.  net10.0-browser net10.0-browser was computed.  net10.0-ios net10.0-ios was computed.  net10.0-maccatalyst net10.0-maccatalyst was computed.  net10.0-macos net10.0-macos was computed.  net10.0-tvos net10.0-tvos was computed.  net10.0-windows 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

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.15.2 121 6/13/2026
2.15.1 110 6/13/2026
2.15.0 156 6/9/2026
2.14.3 134 6/8/2026
2.14.2 116 6/8/2026
2.14.1 122 6/8/2026
2.14.0 121 6/8/2026
2.13.3 121 6/7/2026
2.13.2 120 6/7/2026
2.13.1 127 6/7/2026
2.13.0 118 6/7/2026
2.12.0 128 6/7/2026
2.11.0 127 6/6/2026
2.10.0 123 6/6/2026
2.9.1 135 6/3/2026
2.9.0 231 6/2/2026
2.8.0 130 6/1/2026
2.7.0 128 6/1/2026
2.6.0 153 5/31/2026
2.5.0 147 5/29/2026
Loading failed

## v2.15.2 (patch)

Changes since v2.15.1:

- [patch] Fix FilesystemBrowser crash on open ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.15.1 (patch)

Changes since v2.15.0:

- ci: supply SixLabors.ImageSharp 4 license key via SIXLABORS_LICENSE_KEY ([@Claude](https://github.com/Claude))

## v2.15.0 (minor)

Changes since v2.14.0:

- Fix floating-point equality reliability issue in XYPad ([@Claude](https://github.com/Claude))
- Fix analyzer errors in embedded hosting and audio widgets ([@Claude](https://github.com/Claude))
- Add embedded-window hosting and audio widgets ([@Claude](https://github.com/Claude))
- feat(ios): curated ImGuiAppDemo.iOS showcase + simulator CI (Task 8, part 3) (#213) ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(ios): import ktsu.Semantics.Strings for string.As<AbsoluteFilePath> ([@Claude](https://github.com/Claude))
- feat(ios): public texture loading via the Metal backend (Task 8, part 2) ([@Claude](https://github.com/Claude))

## v2.14.3 (patch)

Changes since v2.14.2:

- Bump Polyfill from 10.8.0 to 10.8.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 3 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))

## v2.14.2 (patch)

Changes since v2.14.1:

- feat(ios): curated ImGuiAppDemo.iOS showcase + simulator CI (Task 8, part 3) (#213) ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.14.1 (patch)

Changes since v2.14.0:

- fix(ios): import ktsu.Semantics.Strings for string.As<AbsoluteFilePath> ([@Claude](https://github.com/Claude))
- feat(ios): public texture loading via the Metal backend (Task 8, part 2) ([@Claude](https://github.com/Claude))

## v2.14.0 (minor)

Changes since v2.13.0:

- feat(ios): AutoDiscoverExtensions flag (Task 8, part 1) (#211) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(ios): app menu (iPad) + Stop() semantics + no-op surface (Task 7) (#210) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(ios): font parity + imgui.ini redirect (Task 6) (#209) ([@matt-edmondson](https://github.com/matt-edmondson))
- ci: fix intermittent coverage broken-pipe flake (exit code 7) (#208) ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.13.3 (patch)

Changes since v2.13.2:

- feat(ios): app menu (iPad) + Stop() semantics + no-op surface (Task 7) (#210) ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.13.2 (patch)

Changes since v2.13.1:

- feat(ios): font parity + imgui.ini redirect (Task 6) (#209) ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.13.1 (patch)

Changes since v2.13.0:

- ci: fix intermittent coverage broken-pipe flake (exit code 7) (#208) ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.13.0 (minor)

Changes since v2.12.0:

- feat(ios): touch + keyboard input (Task 5) (#207) ([@matt-edmondson](https://github.com/matt-edmondson))

## v2.12.0 (minor)

Changes since v2.11.0:

- docs(ios): mark Task 4 (Metal renderer) complete in the port plan ([@Claude](https://github.com/Claude))
- chore(ios): remove renderer bring-up diagnostics ([@Claude](https://github.com/Claude))
- fix(ios): use TextUnformatted to avoid the variadic igText ARM64 crash ([@Claude](https://github.com/Claude))
- diag(ios): trace OnRender draw calls + log font atlas dims ([@Claude](https://github.com/Claude))
- diag(ios): trace the frame loop to localise the render SIGSEGV ([@Claude](https://github.com/Claude))
- fix(ios): use non-normalized UChar4 for the ImGui vertex colour ([@Claude](https://github.com/Claude))
- fix(ios): write cimgui.dylib to an absolute path (root cause) ([@Claude](https://github.com/Claude))
- fix(ios): stash cimgui.dylib in RUNNER_TEMP so the embed step finds it ([@Claude](https://github.com/Claude))
- fix(ios): copy cimgui.dylib into the .app and dlopen by bundle path ([@Claude](https://github.com/Claude))
- fix(ios): ship cimgui as an embedded dynamic library, dlopen it ([@Claude](https://github.com/Claude))
- diag(ios): inspect the app binary for cimgui link/export status ([@Claude](https://github.com/Claude))
- fix(ios): export dynamic symbols so dlsym resolves static cimgui ([@Claude](https://github.com/Claude))
- diag(ios): probe cimgui symbol resolution before first ImGui call ([@Claude](https://github.com/Claude))
- fix(ios): use ImGui.GetVersionS() for the smoke version probe ([@Claude](https://github.com/Claude))
- fix(ios): pin cimgui to a consistent 1.92.3 docking commit ([@Claude](https://github.com/Claude))
- feat(ios): statically link cimgui so ImGui runs on iOS ([@Claude](https://github.com/Claude))
- fix(ios): satisfy KTSU0003/CA2000 analyzers in the Metal backend ([@Claude](https://github.com/Claude))
- feat(ios): Metal renderer backend (Task 4) - stand up ImGui frames on iOS ([@Claude](https://github.com/Claude))
- wip(ios): begin Metal renderer (Task 4) - shader + frame-loop scaffolding ([@Claude](https://github.com/Claude))

## v2.11.0 (minor)

Changes since v2.10.0:

- ci(ios): iOS-simulator smoke test for the lifecycle (#205) ([@matt-edmondson](https://github.com/matt-edmondson))
- ci: re-trigger (flaky ForceDirectedLayout test-host abort) ([@Claude](https://github.com/Claude))
- test: drop redundant (nint) casts on int literals (IDE0004) ([@Claude](https://github.com/Claude))
- [minor] Make GPU texture handles nint end-to-end for the Metal backend ([@Claude](https://github.com/Claude))

## v2.10.0 (minor)

Changes since v2.9.0:

- iOS: satisfy analyzers/nullability in the UIKit lifecycle ([@Claude](https://github.com/Claude))
- docs: record resolved iOS-port design decisions ([@Claude](https://github.com/Claude))
- iOS: native UIKit lifecycle (UIApplicationDelegate + CADisplayLink) ([@Claude](https://github.com/Claude))
- ci: re-trigger workflow (flaky unrelated tests) ([@Claude](https://github.com/Claude))
- iOS: fix net10.0-ios compile errors from the config decoupling ([@Claude](https://github.com/Claude))
- iOS: make the config surface platform-neutral and align Start signature ([@Claude](https://github.com/Claude))

## v2.9.1 (patch)

Changes since v2.9.0:

- Bump Polyfill from 10.7.0 to 10.8.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))

## v2.9.0 (minor)

Changes since v2.8.0:

- Exclude ImGuiAppBlend.cs from the iOS build ([@Claude](https://github.com/Claude))
- Honor ImGui draw-command callbacks; add per-region blend modes ([@Claude](https://github.com/Claude))

## v2.8.0 (minor)

Changes since v2.7.0:

- Remap canvas and restore window on overlay enter/exit ([@Claude](https://github.com/Claude))

## 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))
- Refact... (truncated due to NuGet length limits)