• v2.3.0 0a0e940ffd

    v2.3.0 Stable

    kahliburke released this 2026-06-30 00:36:37 -07:00 | 19 commits to main since this release

    New features

    • PanelTree — nested tiling panes with resizable dividers and drag-to-move/dock; the tiling counterpart to WindowManager. Includes a new "Tiling Panes" docs page with an animated drag-and-dock demo.
    • ListItem styled prefix — optional prefix / prefix_style that keeps its own color even when the row is selected (e.g. a status icon whose color reflects real state while only the row text takes the highlight).
    • GIF/APNG export fallback fonts — automatic CJK / emoji / symbol fallback fonts so headless exports match what the terminal shows via OS font substitution. New default_gif_fallback_fonts(); override with fallback_fonts=.
    • macOS PTY controlling terminalforkpty-based controlling-tty setup on macOS for embedded terminal widgets.

    🐛 Bug fixes

    • Fix StringIndexError when truncating multibyte text (em-dash, CJK, accents) in DataTable, PagedDataTable, Table, BarChart, and the export modal. Truncation is now character-safe across all widgets (reported via Kaimon #29).

    📚 Docs

    • New Tiling Panes guide (PanelTree) with an animated demo.
    • Converted event handlers across the guides and tutorials to the preferred @match style.

    Full Changelog: https://github.com/kahliburke/Tachikoma.jl/compare/v2.2.0...v2.3.0

    Downloads
  • v2.2.0 975bda891b

    v2.2.0 Stable

    kahliburke released this 2026-06-05 23:59:16 -07:00 | 28 commits to main since this release

    What's new

    • PixelImage custom backgrounds (#33): new set_background! / reset_background! functions. A custom background set via the constructor or set_background! now persists across theme changes, clears, and resizes (canvas-tracking is disabled until reset_background! re-enables it).
    • Sixel gallery demo updates (real flame graph, custom-bg demo, latency heatmap fix).

    Closes #34.

    Downloads
  • v2.1.0 c2ab53de99

    v2.1.0 Stable

    kahliburke released this 2026-04-03 05:41:57 -07:00 | 31 commits to main since this release

    Re-release of v2.0.1 as v2.1.0

    Downloads
  • v2.0.1 6d28580500

    v2.0.1 Stable

    kahliburke released this 2026-04-03 02:59:26 -07:00 | 32 commits to main since this release

    What's Changed

    Bug Fixes

    • Fix fill_rect! and set_pixel! to accept ColorRGB in addition to ColorRGBA (#31)
    • Fix fps_demo returning ColorRGB from noise color
    • Fix resize on Windows: use TTY handle for terminal size (#30)
    • Fix Button API in windows_demo

    Unicode & Grapheme Support

    • Add zero-width combining character support in Cell, Buffer, and TerminalWidget (#29, @ronisbr)
    • Fix grapheme handling in Paragraph, StatusBar, and TabBar widgets — use set_string! and textwidth instead of per-char iteration
    • Add ASCII fast path in set_string! to skip grapheme segmentation for pure-ASCII strings

    Performance

    • Restore deadline-based frame pacer with cooperative sleep(), replacing Timer+Channel mechanism. Fixes frame timing jitter (~2ms overhead per frame) — now locks to target FPS precisely (60/120/240)
    • First-frame clear screen prevents sixel startup flickering
    • Lazy framebuffer clear: skip ~5MB memset per frame when no pixel content is rendered

    New Widgets

    • Add WidgetScroll: scrollable 2D viewport for any widget with keyboard/mouse navigation, click-drag panning, and scrollbars (#27, @ronisbr)
    • Optimized with cached virtual buffer and bulk row copy

    Launcher Overhaul

    • Replace flat list with categorized TreeView (Visual, Widgets, Data, Input, System, Test)
    • Mouse support: click to select, click again to launch, scroll wheel
    • Selection persists when returning from a demo
    • Word-wrapped description panel, styled keybindings footer

    New Demos

    • Unicode & Graphemes: combining marks, CJK wide chars, mixed-width text across Paragraph, Table, TabBar, StatusBar
    • Widget Scroll: 2D pannable viewport with sparklines, tables, bar charts, gauges, calendars

    Other

    • GIF delta encoding: write only changed subrects per frame
    • Add MP4 export via FFMPEG.jl
    • Add tachi CLI tool for .tach recording export
    • Updated documentation for all new features

    Contributors

    • @ronisbr — zero-width character support, WidgetScroll
    • @davidanthoff — Windows resize fix
    • @eschnett — reported ColorRGB crash (#31)
    Downloads
  • 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
  • v1.1.6 5fe19910ba

    v1.1.6 Stable

    kahliburke released this 2026-03-20 20:30:37 -07:00 | 71 commits to main since this release

    Patch release.

    • Fix TabBar mouse click selecting wrong tab when overflow is active
    • Fix syntax error in tabbar_demo (#23, thanks @felipeacsi)
    • Add demo compilation smoke test to CI
    Downloads
  • v1.1.5 db0ff65746

    v1.1.5 Stable

    kahliburke released this 2026-03-19 17:52:46 -07:00 | 76 commits to main since this release

    TabBar: stateful widget with overflow and mouse support

    TabBar is now a mutable, stateful widget — consistent with RadioGroup, SelectableList, and other interactive widgets. Previously it was an immutable display-only struct.

    • handle_key! — left/right/tab to switch tabs (requires focused=true)
    • handle_mouse! — click a tab to switch, returns :changed or :none
    • value / set_value! — get/set the active tab index
    • Automatic overflow — when tabs exceed available width, the visible window scrolls to keep the active tab in view with indicators on clipped sides
    • Mouse hit testing — tab bounding rects are cached during render for accurate click detection

    Fully backwards compatible. Existing code that constructs TabBar inline in view() works unchanged.

    Closes #22. Thanks @ronisbr for the report.

    Other

    • New tabbar_demo in the demos launcher
    • Updated sysmon demo to use the new stateful TabBar API
    • Fix light-mode-dependent test failures in sixel/kitty encoder tests
    Downloads
  • v1.1.4 0e0d81434a

    v1.1.4 Stable

    kahliburke released this 2026-03-18 18:50:43 -07:00 | 80 commits to main since this release

    Patch release.

    • Fix error swallowing when app() runs in a spawned thread (#20) — errors in view/update! are now printed to stderr and re-thrown
    • Fix light-mode-dependent test failures in sixel/kitty encoder tests
    Downloads
  • v1.1.3 61552ca609

    v1.1.3 Stable

    kahliburke released this 2026-03-17 22:06:14 -07:00 | 84 commits to main since this release

    Tachikoma.jl v1.1.3

    Light & Dark Mode with 13 New Light Themes

    Tachikoma now supports both dark and light mode, bringing the total theme count from 11 to 24. The 13 new light themes span a wide range of aesthetics — from the clean minimalism of Paper and Frost to the warm tones of Gruvbox, Dune, and Ayu. Switch between dark and light packs with Tab inside the theme selector (Ctrl+\), and your preference is persisted via Preferences.jl.

    New light themes: Paper, Latte, Solaris, Sakura, Ayu, Gruvbox, Frost, Meadow, Dune, Lavender, Horizon, Overcast, and Dusk.

    Pixel canvases (sixel and Kitty backends) automatically adapt their background color to match the active mode — white for light, black for dark.

    ANSI Escape Sequence Support

    Paragraph and ScrollPane now render inline ANSI escape sequences — bold, italic, underline, dim, strikethrough, reverse video, and both 256-color and RGB color codes. This makes it straightforward to display colored output from external commands, log files, or any pre-formatted ANSI text directly in your TUI.

    A new ansi keyword (default true) on Paragraph controls parsing. Set ansi=false to strip escapes, or raw=true to display them literally. A new parse_ansi utility is also exported for custom use.

    Per-Row and Per-Cell DataTable Styling

    DataTable now accepts row_style and cell_style callbacks, giving fine-grained control over how individual rows and cells are rendered — useful for conditional formatting, alternating row colors, or highlighting specific values.

    Bug Fixes

    • Fixed light-mode background regression in sixel/kitty encoding — pixel canvases previously rendered with a black background regardless of mode, producing unreadable output in light themes.
    • Fixed Windows crash — guarded a POSIX dup() call in app() that caused a crash on Windows (#11, #12).

    Other Changes

    • Updated README to reflect the expanded theme count and dark/light mode support.
    • Added [sources] to the demos Project.toml for automatic local resolution on Julia 1.11+.
    • New ANSI Text interactive demo in the demos launcher.
    Downloads
  • v1.1.2 761211db2d

    v1.1.2 Stable

    kahliburke released this 2026-03-14 20:27:20 -07:00 | 101 commits to main since this release

    • Add PrecompileTools workload for ~100x TTFX improvement across core widgets, layout, styling, canvas, and animation
    • Add pre_render!(model) and post_render!(model) lifecycle hooks called each frame bracketing view
    • Wrap event dispatch and rendering in invokelatest for live Revise reloading during app development
    • Support single-button modals (empty cancel_label or confirm_label hides that button)
    • Fix typo in export_gif_from_snapshots (thanks @KristianHolme)
    • Fix tests that depend on user-local Preferences.jl settings
    Downloads