Initial commit of existing project
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
node_modules/
|
||||
data/
|
||||
.env
|
||||
134
app.js
Normal file
134
app.js
Normal file
@@ -0,0 +1,134 @@
|
||||
/* HOA LedgerIQ — Frontend form handler + countdown */
|
||||
|
||||
// ── Dynamic Countdown ────────────────────────────────────
|
||||
// Launch date = March 1, 2026 + 60 days = April 30, 2026
|
||||
// On 3/1/2026 the banner shows "60 days", then counts down daily.
|
||||
(function initCountdown() {
|
||||
const launchDate = new Date('2026-04-30T00:00:00');
|
||||
const now = new Date();
|
||||
const msPerDay = 1000 * 60 * 60 * 24;
|
||||
const daysLeft = Math.max(0, Math.ceil((launchDate - now) / msPerDay));
|
||||
|
||||
const label = daysLeft === 1 ? 'Day' : 'Days';
|
||||
const text = daysLeft > 0
|
||||
? `Launching in ${daysLeft} ${label}`
|
||||
: 'Now Live!';
|
||||
|
||||
const bannerEl = document.getElementById('bannerCountdown');
|
||||
const signupEl = document.getElementById('signupCountdown');
|
||||
if (bannerEl) bannerEl.textContent = text;
|
||||
if (signupEl) signupEl.textContent = text;
|
||||
})();
|
||||
|
||||
// ── Form Handler ─────────────────────────────────────────
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const form = document.getElementById('signupForm');
|
||||
const submitBtn = document.getElementById('submitBtn');
|
||||
const btnText = submitBtn?.querySelector('.btn-text');
|
||||
const btnLoading = submitBtn?.querySelector('.btn-loading');
|
||||
const successDiv = document.getElementById('signupSuccess');
|
||||
|
||||
if (!form) return;
|
||||
|
||||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
const firstName = form.firstName.value.trim();
|
||||
const lastName = form.lastName.value.trim();
|
||||
const email = form.email.value.trim();
|
||||
|
||||
const orgName = form.orgName?.value.trim() || '';
|
||||
const state = form.state?.value || '';
|
||||
|
||||
// Basic client-side validation
|
||||
if (!firstName || !lastName || !email || !orgName || !state) {
|
||||
highlightEmpty(form);
|
||||
return;
|
||||
}
|
||||
if (!isValidEmail(email)) {
|
||||
form.email.style.borderColor = '#ef4444';
|
||||
form.email.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
// Show loading state
|
||||
setLoading(true);
|
||||
|
||||
const payload = {
|
||||
firstName,
|
||||
lastName,
|
||||
email,
|
||||
orgName: form.orgName?.value.trim() || '',
|
||||
state: form.state?.value || '',
|
||||
role: form.role.value,
|
||||
unitCount: form.unitCount.value,
|
||||
betaInterest: form.betaInterest?.checked || false,
|
||||
source: 'landing_page',
|
||||
timestamp: new Date().toISOString(),
|
||||
};
|
||||
|
||||
try {
|
||||
const res = await fetch('/api/leads', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
|
||||
if (res.ok) {
|
||||
showSuccess();
|
||||
} else {
|
||||
const data = await res.json().catch(() => ({}));
|
||||
if (res.status === 409) {
|
||||
// Already registered
|
||||
showSuccess('You\'re already on the list! We\'ll be in touch soon.');
|
||||
} else {
|
||||
alert(data.error || 'Something went wrong. Please try again.');
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// Network error — fall back to localStorage so we don't lose the lead
|
||||
saveLocally(payload);
|
||||
showSuccess();
|
||||
}
|
||||
});
|
||||
|
||||
function setLoading(on) {
|
||||
if (!btnText || !btnLoading) return;
|
||||
submitBtn.disabled = on;
|
||||
btnText.classList.toggle('hidden', on);
|
||||
btnLoading.classList.toggle('hidden', !on);
|
||||
}
|
||||
|
||||
function showSuccess(msg) {
|
||||
form.classList.add('hidden');
|
||||
if (msg && successDiv) {
|
||||
const p = successDiv.querySelector('p');
|
||||
if (p) p.textContent = msg;
|
||||
}
|
||||
successDiv?.classList.remove('hidden');
|
||||
}
|
||||
|
||||
function highlightEmpty(f) {
|
||||
['firstName', 'lastName', 'email', 'orgName', 'state'].forEach(name => {
|
||||
const el = f[name];
|
||||
if (el && !el.value.trim()) {
|
||||
el.style.borderColor = '#ef4444';
|
||||
el.addEventListener('input', () => { el.style.borderColor = ''; }, { once: true });
|
||||
el.addEventListener('change', () => { el.style.borderColor = ''; }, { once: true });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function isValidEmail(email) {
|
||||
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
||||
}
|
||||
|
||||
function saveLocally(payload) {
|
||||
try {
|
||||
const existing = JSON.parse(localStorage.getItem('hoa_leads') || '[]');
|
||||
existing.push(payload);
|
||||
localStorage.setItem('hoa_leads', JSON.stringify(existing));
|
||||
} catch (_) { /* best-effort */ }
|
||||
}
|
||||
});
|
||||
1
hoa-cd-rates.log
Normal file
1
hoa-cd-rates.log
Normal file
@@ -0,0 +1 @@
|
||||
Error response from daemon: No such container: hoa_financial_platform-backend
|
||||
441
index.html
Normal file
441
index.html
Normal file
@@ -0,0 +1,441 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>HOA LedgerIQ — AI-Powered HOA Finance Management</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" />
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
</head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-RTWNVXPMRF"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-RTWNVXPMRF');
|
||||
</script>
|
||||
<body>
|
||||
|
||||
<!-- COMING SOON BANNER -->
|
||||
<div class="coming-soon-banner">
|
||||
<span class="banner-badge" id="bannerCountdown">Launching in 60 Days</span>
|
||||
<span class="banner-text">HOA LedgerIQ is almost here — be first in line.</span>
|
||||
<a href="#preview-signup" class="banner-cta">Get Early Access →</a>
|
||||
</div>
|
||||
|
||||
<!-- NAV -->
|
||||
<nav class="nav">
|
||||
<div class="nav-inner">
|
||||
<a href="#" class="nav-logo">
|
||||
<img src="logo_house.svg" alt="HOA LedgerIQ" class="logo-img" />
|
||||
</a>
|
||||
<ul class="nav-links">
|
||||
<li><a href="#features">Features</a></li>
|
||||
<li><a href="#pricing">Pricing</a></li>
|
||||
<li><a href="#preview-signup">Early Access</a></li>
|
||||
</ul>
|
||||
<a href="#preview-signup" class="btn btn-primary nav-btn">Get Early Access</a>
|
||||
<a href="https://app.ledgeriq.com" class="btn btn-outline nav-btn nav-login" target="_blank" rel="noopener">Login</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- HERO -->
|
||||
<section class="hero">
|
||||
<div class="hero-glow"></div>
|
||||
<div class="container">
|
||||
<div class="hero-badge">
|
||||
<span class="pulse-dot"></span>
|
||||
AI-Powered HOA Finance Management
|
||||
</div>
|
||||
<h1 class="hero-headline">
|
||||
Your HOA Finances,<br />
|
||||
<span class="gradient-text">Finally Under Control</span>
|
||||
</h1>
|
||||
<p class="hero-sub">
|
||||
HOA LedgerIQ brings enterprise-grade AI analytics to community associations of any size.
|
||||
Bank and Investment tracking, real-time budget insights, delinquency tracking, and intelligent
|
||||
forecasting and planning — all in one beautifully simple platform. Stop wasting time with
|
||||
outdated & manual spreadsheets, while optimizing your community's finances.
|
||||
</p>
|
||||
<div class="hero-actions">
|
||||
<a href="#preview-signup" class="btn btn-primary btn-lg">Join the Preview List</a>
|
||||
<a href="#features" class="btn btn-ghost btn-lg">See What's Inside ↓</a>
|
||||
</div>
|
||||
<div class="hero-trust">
|
||||
<span>Built for property managers, board members & CPAs</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Floating dashboard mockup -->
|
||||
<div class="hero-visual">
|
||||
<div class="dashboard-card">
|
||||
<div class="dash-header">
|
||||
<span class="dash-dot red"></span>
|
||||
<span class="dash-dot yellow"></span>
|
||||
<span class="dash-dot green"></span>
|
||||
<span class="dash-title">LedgerIQ Dashboard</span>
|
||||
</div>
|
||||
<div class="dash-body">
|
||||
<div class="dash-stat">
|
||||
<div class="stat-label">Total Collected YTD</div>
|
||||
<div class="stat-value green-text">$412,850</div>
|
||||
<div class="stat-delta">↑ 8.2% vs last year</div>
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- SOCIAL PROOF STRIP -->
|
||||
<div class="proof-strip">
|
||||
<div class="container proof-inner">
|
||||
<span class="proof-label">Trusted workflow for</span>
|
||||
<div class="proof-items">
|
||||
<span>Self-Managed HOAs</span>
|
||||
<span class="sep">·</span>
|
||||
<span>Property Management Firms</span>
|
||||
<span class="sep">·</span>
|
||||
<span>Community CPAs</span>
|
||||
<span class="sep">·</span>
|
||||
<span>Board Treasurers</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- FEATURES -->
|
||||
<section class="features" id="features">
|
||||
<div class="container">
|
||||
<div class="section-label">Core Capabilities</div>
|
||||
<h2 class="section-title">Everything your HOA's<br />finances demand</h2>
|
||||
<p class="section-sub">From dues collection to reserve fund forecasting, LedgerIQ handles the heavy lifting so your board can focus on the community.</p>
|
||||
|
||||
<div class="features-grid">
|
||||
<div class="feature-card feature-card--highlight">
|
||||
<div class="feature-icon">✦</div>
|
||||
<h3>AI Financial Analytics</h3>
|
||||
<p>Receive intelligent AI Powered investment recommendations designed to maximize investment income while ensuring sufficient funding for operating costs and capital projects.</p>
|
||||
<div class="feature-tag">Powered by GPT-4</div>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">📊</div>
|
||||
<h3>Intelligent Cash Flow Visibility</h3>
|
||||
<p>Understand budget vs. actuals in real time, accurately forecast your cash management throughout the year to make intelligent decisions, and optimize capital project timing.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">🏦</div>
|
||||
<h3>Reserve Fund Forecasting</h3>
|
||||
<p>AI-Enabled 5 Year Comprehensive Capital Project Planning. Easily understand the community's full inventory of assets, date of last repair and expected lifespan, estimated costs and timing to enable continuous planning capability around capital projects and ensure your community is on track — before the board meeting.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">🔔</div>
|
||||
<h3>Delinquency Tracking & Alerts</h3>
|
||||
<p>Automated late-fee calculations, escalation workflows, and homeowner reminders. Reduce delinquencies without awkward board calls.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">📄</div>
|
||||
<h3>One-Click Board Reports</h3>
|
||||
<p>Beautiful, professional PDF and Excel reports ready for every board meeting — income statements, balance sheets, variance analysis, and more.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">🔒</div>
|
||||
<h3>Audit-Ready Compliance</h3>
|
||||
<p>Every transaction is timestamped, signed, and stored with a complete audit trail. Year-end CPA handoffs take minutes, not weeks.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- AI HIGHLIGHT SECTION -->
|
||||
<section class="ai-section">
|
||||
<div class="container ai-inner">
|
||||
<div class="ai-text">
|
||||
<div class="section-label">AI at the Core</div>
|
||||
<h2>Optimize your Community's Finances</h2>
|
||||
<p>LedgerIQ's AI engine doesn't just review your data — it understands it. Get proactive anomaly alerts, funding shortfalls, investment strategy ideas around your predicted cash flow, spending pattern insights, and plain-English answers to complex financial questions without needing a CPA on speed dial.</p>
|
||||
<ul class="ai-bullets">
|
||||
<li><span class="check">✓</span> Anomaly detection on every transaction</li>
|
||||
<li><span class="check">✓</span> Budget vs. actual variance alerts</li>
|
||||
<li><span class="check">✓</span> Predictive cash flow modeling</li>
|
||||
<li><span class="check">✓</span> Natural language financial Q&A</li>
|
||||
<li><span class="check">✓</span> Automated year-end closing insights</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="ai-visual">
|
||||
<div class="chat-bubble user-bubble">What investment strategy should we implement given our forecasted cash flow?</div>
|
||||
<div class="chat-bubble ai-bubble">
|
||||
<span class="ai-label">✦ LedgerIQ AI</span>
|
||||
Operating funds are currently under-utilized. With over $100k projected in cash by April, deploying $40k into a short-term CD significantly boosts interest income without compromising the ability to pay monthly expenses or handle emergencies.
|
||||
</div>
|
||||
<div class="chat-bubble user-bubble">Are we on track to fund reserves fully by year-end?</div>
|
||||
<div class="chat-bubble ai-bubble">
|
||||
<span class="ai-label">✦ LedgerIQ AI</span>
|
||||
Yes — at current contribution rate you'll hit 98% reserve funding by Dec 31. No corrective action needed. Reserve study renewal is due in March.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- PRICING -->
|
||||
<section class="pricing" id="pricing">
|
||||
<div class="container">
|
||||
<div class="section-label">Simple Pricing</div>
|
||||
<h2 class="section-title">Pick the plan that fits your community</h2>
|
||||
<p class="section-sub">No setup fees. No contracts. Cancel anytime. All plans include a 30-day free trial.</p>
|
||||
|
||||
<div class="pricing-grid">
|
||||
|
||||
<!-- STARTER -->
|
||||
<div class="pricing-card">
|
||||
<div class="plan-name">Starter</div>
|
||||
<div class="plan-tagline">Perfect for small self-managed HOAs</div>
|
||||
<div class="plan-price"><span class="price-amount">$49</span><span class="price-period">/mo</span></div>
|
||||
<div class="plan-units">Up to 75 units</div>
|
||||
<ul class="plan-features">
|
||||
<li><span class="check">✓</span> Account balance tracking</li>
|
||||
<li><span class="check">✓</span> Investment account tracking</li>
|
||||
<li><span class="check">✓</span> Dues collection tracking</li>
|
||||
<li><span class="check">✓</span> Basic delinquency alerts</li>
|
||||
<li><span class="check">✓</span> Monthly board-ready PDF reports</li>
|
||||
<li><span class="check">✓</span> Monthly Actuals reconciliation</li>
|
||||
<li><span class="check">✓</span> Role based access for board members (Up to 5 user accounts)</li>
|
||||
<li><span class="check">✓</span> Email support</li>
|
||||
<li class="dim"><span>—</span> AI Analytics</li>
|
||||
<li class="dim"><span>—</span> Reserve forecasting</li>
|
||||
<li class="dim"><span>—</span> Multi-property management</li>
|
||||
</ul>
|
||||
<a href="#preview-signup" class="btn btn-outline plan-btn">Get Early Access</a>
|
||||
</div>
|
||||
|
||||
<!-- PROFESSIONAL — FEATURED -->
|
||||
<div class="pricing-card pricing-card--featured">
|
||||
<div class="plan-badge">Most Popular</div>
|
||||
<div class="plan-name">Professional</div>
|
||||
<div class="plan-tagline">For growing communities & property managers</div>
|
||||
<div class="plan-price"><span class="price-amount">$149</span><span class="price-period">/mo</span></div>
|
||||
<div class="plan-units">Up to 250 units</div>
|
||||
<ul class="plan-features">
|
||||
<li><span class="check">✓</span> Everything in Starter</li>
|
||||
<li><span class="check">✓</span> <strong>AI Financial Analytics</strong></li>
|
||||
<li><span class="check">✓</span> Reserve fund forecasting (5-yr)</li>
|
||||
<li><span class="check">✓</span> Automated late fees & escalations</li>
|
||||
<li><span class="check">✓</span> Custom chart of accounts</li>
|
||||
<li><span class="check">✓</span> Next fiscal budget planning</li>
|
||||
<li><span class="check">✓</span> Audit trail & compliance pack</li>
|
||||
<li><span class="check">✓</span> Priority email & chat support</li>
|
||||
<li class="dim"><span>—</span> Multi-property management</li>
|
||||
</ul>
|
||||
<a href="#preview-signup" class="btn btn-primary plan-btn">Get Early Access</a>
|
||||
</div>
|
||||
|
||||
<!-- ENTERPRISE -->
|
||||
<div class="pricing-card">
|
||||
<div class="plan-name">Enterprise</div>
|
||||
<div class="plan-tagline">For management companies & large communities</div>
|
||||
<div class="plan-price"><span class="price-amount price-amount--quote">Request Quote</span></div>
|
||||
<div class="plan-units">Unlimited units</div>
|
||||
<ul class="plan-features">
|
||||
<li><span class="check">✓</span> Everything in Professional</li>
|
||||
<li><span class="check">✓</span> <strong>Multi-property management</strong></li>
|
||||
<li><span class="check">✓</span> 10-year reserve forecasting</li>
|
||||
<li><span class="check">✓</span> Custom API integrations</li>
|
||||
<li><span class="check">✓</span> Advanced AI anomaly detection</li>
|
||||
<li><span class="check">✓</span> SLA-backed uptime guarantee</li>
|
||||
<li><span class="check">✓</span> Custom onboarding & training</li>
|
||||
</ul>
|
||||
<a href="#preview-signup" class="btn btn-outline plan-btn">Get Early Access</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- PREVIEW SIGNUP -->
|
||||
<section class="signup-section" id="preview-signup">
|
||||
<div class="signup-glow"></div>
|
||||
<div class="container">
|
||||
<div class="signup-card">
|
||||
<div class="countdown-badge">
|
||||
<span class="pulse-dot pulse-dot--white"></span>
|
||||
<span id="signupCountdown">Launching in 60 days</span>
|
||||
</div>
|
||||
<h2>Get Early Access to HOA LedgerIQ</h2>
|
||||
<p>Join the waitlist and be first through the door. </p>
|
||||
|
||||
<form class="signup-form" id="signupForm" novalidate>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="firstName">First Name</label>
|
||||
<input type="text" id="firstName" name="firstName" placeholder="Jane" required />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="lastName">Last Name</label>
|
||||
<input type="text" id="lastName" name="lastName" placeholder="Smith" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email Address</label>
|
||||
<input type="email" id="email" name="email" placeholder="jane@myhoa.com" required />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="orgName">Organization Name *</label>
|
||||
<input type="text" id="orgName" name="orgName" placeholder="Maplewood Village HOA" required />
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="state">Organization Location *</label>
|
||||
<select id="state" name="state" required>
|
||||
<option value="">Select state...</option>
|
||||
<option value="AL">AL</option>
|
||||
<option value="AK">AK</option>
|
||||
<option value="AR">AR</option>
|
||||
<option value="AZ">AZ</option>
|
||||
<option value="CA">CA</option>
|
||||
<option value="CO">CO</option>
|
||||
<option value="CT">CT</option>
|
||||
<option value="DC">DC</option>
|
||||
<option value="DE">DE</option>
|
||||
<option value="FL">FL</option>
|
||||
<option value="GA">GA</option>
|
||||
<option value="HI">HI</option>
|
||||
<option value="IA">IA</option>
|
||||
<option value="ID">ID</option>
|
||||
<option value="IL">IL</option>
|
||||
<option value="IN">IN</option>
|
||||
<option value="KS">KS</option>
|
||||
<option value="KY">KY</option>
|
||||
<option value="LA">LA</option>
|
||||
<option value="MA">MA</option>
|
||||
<option value="MD">MD</option>
|
||||
<option value="ME">ME</option>
|
||||
<option value="MI">MI</option>
|
||||
<option value="MN">MN</option>
|
||||
<option value="MO">MO</option>
|
||||
<option value="MS">MS</option>
|
||||
<option value="MT">MT</option>
|
||||
<option value="NC">NC</option>
|
||||
<option value="NE">NE</option>
|
||||
<option value="NH">NH</option>
|
||||
<option value="NJ">NJ</option>
|
||||
<option value="NM">NM</option>
|
||||
<option value="NV">NV</option>
|
||||
<option value="NY">NY</option>
|
||||
<option value="ND">ND</option>
|
||||
<option value="OH">OH</option>
|
||||
<option value="OK">OK</option>
|
||||
<option value="OR">OR</option>
|
||||
<option value="PA">PA</option>
|
||||
<option value="RI">RI</option>
|
||||
<option value="SC">SC</option>
|
||||
<option value="SD">SD</option>
|
||||
<option value="TN">TN</option>
|
||||
<option value="TX">TX</option>
|
||||
<option value="UT">UT</option>
|
||||
<option value="VT">VT</option>
|
||||
<option value="VA">VA</option>
|
||||
<option value="WA">WA</option>
|
||||
<option value="WI">WI</option>
|
||||
<option value="WV">WV</option>
|
||||
<option value="WY">WY</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="unitCount">Community Size</label>
|
||||
<select id="unitCount" name="unitCount">
|
||||
<option value="">Number of units...</option>
|
||||
<option value="1-50">1–50 units</option>
|
||||
<option value="51-250">51–250 units</option>
|
||||
<option value="251-500">251–500 units</option>
|
||||
<option value="500+">500+ units</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="role">Your Role</label>
|
||||
<select id="role" name="role">
|
||||
<option value="">Select your role...</option>
|
||||
<option value="board_member">Board Member</option>
|
||||
<option value="property_manager">Property Manager</option>
|
||||
<option value="treasurer">HOA Treasurer</option>
|
||||
<option value="cpa">CPA / Accountant</option>
|
||||
<option value="homeowner">Homeowner</option>
|
||||
<option value="other">Other</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="beta-group">
|
||||
<input type="checkbox" id="betaInterest" name="betaInterest" />
|
||||
<label for="betaInterest">I'm interested in joining the Beta Program</label>
|
||||
</div>
|
||||
<p class="beta-disclaimer">Beta program selection will be determined based on the makeup of role and community size. You will be contacted directly if offered to join the beta program.</p>
|
||||
<button type="submit" class="btn btn-primary btn-lg signup-btn" id="submitBtn">
|
||||
<span class="btn-text">Reserve My Spot →</span>
|
||||
<span class="btn-loading hidden">Saving...</span>
|
||||
</button>
|
||||
<p class="form-fine">No spam, ever. Unsubscribe anytime. We'll reach out within 48 hours.</p>
|
||||
</form>
|
||||
|
||||
<div class="signup-success hidden" id="signupSuccess">
|
||||
<div class="success-icon">✓</div>
|
||||
<h3>You're on the list!</h3>
|
||||
<p>We'll be in touch soon with your early access details. Keep an eye on your inbox.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FOOTER -->
|
||||
<footer class="footer">
|
||||
<div class="container footer-inner">
|
||||
<div class="footer-logo">
|
||||
<img src="logo_house.svg" alt="HOA LedgerIQ" class="logo-img logo-img--footer" />
|
||||
<p>AI-powered HOA finance management.<br />Coming soon to hoaledgeriq.com</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<div class="footer-col">
|
||||
<div class="footer-col-title">Product</div>
|
||||
<a href="#features">Features</a>
|
||||
<a href="#pricing">Pricing</a>
|
||||
<a href="#preview-signup">Early Access</a>
|
||||
</div>
|
||||
<div class="footer-col">
|
||||
<div class="footer-col-title">Legal</div>
|
||||
<a href="privacy.html">Privacy Policy</a>
|
||||
<a href="terms.html">Terms of Service</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-bottom">
|
||||
<div class="container">
|
||||
<span>© 2026 HOA LedgerIQ. All rights reserved.</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
47
logo_house copy 2.svg
Normal file
47
logo_house copy 2.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 110 KiB |
BIN
logo_house copy.png
Normal file
BIN
logo_house copy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 76 KiB |
72
logo_house copy.svg
Normal file
72
logo_house copy.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 156 KiB |
1
logo_house-cropped.svg
Normal file
1
logo_house-cropped.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 109 KiB |
47
logo_house.svg
Normal file
47
logo_house.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 110 KiB |
14
package.json
Normal file
14
package.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "hoaledgeriq-website",
|
||||
"version": "1.0.0",
|
||||
"description": "HOA LedgerIQ marketing site + lead capture backend",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"dev": "node --watch server.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^9.4.3",
|
||||
"express": "^4.18.3"
|
||||
}
|
||||
}
|
||||
183
privacy.html
Normal file
183
privacy.html
Normal file
@@ -0,0 +1,183 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Privacy Policy — HOA LedgerIQ</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" />
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
<style>
|
||||
.legal-page { max-width: 800px; margin: 0 auto; padding: 60px 24px 100px; }
|
||||
.legal-page h1 { font-size: 38px; font-weight: 900; color: #fff; margin-bottom: 8px; letter-spacing: -0.025em; }
|
||||
.legal-meta { font-size: 13px; color: var(--gray-600); margin-bottom: 48px; }
|
||||
.legal-page h2 { font-size: 20px; font-weight: 700; color: #fff; margin: 36px 0 10px; }
|
||||
.legal-page p, .legal-page li { font-size: 15px; color: var(--gray-400); line-height: 1.75; margin-bottom: 12px; }
|
||||
.legal-page ul { padding-left: 20px; margin-bottom: 12px; }
|
||||
.legal-page a { color: var(--blue); text-decoration: none; }
|
||||
.legal-page a:hover { text-decoration: underline; }
|
||||
.legal-divider { border: none; border-top: 1px solid rgba(255,255,255,0.07); margin: 40px 0; }
|
||||
.back-link { display: inline-flex; align-items: center; gap: 8px; color: var(--gray-400); font-size: 14px; font-weight: 500; text-decoration: none; margin-bottom: 40px; transition: color 0.15s; }
|
||||
.back-link:hover { color: #fff; }
|
||||
</style>
|
||||
</head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-RTWNVXPMRF"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-RTWNVXPMRF');
|
||||
</script>
|
||||
<body>
|
||||
|
||||
<nav class="nav">
|
||||
<div class="nav-inner">
|
||||
<a href="index.html" class="nav-logo">
|
||||
<img src="logo_house.svg" alt="HOA LedgerIQ" class="logo-img" />
|
||||
</a>
|
||||
<ul class="nav-links">
|
||||
<li><a href="index.html#features">Features</a></li>
|
||||
<li><a href="index.html#pricing">Pricing</a></li>
|
||||
<li><a href="index.html#preview-signup">Early Access</a></li>
|
||||
</ul>
|
||||
<a href="index.html#preview-signup" class="btn btn-primary nav-btn">Get Early Access</a>
|
||||
<a href="https://app.ledgeriq.com" class="btn btn-outline nav-btn nav-login" target="_blank" rel="noopener">Login</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="legal-page">
|
||||
<a href="index.html" class="back-link">← Back to Home</a>
|
||||
<h1>Privacy Policy</h1>
|
||||
<p class="legal-meta">Effective Date: March 1, 2026 · Last Updated: March 1, 2026</p>
|
||||
|
||||
<p>HOA LedgerIQ ("Company," "we," "us," or "our") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website at <strong>hoaledgeriq.com</strong> or use our software-as-a-service platform (collectively, the "Service"). Please read this policy carefully. If you disagree with its terms, please discontinue use of the Service.</p>
|
||||
|
||||
<hr class="legal-divider" />
|
||||
|
||||
<h2>1. Information We Collect</h2>
|
||||
<p><strong>Information You Provide Directly</strong></p>
|
||||
<ul>
|
||||
<li>Account registration data (name, email address, organization name, state/location, role)</li>
|
||||
<li>Payment and billing information (processed by third-party payment processors; we do not store raw card data)</li>
|
||||
<li>Financial data you enter into the platform (ledger entries, budgets, transaction records, reserve fund data)</li>
|
||||
<li>Communications you send to us (support requests, feedback, beta program inquiries)</li>
|
||||
</ul>
|
||||
<p><strong>Information Collected Automatically</strong></p>
|
||||
<ul>
|
||||
<li>Log data (IP address, browser type, pages visited, time and date of visit, referring URL)</li>
|
||||
<li>Device information (operating system, device identifiers)</li>
|
||||
<li>Cookies and similar tracking technologies (see Section 7)</li>
|
||||
<li>Usage analytics (features accessed, session duration, click patterns)</li>
|
||||
</ul>
|
||||
<p><strong>Information from Third Parties</strong></p>
|
||||
<ul>
|
||||
<li>Bank and financial institution data you authorize through open banking integrations</li>
|
||||
<li>Identity verification data from third-party verification services, where applicable</li>
|
||||
</ul>
|
||||
|
||||
<h2>2. How We Use Your Information</h2>
|
||||
<p>We use the information we collect to:</p>
|
||||
<ul>
|
||||
<li>Provide, operate, and improve the Service</li>
|
||||
<li>Process transactions and send related notices (receipts, invoices, renewal reminders)</li>
|
||||
<li>Respond to your comments, questions, and requests</li>
|
||||
<li>Send administrative and product update communications</li>
|
||||
<li>Send marketing communications, where you have opted in (you may opt out at any time)</li>
|
||||
<li>Monitor and analyze usage patterns to improve user experience</li>
|
||||
<li>Detect, investigate, and prevent fraudulent transactions and other illegal activity</li>
|
||||
<li>Comply with legal obligations</li>
|
||||
</ul>
|
||||
|
||||
<h2>3. How We Share Your Information</h2>
|
||||
<p>We do not sell, trade, or rent your personal information to third parties. We may share your information in the following limited circumstances:</p>
|
||||
<ul>
|
||||
<li><strong>Service Providers:</strong> Trusted third-party vendors who assist in operating our platform (cloud hosting, payment processing, email delivery, analytics). These vendors are contractually obligated to protect your data.</li>
|
||||
<li><strong>Legal Requirements:</strong> When required by law, subpoena, court order, or governmental authority.</li>
|
||||
<li><strong>Business Transfers:</strong> In connection with a merger, acquisition, or sale of all or a portion of our assets, with appropriate notice to you.</li>
|
||||
<li><strong>With Your Consent:</strong> For any other purpose disclosed to you and with your explicit consent.</li>
|
||||
</ul>
|
||||
|
||||
<h2>4. Data Retention</h2>
|
||||
<p>We retain your personal information for as long as your account is active or as needed to provide the Service. You may request deletion of your account and associated data at any time by contacting us at <a href="mailto:privacy@hoaledgeriq.com">privacy@hoaledgeriq.com</a>. We may retain certain information as required by law or for legitimate business purposes (e.g., tax and audit records).</p>
|
||||
|
||||
<h2>5. Data Security</h2>
|
||||
<p>We implement industry-standard technical and organizational measures to protect your information, including:</p>
|
||||
<ul>
|
||||
<li>TLS/SSL encryption for all data in transit</li>
|
||||
<li>AES-256 encryption for sensitive data at rest</li>
|
||||
<li>Role-based access controls limiting internal access to personal data</li>
|
||||
<li>Regular security audits and vulnerability assessments</li>
|
||||
</ul>
|
||||
<p>No method of transmission over the Internet or electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your information, we cannot guarantee its absolute security.</p>
|
||||
|
||||
<h2>6. Your Rights and Choices</h2>
|
||||
<p>Depending on your jurisdiction, you may have the following rights regarding your personal information:</p>
|
||||
<ul>
|
||||
<li><strong>Access:</strong> Request a copy of the personal data we hold about you.</li>
|
||||
<li><strong>Correction:</strong> Request correction of inaccurate or incomplete data.</li>
|
||||
<li><strong>Deletion:</strong> Request deletion of your personal data, subject to certain exceptions.</li>
|
||||
<li><strong>Portability:</strong> Request a machine-readable export of your data.</li>
|
||||
<li><strong>Opt-Out:</strong> Unsubscribe from marketing emails at any time using the link in any email we send.</li>
|
||||
<li><strong>Do Not Sell:</strong> We do not sell personal information. No action is needed to opt out.</li>
|
||||
</ul>
|
||||
<p>To exercise any of these rights, contact us at <a href="mailto:privacy@hoaledgeriq.com">privacy@hoaledgeriq.com</a>.</p>
|
||||
|
||||
<h2>7. Cookies and Tracking Technologies</h2>
|
||||
<p>We use cookies and similar technologies to enhance your experience, analyze usage, and support marketing efforts. Types of cookies we use:</p>
|
||||
<ul>
|
||||
<li><strong>Essential Cookies:</strong> Necessary for the Service to function. Cannot be disabled.</li>
|
||||
<li><strong>Analytics Cookies:</strong> Help us understand how visitors interact with our website (e.g., Google Analytics).</li>
|
||||
<li><strong>Preference Cookies:</strong> Remember your settings and preferences.</li>
|
||||
</ul>
|
||||
<p>You may configure your browser to refuse cookies or to alert you when cookies are being sent. Note that disabling cookies may affect certain features of the Service.</p>
|
||||
|
||||
<h2>8. Children's Privacy</h2>
|
||||
<p>The Service is not directed to individuals under the age of 18. We do not knowingly collect personal information from children. If we become aware that a child under 18 has provided us with personal information, we will take steps to delete such information.</p>
|
||||
|
||||
<h2>9. Third-Party Links</h2>
|
||||
<p>The Service may contain links to third-party websites. We are not responsible for the privacy practices of those sites and encourage you to review their privacy policies.</p>
|
||||
|
||||
<h2>10. Changes to This Policy</h2>
|
||||
<p>We may update this Privacy Policy from time to time. We will notify you of material changes by posting the new policy on this page with an updated effective date and, where appropriate, by sending an email notification. Your continued use of the Service after such changes constitutes your acceptance of the revised policy.</p>
|
||||
|
||||
<h2>11. Contact Us</h2>
|
||||
<p>If you have questions or concerns about this Privacy Policy or our data practices, please contact us at:</p>
|
||||
<p>
|
||||
<strong>HOA LedgerIQ</strong><br />
|
||||
Email: <a href="mailto:privacy@hoaledgeriq.com">privacy@hoaledgeriq.com</a><br />
|
||||
Website: <a href="https://www.hoaledgeriq.com">www.hoaledgeriq.com</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container footer-inner">
|
||||
<div class="footer-logo">
|
||||
<img src="logo_house.svg" alt="HOA LedgerIQ" class="logo-img logo-img--footer" />
|
||||
<p>AI-powered HOA finance management.<br />Coming soon to hoaledgeriq.com</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<div class="footer-col">
|
||||
<div class="footer-col-title">Product</div>
|
||||
<a href="index.html#features">Features</a>
|
||||
<a href="index.html#pricing">Pricing</a>
|
||||
<a href="index.html#preview-signup">Early Access</a>
|
||||
</div>
|
||||
<div class="footer-col">
|
||||
<div class="footer-col-title">Legal</div>
|
||||
<a href="privacy.html">Privacy Policy</a>
|
||||
<a href="terms.html">Terms of Service</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-bottom">
|
||||
<div class="container">
|
||||
<span>© 2026 HOA LedgerIQ. All rights reserved.</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
137
server.js
Normal file
137
server.js
Normal file
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
* HOA LedgerIQ — Lead Capture Backend
|
||||
* Stack: Node.js + Express + better-sqlite3
|
||||
*
|
||||
* Start: node server.js
|
||||
* Leads DB: ./data/leads.db
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
require('dotenv').config();
|
||||
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const express = require('express');
|
||||
const Database = require('better-sqlite3');
|
||||
|
||||
// ── Config ──────────────────────────────────────────────
|
||||
const PORT = process.env.PORT || 3000;
|
||||
const DB_DIR = path.join(__dirname, 'data');
|
||||
const DB_PATH = path.join(DB_DIR, 'leads.db');
|
||||
|
||||
// ── DB setup ─────────────────────────────────────────────
|
||||
fs.mkdirSync(DB_DIR, { recursive: true });
|
||||
|
||||
const db = new Database(DB_PATH);
|
||||
db.pragma('journal_mode = WAL');
|
||||
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS leads (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
first_name TEXT NOT NULL,
|
||||
last_name TEXT NOT NULL,
|
||||
email TEXT NOT NULL UNIQUE,
|
||||
org_name TEXT,
|
||||
state TEXT,
|
||||
role TEXT,
|
||||
unit_count TEXT,
|
||||
beta_interest INTEGER DEFAULT 0,
|
||||
source TEXT DEFAULT 'landing_page',
|
||||
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
|
||||
);
|
||||
`);
|
||||
|
||||
// Migrate existing DBs: add new columns if they don't exist yet
|
||||
const cols = db.pragma('table_info(leads)').map(c => c.name);
|
||||
if (!cols.includes('org_name')) db.exec('ALTER TABLE leads ADD COLUMN org_name TEXT');
|
||||
if (!cols.includes('state')) db.exec('ALTER TABLE leads ADD COLUMN state TEXT');
|
||||
if (!cols.includes('beta_interest')) db.exec('ALTER TABLE leads ADD COLUMN beta_interest INTEGER DEFAULT 0');
|
||||
|
||||
// Prepared statements
|
||||
const insertLead = db.prepare(`
|
||||
INSERT INTO leads (first_name, last_name, email, org_name, state, role, unit_count, beta_interest, source)
|
||||
VALUES (@firstName, @lastName, @email, @orgName, @state, @role, @unitCount, @betaInterest, @source)
|
||||
`);
|
||||
|
||||
const findByEmail = db.prepare(`SELECT id FROM leads WHERE email = ? LIMIT 1`);
|
||||
|
||||
const getAllLeads = db.prepare(`
|
||||
SELECT id, first_name, last_name, email, org_name, state, role, unit_count, beta_interest, source, created_at
|
||||
FROM leads
|
||||
ORDER BY created_at DESC
|
||||
`);
|
||||
|
||||
// ── App ───────────────────────────────────────────────────
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
app.use(express.static(__dirname)); // serve the marketing site
|
||||
|
||||
// POST /api/leads — capture a new preview sign-up
|
||||
app.post('/api/leads', (req, res) => {
|
||||
const { firstName, lastName, email, orgName, state, role, unitCount, betaInterest, source } = req.body ?? {};
|
||||
|
||||
// Validate required fields
|
||||
if (!firstName?.trim() || !lastName?.trim() || !email?.trim()) {
|
||||
return res.status(400).json({ error: 'firstName, lastName, and email are required.' });
|
||||
}
|
||||
if (!orgName?.trim()) {
|
||||
return res.status(400).json({ error: 'Organization name is required.' });
|
||||
}
|
||||
if (!state?.trim()) {
|
||||
return res.status(400).json({ error: 'State is required.' });
|
||||
}
|
||||
|
||||
// Simple email format check
|
||||
const emailRx = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
if (!emailRx.test(email.trim())) {
|
||||
return res.status(400).json({ error: 'Invalid email address.' });
|
||||
}
|
||||
|
||||
// Check for duplicate
|
||||
const existing = findByEmail.get(email.trim().toLowerCase());
|
||||
if (existing) {
|
||||
return res.status(409).json({ error: 'This email is already on the list.', id: existing.id });
|
||||
}
|
||||
|
||||
try {
|
||||
const info = insertLead.run({
|
||||
firstName: firstName.trim(),
|
||||
lastName: lastName.trim(),
|
||||
email: email.trim().toLowerCase(),
|
||||
orgName: orgName?.trim() ?? null,
|
||||
state: state?.trim() ?? null,
|
||||
role: role ?? null,
|
||||
unitCount: unitCount ?? null,
|
||||
betaInterest: betaInterest ? 1 : 0,
|
||||
source: source ?? 'landing_page',
|
||||
});
|
||||
|
||||
return res.status(201).json({ success: true, id: info.lastInsertRowid });
|
||||
} catch (err) {
|
||||
if (err.code === 'SQLITE_CONSTRAINT_UNIQUE') {
|
||||
return res.status(409).json({ error: 'This email is already on the list.' });
|
||||
}
|
||||
console.error('DB error:', err);
|
||||
return res.status(500).json({ error: 'Internal server error.' });
|
||||
}
|
||||
});
|
||||
|
||||
// GET /api/leads — internal: list all leads (add auth before exposing publicly)
|
||||
app.get('/api/leads', (req, res) => {
|
||||
const secret = req.headers['x-admin-key'];
|
||||
if (!secret || secret !== process.env.ADMIN_KEY) {
|
||||
return res.status(401).json({ error: 'Unauthorized.' });
|
||||
}
|
||||
const leads = getAllLeads.all();
|
||||
res.json({ count: leads.length, leads });
|
||||
});
|
||||
|
||||
// Health check
|
||||
app.get('/api/health', (_req, res) => res.json({ status: 'ok', ts: new Date().toISOString() }));
|
||||
|
||||
// ── Start ─────────────────────────────────────────────────
|
||||
app.listen(PORT, () => {
|
||||
console.log(`\n HOA LedgerIQ server running at http://localhost:${PORT}`);
|
||||
console.log(` Leads DB: ${DB_PATH}\n`);
|
||||
});
|
||||
691
styles.css
Normal file
691
styles.css
Normal file
@@ -0,0 +1,691 @@
|
||||
/* =============================================
|
||||
HOA LedgerIQ — Marketing Site Styles
|
||||
============================================= */
|
||||
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
:root {
|
||||
--blue: #2563eb;
|
||||
--blue-dark: #1d4ed8;
|
||||
--blue-glow: rgba(37, 99, 235, 0.25);
|
||||
--indigo: #4f46e5;
|
||||
--teal: #0ea5e9;
|
||||
--green: #22c55e;
|
||||
--amber: #f59e0b;
|
||||
--red: #ef4444;
|
||||
--gray-50: #f8fafc;
|
||||
--gray-100: #f1f5f9;
|
||||
--gray-200: #e2e8f0;
|
||||
--gray-400: #94a3b8;
|
||||
--gray-600: #475569;
|
||||
--gray-700: #334155;
|
||||
--gray-800: #1e293b;
|
||||
--gray-900: #0f172a;
|
||||
--surface: #ffffff;
|
||||
--radius: 12px;
|
||||
--radius-lg: 20px;
|
||||
--shadow: 0 4px 24px rgba(0,0,0,0.08);
|
||||
--shadow-lg: 0 16px 64px rgba(0,0,0,0.14);
|
||||
}
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
background: var(--gray-900);
|
||||
color: var(--gray-100);
|
||||
line-height: 1.65;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 1120px;
|
||||
margin: 0 auto;
|
||||
padding: 0 24px;
|
||||
}
|
||||
|
||||
/* ---- Buttons ---- */
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 12px 24px;
|
||||
border-radius: 8px;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
border: 2px solid transparent;
|
||||
transition: all 0.18s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.btn-primary {
|
||||
background: var(--blue);
|
||||
color: #fff;
|
||||
border-color: var(--blue);
|
||||
}
|
||||
.btn-primary:hover { background: var(--blue-dark); border-color: var(--blue-dark); transform: translateY(-1px); box-shadow: 0 8px 24px var(--blue-glow); }
|
||||
.btn-outline {
|
||||
background: transparent;
|
||||
color: var(--gray-100);
|
||||
border-color: var(--gray-600);
|
||||
}
|
||||
.btn-outline:hover { border-color: var(--blue); color: var(--blue); transform: translateY(-1px); }
|
||||
.btn-ghost {
|
||||
background: transparent;
|
||||
color: var(--gray-400);
|
||||
border-color: transparent;
|
||||
}
|
||||
.btn-ghost:hover { color: var(--gray-100); }
|
||||
.btn-lg { padding: 16px 32px; font-size: 16px; border-radius: 10px; }
|
||||
.hidden { display: none !important; }
|
||||
|
||||
/* ---- Coming Soon Banner ---- */
|
||||
.coming-soon-banner {
|
||||
background: linear-gradient(90deg, var(--indigo), var(--blue), var(--teal));
|
||||
padding: 12px 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 16px;
|
||||
flex-wrap: wrap;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
}
|
||||
.banner-badge {
|
||||
background: rgba(255,255,255,0.2);
|
||||
border: 1px solid rgba(255,255,255,0.35);
|
||||
padding: 3px 10px;
|
||||
border-radius: 99px;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
color: #fff;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.banner-text { color: rgba(255,255,255,0.9); }
|
||||
.banner-cta {
|
||||
background: #fff;
|
||||
color: var(--indigo);
|
||||
padding: 5px 14px;
|
||||
border-radius: 6px;
|
||||
font-weight: 700;
|
||||
font-size: 13px;
|
||||
text-decoration: none;
|
||||
flex-shrink: 0;
|
||||
transition: opacity 0.15s;
|
||||
}
|
||||
.banner-cta:hover { opacity: 0.9; }
|
||||
|
||||
/* ---- Nav ---- */
|
||||
.nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
background: rgba(15, 23, 42, 0.85);
|
||||
backdrop-filter: blur(16px);
|
||||
border-bottom: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
.nav-inner {
|
||||
max-width: 1120px;
|
||||
margin: 0 auto;
|
||||
padding: 0 24px;
|
||||
height: 68px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 32px;
|
||||
}
|
||||
.nav-logo { display: flex; align-items: center; text-decoration: none; }
|
||||
.logo-img { height: 36px; width: auto; }
|
||||
.logo-img--footer { height: 30px; }
|
||||
.nav-links {
|
||||
display: flex;
|
||||
gap: 28px;
|
||||
list-style: none;
|
||||
margin-left: auto;
|
||||
}
|
||||
.nav-links a {
|
||||
color: var(--gray-400);
|
||||
text-decoration: none;
|
||||
font-size: 15px;
|
||||
font-weight: 500;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
.nav-links a:hover { color: var(--gray-100); }
|
||||
.nav-btn { margin-left: 16px; padding: 9px 20px; font-size: 14px; }
|
||||
|
||||
/* ---- Pulse dot ---- */
|
||||
.pulse-dot {
|
||||
display: inline-block;
|
||||
width: 8px; height: 8px;
|
||||
background: var(--green);
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.pulse-dot::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -4px;
|
||||
border-radius: 50%;
|
||||
background: var(--green);
|
||||
opacity: 0.4;
|
||||
animation: pulse 1.8s infinite;
|
||||
}
|
||||
.pulse-dot--white { background: #fff; }
|
||||
.pulse-dot--white::after { background: #fff; }
|
||||
@keyframes pulse {
|
||||
0% { transform: scale(1); opacity: 0.4; }
|
||||
70% { transform: scale(2.2); opacity: 0; }
|
||||
100% { transform: scale(1); opacity: 0; }
|
||||
}
|
||||
|
||||
/* ---- Hero ---- */
|
||||
.hero {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
padding: 100px 0 80px;
|
||||
text-align: center;
|
||||
}
|
||||
.hero-glow {
|
||||
position: absolute;
|
||||
top: -200px; left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 900px; height: 600px;
|
||||
background: radial-gradient(ellipse at center, rgba(79,70,229,0.35) 0%, transparent 70%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.hero-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
background: rgba(79,70,229,0.15);
|
||||
border: 1px solid rgba(79,70,229,0.4);
|
||||
color: #a5b4fc;
|
||||
padding: 6px 16px;
|
||||
border-radius: 99px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.02em;
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
.hero-headline {
|
||||
font-size: clamp(40px, 7vw, 76px);
|
||||
font-weight: 900;
|
||||
line-height: 1.08;
|
||||
letter-spacing: -0.03em;
|
||||
color: #fff;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.gradient-text {
|
||||
background: linear-gradient(135deg, #60a5fa, #a78bfa, #38bdf8);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
.hero-sub {
|
||||
max-width: 620px;
|
||||
margin: 0 auto 36px;
|
||||
font-size: 18px;
|
||||
color: var(--gray-400);
|
||||
line-height: 1.7;
|
||||
}
|
||||
.hero-actions {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.hero-trust {
|
||||
font-size: 13px;
|
||||
color: var(--gray-600);
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
/* ---- Dashboard card (hero visual) ---- */
|
||||
.hero-visual {
|
||||
margin: 60px auto 0;
|
||||
max-width: 680px;
|
||||
padding: 0 24px;
|
||||
}
|
||||
.dashboard-card {
|
||||
background: var(--gray-800);
|
||||
border: 1px solid rgba(255,255,255,0.08);
|
||||
border-radius: var(--radius-lg);
|
||||
overflow: hidden;
|
||||
box-shadow: var(--shadow-lg), 0 0 80px rgba(79,70,229,0.18);
|
||||
text-align: left;
|
||||
}
|
||||
.dash-header {
|
||||
background: var(--gray-900);
|
||||
padding: 12px 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
.dash-dot { width: 12px; height: 12px; border-radius: 50%; }
|
||||
.dash-dot.red { background: #ff5f57; }
|
||||
.dash-dot.yellow { background: #febc2e; }
|
||||
.dash-dot.green { background: #28c840; }
|
||||
.dash-title { margin-left: 8px; font-size: 12px; color: var(--gray-600); font-weight: 500; }
|
||||
.dash-body { padding: 24px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
|
||||
.dash-stat { }
|
||||
.stat-label { font-size: 11px; color: var(--gray-600); font-weight: 500; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px; }
|
||||
.stat-value { font-size: 22px; font-weight: 800; letter-spacing: -0.02em; }
|
||||
.stat-delta { font-size: 11px; color: var(--gray-600); margin-top: 3px; }
|
||||
.green-text { color: var(--green); }
|
||||
.amber-text { color: var(--amber); }
|
||||
.dash-chart {
|
||||
grid-column: 1 / -1;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
gap: 6px;
|
||||
height: 72px;
|
||||
background: rgba(255,255,255,0.02);
|
||||
border-radius: 8px;
|
||||
padding: 10px 12px 0;
|
||||
}
|
||||
.chart-bar {
|
||||
flex: 1;
|
||||
background: rgba(79,70,229,0.35);
|
||||
border-radius: 4px 4px 0 0;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.chart-bar.active { background: var(--blue); }
|
||||
.dash-ai-chip {
|
||||
grid-column: 1 / -1;
|
||||
background: rgba(79,70,229,0.12);
|
||||
border: 1px solid rgba(79,70,229,0.3);
|
||||
border-radius: 8px;
|
||||
padding: 10px 14px;
|
||||
font-size: 12px;
|
||||
color: #a5b4fc;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
.ai-icon { font-size: 14px; flex-shrink: 0; }
|
||||
|
||||
/* ---- Proof strip ---- */
|
||||
.proof-strip {
|
||||
border-top: 1px solid rgba(255,255,255,0.06);
|
||||
border-bottom: 1px solid rgba(255,255,255,0.06);
|
||||
padding: 20px 0;
|
||||
background: rgba(255,255,255,0.02);
|
||||
}
|
||||
.proof-inner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
.proof-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--gray-600); font-weight: 600; }
|
||||
.proof-items { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; justify-content: center; font-size: 14px; color: var(--gray-400); font-weight: 500; }
|
||||
.sep { color: var(--gray-700); }
|
||||
|
||||
/* ---- Section shared ---- */
|
||||
.section-label {
|
||||
font-size: 12px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.1em;
|
||||
color: var(--blue);
|
||||
font-weight: 700;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.section-title {
|
||||
font-size: clamp(28px, 4vw, 46px);
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.025em;
|
||||
color: #fff;
|
||||
line-height: 1.15;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.section-sub {
|
||||
font-size: 17px;
|
||||
color: var(--gray-400);
|
||||
max-width: 560px;
|
||||
margin-bottom: 56px;
|
||||
}
|
||||
|
||||
/* ---- Features ---- */
|
||||
.features { padding: 100px 0; }
|
||||
.features-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px;
|
||||
}
|
||||
.feature-card {
|
||||
background: var(--gray-800);
|
||||
border: 1px solid rgba(255,255,255,0.07);
|
||||
border-radius: var(--radius);
|
||||
padding: 28px;
|
||||
transition: transform 0.18s, box-shadow 0.18s;
|
||||
}
|
||||
.feature-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
|
||||
.feature-card--highlight {
|
||||
background: linear-gradient(135deg, rgba(79,70,229,0.2), rgba(37,99,235,0.15));
|
||||
border-color: rgba(79,70,229,0.4);
|
||||
}
|
||||
.feature-icon { font-size: 24px; margin-bottom: 14px; }
|
||||
.feature-card h3 { font-size: 17px; font-weight: 700; color: #fff; margin-bottom: 10px; }
|
||||
.feature-card p { font-size: 14px; color: var(--gray-400); line-height: 1.65; }
|
||||
.feature-tag {
|
||||
display: inline-block;
|
||||
background: rgba(79,70,229,0.18);
|
||||
border: 1px solid rgba(79,70,229,0.35);
|
||||
color: #a5b4fc;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
padding: 3px 10px;
|
||||
border-radius: 99px;
|
||||
margin-top: 14px;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
|
||||
/* ---- AI Section ---- */
|
||||
.ai-section {
|
||||
background: linear-gradient(180deg, rgba(79,70,229,0.07) 0%, transparent 100%);
|
||||
border-top: 1px solid rgba(255,255,255,0.06);
|
||||
border-bottom: 1px solid rgba(255,255,255,0.06);
|
||||
padding: 100px 0;
|
||||
}
|
||||
.ai-inner {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 64px;
|
||||
align-items: center;
|
||||
}
|
||||
.ai-text h2 {
|
||||
font-size: clamp(26px, 3.5vw, 42px);
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
line-height: 1.15;
|
||||
letter-spacing: -0.02em;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.ai-text p { font-size: 16px; color: var(--gray-400); margin-bottom: 28px; line-height: 1.7; }
|
||||
.ai-bullets { list-style: none; display: flex; flex-direction: column; gap: 12px; }
|
||||
.ai-bullets li { font-size: 15px; color: var(--gray-300); display: flex; gap: 10px; align-items: flex-start; }
|
||||
.check { color: var(--green); font-weight: 700; flex-shrink: 0; }
|
||||
.ai-visual { display: flex; flex-direction: column; gap: 14px; }
|
||||
.chat-bubble {
|
||||
padding: 14px 18px;
|
||||
border-radius: 12px;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
max-width: 90%;
|
||||
}
|
||||
.user-bubble {
|
||||
background: var(--gray-700);
|
||||
color: var(--gray-200);
|
||||
align-self: flex-end;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
.ai-bubble {
|
||||
background: rgba(79,70,229,0.15);
|
||||
border: 1px solid rgba(79,70,229,0.3);
|
||||
color: var(--gray-200);
|
||||
align-self: flex-start;
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.ai-label {
|
||||
display: block;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
color: #a5b4fc;
|
||||
margin-bottom: 6px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
}
|
||||
|
||||
/* ---- Pricing ---- */
|
||||
.pricing { padding: 100px 0; }
|
||||
.pricing-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px;
|
||||
align-items: stretch;
|
||||
}
|
||||
.pricing-card {
|
||||
background: var(--gray-800);
|
||||
border: 1px solid rgba(255,255,255,0.08);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: 36px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
transition: transform 0.18s, box-shadow 0.18s;
|
||||
}
|
||||
.pricing-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
|
||||
.pricing-card--featured {
|
||||
background: linear-gradient(160deg, rgba(79,70,229,0.25) 0%, rgba(37,99,235,0.15) 100%);
|
||||
border-color: rgba(79,70,229,0.5);
|
||||
box-shadow: 0 0 60px rgba(79,70,229,0.2);
|
||||
}
|
||||
.plan-badge {
|
||||
position: absolute;
|
||||
top: -14px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: linear-gradient(90deg, var(--indigo), var(--blue));
|
||||
color: #fff;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
padding: 4px 16px;
|
||||
border-radius: 99px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.07em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.plan-name { font-size: 20px; font-weight: 800; color: #fff; margin-bottom: 4px; }
|
||||
.plan-tagline { font-size: 13px; color: var(--gray-500); margin-bottom: 24px; }
|
||||
.plan-price { display: flex; align-items: baseline; gap: 4px; margin-bottom: 4px; }
|
||||
.price-amount { font-size: 46px; font-weight: 900; letter-spacing: -0.03em; color: #fff; }
|
||||
.price-period { font-size: 16px; color: var(--gray-500); }
|
||||
.plan-units { font-size: 13px; color: var(--gray-500); margin-bottom: 28px; }
|
||||
.plan-features { list-style: none; display: flex; flex-direction: column; gap: 11px; flex: 1; margin-bottom: 32px; }
|
||||
.plan-features li { font-size: 14px; color: var(--gray-400); display: flex; align-items: flex-start; gap: 9px; }
|
||||
.plan-features li.dim { color: var(--gray-700); }
|
||||
.plan-features .check { color: var(--green); font-weight: 700; flex-shrink: 0; }
|
||||
.plan-btn { width: 100%; justify-content: center; margin-top: auto; }
|
||||
|
||||
/* ---- Signup Section ---- */
|
||||
.signup-section {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
padding: 100px 0 120px;
|
||||
}
|
||||
.signup-glow {
|
||||
position: absolute;
|
||||
top: 50%; left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 800px; height: 600px;
|
||||
background: radial-gradient(ellipse, rgba(79,70,229,0.3) 0%, transparent 70%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.signup-card {
|
||||
position: relative;
|
||||
background: var(--gray-800);
|
||||
border: 1px solid rgba(79,70,229,0.35);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: 56px;
|
||||
max-width: 760px;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
box-shadow: 0 0 80px rgba(79,70,229,0.2), var(--shadow-lg);
|
||||
}
|
||||
.countdown-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
background: rgba(79,70,229,0.18);
|
||||
border: 1px solid rgba(79,70,229,0.4);
|
||||
color: #a5b4fc;
|
||||
padding: 6px 16px;
|
||||
border-radius: 99px;
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 20px;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
.signup-card h2 {
|
||||
font-size: clamp(24px, 3.5vw, 38px);
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
letter-spacing: -0.025em;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.signup-card > p {
|
||||
color: var(--gray-400);
|
||||
font-size: 16px;
|
||||
margin-bottom: 40px;
|
||||
max-width: 480px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.signup-form { text-align: left; }
|
||||
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.form-group label { font-size: 13px; font-weight: 600; color: var(--gray-400); }
|
||||
.form-group input,
|
||||
.form-group select {
|
||||
background: var(--gray-900);
|
||||
border: 1px solid rgba(255,255,255,0.1);
|
||||
border-radius: 8px;
|
||||
padding: 12px 14px;
|
||||
color: var(--gray-100);
|
||||
font-size: 15px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
outline: none;
|
||||
transition: border-color 0.15s;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
.form-group select {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%2394a3b8' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
|
||||
background-repeat: no-repeat;
|
||||
background-position: right 14px center;
|
||||
padding-right: 36px;
|
||||
}
|
||||
.form-group input:focus,
|
||||
.form-group select:focus { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(37,99,235,0.2); }
|
||||
.form-group input::placeholder { color: var(--gray-700); }
|
||||
.form-group select option { background: var(--gray-800); color: var(--gray-100); }
|
||||
.signup-btn { width: 100%; justify-content: center; margin-top: 8px; }
|
||||
.form-fine { font-size: 12px; color: var(--gray-600); text-align: center; margin-top: 14px; }
|
||||
|
||||
/* ---- Success state ---- */
|
||||
.signup-success { padding: 20px 0; }
|
||||
.success-icon {
|
||||
width: 64px; height: 64px;
|
||||
background: rgba(34,197,94,0.15);
|
||||
border: 2px solid var(--green);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 26px;
|
||||
color: var(--green);
|
||||
margin: 0 auto 20px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.signup-success h3 { font-size: 24px; font-weight: 800; color: #fff; margin-bottom: 10px; }
|
||||
.signup-success p { font-size: 16px; color: var(--gray-400); }
|
||||
|
||||
/* ---- Footer ---- */
|
||||
.footer { border-top: 1px solid rgba(255,255,255,0.06); padding: 60px 0 0; }
|
||||
.footer-inner {
|
||||
display: grid;
|
||||
grid-template-columns: 1.5fr 1fr;
|
||||
gap: 48px;
|
||||
padding-bottom: 48px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
.footer-logo p { font-size: 14px; color: var(--gray-600); margin-top: 12px; line-height: 1.6; }
|
||||
.footer-links { display: flex; gap: 48px; }
|
||||
.footer-col { display: flex; flex-direction: column; gap: 12px; }
|
||||
.footer-col-title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--gray-600); margin-bottom: 4px; }
|
||||
.footer-col a { color: var(--gray-500); text-decoration: none; font-size: 14px; transition: color 0.15s; }
|
||||
.footer-col a:hover { color: var(--gray-200); }
|
||||
.footer-bottom {
|
||||
padding: 20px 0;
|
||||
font-size: 13px;
|
||||
color: var(--gray-700);
|
||||
}
|
||||
|
||||
/* ---- Request Quote pricing ---- */
|
||||
.price-amount--quote {
|
||||
font-size: 32px;
|
||||
background: linear-gradient(135deg, #60a5fa, #a78bfa);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
/* ---- Login nav button ---- */
|
||||
.nav-login {
|
||||
padding: 9px 20px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* ---- Beta checkbox group ---- */
|
||||
.beta-group {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
margin: 20px 0 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.beta-group input[type="checkbox"] {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
accent-color: var(--blue);
|
||||
margin-top: 2px;
|
||||
flex-shrink: 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
.beta-group label {
|
||||
font-size: 14px;
|
||||
color: var(--gray-200);
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
}
|
||||
.beta-disclaimer {
|
||||
font-size: 12px;
|
||||
color: var(--gray-600);
|
||||
line-height: 1.55;
|
||||
margin-bottom: 16px;
|
||||
padding-left: 28px;
|
||||
}
|
||||
|
||||
/* ---- Responsive ---- */
|
||||
@media (max-width: 900px) {
|
||||
.features-grid { grid-template-columns: repeat(2, 1fr); }
|
||||
.pricing-grid { grid-template-columns: 1fr; max-width: 440px; margin: 0 auto; }
|
||||
.pricing-card--featured { order: -1; }
|
||||
.ai-inner { grid-template-columns: 1fr; gap: 48px; }
|
||||
.footer-inner { grid-template-columns: 1fr; }
|
||||
.footer-links { flex-wrap: wrap; gap: 32px; }
|
||||
.dash-body { grid-template-columns: 1fr 1fr; }
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.features-grid { grid-template-columns: 1fr; }
|
||||
.form-row { grid-template-columns: 1fr; }
|
||||
.signup-card { padding: 36px 24px; }
|
||||
.nav-links { display: none; }
|
||||
.hero-headline { font-size: 36px; }
|
||||
.coming-soon-banner { gap: 10px; }
|
||||
.banner-text { display: none; }
|
||||
.dash-body { grid-template-columns: 1fr; }
|
||||
}
|
||||
174
terms.html
Normal file
174
terms.html
Normal file
@@ -0,0 +1,174 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Terms of Service — HOA LedgerIQ</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" />
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
<style>
|
||||
.legal-page { max-width: 800px; margin: 0 auto; padding: 60px 24px 100px; }
|
||||
.legal-page h1 { font-size: 38px; font-weight: 900; color: #fff; margin-bottom: 8px; letter-spacing: -0.025em; }
|
||||
.legal-meta { font-size: 13px; color: var(--gray-600); margin-bottom: 48px; }
|
||||
.legal-page h2 { font-size: 20px; font-weight: 700; color: #fff; margin: 36px 0 10px; }
|
||||
.legal-page p, .legal-page li { font-size: 15px; color: var(--gray-400); line-height: 1.75; margin-bottom: 12px; }
|
||||
.legal-page ul { padding-left: 20px; margin-bottom: 12px; }
|
||||
.legal-page a { color: var(--blue); text-decoration: none; }
|
||||
.legal-page a:hover { text-decoration: underline; }
|
||||
.legal-divider { border: none; border-top: 1px solid rgba(255,255,255,0.07); margin: 40px 0; }
|
||||
.back-link { display: inline-flex; align-items: center; gap: 8px; color: var(--gray-400); font-size: 14px; font-weight: 500; text-decoration: none; margin-bottom: 40px; transition: color 0.15s; }
|
||||
.back-link:hover { color: #fff; }
|
||||
</style>
|
||||
</head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-RTWNVXPMRF"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-RTWNVXPMRF');
|
||||
</script>
|
||||
<body>
|
||||
|
||||
<nav class="nav">
|
||||
<div class="nav-inner">
|
||||
<a href="index.html" class="nav-logo">
|
||||
<img src="logo_house.svg" alt="HOA LedgerIQ" class="logo-img" />
|
||||
</a>
|
||||
<ul class="nav-links">
|
||||
<li><a href="index.html#features">Features</a></li>
|
||||
<li><a href="index.html#pricing">Pricing</a></li>
|
||||
<li><a href="index.html#preview-signup">Early Access</a></li>
|
||||
</ul>
|
||||
<a href="index.html#preview-signup" class="btn btn-primary nav-btn">Get Early Access</a>
|
||||
<a href="https://app.ledgeriq.com" class="btn btn-outline nav-btn nav-login" target="_blank" rel="noopener">Login</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="legal-page">
|
||||
<a href="index.html" class="back-link">← Back to Home</a>
|
||||
<h1>Terms of Service</h1>
|
||||
<p class="legal-meta">Effective Date: March 1, 2026 · Last Updated: March 1, 2026</p>
|
||||
|
||||
<p>These Terms of Service ("Terms") constitute a legally binding agreement between you ("User," "you," or "your") and HOA LedgerIQ ("Company," "we," "us," or "our") governing your access to and use of the HOA LedgerIQ website and software-as-a-service platform (collectively, the "Service"). By accessing or using the Service, you agree to be bound by these Terms. If you do not agree, do not use the Service.</p>
|
||||
|
||||
<hr class="legal-divider" />
|
||||
|
||||
<h2>1. Eligibility</h2>
|
||||
<p>You must be at least 18 years of age and have the legal authority to enter into a binding agreement on behalf of yourself or the organization you represent. By using the Service, you represent and warrant that you meet these requirements. Use of the Service is not permitted where prohibited by law.</p>
|
||||
|
||||
<h2>2. Account Registration</h2>
|
||||
<p>To access most features of the Service, you must register for an account. You agree to:</p>
|
||||
<ul>
|
||||
<li>Provide accurate, current, and complete information during registration</li>
|
||||
<li>Maintain and promptly update your account information</li>
|
||||
<li>Keep your login credentials confidential and not share them with third parties</li>
|
||||
<li>Notify us immediately at <a href="mailto:support@hoaledgeriq.com">support@hoaledgeriq.com</a> of any unauthorized use of your account</li>
|
||||
<li>Accept responsibility for all activities that occur under your account</li>
|
||||
</ul>
|
||||
<p>We reserve the right to suspend or terminate accounts that contain false information or violate these Terms.</p>
|
||||
|
||||
<h2>3. Subscription Plans and Billing</h2>
|
||||
<p><strong>Plans:</strong> The Service is offered under multiple subscription tiers (Starter, Professional, Enterprise) as described on our pricing page. Features and unit limits vary by plan.</p>
|
||||
<p><strong>Free Trial:</strong> We may offer a free trial period. At the end of the trial, your account will automatically convert to a paid subscription unless you cancel before the trial ends.</p>
|
||||
<p><strong>Billing:</strong> Subscription fees are billed in advance on a monthly or annual basis. All fees are in U.S. dollars and are non-refundable except as expressly stated herein.</p>
|
||||
<p><strong>Price Changes:</strong> We reserve the right to adjust pricing with at least 30 days' advance notice. Your continued use of the Service after the price change takes effect constitutes your acceptance of the new pricing.</p>
|
||||
<p><strong>Cancellation:</strong> You may cancel your subscription at any time. Cancellation takes effect at the end of the current billing period. You will retain access to the Service through the end of your paid period.</p>
|
||||
|
||||
<h2>4. Acceptable Use</h2>
|
||||
<p>You agree to use the Service only for lawful purposes and in accordance with these Terms. You agree not to:</p>
|
||||
<ul>
|
||||
<li>Use the Service in any way that violates applicable federal, state, local, or international law or regulation</li>
|
||||
<li>Attempt to gain unauthorized access to any portion of the Service or its related systems</li>
|
||||
<li>Upload or transmit viruses, malware, or any other malicious code</li>
|
||||
<li>Reverse engineer, decompile, or disassemble any part of the Service</li>
|
||||
<li>Resell, sublicense, or commercially exploit the Service without our written consent</li>
|
||||
<li>Use the Service to store or transmit content that is unlawful, defamatory, or infringing on third-party rights</li>
|
||||
<li>Interfere with or disrupt the integrity or performance of the Service</li>
|
||||
<li>Scrape, crawl, or use automated means to access the Service without prior written permission</li>
|
||||
</ul>
|
||||
|
||||
<h2>5. Your Data</h2>
|
||||
<p><strong>Ownership:</strong> You retain full ownership of all data, content, and information you input into the Service ("Customer Data"). We do not claim any ownership rights over your Customer Data.</p>
|
||||
<p><strong>License to Us:</strong> By using the Service, you grant us a limited, non-exclusive, worldwide license to host, store, process, and display your Customer Data solely as necessary to provide and improve the Service.</p>
|
||||
<p><strong>Data Accuracy:</strong> You are solely responsible for the accuracy, quality, integrity, and legality of your Customer Data. We are not responsible for any errors or inaccuracies in financial data you enter into the platform.</p>
|
||||
<p><strong>Backup:</strong> While we maintain reasonable backup procedures, you are responsible for maintaining independent backups of your critical financial data.</p>
|
||||
|
||||
<h2>6. Intellectual Property</h2>
|
||||
<p>The Service and its original content, features, functionality, design, logos, and software are and will remain the exclusive property of HOA LedgerIQ and its licensors. Nothing in these Terms transfers any intellectual property rights to you. You may not use our trademarks, logos, or brand elements without our prior written consent.</p>
|
||||
|
||||
<h2>7. Third-Party Integrations</h2>
|
||||
<p>The Service may integrate with third-party services (e.g., banks, payment processors, accounting tools). Your use of such integrations is governed by the third party's own terms of service and privacy policies. We are not responsible for the availability, accuracy, or conduct of any third-party service.</p>
|
||||
|
||||
<h2>8. Disclaimer of Warranties</h2>
|
||||
<p>THE SERVICE IS PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.</p>
|
||||
<p>We do not warrant that: (a) the Service will be uninterrupted or error-free; (b) defects will be corrected; (c) the Service is free of viruses or other harmful components; or (d) the results obtained from using the Service will be accurate or reliable.</p>
|
||||
<p><strong>Financial Disclaimer:</strong> The Service provides financial management tools and AI-generated insights for informational purposes only. Nothing in the Service constitutes financial, tax, investment, or legal advice. You should consult qualified professionals before making financial decisions for your community.</p>
|
||||
|
||||
<h2>9. Limitation of Liability</h2>
|
||||
<p>TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL HOA LEDGERIQ, ITS OFFICERS, DIRECTORS, EMPLOYEES, OR AGENTS BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES — INCLUDING LOSS OF PROFITS, DATA, GOODWILL, OR OTHER INTANGIBLE LOSSES — ARISING OUT OF OR RELATED TO YOUR USE OF THE SERVICE, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
|
||||
<p>OUR TOTAL CUMULATIVE LIABILITY TO YOU FOR ALL CLAIMS ARISING OUT OF OR RELATED TO THE SERVICE SHALL NOT EXCEED THE GREATER OF (A) THE AMOUNTS YOU PAID TO US IN THE TWELVE (12) MONTHS PRECEDING THE CLAIM OR (B) ONE HUNDRED U.S. DOLLARS ($100).</p>
|
||||
|
||||
<h2>10. Indemnification</h2>
|
||||
<p>You agree to defend, indemnify, and hold harmless HOA LedgerIQ and its officers, directors, employees, contractors, and agents from and against any claims, liabilities, damages, judgments, awards, losses, costs, expenses, or fees (including reasonable attorneys' fees) arising out of or relating to your violation of these Terms or your use of the Service.</p>
|
||||
|
||||
<h2>11. Termination</h2>
|
||||
<p>We may suspend or terminate your access to the Service at any time, with or without cause or notice, including if we believe you have violated these Terms. Upon termination, your right to use the Service will immediately cease.</p>
|
||||
<p>You may export your Customer Data at any time while your account is active. Following termination, we will retain your data for 30 days before permanent deletion, during which you may contact us to request an export.</p>
|
||||
|
||||
<h2>12. Governing Law and Dispute Resolution</h2>
|
||||
<p>These Terms shall be governed by and construed in accordance with the laws of the State of North Carolina, without regard to its conflict of law provisions.</p>
|
||||
<p>Any dispute arising from or relating to these Terms or the Service shall first be attempted to be resolved through good-faith negotiation. If unresolved after 30 days, disputes shall be submitted to binding arbitration in accordance with the rules of the American Arbitration Association, with proceedings conducted in English in North Carolina. You waive any right to participate in a class-action lawsuit or class-wide arbitration.</p>
|
||||
|
||||
<h2>13. Changes to These Terms</h2>
|
||||
<p>We reserve the right to modify these Terms at any time. We will notify you of material changes by posting the updated Terms on this page with a new effective date and, where appropriate, sending an email notification. Your continued use of the Service after changes take effect constitutes your acceptance of the revised Terms.</p>
|
||||
|
||||
<h2>14. Miscellaneous</h2>
|
||||
<ul>
|
||||
<li><strong>Entire Agreement:</strong> These Terms, together with our Privacy Policy, constitute the entire agreement between you and HOA LedgerIQ regarding the Service.</li>
|
||||
<li><strong>Severability:</strong> If any provision of these Terms is found to be unenforceable, the remaining provisions will remain in full force and effect.</li>
|
||||
<li><strong>Waiver:</strong> Our failure to enforce any right or provision does not constitute a waiver of that right or provision.</li>
|
||||
<li><strong>Assignment:</strong> You may not assign these Terms without our prior written consent. We may assign our rights and obligations without restriction.</li>
|
||||
</ul>
|
||||
|
||||
<h2>15. Contact Us</h2>
|
||||
<p>If you have questions about these Terms, please contact us at:</p>
|
||||
<p>
|
||||
<strong>HOA LedgerIQ</strong><br />
|
||||
Email: <a href="mailto:legal@hoaledgeriq.com">legal@hoaledgeriq.com</a><br />
|
||||
Website: <a href="https://www.hoaledgeriq.com">www.hoaledgeriq.com</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container footer-inner">
|
||||
<div class="footer-logo">
|
||||
<img src="logo_house.svg" alt="HOA LedgerIQ" class="logo-img logo-img--footer" />
|
||||
<p>AI-powered HOA finance management.<br />Coming soon to hoaledgeriq.com</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<div class="footer-col">
|
||||
<div class="footer-col-title">Product</div>
|
||||
<a href="index.html#features">Features</a>
|
||||
<a href="index.html#pricing">Pricing</a>
|
||||
<a href="index.html#preview-signup">Early Access</a>
|
||||
</div>
|
||||
<div class="footer-col">
|
||||
<div class="footer-col-title">Legal</div>
|
||||
<a href="privacy.html">Privacy Policy</a>
|
||||
<a href="terms.html">Terms of Service</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-bottom">
|
||||
<div class="container">
|
||||
<span>© 2026 HOA LedgerIQ. All rights reserved.</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user