( seriesConfigs: ReadonlyArray<ResolvedBarSeriesConfig>, yScale: LinearScale, plotHeightPx: number, )
| 369 | } |
| 370 | |
| 371 | export function computeBaselineDomainAndPx( |
| 372 | seriesConfigs: ReadonlyArray<ResolvedBarSeriesConfig>, |
| 373 | yScale: LinearScale, |
| 374 | plotHeightPx: number, |
| 375 | ): Readonly<{ baselineDomain: number; baselinePx: number }> { |
| 376 | // Axis-aware baseline logic (mirrors `createBarRenderer.ts`, but in px-space): |
| 377 | // Determine visible y-domain from yScale via invert(bottom/top) where top=0 and bottom=plotHeightPx. |
| 378 | const yDomainA = yScale.invert(plotHeightPx); |
| 379 | const yDomainB = yScale.invert(0); |
| 380 | const yMin = Math.min(yDomainA, yDomainB); |
| 381 | const yMax = Math.max(yDomainA, yDomainB); |
| 382 | |
| 383 | let baselineDomain: number; |
| 384 | if (!Number.isFinite(yMin) || !Number.isFinite(yMax)) { |
| 385 | baselineDomain = computeBaselineForBarsFromData(seriesConfigs); |
| 386 | } else if (yMin <= 0 && 0 <= yMax) { |
| 387 | baselineDomain = 0; |
| 388 | } else if (yMin > 0) { |
| 389 | baselineDomain = yMin; |
| 390 | } else if (yMax < 0) { |
| 391 | baselineDomain = yMax; |
| 392 | } else { |
| 393 | baselineDomain = computeBaselineForBarsFromData(seriesConfigs); |
| 394 | } |
| 395 | |
| 396 | let baselinePx = yScale.scale(baselineDomain); |
| 397 | if (!Number.isFinite(baselinePx)) { |
| 398 | baselineDomain = computeBaselineForBarsFromData(seriesConfigs); |
| 399 | baselinePx = yScale.scale(baselineDomain); |
| 400 | } |
| 401 | if (!Number.isFinite(baselinePx)) { |
| 402 | baselineDomain = 0; |
| 403 | baselinePx = yScale.scale(0); |
| 404 | } |
| 405 | |
| 406 | return { baselineDomain, baselinePx }; |
| 407 | } |
| 408 | |
| 409 | export function bucketStackedXKey( |
| 410 | xCenterPx: number, |
no test coverage detected