ShelfWidgetStageScaffold
An asymmetric cutout-wrapping layout with a full-height leading stage (artwork or drop target) and cutout-cleared trailing column.
@MainActor struct ShelfWidgetStageScaffold<Stage, Trailing, Content, Footer> where Stage : View, Trailing : View, Content : View, Footer : View
When wrapped around a notch or camera island pill, the leading stage stays at the top-leading corner and clamps strictly within wrap.bandWidth so it never touches the hardware cutout, optional trailing controls sit inside the top-trailing wing, and content + footer center vertically below the cutout floor. Outside wrapped mounts, stage and the right column align normally across the full card height.
Available from DroppyKit 1.24.0; a droplet that uses it declares minAPI 1.24.0.
Initializers
init(stageWidth:spacing:stage:content:)
@MainActor init(stageWidth: CGFloat? = nil, spacing: CGFloat = DroppySpacing.md, @ViewBuilder stage: () -> Stage, @ViewBuilder content: () -> Content)
init(stageWidth:spacing:stage:content:footer:)
@MainActor init(stageWidth: CGFloat? = nil, spacing: CGFloat = DroppySpacing.md, @ViewBuilder stage: () -> Stage, @ViewBuilder content: () -> Content, @ViewBuilder footer: () -> Footer)
init(stageWidth:spacing:stage:trailing:content:)
@MainActor init(stageWidth: CGFloat? = nil, spacing: CGFloat = DroppySpacing.md, @ViewBuilder stage: () -> Stage, @ViewBuilder trailing: () -> Trailing, @ViewBuilder content: () -> Content)
init(stageWidth:spacing:stage:trailing:content:footer:)
@MainActor init(stageWidth: CGFloat? = nil, spacing: CGFloat = DroppySpacing.md, @ViewBuilder stage: () -> Stage, @ViewBuilder trailing: () -> Trailing, @ViewBuilder content: () -> Content, @ViewBuilder footer: () -> Footer)
Properties
body
@MainActor var body: some View { get }