Appearance
Custom buttons and confirmations
The standalone sample includes WBP_ForgeActionButton and WBP_ForgeConfirmation under /Game/UI/Blueprint. Their Designer trees and event graphs are editable. No Game Master widget tree or artwork was used.
A custom button in Blueprint
Create a Widget Blueprint with parent IFButton. You can use any layout. For automatic label typography and visible focus, name an optional Text Block LabelWidget, and an optional Border FocusBorder. Each binding is independent; both are optional. Set Label updates the bound label. Theme, enlarged text, hover, navigation focus and enabled state update the bound controls. Set Label Alignment in class defaults.
For other artwork implement Event On Appearance Updated. It supplies Theme, Presentation, Navigation Focused, Hovered and Enabled. The sample reads Theme → Accent and calls Set Brush Color on its narrow AccentMark. The base supplies CommonUI click/back routing, input presentation, sounds and focus styling. You can omit the optional controls and implement all visuals in this event.
CommonUI's standard On Button Base Clicked event remains your action hook. A hover does not imply keyboard focus. Use Navigation Focused to distinguish keyboard/controller navigation from pointer hover. Don't duplicate input detectors in each button.
A custom confirmation
Create a Widget Blueprint with parent IFDialog. Add an InterfaceForge Surface, IFText labels and your own IFButton Blueprint controls. Implement these graphs:
flowchart LR
A[Event Initialize Screen] --> B[Parent: Initialize Screen]
B --> C[Get Dialog Data]
C --> D[Set Text: Title and Message]
C --> E[Set Label: Confirm and Cancel]
F[Event On Initialized] --> G[Set Initial Focus: Cancel button]
H[Cancel: On Button Base Clicked] --> I[Reply: Cancelled]
J[Confirm: On Button Base Clicked] --> K[Reply: Confirmed]
Call the parent initialization before reading dialog data. It runs each time a pooled dialog receives new data; Construct alone is insufficient. The base cancels on Back and emits one completion result. Your Blueprint calls Reply; it doesn't broadcast completion itself.
On the player's IFRootLayout, set Default Dialog Class to your custom Blueprint. Construct an IFDialogData object, set its text and bind On Completed, then call Push Dialog. A missing data object returns None. With a valid class/data pair, the dialog enters the Modal layer. Push Screen remains available for explicit per-call classes.
The default native dialog uses a 560-unit preferred width, minimum desired height 280 and maximum desired height 480 inside a Scale Box (Scale To Fit, Down Only). Short confirmations remain compact; long messages can grow within the cap. Title and actions remain outside a Fill-sized message Scroll Box. Native actions use a wrapping row. The sample WBP_ForgeConfirmation applies the same bounded-message pattern with normal Designer widgets: place DialogMessage inside Scroll Box, set its Vertical Box slot to Fill, keep confirmation buttons below it, and allow focus scrolling. Set Min Desired Height and Max Desired Height on the containing Size Box instead of forcing one height. Text changes still use the existing Initialize Screen → Set Text graph. Long messages must not push exit actions beyond the viewport. The fit choice can reduce a card when space is insufficient; choose your own reflow strategy in Blueprint where required.
Expected: initial Cancel focus; Enter/controller accept activates the chosen button; Escape/configured Back cancels; opener focus returns. A new prompt must replace previous text. Confirmation results belong to the calling game adapter, not to InterfaceForge.
Observed verification
UE5.6.1 Win64 DX11 editor-game, automated mouse/keyboard: source build and authored asset compilation passed; menu Quit prompt populated; Escape cancelled; the same class accepted different expedition-return data; Ember updated surface, label/marker and focus; Enter activated custom Cancel; Right moved to custom Confirm; Enter confirmed and returned to Main. Screenshot: Evidence/Visual/BlueprintDialog-CustomFocus-UE56.jpg. Archived BlueprintSlice also passed the cooked custom dialog's cancel/restored focus/reopen/Right/confirm/return flow; see Evidence/PACKAGED_BLUEPRINT_SLICE.md. Physical controller/touch, extreme long localized text and the later responsive-wrapper recook remain open.
The later bounded-message revision was inspected live at 800×600 with 150% UI and text scales: both Blueprint/native dialogs reached the final paragraph with long action labels visible. Blueprint Escape and native Tab → Right → Enter returned one result each, restored the preview settings and Main focus. The short Quit prompt still displayed correctly and Cancel restored Quit focus. Evidence/LONG_DIALOGS.md records captures, logs and remaining translation/device/package gates.