# 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.