Replace hero mockup with auto-rotating screenshot carousel
- Swap static dashboard card for 3-slide image carousel in hero section - Slides auto-advance every 4.5s, pause on hover, support manual prev/next and dot navigation - Add carousel CSS with fade transition, dot indicators, and glow border treatment - Add carousel JS with goTo/prev/next/auto-rotate logic - Images expected at img/screenshot-dashboard.png, img/screenshot-cashflow.png, img/screenshot-capital.png Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
46
app.js
46
app.js
@@ -20,6 +20,52 @@
|
|||||||
if (signupEl) signupEl.textContent = text;
|
if (signupEl) signupEl.textContent = text;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
// ── Screenshot Carousel ──────────────────────────────────
|
||||||
|
(function initCarousel() {
|
||||||
|
const carousel = document.getElementById('screenshotCarousel');
|
||||||
|
if (!carousel) return;
|
||||||
|
|
||||||
|
const slides = carousel.querySelectorAll('.carousel-slide');
|
||||||
|
const dots = carousel.querySelectorAll('.carousel-dot');
|
||||||
|
let current = 0;
|
||||||
|
let timer;
|
||||||
|
|
||||||
|
function goTo(index) {
|
||||||
|
slides[current].classList.remove('active');
|
||||||
|
dots[current].classList.remove('active');
|
||||||
|
current = (index + slides.length) % slides.length;
|
||||||
|
slides[current].classList.add('active');
|
||||||
|
dots[current].classList.add('active');
|
||||||
|
}
|
||||||
|
|
||||||
|
function next() { goTo(current + 1); }
|
||||||
|
function prev() { goTo(current - 1); }
|
||||||
|
|
||||||
|
function startAuto() {
|
||||||
|
timer = setInterval(next, 4500);
|
||||||
|
}
|
||||||
|
function resetAuto() {
|
||||||
|
clearInterval(timer);
|
||||||
|
startAuto();
|
||||||
|
}
|
||||||
|
|
||||||
|
carousel.querySelector('.carousel-next').addEventListener('click', () => { next(); resetAuto(); });
|
||||||
|
carousel.querySelector('.carousel-prev').addEventListener('click', () => { prev(); resetAuto(); });
|
||||||
|
|
||||||
|
dots.forEach(dot => {
|
||||||
|
dot.addEventListener('click', () => {
|
||||||
|
goTo(parseInt(dot.dataset.index, 10));
|
||||||
|
resetAuto();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pause on hover
|
||||||
|
carousel.addEventListener('mouseenter', () => clearInterval(timer));
|
||||||
|
carousel.addEventListener('mouseleave', startAuto);
|
||||||
|
|
||||||
|
startAuto();
|
||||||
|
})();
|
||||||
|
|
||||||
// ── Form Handler ─────────────────────────────────────────
|
// ── Form Handler ─────────────────────────────────────────
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
const form = document.getElementById('signupForm');
|
const form = document.getElementById('signupForm');
|
||||||
|
|||||||
50
index.html
50
index.html
@@ -70,43 +70,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Floating dashboard mockup -->
|
<!-- Screenshot Carousel -->
|
||||||
<div class="hero-visual">
|
<div class="hero-visual">
|
||||||
<div class="dashboard-card">
|
<div class="screenshot-carousel" id="screenshotCarousel">
|
||||||
<div class="dash-header">
|
<div class="carousel-frame">
|
||||||
<span class="dash-dot red"></span>
|
<div class="carousel-slides">
|
||||||
<span class="dash-dot yellow"></span>
|
<div class="carousel-slide active">
|
||||||
<span class="dash-dot green"></span>
|
<img src="img/screenshot-dashboard.png" alt="HOA LedgerIQ Dashboard — Fund health scores, operating and reserve balances" />
|
||||||
<span class="dash-title">LedgerIQ Dashboard</span>
|
<div class="slide-caption">Dashboard — Fund Health & At-a-Glance Metrics</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="dash-body">
|
<div class="carousel-slide">
|
||||||
<div class="dash-stat">
|
<img src="img/screenshot-cashflow.png" alt="HOA LedgerIQ Cash Flow — Projected balances with forward forecasting chart" />
|
||||||
<div class="stat-label">Total Collected YTD</div>
|
<div class="slide-caption">Cash Flow — Actuals & Forward Projections</div>
|
||||||
<div class="stat-value green-text">$412,850</div>
|
|
||||||
<div class="stat-delta">↑ 8.2% vs last year</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dash-stat">
|
<div class="carousel-slide">
|
||||||
<div class="stat-label">Delinquency Rate</div>
|
<img src="img/screenshot-capital.png" alt="HOA LedgerIQ Capital Planning — Multi-year project timeline and budget view" />
|
||||||
<div class="stat-value amber-text">3.4%</div>
|
<div class="slide-caption">Capital Planning — 5-Year Project Pipeline</div>
|
||||||
<div class="stat-delta">↓ 1.1% this quarter</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dash-stat">
|
|
||||||
<div class="stat-label">Reserve Fund Health</div>
|
|
||||||
<div class="stat-value green-text">92%</div>
|
|
||||||
<div class="stat-delta">AI Forecast: On Track</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dash-chart">
|
|
||||||
<div class="chart-bar" style="height:55%"></div>
|
|
||||||
<div class="chart-bar" style="height:70%"></div>
|
|
||||||
<div class="chart-bar" style="height:60%"></div>
|
|
||||||
<div class="chart-bar" style="height:85%"></div>
|
|
||||||
<div class="chart-bar active" style="height:92%"></div>
|
|
||||||
<div class="chart-bar" style="height:80%"></div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dash-ai-chip">
|
<div class="carousel-controls">
|
||||||
<span class="ai-icon">✦</span>
|
<button class="carousel-btn carousel-prev" aria-label="Previous screenshot">←</button>
|
||||||
AI Insight: Reserve funding on pace for full replenishment by Q3.
|
<div class="carousel-dots">
|
||||||
|
<span class="carousel-dot active" data-index="0"></span>
|
||||||
|
<span class="carousel-dot" data-index="1"></span>
|
||||||
|
<span class="carousel-dot" data-index="2"></span>
|
||||||
</div>
|
</div>
|
||||||
|
<button class="carousel-btn carousel-next" aria-label="Next screenshot">→</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
97
styles.css
97
styles.css
@@ -623,6 +623,103 @@ body {
|
|||||||
color: var(--gray-700);
|
color: var(--gray-700);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ---- Screenshot Carousel ---- */
|
||||||
|
.screenshot-carousel {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 60px auto 0;
|
||||||
|
padding: 0 24px;
|
||||||
|
}
|
||||||
|
.carousel-frame {
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid rgba(255,255,255,0.1);
|
||||||
|
box-shadow: 0 0 80px rgba(79,70,229,0.25), var(--shadow-lg);
|
||||||
|
background: var(--gray-800);
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.carousel-slides {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.carousel-slide {
|
||||||
|
display: none;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.carousel-slide.active {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.carousel-slide img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
border-radius: var(--radius-lg) var(--radius-lg) 0 0;
|
||||||
|
}
|
||||||
|
.slide-caption {
|
||||||
|
padding: 12px 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--gray-500);
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
text-align: center;
|
||||||
|
background: var(--gray-800);
|
||||||
|
border-top: 1px solid rgba(255,255,255,0.06);
|
||||||
|
}
|
||||||
|
.carousel-controls {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 16px;
|
||||||
|
margin-top: 18px;
|
||||||
|
}
|
||||||
|
.carousel-btn {
|
||||||
|
background: rgba(255,255,255,0.06);
|
||||||
|
border: 1px solid rgba(255,255,255,0.1);
|
||||||
|
color: var(--gray-400);
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 16px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transition: all 0.15s;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.carousel-btn:hover {
|
||||||
|
background: rgba(79,70,229,0.25);
|
||||||
|
border-color: rgba(79,70,229,0.5);
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.carousel-dots {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.carousel-dot {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: var(--gray-700);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.carousel-dot.active {
|
||||||
|
background: var(--blue);
|
||||||
|
width: 22px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fade transition */
|
||||||
|
.carousel-slide {
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.4s ease;
|
||||||
|
}
|
||||||
|
.carousel-slide.active {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* ---- Request Quote pricing ---- */
|
/* ---- Request Quote pricing ---- */
|
||||||
.price-amount--quote {
|
.price-amount--quote {
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
|
|||||||
Reference in New Issue
Block a user