JSFiddle - React, Tailwind, and code Playground
by leonsaysHi
HTML
<div class="hierarchy">
<div class="item item--sup">
<div class="item__card"></div>
</div>
<div class="item item--self">
<div class="item__card"></div>
</div>
<div class="subs-deco"></div>
<div class="subs">
<span class="subs__rows-deco"></span>
<div class="item">
<div class="item-deco"></div>
<div class="item__card"></div>
</div>
<span class="subs__rows-deco"></span>
<div class="item">
<div class="item-deco"></div>
<div class="item__card"></div>
</div>
<span class="subs__rows-deco"></span>
<div class="item">
<div class="item-deco"></div>
<div class="item__card"></div>
</div>
<span class="subs__rows-deco"></span>
<div class="item">
<div class="item-deco"></div>
<div class="item__card"></div>
</div>
<span class="subs__rows-deco"></span>
<div class="item">
<div class="item-deco"></div>
<div class="item__card"></div>
</div>
</div>
</div>
CSS
.hierarchy {
display: grid;
grid-template-columns: [deco] 40px [items] auto [end];
grid-template-rows: [sup] 1fr [self] 1fr [subs-deco] auto [subs] auto [end];
}
.item--sup {
grid-column: items / end;
grid-row: sup / span 1;
}
.item--self {
grid-column: items / end;
grid-row: self / subs;
}
.subs-deco {
position: relative;
grid-column: items / end;
grid-row: subs-deco / subs;
height: 10px;
}
.subs-deco:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
width: 2px;
background-color: grey;
}
.subs {
display: grid;
grid-template-columns: 40px 1fr;
grid-column: deco / end;
grid-row: subs / end;
}
.subs__rows-deco {
position: relative;
}
.subs__rows-deco:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
width: 2px;
background-color: grey;
}
.subs > *:nth-last-child(-n+2):before {
height: 50%;
}
.subs__rows-deco:after {
content: '';
position: absolute;
top: 0;
right: 0;
width: 50%;
height: calc(50% - 4px);
border-top: solid 2px transparent;
border-bottom: solid 2px grey;
}
.subs>*:first-child:after {
border-top-color: grey;
}
.item-deco {
position: relative;
height: 10px;
}
.item-deco:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 2px;
background-color: grey;
}
.subs > .item:last-child .item-deco:before {
width: 50%;
}
.subs .item-deco {
display: none;
}
.subs > *:nth-child(2) .item-deco {
display: block;
}
.item-deco:after {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 2px;
height: 2px;
background-color: grey;
}
.item__card {
min-height: 40px;
border: solid 1px pink;
}
.subs .item__card {
margin-bottom: 10px;
}
@media (min-width: 768px) and (max-width: 1023px) {
.subs {
grid-template-columns: 40px repeat(2, 1fr);
}
.subs__rows-deco {
display: none;
}
.subs__rows-deco:after {
border-top-color: grey;
...