Skip to content

docs: add computeWaterfallData utility for waterfall charts#7011

Merged
ckifer merged 7 commits intorecharts:mainfrom
MaxGhenis:feature/waterfall-utility
Feb 17, 2026
Merged

docs: add computeWaterfallData utility for waterfall charts#7011
ckifer merged 7 commits intorecharts:mainfrom
MaxGhenis:feature/waterfall-utility

Conversation

@MaxGhenis
Copy link
Contributor

@MaxGhenis MaxGhenis commented Feb 14, 2026

Summary

Adds a computeWaterfallData() utility function that transforms raw data into range values for rendering waterfall charts with the existing <Bar> component.

  • New file: src/util/waterfall.ts — pure function with full TypeScript types
  • Export: computeWaterfallData, WaterfallOptions, WaterfallDatum from package index
  • Tests: 12 unit tests covering positive/negative/mixed values, total bars, accessor functions, edge cases
  • Storybook: Example story demonstrating a profit & loss waterfall

Screenshot

Simple waterfall

Motivation

Waterfall charts are commonly needed in financial, analytical, and reporting dashboards. Currently users must manually compute bar positions. This utility does that computation, outputting [barBottom, barTop] range values that Recharts <Bar> already supports natively.

Usage

import { BarChart, Bar, XAxis, YAxis, Cell, computeWaterfallData } from "recharts";

const raw = [
  { name: "Revenue", value: 100 },
  { name: "Costs", value: -30 },
  { name: "Profit", value: 70, isTotal: true },
];

const data = computeWaterfallData({ data: raw, dataKey: "value", totalKey: "isTotal" });

<BarChart data={data}>
  <XAxis dataKey="name" />
  <YAxis />
  <Bar dataKey="waterfallRange">
    {data.map((d, i) => (
      <Cell key={i} fill={d.value >= 0 ? "#00897B" : "#757575"} />
    ))}
  </Bar>
</BarChart>

Design decisions

  • Pure utility, not a new component — keeps the API surface minimal and composable
  • Leverages existing range bar support — no new rendering code needed
  • Supports accessor functions — for dataKey and totalKey, matching Recharts conventions
  • Spreads original data — output objects include all original fields for easy use with XAxis, tooltips, etc.

Test plan

  • 12 unit tests pass
  • Build output snapshots updated
  • Storybook story renders correctly (see screenshot above)
  • CI passes

Related: #7010

Summary by CodeRabbit

  • New Features
    • Introduced a new Waterfall chart example in the documentation that visualizes financial metrics including revenue, service fees, fixed and variable operating costs, tax expenses, and final profit. Features color-coded representation (green for positive, red for negative, blue for summary totals) and interactive tooltips for detailed insights.

Add a utility function that transforms raw data into range values
for rendering waterfall charts with the existing <Bar> component.

Recharts' Bar already supports range values ([low, high] arrays) as
dataKey values, which renders bars spanning exact Y-axis positions.
This utility computes the cumulative positions needed for waterfall
charts, handling positive, negative, mixed, and total bars.

Usage:
  import { computeWaterfallData, BarChart, Bar, Cell } from 'recharts';

  const data = computeWaterfallData({
    data: rawData,
    dataKey: 'value',
    totalKey: 'isTotal',
  });

  <BarChart data={data}>
    <Bar dataKey="waterfallRange">
      {data.map((d, i) => (
        <Cell key={i} fill={d.value >= 0 ? 'teal' : 'gray'} />
      ))}
    </Bar>
  </BarChart>

Closes recharts#7010

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 14, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR adds a new WaterfallExample component to the BarChart documentation gallery. The component renders a waterfall chart using Recharts with utilities to compute waterfallRange data from raw entries, custom coloring logic (green for positive, red for negative, blue for totals), and a custom tooltip display.

Changes

Cohort / File(s) Summary
Waterfall Chart Example
www/src/docs/exampleComponents/BarChart/WaterfallExample.tsx
New component implementing a waterfall bar chart with data computation utilities, type definitions (RawEntry, WaterfallDatum), a computeWaterfallData helper function, custom WaterfallBar shape, and WaterfallTooltip for rendering waterfall data with proper value signs and total indicators.
BarChart Examples Gallery
www/src/docs/exampleComponents/BarChart/index.tsx
Adds Waterfall example entry to the barChartExamples collection with imports, component reference, source code, and JSX description.

Possibly related PRs

Suggested reviewers

  • ckifer

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ❌ 4

❌ Failed checks (4 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description describes exporting a computeWaterfallData utility and adding library exports, which contradicts the actual implementation that creates only a website example without library exports. Update the description to accurately reflect the current state: the PR adds a Waterfall example component to the BarChart examples gallery with inline waterfall computation logic, not a reusable library utility.
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Merge Conflict Detection ⚠️ Warning ❌ Merge conflicts detected (75 files):

⚔️ package-lock.json (content)
⚔️ scripts/snapshots/es6Files.txt (content)
⚔️ scripts/snapshots/libFiles.txt (content)
⚔️ scripts/snapshots/typesFiles.txt (content)
⚔️ src/cartesian/Area.tsx (content)
⚔️ src/cartesian/Bar.tsx (content)
⚔️ src/cartesian/CartesianAxis.tsx (content)
⚔️ src/cartesian/XAxis.tsx (content)
⚔️ src/cartesian/YAxis.tsx (content)
⚔️ src/hooks.ts (content)
⚔️ src/polar/Pie.tsx (content)
⚔️ src/state/selectors/axisSelectors.ts (content)
⚔️ src/state/selectors/combiners/combineTooltipPayload.ts (content)
⚔️ src/state/store.ts (content)
⚔️ test-vr/__snapshots__/tests/www/ActiveIndex.spec-vr.tsx-snapshots/PieChartDefaultIndex-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ActiveIndex.spec-vr.tsx-snapshots/PieChartDefaultIndex-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ActiveIndex.spec-vr.tsx-snapshots/PieChartDefaultIndex-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/CoordinateSystems.spec-vr.tsx-snapshots/AxisTickSnapExample-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/CoordinateSystems.spec-vr.tsx-snapshots/AxisTickSnapExample-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/CoordinateSystems.spec-vr.tsx-snapshots/AxisTickSnapExample-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/CoordinateSystems.spec-vr.tsx-snapshots/DataSnapExample-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/CoordinateSystems.spec-vr.tsx-snapshots/DataSnapExample-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/CoordinateSystems.spec-vr.tsx-snapshots/DataSnapExample-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/LineChartApiExamples.spec-vr.tsx-snapshots/HighlightAndZoomLineChart-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/PieChartApiExamples.spec-vr.tsx-snapshots/PieWithGradient-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/PieChartApiExamples.spec-vr.tsx-snapshots/PieWithGradient-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/PieChartApiExamples.spec-vr.tsx-snapshots/PieWithGradient-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/PieChartApiExamples.spec-vr.tsx-snapshots/TwoLevelPieChart-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/PieChartApiExamples.spec-vr.tsx-snapshots/TwoLevelPieChart-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/PieChartApiExamples.spec-vr.tsx-snapshots/TwoLevelPieChart-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/RadialBarChartApiExamples.spec-vr.tsx-snapshots/RadialBarChartClickToFocusLegendExample-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/JointLineScatterChart-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/JointLineScatterChart-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/JointLineScatterChart-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/ScatterChartWithLabels-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/ScatterChartWithLabels-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/ScatterChartWithLabels-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/SimpleScatterChart-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/SimpleScatterChart-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/SimpleScatterChart-1-webkit-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/ThreeDimScatterChart-1-chromium-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/ThreeDimScatterChart-1-firefox-linux.png (content)
⚔️ test-vr/__snapshots__/tests/www/ScatterChartApiExamples.spec-vr.tsx-snapshots/ThreeDimScatterChart-1-webkit-linux.png (content)
⚔️ test/cartesian/Area.spec.tsx (content)
⚔️ test/cartesian/Area.typed.spec.tsx (content)
⚔️ test/cartesian/Bar.truncateByDomain.spec.tsx (content)
⚔️ test/cartesian/Bar/Bar.spec.tsx (content)
⚔️ test/cartesian/ErrorBar.spec.tsx (content)
⚔️ test/cartesian/ReferenceArea.spec.tsx (content)
⚔️ test/cartesian/ReferenceDot.spec.tsx (content)
⚔️ test/cartesian/ReferenceLine/ReferenceLine.spec.tsx (content)
⚔️ test/cartesian/XAxis/XAxis.barSize.spec.tsx (content)
⚔️ test/cartesian/XAxis/XAxis.padding.spec.tsx (content)
⚔️ test/cartesian/XAxis/XAxis.state.spec.tsx (content)
⚔️ test/cartesian/YAxis/YAxis.spec.tsx (content)
⚔️ test/cartesian/ZAxis.spec.tsx (content)
⚔️ test/chart/AreaChart.spec.tsx (content)
⚔️ test/chart/BarChart.spec.tsx (content)
⚔️ test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx (content)
⚔️ test/component/Tooltip/defaultIndex.spec.tsx (content)
⚔️ test/component/Tooltip/itemSorter.spec.tsx (content)
⚔️ test/hooks/useAxisTicks.spec.tsx (content)
⚔️ test/hooks/useOffset.spec.tsx (content)
⚔️ test/polar/Pie/Pie.spec.tsx (content)
⚔️ test/state/selectors/areaSelectors.spec.tsx (content)
⚔️ test/state/selectors/axisSelectors.spec.tsx (content)
⚔️ test/state/selectors/dataSelectors.spec.tsx (content)
⚔️ test/state/selectors/lineSelectors.spec.tsx (content)
⚔️ test/state/selectors/pieSelectors.spec.tsx (content)
⚔️ test/state/selectors/selectAxisScale.spec.tsx (content)
⚔️ test/state/selectors/selectDisplayedData.spec.tsx (content)
⚔️ test/state/selectors/selectors.spec.tsx (content)
⚔️ www/src/docs/apiExamples/useAxisInverseDataSnapScale/DataSnapExample.tsx (content)
⚔️ www/src/docs/apiExamples/useAxisInverseTickSnapScale/AxisTicksSnapExample.tsx (content)
⚔️ www/src/docs/exampleComponents/BarChart/index.tsx (content)

These conflicts must be resolved before merging into main.
Resolve conflicts locally and push changes to this branch.
Title check ⚠️ Warning The PR title references 'computeWaterfallData utility' but this was removed from the library exports per maintainer feedback; the actual change adds a WaterfallExample component to documentation with inline computation logic, not a general utility export. Update title to reflect the actual change: 'docs: add waterfall chart example with data computation' or similar, accurately describing the website example addition rather than utility export.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch feature/waterfall-utility
  • Post resolved changes as copyable diffs in a comment

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@src/util/waterfall.ts`:
- Around line 94-102: The function resolveBoolean uses an `as` cast to access a
keyed property on entry; remove the cast by constraining the generic type so
entry is indexable (e.g. change the signature to resolveBoolean<T extends
Record<string, unknown>>(entry: T, key: string | ((entry: T) => boolean) |
undefined): boolean) and then return Boolean(entry[key]) for the string-key
branch; keep the function behavior the same but eliminate the `as` assertion and
rely on the constrained generic type instead.
- Around line 87-92: The resolveValue function uses 'as' casts and can return
undefined cast to number; change its signature and implementation to avoid 'as'
by constraining the generic (e.g., T extends Record<string, number>) or by
runtime-narrowing the property access: if key is a function call it, and if key
is a string check that entry hasOwnProperty(key) and typeof value === 'number'
before returning; if the property is missing or not a number throw or return a
defined fallback to prevent NaN. Update the resolveValue definition and its
callers to match the tighter type or handle the thrown error.

In `@storybook/stories/Examples/BarChart/WaterfallChart.stories.tsx`:
- Around line 2-3: The file imports computeWaterfallData from an internal path;
instead, remove the separate import from '../../../../src/util/waterfall' and
import computeWaterfallData from the public API along with the other symbols
already imported from '../../../../src' (i.e., add computeWaterfallData to the
existing import list that currently contains Bar, BarChart, CartesianGrid, Cell,
ResponsiveContainer, Tooltip, XAxis, YAxis) so all non-test imports use the
public entry point.
🧹 Nitpick comments (3)
src/util/waterfall.ts (1)

132-134: Total bar semantics: cumulativeValue after a total bar may surprise consumers.

When isTotal is true, runningTotal is not updated — which is correct for bar positioning. However, the cumulativeValue emitted for the total bar reflects the pre-total running sum, not the total's value. For a total bar with value: 70 following items summing to 70, the cumulativeValue happens to match, but if a user intentionally sets a different total value (e.g., an adjusted figure), the cumulativeValue won't reflect it. Consider documenting this in the JSDoc for cumulativeValue, since it always tracks the running sum of non-total entries.

storybook/stories/Examples/BarChart/WaterfallChart.stories.tsx (1)

83-86: Consider reusing the getFill helper for the BudgetaryImpact story.

The color logic on line 85 duplicates the positive/negative coloring from getFill (lines 29–32), minus the total-bar handling. Since BudgetaryImpact also has a total bar (line 61), it would benefit from using getFill to consistently color total bars with TOTAL_COLOR.

test/util/waterfall.spec.ts (1)

89-97: Consider adding a test for property name collisions.

Since computeWaterfallData spreads the original entry and then adds waterfallRange, value, cumulativeValue, isTotal, and entry, an input object that already has one of these keys (e.g., { name: 'A', value: 10, isTotal: false, waterfallRange: 'custom' }) will be silently overwritten. A test documenting this behavior would clarify the contract for consumers.

MaxGhenis and others added 2 commits February 14, 2026 17:10
- Remove `as` casts in resolveValue/resolveBoolean, use constrained generics
- Import computeWaterfallData from public API in storybook story
- Reuse getFill helper in BudgetaryImpact story for consistent total bar coloring
- Clarify cumulativeValue JSDoc for total bar behavior

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/util/waterfall.ts`:
- Around line 89-95: resolveValue currently can return NaN when entry[key] is
undefined or non-coercible; change resolveValue(entry, key) to coerce the value
to a number then check Number.isFinite(result) and return 0 as a safe fallback
(or throw if you prefer) instead of returning NaN so downstream calculations
(runningTotal, waterfallRange) don't silently break; ensure you handle both
branches (when key is a function and when key is a string) and apply the same
finite-number check before returning.
🧹 Nitpick comments (2)
src/util/waterfall.ts (2)

37-57: Consider constraining T on WaterfallOptions to match computeWaterfallData.

WaterfallOptions<T> leaves T unconstrained, but computeWaterfallData requires T extends Record<string, unknown>. Adding the same bound to the interface prevents consumers from constructing a WaterfallOptions<T> that the function can never accept.

♻️ Suggested change
-export interface WaterfallOptions<T> {
+export interface WaterfallOptions<T extends Record<string, unknown>> {

(Same for WaterfallDatum<T> on line 59.)


153-160: Property name collision risk with spread.

If T already has fields named waterfallRange, value, cumulativeValue, isTotal, or entry, the computed fields silently overwrite them. The originals are still accessible via the nested entry property, so this is workable, but a brief JSDoc note warning consumers about reserved property names would prevent confusion.

Comment on lines +89 to +95
function resolveValue<T extends Record<string, unknown>>(entry: T, key: string | ((entry: T) => number)): number {
if (typeof key === 'function') {
return key(entry);
}
const raw = entry[key];
return typeof raw === 'number' ? raw : Number(raw);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

resolveValue can silently produce NaN for missing or non-numeric properties.

When entry[key] is undefined (missing key) or a non-coercible value, Number(raw) returns NaN, which silently propagates into every downstream calculation (runningTotal, waterfallRange). Returning 0 (or throwing) would be safer than producing invisible/broken bars.

♻️ Suggested fix
 function resolveValue<T extends Record<string, unknown>>(entry: T, key: string | ((entry: T) => number)): number {
   if (typeof key === 'function') {
     return key(entry);
   }
   const raw = entry[key];
-  return typeof raw === 'number' ? raw : Number(raw);
+  if (typeof raw === 'number') {
+    return raw;
+  }
+  const coerced = Number(raw);
+  return Number.isNaN(coerced) ? 0 : coerced;
 }
🤖 Prompt for AI Agents
In `@src/util/waterfall.ts` around lines 89 - 95, resolveValue currently can
return NaN when entry[key] is undefined or non-coercible; change
resolveValue(entry, key) to coerce the value to a number then check
Number.isFinite(result) and return 0 as a safe fallback (or throw if you prefer)
instead of returning NaN so downstream calculations (runningTotal,
waterfallRange) don't silently break; ensure you handle both branches (when key
is a function and when key is a string) and apply the same finite-number check
before returning.

/>
<Bar dataKey="waterfallRange" isAnimationActive={false}>
{budgetWaterfall.map((entry, index) => (
<Cell key={`cell-${index}`} fill={getFill(entry)} />
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don't use Cell in new charts, we're going to remove it in 4.0

MaxGhenis and others added 2 commits February 15, 2026 07:51
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@ckifer
Copy link
Member

ckifer commented Feb 15, 2026

This kind of feels like user land code to me as a utility. Not that it's a bad thing, but not all waterfall implementations may want this same behavior. Once we export this we are responsible for it in a way that we are not if we just say, document it as a possible option

- Add API example for computeWaterfallData, WaterfallDatum, and
  WaterfallOptions to satisfy omnidoc verifyExamples tests
- Remove Cell from storybook story per maintainer review
- Update JSDoc example in waterfall.ts to not use Cell

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@PavelVanecek
Copy link
Collaborator

+1 to @ckifer. I think this would be a great example chart (as a sibling of https://recharts.github.io/en-US/examples/Candlestick/ and https://recharts.github.io/en-US/examples/PopulationPyramid/) but not as a general library export. It works for one specific data format but not others, we're not helping.

Would you like to turn this into a website example?

@PavelVanecek
Copy link
Collaborator

Alternatively we could start a second project, one where we're more opinionated about the data shapes, and provide some pre-made charts. Sort of competition to what shadcn and evilcharts are doing. If we put it in separate npm package then we have 100% freedom, if we put it in the main lib we need to double check that we can tree-shake the extra code.

@MaxGhenis
Copy link
Contributor Author

Makes sense — I'll convert this to a website example (like Candlestick/PopulationPyramid) rather than a library export. Will update the PR.

Remove computeWaterfallData from library exports (src/index.ts,
src/util/waterfall.ts, snapshot files) and omnidoc API examples.
Instead, add a Waterfall example to the BarChart examples page
(like Candlestick and PopulationPyramid) with the computation
logic defined inline in the example code.

This addresses maintainer feedback on PR recharts#7011 to keep waterfall
as a demonstrated pattern rather than a library export.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@MaxGhenis
Copy link
Contributor Author

Updated — removed the library export entirely and converted to a self-contained website example at www/src/docs/exampleComponents/BarChart/WaterfallExample.tsx (following the Candlestick/PopulationPyramid pattern). The waterfall computation logic is inline in the example. All unit tests pass.

Copy link
Collaborator

@PavelVanecek PavelVanecek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A new VR test for the new example would be nice too

@codecov
Copy link

codecov bot commented Feb 16, 2026

Codecov Report

❌ Patch coverage is 83.14607% with 15 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.10%. Comparing base (bd9869c) to head (dbd8560).
⚠️ Report is 7 commits behind head on main.

Files with missing lines Patch % Lines
...cs/exampleComponents/BarChart/WaterfallExample.tsx 78.57% 15 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main    #7011    +/-   ##
========================================
  Coverage   90.09%   90.10%            
========================================
  Files         523      525     +2     
  Lines       38921    39162   +241     
  Branches     5353     5408    +55     
========================================
+ Hits        35067    35285   +218     
- Misses       3845     3868    +23     
  Partials        9        9            

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ckifer ckifer changed the title feat: add computeWaterfallData utility for waterfall charts docs: add computeWaterfallData utility for waterfall charts Feb 17, 2026
@ckifer ckifer merged commit 6e34f78 into recharts:main Feb 17, 2026
40 of 41 checks passed
@MaxGhenis MaxGhenis deleted the feature/waterfall-utility branch February 17, 2026 13:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants