diff --git a/crates/benilla-app/assets/ui/CharacterFrame.xml b/crates/benilla-app/assets/ui/CharacterFrame.xml
index 224853a4..22d45eda 100644
--- a/crates/benilla-app/assets/ui/CharacterFrame.xml
+++ b/crates/benilla-app/assets/ui/CharacterFrame.xml
@@ -276,6 +276,17 @@
return
end
local frame = getglobal("BenillaCharacterFrame")
+ -- ref CharacterFrame.lua:11, and the line whose absence desynced this window: the tab
+ -- row is selected HERE, from the page's own id, on EVERY path — including the one that
+ -- closes the window. Having it only on the tab-button OnClick meant a KEYBIND
+ -- (`C`/`SHIFT-P`, which call straight in here) switched the page and left the row
+ -- selecting the old tab; clicking that old tab then took the "already visible" branch
+ -- and shut the window instead of switching back (director, 2026-08-06). The id is the
+ -- page's own `id=` attribute — the loader really does apply it (loader/geometry.rs
+ -- SetID) — and `character_tests.rs` pins every page's id against its slot in
+ -- BENILLA_CHARACTERFRAME_SUBFRAMES, which is what keeps the two in step the day
+ -- Reputation lands between them.
+ PanelTemplates_SetTab(frame, subFrame:GetID())
if frame:IsVisible() then
if subFrame:IsVisible() then
HideUIPanel(frame)
@@ -292,15 +303,14 @@
-- The tab row's own OnClick (ref CharacterFrameTab_OnClick, l.35-48), now id-based (decision
-- 0437 phase 4 grows the row to 2) — the MerchantFrame.xml Merchant/Buyback pair's own shape
-- for a >1-tab window: `id` indexes BOTH the tab button and BENILLA_CHARACTERFRAME_SUBFRAMES
- -- 1:1. PanelTemplates_SetTab visually selects the clicked tab (the ref's own
- -- PanelTemplates_SetTab(this, subFrame:GetID()) call, dropped by the original phase-1a
- -- single-tab comment above — restored now that a second tab exists to disagree with the
- -- first). l.47's trailing PlaySound is the ref's OWN redundant second igCharacterInfoTab —
- -- ToggleCharacter already plays it on the "switch to this tab" path, so this second call only
- -- matters when the window is ALREADY open on this same tab, i.e. the HideUIPanel branch —
- -- transcribed verbatim rather than "fixed" since it's the ref's own behavior, not a bug of ours.
+ -- 1:1. It does NOT select the tab itself — the ref's own tab OnClick doesn't either, because
+ -- ToggleCharacter is the single place that does it (above), so the click path and the
+ -- keybind path cannot disagree. l.47's trailing PlaySound is the ref's OWN redundant second
+ -- igCharacterInfoTab — ToggleCharacter already plays it on the "switch to this tab" path, so
+ -- this second call only matters when the window is ALREADY open on this same tab, i.e. the
+ -- HideUIPanel branch — transcribed verbatim rather than "fixed" since it's the ref's own
+ -- behavior, not a bug of ours.
function BenillaCharacterFrameTab_OnClick(id)
- PanelTemplates_SetTab(getglobal("BenillaCharacterFrame"), id)
ToggleCharacter(BENILLA_CHARACTERFRAME_SUBFRAMES[id])
PlaySound("igCharacterInfoTab")
end
@@ -1369,7 +1379,7 @@
exactly fill the parent instead of the ref's setAllPoints="true" — the same effect
(see this file's header: frame-level setAllPoints was a no-op when this was written
and is wired now; the explicit size is equivalent, so it stays). -->
-
+
@@ -1409,7 +1419,11 @@
-
+
+
diff --git a/crates/benilla-app/assets/ui/DressUpFrame.xml b/crates/benilla-app/assets/ui/DressUpFrame.xml
index fe4d9973..27f0af84 100644
--- a/crates/benilla-app/assets/ui/DressUpFrame.xml
+++ b/crates/benilla-app/assets/ui/DressUpFrame.xml
@@ -24,9 +24,13 @@
player" and "put the player's own gear back on it" are the same effect.
- The ref's `scale="2.0"` on the model widget is a 3D-widget zoom with no meaning for a
baked pane — the booth frames the body from its own bounds (`framing::body_frame`), the
- same law the paper doll is framed by.
- - The pane animates in the ref (a live widget playing Stand); ours is the frozen bake the
- paper doll beside it is (decision 0822 — the same look call, taken the same way).
+ same law the paper doll is framed by. The bake is framed at THIS pane's 316×351 aspect,
+ not square, or the UI's stretch would leave every character 11% too tall (decision 1069).
+ - The pane ANIMATES, as the ref's live widget does — Stand looping (decision 1069; the look
+ call 0822 §5 left open, made by the director). Its booth is TRANSPARENT for the same
+ reason a widget is: the dark room behind the character is the `DressUpBackground-`
+ art below, and Reset/Close sit on that art *inside* this pane's rect (both anchor sets
+ transcribed byte-identically from the ref, which is why the overlap is the ref's too).
-->