Packages

Declarative terminal styling for Elixir. Colors, borders, padding, layout, tables, trees, spinners, and interactive select menus.

Current section

Files

Jump to
esc CHANGELOG.md
Raw

CHANGELOG.md

# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [0.9.0] - 2026-01-15
### Added
- **Theme-aware color resolution**: Use simple ANSI color names that resolve to theme RGB values
- New `style/1` function: `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 their `bright_*` variants
- Semantic colors (`:header`, `:emphasis`, `:warning`, `:error`, `:success`, `:muted`) also supported
- Without a theme, color atoms pass through for standard ANSI rendering
- Demo script at `examples/theme_color_test.exs`
## [0.8.0] - 2026-01-03
### Added
- **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+F` next page, `[`/`Ctrl+B` previous page
- Page indicator shows `[Page 1/5]` when multiple pages exist
- Navigation with `j`/`k` automatically advances pages at boundaries
- `g`/`G` jump to absolute first/last item across all pages
- Works seamlessly with filter mode (pagination applies to filtered results)
- Set `page_size(0)` or `page_size(nil)` to disable pagination
- New `Esc.Filter` pagination helpers: `page_indices/4`, `total_pages/3`, `clamp_page/4`, `render_pagination/3`
- Demo script at `examples/pagination_demo.exs`
## [0.7.0] - 2026-01-03
### Added
- **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 `:emphasis` for spinner, `:muted` for text)
- Block-based execution with `run/2` for 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
### Added
- **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: `*.md` matches "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.Filter` module with reusable filtering logic
- New `filter_style/2` function on all select components for styling the filter input
### Changed
- 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
### Added
- **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.)
### Fixed
- 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
### Added
- **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
### Fixed
- Table border intersections render correctly
- Improved cell styling in tables
## [0.1.0] - 2025-12-31
### Added
- 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
[Unreleased]: https://github.com/vectorfrog/esc/compare/v0.8.0...HEAD
[0.8.0]: https://github.com/vectorfrog/esc/compare/v0.7.0...v0.8.0
[0.7.0]: https://github.com/vectorfrog/esc/compare/v0.6.0...v0.7.0
[0.6.0]: https://github.com/vectorfrog/esc/compare/v0.5.0...v0.6.0
[0.5.0]: https://github.com/vectorfrog/esc/compare/v0.4.0...v0.5.0
[0.4.0]: https://github.com/vectorfrog/esc/compare/v0.1.0...v0.4.0
[0.1.0]: https://github.com/vectorfrog/esc/releases/tag/v0.1.0