← На главную

Gooey: GPU-ускоренный декларативный UI для Zig без зависимостей

03.06.2026 17:12 · hackernews

Gooey — это GPU-ускоренный UI-фреймворк для Zig. Он работает на macOS через Metal, на Linux через Vulkan и Wayland, а в браузере — через WASM и WebGPU. Пример приложения на Gooey — chat-zig, клиент для Anthropic Claude на стеке std.Io из Zig 0.16 для асинхронного HTTP.

Фреймворк декларативный: компоненты строятся из примитивов ui.* с flexbox-подобной системой. Состояние (Cx) и разметка (ui.*) разделены — первый отвечает за данные, обработчики и фокус, вторая — за расположение элементов. Состояние хранится в чистом виде, без привязки к UI, что делает его легко тестируемым — при изменении данных автоматически запускается перерисовка.

В Gooey встроены анимации с easing и триггерами animateOn, система сущностей с автоочисткой, готовые виджеты — TextInput, TextArea, Checkbox, Scroll, Select, RadioButton, RadioGroup. Текст рендерится через CoreText на macOS, FreeType/HarfBuzz на Linux и Canvas на WASM. Можно подключать свои Metal или GLSL шейдеры, перетаскивать элементы через type-safe drag & drop, использовать нативные диалоги открытия/сохранения файлов и буфер обмена. Поддерживается IME для ввода на разных языках, встроена поддержка скринридеров (VoiceOver, Orca, ARIA) с семантическими ролями.

У Gooey ноль внешних Zig-зависимостей — build.zig.zon пустой. Фреймворк линкуется только с системными библиотеками и фреймворками (на macOS — Objective-C runtime, который встроен в репозиторий). Требуется Zig 0.16.0 или новее.

Система тем включает две встроенные — светлую (Catppuccin Latte) и тёмную (Catppuccin Macchiato). Можно задать свою тему с семантическими цветами и радиусами скругления. Базовый размер шрифта задаётся в теме, и все компоненты масштабируются относительно него.

Фоновые задачи (сетевые запросы, чтение файлов, тяжёлые вычисления) выносятся в отдельный поток через std.Io.Queue(T) и std.Io.Group. Результаты возвращаются в очередь, которую рендер-цикл разбирает каждый кадр без блокировок — фоновые задачи никогда не трогают UI-состояние напрямую.

Читать оригинал →