#import "modules/ui/types.sx";
#import "modules/ui/render.sx";
#import "modules/ui/events.sx";

View :: protocol {
    // Measure: given a size proposal, return desired size
    size_that_fits :: (proposal: ProposedSize) -> Size;

    // Place: position children within the given bounds
    layout :: (bounds: Frame);

    // Render: emit render nodes
    render :: (ctx: *RenderContext, frame: Frame);

    // Event handling: return true if the event was consumed
    handle_event :: (event: *Event, frame: Frame) -> bool;
}

// A child view with its computed frame (set during layout)
ViewChild :: struct {
    view: View;
    computed_frame: Frame = .zero();
}
