feat: Passwordless cross-device authentication

- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
This commit is contained in:
Bernt
2026-07-07 07:11:50 +00:00
parent 4aa984ad74
commit 6989a98d75
61843 changed files with 5491611 additions and 872231 deletions
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>City Health Index — Landvex Intelligence</title>
<meta name="description" content="A continuous composite score of urban condition, maintenance needs and change velocity. Updated from field observations. 0100 per city and district.">
<link rel="canonical" href="https://landvex.com/intelligence/city-health-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/city-health-index/">
<meta property="og:title" content="City Health Index — Landvex Intelligence">
<meta property="og:description" content="A continuous composite score of urban condition, maintenance needs and change velocity. Updated from field observations. 0100 per city and district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="City Health Index — Landvex">
<meta name="twitter:description" content="A continuous composite score of urban condition, maintenance needs, and change velocity across a defined area. Continuously verified from field observations.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "City Health Index — Landvex",
"description": "A continuous composite score of urban condition, maintenance needs, and change velocity across a defined area. Continuously verified from field observations.",
"url": "https://landvex.com/intelligence/city-health-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "City Health Index",
"item": "https://landvex.com/intelligence/city-health-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>How healthy is this city?</h1>
<p class="lv-hero-subtitle">A continuous composite score of urban condition, maintenance needs, and change velocity across a defined area. Continuously verified from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg></div>
<h3>Infrastructure condition</h3>
<p>Physical state of roads, utilities, public infrastructure and built environment across the area.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Commercial vitality</h3>
<p>Density and health of commercial activity — openings, closures, vacancy rates and foot traffic patterns.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Public space quality</h3>
<p>Condition of parks, squares, pedestrian zones and shared public environments.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Maintenance trajectory</h3>
<p>Rate of observable maintenance activity vs observed deterioration — leading indicator of future condition.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<h3>Change velocity</h3>
<p>Speed and direction of visible change across the area — construction, renovation, closures, openings.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Municipal resource allocation</span>
<span>Urban planning</span>
<span>Investment screening</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Score 0100 + trend direction + key signals</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↑ Improving</span>
</div>
<div>
<span>72</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>The City Health Index compares official urban condition reports and maintenance schedules against observed field data. When official assessments rate an area as well-maintained but field observations show deferred maintenance, rising vacancies, or deteriorating public spaces — the engine flags a narrative conflict.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/neighbourhood-quality-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Neighbourhood Quality Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/infrastructure-risk-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div>
<div>Infrastructure Risk Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/development-forecast/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Development Forecast</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'city-health-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Commercial Opportunity Index — Landvex</title>
<meta name="description" content="Identifies where commercial activity is growing, which locations are underserved, and which areas are declining. Based on observed openings, closures and foot traffic.">
<link rel="canonical" href="https://landvex.com/intelligence/commercial-opportunity-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/commercial-opportunity-index/">
<meta property="og:title" content="Commercial Opportunity Index — Landvex">
<meta property="og:description" content="Identifies where commercial activity is growing, which locations are underserved, and which areas are declining. Based on observed openings, closures and">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Commercial Opportunity Index — Landvex">
<meta name="twitter:description" content="Identifies where commercial activity is growing, which locations are underserved, and which areas are in decline — based on observed openings, closures, and activity levels.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Commercial Opportunity Index — Landvex",
"description": "Identifies where commercial activity is growing, which locations are underserved, and which areas are in decline — based on observed openings, closures, and activity levels.",
"url": "https://landvex.com/intelligence/commercial-opportunity-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Commercial Opportunity Index",
"item": "https://landvex.com/intelligence/commercial-opportunity-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>Where is commercial activity growing?</h1>
<p class="lv-hero-subtitle">Identifies where commercial activity is growing, which locations are underserved, and which areas are in decline — based on observed openings, closures, and activity levels.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>New business openings</h3>
<p>Rate of new commercial openings in the area — by category, size and observed activity level.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Vacancy rates</h3>
<p>Observable storefront and commercial vacancy — current level and directional trend over time.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Foot traffic signals</h3>
<p>Pedestrian density and movement patterns observed in the field across different times and zones.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H7M6 8H7M6 11H7M9 5H10M9 8H10M9 11H10" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg></div>
<h3>Competitor presence</h3>
<p>Category density, anchor tenants, brand presence and competitive clustering by district.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Renovation activity</h3>
<p>Volume of active fitouts, renovations and commercial improvements — a leading signal of investment intent.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Retail site selection</span>
<span>Franchise expansion</span>
<span>Property acquisition</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Opportunity score + gap map + competitor density</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↑ Strong growth</span>
</div>
<div>
<span>81</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>The Commercial Opportunity Index cross-references property registers, planning applications and official business statistics against observed commercial activity on the ground. A location listed as commercially active but observed with rising vacancies and declining foot traffic triggers a contradiction alert — often weeks before it surfaces in official data.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/urban-growth-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Urban Growth Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/investment-attractiveness-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Investment Attractiveness Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/growth-velocity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2L10 8L14 9L8 14L6 8L2 7L8 2Z" fill="#666"/></svg></div>
<div>Growth Velocity Index</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'commercial-opportunity-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Development Forecast Index — Landvex</title>
<meta name="description" content="Tracks where investment is flowing, where development cycles are beginning, and where activity is slowing — before it shows in official statistics.">
<link rel="canonical" href="https://landvex.com/intelligence/development-forecast/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/development-forecast/">
<meta property="og:title" content="Development Forecast Index — Landvex">
<meta property="og:description" content="Tracks where investment is flowing, where development cycles are beginning, and where activity is slowing — before it shows in official statistics.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Development Forecast — Landvex">
<meta name="twitter:description" content="Tracks where investment is flowing, where development cycles are beginning, and where activity is slowing — before it shows up in official statistics.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Development Forecast — Landvex",
"description": "Tracks where investment is flowing, where development cycles are beginning, and where activity is slowing — before it shows up in official statistics.",
"url": "https://landvex.com/intelligence/development-forecast/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Development Forecast",
"item": "https://landvex.com/intelligence/development-forecast/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>Which areas are gaining investment — and which are stagnating?</h1>
<p class="lv-hero-subtitle">Tracks where investment is flowing, where development cycles are beginning, and where activity is slowing — before it shows up in official statistics.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg></div>
<h3>Construction activity</h3>
<p>Volume and intensity of active construction, scaffolding, site preparation and demolition observed in the field.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Permit signals</h3>
<p>Observable evidence of planning permissions — site hoardings, notices, contractor presence and groundworks.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Commercial openings</h3>
<p>New business formations and commercial fitouts as a leading indicator of investment confidence.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Capital flows</h3>
<p>Indirect signals of capital allocation — scaffolding, premium renovations, branded development sites.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Population movement</h3>
<p>Observable demographic shifts — new residents, changing consumer mix, service infrastructure evolution.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Real estate development</span>
<span>Investment allocation</span>
<span>Urban planning</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Development score + cycle stage + investment confidence</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↑ Cycle accelerating</span>
</div>
<div>
<span>67</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Development Forecast detects when official planning data diverges from observed ground activity. A district listed as "under development" in permits with no observable site activity, or conversely, rapid development activity ahead of formal permissions — both trigger narrative conflicts that change the forecast score.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/urban-growth-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Urban Growth Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/investment-attractiveness-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Investment Attractiveness Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/commercial-opportunity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div>Commercial Opportunity Index</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'development-forecast',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Growth Velocity Index — Landvex Intelligence</title>
<meta name="description" content="Measures the rate of observable change in a defined area — not just direction, but speed. Fast-changing areas carry both opportunity and risk.">
<link rel="canonical" href="https://landvex.com/intelligence/growth-velocity-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/growth-velocity-index/">
<meta property="og:title" content="Growth Velocity Index — Landvex Intelligence">
<meta property="og:description" content="Measures the rate of observable change in a defined area — not just direction, but speed. Fast-changing areas carry both opportunity and risk.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Growth Velocity Index — Landvex">
<meta name="twitter:description" content="Measures the rate of observable change in a defined area — not just direction, but speed. Fast-changing areas carry both opportunity and risk.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Growth Velocity Index — Landvex",
"description": "Measures the rate of observable change in a defined area — not just direction, but speed. Fast-changing areas carry both opportunity and risk.",
"url": "https://landvex.com/intelligence/growth-velocity-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Growth Velocity Index",
"item": "https://landvex.com/intelligence/growth-velocity-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>How fast is change happening here?</h1>
<p class="lv-hero-subtitle">Measures the rate of observable change in a defined area — not just direction, but speed. Fast-changing areas carry both opportunity and risk.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Change rate (commercial)</h3>
<p>Speed of commercial turnover — openings, closures, category shifts and brand mix changes.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg></div>
<h3>Change rate (physical)</h3>
<p>Rate of physical transformation — construction, demolition, renovation and public realm works.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#0066FF" stroke-width="2"><path d="M18 20V10"/><path d="M12 20V4"/><path d="M6 20v-6"/></svg></div>
<h3>Trend acceleration</h3>
<p>Whether the rate of change is itself accelerating or decelerating — a second-order velocity signal.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Volatility score</h3>
<p>Consistency of change direction — high volatility means rapid oscillation between positive and negative signals.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2L10 8L14 9L8 14L6 8L2 7L8 2Z" fill="#666"/></svg></div>
<h3>Momentum indicators</h3>
<p>Leading signals that suggest the current change rate will continue — or is about to reverse.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Timing investment decisions</span>
<span>Early market entry</span>
<span>Risk-adjusted expansion</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Velocity score + acceleration signal + volatility rating</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↑ Accelerating</span>
</div>
<div>
<span>83</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Growth Velocity Index detects when official economic release cycles lag observable reality. GDP and business register data typically reflects conditions 618 months in the past. When field velocity indicators diverge sharply from the most recent official statistics, the contradiction engine quantifies the gap and adjusts the forward-looking velocity forecast.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/urban-growth-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Urban Growth Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/investment-attractiveness-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Investment Attractiveness Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/commercial-opportunity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div>Commercial Opportunity Index</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'growth-velocity-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
+27
View File
@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Intelligence — Landvex</title>
<meta name="description" content="Explore Landvex intelligence indexes: city health, commercial opportunity, infrastructure risk, investment attractiveness, and more.">
<link rel="canonical" href="https://landvex.com/intelligence/">
<meta http-equiv="refresh" content="0; url=/">
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
@media (max-width: 640px) {
.hero h1 { font-size: 2rem !important; }
.hero p { font-size: 1rem !important; }
.card { padding: 1.5rem !important; }
.grid { grid-template-columns: 1fr !important; }
.btn { padding: 0.75rem 1.5rem !important; font-size: 1rem !important; }
}
</style>
</head>
<body>
<nav aria-label="breadcrumb" aria-label="Main navigation">
<a href="/" >Home</a> / <span>intelligence</span>
</nav>
<p>Redirecting to <a href="/">homepage</a>...</p>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Infrastructure Risk Index — Landvex Intelligence</title>
<meta name="description" content="Predictive scoring of infrastructure stress points before failures occur. Based on observed conditions over time compared with maintenance records.">
<link rel="canonical" href="https://landvex.com/intelligence/infrastructure-risk-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/infrastructure-risk-index/">
<meta property="og:title" content="Infrastructure Risk Index — Landvex Intelligence">
<meta property="og:description" content="Predictive scoring of infrastructure stress points before failures occur. Based on observed conditions over time compared with maintenance records.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Infrastructure Risk Index — Landvex">
<meta name="twitter:description" content="Predictive scoring of infrastructure stress points before failures occur, based on observed conditions over time compared against maintenance records and official reports.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Infrastructure Risk Index — Landvex",
"description": "Predictive scoring of infrastructure stress points before failures occur, based on observed conditions over time compared against maintenance records and official reports.",
"url": "https://landvex.com/intelligence/infrastructure-risk-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Infrastructure Risk Index",
"item": "https://landvex.com/intelligence/infrastructure-risk-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>Where will infrastructure problems emerge next?</h1>
<p class="lv-hero-subtitle">Predictive scoring of infrastructure stress points before failures occur, based on observed conditions over time compared against maintenance records and official reports.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Observed deterioration rate</h3>
<p>Speed of visible degradation across roads, bridges, utilities and public infrastructure assets.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Maintenance gap</h3>
<p>Delta between required maintenance frequency and observed maintenance activity in the field.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H10M6 8H10M6 11H8" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg></div>
<h3>Official vs observed delta</h3>
<p>Divergence between official condition ratings and field observations — the key contradiction signal.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Age-adjusted risk</h3>
<p>Deterioration rate adjusted for asset age and original condition — identifies assets aging faster than expected.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Failure probability</h3>
<p>Composite probability score of near-term infrastructure failure based on all observed signals.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Maintenance prioritization</span>
<span>Capex planning</span>
<span>Insurance underwriting</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Risk score + failure probability + priority ranking</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↓ Risk increasing</span>
</div>
<div>
<span>44</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Infrastructure Risk Index is built on contradiction detection. It systematically compares official maintenance records, inspection reports and asset condition databases against observed reality. When a bridge or road corridor is rated "good" in official systems but field observations show accelerating deterioration — the contradiction score rises, triggering priority review.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/city-health-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>City Health Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/risk-resilience-profile/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Risk & Resilience Profile</div>
<div>View index →</div>
</a>
<a href="/intelligence/development-forecast/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Development Forecast</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'infrastructure-risk-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Investment Attractiveness Index — Landvex Intelligence</title>
<meta name="description" content="Composite score combining opportunity signals, risk signals, growth velocity and quality indicators. Designed for investment committees making capital allocation decisions.">
<link rel="canonical" href="https://landvex.com/intelligence/investment-attractiveness-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/investment-attractiveness-index/">
<meta property="og:title" content="Investment Attractiveness Index — Landvex Intelligence">
<meta property="og:description" content="Composite score combining opportunity signals, risk signals, growth velocity and quality indicators. Designed for investment committees making capital">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Investment Attractiveness Index — Landvex">
<meta name="twitter:description" content="Composite score combining opportunity signals, risk signals, growth velocity and quality indicators — designed for investment committees making capital allocation decisions.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Investment Attractiveness Index — Landvex",
"description": "Composite score combining opportunity signals, risk signals, growth velocity and quality indicators — designed for investment committees making capital allocation decisions.",
"url": "https://landvex.com/intelligence/investment-attractiveness-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Investment Attractiveness Index",
"item": "https://landvex.com/intelligence/investment-attractiveness-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>How attractive is this area for investment?</h1>
<p class="lv-hero-subtitle">Composite score combining opportunity signals, risk signals, growth velocity and quality indicators — designed for investment committees making capital allocation decisions.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Opportunity score</h3>
<p>Composite signal of commercial opportunity, underserved demand and competitive positioning.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#0066FF" stroke-width="2"><path d="M18 20V10"/><path d="M12 20V4"/><path d="M6 20v-6"/></svg></div>
<h3>Risk-adjusted return potential</h3>
<p>Expected return potential weighted against observed risk signals and contradiction indicators.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<h3>Growth trajectory</h3>
<p>Direction and velocity of area growth — observed leading indicators of future value creation.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2V4M8 12V14M2 8H4M12 8H14" stroke="#f59e0b" stroke-width="1.5" stroke-linecap="round"/><circle cx="8" cy="8" r="2" fill="#f59e0b"/></svg></div>
<h3>Quality of physical environment</h3>
<p>Condition, upkeep and observable quality of the built environment — a proxy for long-term value retention.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Competitive intensity</h3>
<p>Observed competitive activity — existing investment presence and new entrant signals in the area.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Capital allocation</span>
<span>Site selection</span>
<span>Portfolio construction</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Attractiveness score + risk-adjusted rank + comparable benchmark</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↑ Improving</span>
</div>
<div>
<span>76</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Investment Attractiveness Index combines all contradiction signals from across the index family into a single composite score. When multiple indexes show divergence between official data and observed reality, the investment risk-adjustment factor rises — reducing the attractiveness score to reflect information uncertainty in the official record.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/commercial-opportunity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div>Commercial Opportunity Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/growth-velocity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2L10 8L14 9L8 14L6 8L2 7L8 2Z" fill="#666"/></svg></div>
<div>Growth Velocity Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/risk-resilience-profile/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Risk & Resilience Profile</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'investment-attractiveness-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Neighbourhood Quality Index — Landvex Intelligence</title>
<meta name="description" content="Measures how an area is experienced — condition, activity, upkeep and change trajectory — from the perspective of someone on the ground.">
<link rel="canonical" href="https://landvex.com/intelligence/neighbourhood-quality-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/neighbourhood-quality-index/">
<meta property="og:title" content="Neighbourhood Quality Index — Landvex Intelligence">
<meta property="og:description" content="Measures how an area is experienced — condition, activity, upkeep and change trajectory — from the perspective of someone on the ground.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Neighbourhood Quality Index — Landvex">
<meta name="twitter:description" content="A composite measure of how an area is experienced — condition, activity, upkeep, and change trajectory — from the perspective of someone on the ground.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Neighbourhood Quality Index — Landvex",
"description": "A composite measure of how an area is experienced — condition, activity, upkeep, and change trajectory — from the perspective of someone on the ground.",
"url": "https://landvex.com/intelligence/neighbourhood-quality-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Neighbourhood Quality Index",
"item": "https://landvex.com/intelligence/neighbourhood-quality-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>How is this area experienced by the people who use it?</h1>
<p class="lv-hero-subtitle">A composite measure of how an area is experienced — condition, activity, upkeep, and change trajectory — from the perspective of someone on the ground.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Physical condition score</h3>
<p>Observable condition of buildings, streetscapes, public spaces and shared infrastructure.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M9 2L5 9H8L7 14L11 7H8L9 2Z" fill="#f59e0b"/></svg></div>
<h3>Activity level</h3>
<p>Density and vibrancy of observable activity — pedestrians, commercial activity, events, services.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#00C853" stroke-width="3"><path d="M20 6L9 17l-5-5"/></svg></div>
<h3>Maintenance quality</h3>
<p>Evidence of active upkeep — street cleaning, repairs, landscaping, graffiti removal and general care.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Safety signals</h3>
<p>Observable environmental safety indicators — lighting quality, surveillance, footfall density and activation.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 8C2 11.3 4.7 14 8 14C10.5 14 12.7 12.5 13.7 10.3" stroke="#666" stroke-width="1.5" stroke-linecap="round"/><path d="M14 8C14 4.7 11.3 2 8 2C5.5 2 3.3 3.5 2.3 5.7" stroke="#666" stroke-width="1.5" stroke-linecap="round"/><path d="M13.5 7.5L14 10L11.5 9.5" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.5 8.5L2 6L4.5 6.5" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<h3>Change direction</h3>
<p>Whether the area is improving or declining — trajectory from field observations over time.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Residential development</span>
<span>Retail positioning</span>
<span>Public space investment</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Quality score + experience rating + trajectory signal</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>→ Stable</span>
</div>
<div>
<span>69</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Neighbourhood Quality Index flags when resident satisfaction surveys, official quality-of-life indexes or planning documents describe an area differently from what field observations record. High survey satisfaction scores in areas with observed maintenance decline often precede a quality drop — the index detects this divergence early.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/city-health-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>City Health Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/commercial-opportunity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div>Commercial Opportunity Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/risk-resilience-profile/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Risk & Resilience Profile</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'neighbourhood-quality-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Risk & Resilience Profile — Landvex Intelligence</title>
<meta name="description" content="Physical exposure mapping combining observed conditions, historical vulnerability and forward-looking risk signals. For insurance, finance and public sector.">
<link rel="canonical" href="https://landvex.com/intelligence/risk-resilience-profile/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/risk-resilience-profile/">
<meta property="og:title" content="Risk & Resilience Profile — Landvex Intelligence">
<meta property="og:description" content="Physical exposure mapping combining observed conditions, historical vulnerability and forward-looking risk signals. For insurance, finance and public sector.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Risk & Resilience Profile — Landvex">
<meta name="twitter:description" content="Physical exposure mapping combining observed conditions, historical vulnerability, and forward-looking risk signals — for insurance, finance, and public sector resilience planning.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Risk & Resilience Profile — Landvex",
"description": "Physical exposure mapping combining observed conditions, historical vulnerability, and forward-looking risk signals — for insurance, finance, and public sector resilience planning.",
"url": "https://landvex.com/intelligence/risk-resilience-profile/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Risk Resilience Profile",
"item": "https://landvex.com/intelligence/risk-resilience-profile/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>What is the physical risk exposure of this area?</h1>
<p class="lv-hero-subtitle">Physical exposure mapping combining observed conditions, historical vulnerability, and forward-looking risk signals — for insurance, finance, and public sector resilience planning.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div>
<h3>Physical exposure score</h3>
<p>Composite score of observable physical risk factors — drainage, elevation, construction quality, age.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Flood/weather risk signals</h3>
<p>Observed drainage capacity, flood markers, historical damage evidence and climate exposure indicators.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg></div>
<h3>Infrastructure vulnerability</h3>
<p>Condition and resilience of critical infrastructure serving the area — power, water, roads, communications.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Social resilience indicators</h3>
<p>Observable signals of community capacity and social infrastructure — services, connectivity, density.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 8C2 11.3 4.7 14 8 14C10.5 14 12.7 12.5 13.7 10.3" stroke="#666" stroke-width="1.5" stroke-linecap="round"/><path d="M14 8C14 4.7 11.3 2 8 2C5.5 2 3.3 3.5 2.3 5.7" stroke="#666" stroke-width="1.5" stroke-linecap="round"/><path d="M13.5 7.5L14 10L11.5 9.5" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.5 8.5L2 6L4.5 6.5" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<h3>Recovery capacity</h3>
<p>Speed of observable recovery from prior disruption events — maintenance responsiveness and institutional capacity.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Insurance underwriting</span>
<span>Portfolio stress testing</span>
<span>Resilience planning</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Risk score + exposure map + resilience rating</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>→ Stable risk</span>
</div>
<div>
<span>38</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Risk & Resilience Profile detects contradictions between official risk assessments and observed physical conditions. When flood zone maps say low risk but field observations show inadequate drainage, ageing embankments and deferred maintenance — the contradiction engine raises the actual risk score above the official rating.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/infrastructure-risk-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div>
<div>Infrastructure Risk Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/city-health-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>City Health Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/neighbourhood-quality-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Neighbourhood Quality Index</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'risk-resilience-profile',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>
@@ -0,0 +1,503 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Urban Growth Index — Landvex Intelligence</title>
<meta name="description" content="Growth velocity by district. Identifies emerging zones before they appear in official statistics or property price indexes. Launching August 2026.">
<link rel="canonical" href="https://landvex.com/intelligence/urban-growth-index/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/intelligence/urban-growth-index/">
<meta property="og:title" content="Urban Growth Index — Landvex Intelligence">
<meta property="og:description" content="Growth velocity by district. Identifies emerging zones before they appear in official statistics or property price indexes. Launching August 2026.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Urban Growth Index — Landvex">
<meta name="twitter:description" content="Growth velocity by district — identifying emerging zones before they appear in official statistics or property price indexes.">
<meta name="twitter:image" content="https://landvex.com/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Urban Growth Index — Landvex",
"description": "Growth velocity by district — identifying emerging zones before they appear in official statistics or property price indexes.",
"url": "https://landvex.com/intelligence/urban-growth-index/",
"isPartOf": { "@type": "WebSite", "url": "https://landvex.com", "name": "Landvex" },
"publisher": { "@type": "Organization", "name": "Landvex", "url": "https://landvex.com" }
}</script>
<link rel="stylesheet" href="/assets/css/landvex-complete.css">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0, 102, 255, 0.15);
--text-body: #3a3a3a;
--text-muted: #6B6B6B;
--text-light: #1d1d1f;
--text-dim: #6B6B6B;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.08);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 24px;
}
html { scroll-behavior: smooth; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; height: 64px;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
font-size: 18px;
font-weight: 700;
letter-spacing: -0.3px;
color: #1d1d1f; }
.nav-links { display: flex; gap: 16px; list-style: none; }
.nav-links a { font-size: 14px; color: var(--text-dim); transition: color 0.2s; }
.nav-links a:hover { color: #1d1d1f; }
.btn {
display: inline-flex; align-items: center; gap: 16px;
padding: 24px;
background: var(--blue); color: #1d1d1f;
font-size: 14px; font-weight: 600;
border-radius: var(--radius-md); border: none; cursor: pointer;
transition: background 0.2s, transform 0.15s;
}
.btn:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-outline {
background: transparent;
border: 1.5px solid rgba(0,0,0,0.18);
color: var(--text-light);
}
.btn-outline:hover { background: rgba(0,0,0,0.04); transform: translateY(-1px); }
.btn-lg { padding: 24px; font-size: 16px; }
.hero {
min-height: 80vh;
display: flex; flex-direction: column; align-items: center; justify-content: center;
text-align: center; padding: 24px 80px;
position: relative; overflow: hidden;
}
/* Dekorativ bakgrund borttagen */
.hero-eyebrow { display: inline-flex; align-items: center; gap: 16px; color: #0066ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 8px 0; }
.hero h1 {
font-size: clamp(36px, 6vw, 68px); font-weight: 800;
letter-spacing: -2px; line-height: 1.05; color: #1d1d1f;
max-width: 820px; margin-bottom: 24px;
}
.hero-sub {
font-size: clamp(16px, 2vw, 19px); color: var(--text-dim);
max-width: 640px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
.container { max-width: 1140px; margin: 0 auto; }
section { padding: 24px; }
.section-label {
font-size: 12px; font-weight: 700; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--blue); margin-bottom: 24px;
}
.section-title {
font-size: clamp(26px, 3.5vw, 40px); font-weight: 800;
letter-spacing: -1px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px;
}
.section-title-light { color: #0a0a0a; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 560px; line-height: 1.7; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
.form-group { display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px; }
.form-group label { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.form-group input, .form-group textarea {
background: var(--bg-dark); border: 1.5px solid var(--border);
border-radius: var(--radius-md); color: #1d1d1f; font-size: 15px;
font-family: inherit; padding: 24px; outline: none;
transition: border-color 0.2s; width: 100%;
}
.form-group input:focus, .form-group textarea:focus { border-color: var(--blue); }
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); }
.form-group textarea { min-height: 120px; resize: vertical; }
.form-note { font-size: 12px; color: var(--text-muted); margin-top: 12px; text-align: center; }
#form-message {
display: none; padding: 24px; border-radius: var(--radius-md);
font-size: 14px; font-weight: 600; text-align: center; margin-top: 16px;
}
#form-message.success { background: rgba(0,200,80,0.1); border: 1px solid rgba(0,200,80,0.25); color: #4ade80; }
#form-message.error { background: rgba(255,60,60,0.1); border: 1px solid rgba(255,60,60,0.25); color: #f87171; }
footer { border-top: 1px solid var(--border); padding: 40px; }
.footer-inner {
max-width: 1140px; margin: 0 auto;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
}
.footer-logo { font-size: 17px; font-weight: 700; color: #1d1d1f; }
.footer-copy { font-size: 13px; color: var(--text-muted); }
.footer-tagline { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
.footer-links { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.footer-links a { font-size: 14px; color: var(--text-muted); transition: color 0.2s; }
.footer-links a:hover { color: #1d1d1f; }
.footer-social {
width: 32px; height: 32px; border: 1px solid var(--border); border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
transition: border-color 0.2s, background 0.2s;
}
.footer-social:hover { border-color: rgba(0,0,0,0.25); background: rgba(0,0,0,0.04); }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.nav-links { display: none; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.form-row { grid-template-columns: 1fr !important; }
.contact-form { padding: 24px; }
.footer-inner { flex-direction: column; text-align: center; }
[style*="grid-template-columns:1fr 1fr"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(300px"] { grid-template-columns: 1fr !important; }
[style*="grid-template-columns:repeat(auto-fit,minmax(260px"] { grid-template-columns: 1fr !important; }
}
.lv-disclaimer{font-size:.75rem;color:rgba(0,0,0,.75);margin-top:24px;padding: 24px;background:rgba(0,0,0,.04);border-radius: var(--radius-md);line-height:1.6;max-width:800px}
.lv-disclaimer a{color:rgba(0,0,0,.65);text-decoration:underline}
.lv-disclaimer--light{color:#888;background:#f5f5f5}
.lv-disclaimer--light a{color:#555}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Landvex",
"item": "https://landvex.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Intelligence",
"item": "https://landvex.com/intelligence/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Urban Growth Index",
"item": "https://landvex.com/intelligence/urban-growth-index/"
}
]
}
</script>
<link rel="alternate" hreflang="x-default" href="https://landvex.com/">
<link rel="alternate" hreflang="en" href="https://landvex.com/"> <link rel="alternate" hreflang="it" href="https://landvex.it/">
</head>
<body>
<!-- NAV -->
<nav aria-label="Main navigation">
<a class="nav-logo" href="/">LandveX</a>
<ul class="nav-links">
<li><a href="/#how-it-works">How it works</a></li>
<li><a href="/#verticals">Verticals</a></li>
<li><a href="/methodology/">Methodology</a></li>
<li><a href="/security/">Security</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<a class="lv-btn lv-btn--outline" href="#contact">Request a briefing →</a>
</nav>
<!-- HERO (dark) -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">Intelligence Index · Landvex</div>
<h1>How fast is this area growing?</h1>
<p class="lv-hero-subtitle">Growth velocity by district — identifying emerging zones before they appear in official statistics or property price indexes.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request a briefing →</a>
<a class="btn btn-outline btn-lg" href="#dimensions">See dimensions</a>
</div>
</section>
<!-- DIMENSIONS (white/light section) -->
<section id="dimensions">
<div class="lv-container">
<div>
<div class="section-label">What we measure</div>
<h2 class="section-title section-title-light">Five dimensions of intelligence.</h2>
<p class="section-sub">Each index is built from five independently observed and scored dimensions — combined into a single comparable score.</p>
</div>
<div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<h3>Commercial expansion rate</h3>
<p>Speed of new commercial openings relative to closures — net growth rate of the commercial ecosystem.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Residential activity</h3>
<p>Observable indicators of residential growth — new builds, renovations, moving activity, service infrastructure.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Service density growth</h3>
<p>Expansion of service infrastructure — cafés, gyms, medical, childcare — that follows population growth.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Infrastructure investment</h3>
<p>New utilities, roads, transit stops and public infrastructure as a signal of long-term growth commitment.</p>
</div>
<div onclick="location.href='#contact'" role="button" tabindex="0">
<div></div>
<h3>Demographic signals</h3>
<p>Observable shifts in the demographic mix of an area — a leading indicator of future commercial and property demand.</p>
</div>
</div>
</div>
</section>
<!-- USE CASES (light grey) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Use cases</div>
<h2 class="section-title section-title-light">Who uses this index.</h2>
<div>
<span>Early-stage investment</span>
<span>Retail pre-positioning</span>
<span>Infrastructure planning</span>
</div>
</div>
</div>
</section>
<!-- SAMPLE OUTPUT (dark) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Sample output</div>
<h2 class="section-title">What you receive.</h2>
<p>Growth velocity score + district ranking + 12-month trajectory</p>
<div>
<div>
<span>Sample location · Placeholder score</span>
<span>↑ High velocity</span>
</div>
<div>
<span>78</span>
<span>/100</span>
</div>
<div>
<div></div>
</div>
<div>
<span>Critical</span><span>Moderate</span><span>Strong</span>
</div>
<div>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> Placeholder values for illustration. Live intelligence from August 2026.
</div>
</div>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE (dark blue) -->
<section>
<div class="lv-container">
<div>
<div>
<div class="section-label">Advanced intelligence</div>
<h2 class="section-title">How this index detects narrative conflicts.</h2>
<p>Urban Growth Index flags when official population and economic statistics show growth in areas where observed activity is stagnant — or vice versa. Emerging districts frequently grow faster than statistics reflect. When field observations show rapid commercial expansion ahead of official economic data, the index raises the score and flags the statistical gap.</p>
</div>
<div>
<div>
<span></span>
<div>
<div>Contradiction Engine — How it works</div>
<div>Field observations are continuously cross-referenced against official records, registers, and published statistics. Divergence above threshold triggers a conflict flag.</div>
</div>
</div>
<div>
<div>
<div>Official record</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Published condition ratings</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Official statistics</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Register data</li>
</ul>
</div>
<div>
<div>Observed reality</div>
<ul>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Field observations</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Real-time signals</li>
<li><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Contradiction flags</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- RELATED INDEXES (white) -->
<section>
<div class="lv-container">
<div>
<div class="section-label">Related intelligence</div>
<h2 class="section-title section-title-light">Explore related indexes.</h2>
</div>
<div>
<a href="/intelligence/growth-velocity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2L10 8L14 9L8 14L6 8L2 7L8 2Z" fill="#666"/></svg></div>
<div>Growth Velocity Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/commercial-opportunity-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div>Commercial Opportunity Index</div>
<div>View index →</div>
</a>
<a href="/intelligence/investment-attractiveness-index/" onmouseover="this.style.borderColor='#0066ff';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='#e5e7eb';this.style.transform='none'">
<div></div>
<div>Investment Attractiveness Index</div>
<div>View index →</div>
</a>
</div>
<div>
<a href="/" >← Back to Landvex</a>
</div>
</div>
</section>
<!-- CONTACT (dark) -->
<section id="contact">
<div class="lv-container">
<div>
<div class="section-label">Get in touch</div>
<h2 class="section-title">Request a briefing.</h2>
<p class="section-sub">Tell us the question you need answered. We'll show you how this index applies to your decision.</p>
<form class="contact-form" id="contact-form">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@organisation.com" required>
</div>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe your question or decision — location, context, what you need to know..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request briefing →
</button>
<p class="form-note">We don't spam. Your information stays private.</p>
<div id="form-message"></div>
</form>
</div>
</div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. Based on field observations — not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology →</a></p>
</section>
<!-- FOOTER -->
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">© 2026 Landvex AB · Org.nr 559141-7042 · Tyresö, Sweden</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom →</a>
<a href="mailto:contact@landvex.com">contact@landvex.com</a>
<a href="mailto:security@landvex.com">security@landvex.com</a>
<a href="https://www.linkedin.com/company/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="2" y="9" width="4" height="12" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="4" cy="4" r="2" stroke="#888" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://x.com/landvex" target="_blank" rel="noopener" class="footer-social" title="LandveX on X">
<svg width="15" height="15" viewBox="0 0 24 24" fill="#888" xmlns="http://www.w3.org/2000/svg">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622Zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
</svg>
</a>
</div>
</div>
</footer>
<script>
document.getElementById('contact-form').addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const msgEl = document.getElementById('form-message');
btn.disabled = true; btn.textContent = 'Sending...';
const data = {
source: 'landvex-intelligence',
index: 'urban-growth-index',
name: this.name.value,
email: this.email.value,
message: this.message.value
};
try {
const res = await fetch('https://api.quixzoom.com/api/qz/waitlist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.ok || res.status === 201) {
msgEl.className = 'success';
msgEl.textContent = "<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Request received. We'll be in touch within one business day.";
msgEl.style.display = 'block';
this.reset();
} else { throw new Error('Server error ' + res.status); }
} catch(err) {
msgEl.className = 'error';
msgEl.textContent = 'Something went wrong. Please email us at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request briefing →';
});
</script>
</body>
</html>