Elm-style declarative UI framework for MoonBit, built on GTK4
Dependencies
fn main {
@giraffe.app(
model={ count: 0 },
update=(model, message) => {
match message {
Increment => { count: model.count + 1 }
Decrement => { count: model.count - 1 }
}
},
render=(model, dispatch) => {
@giraffe.window(
title="Counter",
@giraffe.box(spacing=12) [
@giraffe.label(text="\{model.count}"),
@giraffe.button(label="+", on_clicked=dispatch(Increment)),
@giraffe.button(label="-", on_clicked=dispatch(Decrement)),
],
)
},
)
}| Module | Role |
|---|---|
| app.mbt | State management, dispatch loop, idle-based re-rendering |
| widget.mbt | Virtual widget tree definition and children types |
| iwidget.mbt | Internal GTK widget wrappers |
| reconcile.mbt | Widget tree diffing and patching |
| cmd.mbt | Command type for dispatching side effects |
fn[Model, Message, Effect] effect(update : (Model, Message) -> (Model, Effect), handle : (Effect, (Message) -> Unit) -> Unit) -> Update[Model, Message]fn[Message] entry(text? : String, placeholder? : String, hexpand? : Bool, on_changed~ : (String) -> Message, on_activate? : Message) -> VWidget[Message]fn[Message] scrolled_window(hscrollbar_policy? : PolicyType, vscrollbar_policy? : PolicyType, vexpand? : Bool, child : VWidget[Message]) -> VWidget[Message]Elm-style declarative UI framework for MoonBit, built on GTK4
Dependencies