Skip to content

Commit 36edab2

Browse files
committed
feat: introduce gap and offset configuration
1 parent 3d719dc commit 36edab2

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

src/components/Timeline.tsx

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,25 @@ import './Timeline.css';
22
import { useEffect, useRef } from 'react';
33
import { TimelineItem, TimelineItemProps } from './TimelineItem';
44

5+
type OffsetConfig = number | { left?: number; right?: number };
6+
7+
const resolveOffsets = (offset: OffsetConfig) =>
8+
typeof offset === 'number' ? { right: offset, left: 0 } : { right: offset.right ?? 0, left: offset.left ?? 0 };
9+
510
export type TimelineProps = {
611
items: TimelineItemProps[];
12+
gap?: number;
13+
offset?: OffsetConfig;
714
};
815

9-
export function Timeline({ items }: TimelineProps) {
16+
const defaultTimelineConfig: Partial<TimelineProps> = {
17+
gap: 30,
18+
offset: 30,
19+
};
20+
21+
export function Timeline(props: TimelineProps) {
22+
const { items, gap, offset } = { ...defaultTimelineConfig, ...props };
23+
1024
const itemsRef = useRef<Map<Date, HTMLElement>>();
1125

1226
function getRefMap() {
@@ -20,18 +34,19 @@ export function Timeline({ items }: TimelineProps) {
2034
useEffect(() => {
2135
const elements = Array.from(getRefMap().values());
2236

23-
let leftHeight = 0;
24-
let rightHeight = 0;
37+
const { left, right } = resolveOffsets(offset ?? 0);
38+
let leftHeight = left;
39+
let rightHeight = right;
2540

2641
elements.forEach((item) => {
2742
const element = item;
2843
if (leftHeight > rightHeight) {
2944
element.style.top = `${rightHeight}px`;
3045
element.style.right = '0';
31-
rightHeight += element.offsetHeight;
46+
rightHeight += element.offsetHeight + (gap ?? 0);
3247
} else {
3348
element.style.top = `${leftHeight}px`;
34-
leftHeight += element.offsetHeight;
49+
leftHeight += element.offsetHeight + (gap ?? 0);
3550
element.style.left = '0';
3651
}
3752
});

0 commit comments

Comments
 (0)