Skip to content

Commit afb9dd9

Browse files
committed
refactor!: position items without absolute styling
1 parent 48a89c3 commit afb9dd9

File tree

6 files changed

+125
-137
lines changed

6 files changed

+125
-137
lines changed

package-lock.json

Lines changed: 30 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Timeline.css

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,57 @@
66
--marker-radius: 50%;
77
--pointer-height: 2rem;
88
--pointer-width: 1rem;
9+
--pointer-offset: 5rem;
910
--card-background: whitesmoke;
1011
--card-radius: 0.1rem;
1112
--card-offset: 1rem;
1213
--card-shadow: unset;
1314
--card-padding: 1rem;
15+
--gap: 1rem;
16+
--offset-left: 0;
17+
--offset-right: 5rem;
1418

1519
position: relative;
1620
}
1721

22+
.timeline {
23+
display: flex;
24+
}
25+
1826
.timeline__line {
19-
position: absolute;
2027
background-color: var(--line-color);
21-
width: var(--line-width);
22-
height: 100%;
23-
left: 50%;
24-
transform: translateX(-50%);
28+
min-width: var(--line-width);
29+
}
30+
31+
.timeline__items-container {
32+
display: flex;
33+
flex-direction: column;
34+
gap: var(--gap);
35+
flex: 1;
36+
}
37+
38+
.timeline__items-container--left {
39+
margin-top: var(--offset-left);
40+
}
41+
42+
.timeline__items-container--right {
43+
margin-top: var(--offset-right);
2544
}
2645

2746
.timeline-item {
28-
position: absolute;
29-
width: 50%;
47+
position: relative;
3048
display: flex;
3149
align-items: flex-start;
3250
transition: top 0.1s;
3351
gap: var(--card-offset);
3452
}
3553

36-
.timeline-item--left {
37-
left: 0;
54+
.timeline__items-container--left .timeline-item {
3855
flex-direction: row-reverse;
3956
}
4057

41-
.timeline-item--right {
42-
right: 0;
58+
.timeline-item__marker {
59+
margin-top: var(--pointer-offset);
4360
}
4461

4562
.timeline-item__marker:not(.timeline-item__marker--custom) {
@@ -49,11 +66,11 @@
4966
background-color: var(--marker-color);
5067
}
5168

52-
.timeline-item--left .timeline-item__marker {
53-
transform: translate(50%, -50%);
69+
.timeline__items-container--left .timeline-item .timeline-item__marker {
70+
transform: translate(calc(50% + var(--line-width) / 2), -50%);
5471
}
55-
.timeline-item--right .timeline-item__marker {
56-
transform: translate(-50%, -50%);
72+
.timeline__items-container--right .timeline-item .timeline-item__marker {
73+
transform: translate(calc(-50% - var(--line-width) / 2), -50%);
5774
}
5875

5976
.timeline-card {
@@ -81,8 +98,8 @@
8198
}
8299

83100
.timeline-card__pointer {
84-
transform: translate(100%, -50%);
85101
position: absolute;
102+
top: var(--pointer-offset);
86103
}
87104

88105
.timeline-card__pointer:not(.timeline-card__pointer--custom) {
@@ -92,33 +109,21 @@
92109
height: var(--pointer-height);
93110
}
94111

95-
.timeline-item--left .timeline-card__pointer {
112+
.timeline__items-container--left .timeline-item .timeline-card__pointer {
96113
right: 0;
114+
transform: translate(100%, -50%);
97115
}
98116

99-
.timeline-item--right .timeline-card__pointer {
117+
.timeline__items-container--right .timeline-item .timeline-card__pointer {
100118
transform: scaleX(-1) translate(100%, -50%);
101119
left: 0;
102120
}
103121

104-
/* left positioning */
105-
.timeline--left .timeline__line {
106-
left: 0;
107-
}
108-
109-
.timeline--left .timeline-item--right {
110-
left: 0;
111-
width: 100%;
122+
/* one sided positioning */
123+
.timeline--left .timeline__items-container--left {
124+
flex: 0;
112125
}
113126

114-
/* right positioning */
115-
.timeline--right .timeline__line {
116-
right: 0;
117-
left: unset;
118-
transform: translateX(50%);
119-
}
120-
121-
.timeline--right .timeline-item--left {
122-
right: 0;
123-
width: 100%;
127+
.timeline--right .timeline__items-container--right {
128+
flex: 0;
124129
}

src/components/Timeline.stories.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,17 @@ export const SpacingOptions: StoryObj<typeof Timeline> = {
160160
args: {
161161
items,
162162
...defaultTimelineConfig,
163-
gap: 100,
163+
styleConfig: {
164+
gap: '5rem',
165+
offset: {
166+
left: '10rem',
167+
right: '3rem',
168+
},
169+
pointer: {
170+
offset: '4rem',
171+
},
172+
},
164173
minMarkerGap: 150,
165-
offset: { left: 150, right: 50 },
166-
defaultPointerOffset: 60,
167174
},
168175
};
169176

0 commit comments

Comments
 (0)