11import './Timeline.css' ;
22import { Key , useEffect , useRef } from 'react' ;
33import { PropsWithKey , TimelineItem , TimelineItemProps } from './TimelineItem' ;
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-
10- const MIN_MARKER_OFFSET = 50 ;
11-
12- const getMarkerCompensationOffset = ( left : number , right : number ) => {
13- const heightDifference = Math . abs ( left - right ) ;
14- if ( heightDifference < MIN_MARKER_OFFSET ) {
15- return MIN_MARKER_OFFSET - heightDifference ;
16- }
17- return 0 ;
18- } ;
4+ import { OffsetConfig , resolveOffsets } from '../models/offset' ;
195
206export type TimelineProps = {
217 items : PropsWithKey < TimelineItemProps > [ ] ;
228 gap ?: number ;
239 offset ?: OffsetConfig ;
10+ minMarkerGap ?: number ;
2411 dateFormat ?: string ;
2512 dateLocale ?: Locale ;
2613 className ?: string ;
@@ -29,11 +16,12 @@ export type TimelineProps = {
2916const defaultTimelineConfig : Partial < TimelineProps > = {
3017 gap : 50 ,
3118 offset : 50 ,
19+ minMarkerGap : 50 ,
3220 dateFormat : 'P' ,
3321} ;
3422
3523export function Timeline ( props : TimelineProps ) {
36- const { items, gap, offset, className, dateFormat, dateLocale } = { ...defaultTimelineConfig , ...props } ;
24+ const { items, gap, offset, minMarkerGap , className, dateFormat, dateLocale } = { ...defaultTimelineConfig , ...props } ;
3725
3826 const timelineRef = useRef < HTMLDivElement > ( null ) ;
3927 const itemsRef = useRef < Map < Key , HTMLElement > > ( ) ;
@@ -46,6 +34,16 @@ export function Timeline(props: TimelineProps) {
4634 return itemsRef . current ;
4735 }
4836
37+ function getMinMarkerGapCompensation ( left : number , right : number ) {
38+ if ( minMarkerGap ) {
39+ const heightDifference = Math . abs ( left - right ) ;
40+ if ( heightDifference < minMarkerGap ) {
41+ return minMarkerGap - heightDifference ;
42+ }
43+ }
44+ return 0 ;
45+ }
46+
4947 function positionTimelineItems ( ) {
5048 const elements = Array . from ( getRefMap ( ) . values ( ) ) ;
5149
@@ -57,14 +55,14 @@ export function Timeline(props: TimelineProps) {
5755 const element = item ;
5856
5957 if ( leftHeight > rightHeight ) {
60- leftHeight += getMarkerCompensationOffset ( leftHeight , rightHeight ) ;
58+ leftHeight += getMinMarkerGapCompensation ( leftHeight , rightHeight ) ;
6159
6260 element . style . top = `${ rightHeight } px` ;
6361 element . classList . add ( 'timeline-item--right' ) ;
6462 element . classList . remove ( 'timeline-item--left' ) ;
6563 rightHeight += element . offsetHeight + ( gap ?? 0 ) ;
6664 } else {
67- rightHeight += getMarkerCompensationOffset ( leftHeight , rightHeight ) ;
65+ rightHeight += getMinMarkerGapCompensation ( leftHeight , rightHeight ) ;
6866
6967 element . style . top = `${ leftHeight } px` ;
7068 element . classList . add ( 'timeline-item--left' ) ;
0 commit comments