Release August 2, 2026
Gum Release — August 2, 2026
Breaking Changes
GraphicalUiElement.GetAbsoluteWidth()/GetAbsoluteHeight()are renamed to theAbsoluteWidth/AbsoluteHeightproperties, matching the existingAbsoluteLeft/Top/Right/Bottom. This is just an[Obsolete]warning, nothing breaks. (#4016)
For more information, see the upgrade guide: https://docs.flatredball.com/gum/gum-tool/upgrading/migrating-to-2026-august
Biggest Changes
New JSON Project File Format
Gum projects can now be saved as JSON (.gumj/.gusj/.gucj/.gutj/.behj/.ganj) alongside the existing XML format, via a new Content → Convert to JSON… menu action or gumcli convert-to-json. See https://docs.flatredball.com/gum/gum-tool/project-files
Continued GC Allocation Reduction Across the Runtime
This release continues a systematic pass at cutting per-frame garbage-collector allocations: text word-wrap/layout, full text relayout, idle Forms UI updates, data-binding property-change notifications, text render-target rebuilds (down to zero, plus an always-allocated unused 16MB buffer removed entirely), stacked-layout relayout, sprite-sheet/state-keyframe animation playback, adding/removing child elements at runtime, and render draw-list building. Lower GC pressure means fewer/smaller GC pauses, which matters most for UIs with lots of text, animation, or frequent layout changes.
New ColorPicker Forms Control
Added a ColorPicker Forms control — a saturation/value square plus a hue bar, drag to pick a color, SelectedColorChanged event. Available on MonoGame/KNI/FNA at first; raylib and Skia catch up this release with their own default visuals. See https://docs.flatredball.com/gum/code/controls/colorpicker
Variable References Get More Powerful
Variable References (a variable whose value is an expression referencing another object) pick up three upgrades: they can now resolve an object's true resolved position/size (AbsoluteX/Y/Left/Top/Right/Bottom/Width/Height) instead of only raw authored units, enabling CSS-style relative sizing regardless of how the target's own size is expressed; composite references (e.g. Color = Other.Color) can now cross differently-named properties (e.g. DropshadowColor = Source.FillColor); and a global::Localization.CurrentLanguage identifier lets a property switch directly off the current language (e.g. picking a CJK font) with no custom code, reflected live in the tool's Language preview.
Gum Tool
- New JSON project file format — see Biggest Changes. (#4171, #4178, #4184, #4181)
- Import HTML (experimental preview): a new Import HTML feature (Content → Import HTML…) converts a web page into a Gum project via a Node/Playwright-based converter (thanks @devinguthrie for the original plugin). This release adds importing from a remote URL with a choosable destination subfolder, ~4x faster conversion by reusing the built Gum CLI instead of rebuilding it every time, correct handling of CSS
oklch()colors and SVG images, and fixes for multi-line text wrapping, flexbox child margins, and mixed bold/plain text alignment. (#4002 (thanks @devinguthrie), #4004, #4007, #4009, #4011, #4012, #4013) - Corner radius fields (top-left/top-right/bottom-left/bottom-right) now support click-and-drag scrubbing, matching the uniform Corner Radius field; fixed a stale green "default value" tint; clamped to a minimum of 0. (#4008)
- Fixed the Variables panel letting StrokeWidth be dragged or typed below zero; clamped to a minimum of 0. (#3990)
- Fixed KernSmith-generated fonts with a large dropshadow splitting across multiple texture pages instead of fitting on one. (#4023)
- Fixed code generation wrongly falling back to the obsolete pre-2026 GueDeriving API for NuGet-referenced Gum runtime projects using the
<PackageReference><Version>XML form, or where the runtime's version metadata lived in a separate referenced package. (#4086) - Added Gum.SilkNet to the Code tab's Output Library picker. (#4114)
- Fixed NineSlice Red/Green/Blue color changes silently not applying in the tool's live wireframe view. (#4076)
- Fixed the Gum tool dropping behind other windows (e.g. Visual Studio) after generating a font. (#4081)
- Fixed a crash selecting or drag+dropping a polygon in single-file-published builds of the tool. (#4066)
- Fixed the Alignment tab and Add Variable button staying stale after right-click > Add Object on an already-selected Screen. (#4069)
- Fixed unreadable (white-on-yellow/pink) text in the state-editing and custom/animated-state banners in dark mode. (#4073)
- Fixed the Variables tab color swatch showing solid gray instead of the resolved color for a color driven by a Variable Reference. (#4074)
- Bubblegum Forms theme's shared styling/component files are now namespaced, so importing a second Forms theme no longer overwrites Bubblegum's colors/styles; all Bubblegum controls now consistently pull from the shared Styles object. (#4064)
- Fixed the Bubblegum theme's bundled fonts (e.g. Nunito) silently failing to load and falling back to the default font. (#4143)
- Added the Hazard theme to Add Forms. (#4136)
- Fixed a faint seam where SliderThumb/RadioButton circle fill and border edges met, across all bundled themes (code and Add-Forms-imported). (#4147, #4150)
- Fixed localization editing bugs: duplicate
(loc)suffixes on repeated edits, the Language dropdown having no visible effect, a crash on CSV files with fewer language columns than expected, a CSV off-by-one that misaligned languages to their columns, and "Show Localization" off not reverting to the literal string ID. (#4052) - You can now drag search results from the Project window's search box directly onto the Wireframe view to create an instance. (#4131)
- Fixed Ctrl+=/Ctrl+- zooming the app's font size instead of the wireframe/texture-coordinate canvas when one of those was focused. (#4226)
- Fixed clicking a tree-view item's expand/collapse arrow also changing the selection. (#4230)
- Load Recent now shows the file extension (.gumx vs .gumj) so same-named projects are distinguishable. (#4232)
- Importing many elements via Forms/gumx import no longer rebuilds the tree view once per element — noticeably faster on large imports. (#4234)
- Fixed the Textures tab's selection rectangle always snapping to the grid for display even when not being dragged, and fixed moving a selection also snapping its size (or vice versa). (#4215)
- Fixed the wireframe editor's middle-mouse pan sometimes jumping the camera a large, wrong distance; fixed fractional camera position drift while panning/scrolling. (#4218)
- Fixed Undo/Redo and other app-wide hotkeys not working while the Textures tab's coordinate selector had focus. (#4220)
- Sped up project load for larger projects: removed a duplicate full project file-scan that ran twice on load, and fixed an internal element-lookup cache that was disabled during file-watch/font-generation scans. (#4250, #4253)
- Fixed slow project/screen loads when a font reference was broken (missing .ttf, unresolvable system font) — failures are now cached for 30 seconds instead of retried and re-logged per instance. (#4256)
- Fixed a spurious "Error trying to watch ...FontCache" message on a fresh project before any font had been generated; clearing the font cache now deletes only the folder's contents instead of the folder itself. (#4262)
- Added an "Open Settings Folder" item under Help to open the global settings folder directly in Explorer. (#4263)
- The STANDARDS chip palette now lists element types alphabetically, matching the classic Standard tree folder. (#4265)
- Font-generation summary now says fonts are "already up to date" instead of always claiming fonts were created. (#4268)
- Fixed the previously-selected instance staying highlighted in the tree view after editing a Standard's defaults from the palette. (#4269)
gumcli fonts/gumcli packnow correctly bundle and resolve fonts referenced only through the untaken branch of a conditional (ternary/locale-style) Font variable reference. (#4043)gumcli screenshothas a new--backgroundoption to render against an opaque backdrop instead of transparent; fixed non-fully-opaque alpha in--backgroundexports. (#4206)- Fixed building Gum from source outside Visual Studio (JetBrains Rider,
dotnet build, or CI without the VS CodeSharing workload) crashing with an MSBuild exception. (thanks @ultimateownsz) (#4051)
Gum Runtimes
- Continued GC allocation reduction across the runtime — see Biggest Changes. (#3977, #3978, #3980, #3981, #3982, #3983, #3984, #4192, #4202)
- Variable References get more powerful — see Biggest Changes. (#4017, #4151, #4167, #4048)
- Added
AbsoluteWidth/AbsoluteHeightproperties toGraphicalUiElement— see Breaking Changes. (#4016) - Fixed several crashes and silently no-op'ing behavior in trimmed/self-contained (
PublishTrimmed) builds across MonoGameGum, KniGum, FnaGum, RaylibGum, and SkiaGum: project loading, Behavior-declared Forms properties, andGumServiceinitialization on MonoGame/KNI. Added a lambda-expressionSetBindingoverload onGraphicalUiElement(plus a build-time trim-safety warning for string-path bindings) as a safer alternative to string-based binding paths. (#4113, #4117, #4119, #4106, #4122) - SkiaGum now supports render targets (an
IsRenderTargetcontainer bakes its subtree to an offscreen surface, matching MonoGame/raylib) and post-process shaders on render targets; two new inline BBCode tags,[font=Name]for per-run font swaps and[OutlineThickness=N]for per-run text outlines; a fix for text outlines never rendering at all (OutlineColorsecretly defaulted to transparent); and Sprite, NineSlice, Container, and Polygon properties now correctly apply when set via Gum states or data binding instead of only direct code assignment. (#3991, #3997, #3999, #4038, #4075, #4083, #4107, #4108, #4109, #4110) - Text now supports Has Dropshadow in the Variables panel (works with both the built-in font generator and KernSmith); drop shadows render in their own independent color instead of being tinted by the text's color (MonoGame/KNI/FNA); a
[HasDropshadow=true/false]BBCode tag toggles a run's shadow independently;LocalizeTextexcludes a specific Text instance from translation; and a crash rendering bitmap fonts with a too-small or space-less character table is fixed. (#4018, #4056, #4058, #4103, #4134, #4260) - New
ColorPickerForms control — see Biggest Changes. (#4055, #4245) - Gamepad/spatial navigation: Gum.SilkNet gained gamepad-driven Forms navigation; containers can opt into spatial (any-angle) gamepad/stick focus navigation via
GamepadNavigationModeas an alternative to tab order;AnalogStick.RadialPushedRepeatRate()adds a direction-agnostic push/hold-repeat query;Slider.ValueChangedByUiand Forms Buttons'Pushevent now correctly fire for keyboard/gamepad activation, not just mouse. (#4039, #4132, #4130, #4127, #4197) - Visual-quality fixes across shapes and text: dashed circle/rectangle/arc stroke bugs and thin fill/stroke seams on raylib and Skia, a gradient-fill-plus-stroke bug, raylib text drop shadows not rendering at all, KernSmith drop shadows silently dropped on MonoGame/raylib, Dropshadow properties being ignored when set via Variable References/animations/the wireframe preview, and RaylibGum blend-mode render targets rendering too transparent. (#4025, #4026, #4030, #4031, #4032, #4060, #4065, #4187, #4210)
- Apos.Shapes bumped to 0.7.8 — MonoGame/KNI shape rendering no longer needs the Content Pipeline
.xnbworkaround. (#4021) - Added
AnimationController.PlayAnimationAsyncto await an animation finishing instead of polling or subscribing to an event. (#4046) - Named events authored on a Gum animation timeline now actually fire at runtime via
AnimationController.NamedEventOccurred. (#4054) - Added
HitTestTransformMatrixfor correct cursor hit-testing against UI drawn into an externally-managed, scaled render target. See https://docs.flatredball.com/gum/code/events-and-interactivity/mouse-and-touch-screen-cursor#several-coordinate-spaces-at-once-hittesttransformmatrix (#4098) - Fixed a crash pasting text into a Forms TextBox whose Text was null. (#4101)
- Fixed a
TwoWay-bound TextBox losing a just-typed edit when switching selection (e.g. a different row in a master-detail list) before a realLostFocusfired. (#4140) - Fixed a multi-line TextBox scroll bug that could put the caret in the wrong place and make text disappear, on both MonoGame/KNI/FNA and raylib. (#4152)
- Fixed several raylib rendering-walk bugs: clipped elements drawing outside their own clip region, non-
GraphicalUiElementchildren failing to render, invisible top-level elements not being skipped; and Rectangle/Circle appearance properties not applying when set via states or data binding on raylib. (#4159, #4177) - Fixed Menu popups not closing on an outside click when the Menu is drawn manually via
GumBatchinstead of added throughAddToRoot/AddToManagers. (#4162) - Fixed a crash rendering to a render target on the first frame when the target contained clipped content; render-target baking now culls off-screen content when a clip is active. (#4189)
- Fixed
MinAlpha-masked render target content bleeding past its clip bounds instead of being fully masked out. (#4095) - Fixed Android: TextBox always falling back to the modal on-screen-keyboard dialog instead of the inline soft keyboard; the on-screen keyboard not dismissing when a TextBox lost focus. (#4242, #4248)
Tutorials and Templates
- Fixed new NineSlice/Sprite/Text instances added to a project after using "Add Forms" silently inheriting unrelated baked-in theme defaults instead of normal blank defaults. (#4097)
- Fixed the Gum.SilkNet sample solution's Forms screen to match the MonoGameGumInCode sample's default styling. (#3967)
- Fixed the Bubblegum theme's bundled Nunito font failing to load (referenced without the
Fonts/path segment), and fixed font generation not recognizing a bundled.ttfreferenced by a nested Text instance inside a themed component. (#4257)
What's Changed
- Clear tree-view selection when editing a standard's defaults (#4269)
- Report accurate font-generation summary when fonts are cache hits (#4268)
- Sort STANDARDS palette chips alphabetically (#4265)
- Add Help menu item to open the global settings folder (#4263)
- Ensure FontCache/ always exists and clear-font-cache preserves the folder (#4262)
- Fix BitmapFont's space-character fallback throwing IndexOutOfRangeException (#4260)
- Fix Bubblegum theme's bundled Nunito Font values to include Fonts/ path segment (#4257)
- Fix ObjectFinder.GetElementSave to consult fallback standard elements on cache miss (#4258)
- Cache failed font generation attempts to avoid retry storms (#4256)
- Enable ObjectFinder's element cache during ProjectLoad's dependency walk/font collection (#4253)
- Drop two obsoleted Android keyboard APIs (CA1422) (#4248)
- Diagnostics + fix: remove duplicate ProjectLoad file-watch scan (#4250)
- Extract the shared PixelDataTextureApplier pool bookkeeping into GumCommon (#4249)
- Enable the V3 ColorPicker default visual on raylib and Skia (#4245)
- Dispatch the inline soft keyboard at runtime instead of #if ANDROID (#4242)
- Remove dead FRB/platform #if branches from FormsUtilities and RangeBase (#4239)
- Decouple GumFormsPlugin's postbuild from Gum.Cli's MonoGame/Raylib backends (#4237)
- Coalesce per-element tree refresh during batch import (#4234)
- Port the element tree view from WinForms to a native WPF TreeView (#4230)
- Include file extension in Load Recent display name (#4232)
- Delete the unused WinForms render/input path (#4229)
- Gate LocalizeText behind a new GumxVersions v4 slot (#4225)
- Make the texture-coordinate canvas WPF-native, dropping its WindowsFormsHost (#4226)
- Register file-watch ignores before writing Convert to JSON output (#4221)
- Forward app-wide hotkeys (Undo/Redo) from the Texture Coordinate selector (#4220)
- Fix Textures tab grid snapping: don't snap display, split move/resize commit (#4215)
- Fix middle-mouse pan snap and scrollbar camera-position truncation (#4218)
- Collapse Red/Green/Blue VariableReferences triples in FormsTemplate (Standard) (#4214)
- Graduate CullOffscreenWhenClipped from experimental status (#4213)
- Document that Click, not Push, is the primary button activation event (#4212)
- Docs: add raylib render-target compositing guidance, split into its own page (#4209)
- Route RaylibGum's Normal/Additive blend through premultiply-consistent factors during a bake (#4210)
- Resolve the two remaining Bucket D test projects (#4208)
- Pin SourceFile preservation when an instance's BaseType changes (#4207)
- gumcli screenshot --background, gum-raylib-rendering skill, ui-decoupling-plan status (#4206)
- Pool BatchKeyGroupedOrderer's per-call scratch buffers (#4202)
- Fix ButtonBase: raise Push alongside Click on keyboard/gamepad activation (#4197)
- Stop the draw-list build allocating per frame, and run MonoGameGum.IntegrationTests in CI (#4192)
- Migrate both backends' render-target bake onto the shared orderer subtree entry point (#4189)
- Collapse cross-named color VariableReferences in Bubblegum and Hazard (#4188)
- Wire Dropshadow* into CustomSetPropertyOnRenderable for Rectangle/Circle (#4187)
- Add Gum.ImageDiff to Gum.sln/GumFull.sln to fix NU1105 (#4186)
- Recognize .gumj/.gucj/etc. JSON project files at tool-side entry points (#4184)
- Widen NativeAotSmoke.Harness to load a real JSON project under PublishAot=true (#4181)
- Add Convert to JSON tool action and gumcli command (#4178)
- Add JSON project file format (AOT-safe alternative to XML) (#4171)
- Host the wireframe canvas natively in WPF, dropping WindowsFormsHost (#4166)
- Migrate raylib's main render walk onto the shared HierarchicalOrderer (steps 1-3) (#4165)
- Support cross-named composite VariableReferences (e.g. DropshadowColor = X.FillColor) (#4167)
- Extract shared GraphicsDevice ownership out of GraphicsDeviceControl (#4163)
- Add HitTestTransformMatrix sample to RenderTarget screen (#4162)
- Add raylib off-screen-cull/clip-walk conformance tests; fix 3 divergences from HierarchicalOrderer (#4159)
- Decouple wireframe scroll bar logic from WinForms; add WPF-native scroll bar (#4156)
- Collapse matching Red/Green/Blue VariableReferences to Color/FillColor/StrokeColor (#4157)
- Fix off-screen cull skipping scrolled multi-line TextBox text (#4152)
- Keep composite variable references (Color = X.Color) collapsed on disk (#4151)
- Clarify that check-references --fix replaces manual reference propagation (#4148)
- Merge fill+border circles onto one CircleRuntime in Add Forms theme content (#4150)
- Merge fill+border circles onto one CircleRuntime in code themes (#4147)
- Port Hazard theme to Add Forms tool content (#4136)
- Fix Bubblegum theme fonts: reference bundled .ttf filenames, not family names (#4143)
- Fix flaky TextRuntimeBbCodeHasDropshadowTagTests via RaylibGum.Tests font cache leak (#4145)
- Flush pending LostFocus-triggered edit before a binding source swap (#4140)
- Add TextRuntime.LocalizeText: per-instance opt-out from translation (#4134)
- Spatial (any-angle) gamepad/stick focus navigation (#4132)
- Support drag-and-drop from Project window search results onto the Wireframe view (#4131)
- Add direction-agnostic RadialPushedRepeatRate to AnalogStick (#4130)
- Raise Slider.ValueChangedByUi for keyboard and gamepad input (#4127)
- Annotate MVVM binding reflection with RequiresUnreferencedCode; add GUE lambda SetBinding (#4122)
- Fix per-control tab tutorial sample: missing UseKeyboardDefaults() (#4125)
- Audit and fix remaining trim-unsafe reflection sites (#4119)
- Fix Behavior FormsProperty silently failing under PublishTrimmed (#4117)
- Add OutputLibrary.Silk to codegen for Gum.SilkNet (#4114)
- Fix PublishTrimmed crash on GumProjectSave.Load (#4113)
- Redispatch Skia NineSlice through NineSliceRuntime (ADR 0011) (#4108)
- Guard reflection-based runtime type registration against AOT metadata trimming (#4106)
- Redispatch Skia Polygon through PolygonRuntime (ADR 0011) (#4110)
- Redispatch Skia Container through ContainerRuntime (ADR 0011) (#4109)
- Redispatch Skia Sprite through SpriteRuntime (ADR 0011) (#4107)
- Add [HasDropshadow] BBCode tag for per-run shadow toggling (#4103)
- Fix NRE when pasting into a TextBox whose Text is null (#4101)
- Add per-element hit-test transform for externally-scaled render targets (#4098)
- Materialize baked Standard-theme visual defaults onto FormsTemplate instances (#4097)
- Fix MinAlpha-masked render-target content leaking past its clip bounds (#4095)
- Converge Text/TextNoTranslate SetProperty dispatch onto TextRuntime (core+Raylib) (#4094)
- Migrate Standard theme off StyleCategory, clean up stale Standards drift (#4093)
- Reconcile TrySetPropertyOnText's Text wrapper with TextRuntime.Text's (#4087)
- Migrate Standard theme off ColorCategoryState, remove dead ColorCategory (#4090)
- Fix syntax-version detection for nested PackageReference form (#4086)
- Fix TextRuntime.OutlineColor defaulting to transparent, hiding SkiaGum halo (#4083)
- Restore Gum window focus after external font generation (#4081)
- Fix BehaviorSave compact round trip drift (#4082)
- Share generic Forms behaviors between themes via BehaviorReference.SourcePath (#4076)
- SkiaGum text: add [OutlineThickness] BBCode tag, unify onto RichTextKit halo (#4075)
- Fix color swatch showing gray when read-only via VariableReferences (#4074)
- Fix unreadable state-editing banner text in dark mode (#4073)
- Bubblegum theme: theme-specific styling object, full control coverage, per-theme namespacing (#4064)
- Fix Alignment tab and Add Variable button not refreshing after Add Object auto-select (#4069)
- Attach KernSmith shadow variant to in-memory fonts (#4065)
- Vendor patched Topten.RichTextKit to fix halo outline spiking (#4068)
- Fix NRE in AddPointSpriteVisual on single-file-published Gum.exe (#4066)
- Raylib runtime two-pass dropshadow draw (#4060)
- Remove dead AtlasedTexture/Atlas code from Gum core (#4059)
- Drop shadow: KernSmith 0.18.1 (white silhouette) + tool blur floor (#4058)
- Independent drop-shadow color via two-pass runtime draw (#4056)
- Add ColorPicker Forms control with saturation/value + hue picker (#4055)
- Guard VS-only CodeSharing imports in GumCoreShared.shproj with Exists() (#4051) (thanks @ultimateownsz)
- Raise named animation events at runtime (#4054)
- Resolve global::Localization.CurrentLanguage in variable-reference expressions (#4048)
- Fix Text localization double/triple-translating on edit (#4052)
- Add PlayAnimationAsync to AnimationController (#4046)
- Pregenerate every branch of a conditional Font-affecting VariableReferences expression (#4043)
- Gum.SilkNet: implement gamepad input for Forms navigation via Silk.NET.Input (#4039)
- SkiaGum text: support [font] BBCode tag (#4038)
- Declare FRB-only IXRuntime interfaces and unify Sprite/NineSlice/Container/Polygon dispatch (#4036)
- Redispatch Polygon Alpha/Red/Green/Blue/Color through PolygonRuntime (#4035)
- Converge Container Alpha/IsRenderTarget dispatch onto ContainerRuntime (#4034)
- Converge NineSlice dispatch onto NineSliceRuntime (Blend/Color/RGB/BorderScale/Tiling/FrameWidth) (#4033)
- Fix raylib LineCircle fill/stroke seam on solid strokes (#4032)
- Fix Skia CircleRuntime fill/stroke seam on thick strokes (#4031)
- Unify RectanglesScreen.cs across MonoGame/raylib/SilkNet samples (#4030)
- Unify CirclesScreen.cs across MonoGame/raylib/SilkNet samples (#4026)
- Use Apos.Shapes' native DashStyle API for dashed shape strokes (#4025)
- KernSmith: use AutofitTexture instead of Gum's bmfont.exe-oriented size heuristic (#4023)
- Bump Apos.Shapes/Apos.Shapes.KNI to 0.7.8, drop precompiled-xnb workaround (#4021)
- Expose Text HasDropshadow in the Gum tool (#4018)
- Variable references: resolve AbsoluteX/Y/Left/Top/Right/Bottom/Width/Height (#4017)
- HtmlToGum: invoke prebuilt gumcli.dll directly instead of dotnet run (#4013)
- HtmlToGum: pin geeksforgeeks.org repro fixture for header-duplication bug (#4012)
- Add AbsoluteWidth/AbsoluteHeight properties, obsolete GetAbsoluteWidth/GetAbsoluteHeight (#4016)
- HtmlToGum: iterative visual-fidelity fixes (autonomous session) (#4011)
- Fix Rectangle/Circle IsFilled and Fill*/Stroke*/Blend not applying from saved projects (#4010)
- HtmlToGum: fix oklch() colors and SVG images vanishing (#4009)
- HtmlToGum: support remote URL source and destination subfolder on import (#4007)
- Add drag-to-scrub to individual corner radius fields (#4008)
- Add HtmlToGum Import HTML plugin under Tool/ (#4002) (thanks @devinguthrie)
- HtmlToGum: bootstrap output project via gumcli new, not a static Standards snapshot (#4004)
- Unify RT shader sample screens across MonoGame/raylib/Skia (#4000)
- Add Skia render-target post-process shader support (#3999)
- Add additive-blend support for SkiaGum render-target containers (#3997)
- Unify InMemoryFontCreator property declaration via type alias (#3996)
- Extract shared BmfcSave builder for inline BBCode font runs (#3995)
- Remove color-conversion #if from Sprite/Text/NineSlice runtimes (#3994)
- Move IRenderTargetTextureReferencer to GumCommon; unify RT-sprite detection (#3993)
- Add render-target support to SkiaGum; unify RenderTargetScreen sample (#3991)
- Clamp StrokeWidth to a minimum of 0 in the variable grid (#3990)
- Converge XNA render-target sprites onto raylib's pull model (#3987)
- Eliminate add/remove-child churn allocations (#3984)
- Eliminate per-frame LINQ closures in AnimationChain playback (#3983)
- Eliminate per-frame boxed enumerator in stacked-layout relayout (#3982)
- Pool per-realization width buffer in BitmapFont; remove dead ImageData render path (#3981)
- Reduce per-notification binding allocations (#3980)
- Tighten comments in #1934 text-wrap change; add code-comment style rule (#3979)
- Halve idle-frame Update allocations (128->64 B/f) (#3978)
- Eliminate per-frame Text layout allocations in the wrapping/measure path (#3977)
- Add ListBox scroll allocation regression guard (#3975)
- Make SilkNetGumSample's Forms screen match MonoGameGumInCode (#3967)
Full Changelog: Release_July_22_2026...Release_August_02_2026


