rgba(0,0,0,0.1) <h2>3 & 4 Bedroom Townhomes Now Selling in Altona North</h2>
<p>The Hidden Gem of the Inner West.</p> The Fabric by Mirvac <style>
.cards-wrap {
width: 100%;
display: block;
box-sizing: border-box;
padding: 2rem;
}
.cards-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
width: 100%;
max-width: 900px;
margin: 0 auto;
box-sizing: border-box;
position: relative;
z-index: 10;
}
@media (max-width: 768px) {
.cards-grid {
grid-template-columns: 1fr;
max-width: 360px;
}
}
.flip-card {
width: 100%;
aspect-ratio: 1 / 1;
perspective: 1000px;
cursor: pointer;
position: relative;
z-index: 10;
box-sizing: border-box;
}
.flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: transform 1.2s ease;
border-radius: 12px;
}
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 12px;
overflow: hidden;
border: 1px solid #444;
}
.flip-card-front img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.flip-card-front .label {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 10px 14px;
background: rgba(0,0,0,0.55);
color: #fff;
font-size: 14px;
font-weight: 500;
}
.flip-card-back {
background: #1e1e1e;
transform: rotateY(180deg);
display: flex;
flex-direction: column;
justify-content: center;
padding: 1.5rem;
gap: 10px;
}
.flip-card-back h3 {
margin: 0;
font-size: 16px;
color: #fff;
}
.flip-card-back p {
margin: 0;
font-size: 13px;
color: #aaa;
line-height: 1.6;
}
.flip-card-back a {
font-size: 13px;
color: #c9a96e;
text-decoration: none;
font-weight: 500;
}
</style>
<div class="cards-wrap">
<div class="cards-grid">
<div class="flip-card">
<div class="flip-card-inner">
<div class="flip-card-front">
<img src="https://edge.sitecorecloud.io/mirvacprocu45a5-mirvacsitec7536-prodc5da-5fc1/media/Project/residential/thefabric/Media/New-Site/1290-DBR-Spec/1290-by-DBR_Ensuite_1080x580.png?h=323&w=600" alt="The Fabric" />
<div class="label">Card Title</div>
</div>
<div class="flip-card-back">
<h3>Card Title</h3>
<p>Your description text goes here.</p>
<a href="/your-page">Learn more →</a>
</div>
</div>
</div>
<div class="flip-card">
<div class="flip-card-inner">
<div class="flip-card-front">
<img src="https://edge.sitecorecloud.io/mirvacprocu45a5-mirvacsitec7536-prodc5da-5fc1/media/Project/residential/thefabric/Media/New-Site/1290-DBR-Spec/1290-by-DBR_Ensuite_1080x580.png?h=323&w=600" alt="The Fabric" />
<div class="label">Card Title</div>
</div>
<div class="flip-card-back">
<h3>Card Title</h3>
<p>Your description text goes here.</p>
<a href="/your-page">Learn more →</a>
</div>
</div>
</div>
<div class="flip-card">
<div class="flip-card-inner">
<div class="flip-card-front">
<img src="https://edge.sitecorecloud.io/mirvacprocu45a5-mirvacsitec7536-prodc5da-5fc1/media/Project/residential/thefabric/Media/New-Site/1290-DBR-Spec/1290-by-DBR_Ensuite_1080x580.png?h=323&w=600" alt="The Fabric" />
<div class="label">Card Title</div>
</div>
<div class="flip-card-back">
<h3>Card Title</h3>
<p>Your description text goes here.</p>
<a href="/your-page">Learn more →</a>
</div>
</div>
</div>
</div>
</div> <style>
.tl-wrap {
width: 100%;
max-width: 900px;
margin: 0 auto;
padding: 3rem 2rem;
box-sizing: border-box;
view-timeline-name: --tl;
view-timeline-axis: block;
}
.tl-dots-row {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
height: 20px;
}
.tl-bar-bg {
position: absolute;
top: 50%;
left: 0;
right: 0;
height: 2px;
background: #444;
transform: translateY(-50%);
z-index: 0;
}
@keyframes fillBar {
from { width: 0%; }
to { width: 100%; }
}
.tl-bar-fill {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 0%;
background: #c9a96e;
animation: fillBar linear both;
animation-timeline: --tl;
animation-range: cover 20% cover 80%;
}
.tl-dot {
width: 14px;
height: 14px;
border-radius: 50%;
background: #444;
border: 2px solid #444;
z-index: 1;
flex-shrink: 0;
}
@keyframes dotOn {
to { background: #c9a96e; border-color: #c9a96e; }
}
@keyframes labelOn {
to { color: #c9a96e; }
}
.tl-dot[data-i="0"] { animation: dotOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 20% cover 32%; }
.tl-dot[data-i="1"] { animation: dotOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 32% cover 47%; }
.tl-dot[data-i="2"] { animation: dotOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 47% cover 62%; }
.tl-dot[data-i="3"] { animation: dotOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 62% cover 68%; }
.tl-dot[data-i="4"] { animation: dotOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 68% cover 80%; }
.tl-label[data-i="0"] { animation: labelOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 20% cover 32%; }
.tl-label[data-i="1"] { animation: labelOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 32% cover 47%; }
.tl-label[data-i="2"] { animation: labelOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 47% cover 62%; }
.tl-label[data-i="3"] { animation: labelOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 62% cover 68%; }
.tl-label[data-i="4"] { animation: labelOn steps(1,end) both; animation-timeline: --tl; animation-range: cover 68% cover 80%; }
.tl-labels-row {
display: flex;
justify-content: space-between;
margin-top: 10px;
}
.tl-label {
font-size: 12px;
color: #aaa;
text-align: center;
white-space: nowrap;
}
@media (max-width: 600px) {
.tl-label { font-size: 10px; }
.tl-dot { width: 10px; height: 10px; }
}
</style>
<div class="tl-wrap">
<div class="tl-dots-row">
<div class="tl-bar-bg">
<div class="tl-bar-fill"></div>
</div>
<div class="tl-dot" data-i="0"></div>
<div class="tl-dot" data-i="1"></div>
<div class="tl-dot" data-i="2"></div>
<div class="tl-dot" data-i="3"></div>
<div class="tl-dot" data-i="4"></div>
</div>
<div class="tl-labels-row">
<div class="tl-label" data-i="0">Stage 1</div>
<div class="tl-label" data-i="1">Stage 2</div>
<div class="tl-label" data-i="2">Stage 3</div>
<div class="tl-label" data-i="3">Stage 4</div>
<div class="tl-label" data-i="4">Stage 5</div>
</div>
</div>