feat(ui): port retail appraisal panel

Preserve retail's one-pending-appraisal busy lifetime, parse the complete gated response, and mount the authored examination layout in the shared main-panel host. Keep known 3D preview and inscription-write gaps explicit in AP-110.
This commit is contained in:
Erik 2026-07-23 11:34:08 +02:00
parent 6b1ae4fb76
commit 643cdfe66e
24 changed files with 17132 additions and 40 deletions

View file

@ -68,6 +68,29 @@ public sealed class RetailFixtureConformanceTests
Assert.NotNull(Find(root, CharacterStatController.TitlesPageId));
}
[Fact]
public void ExaminationFixture_ContainsRetailChromeSubviewsAndScrollbars()
{
ElementInfo root = FixtureLoader.LoadExaminationInfos();
Assert.Equal(AppraisalUiController.RootId, root.Id);
Assert.Equal(310f, root.Width);
Assert.Equal(400f, root.Height);
Assert.NotNull(Find(root, AppraisalUiController.CloseId));
Assert.NotNull(Find(root, AppraisalUiController.TitleId));
Assert.NotNull(Find(root, AppraisalUiController.ItemPanelId));
Assert.NotNull(Find(root, AppraisalUiController.ItemTextId));
Assert.NotNull(Find(root, AppraisalUiController.ItemScrollbarId));
Assert.NotNull(Find(root, AppraisalUiController.CreaturePanelId));
Assert.NotNull(Find(root, AppraisalUiController.SpellPanelId));
ImportedLayout layout = FixtureLoader.LoadExamination();
Assert.IsType<UiButton>(layout.FindElement(AppraisalUiController.CloseId));
Assert.IsType<UiText>(layout.FindElement(AppraisalUiController.TitleId));
Assert.IsType<UiScrollbar>(
layout.FindElement(AppraisalUiController.ItemScrollbarId));
}
public static TheoryData<Func<ElementInfo>, uint, uint, float, float, int> LayoutCases
=> new()
{