# Themes: find each menu's parts by what they do

Read this when a theme is installed, when you compare a menu in two themes, or before you build UI of the game's own that must keep working when the look changes. A theme (Studded UI, or one made later) can draw every menu and button its own way: other frames, other names, a thick coloured header, another layout. The systems never find a part by where it sits in the tree: they find the piece by its identity and each part by a tag, an attribute or, for a few parts, a path the contract fixes. This file says how to do the same, and ends with the contract of every piece, generated from the code.

## 1. What is the same in every theme

- **The piece:** its root carries `RBLXE_Piece` = `"<PackId>.<Name>"` (`GeneralUIKit.ShopPanel`, `CodesSystem.CodesPanel`) and `RBLXE_Contract`. The same id in every theme and in the pack's own copy.
- **Its slot:** a menu carries the tag `UI_Panel` and `PanelId` (`Shop`); a HUD button carries `UI_Interactable`, `Action = "TogglePanel"` and `TargetPanel` (the menu's `PanelId`). A theme must keep the pack's values, or the Kernel uses the pack's own copy.
- **What a button does:** its `Action` attribute (`ClosePanel`, `ClaimCode`, `Spin`, `Buy3Spin`, `BuyX3Eggs`, `ToggleMusicMute`...). The menu system routes the click by it, whatever the button looks like.
- **Role tags and attributes:** `UI_Requirement`, `UI_EffectIcon`, `UI_DataBind`, `MusicPlayerFrame`, `<Rarity>PetTemplate` (`CommonPetTemplate`), `VolumeGroup`, `GamePassId`, `ProductId`.
- **Parts by role (Kernel 3.3.2):** the attribute `RBLXE_Role` names what a part is (`CodesBox`, `SpinWheel`, `RewardsGifts`, `PetsGrid`...; the table gives each). A pack finds the descendant with that role anywhere in the piece, else the path the table gives (copies made before roles). Gifting (Datastore & Purchase System 3.4.0) finds the Shop and Spin gift buttons (`GiftButton`), the Gift menu's player row (`PlayerTemplate`, `PlayerName`) and `ConfirmButton` only by role: a kit gives `GiftPanel` and `GiftReceivedPanel` too.

Not the same: frame names, the tree, sizes, colours, fonts and the decoration attributes (`IncrementalButton`, `Typography436`...).

## 2. Find a piece and its parts in any theme

The copy in use: one in `StarterGui.RBLXEssentials.Interface` (a theme's or a fork) wins; then, for a pack's slot, the GUI kit's piece that gives it (section 6); then the pack's own in `StarterGui.RBLXEssentials.<PackId>`; skip `Interface.Custom`. `T.describe()` names it (`menu of GeneralUIKit.CodesPanel`). Then each part by the "how" its contract gives (table below):

```lua
-- Edit: a piece's copy in use, and a part found by its Action (any theme)
local root = game.StarterGui:FindFirstChild("RBLXEssentials")
local function pieceCopy(id)
	local own
	for _, node in ipairs(root:GetDescendants()) do
		if node:GetAttribute("RBLXE_Piece") == id and not node:FindFirstAncestor("Custom") then
			if node:FindFirstAncestor("Interface") then
				return node
			end
			own = own or node
		end
	end
	return own
end
local function byAction(piece, action)
	for _, node in ipairs(piece:GetDescendants()) do
		if node:IsA("GuiButton") and node:GetAttribute("Action") == action then
			return node
		end
	end
end
local spin = pieceCopy("RouletteSystem.SpinPanel") or pieceCopy("GeneralUIKit.SpinPanel")
return spin and byAction(spin, "Spin") and byAction(spin, "Spin"):GetFullName()
```

- **By Action:** the GuiButton inside the piece with that `Action`.
- **By tag:** the root or a descendant with the tag (`CollectionService` in a script; `HasTag` on each node).
- **By role:** the descendant whose `RBLXE_Role` is the role (first), else the path the table gives, relative to the piece root (`Container/Code/TextBox`). A part with "path or Action" is found by the path first and by the Action when the path is not there.
- A HUD button's badge is role `HudBadge` (else its child `Notification`), a countdown `HudTime` (else `Time`), the hover icon its child `Icon` (each optional).

## 3. The same menu in two themes

Relate them by the piece id, never by name or position: `GeneralUIKit.ShopPanel` is the CanvasGroup `Shop` under the kit's `Menus` in the default look and the Frame `Shop` inside the ScreenGui `GeneralUIKit_ShopPanel` in Studded UI. Then part by part with the same "how": the Shop's buy buttons by their `Action` (`BuyX2Cash`, `BuyX3Eggs`...), the close button by `Action = "ClosePanel"`, the Rebirth bar by `UI_Requirement`. A part that only one theme has (Studded's `StudsMask`, a theme's header) is decoration: carry over what has a role, and leave decoration to the theme. To move a change from one theme's copy to another (a text, an id), find the part in both by its role and set it on the new one.

## 4. Build the game's own UI so it works in any theme

- **Menus and HUD buttons of the game's own:** the same tags and attributes as the pieces (the UI map, https://rblxessentials.com/ai/UI.md, has the recipe): `UI_Panel` with a `PanelId` of its own, a close button with `Action = "ClosePanel"`, a HUD button with `UI_Interactable`, `Action = "TogglePanel"` and `TargetPanel`. They work in every theme; a theme restyles only the packs' pieces, so restyle the game's own from the new look (UI map section 10).
- **The game's scripts find their parts by role too:** give each part the game's script uses an attribute (`QuestId`) or an `Action` handled in `CustomHandlers`, or a tag of the game's own, and find it with `GetDescendants` or `CollectionService`. Never a path from the root such as panel.Container.Rows.Quest1: a restyle moves frames and renames them.
- **Buy buttons of the game's own:** `Action = "promptGamePass"` with `GamePassId`, or `promptDevProduct` with `ProductId` (UI map section 9).
- **Editing a pack's piece (a fork, or a theme's copy):** keep every required part at its path and every needed part; restyle the rest freely. `T.content.activate` refuses a copy the Kernel would refuse (`piece-contract`, `piece-identity`) and `T.validate()` after every change.

## 5. Where names still matter

Every required part has a role, so a menu drawn another way works once its parts carry their roles. Names still matter for: the slots `Reward1..N`, `Gift1..N` and `Day1..N` inside their holder (the number is the slot); inside a gift, day or tab view, the parts the table names by path; Notifications' template names; the hover `Icon`.

## 6. The game's style: a GUI kit and one of its style presets (3.3.2; presets 3.5.0)

One style for the whole game: a GUI kit and one of the style presets it declares, each a finish and a font (3.5.0, Valen: the font is part of the style, so it is never chosen on its own and nobody can pick an ugly font). General UI Kit: `plain-fredoka` "Plain (Fredoka)" (flat colours, its default) and `studded-fredoka` "Studded (Fredoka)" (the stud tile on headers, buttons, bodies, cards and rows; nothing on the HUD, tooltips, the close X, gifts, the Spin wheel and its dimmer, or bars). Classic UI Kit (3.5.0, sold apart, needs no other kit: ClassicUIKit.md): `plain-fredoka`, `plain-montserrat`, `studded-fredoka` (its default: studs on every colour surface) and `studded-montserrat`. Fredoka is Fredoka One; Montserrat is Montserrat Black (900). The plugin names them "<finish> (<font>)" ("Liso (Montserrat)" in Spanish).

- **Where:** `ReplicatedStorage.RBLXEssentials.Config.Game`, `return { Kit = "ClassicUIKit", Style = "studded-montserrat" }` (the Kernel's own schema; updates never touch config modules). A game set before 3.5.0 has `Finish` instead of `Style`: it is the kit's first preset with that finish (its font is the kit's own), and picking a style replaces it. Without either, General UI Kit's old `Finish` option (3.3.0) counts while it is the kit, else the kit's first finish (the first of its manifest's `finishes`) in its first preset, else Plain. `T.style()` answers the style (`kit`, `style`, `finish`, `font`) and the options (each installed kit x its presets, from the kit's `manifest.kit.styles`, labelled "<Kit> · <Finish> (<Font>)").
- **The kit gives the packs' slots:** with a GUI kit installed, each pack uses the kit's menu for its slot (General UI Kit: Codes, Spin, Rewards, DailyRewards, Pets, menu and button), so every menu has the kit's look and the game's finish. The pack's own copy is the fallback: no kit, the kit's menu deleted, or the kit's menu failing the pack's contract (`kit-piece-unusable`). Order for a slot: the game's copy in `Interface` of the pack's piece, the game's copy of the kit's piece, the kit's piece, the pack's own. With two kits installed only the style's `Kit` gives slots (a kit may also give another kit's slots: its `GeneralUIKit.ShopPanel`); the other kit's pieces stay installed and unused.
- **Forks belong to their kit:** `T.content.fork` of a slot a kit gives forks the kit's menu (`fork-kit-menu`; `{ own = true }` forks the pack's own copy). A copy made for one kit (`RBLXE_Kit`, or the kit its `RBLXE_Source` names) waits while another kit is the style and is used again when it is back; edits do not carry over (`style-kit-edits-wait`).
- **To switch** (only when the user asks): the plugin card's Style tab, one click (one card per preset, grouped by kit). From the MCP: `T.style({ kit = "ClassicUIKit", style = "studded-montserrat" })` (`{ kit, finish }` still works: the kit's first preset with it): `style-pending` (apply its multi_edit, which creates `Config.Game`) or `style-edit-module` (set `Kit` and `Style`, remove `Finish`, with multi_edit), then `T.content.reconcile()` so Edit shows it, then Play. A style the kit does not declare (any other font) is `style-unknown`. No kit installed: `style-no-kit` (the packs use their own menus).
- **The font** comes only with the preset, in Edit and in Play: every text under `StarterGui.RBLXEssentials` (the kit's menus and HUD, the packs' menus and slots, the game's forks) whose font is one of the curated ones (Fredoka One, or Montserrat Black, in that exact weight) takes the preset's font. Tools does it in Edit on install, update, `T.content.reconcile()` and every style switch; the Kernel (`KitEngine/FontPreset`) does the same in Play, also as menus and cards are cloned. Texts in other fonts (the Robux glyph's, Luckiest Guy titles, Fredoka One Bold, a font the game set) keep theirs. A style switch is never an edit: the fingerprints read a curated font as the kit's own, so a fork stays clean and an update keeps the game's preset; a text the game moved to any other font is an edit. The kit's texts keep an inner margin, so both fonts fit.
- **The layers:** each textured surface holds an ImageLabel `Studs` tagged `GeneralUIKit_Finish` with `Finish` = "Studded", hidden in the GUI file: image rbxassetid://118347284107187, ScaleType Tile, ImageTransparency 0.5 on headers and buttons and 0.85 on bodies, cards and rows, a ZIndex under the surface's other children and a copy of its UICorner. Classic UI Kit's: the same image, ImageColor3 black, the attribute `StudTile` = 114, ImageTransparency 0.6 on colour surfaces (0.78 on bodies). The studs are square and the same size on every surface (3.5.0): the Kernel sets each layer's TileSize to a square tile of `StudTile` px (90 without the attribute, General UI Kit's) at 1920 x 1080, times the scale its surface is really drawn at (rc: the nearest ancestor with `DesignWidth`, its width against it; else the nearest ancestor with a UIAspectRatioConstraint or the menu root, against its size on the 1920 x 1080 design screen, the smaller ratio; else the screen's, the smaller of width / 1920 and height / 1080), so the studs keep one proportion to the interface on every screen, in scale of the layer's own size, again whenever it or the screen is resized; Tools does it in Edit. Never set TileSize by hand on a layer. A kit's menu opens and closes from its centre (the Kernel's `Open` UIScale on the menu root, 0.88 to 1 and back to 0.9; a CanvasGroup root also fades), so menu roots are anchored at their centre. A button's look can follow its `Active` (`StateLook = true`: `ActiveGradient`/`InactiveGradient`, `ActiveBevel`/`InactiveBevel`, labels' `ActiveText`/`InactiveText`); any element can follow a button inside it instead (`StateLookSource` = that button's name). In Play the Kernel shows every layer whose `Finish` is the game's (the game's own UI included); in Edit Tools and the plugin do the same.
- **Studs on the game's own UI:** copy a `Studs` from a kit surface of the same kind into the surface, keep its tag and attributes (`Finish`, `StudTile`), a ZIndex under its other children, and the surface's UICorner; the Kernel sizes its tile. It then follows the style.
- **Edits:** fingerprints leave layers (and `RBLXE_Role`) out, so switching never forks a piece. The game's edited menus get the layers when a style is picked (or `T.content.reconcile()` after `Config.Game` changed), only where the element still exists; a fork of a pack's menu gets the kit's layers.
- **A new GUI kit** fills every slot of the base contract, General UI Kit's: its own menus and widgets with `standsInFor = "GeneralUIKit.<Piece>"`, the packs' with `standsInFor = "<Pack>.<Piece>"`, each with the contract's identity, actions and roles; its finishes are layers with `Finish` = "<Finish>" (stud layers with `StudTile`) and its `manifest.kit = { name, finishes, font, styles = { { id, finish, font } } }`, each font one of the Kernel's curated fonts (`Style.FONTS`: Fredoka, Montserrat). Its client calls the Kernel's `KitEngine.boot` (Kernel 3.5.0), so it needs no other kit. `tools/theme-check.luau` requires every slot. Packs need no release for it.
- **The old Studded UI theme** (`StuddedUI`, 3.0.x) keeps working where it is applied; picking a style stops it first (`T.content.deactivate("StuddedUI")`, its copies stay in the library).

## Facts: the contract of every piece

The block below is generated (`lune run tools/theme-contract.luau -- md`); the same contract is in `docs/themes/contract.json` of the product repository.

<!-- theme-contract:en:begin -->
Generated by `lune run tools/theme-contract.luau -- md` from the packs' `Pieces.lua`, the Kernel's `Contracts.lua`, the packs' own GUIs and the code that finds each part. **required**: without it the Kernel uses the pack's own copy; **needed**: the pack warns and that part stops; **optional**: used when present.

Classic UI Kit's 39 pieces (`ClassicUIKit.<Name>`) carry the contract of the slot they give (`standsInFor`): the same-named piece of General UI Kit or of its pack (`HatchReveal`, `HatchRevealTriple`, `NotificationLayer`, `MusicPlayer`).

Studded Glass UI Kit's 39 pieces (`StuddedGlassUIKit.<Name>`) do the same.

**`CodesSystem.CodesButton`** HudButton, root GuiButton, opens `CodesSystem.CodesPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `CodesSystem.CodesButton`, `TargetPanel` = `Codes`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`CodesSystem.CodesPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Codes`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `CodesSystem.CodesPanel`
- required: role `CodesBox` or path `Container/Code/TextBox` (TextBox): where the player types the code
- required: role `CodesRedeem` or path `Container/Button` (GuiButton): REDEEM (Action ClaimCode)
- optional: role `CodesError` or path `Container/ErrorText` (TextLabel): the refusal
- optional: role `CodesSuccess` or path `Container/SuccessText` (TextLabel): the confirmation
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`DatastorePurchaseSystem.GiftPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Gift`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `DatastorePurchaseSystem.GiftPanel`
- required: role `PlayerList` or path `Container/Content/PlayerList` (GuiObject)
- required: role `PlayerTemplate` or path `Container/Content/PlayerList/PlayerTemplate` (GuiButton)
- required: role `PlayerName` or path `Container/Content/PlayerList/PlayerTemplate/PlayerName` (TextLabel)
- required: role `ConfirmButton` or path `Container/Content/Buttons/ConfirmButton` (GuiButton)
- optional: role `PlayerAvatar` or path `Container/Content/PlayerList/PlayerTemplate/PlayerAvatar` (ImageLabel)
- optional: role `PlayerOwned` or path `Container/Content/PlayerList/PlayerTemplate/PlayerOwned` (GuiObject)
- optional: role `PlayerSelected` or path `Container/Content/PlayerList/PlayerTemplate/PlayerSelected` (GuiObject)
- optional: role `PlayerAction` or path `Container/Content/PlayerList/PlayerTemplate/GiftTag` (GuiObject)
- optional: role `SearchBox` or path `Container/Content/Search/SearchBox` (TextBox)
- optional: role `SearchArea` or path `Container/Content/Search` (GuiObject)
- optional: role `ItemName` or path `Container/Content/Item/ItemName` (TextLabel)
- optional: role `ItemIcon` or path `Container/Content/Item/ItemIcon` (ImageLabel)
- optional: role `ItemPrice` or path `Container/Content/Item/ItemPrice` (TextLabel)
- optional: role `ItemKind` or path `Container/Content/Item/ItemKind` (TextLabel)
- optional: role `CreditText` or path `Container/Content/CreditText` (GuiObject)
- optional: role `ToLabel` or path `Container/Content/ToLabel` (GuiObject)
- optional: role `ConfirmArea` or path `Container/Content/Buttons` (GuiObject)
- optional: role `ConfirmPrice` or path `Container/Content/Buttons/ConfirmButton/Amount` (TextLabel)
- optional: role `CreditConfirmButton` or path `Container/Content/Buttons/CreditConfirmButton` (GuiButton)
- optional: role `BackButton` or path `Container/Content/Buttons/BackButton` (GuiButton)
- optional: role `StatusText` or path `Container/Content/StatusText` (TextLabel)
- optional: role `EmptyText` or path `Container/Content/EmptyText` (GuiObject)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`DatastorePurchaseSystem.GiftReceivedPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `GiftReceived`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `DatastorePurchaseSystem.GiftReceivedPanel`
- optional: role `FromName` or path `FromName` (TextLabel)
- optional: role `FromAvatar` or path `FromAvatar` (ImageLabel)
- optional: role `ItemName` or path `ItemName` (TextLabel)
- optional: role `ItemIcon` or path `ItemCard/ItemIcon` (ImageLabel)
- optional: role `ThanksButton` or path `ThanksButton` (GuiButton)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`EasyPetSystem.CashCounter`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.CashCounter`

**`EasyPetSystem.HatchReveal`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.HatchReveal`
- needed: path `Frame` (GuiObject): the card (a ViewportFrame; PetNameText and RarityText optional)

**`EasyPetSystem.HatchRevealTriple`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.HatchRevealTriple`
- needed: path `MainFrame` (GuiObject): holds one Frame card per pet, in order

**`EasyPetSystem.IndexButton`** HudButton, root GuiButton, opens `EasyPetSystem.IndexPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.IndexButton`, `TargetPanel`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`EasyPetSystem.IndexPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.IndexPanel`
- required: role `IndexGrid` or path `IndexView/Grid/Scroll` (ScrollingFrame)
- required: role `IndexCard` or path `IndexView/Grid/Scroll/CardTemplate` (GuiObject)
- required: role `IndexFilters` or path `IndexView/Filters` (GuiObject)
- required: role `IndexFilter` or path `IndexView/Filters/FilterTemplate` (GuiButton)
- optional: role `IndexCount` or path `IndexView/Count` (TextLabel)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`EasyPetSystem.PetsButton`** HudButton, root GuiButton, opens `EasyPetSystem.PetsPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.PetsButton`, `TargetPanel` = `Pets`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`EasyPetSystem.PetsPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Pets`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `EasyPetSystem.PetsPanel`
- required: role `PetsGrid` or path `Container/PetContainer/Container` (GuiObject)
- required: role `PetsInfo` or path `Container/PetInfo` (GuiObject)
- required: role `PetsViewport` or path `Container/PetInfo/ViewportFrame` (ViewportFrame)
- required: role `PetsName` or path `Container/PetInfo/PetName` (GuiObject)
- required: role `PetsAmount` or path `Container/PetInfo/Amount` (GuiObject)
- required: role `PetsEquip` or path `Container/PetInfo/Buttons/EquipButton` (GuiButton)
- required: role `PetsDelete` or path `Container/PetInfo/Buttons/DeleteButton` (GuiButton)
- required: role `PetsMerge` or path `Container/PetInfo/Buttons/MergeButton` (GuiButton)
- required: role `PetsOwn` or path `Container/PetAmount/Own` (GuiObject)
- required: role `PetsEquipped` or path `Container/PetAmount/Equip` (GuiObject)
- required: role `PetsEquipBest` or path `Container/Buttons/EquipBestButton` (GuiButton)
- required: role `PetsMergeAll` or path `Container/Buttons/MergeAllButton` (GuiButton)
- needed: tag `<...>PetTemplate` (GuiObject): a pet card template per rarity, tagged <Rarity>PetTemplate (CommonPetTemplate...)
- optional: role `PetsTabs` or path `Tabs` (GuiObject): the Collection, Eggs and Index tabs: roles PetsTabs, PetsEggsView, PetsIndexView, PetsCategories and PetsBody (the Collection view), all or none; inside each view its parts keep their names
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.ButtonDetails`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.ButtonDetails`
- optional: path `ButtonName` (TextLabel): the label style copied onto the Kernel's tooltip

**`GeneralUIKit.ChangelogsButton`** HudWidget, root GuiObject, opens `GeneralUIKit.ChangelogsPanel`
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.ChangelogsButton`
- needed: Action `TogglePanel` (GuiButton): opens Changelogs (Action TogglePanel, TargetPanel Changelogs)

**`GeneralUIKit.ChangelogsPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Changelogs`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.ChangelogsPanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.CodesButton`** HudButton, root GuiButton, opens `GeneralUIKit.CodesPanel`, gives the slot of `CodesSystem.CodesButton`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.CodesButton`, `TargetPanel` = `Codes`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.CodesPanel`** Panel, root GuiObject, gives the slot of `CodesSystem.CodesPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `Codes`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.CodesPanel`
- required: role `CodesBox` or path `Container/Code/TextBox` (TextBox): where the player types the code
- required: role `CodesRedeem` or path `Container/Button` (GuiButton): REDEEM (Action ClaimCode)
- optional: role `CodesError` or path `Container/ErrorText` (TextLabel): the refusal
- optional: role `CodesSuccess` or path `Container/SuccessText` (TextLabel): the confirmation
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.DailyRewardsButton`** HudButton, root GuiButton, opens `GeneralUIKit.DailyRewardsPanel`, gives the slot of `TimeRewardsSystem.DailyRewardsButton`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.DailyRewardsButton`, `TargetPanel` = `DailyRewards`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.DailyRewardsPanel`** Panel, root GuiObject, gives the slot of `TimeRewardsSystem.DailyRewardsPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `DailyRewards`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.DailyRewardsPanel`
- required: role `DailyDays` or path `Container/Days` (Instance): holds Day1..DayN (and the daily style attributes)
- needed: path `Container/Days/Day1` (GuiObject): one tile per day (DayLabel, Icon, Amount optional)
- needed: role `DayClaim` or path `Container/Days/Day1/ClaimButton` (GuiButton): claims that day (StatusText inside optional)
- optional: role `DailyProgressFill` or path `Container/Progress/Fill` (GuiObject): progress bar (and Progress/ProgressText)
- optional: role `DailyStreak` or path `Container/Footer/DailyStreak` (TextLabel): streak (and DailyTimeLeft, Footer/TimeLeft)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.EffectDetails`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.EffectDetails`
- optional: tag `GeneralUIKit_EffectNameLabel` (TextLabel): the effect's name
- optional: tag `GeneralUIKit_EffectDescriptionLabel` (TextLabel): the effect's description

**`GeneralUIKit.Effects`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.Effects`
- optional: tag `UI_EffectIcon` (GuiObject): an effect icon (attribute Description; its name is the title)

**`GeneralUIKit.GiftPanel`** Panel, root GuiObject, gives the slot of `DatastorePurchaseSystem.GiftPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `Gift`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.GiftPanel`
- required: role `PlayerList` or path `Container/Content/PlayerList` (GuiObject)
- required: role `PlayerTemplate` or path `Container/Content/PlayerList/PlayerTemplate` (GuiButton)
- required: role `PlayerName` or path `Container/Content/PlayerList/PlayerTemplate/PlayerName` (TextLabel)
- required: role `ConfirmButton` or path `Container/Content/Buttons/ConfirmButton` (GuiButton)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.GiftReceivedPanel`** Panel, root GuiObject, gives the slot of `DatastorePurchaseSystem.GiftReceivedPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `GiftReceived`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.GiftReceivedPanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.IndexButton`** HudButton, root GuiButton, opens `GeneralUIKit.IndexPanel`, gives the slot of `EasyPetSystem.IndexButton`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.IndexButton`, `TargetPanel` = `Index`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.IndexPanel`** Panel, root GuiObject, gives the slot of `EasyPetSystem.IndexPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `Index`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.IndexPanel`
- required: role `IndexGrid` or path `IndexView/Grid/Scroll` (ScrollingFrame)
- required: role `IndexCard` or path `IndexView/Grid/Scroll/CardTemplate` (GuiObject)
- required: role `IndexFilters` or path `IndexView/Filters` (GuiObject)
- required: role `IndexFilter` or path `IndexView/Filters/FilterTemplate` (GuiButton)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.InviteFriends`** HudWidget, root GuiObject
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.InviteFriends`
- needed: any GuiButton (GuiButton): the invite button (gets Action InviteFriends)

**`GeneralUIKit.PetsButton`** HudButton, root GuiButton, opens `GeneralUIKit.PetsPanel`, gives the slot of `EasyPetSystem.PetsButton`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.PetsButton`, `TargetPanel` = `Pets`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.PetsPanel`** Panel, root GuiObject, gives the slot of `EasyPetSystem.PetsPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `Pets`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.PetsPanel`
- required: role `PetsGrid` or path `Container/PetContainer/Container` (GuiObject)
- required: role `PetsInfo` or path `Container/PetInfo` (GuiObject)
- required: role `PetsViewport` or path `Container/PetInfo/ViewportFrame` (ViewportFrame)
- required: role `PetsName` or path `Container/PetInfo/PetName` (GuiObject)
- required: role `PetsAmount` or path `Container/PetInfo/Amount` (GuiObject)
- required: role `PetsEquip` or path `Container/PetInfo/Buttons/EquipButton` (GuiButton)
- required: role `PetsDelete` or path `Container/PetInfo/Buttons/DeleteButton` (GuiButton)
- required: role `PetsMerge` or path `Container/PetInfo/Buttons/MergeButton` (GuiButton)
- required: role `PetsOwn` or path `Container/PetAmount/Own` (GuiObject)
- required: role `PetsEquipped` or path `Container/PetAmount/Equip` (GuiObject)
- required: role `PetsEquipBest` or path `Container/Buttons/EquipBestButton` (GuiButton)
- required: role `PetsMergeAll` or path `Container/Buttons/MergeAllButton` (GuiButton)
- needed: tag `<...>PetTemplate` (GuiObject): a pet card template per rarity, tagged <Rarity>PetTemplate (CommonPetTemplate...)
- optional: role `PetsTabs` or path `Tabs` (GuiObject): the Collection, Eggs and Index tabs: roles PetsTabs, PetsEggsView, PetsIndexView, PetsCategories and PetsBody (the Collection view), all or none; inside each view its parts keep their names
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.RebirthButton`** HudButton, root GuiButton, opens `GeneralUIKit.RebirthPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.RebirthButton`, `TargetPanel` = `Rebirth`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.RebirthPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Rebirth`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.RebirthPanel`
- optional: tag `UI_Requirement` (GuiObject): the requirement bar (RequiredAmount, RequirementPath; children Amount and Progress/Fill)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.RewardsButton`** HudButton, root GuiButton, opens `GeneralUIKit.RewardsPanel`, gives the slot of `TimeRewardsSystem.RewardsButton`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.RewardsButton`, `TargetPanel` = `Rewards`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: role `HudTime` or path `Time` (TextLabel): countdown to the next gift
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.RewardsPanel`** Panel, root GuiObject, gives the slot of `TimeRewardsSystem.RewardsPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `Rewards`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.RewardsPanel`
- required: role `RewardsGifts` or path `Container/Gifts` (Instance): holds Gift1..GiftN, one per gift
- needed: role `GiftButtonFrame` or path `Container/Gifts/Gift1/ButtonFrame` (GuiObject): each GiftN has ButtonFrame (until claimed) and RewardFrame (after)
- needed: role `GiftRewardFrame` or path `Container/Gifts/Gift1/RewardFrame` (GuiObject): shown once claimed (Reward/ImageLabel and Reward/AmountText inside)
- needed: role `GiftClaim` or path `Container/Gifts/Gift1/ButtonFrame/ClaimButton` (GuiButton): claims the gift (without it the gift cannot be claimed)
- optional: role `GiftTimeLeft` or path `Container/Gifts/Gift1/ButtonFrame/TimeLeftText` (TextLabel): time left for that gift
- optional: role `RewardsClaimed` or path `Container/ClaimedRewards` (TextLabel): n/N claimed
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.SettingsButton`** HudButton, root GuiButton, opens `GeneralUIKit.SettingsPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.SettingsButton`, `TargetPanel` = `Settings`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.SettingsPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Settings`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.SettingsPanel`
- optional: Action `ToggleMusicMute` (GuiButton): Sound System: music on or off (a Status label inside shows ON or OFF)
- optional: Action `ToggleSFXMute` (GuiButton): Sound System: sound effects on or off
- optional: attribute `VolumeGroup` (GuiObject): a volume bar (VolumeGroup Music or SFX, with VolumeFrame/Volume1..9 inside; buttons MusicVolumeUp/Down, SFXVolumeUp/Down)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.ShopButton`** HudButton, root GuiButton, opens `GeneralUIKit.ShopPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.ShopButton`, `TargetPanel` = `Shop`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.ShopPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Shop`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.ShopPanel`
- needed: Action `BuyX3Eggs` (GuiButton): Easy Pet System sells its 3-eggs pass here (it warns without it)
- needed: Action `BuyAutoHatch` (GuiButton): Easy Pet System's auto-hatch pass
- needed: Action `BuyExtraPetSpace` (GuiButton): Easy Pet System's extra pet space pass
- optional: role `GiftButton` or path `Container/ScrollingContainer/Frame/X2Luck/BuyRow/GiftButton` (GuiButton)
- optional: attribute `GamePassId` (GuiButton): a buy button with GamePassId (or ProductId); its price label is named Amount
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.SpinButton`** HudButton, root GuiButton, opens `GeneralUIKit.SpinPanel`, gives the slot of `RouletteSystem.SpinButton`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.SpinButton`, `TargetPanel` = `Spin`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: role `HudTime` or path `Time` (TextLabel): free spin countdown
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.SpinPanel`** Panel, root GuiObject, gives the slot of `RouletteSystem.SpinPanel`
- required: the root carries tag `UI_Panel`, `PanelId` = `Spin`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.SpinPanel`
- required: role `SpinWheel` or path `Roulette` (GuiObject): the wheel that turns
- required: role `SpinSlots` or path `Roulette/Rewards` (Instance): holds the slots Reward1..RewardN (each a Frame with RewardText and Icon)
- required: role `SpinArrow` or path `Arrow` (GuiObject): the slot under it wins
- optional: role `GiftButton` or path `BuyButtons/+1Spin/GiftButton` (GuiButton)
- optional: path `Buttons/SpinButton` or Action `Spin` (GuiButton): spins (Action Spin; hidden while spinning)
- optional: path `BuyButtons/+1Spin/BuyButton` or Action `Buy1Spin` (GuiButton): buys 1 spin (Action Buy1Spin; likewise Buy3Spin, Buy10Spin)
- optional: role `SpinSkip` or path `Buttons/SkipButton` (GuiButton): skips the spin animation
- optional: role `SpinCount` or path `SpinsText` (TextLabel): spins left
- optional: role `SpinTimer` or path `TimerText` (TextLabel): time to the free spin
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.TeleportButton`** HudButton, root GuiButton, opens `GeneralUIKit.TeleportPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.TeleportButton`, `TargetPanel` = `Teleport`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.TeleportPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Teleport`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.TeleportPanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.TradeButton`** HudButton, root GuiButton, opens `GeneralUIKit.TradePanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.TradeButton`, `TargetPanel` = `Trade`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.TradeInventoryPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `TradeInventory`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.TradeInventoryPanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.TradePanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Trade`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.TradePanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.TradeRequestPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `TradeRequest`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.TradeRequestPanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`GeneralUIKit.UpgradesButton`** HudButton, root GuiButton, opens `GeneralUIKit.UpgradesPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.UpgradesButton`, `TargetPanel` = `Upgrades`
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`GeneralUIKit.UpgradesPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Upgrades`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `GeneralUIKit.UpgradesPanel`
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`NotificationsSystem.NotificationLayer`** Layer, root ScreenGui
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `NotificationsSystem.NotificationLayer`
- required: path `Templates` (Instance): one card per template, found by name (TitleOnly, TitleSubtitle, ImageTitle, ImageTitleSubtitle, Banner, BannerSubtitle, Alert)
- needed: path `Templates/TitleOnly` (GuiObject): the template the packs use most (a missing template drops its notifications with a warning)
- optional: path `Templates/TitleOnly/Title` (TextLabel): a card's Title (likewise Subtitle and Image)

**`RouletteSystem.SpinButton`** HudButton, root GuiButton, opens `RouletteSystem.SpinPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `RouletteSystem.SpinButton`, `TargetPanel` = `Spin`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: role `HudTime` or path `Time` (TextLabel): free spin countdown
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`RouletteSystem.SpinPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Spin`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `RouletteSystem.SpinPanel`
- required: role `SpinWheel` or path `Roulette` (GuiObject): the wheel that turns
- required: role `SpinSlots` or path `Roulette/Rewards` (Instance): holds the slots Reward1..RewardN (each a Frame with RewardText and Icon)
- required: role `SpinArrow` or path `Arrow` (GuiObject): the slot under it wins
- optional: path `Buttons/SpinButton` or Action `Spin` (GuiButton): spins (Action Spin; hidden while spinning)
- optional: path `BuyButtons/+1Spin/BuyButton` or Action `Buy1Spin` (GuiButton): buys 1 spin (Action Buy1Spin; likewise Buy3Spin, Buy10Spin)
- optional: role `SpinSkip` or path `Buttons/SkipButton` (GuiButton): skips the spin animation
- optional: role `SpinCount` or path `SpinsText` (TextLabel): spins left
- optional: role `SpinTimer` or path `TimerText` (TextLabel): time to the free spin
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`SoundSystem.MusicPlayer`** Layer, root ScreenGui
- required: the root carries `RBLXE_Contract` = `1`, `RBLXE_Piece` = `SoundSystem.MusicPlayer`
- needed: tag `MusicPlayerFrame` (GuiObject): a music player frame (tag MusicPlayerFrame) with Container/Buttons
- optional: tag `MusicPlayerFrame` then path `Container/Buttons/Mute` (GuiButton): music on or off (Next likewise; Container/SongName and Container/Duration labels)

**`TimeRewardsSystem.DailyRewardsButton`** HudButton, root GuiButton, opens `TimeRewardsSystem.DailyRewardsPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `TimeRewardsSystem.DailyRewardsButton`, `TargetPanel` = `DailyRewards`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`TimeRewardsSystem.DailyRewardsPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `DailyRewards`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `TimeRewardsSystem.DailyRewardsPanel`
- required: role `DailyDays` or path `Container/Days` (Instance): holds Day1..DayN (and the daily style attributes)
- needed: path `Container/Days/Day1` (GuiObject): one tile per day (DayLabel, Icon, Amount optional)
- needed: role `DayClaim` or path `Container/Days/Day1/ClaimButton` (GuiButton): claims that day (StatusText inside optional)
- optional: role `DailyProgressFill` or path `Container/Progress/Fill` (GuiObject): progress bar (and Progress/ProgressText)
- optional: role `DailyStreak` or path `Container/Footer/DailyStreak` (TextLabel): streak (and DailyTimeLeft, Footer/TimeLeft)
- optional: Action `ClosePanel` (GuiButton): closes the menu

**`TimeRewardsSystem.RewardsButton`** HudButton, root GuiButton, opens `TimeRewardsSystem.RewardsPanel`
- required: the root carries tag `UI_Interactable`, `Action` = `TogglePanel`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `TimeRewardsSystem.RewardsButton`, `TargetPanel` = `Rewards`
- optional: role `HudBadge` or path `Notification` (GuiObject): badge shown while something is ready
- optional: role `HudTime` or path `Time` (TextLabel): countdown to the next gift
- optional: path `Icon` (GuiObject): grows on hover (the Kernel's icon hover)

**`TimeRewardsSystem.RewardsPanel`** Panel, root GuiObject
- required: the root carries tag `UI_Panel`, `PanelId` = `Rewards`, `RBLXE_Contract` = `1`, `RBLXE_Piece` = `TimeRewardsSystem.RewardsPanel`
- required: role `RewardsGifts` or path `Container/Gifts` (Instance): holds Gift1..GiftN, one per gift
- needed: role `GiftButtonFrame` or path `Container/Gifts/Gift1/ButtonFrame` (GuiObject): each GiftN has ButtonFrame (until claimed) and RewardFrame (after)
- needed: role `GiftRewardFrame` or path `Container/Gifts/Gift1/RewardFrame` (GuiObject): shown once claimed (Reward/ImageLabel and Reward/AmountText inside)
- needed: role `GiftClaim` or path `Container/Gifts/Gift1/ButtonFrame/ClaimButton` (GuiButton): claims the gift (without it the gift cannot be claimed)
- optional: role `GiftTimeLeft` or path `Container/Gifts/Gift1/ButtonFrame/TimeLeftText` (TextLabel): time left for that gift
- optional: role `RewardsClaimed` or path `Container/ClaimedRewards` (TextLabel): n/N claimed
- optional: Action `ClosePanel` (GuiButton): closes the menu

<!-- theme-contract:en:end -->
