rgba(0,0,0,0.1) <h2>3 &amp; 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&amp;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&amp;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&amp;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>