Changes in version 0.8.0 (2026-08-08) First CRAN submission. This release settles the public API before the package has any users to break, so it carries deliberate breaking changes. Breaking changes - plot_regr() is renamed plot_regression(). Every other interactive/plot pair already matched its gadget name; this was the last one that did not. There is no deprecation shim — the package has never been released. - interactive_matrix_inverse() drops the _init suffix from its arguments: x1_init, y1_init, x2_init, y2_init are now x1, y1, x2, y2. They now match plot_matrix_inverse(), so do.call() works between them. - All eight interactive_*() gadgets return a new reproduction object when you click Done. Previously interactive_matrix_inverse() and interactive_t_test() returned nothing at all, and interactive_moderation_3d() returned the data frame while discarding the viewing angles the gadget exists to set. interactive_pca() no longer returns a two-element list(points, pca); the points come back directly and the prcomp result is attached as an attribute. New features - Every gadget prints the plot_*() call that reproduces what was on screen when you click Done, with arguments still at their defaults omitted. The returned object is a plain list (settings-style gadgets) or a plain data frame (points-style gadgets), so do.call(plot_fn, result), nrow(), [ and passing the result straight back to the plot function all work. See ?"compstatslib-reproduce". - Derived state that a user would not retype rides along as an attribute rather than cluttering the printed call: attr(result, "pca") from interactive_pca(), attr(result, "vars") from interactive_sampling(). - interactive_t_test() accepts diff, sd, n, alpha and error_matrix seed arguments, so it can be launched pre-configured like the other gadgets. Bug fixes - plot_regression(), plot_logit() and plot_sampling() no longer leave the caller's par() settings modified, as CRAN Repository Policy requires. The first two used to force par(family = "sans") rather than restoring what the caller had set; all three now restore on exit, including when the call errors part-way through. - plot_sampling() restores cex correctly. Its saved value was captured by the same par() call that set mfrow, and since mfrow resets cex as a side effect, the value it saved was already clobbered. - plot_matrix_inverse() labels its axes x and y. It built its empty plotting region with plot(NA, ...), which deparses its first argument into the axis labels, so the axes read Index and NA. Documentation - Every exported function now documents its return value and carries runnable examples. Gadget examples use if (interactive()) throughout and show the round trip from gadget to plot function. - Package prose standardized on en-US spelling; Language: en-US declared. - The README documented a visualize_inverse() function that does not exist. Removed, and a section on reproducing an interactive session added. Changes in version 0.7.1 - Minimum R version raised to 4.1.0. Changes in version 0.7.0 - Added plot_scatter3d() and interactive_scatter3d(): a 3D point cloud with runtime column pickers, aspect / opacity / marker-size controls, and camera capture so a specific rotation can be reproduced non-interactively. - Added an R-CMD-check GitHub Actions workflow. Changes in version 0.6.0 - Added plot_moderation_3d() and interactive_moderation_3d() for visualizing moderated regression as a rotatable wireframe surface. - plot_moderation_3d() supports multi-predictor models; pass iv and mod to choose which two predictors go on the plot axes. - Bundled the synthetic moderation_data teaching dataset. Changes in version 0.5.1 - Documentation fixes: missing plot functions listed in the README, roxygen usage tags corrected.