Renderizado GPU con Metal
render · gpuRenderers de SDF, texto e imagen con triple búfer; la finalización en la GPU se solapa con el layout en la CPU.
Un framework de UI por GPU de alto rendimiento para Zig. Signals, recetas de estilo, flex / grid y DevTools se sienten como la web; el renderizado con Metal y un camino completo de texto e IME entregan una app nativa: una Hello Button.app en ReleaseSmall ocupa 1.7 MB.
El código completo de examples/hello_button/main.zig y la .app que produce al compilar. Las imágenes de la ventana las graba el E2E harness, que pulsa el botón tres veces en la ventana real.
const std = @import("std");const ui = @import("ui");const App = @import("zenit_app").App; /// 样式表:具名纯函数 + 应用层自定义 recipe,与业务逻辑分离。const S = @import("styles.zig"); const Counter = struct { n: u32 = 0, label: ?*ui.Node = null, buf: [32]u8 = undefined, pub fn increment(self: *Counter) void { self.n += 1; const node = self.label orelse return; const content = std.fmt.bufPrint(&self.buf, "Clicked {d} times", .{self.n}) catch return; if (node.getText()) |old| { var t = old; t.content = content; node.setText(t); } node.markRenderDirty(); }}; fn mountUI(cx: *ui.Cx, scope: *ui.Scope) anyerror!*ui.Node { const allocator = cx.allocator; const counter = try cx.bindState(Counter, .{}); const click = cx.on(Counter, counter, Counter.increment); const root = try ui.boxStyled(cx, S.root, .{}); try root.appendChild(allocator, try ui.textStyled(cx, S.title, "Hello, zenit!")); try root.appendChild(allocator, try ui.widgets.Button(.{ .label = "Click me", .variant = .primary, .size = .md, .on_click = click, }).mount(scope, cx)); // 应用层自定义 recipe(styles.zig 的 PanelRecipe)包住计数文本 const panel = try ui.boxStyled(cx, S.panel(.highlight), .{}); const label = try ui.textStyled(cx, S.counterLabel, "Clicked 0 times"); try panel.appendChild(allocator, label); try root.appendChild(allocator, panel); counter.label = label; return root;} pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); const app = try App.init(gpa.allocator(), .{ .window = .{ .width = 640, .height = 480, .title = "Hello Button" }, }); defer app.deinit(); try app.runWith(mountUI);}zenit-ui-dev es una Agent Skill destilada del propio framework zenit y del historial de un editor de macOS en producción construido con él: elección de componentes, las tres capas de estilo, Signals, integración nativa, autoverificación por capturas y decenas de entradas trampa → causa → solución. Colócala en ~/.claude/skills y tu agente la cargará cada vez que escriba código zenit.
~/.claude/skills/zenit-ui-dev/
Pencilpen.devTe recomendamos diseñar en Pencil y dejar que tu agente lo construya con esta Skill. El layout Flex, los espaciados, los radios, los tamaños de texto y los iconos lucide de un archivo .pen están muy cerca del modelo de zenit; la Skill incluye una tabla de correspondencia de campos y una herramienta design_diff para que el agente traslade el diseño con números y no a ojo.
Sin WebView, sin DOM virtual. El árbol de UI emite una lista plana de DisplayItem que consumen directamente los renderers de Metal.
render · gpuRenderers de SDF, texto e imagen con triple búfer; la finalización en la GPU se solapa con el layout en la CPU.
Signal · Memo · createEffectSin reconstruir el árbol, sin diffing. Una dependencia llega exactamente a los nodos que la leen.
text · text_coreUnicode 17, bidi UAX #9, límites de grafemas UAX #29 y preedit / commit de extremo a extremo.
ui.devtools · harnessLocalizadores semánticos, un cursor virtual, capturas Retina y MP4 a nivel de drawable. DevTools incluidas.

La plataforma, el renderizado y el texto viven por debajo. El límite se impone en tiempo de compilación: un import prohibido no compila.
El objetivo en Debug para las interacciones básicas, incluidos el desplazamiento, el movimiento del cursor y la escritura en listas virtuales de decenas de miles de filas. Apple silicon serie M.
layout_isolation cortan las cascadas de dirtygit clone https://github.com/version-next/zenit.git cp -R zenit/templates/minimal-app ./myapp
Incluye build.zig, build.zig.zon y src/main.zig.
zenit.attach(zenit_dep, exe);
Una sola llamada conecta ui, zenit_app, los puentes nativos y los frameworks.
zig build run zig build app
Ejecuta directamente o genera una .app de macOS que se abre con doble clic.
0.1.0 es la primera versión pública, pero la API aún puede cambiar antes de 1.0. Fija una versión exacta; cada cambio incompatible queda registrado en MIGRATION.
Proyectos existentes de la comunidad, grabados en ventanas reales.
0:18ComunidadIDE de código (nativo)Conectado a un servidor de lenguaje TypeScript real: autocompletado mientras escribes, ayuda de firmas y documentación al pasar el cursor. La lista de sugerencias, los popovers, el editor y el minimapa los dibuja zenit en la GPU.
1:09ComunidadEditor Markdown WYSIWYGUn editor de documentos nativo completo: listas, listas de tareas, citas y numeración multinivel toman forma mientras escribes, y tablas, diagramas de flujo, bloques de código y capturas conviven en el mismo documento. Sin Electron, sin WebView: cada píxel lo dibuja zenit.
2:22ComunidadCurso de síntesis y piano roll (nativo)Aprende síntesis mientras diseñas sonidos: un curso integrado explica los filtros paso a paso, y cada perilla mueve en vivo la curva del filtro, las envolventes y el espectro. Después escribe la canción en un piano roll de 7 pistas: cada nota suena con el sintetizador de la propia app. Haz clic para verlo con sonido.Ya hay socios creando con zenit una herramienta de diseño de lienzo infinito, un IDE de código, un descargador de vídeos… Un mismo conjunto de nodos, estilos y capacidades nativas que sostiene productos muy distintos.
Zoom, arrastre y selección múltiple en la GPU, con paneles de vidrio líquido flotando sobre el lienzo.
Archivos grandes virtualizados, un camino completo de IME, paletas multiventana y menús nativos.
Tareas en segundo plano con progreso en vivo, y archivos terminados que se arrastran directamente al Finder.
El framework no tiene techo. Empieza con una ventana y construye la app de Mac que tienes en mente.
Empieza a construirDiseñador o desarrollador: si te molesta un frame perdido, un cursor que llega un tick tarde o una curva de easing que no se siente bien, eres justo a quien buscamos. Ayúdanos a pulir zenit hasta convertirlo en el framework de UI nativo de GPU más querido, con la mejor DX y el mejor rendimiento.