@@ -2,11 +2,25 @@ import './Timeline.css';
2
2
import { useEffect , useRef } from 'react' ;
3
3
import { TimelineItem , TimelineItemProps } from './TimelineItem' ;
4
4
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
+
5
10
export type TimelineProps = {
6
11
items : TimelineItemProps [ ] ;
12
+ gap ?: number ;
13
+ offset ?: OffsetConfig ;
7
14
} ;
8
15
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
+
10
24
const itemsRef = useRef < Map < Date , HTMLElement > > ( ) ;
11
25
12
26
function getRefMap ( ) {
@@ -20,18 +34,19 @@ export function Timeline({ items }: TimelineProps) {
20
34
useEffect ( ( ) => {
21
35
const elements = Array . from ( getRefMap ( ) . values ( ) ) ;
22
36
23
- let leftHeight = 0 ;
24
- let rightHeight = 0 ;
37
+ const { left, right } = resolveOffsets ( offset ?? 0 ) ;
38
+ let leftHeight = left ;
39
+ let rightHeight = right ;
25
40
26
41
elements . forEach ( ( item ) => {
27
42
const element = item ;
28
43
if ( leftHeight > rightHeight ) {
29
44
element . style . top = `${ rightHeight } px` ;
30
45
element . style . right = '0' ;
31
- rightHeight += element . offsetHeight ;
46
+ rightHeight += element . offsetHeight + ( gap ?? 0 ) ;
32
47
} else {
33
48
element . style . top = `${ leftHeight } px` ;
34
- leftHeight += element . offsetHeight ;
49
+ leftHeight += element . offsetHeight + ( gap ?? 0 ) ;
35
50
element . style . left = '0' ;
36
51
}
37
52
} ) ;
0 commit comments