Files
benilla-octo/crates/benilla-app/assets/ui/benilla.toc
T
SamandClaude Fable 5 6e3a67e039 your corpse answers the mouse, and a cinematic's last holes close
- a corpse is a body you can hover, cursor and click: it enters the same ray pass as units with the winner switched on type at publish (the reference's own shape — one trace over every object), the cursor classifier is transcribed whole (lootable-by-me → the pickup cursor, grayed by range; else the insignia leg behind the learned-skill latch; your own body falls through to the clear), and right-click is "not mounted AND lootable" → CMSG_LOOT; CORPSE_FIELD_FLAGS bit 5 is the PvP insignia flag, not "reclaimable" as an old note had it; the widening also caught that a GameObject anywhere on screen could steal the click from a nearer corpse, and that a left-click on a body cleared your target as if you had clicked ground
- the cinematic sweep closes eleven holes: a shot plays its sequence band's WIDTH, not its end — two shipped fly-bys band away from zero and ran long with their opening frames frozen (the Night Elf intro measured 102333 → 102000 ms); CMSG_NEXT_CINEMATIC_CAMERA announces every shot, the first included — the old "between shots" reading meant it was sent NEVER, since every 1.12 sequence row carries exactly one camera; the ack invariant is stated once (one CMSG_COMPLETE_CINEMATIC per accepted trigger, over-acking tolerated, under-acking never — a dropped ack despawns the world around you until relog); the hardware cursor hides for the shot; and the music cut lands in the frame that starts it — it was one frame late, exactly long enough for a first login's zone fanfare to start under the narration and be stamped as played
- RunBinding exists, and a fly-by stops handing the world its mouse: CinematicFrame's OnKeyDown hands the SCREENSHOT chord back to its binding through RunBinding, a global we never had, so every press during a fly-by raised and took no picture; and the mouse was fully live under a shot — right-drag turned the character, clicks picked targets through the flying camera, both buttons walked the body — so the pointer now reads as over the UI while a shot plays
- AdvanceTime and ReplaceIconTexture are carved off the bytes: AdvanceTime really is a no-op in the reference (its one reachable call is mov eax,1; ret), ReplaceIconTexture is a material swap over a model's type-14 texture slots that stores nothing on the widget, and SetModel(nil) RAISES — the "documented clear" our binding claimed was invented, not read; and the addon roster now says WHOSE package is short when a .toc names files the folder doesn't hold — nine of the corpus's twenty-nine load failures are the addon's own manifest, which the real client also shrugs off ("Couldn't open %s", carry on), so they stop reading as our defects

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 19:55:36 +07:00

486 lines
34 KiB
TeX

# benilla.toc — the built-in interface, as an ordinary addon manifest.
#
# The reference's own interface ships as `FrameXML.toc`; ours was a hand-ordered Rust array until
# decision 1178. It is parsed by the same `.toc` parser any third-party addon will be
# (`benilla-ui/src/toc.rs`), and that is the point: a privileged built-in UI is how addon support
# rots. If our own interface loads through the addon path, the addon path works — it is exercised
# by every single run. If it keeps a private door, that path is untested by construction.
#
# The order is LOAD order and it is load-bearing: a template must be defined before the frame that
# inherits it, and a later file paints on top of an earlier one. Every entry's comment is why it
# sits where it sits; those comments are knowledge, not decoration.
#
# The FIRST entry is the font-object registry, and the loader splits there: it alone loads at
# startup, ahead of the glue screens that share our one glyph atlas, and everything after it
# materializes on entering the world (decision 1051).
## Interface: 11200
## Title: benilla
# The named virtual Font objects (decision 0084) — must load first so any FontString's
# `inherits="GameFontNormal"` resolves against a registered object.
Fonts.xml
# The reference's own second file, in its own position: TEXT/message/_ERRORMESSAGE, the
# ScriptErrors dialog, and the DialogBoxFrame + DialogButton*Texture kit it is built from.
# Straight after Fonts.xml because those are the only things it needs (GameFontRedLarge,
# DialogButtonNormalText/HighlightText) and everything above it in FrameXML.toc is engine.
BasicControls.xml
# The `SetItemButton*` family (ref ItemButtonTemplate.lua) — script-only, no frames and no
# dependencies of its own, so it sits as early as it can be read. Every window that paints an item
# slot calls these, ours and third-party alike: their absence is what left the director's Bagnon
# window with a title, a gold line and no bag slots at all (see the file's own header).
ItemButtonTemplate.xml
# The reference's money-frame kit: MoneyFrameTemplate/SmallMoneyFrameTemplate + MoneyTypeInfo
# + the MoneyFrame_* API. Needs only Fonts (NumberFontNormal/NumberFontNormalLarge) — and it must
# come BEFORE UiPanels.xml, because the shared StaticPopup's coin row is a child frame declaring
# `inherits="SmallMoneyFrameTemplate"`, which is resolved at LOAD (decision 1580). That is the
# reference's own order too (FrameXML.toc: MoneyFrame.xml l.10, StaticPopup.xml l.23); this file
# used to sit 140 lines lower, beside the other shared widget kits, which was only ever tenable
# while nothing above it showed coins. AuctionFrame far below is laid out on it as well (its price
# columns need a money TYPE, which the other kit has no notion of); our other eight coin displays
# still run on MerchantFrame.xml's BenillaMoney_* slot kit, and MoneyFrame.xml's header is where
# the two are reconciled.
MoneyFrame.xml
# The UIPanel slot manager (decision 0084 §2): script-only, no frames of its own — must load
# before any panel frame (Gossip/Merchant today) so ShowUIPanel/HideUIPanel already exist
# when those frames' OnLoad/OnEvent reference them.
UiPanels.xml
# The managed bottom-stack positions (decision 0272): script-only —
# UIPARENT_MANAGED_FRAME_POSITIONS + UIParent_ManageFramePositions, the ref
# UIParent.lua mechanism that re-anchors the cast bar / chat over the bottom bars.
# Loaded early so the stance bar's OnShow/OnHide can call it; applied once by the
# loader's post-load bootstrap (ui_script/manifest.rs).
UIParent.xml
# The tooltip: a hover window the bag/merchant/loot/unit frames drive. Loaded before them so
# `GameTooltip` + its verbs exist when their OnEnter handlers fire (runtime, so order
# is not strictly required — but it keeps the dependency legible). It also declares the two
# virtual templates (GameTooltipTemplate, ShoppingTooltipTemplate), which IS an order
# requirement: ItemRef.xml below expands one, and so do the 27 corpus addons that name
# GameTooltipTemplate in an XML inherits=.
GameTooltip.xml
# The dropdown kit (0203 phase 2's closing sub-slice, widened for 0434 phase 5):
# UIDropDownMenuTemplate + DropDownList1/2 + the UIDropDownMenu_* API — before its
# first customers (the unit popups below, the world map's pickers, the trainer filter).
UIDropDownMenu.xml
# The unit right-click popups (0434 phase 5): UnitPopupMenus/Buttons + UnitPopup_ShowMenu
# — after the dropdown kit it drives, before the unit/party frames whose DropDown
# children's OnLoad initialize into it.
UnitPopup.xml
# The chat-link click router (SetItemRef): item links → ItemRefTooltip:SetHyperlink; a
# player name → left-click whisper / right-click FRIEND dropdown. After GameTooltip.xml —
# ItemRefTooltip inherits=GameTooltipTemplate, so this order is now REQUIRED, not just legible
# (GameTooltip_OnLoad was the old, runtime-only reason) — AND after the dropdown kit +
# UnitPopup, since its FriendsDropDown inherits UIDropDownMenuTemplate and opens a UnitPopup
# FRIEND menu.
ItemRef.xml
# The shared status-bar numerals machinery (decision 1082): TextStatusBar_* + the opt-in
# template — before its customers (the XP bar in ActionBar.xml today; the unit-frame
# health/mana numerals are the ref's other users, when that slice lands). The ref's own TOC
# loads TextStatusBar right before its unit frames, same seat as here.
TextStatusBar.xml
UnitFrames.xml
# The combo-point dots (decision 0869) — anchored to TargetFrame, so after
# UnitFrames.xml; its fade chain needs UiPanels.xml's UIFrameFade above.
ComboFrame.xml
# The center-screen scrolling combat text (decision 0578) — the Blizzard_CombatText
# transcription; consumes COMBAT_TEXT_UPDATE + the regen/health/power events, needs
# only Fonts.xml (CombatTextFont) + UIParent before it.
CombatText.xml
# The party member frames + the PARTY_INVITE popup + its event driver (decision 0434
# phase 2): a StaticPopup registry entry, so after UiPanels.xml.
PartyFrame.xml
# The death arc's dialogs + event driver (decision 0308): registry entries on the shared
# StaticPopup engine, so after UiPanels.xml.
DeathFrame.xml
# The two duel dialogs + their event driver (decision 0633): registry entries on the same
# StaticPopup engine, and DUEL_OUTOFBOUNDS leans on its per-tick countdown branch.
DuelFrame.xml
# The two enchant-apply confirms + their event driver (decision 0928): the same StaticPopup
# registry again. Not CraftFrame's — the gate that raises them is the generic item-target
# bind, reached by a poison or a sharpening stone with no profession window open.
EnchantConfirm.xml
# The innkeeper's bind confirm + its event driver (decision 1331): the same StaticPopup registry.
# Not GossipFrame's, and the wire is why — the server closes the gossip menu BEFORE it asks, so
# this dialog is free-standing by the time it shows. Needs only UiPanels.xml, far above.
BinderConfirm.xml
# The class trainer's respec confirm + its event driver (decision 1580): the binder confirm's twin
# one line up, free-standing for the identical reason — the server closes the gossip menu before it
# asks. The only entry in the registry that raises a money frame, so it needs MoneyFrame.xml (far
# above, ahead of UiPanels.xml) as well as the StaticPopup engine itself.
TalentWipeConfirm.xml
# The shared CooldownFrame_SetTimer (the ref's Cooldown.lua file split) — before its
# consumers (ActionBar's buttons, the multibars, the stance bar, BagFrame's slots).
Cooldown.xml
ActionBar.xml
# The four OPTIONAL extra bars (bottom left/right 61-72 / 49-60, vertical right/left
# 25-36 / 37-48), all shipping hidden until the player ticks their row (decision 1500):
# pure XML/Lua over ActionBar.xml's shared button template + handler set. Loads right
# after it, and the order is a REQUIREMENT, not tidiness: it inherits
# BenillaActionButtonTemplate, anchors to ActionButton1, its buttons join the
# BENILLA_ACTION_BUTTONS roster ActionBar.xml declares, its grid verbs call that file's
# ActionButton_ShowGrid/_HideGrid, and its BENILLA_MULTIBARS table reads that file's
# *_ACTIONBAR_PAGE constants at FILE SCOPE. UIParent.xml (far above) owns the manage pass
# MultiActionBar_Update ends with, and the PLAYER_ENTERING_WORLD seed that fills the four
# SHOW_MULTI_ACTIONBAR_* globals from the server's byte.
MultiBars.xml
# The stance/shapeshift bar: hidden until `crate::ui_shapeshift`'s feed pushes a
# non-empty form list (a formless class never shows it). After Cooldown.xml
# (CooldownFrame_SetTimer) + ActionBar.xml (BENILLA_FALLBACK_ICON, the MainMenuBar
# anchor target).
StanceBar.xml
# The pet action bar (decision 0982): hidden until `crate::ui_pet`'s feed reports a bar,
# i.e. until the server sends `SMSG_PET_SPELLS` for a live pet or charm — so a class that
# never has one never sees it. Right after the stance bar, whose row it shares (either
# one showing raises UIParent.xml's managed "pet" delta), and after Cooldown.xml
# (CooldownFrame_SetTimer), ActionBar.xml (the `MainMenuBar` anchor target),
# GameTooltip.xml (its hover), Fonts.xml (NORMAL_FONT_COLOR_CODE, which wraps the binding
# a token slot's tooltip appends) and UIParent.xml (GetBindingText, which renders it).
# It is also the pet ARC's file, so decision 1066's three
# right-click-menu dialogs (ABANDON_PET / RENAME_PET / PETRENAMECONFIRM) register here —
# which adds UiPanels.xml to its dependency set, already far above.
PetActionBar.xml
# The micro-button row in the bar's right-hand recess (the ref's own file split, its TOC
# loads MainMenuBarMicroButtons right after MainMenuBar). After ActionBar.xml: it anchors
# into MainMenuBarArtFrame by name and seats itself with that file's
# BenillaActionBarArt_SeatAbove. It must come BEFORE the panels it toggles, because each of
# their OnShow/OnHide calls the `UpdateMicroButtons` this file defines (the panel frames
# themselves are read back through getglobal, so the reverse dependency is call-time).
MicroMenu.xml
# The HUD minimap cluster (decision 0203 phase 1): the chrome around the engine-rendered
# <Minimap> widget hole (`crate::minimap` fills it). After GameTooltip (its zone-text
# hover uses the shared tooltip).
MinimapCluster.xml
# The minimap's time-of-day indicator (GameTimeFrame): the reference's own file split — its
# TOC loads GameTime.xml right after Minimap.xml. After MinimapCluster (its parent) and
# GameTooltip (the hover tooltip); driven by the app's game clock (`minimap::feed_game_time`).
GameTime.xml
# Print screen's UI half (decision 1487): the centred "Screen Captured"/"Screen Capture Failed"
# line, and the `TakeScreenshot()` the SCREENSHOT binding runs. Needs Fonts.xml (SystemFont) and
# UIParent.xml (its seat) — both far above — and nothing else; seated beside ZoneText.xml, whose
# AutoFollowStatus is the same full-screen-frame-with-a-centred-line shape.
ScreenshotStatus.xml
# The zone-entry splash (decision 0287): ZoneTextFrame/SubZoneTextFrame + the inlined
# FadingFrame kit, driven by the ZONE_CHANGED family `crate::area` fires. Needs only
# Fonts (ZoneTextFont/SubZoneTextFont) + UIParent; kept by the minimap cluster — the
# other consumer of the zone-text host globals.
ZoneText.xml
# The faux-scroll kit (decisions 0247/0250/0251): BenillaScrollBarTemplate (the draggable
# Slider scroll bar) + FauxScrollFrameTemplate + the reference's own FauxScrollFrame_*
# API (Update/GetOffset/SetOffset/OnVerticalScroll + ScrollFrame_OnLoad) —
# before its first customer (the trainer list) below.
ScrollTemplates.xml
# The reference's SHARED widget kit (decision 1203's queue): UIPanelButtonTemplate,
# UICheckButtonTemplate, UIPanelCloseButton, InputBoxTemplate, the UIPanelScroll* family and
# their siblings, under the reference's own names — the templates a third-party addon names in
# `CreateFrame(kind, name, parent, "Template")`, which nothing in benilla's own XML consumes
# yet (each of our windows still carries its private copy; see the file's header). After
# ScrollTemplates.xml because UIPanelScrollFrameTemplate's OnLoad is that file's
# ScrollFrame_OnLoad, and this file supplies the two remaining handlers of that same kit
# (ScrollFrameTemplate_OnMouseWheel, ScrollFrame_OnScrollRangeChanged).
UIPanelTemplates.xml
# The reference's shared OPTIONS widgets: OptionsCheckButtonTemplate /
# UIOptionsCheckButtonTemplate / OptionsSliderTemplate / OptionsButtonTemplate /
# OptionFrameBoxTemplate. Straight after UIPanelTemplates.xml — two of them inherit its
# UICheckButtonTemplate and UIPanelButtonTemplate. Not benilla's own options window
# (OptionsFrame.xml, far below): these are the shared names addons build panels out of.
OptionsFrameTemplates.xml
# The shared colour dialog + its opacity slider (`ColorPickerFrame`, `OpacitySliderFrame`,
# `ColorPickerOkayButton`, `ColorPickerCancelButton`). Last of the "shared FrameXML surface with no
# benilla consumer yet" cluster that runs from UIPanelTemplates.xml down — the same posture as
# MoneyFrame.xml above, and for the same reason: 86 of the 218 corpus addons reach this window (64
# of those files are `Dewdrop-2.0.lua`, which drives THIS one rather than rolling its own), and
# nothing we ship opens it. The seat is a REQUIREMENT, not tidiness: its Okay/Cancel buttons
# `inherits="GameMenuButtonTemplate"`, which is resolved at LOAD, and that template lives in
# UIPanelTemplates.xml six lines up (it moved there from GameMenuFrame.xml — the reference's own
# file for it — precisely because GameMenuFrame.xml is deliberately LAST). Everything else it needs
# is far above (Fonts' GameFontNormal/…Small trio; UiPanels' ShowUIPanel/HideUIPanel, its
# UISpecialFrames entry and the ESC rung that cancel-clicks it). UIDropDownMenu.xml, which owns the
# colour-swatch row that OPENS this window, sits above too — but that direction is call-time only
# (`UIDropDownMenuButton_OpenColorPicker` reaches `ColorPickerFrame` by name when the swatch is
# clicked), so the two could sit either way round.
ColorPickerFrame.xml
# The fullscreen world map (decision 0203 phase 2), over the worldmap host API
# (`crate::ui_world_map` feeds it); the 'M' binding (ui_script/input.rs) calls its
# ToggleWorldMap().
WorldMapFrame.xml
# The cast bar (decision 0137 phase 1) — the extracted 1.12 CastingBarFrame, driven by
# the SPELLCAST_* events `crate::ui_cast` fires. Only needs Fonts before it.
CastingBar.xml
# The mirror timers (decision 0874): the breath/fatigue bars at top-center, driven by the
# MIRROR_TIMER_* events `crate::ui_mirror` fires. Needs only Fonts (GameFontHighlight)
# before it; kept beside the cast bar, whose border art it shares.
MirrorTimer.xml
# The always-up world-state readout (decision 1586, report B190): the tower/flag/base counters an
# outdoor-PvP zone or a battleground shows at top-centre, driven by the UPDATE_WORLD_STATES event
# `crate::world_state_ui` fires. Needs Fonts (GameFontNormalSmall) and GameTooltip; sits beside the
# mirror timers, which share its top-centre lane.
WorldStateFrame.xml
# The player buff/debuff bar (decisions 0255/0257 — the player aura arc): the HUD row of
# aura icons under the minimap, driven by the UnitAura feed (`crate::ui_aura`). Needs Fonts
# (its FontStrings) and ActionBar's `BENILLA_FALLBACK_ICON` global (both already loaded).
BuffFrame.xml
# The durability alert (the "armor guy"): under the minimap beside BuffFrame, driven by
# UPDATE_INVENTORY_ALERTS off the same inventory push the character window reads. Needs
# MinimapCluster (its anchor) — loaded above.
DurabilityFrame.xml
ErrorsFrame.xml
BagFrame.xml
# The stack-split spinner (decision 0216 §6/slice 2): loaded beside BagFrame, whose slot
# click handler (`BenillaBagSlot_OnClick`) calls `OpenStackSplitFrame`. Order between the
# two doesn't matter for correctness (Lua globals resolve at call time, and neither file's
# XML `inherits=` reaches into the other's templates) — kept adjacent for legibility.
StackSplit.xml
# Our ADAPTERS over the reference's own `Interface\\FrameXML\\ContainerFrame.lua`, which this
# client EXECUTES off the patch chain rather than transcribing (`ui_script::reference_ui`) — see
# that file's header for the rule. Must load AFTER the sourced reference file (every builtin does)
# and after BagFrame/StackSplit, whose globals it leans on.
ContainerFrameAdapters.xml
# The character window (decision 0208 phase 1a): the C-key paper doll. Loaded after BagFrame
# (needs nothing from it, but keeps player-state windows grouped) and before the NPC session
# windows (Gossip/Merchant/Quest*) — it depends only on Fonts/UiPanels/GameTooltip, all
# already loaded above.
CharacterFrame.xml
# The Pet tab (decision 1057): the same separate-top-level-file shape as SkillFrame below,
# and ahead of it because it is the earlier tab. It leans on CharacterFrame.xml for real —
# the `(unit, prefix)` stat setters, the `BenillaStatRow`/`BenillaMagicResistanceFrame`
# templates and the tab row it raises tab 2 of — all of which only exist once that file has
# loaded, so this order is a requirement here, not just tidiness.
PetPaperDollFrame.xml
# The Reputation tab: the same separate-top-level-file shape as the two pages around it, seated
# BETWEEN them because that is the real client's tab order (Character 1, Pet 2, Reputation 3,
# Skills 4 — ref CharacterFrame.xml:79-168), and the page's `id=` is that slot. Its hard
# dependencies are all far above: CharacterFrame.xml (the anchor target it is pinned to by name,
# and the tab row it raises tab 3 of), ScrollTemplates.xml (the faux list + its trough template),
# UIPanelTemplates.xml (`UIPanelCloseButton`, the detail popup's X — this page is that shared
# template's first benilla consumer), OptionsFrameTemplates.xml (`OptionsCheckButtonTemplate`, two
# of the three detail boxes), GameTooltip.xml (the column newbie tips) and Fonts.xml. One
# dependency runs the other way and is worth naming: the WATCH BAR half of the reference's
# ReputationFrame lives in ActionBar.xml (entry 94) beside the MainMenuBar frames it drives — that
# file's own comment carries the justification — so `FACTION_BAR_COLORS` and
# `ReputationWatchBar_Update` are already defined when this page paints a row or ticks the
# "Show as Experience Bar" box.
ReputationFrame.xml
# The Skills tab (decision 0437 phase 4): a CharacterFrame child page, but a separate
# top-level file (SkillFrame.xml's own header comment — this engine has no cross-file
# `parent=` attachment, so it's positioned by name via `<Anchors relativeTo=
# "CharacterFrame">` instead). Loaded after CharacterFrame.xml so it paints ON TOP of
# it (later file = higher z) and so `CharacterFrame` already exists for that anchor to
# resolve against — seated at the real client's own tab 4, between Reputation above and
# Honor below.
SkillFrame.xml
# The Honor tab: the same separate-top-level-file shape as the three pages above it, and LAST of
# them because it is the last of the tabs (the real client's 5, ref HonorFrame.xml:5) — which
# CLOSES the row: the character window's five tabs are now the reference's five, in its order, at
# its numbers, with nothing left past the end. Its hard dependencies are all far above:
# CharacterFrame.xml (the anchor target it is pinned to by name, the tab row it raises tab 5 of,
# and the `CharacterNameText` its level line hangs under), GameTooltip.xml
# (`BenillaTooltip_AddNewbieTipFor`, which all five of its hovers go through) and Fonts.xml
# (GameFontGreenSmall/GameFontRedSmall carry the honorable/dishonorable colouring, and
# HIGHLIGHT_FONT_COLOR the tip titles).
# It must come BEFORE InspectFrame.xml, and that order is a REQUIREMENT rather than tidiness: the
# inspect window's own honor page inherits the five `HonorFrame*ButtonTemplate` row templates
# declared here, and `inherits=` resolves at LOAD. The reference has the identical edge — its
# `HonorFrameTemplates.xml` is `<Include>`d by `HonorFrame.xml` and inherited by the LoadOnDemand
# `Blizzard_InspectUI`, which loads later still.
HonorFrame.xml
# The inspect window (decision 0631): another player's paper doll. Beside the character
# window it mirrors — it needs the same three (Fonts/UiPanels/GameTooltip) plus
# `CharacterFrameTabButtonTemplate` from UiPanels.xml, and nothing from CharacterFrame.xml
# itself (its slot template, handlers, and booth slot are all its own — the two windows
# share only the reference's art). ONE cross-window dependency does bind, and it is on the
# entry directly above: this window's honor page inherits HonorFrame.xml's five row templates
# and calls its two shared painters, the same sharing the reference does.
InspectFrame.xml
# The dressing room (decision 1060): the ctrl-click item preview. Loaded right after the
# windows whose slots feed it (the character window above, the bags before that) and before
# everything else that ctrl-clicks into it — order is legibility only, since `DressUpItemLink`
# is a global resolved at call time. Needs UiPanels (the panel manager, its left-slot row) and
# Fonts; its booth pane needs nothing loaded at all.
DressUpFrame.xml
# The spellbook window (decision 0216 §8, slice 5): the P-key window, the spell SOURCE
# for the cursor-payload arc. Loaded right after CharacterFrame (the same "player-state
# windows grouped" posture, same Fonts/UiPanels/GameTooltip-only dependency set); the
# 'P' binding (ui_script/input.rs) calls its bare ToggleSpellBook(BOOKTYPE_SPELL).
SpellBookFrame.xml
# The talent window (decision 0304 §4): the N-key window, the class talent grid over the
# `benilla-ui::script::talent` engine seam. Loaded right after SpellBookFrame (the same
# "player-state windows grouped" posture; needs Fonts/UiPanels/GameTooltip plus
# ScrollTemplates.xml — its real ScrollFrame's scrollbar reuses BenillaScrollBarTemplate —
# all already loaded above). The 'N' binding (ui_script/input.rs) calls its bare
# ToggleTalentFrame().
TalentFrame.xml
# The social window (decision 0668): the O-key friends/ignore/who window over the social
# API (`benilla-ui/src/script/social.rs`) + `crate::ui_social`'s feed/drain. Needs
# UiPanels (the panel manager, `CharacterFrameTabButtonTemplate`, and the StaticPopup
# engine its two name-entry dialogs register into), ScrollTemplates (three faux lists),
# GameTooltip (the newbie tips) and UIDropDownMenu (the who list's variable column) —
# all loaded above.
FriendsFrame.xml
# The social window's fourth tab, in its own file because RaidFrame is a child of FriendsFrame and
# a child cannot be declared before its parent — the reference splits it the same way and for the
# same reason (its FrameXML.toc has RaidFrame.xml on the very next line). Decision 1549.
RaidFrame.xml
GossipFrame.xml
MerchantFrame.xml
# The mail window (decision 0544 P1/P2): the mailbox inbox, open-letter, and send tab over
# the Era mail API (`benilla-ui/src/script/mail.rs`) + `crate::ui_mail`'s feed/drain. Loaded
# right after MerchantFrame because it REUSES that file's global BenillaMoney_Set/_Clear
# coin helpers (postage/enclosed/COD displays) — they must be defined first.
MailFrame.xml
# The player-to-player trade window (decision 0592 P1): the two-sided offer over the trade
# API (`benilla-ui/src/script/trade.rs`) + `crate::ui_trade`'s feed/drain. Loaded after
# MerchantFrame because it REUSES that file's global BenillaMoney_Set coin helpers (the two
# gold displays) — they must be defined first.
TradeFrame.xml
# The item-text reader: letters (mail-made permanent copies) and, later, books/plaques —
# the ItemTextGet* seam (`benilla-ui/src/script/item_text.rs`) over `crate::ui_item_text`'s
# feed/drain. Loaded right after MailFrame (the same arc; needs only Fonts/UiPanels, both
# loaded above).
ItemTextFrame.xml
# The trainer window (decision 0237 phase 3): the read-only class/profession trainer list.
# Loaded right after MerchantFrame per the director's brief (kept adjacent even though this
# v1 uses plain-text costs, not MerchantFrame's coin helpers) and before the other NPC
# session windows below.
TrainerFrame.xml
# The bank window (decision 0604 phase 4): the vault, purchase ladder, and the 6 bank-bag
# popouts, over the container feed already carrying container -1/5..10 (ui_items.rs) +
# the bank Lua surface (benilla-ui/src/script/bank.rs) + crate::ui_bank's feed/drain.
# Loaded AFTER MerchantFrame.xml (reuses its BenillaMoney_* coin helpers for the purchase
# row + purse) and AFTER BagFrame.xml, already above (its BenillaBagSlotTemplate/
# BenillaBagWindowTemplate + the BenillaBagSlot_*/BenillaBagFrame_* function family are
# reused verbatim — the 24 generic slots and the 6 bank-bag popouts are, respectively, a
# container-slot grid and ordinary container windows, exactly like the bag arc's own).
# Kept in the "NPC session windows grouped" cluster beside Trainer/Taxi.
BankFrame.xml
# The taxi-map window (decision 0484 phase 2): the flight-master session, driven by the
# taxi engine seam (`benilla-ui/src/script/taxi.rs`) over `crate::ui_taxi`'s feed/drain.
# Loaded right after TrainerFrame per the same "NPC session windows grouped" posture — it
# needs only Fonts/UiPanels/GameTooltip (SetTooltipMoney), both already loaded above.
TaxiFrame.xml
# The stable-master window (decision 1676): the hunter's three-slot pet stable over the stable
# API (`benilla-ui/src/script/stable.rs`) + the app's feed/drain. Kept in the "NPC session
# windows grouped" cluster beside Trainer/Bank/Taxi. Two of its dependencies are resolved at
# LOAD and so must sit above it: MoneyFrame (its purse and cost displays inherit
# SmallMoneyFrameTemplate) and UIPanelTemplates (UIPanelButtonTemplate / UIPanelCloseButton).
# A third is resolved at load too, and is the reason this cannot sit up with the other NPC
# windows' dependencies: the model pane's own <OnLoad> calls CharacterFrame.xml's shared
# `BenillaPaperDollModel_OnLoad`, so that file must already have run. The rest
# (ItemButtonTemplate's SetItemButtonTexture, GameTooltip, UiPanels' ShowUIPanel/HideUIPanel,
# UIParent's BuildListString) are resolved when the window repaints, so their order is free.
PetStable.xml
# The auction house (decision 1511): the three-tab doublewide window over the auction API
# (`benilla-ui/src/script/auction.rs`) + the app's feed/drain. Kept in the "NPC session
# windows grouped" cluster beside Trainer/Bank/Taxi, and loaded AFTER MoneyFrame (its eight
# money displays are SmallMoneyFrameTemplate, and it registers the AUCTION_DEPOSIT money type
# into that file's MoneyTypeInfo), after MerchantFrame (it reuses that file's global
# BenillaMoneyInput_* helpers for its four money inputs), after ScrollTemplates (four faux lists), after
# UIPanelTemplates (UIPanelButtonTemplate / UIPanelCloseButton / InputBoxTemplate /
# UICheckButtonTemplate), after UIDropDownMenu (the rarity capsule) and after UiPanels (the
# panel manager's `doublewide` seat, `CharacterFrameTabButtonTemplate`, the PanelTemplates
# tab kit and the StaticPopup engine its two confirmations register into) — all above.
AuctionFrame.xml
# The crafting window (decision 0437 phase 2): NOT an NPC session (opens off your own cast of
# an effect-47 opener spell, TradeSkillFrame.xml's own header comment) — loaded right after
# TrainerFrame per the same "player-state/profession window" grouping and because it depends
# on nothing TrainerFrame doesn't already need (Fonts/UiPanels/GameTooltip/ScrollTemplates,
# all loaded above).
TradeSkillFrame.xml
# The Enchanting window (decision 0437 phase 3): the exact twin of TradeSkillFrame above —
# same "opens off your own cast, not an NPC session" shape (CraftFrame.xml's own header
# comment) — loaded right after it so `BuildColoredListString` (a guarded GLOBAL
# TradeSkillFrame.xml defines) already exists when CraftFrame.xml reuses it without
# redefining (CraftFrame.xml's own header comment, deviation 2).
CraftFrame.xml
LootFrame.xml
# The group-loot roll popups (decision 0591): the Need/Greed/Pass dialogs, a sibling of
# LootFrame.xml (loaded right after it) over the `benilla-ui::script::loot_roll` seam
# (`crate::ui_loot_roll`'s feed/drain). NOT a UIPanel — four `frameStrata="DIALOG"` toplevel
# popups with their own hardcoded anchors — so it needs only Fonts (GameFontNormalSmall) +
# GameTooltip (the item/PASS/NEED/GREED hovers), both already loaded above.
GroupLootFrame.xml
# The questgiver window (decision 0088): four sub-panels over the Era quest API. Loaded after
# MerchantFrame (the BenillaMoney coin helpers live there) and GossipFrame (shared parchment
# art conventions); its title/panel-button labels use the auto-centred ButtonText slot.
QuestFrame.xml
# The two guild-charter windows (decision 1672): the guild registrar — the window the "How do I
# form a guild?" gossip row opens — and the charter itself, the sheet nine people sign. Loaded
# here, right after QuestFrame, because both wear the QuestGreeting parchment and its QuestFont /
# QuestTitleFont objects and read as that family; they need UiPanels (the panel manager seats both,
# and PetitionFrame registers its RENAME_GUILD dialog on the shared popup engine), MoneyFrame (the
# registrar's price rides MoneyFrameTemplate, resolved at LOAD — decision 1580's ordering rule) and
# UIPanelTemplates (the close/action buttons), all far above. The registrar must come first: no
# load-order dependency links them, but the flow does, and the pair reads in the order it is used.
GuildRegistrarFrame.xml
PetitionFrame.xml
# The quest log window (decision 0088 arc, the quest-log slice): durable player state, not an
# NPC session — loaded after MerchantFrame (the BenillaMoney coin helpers it reuses) and
# alongside QuestFrame (same arc); the 'L' binding (ui_script/input.rs) calls its
# ToggleQuestLog().
QuestLogFrame.xml
# The timed-quest countdown window under the minimap (decision 1150): the reference's own
# file split. After MinimapCluster (its anchor), UIParent (the manage pass that re-seats it,
# and SecondsToTime), GameTooltip (its row hover), and QuestLogFrame — whose window a row
# click opens, and whose MAX_QUESTS it shares.
QuestTimerFrame.xml
ChatFrame.xml
# The macro window (decision 0983): the editor + its name/icon popup, driven over the
# engine's OWN macro table (`benilla_ui::script::macros` — 1.12 macros have no server
# side, so this is the one window whose model is not an app feed). Needs UiPanels (the
# panel manager + `TabButtonTemplate`), ScrollTemplates (BOTH kits — the real one scrolls
# the body box, the faux one the icon grid), MicroMenu (`UpdateMicroButtons` on
# show/hide), and it must come AFTER SpellBookFrame, whose shift-click reaches
# `BenillaMacroFrame_AddMacroLine`. Before GameMenuFrame, whose Macros button opens it.
MacroFrame.xml
# The script error log (decision 1495): the window `/errors` opens — the list B293's two
# reporters asked for, which the reference's one-message-at-a-time ScriptErrors modal cannot
# be. Ours entirely (1.12 has no counterpart), reading the retained log on the model rather
# than any per-frame feed. Needs ScrollTemplates (BOTH kits — the faux one for the fixed row
# list, the real one for the traceback pane), UIPanelTemplates (the Clear/Close buttons) and
# UiPanels (ShowUIPanel/HideUIPanel + the UIPanelWindows row that seats it and gets it closed
# by ESC). Before GameMenuFrame, which is deliberately last.
ScriptLogFrame.xml
# The GM help window + the ticket-status toast (the HelpFrame.xml transcription): the third
# **center**-area UIPanelWindows row, so it opens like the game menu and the options window and
# shuts every other panel on the way in. It heads the SHELL TAIL for that reason — Help, then the
# options pair, then the game menu last — and it goes ahead of KeyBindingsPage.xml rather than
# between it and OptionsFrame.xml, because those two are a hard must-load-before pair and nothing
# should be wedged into it. Every dependency is far above: UiPanels (ShowUIPanel/HideUIPanel, the
# UIPanelWindows row, and the StaticPopup engine its three ticket dialogs register into),
# UIPanelTemplates (UIPanelCloseButton, UIPanelButtonTemplate2, GameMenuButtonTemplate and the
# real UIPanelScrollFrameTemplate the ticket editor is built on), ScrollTemplates (the faux kit
# behind the GM category list, its shared trough, and the ScrollingEdit pair), GameTooltip (the
# toast wears the tooltip backdrop colours at OnLoad) and MicroMenu (whose Help button calls this
# file's ToggleHelpFrame, and whose UpdateMicroButtons this file calls back on show/hide — both
# resolved at call time, so that pair could sit either way round). The one seat that is a REAL
# requirement rather than legibility is **after BuffFrame.xml**: the toast re-anchors
# TemporaryEnchantFrame out of its own way, and that frame is declared there.
HelpFrame.xml
# The cinematic frame: the ESC that skips a fly-by, and the SCREENSHOT chord it hands back. It
# draws NOTHING — the letterbox moved to Bevy UI nodes in `crate::cinematic` (decision 1699),
# because the lane this frame paints into is dark for the whole shot.
# Needs UiPanels.xml far above for ShowUIPanel/HideUIPanel and its own UIPanelWindows row; needs
# nothing else, and nothing needs it — the engine reaches it purely by firing CINEMATIC_START.
# Seated late because it is an outermost, screen-owning layer, like the two windows below it.
CinematicFrame.xml
# The Keybindings page MODULE (decision 1008, superseding 0997's standalone window):
# the templates + script of the Options window's Keybindings category, over the
# engine's binding table (benilla_ui::script::keybind + crate::bindings — the 1.12
# GetBinding/SetBinding Lua API). Needs UiPanels (popup engine) and GameTooltip (the
# character-specific checkbox's hover); MUST load before OptionsFrame.xml, whose
# Keybindings body inherits these templates and calls this script at OnLoad.
KeyBindingsPage.xml
# The options window (the 0985 provenance split: 0950's era structure, 0978's
# 1.12-native art, 0981/0984's 1.14 chrome + working era search, 0989's directed
# cuts — bare fully-live sliders, no corner X; 0992's dropdown rows + the Nameplates
# page): the era-shaped OptionsFrame the game menu's Options button opens. Needs
# Fonts' objects, UiPanels' panel manager, and UIDropDownMenu's capsule template
# (all far above); sits right before GameMenuFrame so the menu — which reaches it by
# name at click time — stays the last, outermost layer.
OptionsFrame.xml
# The game menu (decision 0674): the frame ESC opens, plus the CAMP/QUIT dialogs and their
# event driver. LAST on purpose — it is the outermost layer of the shell, it depends on
# everything it touches being loaded (UiPanels' popup engine + panel manager, MicroMenu's
# UpdateMicroButtons, BagFrame's Disable_BagButtons), and nothing depends on it: the ESC
# chain and the micro button both reach it by name at call time.
GameMenuFrame.xml