Immediate Mode GUI Library for Zig
Find a file
reugenio 105e3c63d1 fix: UTF-8 support in TTF drawText
- drawText now decodes UTF-8 codepoints instead of iterating bytes
- Fixes rendering of accented characters (á, é, í, ó, ú, ñ, etc.)
- Uses std.unicode.utf8ByteSequenceLength + utf8Decode
- Invalid UTF-8 sequences are gracefully skipped

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:25:17 +01:00
docs docs: Plan de refactoring table.zig antes de dividir 2025-12-11 23:04:08 +01:00
examples 🔧 FIX: Compatibilidad Zig 0.15.2 2025-12-09 23:01:09 +01:00
ios feat: zcatgui v0.15.0 - Mobile & Web Backends 2025-12-09 18:20:13 +01:00
src fix: UTF-8 support in TTF drawText 2025-12-16 13:25:17 +01:00
web feat: zcatgui v0.15.0 - Mobile & Web Backends 2025-12-09 18:20:13 +01:00
.gitignore feat: zCatGui v0.1.0 - Initial project setup 2025-12-09 01:30:05 +01:00
build.zig feat: zcatgui v0.15.0 - Mobile & Web Backends 2025-12-09 18:20:13 +01:00
build.zig.zon 🔧 FIX: Compatibilidad Zig 0.15.2 2025-12-09 23:01:09 +01:00
CLAUDE.md fix: DroidSans reemplaza AdwaitaSans (variable) + Y-flip TTF 2025-12-16 13:19:40 +01:00
README.md docs: Add comprehensive README.md 2025-12-09 14:01:01 +01:00
REFERENCE.md docs: Actualizar REFERENCE.md con fuente embebida 2025-12-16 01:22:01 +01:00
VERIFIED_FEATURES.md docs: Add MainLoop to VERIFIED_FEATURES 2025-12-10 12:26:22 +01:00
ZIG_VERSION_NOTES.md docs: Renombrar TEAM_STANDARDS a teamdocs 2025-12-11 19:33:25 +01:00

zcatgui

Immediate Mode GUI Library for Zig - Software-rendered, cross-platform, SSH-compatible.

Zig License

Features

  • Immediate Mode - Explicit state, no callbacks, no threading issues
  • Software Rendering - Works everywhere, including over SSH (X11 forwarding)
  • Macro System - Record and replay user actions (unique feature)
  • 35 Widgets - From basic (Button, Label) to advanced (Table, Tree, Charts)
  • 5 Themes - Dark, Light, High Contrast, Nord, Dracula
  • Accessibility - ARIA-like roles and states for screen readers
  • Zero Runtime Dependencies - Only SDL2 for windowing

Quick Start

const zcatgui = @import("zcatgui");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    const allocator = gpa.allocator();

    var ctx = try zcatgui.Context.init(allocator);
    defer ctx.deinit();

    while (ctx.running) {
        ctx.beginFrame();

        if (zcatgui.button(&ctx, "Click me!")) {
            // Handle click
        }

        ctx.endFrame();
    }
}

Widgets (35 total)

Basic

  • Label - Static text with alignment options
  • Button - Primary, normal, danger variants
  • Checkbox - Boolean toggle
  • RadioButton - Mutually exclusive selection

Input

  • TextInput - Single-line text entry with cursor
  • TextArea - Multi-line text editor
  • NumberInput - Numeric input with validation
  • Slider - Horizontal/vertical value slider
  • AutoComplete - ComboBox with fuzzy matching

Selection

  • Select - Dropdown selection
  • List - Scrollable selectable list
  • Tree - Hierarchical tree view

Data

  • Table - Editable with sorting, validation, dirty tracking
  • LineChart - Line graphs with multiple series
  • BarChart - Bar graphs with grouping
  • PieChart - Pie/donut charts with labels
  • Sparkline - Compact inline charts

Layout

  • Panel - Container with title, collapsible
  • HSplit/VSplit - Draggable split panels
  • Tabs - Tab container with keyboard navigation
  • ScrollArea - Scrollable content region
  • Modal - Dialog boxes (alert, confirm, input)

Feedback

  • Progress - Bar, circle, spinner with animations
  • Tooltip - Hover tooltips with smart positioning
  • Toast - Non-blocking notifications
  • Badge - Status labels with variants

Navigation

  • Menu - Dropdown menus with submenus
  • ContextMenu - Right-click menus

Special

  • Image - Image display with scaling
  • Icon - Icon rendering
  • ColorPicker - Color selection
  • Calendar - Date selection
  • RichText - Styled text rendering

Unique Features

Macro System

Record user actions as keyboard events and replay them:

var recorder = zcatgui.MacroRecorder.init(allocator);

// Start recording
recorder.start();

// ... user interacts with UI ...

// Stop and save
const events = recorder.stop();
try recorder.save("my_macro.macro");

// Later, replay
var player = zcatgui.MacroPlayer.init();
player.play(events, ctx.injectEvent, 50); // 50ms delay between events

Lego Panels Architecture

Build complex UIs from reusable autonomous panels:

const panels = zcatgui.panels;

var search_panel = panels.SearchFilterPanel.init(allocator, config);
var data_panel = panels.DataTablePanel.init(allocator, table_config);

// Panels communicate via DataManager
var manager = panels.DataManager.init(allocator);
manager.register("search", &search_panel);
manager.register("data", &data_panel);

Table with Dirty Tracking

Track changes for database sync:

var table_state = zcatgui.widgets.TableState.init();

// After user edits
if (table_state.isDirty()) {
    const changes = table_state.getDirtyRows();
    for (changes) |row_idx| {
        // Sync to database
    }
    table_state.clearDirty();
}

Themes

const theme = zcatgui.Style.ThemeManager.init();

// Switch themes at runtime
theme.setTheme(.dark);
theme.setTheme(.light);
theme.setTheme(.high_contrast);
theme.setTheme(.nord);
theme.setTheme(.dracula);

Performance

  • FrameArena - O(1) per-frame allocator with automatic reset
  • ObjectPool - Reuse frequently allocated objects
  • Virtual Scrolling - Handle millions of items efficiently
  • Dirty Rectangles - Partial redraws for efficiency

Building

# Build library
zig build

# Run tests
zig build test

# Build examples
zig build hello
zig build widgets-demo
zig build table-demo

Requirements

  • Zig 0.15.2
  • SDL2 (for windowing)

Project Structure

zcatgui/
├── src/
│   ├── zcatgui.zig      # Main entry point
│   ├── core/            # Context, Layout, Style, Input
│   ├── widgets/         # All 35 widgets
│   ├── render/          # Software renderer, fonts, effects
│   ├── backend/         # SDL2 backend
│   ├── macro/           # Macro recording/playback
│   ├── panels/          # Lego Panels architecture
│   └── utils/           # Performance utilities
├── examples/            # Demo applications
└── docs/               # Documentation

Comparison

Feature zcatgui DVUI Dear ImGui
Language Zig Zig C++
Rendering Software Software/GPU GPU
SSH Compatible Yes Partial No
Macro System Yes No No
Table Dirty Tracking Yes No No
Widgets 35 33 30+
  • zcatui - TUI (Terminal UI) library for Zig (sister project)

License

MIT License - See LICENSE for details.

Contributing

Issues and pull requests welcome at the project repository.