feat(studio): #156 #157 mockup desktop and font resolver

Create AGENTS.md as a thin bridge to CLAUDE.md, fix isolated dat-layout previews by normalizing panel roots to the studio canvas, add a --mockup mode that mounts production-backed UI windows into one UiHost, and thread the per-element dat-font resolver through GameWindow's live imports.

Verified with dotnet test and headless studio screenshots for inventory and the mockup desktop.
This commit is contained in:
Erik 2026-06-26 12:56:05 +02:00
parent ca94b479bf
commit 9444a328fa
8 changed files with 405 additions and 44 deletions

View file

@ -11,7 +11,8 @@ public sealed record StudioOptions(
string? MarkupPath,
string? DumpSlug = null,
string? DumpFile = null,
string? ScreenshotPath = null)
string? ScreenshotPath = null,
bool Mockup = false)
{
/// <summary>
/// Parse studio options from the args that come AFTER the <c>ui-studio</c> token.
@ -39,6 +40,7 @@ public sealed record StudioOptions(
string? dumpSlug = null;
string? dumpFile = null;
string? screenshotPath = null;
bool mockup = false;
for (int i = 0; i < args.Length; i++)
{
@ -67,6 +69,10 @@ public sealed record StudioOptions(
{
screenshotPath = args[++i];
}
else if (args[i] == "--mockup")
{
mockup = true;
}
else if (!args[i].StartsWith('-'))
{
datDir ??= args[i];
@ -81,10 +87,10 @@ public sealed record StudioOptions(
"ui-studio: dat directory required — pass as first arg or set ACDREAM_DAT_DIR.");
// Default layout: vitals (0x2100006C), unless a dump slug or markup is requested.
if (layoutId is null && markupPath is null && dumpSlug is null)
if (!mockup && layoutId is null && markupPath is null && dumpSlug is null)
layoutId = 0x2100006Cu;
return new StudioOptions(datDir, layoutId, markupPath, dumpSlug, dumpFile, screenshotPath);
return new StudioOptions(datDir, layoutId, markupPath, dumpSlug, dumpFile, screenshotPath, mockup);
}
/// <summary>