AlignChild
layout.AlignChild wraps a single component with explicit cross-axis alignment — the per-child counterpart to VBox.WithHAlign / HBox.WithVAlign. Use it when one child in a box needs different alignment from the rest, or when the child component does not expose its own WithHAlign/WithVAlign builder.
Constructor
func NewAlignChild(child oat.Component, h oat.HAlign, v oat.VAlign) *AlignChild
h—oat.HAlignFill,HAlignLeft,HAlignCenter, orHAlignRightv—oat.VAlignFill,VAlignTop,VAlignMiddle, orVAlignBottom
Pass oat.HAlignFill or oat.VAlignFill for the axis you do not want to constrain.
Basic usage
// Save pinned right, Cancel pinned left — no spacers needed.
vbox := layout.NewVBox(
layout.NewAlignChild(saveBtn, oat.HAlignRight, oat.VAlignFill),
layout.NewAlignChild(cancelBtn, oat.HAlignLeft, oat.VAlignFill),
)
Priority
AlignChild takes highest priority in the alignment resolution order:
AlignChildwrapper — wins unconditionally.- Child's own
BaseComponent.HAlign/VAlign(if non-fill). - Box-wide default (
WithHAlign/WithVAlignon the box). HAlignFill/VAlignFillfallback.
Scope — direct children only
Like all alignment, AlignChild is only honoured on the direct child of the distributing box. If you wrap a Border in an AlignChild and place it in an HBox, the HBox reads the AlignChild's VAlign. The inner widget's alignment is irrelevant to the HBox.
Combining with flex
AlignChild is not a FlexSpacer — it does not claim flex space on its own. Wrap it with AddFlexChild or NewFlexChild when you also need it to participate in flex distribution:
// Flex child that is also right-aligned in its slot:
vbox.AddFlexChild(
layout.NewAlignChild(headerWidget, oat.HAlignRight, oat.VAlignFill),
1,
)
// Inline using NewFlexChild:
vbox := layout.NewVBox(
layout.NewFlexChild(
layout.NewAlignChild(headerWidget, oat.HAlignRight, oat.VAlignFill),
),
btnRow,
)
Theme and focus propagation
AlignChild implements oat.Layout via Children(), so theme propagation and focus collection recurse into the wrapped component automatically — exactly like FlexChild.
Examples
Bottom-aligned status chip in an HBox
row := layout.NewHBox(
layout.NewFlexChild(nameText, 1),
layout.NewAlignChild(statusChip, oat.HAlignFill, oat.VAlignBottom),
)
Centred button row in a VBox
btnRow := layout.NewHBox(cancelBtn, layout.NewHGap(2), okBtn)
vbox := layout.NewVBox(
layout.NewFlexChild(contentArea),
layout.NewAlignChild(btnRow, oat.HAlignCenter, oat.VAlignFill),
)
Mixed alignment in one VBox
vbox := layout.NewVBox(
layout.NewAlignChild(widget.NewText("Welcome"), oat.HAlignCenter, oat.VAlignFill),
layout.NewFlexChild(bodyContent),
layout.NewAlignChild(widget.NewText("Sign in →"), oat.HAlignRight, oat.VAlignFill),
)