Um gráfico, nas unidades do próprio programa
import hive.ui
// Doze de largura e cem de altura, então um mês de 68 quilos é desenhado
// com 68 de comprimento e nada precisa virar pixel primeiro.
func chart(harvest: Int[]): ui.View {
mut ui.Mark[dyn] marks = []
for i := 0; i < len(harvest); i++ {
if harvest bounds i {
tall := hive.conv.itf(harvest[i])
// Um bar é posicionado pelo seu meio, e é por isso que o chão
// é 100 e o meio de um em pé sobre ele fica meia barra acima.
append(marks, ui.bar([ui.paint(ui.Tone.Good())],
hive.conv.itf(i) + 0.5, 100.0 - tall / 2.0, 0.7, tall))
}
}
append(marks, ui.words([ui.paint(ui.Tone.Muted())], 6.0, 8.0, 7.0, "kg por mês"))
return ui.canvas([
ui.width(480),
ui.height(200),
ui.region(0.0, 0.0, 12.0, 100.0),
], marks)
}
proc main(): void {
// A mesma árvore que uma window trocaria é a que uma página escreve.
echo len(ui.page("Colheita", chart([31, 44, 58, 72, 68, 51])))
}
Uma linha, um anel e uma palavra
import hive.ui
proc main(): void {
// Uma linha através de cinco lugares — x, y, x, y — e um anel sobre o
// último deles, que é um dot e por isso não precisou de nome próprio.
trace := ui.path([ui.thick(0.15), ui.paint(ui.Tone.Good())],
[0.0, 2.0, 1.0, 5.0, 2.0, 4.0, 3.0, 8.0, 4.0, 7.0])
tip := ui.dot([ui.paint(ui.Tone.Good())], 4.0, 7.0, 0.2)
// words fica centralizado no lugar, e sua altura também está nas
// unidades da região — então esta tem um doze avos do plano em que está.
label := ui.words([ui.paint(ui.Tone.Muted())], 4.0, 8.4, 0.8, "agora")
view := ui.canvas([
ui.width(360),
ui.height(200),
ui.region(-0.5, 0.0, 5.5, 10.0),
], [trace, tip, label])
echo ui.html(view)
}