El manual de zenit
Construye interfaces de escritorio para macOS verdaderamente nativas en Zig. zenit reúne ventanas, renderizado en GPU, texto, métodos de entrada y accesibilidad en un modelo de UI claro; este manual te lleva de tu primera ventana a una app de producción mantenible.
const std = @import("std");
const ui = @import("ui");
const App = @import("zenit_app").App;
fn mountUi(cx: *ui.Cx, _: *ui.Scope) anyerror!*ui.Node {
return ui.text(cx, "Hello, zenit!", .{
.font_size = cx.tokens.font_size.xxxl,
.color = cx.tokens.color.fg_primary,
});
}
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const app = try App.init(gpa.allocator(), .{
.window = .{ .title = "Hello" },
});
defer app.deinit();
try app.runWith(mountUi);
}Ruta de aprendizaje
Recórrela una vez, en orden —unos 45 minutos— y tendrás el modelo mental completo para crear apps con zenit por tu cuenta.
La arquitectura que usarás
Las apps dependen solo de la capa pública estable; zenit se encarga de la plataforma y el renderizado.
zenit.attach(dep, exe) añade exactamente dos importaciones de módulo a tu ejecutable —ui y zenit_app—, luego compila los puentes nativos y enlaza los frameworks del sistema. Los módulos internos ni siquiera están en tu grafo de compilación: no es “mejor no usarlos”, es “no se puede”.Más que un conjunto de APIs
Estas tres capacidades atraviesan el runtime, el stack de texto y las herramientas; cada una está respaldada por una demo ejecutable y evidencia en ventana real.
Tres principios
Síguelos y tu código se mantendrá claro mientras zenit siga evolucionando rápido.
Usa ui.*, ui.<group>.* y zenit_app.App; nunca entres en los directorios internos.
El estado persistente vive en Signals o en estado enlazado; deriva con Memo y aplica efectos secundarios con Effect.
Color, tipografía, espaciado y radios vienen del tema; cuando debas salirte de la escala, decláralo con ui.arb.