• v2.0.0 e616243302

    kahliburke released this 2026-03-25 01:27:38 -07:00 | 47 commits to main since this release

    Tachikoma v2.0.0

    A major release bringing a complete RGBA pixel pipeline, type-safe widget styling, and sixel compositing with text preservation.

    Breaking Changes

    Widget Styling System

    TabBar and Button now use type-parameterized decoration styles instead of keyword arguments:

    # TabBar: BracketTabs (default), BoxTabs, PlainTabs
    TabBar(["Tab 1", "Tab 2"]; tab_style=TabBarStyle(decoration=BoxTabs(box=BOX_HEAVY)))
    
    # Button: BracketButton (default), BorderedButton, PlainButton
    Button("Submit"; button_style=ButtonStyle(decoration=BorderedButton()))
    

    The old kwargs (style, active_style, bordered, box) are removed. This is a clean break — users subtype TabDecoration or ButtonDecoration to create custom styles with full render control.

    RGBA Pixel Pipeline

    The entire pixel pipeline now uses ColorRGBA instead of ColorRGB:

    • BLACK is ColorRGBA(0,0,0,0xff), TRANSPARENT is ColorRGBA(0,0,0,0x00)
    • encode_sixel and encode_kitty accept Matrix{ColorRGBA} — transparency is expressed through the alpha channel
    • The bg sentinel parameter is removed everywhere
    • Base.convert methods allow implicit ColorRGBColorRGBA assignment

    FloatingWindow on_render

    Signature changed from (inner, buf, focused) to (inner, buf, focused, frame). The frame parameter (which can be nothing) enables pixel graphics (PixelImage, kitty, sixel) inside floating windows.

    New Features

    Sixel Virtual Framebuffer Compositor

    Multiple render_rgba! calls per frame are alpha-composited into a shared framebuffer. A text mask algorithm preserves terminal text (titles, borders, labels) over pixel content by splitting sixel output into non-overlapping rectangles that avoid text cells. Transparent pixels are filled with the canvas background for flicker-free rendering.

    Kitty RGBA with Z-Index

    Native alpha channel support via f=32 with z-index layering for proper window stacking.

    ColorTypes.jl Extension

    Seamless bidirectional conversion between Tachikoma and the Colors.jl/Makie ecosystem:

    using Tachikoma, ColorTypes
    tc = to_rgb(RGB{N0f8}(1.0, 0.0, 0.0))    # ColorTypes → Tachikoma
    ct = to_colortype(ColorRGB(0xff, 0, 0))    # Tachikoma → ColorTypes
    

    Auto-activates when ColorTypes is loaded. Zero-cost if not.

    Button Flash Customization (#24)

    Custom flash animations via flash_style function and flash_frames duration on ButtonStyle. Thanks @ronisbr!

    Environment-Based Graphics Detection

    Auto-detect kitty/sixel support from TERM, TERM_PROGRAM, and other env vars — faster startup (skips 100ms probe roundtrip) and enables graphics on remote TTY sessions where escape sequence probing is unsafe. Supports kitty, Ghostty, WezTerm, iTerm2, foot, and mlterm.

    24 Built-in Themes

    11 dark + 13 light palettes with light_mode() / set_light_mode!() and per-theme canvas background colors.

    Lifecycle Hooks

    pre_render!(model) and post_render!(model) callbacks for Revise-compatible hot reloading workflows.

    Bug Fixes

    • Fix invisible cursor on light themes in terminal/REPL demos (#25). Thanks @eschnett!
    • Fix frame pacer 30fps cap with conditional take!(wake)
    • Fix flaky spawn_timer! test on slow CI runners
    • Remove Infiltrator from TachikomaDemos dependencies

    Contributors

    Thanks to @ronisbr for the button flash customization PR and @eschnett for reporting the light-mode cursor issue.

    Downloads