Rendu GPU Metal
render · gpuRenderers SDF, texte et image en triple tampon ; l’achèvement GPU chevauche le layout CPU.
Un framework d’UI GPU haute performance pour Zig. Signals, recettes de style, flex / grid et DevTools se manient comme sur le web ; le rendu Metal et une chaîne texte et IME complète livrent une app native : une Hello Button.app en ReleaseSmall pèse 1.7 MB.
Le source complet de examples/hello_button/main.zig, et la .app qu’il produit. Les images de la fenêtre sont enregistrées par le harness E2E, qui clique trois fois sur le bouton dans la vraie fenêtre.
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 est une Agent Skill tirée du framework zenit lui-même et de l’historique d’un éditeur macOS en production construit avec : choix des composants, les trois couches de style, Signals, intégration native, autovérification par captures d’écran, et des dizaines d’entrées piège → cause → correctif. Déposez-la dans ~/.claude/skills et votre agent la charge dès qu’il écrit du code zenit.
~/.claude/skills/zenit-ui-dev/
Pencilpen.devNous recommandons de concevoir dans Pencil et de laisser votre agent l’implémenter avec cette Skill. Le layout Flex, les espacements, les rayons, les tailles de texte et les icônes lucide d’un fichier .pen sont très proches du modèle de zenit ; la Skill inclut une table de correspondance des champs et un outil design_diff pour que l’agent reproduise au chiffre près plutôt qu’à l’œil.
Ni WebView ni DOM virtuel. L’arbre UI produit une liste plate de DisplayItem consommée directement par les renderers Metal.
render · gpuRenderers SDF, texte et image en triple tampon ; l’achèvement GPU chevauche le layout CPU.
Signal · Memo · createEffectPas de reconstruction d’arbre, pas de diff. Une dépendance atteint exactement les nœuds qui la lisent.
text · text_coreUnicode 17, bidi UAX #9, limites de graphèmes UAX #29 et preedit / commit de bout en bout.
ui.devtools · harnessLocalisateurs sémantiques, curseur virtuel, captures Retina et MP4 au niveau du drawable. DevTools inclus.

Plateforme, rendu et texte vivent en dessous. La frontière est imposée à la compilation : un import interdit ne compile pas.
L’objectif en Debug pour les interactions de base, y compris le défilement, le déplacement du curseur et la saisie dans des listes virtuelles de dizaines de milliers de lignes. Apple silicon série M.
layout_isolation coupent les cascades dirtygit clone https://github.com/version-next/zenit.git cp -R zenit/templates/minimal-app ./myapp
Fourni avec build.zig, build.zig.zon et src/main.zig.
zenit.attach(zenit_dep, exe);
Un seul appel branche ui, zenit_app, les ponts natifs et les frameworks.
zig build run zig build app
Lancez directement, ou produisez une .app macOS ouvrable d'un double-clic.
0.1.0 est la première version publique, mais l’API peut encore changer avant 1.0. Épinglez une version exacte ; chaque changement cassant est consigné dans MIGRATION.
Des projets existants de la communauté, filmés dans de vraies fenêtres.
0:18CommunautéIDE de code (natif)Branché sur un vrai serveur de langage TypeScript : complétions à la frappe, aide aux signatures et documentation au survol. La liste de complétion, les popovers, l'éditeur et la minimap sont tous dessinés par zenit sur le GPU.
1:09CommunautéÉditeur Markdown WYSIWYGUn éditeur de documents natif complet : listes, check-lists, citations et numérotation multiniveau prennent forme à la frappe, et tableaux, diagrammes de flux, blocs de code et captures d'écran cohabitent dans le même document. Ni Electron ni WebView : chaque pixel est dessiné par zenit.
2:22CommunautéCours de synthèse et piano roll (natif)Apprenez la synthèse en concevant des sons : un cours intégré explique les filtres pas à pas, et chaque potentiomètre anime en direct la courbe du filtre, les enveloppes et le spectre. Composez ensuite le morceau dans un piano roll à 7 pistes : chaque note est jouée par le synthé de l’app. Cliquez pour regarder avec le son.Des partenaires construisent déjà un outil de design à canevas infini, un IDE de code, un téléchargeur de vidéos… Un même ensemble de nœuds, de styles et de capacités natives, pour des produits très différents.
Zoom, glisser et multisélection sur le GPU, avec une interface en verre liquide flottant au-dessus du canevas.
Gros fichiers virtualisés, chaîne IME complète, palettes multi-fenêtres et menus natifs.
Tâches en arrière-plan avec progression en direct, et fichiers terminés glissés directement dans le Finder.
Le framework est ouvert à tout. Commencez par une fenêtre et construisez l’app Mac que vous avez en tête.
Commencer à construireDesigner ou développeur : si une frame perdue, un curseur en retard d’un tick ou une courbe d’easing qui sonne faux vous dérangent, c’est vous que nous cherchons. Aidez-nous à faire de zenit le framework d’UI natif GPU le plus apprécié, avec la meilleure DX et les meilleures performances.