ezel 0.0.1

A good plotting library
Documentation
## Layout

- inequality
- var.suggest_value()
- var.add_edit_variable


GridLayout {
    row1+...rown = grid.height (REQUIRED)
    col1+...+coln = grid.width (REQUIRED)
    row1=row2=...grid.height / n (WEAK)
    col1=col2=...grid.height / n (WEAK)
}


render() {
    self.layout()
}

layout() {
    // visit all nodes, add constraint
    ();
}

add_layout_constraint(&self) {
    
}

1. layout(size)
    each child . add_layout_constraint()

2. draw
    - 


## entrypoint draw methods
```rs
axis.draw_to_ctx(size, ctx)
axis.draw_to_png(size, path)
axis.draw_to_pdf(size, path)
```

## internal nodes draw methods

```
axis.render(ctx)
axis.layout(solver)
```

## Protrusion

- Does every widget have protrusion? Y
- Can a user manually align protrusions? Y
- 

A Protrusion is a property of a widget, not a property of a grid.
This means we can have a protrusion without a grid.
For example, the root widget can be an axis with a title in its top protrusion.