All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Semantic color ANSI fallback: Semantic colors now work without themes
- When no theme is set, semantic colors automatically fall back to standard ANSI colors
:error→:red:success→:green:warning→:yellow:header→:cyan:emphasis→:blue:muted→:bright_black- Makes the API consistent - semantic colors work everywhere, with or without themes
- Theme-aware color resolution: Use simple ANSI color names that resolve to theme RGB values
- New
style/1function:style(:nord)creates a style with theme attached - Color atoms (
:red,:cyan,:bright_magenta, etc.) resolve to theme RGB values - Works with all 16 ANSI colors:
:black,:red,:green,:yellow,:blue,:magenta,:cyan,:white, and theirbright_*variants - Semantic colors (
:header,:emphasis,:warning,:error,:success,:muted) supported with themes - Demo script at
examples/theme_color_test.exs
- New
0.8.0 - 2026-01-03
- Pagination for all select components: Handle large item lists efficiently
- Default page size of 100 items (customizable via
page_size/2) - Vim-style navigation:
]/Ctrl+Fnext page,[/Ctrl+Bprevious page - Page indicator shows
[Page 1/5]when multiple pages exist - Navigation with
j/kautomatically advances pages at boundaries g/Gjump to absolute first/last item across all pages- Works seamlessly with filter mode (pagination applies to filtered results)
- Set
page_size(0)orpage_size(nil)to disable pagination - New
Esc.Filterpagination helpers:page_indices/4,total_pages/3,clamp_page/4,render_pagination/3
- Default page size of 100 items (customizable via
- Demo script at
examples/pagination_demo.exs
0.7.0 - 2026-01-03
- Spinner component: Animated indeterminate loading indicators
- 10 built-in styles: dots, line, circle, arc, bounce, arrows, box, pulse, moon, clock
- Custom frame support for user-defined animations
- Text positioning (left or right of spinner)
- Customizable frame rate
- Theme integration (uses
:emphasisfor spinner,:mutedfor text) - Block-based execution with
run/2for automatic start/stop - Manual control with
start/1,stop/1,update_text/2 - Frame width normalization for consistent display
- Demo script at
examples/spinner_demo.exs
0.6.0 - 2026-01-02
- Filter mode for all select components: Press
/to filter items interactively- Available in Select, MultiSelect, SelectTable, and MultiSelectTable
- Case-insensitive substring matching by default
- Glob-style wildcards:
*.mdmatches "readme.md",red*matches "redwood" - Escape exits filter mode, second Escape clears filter, third cancels selection
- Match count shown when filtering (e.g., "5/10")
- New
Esc.Filtermodule with reusable filtering logic
- New
filter_style/2function on all select components for styling the filter input
- Select all (
a) and deselect all (n) in MultiSelect/MultiSelectTable now only affect filtered items when a filter is active
0.5.0 - 2026-01-02
- SelectTable component: Interactive single-selection in a grid layout
- Items displayed in auto-calculated columns based on terminal width
- Navigate with h/j/k/l, arrow keys, or Tab/Shift+Tab
- Visual cursor indicator with customizable styling
- Theme integration for automatic colors
- Requires OTP 28+ for native raw terminal mode
- MultiSelectTable component: Interactive multi-selection in a grid layout
- Same navigation as SelectTable plus Space to toggle selections
- Support for min/max selection constraints
- Pre-selection of items via
preselect/2 - Select all (a) and clear all (n) shortcuts
- Customizable selection markers (*, ✓, ●, etc.)
- Character width calculation for Dingbats (✓, ✔, →, etc.) now correctly treated as width 1
- Table module now strips ANSI codes when calculating display width for styled content
- Grid sizing includes safety margin to prevent line wrapping at terminal edge
0.4.0 - 2026-01-02
- Select component: Interactive selection menus for CLI applications
- Keyboard navigation with arrow keys and vim bindings (j/k)
- Support for items with custom return values via tuples
- Theme integration for automatic styling
- Requires OTP 28+ for native raw terminal mode
- Theme system: Global themes with 12 built-in color schemes
- Themes: dracula, nord, gruvbox, one, solarized, monokai, material, github, aura, dolphin, chalk, cobalt
- Automatic theme colors for Table, Tree, List, and Select components
- Semantic color roles: background, foreground, header, border, emphasis, muted, success, warning, error
- Table text wrapping: Automatic text wrapping with terminal width detection
- Words wrap at column boundaries
- Long words break with hyphens
- Auto-sizing based on terminal width
- Table border intersections render correctly
- Improved cell styling in tables
0.1.0 - 2025-12-31
- Initial release of Esc terminal styling library
- Core styling: ANSI color support (basic 16, 256-color, true color/RGB)
- Box model: Padding, margins, and borders
- Border styles: Rounded, double, thick, hidden, normal, and custom borders
- Text alignment: Left, center, right alignment with dimensional constraints
- List component: Ordered and unordered lists with customizable markers
- Table component: Data tables with headers, custom borders, and column alignment
- Tree component: Hierarchical tree rendering with connectors