Compare commits

...

2 Commits

Author SHA1 Message Date
1563a183fb adding screenshots 2026-03-09 14:45:46 -04:00
4f99e8c71a 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>
2026-03-09 14:42:05 -04:00
7 changed files with 167 additions and 34 deletions

BIN
.DS_Store vendored

Binary file not shown.

46
app.js
View File

@@ -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');

BIN
img/screenshot-capital.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
img/screenshot-cashflow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -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 &amp; At-a-Glance Metrics</div>
</div>
<div class="carousel-slide">
<img src="img/screenshot-cashflow.png" alt="HOA LedgerIQ Cash Flow — Projected balances with forward forecasting chart" />
<div class="slide-caption">Cash Flow — Actuals &amp; Forward Projections</div>
</div>
<div class="carousel-slide">
<img src="img/screenshot-capital.png" alt="HOA LedgerIQ Capital Planning — Multi-year project timeline and budget view" />
<div class="slide-caption">Capital Planning — 5-Year Project Pipeline</div>
</div>
</div>
</div> </div>
<div class="dash-body"> <div class="carousel-controls">
<div class="dash-stat"> <button class="carousel-btn carousel-prev" aria-label="Previous screenshot">&#8592;</button>
<div class="stat-label">Total Collected YTD</div> <div class="carousel-dots">
<div class="stat-value green-text">$412,850</div> <span class="carousel-dot active" data-index="0"></span>
<div class="stat-delta">↑ 8.2% vs last year</div> <span class="carousel-dot" data-index="1"></span>
</div> <span class="carousel-dot" data-index="2"></span>
<div class="dash-stat">
<div class="stat-label">Delinquency Rate</div>
<div class="stat-value amber-text">3.4%</div>
<div class="stat-delta">↓ 1.1% this quarter</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 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 class="dash-ai-chip">
<span class="ai-icon"></span>
AI Insight: Reserve funding on pace for full replenishment by Q3.
</div> </div>
<button class="carousel-btn carousel-next" aria-label="Next screenshot">&#8594;</button>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -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;