Changes in version 1.0.0 - Fix plot_score() and plot_category() sunburst titles rendering slightly left of center - plotly's title x position defaulted to xref = "container" (the whole widget box) rather than "paper" (the plot's own drawing area), now set explicitly - plot_trend() gains a facets argument (one or more of "Overall", "wq", "sed", "fw", "hab", default all five) to show a subset of facets, and a text argument (one of "labels" (the default), "legend", or "none") controlling how series are identified: direct labels at each line's right-most value, a conventional ggplot legend, or neither. The right-margin/x-axis padding reserved for labels shrinks automatically when text != "labels". text = "legend" is useful for combining multiple panels with patchwork and collecting one shared legend, and always lists "Score" first rather than falling in alphabetical order with the rest. "labels" is preferred over "legend" when more than one or two facets are shown - Add a "Trends and Sensitivity" vignette (vignettes/trends.qmd) comparing report card results across the four default bay segments and showing how a few scoring decisions (TBNI's rescale window, threshold smoothing, category weights) change the results - anlz_fw_tbni() now converts the TBNI 0-100 score to an outcome using its own grade breakpoints (32, 46) instead of a plain linear rescale over the full 0-100 range, and gains a from argument (default c(32, 46)) so this can be reverted (e.g. from = c(0, 100)) or otherwise adjusted without editing the function - util_outcome() continuous type now clamps output to c(0, 1), so a from range narrower than the data (e.g. TBNI's 32-46 window) pins values outside it to 0/1 instead of extrapolating - anlz_wq_thresh(), anlz_wq_load(), and anlz_hab_seagrass_coverage() gain smooth/pct arguments for a logistic (rather than hard cutoff) threshold outcome; util_outcome()'s threshold steepness is now a tunable pct of the threshold (default 0.1) rather than a hardcoded 10% - Breaking: smooth now defaults to "logistic" for util_outcome(type = "threshold") and for anlz_wq_thresh(), anlz_wq_load(), and anlz_hab_seagrass_coverage(), so these threshold-based outcomes are smooth logistic transitions by default instead of a hard 0/1 cutoff. Pass smooth = "none" to restore the previous hard-cutoff behavior - Add plot_trend(), a new faceted ggplot2 trend plot: an "Overall" facet (bay segment score with one line per category) followed by one facet per category (that category's score with one line per indicator), each score drawn as a bold dark line with its components as thinner colored lines, labeled directly rather than via a shared legend. Adds ggplot2 and ggrepel as new package dependencies - plot_trend() gains a yr_range argument (c(min, max)) to restrict the plotted years, defaulting to NULL (all available years) - Breaking: anlz_wq_fib() now scores FIB using exceed_rate (tbeptools::anlz_fibmatrix()'s continuous, one-sided 90% upper confidence estimate of the true exceedance rate) instead of the A-E letter grade (cat), giving a continuous outcome (1 - exceed_rate) rather than one of 5 fixed values. Requires a tbeptools version with the exceed_rate column (not yet on CRAN/the published GitHub branch as of this change) - Breaking: anlz_sed_peltel() now scores sediment contaminants directly from the continuous PEL/TEL average (ave), log-transformed and rescaled between the A/B and D/F grade breakpoints, instead of from the A-F letter grade (grd, still returned for reference but no longer used to compute outcome) - Breaking: anlz_sed_tbbi() now scores the Benthic Index from the median of station-level TBBI scores, rescaled continuously over TBBI's 73/87 grade breakpoints, instead of from the official Poor/Fair/Good bay segment grade (which is based on the proportion of stations in each condition category, not a single continuous statistic - see ?anlz_sed_tbbi for how the two can disagree in edge cases). Output column TBBICat is replaced with TBBI (the median score) - Breaking: anlz_wq_tidalcreeks() now scores each creek from a count-weighted average across the same ordinal scale (monitor/caution/investigate/prioritize counts from tbeptools::anlz_tdlcrk()'s 10-year window) its official Prioritize/Investigate/Caution/Monitor condition category also comes from, instead of that category itself (which uses a compound rule with count-based exceptions - see ?anlz_wq_tidalcreeks for how the two can disagree in edge cases) - All indicators previously scored from a discrete grade/category now use a continuous score derived from the same underlying data (FIB, sediment PEL/TEL, Benthic Index, tidal creeks); no indicator currently uses util_outcome(type = "category"), though it remains available - util_outcome()'s smooth argument for type = "threshold" now takes one of "logistic", "ramp", or "none". "ramp" gives an outcome of 1 once a value reaches the "good" side of the threshold - not just 0.5 there like "logistic" - decaying exponentially toward 0 the further it falls on the "bad" side, using the same pct-of-threshold steepness rule - Breaking: anlz_hab_seagrass_coverage()'s smooth default changes from TRUE (logistic) to "ramp", so meeting or exceeding a segment's acreage target is now full credit (outcome of 1) rather than only 0.5 exactly at the target