Skip to content

Commit 995cf46

Browse files
committed
feat: position timeline item refs absolute
1 parent bf45080 commit 995cf46

File tree

4 files changed

+29
-12
lines changed

4 files changed

+29
-12
lines changed

src/components/Timeline.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ div.timeline__line {
1111

1212
.timeline-item {
1313
position: absolute;
14+
width: 50%;
1415
}

src/components/Timeline.stories.mdx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import { Timeline } from './Timeline';
55

66
<Timeline
77
items={[
8-
{ title: 'test1', date: new Date() },
9-
{ title: 'test2', date: new Date() },
8+
{
9+
title: 'test1',
10+
date: new Date(),
11+
children:
12+
'alsjflskdfjsdklfjsdlkjdslkjdsalfjadslkajdfsöfj fsdjf lskdfj alsfj fljsdflö dsakfjd slkfj alsjflskdfjsdklfjsdlkjdslkjdsalfjadslkajdfsöfj fsdjf lskdfj alsfj fljsdflö dsakfjd slkfj alsjflskdfjsdklfjsdlkjdslkjdsalfjadslkajdfsöfj fsdjf lskdfj alsfj fljsdflö dsakfjd slkfj alsjflskdfjsdklfjsdlkjdslkjdsalfjadslkajdfsöfj fsdjf lskdfj alsfj fljsdflö dsakfjd slkfj ',
13+
},
14+
{ title: 'test2', date: new Date(), children: 'askflkfjds flksjfdsölfks flkalkja sflkjdsf lsdkf sdflkajlkfs f' },
1015
{ title: 'test3', date: new Date() },
1116
]}
1217
/>

src/components/Timeline.tsx

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

55
export type TimelineProps = {
66
items: TimelineItemProps[];
77
};
88

99
export function Timeline({ items }: TimelineProps) {
10-
const itemsRef = useRef<Map<Date, HTMLDivElement>>();
10+
const itemsRef = useRef<Map<Date, HTMLElement>>();
1111

1212
function getRefMap() {
1313
if (!itemsRef.current) {
@@ -17,11 +17,23 @@ export function Timeline({ items }: TimelineProps) {
1717
return itemsRef.current;
1818
}
1919

20+
useEffect(() => {
21+
const elements = Array.from(getRefMap().values());
22+
const heights = elements.map((item) => item.offsetHeight);
23+
24+
elements.forEach((item, index) => {
25+
const element = item;
26+
const topOffset = heights.slice(0, index).reduce((prev, curr) => prev + curr, 0);
27+
element.style.top = `${topOffset}px`;
28+
});
29+
}, [itemsRef]);
30+
2031
return (
2132
<div className="timeline">
2233
<div className="timeline__line" />
2334
{items.map((item) => (
24-
<div
35+
<TimelineItem
36+
{...item}
2537
ref={(node) => {
2638
const map = getRefMap();
2739
if (node) {
@@ -30,9 +42,8 @@ export function Timeline({ items }: TimelineProps) {
3042
map.delete(item.date);
3143
}
3244
}}
33-
>
34-
<TimelineItem key={item.date.toISOString()} {...item} />
35-
</div>
45+
key={item.date.toISOString()}
46+
/>
3647
))}
3748
</div>
3849
);

src/components/TimelineItem.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
import { PropsWithChildren } from 'react';
1+
import { forwardRef, PropsWithChildren } from 'react';
22

33
export type TimelineItemProps = PropsWithChildren<{
44
className?: string;
55
date: Date;
66
title: string;
77
}>;
88

9-
export function TimelineItem({ className, title, date, children }: TimelineItemProps) {
9+
export const TimelineItem = forwardRef<HTMLDivElement, TimelineItemProps>(({ className, title, date, children }, ref) => {
1010
return (
11-
<div className={`${className} timeline-item`}>
11+
<div ref={ref} className={`${className} timeline-item`}>
1212
<p>{date.toISOString()}</p>
1313
<p>{title}</p>
1414
{children}
1515
</div>
1616
);
17-
}
17+
});

0 commit comments

Comments
 (0)