All notable changes to Reactor will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning
once a 1.0.0 release is cut. While the project is pre-1.0 and labeled experimental,
the public API surface may change between releases without notice.
-
Docking content types & reserved document area (spec 046). Additive amendment to spec 045's
DockNodealgebra so apps can express the IDE-class document-area / tool-window-strip distinction:DockGroupRole({General,DocumentArea,ToolWindowStrip}) onDockTabGroup;[Flags] DockSidesmask onToolWindow.AllowedSides.Dock(content, Center)now prefersDocumentAreafor documents andToolWindowStripfor tool windows (falls back to any accepting group with aDockOperationLogdiagnostic). An emptyDocumentAreasurvives as a visible reserved well when it's the only one in the tree; empty split arms next to a non-empty sibling cull so split-drag residue collapses cleanly. Drag-drop overlay dims targets that reject the payload's category or violateAllowedSides;PinToSidevalidates against the mask. New publicDockLayoutOpsfaçade (InsertPaneAtTarget/RemovePane/MovePaneToTarget/FindContainer) for programmatic open/close that respects the new routing + cull rules. NewDockHostModel.Dock(content, DockTabGroup, target)overload for explicit group placement. JSON round-trip forroleandallowedSides, omitted at defaults; old layouts deserialize unchanged. Defaults (Role = General/AllowedSides = All) keep spec-045 behavior for layouts that don't opt in. Bug-fix swept three Scene-J regressions surfaced during manual review: splitter cursor tracking in 3+ child splits (pair extent now uses measured leading + trailing size, not the whole panel), open-doc- after-split losing the new doc (host invalidates the drag-modified shape override whenmanager.Layout's leaf-key set changes between renders), and close-non-last-in-split leaving an empty arm (refined prune rule above). -
Docking (spec 045). First-class window-docking surface under
Microsoft.UI.Reactor.Docking. Phase 1 shipped via a vendored WinUI.Dock renderer in theMicrosoft.UI.Reactor.Docking.Xamlpackage; Phase 2 replaces it with a Reactor-native renderer using the same public surface. Covers:Document/ToolWindowsealed records,DockSplit/DockTabGroup/DockableContentnode algebra, 15 cancellable lifecycle events onDockManager, layout-strategy hooks (IDockLayoutStrategy), tab tear-out and 9-target drop overlay, keyboard chords (Ctrl+PageUp/Down, Ctrl+F4/W close, Ctrl+Shift+M move, Ctrl+Tab navigator, Alt+F7 hidden-pane picker), per-tab pin, AOT-clean v2 JSON layout persistence with migration ladder, multi-display floating-window clamp, UIA live-region announcements, RTL + high-contrast theming, full localization routing, perf budgets, anddocking.list/docking.snapshot/docking.dockMCP tools. -
Keyed-list reconciliation & animation (spec 042). Templated
ListView/GridView/FlipView/LazyVStack/LazyHStacknow surface incremental WinUI deltas for keyed updates — only affected containers animate. NewIReactorKeyedidentity convention lets 2-arg overloads omit the key selector. AmbientAnimations.Animate(kind, () => setItems(...))propagates animation intent through inserts / moves / removes on both templated and hand-built keyed children (FlexColumnetc.). NewREACTOR_DSL_001codefix andReactorDiagnosticsdevtools dialog catch missing.WithKeyand duplicate-key bailouts. Closes microsoft-ui-reactor#198. -
Property & event API scrub (spec 039). Every callback property in the inventory now has a matching fluent extension (
OnClick→.Click(handler), ~60 callbacks). Named-style helpers (.AccentButton(),.SubtleButton(),.TextLink(), InfoBar.Informational()/.Success()/.Warning()/.Error()). Type-ramp factoriesTitle/Subtitle/Body/BodyStrong/BodyLarge.Card(child)theme-aware factory. New events:CalendarView.OnSelectedDatesChanged;Frame.OnNavigated/OnNavigating/OnNavigationFailed;ScrollView.OnViewChanged;WebView2.OnWebMessageReceived;MediaPlayerElement.OnMediaOpened/OnMediaEnded/OnMediaFailed;ContentDialog.OnOpened;Image.OnImageOpened/OnImageFailed;ComboBox.OnDropDownOpened/OnDropDownClosed; universal multi-selectOnSelectionChangedon list/grid surfaces. -
mur check— fast feedback with skill pointers (spec 038).mur checkis the build (same exit code asdotnet build) plus two enrichments: skill pointers for knownREACTOR_*IDs and did-you-mean→ try:suggestions for unknown identifiers. Three suggester tiers: Tier-1 analyzer-ID hints, Tier-2 Roslyn semantic suggester (CS1061 / CS0103 / CS0117 / CS1503 / CS7036), Tier-3 precision rules anchored on RoslynISymbolbinding (GridSizeFactoryParensRule,GridSizePxRenameRule,TextBlockStyleHintRule,ThemeBackgroundSuffixRule,AlignmentShortcutRule,ButtonOnClickFactoryMoveRule). Workflow modes: default iteration mode suppresses cosmetic noise;mur check --finalis an optional pre-merge sweep;--strict,--quiet, andmur check -- <msbuild-args>passthrough also supported.--trace <path>writes JSONL diagnostic rows;MUR_TELEMETRY=1opt-in logs per-suggestion telemetry locally. Validated end-to-end across multi-arm EC1/EC2/EC3 evals. -
Multi-window, tray, and shell integration (spec 036). First-class
ReactorWindowandReactorTrayIconas peers, withReactorApp.OpenWindow/OpenTrayIcon/Windows/TrayIcons/FindWindow/WindowOpened/WindowClosed/TrayIconOpened/TrayIconClosed/Exit/ShutdownPolicy. Per-window DPI awareness via WM_DPICHANGED / WM_GETMINMAXINFO. Window lifecycle events (Activated,SizeChanged,StateChanged,Closing,Closed) with cancellableUseClosingGuard. New hooks:UseDpi,UseWindowSize,UseBreakpoint,UseWindow,UseWindowState,UseIsActive,UseOpenWindow,UseTrayIcon. Per-windowWindowPersistedScope. PluggableIWindowPersistenceStore(packaged + JSON fallback). Owned windows (WindowSpec.Owner),TaskbarProgress,TaskbarOverlay, thumbnail toolbars,JumpList,LaunchActivationparsing for File / Protocol / Toast activations. Devtoolswindows.list/windows.activate/windows.close/windows.openMCP tools. -
Element allocation reduction (spec 034). Bucketed
ElementModifiers(~−11% bytes/tick on the 4,900-cell stress grid), direct-record-initializer idiom for inner cell loops (~−60% bytes/cell), andUseMemoCells/UseMemoCellsByKey/UseMemoCellsByIndexcell-level memoization withREACTOR_HOOKS_007analyzer + codefix. ReactorOptimized at 10% mutation reaches 17.1 Effective Refresh/s — within noise of DirectX (17.2) and WPF (17.9) on the stocks-grid bench. -
XAML/WinUI interop response (spec 033). New
GridSizevalue type withAuto/Star(weight)/Px(pixels)smart constructors and invariant-cultureParse. NewIPersistedStateScopeinterface withPersistedScope.Window/PersistedScope.Applicationand LRU-backed scopes with memory-pressure trimming.RenderEachTime(...)andMemo(...)factories replace the soft-deprecatedFunc(...).ElementRef<T>typed-ref wrapper +UseElementRef<T>()hook..Backdrop(BackdropKind)modifier for declarative Mica / Acrylic.Expr(Func<Element?>)factory for inline block-expression bodies.
-
.Margin(double, double)and.Padding(double, double)parameter order swapped from(horizontal, vertical)to(vertical, horizontal)to match CSS shorthand convention. Use the named-arg form (.Margin(horizontal: 16, vertical: 8)) for layout-stable call sites. (spec 038 §3) -
ScrollView()factory now mounts the modernMicrosoft.UI.Xaml.Controls.ScrollView(anchor ratios,ContentOrientation, theScrolling*enum surface). The legacyMicrosoft.UI.Xaml.Controls.ScrollViewermapping moved to a newScrollViewer()factory. Element records follow the same rename. (Issue #348) -
TextField(...)removed. The deprecated forwarding alias was retired after theTextFieldElement→TextBoxElementrename. UseTextBox(...).
-
Microsoft.UI.Reactor.Factories.Grid(string[], string[], …)— use the strongly-typedGrid(GridSize[], GridSize[], …)overload withGridSize.Auto/GridSize.Star(weight)/GridSize.Px(pixels). Slated for removal in the next minor release. (spec 033 §1) -
Microsoft.UI.Reactor.Factories.Func(Func<RenderContext, Element>)— replace withMemo(ctx => …)(render once + state changes) orRenderEachTime(ctx => …)(always re-render). Slated for removal in the next minor release. (spec 033 §4) -
Microsoft.UI.Reactor.Factories.RichText(...)renamed toRichTextBlock(...)for parity with WinUI'sRichTextBlock(record was alreadyRichTextBlockElement). Old name preserved as an[Obsolete]alias for one release. (spec 039 §1.3) -
IDockBehaviorandDockManager.Behavior(spec 045 Phase 1) marked[Obsolete]with migration pointers to the per-event Action props that landed in Phase 2 (OnContentDocked/OnContentFloating/OnContentFloated). Slated for removal one release after Phase 2 ships. (spec 045 §2.12)
Microsoft.UI.Reactor.Factories.ProgressBar(double)/ProgressBar()added as[Obsolete]aliases forProgress(double)/ProgressIndeterminate(). Reactor'sProgressreconciles to WinUI'sProgressBar; the alias helps agents reaching for the WinUI name discover it. (spec 039 §5)
ReactorHost.MainDispatcherQueue(internal static, first-host-wins capture). Cross-thread setState marshalling and AutoSuggest'sRaiseStateChangednow route throughReactorApp.UIDispatcher. (spec 036 §4.3)