Skip to content

Commit d1e38ef

Browse files
committed
Merge branch 'feat-padBandRange' into beta
2 parents 4135ff5 + 9c21df7 commit d1e38ef

File tree

4 files changed

+32
-16
lines changed

4 files changed

+32
-16
lines changed

examples/simple/src/components/MultipleAxes.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export default function MultipleAxes() {
1717
>(
1818
() => ({
1919
getValue: (datum) => datum.primary as unknown as Date,
20+
// Pad the automatically detected time scale with half of the band-size
21+
padBandRange: true,
2022
}),
2123
[]
2224
);

src/seriesTypes/Bar.tsx

+15-15
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,13 @@ export default function BarComponent<TDatum>({
4141
{series.datums.map((datum, i) => {
4242
const dataStyle = getDatumStatusStyle(datum, focusedDatum)
4343

44-
const x = clampPxToAxis(
45-
0,
44+
const [x, width] = clampPxToAxis(
4645
getRectX(datum, primaryAxis, secondaryAxis) ?? NaN,
47-
xAxis
48-
)
49-
const y = clampPxToAxis(
50-
0,
51-
getRectY(datum, primaryAxis, secondaryAxis) ?? NaN,
52-
yAxis
53-
)
54-
const width = clampPxToAxis(
55-
x,
5646
getWidth(datum, primaryAxis, secondaryAxis) ?? NaN,
5747
xAxis
5848
)
59-
const height = clampPxToAxis(
60-
y,
49+
const [y, height] = clampPxToAxis(
50+
getRectY(datum, primaryAxis, secondaryAxis) ?? NaN,
6151
getHeight(datum, primaryAxis, secondaryAxis) ?? NaN,
6252
yAxis
6353
)
@@ -216,12 +206,22 @@ function getSecondary<TDatum>(
216206
return secondaryAxis.scale(datum.secondaryValue) ?? NaN
217207
}
218208

219-
function clampPxToAxis<TDatum>(base: number, px: number, axis: Axis<TDatum>) {
209+
function clampPxToAxis<TDatum>(
210+
startPx: number,
211+
lengthPx: number,
212+
axis: Axis<TDatum>
213+
) {
220214
const range = axis.scale.range()
221215

222216
if (axis.isVertical) {
223217
range.reverse()
224218
}
225219

226-
return Math.max(range[0], Math.min(px, range[1] - base))
220+
const safe = (num: number) => Math.max(range[0], Math.min(num, range[1]))
221+
222+
const safeStart = safe(startPx)
223+
const safeEnd = safe(startPx + lengthPx)
224+
const safeLength = safeEnd - safeStart
225+
226+
return [safeStart, safeLength] as const
227227
}

src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ export type AxisTimeOptions<TDatum> = AxisOptionsBase & {
267267
max?: Date
268268
hardMin?: Date
269269
hardMax?: Date
270+
padBandRange?: boolean
270271
formatters?: {
271272
scale?: (
272273
value: Date,

src/utils/buildAxis.linear.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ function buildTimeAxis<TDatum>(
168168

169169
const outerScale = scale.copy().range(outerRange)
170170

171-
// Supplmentary band scale
171+
// Supplementary band scale
172172
const primaryBandScale = isPrimary
173173
? buildPrimaryBandScale(options, scale, series, range)
174174
: undefined
@@ -177,6 +177,19 @@ function buildTimeAxis<TDatum>(
177177
? buildSeriesBandScale(options, primaryBandScale, series)
178178
: undefined
179179

180+
const primaryBandWidth = primaryBandScale?.bandwidth()
181+
182+
if (options.padBandRange && primaryBandWidth) {
183+
const bandStart = scale.invert(0)
184+
const bandEnd = scale.invert(primaryBandWidth)
185+
const diff = bandEnd.valueOf() - bandStart.valueOf()
186+
187+
scale.domain([
188+
new Date(scale.domain()[0].valueOf() - diff / 2),
189+
new Date(scale.domain()[1].valueOf() + diff / 2),
190+
])
191+
}
192+
180193
const defaultFormat = scale.tickFormat()
181194

182195
const formatters = {} as AxisTime<TDatum>['formatters']

0 commit comments

Comments
 (0)