scrin 0.1.81

A terminal UI toolkit with panes, widgets, overlays, animations, and Aisling-powered effects/loaders.
Documentation
# Changes

## 0.1.81

- Added `changes.MD` so recent Scrin work is easy to review in source control.
- Added `changes.MD` to the crate package include list so the changelog ships with the crate.
- Audited all requested hot-path APIs before publish:
  - `Terminal::draw_area_preserve_cursor_timed(...)`
  - `Terminal::present_area_preserve_cursor_timed(...)`
  - `Terminal::size_cached()`
  - `RetainedEffectWidget::render_cached_only(...)`
  - `RetainedEffectWidget::render_frame_into(...)`
  - `RetainedEffectWidget::current_cache_key()`
  - `RetainedEffectWidget::cache_hit(...)`
  - `RetainedEffectWidget::frame_count()`
  - `Block::inner_for_bordered(...)`
  - `FrameDiagnostic::static_name(...)`
  - `NamedFrameTiming`

## 0.1.80

- Published `scrin v0.1.80` to crates.io.
- Added `Terminal::draw_area_preserve_cursor_timed(area, render_fn)`.
- Added `Terminal::present_area_preserve_cursor_timed(area)`.
- Added `Terminal::size_cached()` for explicit no-I/O cached size reads.
- Added `NamedFrameTiming` for low-allocation static-name timing results.
- Added `FrameDiagnostic::static_name(...)`, `owned_name(...)`, and `name()`.
- Changed `FrameDiagnostic::name` to `Cow<'static, str>` so static pane names do not allocate.
- Added `Terminal::present_area_named_timed(...)`.
- Added `Terminal::draw_area_preserve_cursor_named_timed(...)`.
- Added `RetainedEffectCacheKey`.
- Added `RetainedEffectWidget::current_cache_key()`.
- Added `RetainedEffectWidget::cache_key_for(...)`.
- Added `RetainedEffectWidget::cache_hit(...)`.
- Added `RetainedEffectWidget::render_frame_into(...)` for rendering a specific retained frame without mutating widget frame state.
- Added `RetainedEffectWidget::render_cached_only(...)` for latency-sensitive paths that must avoid cache rebuilds.
- Added `RetainedEffectWidget::frame_count()`.
- Added `Block::inner_for_bordered(area)`.
- Updated README and crate docs with the new hot-path and cursor-preserving APIs.
- Verified with `cargo fmt`, `cargo check`, `cargo check --examples`, `cargo test`, `cargo doc --no-deps`, publish dry-run, and actual publish.

## 0.1.79

- Published `scrin v0.1.79` to crates.io.
- Added `Terminal::draw_areas_timed(...)`.
- Added `Terminal::draw_with_present_strategy(...)`.
- Added `PresentStrategy::{Diff, Full, Areas, DirtyBounds}`.
- Made area-limited draws commit only requested areas so unpresented writes do not leak into later diffs.
- Added per-widget and named-pane diagnostics:
  - `FrameDiagnostic`
  - `Frame::render_widget_timed(...)`
  - `Frame::time_named(...)`
  - `Frame::time_pane(...)`
  - `Frame::diagnostics()`
  - `Terminal::last_frame_diagnostics()`
- Added zero-copy retained row rendering hooks:
  - `ScrollableText::with_rows_for_width(...)`
  - `RetainedMarkdownOutput::with_rows_for_width(...)`
- Updated retained text and Markdown render paths to use cached row slices instead of cloning row vectors.
- Added retained Aisling widgets:
  - `RetainedEffectWidget`
  - `RetainedLoaderWidget`
- Added `Buffer::copy_from_at(...)` for cached buffer blitting.
- Re-exported new timing, strategy, and retained Aisling widget types.

## 0.1.78

- Implemented larger performance and ergonomics APIs.
- Added `ScrollableText`, a retained styled-text widget with width/content/style/wrap cache.
- Added `MarkdownOutput::retained()` and `RetainedMarkdownOutput`.
- Added dirty-rectangle presentation APIs:
  - `Terminal::present_area(...)`
  - `Terminal::present_areas(...)`
  - `Terminal::dirty_bounds()`
- Added timed terminal APIs:
  - `draw_timed`
  - `draw_full_timed`
  - `present_timed`
  - `present_full_timed`
  - `present_area_timed`
  - `present_areas_timed`
- Added `FrameTiming` and optional frame timing hooks.
- Added `ThemeTokens` and token-based widget styling helpers.
- Added `Buffer::copy_area_from(...)` and `Buffer::changed_bounds(...)`.

## 0.1.77

- Documented non-blocking future roadmap and app-level validation guidance.
- Kept the crate publish-ready after `0.1.76` by bumping to `0.1.77`.

## 0.1.76

- Added Scrin-side parity APIs requested by downstream Scrin-only ports.
- `Style` derives `Eq` and `Hash`.
- `BorderStyle` and `Block<'a>` derive `PartialEq`, `Eq`, and `Hash`.
- `Block::new(...)` defaults `inner_margin` to `Rect::ZERO`.
- Added `Block::bordered()`, `.title(...)`, and `.border_style(...)`.
- Added `Frame::render_widget(widget, area)`.
- Added `Buffer::cell_mut(...)`.
- Added `Cell::set_symbol(...)`, `set_fg(...)`, `set_bg(...)`, and `set_style(...)`.
- Added `Rect::is_empty()`.
- Updated docs to show Scrin-native builders and render helpers.

## 0.1.75

- Improved README and crate-level docs for crates.io/docs.rs.
- Documented installation, terminal use, Aisling effects/loaders, modules, demos, and publish checks.
- Re-exported Aisling selector/config types from `scrin::effects`:
  - `EffectKind`
  - `EffectConfig`
  - `LoaderKind`
  - `LoaderConfig`
  - `LoaderProgress`
- Added docs.rs metadata.

## 0.1.74

- Fixed `Terminal::present()` partial diff rendering.
- The presenter now repositions for every separated dirty cell/run instead of only once per row.
- Dirty detection accounts for wide-glyph skip-cell changes.
- Added `present_full()` and `draw_full()`.
- Added regression tests for non-contiguous dirty cells and wide-glyph continuation clearing.