# curves 0.4.0

## New features

- Added `interactions()`, which ranks numeric predictor pairs by the
  count-weighted magnitude of their centred second-order ALE surfaces.
- Added `top_n` to `bivariate()` for `method = "ale"` so the plotting
  interface can rank all eligible pairs with `interactions()` and display only
  the strongest interaction surfaces.

# curves 0.3.1

## Fixes

- `bivariate(method = "ale")` now masks grid cells that contain no
  observations as `NA` in the returned surface and renders them in the
  fill scale's `na.value` (default light grey) rather than colouring them
  with a value extrapolated from neighbouring cells. This prevents the
  interaction surface from displaying confident estimates over regions of
  feature space that the data does not support, which previously misled
  readers when predictors were correlated.
- `bivariate(method = "ale")` now defaults to `n = 10` (the second-order
  surface uses an `n x n` cell grid; `n = 40` left most cells empty for
  typical data) and to `rug = TRUE` so the data density is always visible.
- `ale_surface_limits()` is robust to surfaces that are entirely `NA`.
- Updated docs/`Rd` to describe the half-cell centring convention used for
  the 2D ALE accumulation and the empty-cell masking behaviour.
- Enabled categorical ALE in `multimodel()` and `mapcurve()`, matching the
  univariate ALE support and using a shared level order across ensemble
  members when `multimodel()` averages unordered factor effects.
- Added `extrapolate = FALSE` to `bivariate()` so unsupported ALE grid cells
  remain masked by default but can be shown on request using the interpolated
  values already used internally for accumulation.

# curves 0.3.0

## New features

- Extended `univariate()` with `method = "profile"`, `"pdp"`, `"ice"`, and
  `"ice+pdp"` so single-profile, partial dependence, and ICE plots share one
  entry point.
- Added `method = "ale"` to `univariate()` for accumulated local effects
  curves on numeric predictors.
- Changed `univariate(method = "ale")` to warn and skip factor predictors
  instead of failing when numeric predictors are also available.
- Split `univariate()` and `mapcurve()` sampling controls so `n`
  sets numeric grid resolution while `background_n` sets the number of
  randomly sampled background rows used for PDP/ICE.
- Added `interval` to `univariate()` and `mapcurve()` so `method = "pdp"` can
  draw central quantile ribbons for numeric predictors.
- Added adaptive raster sampling for `univariate()` so PDP/ICE methods can draw
  more background predictor combinations when `predict_data` comes from a
  `SpatRaster`.
- Added `bivariate()` for bivariate response surfaces with static heatmap and
  contour views.
- Extended `bivariate()` with `method = "pdp"` and `method = "ale"`, plus
  optional marginal rugs for numeric predictor pairs in static plots.
- Added optional interactive 3D response surfaces for numeric predictor pairs
  when `plotly` is installed.
- Added support for selecting predictor pairs by column name or column index.
- Added support for list-valued `fun` in `multimodel()` so mixed model types
  can use model-specific prediction wrappers before averaging curves.

## Changes

- Renamed the bivariate plotting mode argument from `type` to `plot_type` so
  model-specific `type` arguments can still be passed through `...` to
  `predict()`.
- Changed `bivariate(plot_type = "heatmap")` to use a viridis fill scale by
  default and to stop drawing contour overlays on heatmaps.
- Updated the random forest species distribution vignette to use a smaller
  predictor set and to include `univariate()` examples for profile, PDP, and
  ICE + PDP plots.
- Stopped drawing connecting lines for unordered factor predictors in
  `univariate()`, so categorical panels no longer imply numeric intervals.
