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
+493
View File
@@ -0,0 +1,493 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Amsterdam City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Amsterdam districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/amsterdam/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/amsterdam/">
<meta property="og:title" content="Amsterdam City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Amsterdam districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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;
--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; }
.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; border-radius: var(--radius-md); }
.hero { min-height: 90vh; 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: 680px; line-height: 1.65; margin-bottom: 40px; }
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px); font-weight: 800; letter-spacing: -1.2px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 600px; line-height: 1.7; }
.stats-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 40px; }
.stat-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: border-color 0.25s; }
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon { width: 36px; height: 36px; margin-bottom: 14px; color: var(--blue); }
.stat-value { font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px; margin-bottom: 4px; }
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 40px; }
.district-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 24px; display: flex; align-items: center; gap: 16px; }
.district-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 40px; }
.intel-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: border-color 0.25s, transform 0.2s; }
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon { width: 32px; height: 32px; margin-bottom: 24px; color: var(--blue); }
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.scores-table th { text-align: left; padding: 24px; font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); border-bottom: 1px solid var(--border); }
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td { padding: 24px; border-bottom: 1px solid rgba(0,0,0,0.04); color: var(--text-light); }
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill { display: inline-block; font-size: 14px; font-weight: 700; padding: 24px; border-radius: 100px; }
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note { margin-top: 12px; font-size: 12px; color: var(--text-muted); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px; }
.conflict-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px; }
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label { font-size: .75rem; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; margin-bottom: 10px; }
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer { margin-top: 20px; padding-top: 20px; border-top: 1px solid rgba(0,0,0,.1); display: flex; justify-content: space-between; align-items: center; }
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon { width: 28px; height: 28px; margin: 0 auto 10px; color: rgba(0,0,0,0.75); }
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner { background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 48px; }
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 40px; text-align: left; }
.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; } .stats-row { grid-template-columns: 1fr 1fr; } .districts-grid { grid-template-columns: repeat(2, 1fr); } .intel-grid { grid-template-columns: 1fr; } .conflict-grid { grid-template-columns: 1fr; } .ce-features { grid-template-columns: 1fr; } }
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Amsterdam",
"item": "https://landvex.com/cities/amsterdam/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Amsterdam</div>
<h1>Amsterdam &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Amsterdam&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Amsterdam briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Amsterdam at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Amsterdam&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>
<div class="stat-value">921,000</div>
<div class="stat-label">City population &mdash; the Netherlands&rsquo; financial and cultural capital</div>
</div>
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
<div class="stat-value">8 districts</div>
<div class="stat-label">Core stadsdelen under active field intelligence monitoring</div>
</div>
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<div class="stat-value">Tech &middot; Finance</div>
<div class="stat-label">Key sectors: technology, financial services, logistics, creative industries</div>
</div>
</div>
</div>
</section>
<section id="districts">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Amsterdam.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Centrum</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Jordaan</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>De Pijp</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Zuidas</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Noord</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Oost</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>West</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Nieuw-West</span></div>
</div>
</div>
</section>
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Amsterdam</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Amsterdam&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="20" x2="18" y2="10"/><line x1="12" y1="20" x2="12" y2="4"/><line x1="6" y1="20" x2="6" y2="14"/></svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Centrum</td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill low">62</span></td>
<td><span class="score-pill high">87</span></td>
<td><span class="score-pill high">85</span></td>
</tr>
<tr>
<td class="district-name">Zuidas</td>
<td><span class="score-pill high">84</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill high">91</span></td>
<td><span class="score-pill mid">82</span></td>
</tr>
<tr>
<td class="district-name">Noord</td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">81</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">74</span></td>
</tr>
<tr>
<td class="district-name">De Pijp</td>
<td><span class="score-pill mid">77</span></td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill mid">83</span></td>
<td><span class="score-pill high">88</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available on request.</p>
</div>
</div>
</section>
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When Amsterdam housing policy diverges from observed commercial development patterns, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/><line x1="4" y1="22" x2="4" y2="15"/></svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Amsterdam &mdash; Housing Policy vs Commercial Development</div>
<div class="conflict-desc">Amsterdam housing policy vs observed commercial development patterns. Field observations reveal significant divergence between stated policy priorities and actual development activity across the city&rsquo;s districts.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 City prioritises residential over commercial development</li>
<li>&#100003 Zuidas: controlled mixed-use densification 2024&ndash;2026</li>
<li>&#100003 Noord: transformation to residential and creative hub</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Office-to-residential conversions behind schedule across Centrum</li>
<li>&#100007 Nieuw-West: commercial vacancy rising despite residential demand signals</li>
<li>&#100007 Noord: commercial development outpacing residential completions</li>
<li>&#100007 Zuidas: institutional demand exceeding permitted supply</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">44%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Amsterdam intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Amsterdam decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Amsterdam. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Amsterdam &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">Request Amsterdam briefing &rarr;</button>
<p class="form-note">We don&rsquo;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 class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</a>
<a href="mailto:contact@landvex.com">contact@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"><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"><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-city-amsterdam', 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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Amsterdam briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+506
View File
@@ -0,0 +1,506 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bangkok City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Bangkok districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores.">
<link rel="canonical" href="https://landvex.com/cities/bangkok/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/bangkok/">
<meta property="og:title" content="Bangkok City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Bangkok districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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;
--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; }
.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; border-radius: var(--radius-md); }
.hero { min-height: 90vh; 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: 680px; line-height: 1.65; margin-bottom: 40px; }
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px); font-weight: 800; letter-spacing: -1.2px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 600px; line-height: 1.7; }
.stats-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 40px; }
.stat-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: border-color 0.25s; }
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon { width: 36px; height: 36px; margin-bottom: 14px; color: var(--blue); }
.stat-value { font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px; margin-bottom: 4px; }
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 40px; }
.district-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 24px; display: flex; align-items: center; gap: 16px; }
.district-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 40px; }
.intel-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: border-color 0.25s, transform 0.2s; }
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon { width: 32px; height: 32px; margin-bottom: 24px; color: var(--blue); }
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.scores-table th { text-align: left; padding: 24px; font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); border-bottom: 1px solid var(--border); }
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td { padding: 24px; border-bottom: 1px solid rgba(0,0,0,0.04); color: var(--text-light); }
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill { display: inline-block; font-size: 14px; font-weight: 700; padding: 24px; border-radius: 100px; }
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note { margin-top: 12px; font-size: 12px; color: var(--text-muted); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px; }
.conflict-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px; }
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label { font-size: .75rem; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; margin-bottom: 10px; }
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer { margin-top: 20px; padding-top: 20px; border-top: 1px solid rgba(0,0,0,.1); display: flex; justify-content: space-between; align-items: center; }
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon { width: 28px; height: 28px; margin: 0 auto 10px; color: rgba(0,0,0,0.75); }
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner { background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 48px; }
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 40px; text-align: left; }
.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; } .stats-row { grid-template-columns: 1fr 1fr; } .districts-grid { grid-template-columns: repeat(2, 1fr); } .intel-grid { grid-template-columns: 1fr; } .conflict-grid { grid-template-columns: 1fr; } .ce-features { grid-template-columns: 1fr; } }
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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,.75); text-decoration: underline; }
</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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Bangkok",
"item": "https://landvex.com/cities/bangkok/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Bangkok</div>
<h1>Bangkok &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Bangkok Metropolitan Region. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Bangkok briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Bangkok at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Bangkok Metropolitan Region.</p>
<div class="stats-row">
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>
<div class="stat-value">10.5M</div>
<div class="stat-label">Bangkok Metropolitan Region population &mdash; major Southeast Asian commercial hub</div>
</div>
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
<div class="stat-value">8 districts</div>
<div class="stat-label">Core commercial districts under active field intelligence monitoring</div>
</div>
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
<div class="stat-value">Trade &middot; Tech &middot; Tourism</div>
<div class="stat-label">Key sectors: trade, technology, financial services, hospitality, manufacturing</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans Bangkok&rsquo;s principal commercial, financial, and mixed-use districts.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Sukhumvit</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Silom / Sathorn</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Rattanakosin (Old City)</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Chatuchak</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Lat Phrao</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Bangna</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Pathum Wan</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Thonburi</span></div>
</div>
</div>
</section>
<!-- INTELLIGENCE STREAMS -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Bangkok</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>
<h3>Commercial activity</h3>
<p>Footfall levels, retail operational status, vacancy patterns, and hospitality sector health across Bangkok&rsquo;s commercial corridors. Direct observation rather than proxy inference.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
<h3>Infrastructure condition</h3>
<p>Road surface quality, utility infrastructure state, flood drainage readiness, and surface-level deterioration across Bangkok&rsquo;s districts. Condition scores updated from direct field observation.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
<h3>Urban development signals</h3>
<p>Construction activity, rezoning indicators, new commercial openings, and closure patterns. Ground-level signals of structural change in Bangkok&rsquo;s fastest-shifting districts.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/><line x1="4" y1="22" x2="4" y2="15"/></svg>
<h3>Contradiction Engine alerts</h3>
<p>Automated detection of divergence between official data and observed conditions. Investment promotion narratives, development plan claims, and official economic indicators are cross-referenced with field evidence.</p>
</div>
</div>
</div>
</section>
<!-- DISTRICT SCORES -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District intelligence scores</div>
<h2 class="section-title">Bangkok district index</h2>
<p class="section-sub">Composite scores across five intelligence dimensions. Updated from rolling field observation data.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Vitality</th>
<th>Infrastructure</th>
<th>Investment</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Sukhumvit</td>
<td><span class="score-pill high">84</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill high">91</span></td>
<td><span class="score-pill low">62</span></td>
<td><span class="score-pill mid">79</span></td>
</tr>
<tr>
<td class="district-name">Silom / Sathorn</td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill high">88</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill high">83</span></td>
</tr>
<tr>
<td class="district-name">Chatuchak</td>
<td><span class="score-pill mid">73</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill mid">74</span></td>
</tr>
<tr>
<td class="district-name">Bangna</td>
<td><span class="score-pill low">67</span></td>
<td><span class="score-pill mid">75</span></td>
<td><span class="score-pill mid">72</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">69</span></td>
</tr>
</tbody>
</table>
</div>
<p class="table-note">Scores are indicative composites derived from field observation data. 100-point scale; scores above 80 are classified high, 60&ndash;79 mid, below 60 low. Full district coverage available on request.</p>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section id="contradiction" class="contradiction-bg">
<div class="lv-container">
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Where official narratives diverge from observed reality.</h2>
<p class="section-sub">Landvex&rsquo;s Contradiction Engine cross-references institutional claims with field-observed evidence. Divergences are flagged, quantified, and delivered to clients as structured alerts.</p>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/><line x1="4" y1="22" x2="4" y2="15"/></svg>
<div>
<div class="conflict-title">Eastern Corridor Development vs Outer District Commercial Activity</div>
<div class="conflict-desc">Official Bangkok eastern corridor development plans indicate concentrated commercial expansion and elevated investment activity. Field observations in outer districts record commercial vacancy rates and suppressed footfall inconsistent with the projected corridor effect.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>Eastern Economic Corridor investment projections</li>
<li>Planned commercial zone development announcements</li>
<li>Infrastructure expansion programme communications</li>
<li>Elevated GDP growth forecasts for outer districts</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Field observed</div>
<ul>
<li>Elevated vacancy in designated commercial development zones</li>
<li>Suppressed footfall across outer district retail corridors</li>
<li>Infrastructure construction activity below projected pace</li>
<li>Commercial closures outpacing new openings in targeted areas</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Contradiction Engine confidence score</span>
<span class="conflict-confidence">47%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<h4>Continuous monitoring</h4>
<p>Contradiction alerts are generated on a rolling basis, not on project timelines. Divergences are tracked as they emerge.</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
<h4>Confidence quantification</h4>
<p>Each contradiction is scored for confidence based on the quantity and consistency of field evidence relative to the official claim.</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M22 17H2a3 3 0 0 0 3-3V9a7 7 0 0 1 14 0v5a3 3 0 0 0 3 3z"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
<h4>Structured delivery</h4>
<p>Contradiction alerts are delivered as structured intelligence items with source attribution, confidence score, and recommended action.</p>
</div>
</div>
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Access full Bangkok intelligence</h3>
<p>Complete district scoring, Contradiction Engine alerts, and ongoing field intelligence for Bangkok Metropolitan Region. Structured as a pilot or ongoing subscription.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request Bangkok briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Contact</div>
<h2 class="section-title">Request a Bangkok briefing</h2>
<p class="section-sub">Tell us your question, sector, and timeline. We will confirm coverage and scope a pilot proposal within 48 hours.</p>
<div class="contact-form">
<form id="contactForm" action="https://formspree.io/f/xnqejvwy" method="POST">
<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">Work email</label>
<input type="email" id="email" name="email" placeholder="you@company.com" required>
</div>
<div class="form-group">
<label for="org">Organisation</label>
<input type="text" id="org" name="organisation" placeholder="Organisation name">
</div>
<div class="form-group">
<label for="message">What do you need to know about Bangkok?</label>
<textarea id="message" name="message" placeholder="Describe your question, geography of interest, and timeline..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">Send request &rarr;</button>
<p class="form-note">We respond within 48 hours. Your details are handled in accordance with our <a href="/privacy/" >privacy policy</a>.</p>
<div id="form-message"></div>
</form>
</div>
</div>
</div>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/pilot/">Pilot</a>
<a href="/methodology/">Methodology</a>
<a href="/coverage/">Coverage</a>
<a href="/contact/">Contact</a>
<a href="mailto:contact@landvex.com">contact@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>
<div>
<p class="lv-disclaimer">Intelligence outputs are indicative and advisory only. District scores are derived from field observation composites and do not constitute investment, financial, or legal advice. Contradiction Engine confidence scores reflect internal data consistency metrics and are not predictive assessments. Coverage and scores subject to change. &copy; 2026 Landvex AB.</p>
</div>
</footer>
<script>
const form = document.getElementById('contactForm');
const msg = document.getElementById('form-message');
if (form) {
form.addEventListener('submit', async (e) => {
e.preventDefault();
const data = new FormData(form);
try {
const res = await fetch(form.action, { method: 'POST', body: data, headers: { 'Accept': 'application/json' } });
if (res.ok) {
msg.textContent = 'Request received. We will be in touch within 48 hours.';
msg.className = 'success'; msg.style.display = 'block'; form.reset();
} else {
throw new Error();
}
} catch {
msg.textContent = 'Something went wrong. Please email contact@landvex.com directly.';
msg.className = 'error'; msg.style.display = 'block';
}
});
}
</script>
</body>
</html>
+784
View File
@@ -0,0 +1,784 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Berlin City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Berlin districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/berlin/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/berlin/">
<meta property="og:title" content="Berlin City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Berlin districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
/* OVERVIEW STATS */
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
/* DISTRICTS */
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
/* INTELLIGENCE PRODUCTS */
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
/* SCORES TABLE */
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note { margin-top: 12px; font-size: 12px; color: var(--text-muted); }
/* CONTRADICTION ENGINE */
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
/* CTA BANNER */
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
/* CONTACT */
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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 */
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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Berlin",
"item": "https://landvex.com/cities/berlin/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Berlin</div>
<h1>Berlin &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Berlin&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Berlin briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Berlin at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Berlin&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">3.6 million</div>
<div class="stat-label">City population &mdash; Germany&rsquo;s largest city</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/>
<circle cx="12" cy="10" r="3"/>
</svg>
<div class="stat-value">12 Bezirke</div>
<div class="stat-label">Administrative districts under active monitoring</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Tech &middot; Creative</div>
<div class="stat-label">Key sectors: technology, creative industries, public sector</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Berlin.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Mitte</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Prenzlauer Berg</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Friedrichshain</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Kreuzberg</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Charlottenburg</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Tempelhof</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Neuk&ouml;lln</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Spandau</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Berlin</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Berlin&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Mitte</td>
<td><span class="score-pill mid">77</span></td>
<td><span class="score-pill mid">61</span></td>
<td><span class="score-pill high">88</span></td>
<td><span class="score-pill high">83</span></td>
</tr>
<tr>
<td class="district-name">Prenzlauer Berg</td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill high">89</span></td>
</tr>
<tr>
<td class="district-name">Neuk&ouml;lln</td>
<td><span class="score-pill mid">65</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">68</span></td>
</tr>
<tr>
<td class="district-name">Tempelhof</td>
<td><span class="score-pill mid">69</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">77</span></td>
<td><span class="score-pill mid">72</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When Berlin development investment diverges from observed construction activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Berlin &mdash; Development Investment vs Activity</div>
<div class="conflict-desc">Berlin development investment vs observed construction activity. Field observations reveal significant divergence between reported investment flows and visible on-the-ground activity.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 &euro;2.4bn development investment committed 2024&ndash;2025</li>
<li>&#100003 Tempelhof: major mixed-use regeneration zone</li>
<li>&#100003 Construction permits up 18% year-on-year</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Active construction sites below permit volume</li>
<li>&#100007 Tempelhof: planning delays visible on ground</li>
<li>&#100007 Neuk&ouml;lln commercial vacancy increasing</li>
<li>&#100007 Prenzlauer Berg outperforming official projections</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">48%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Berlin intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Berlin decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Berlin. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Berlin &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Berlin briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-berlin',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Berlin briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Brussels City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Brussels districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/brussels/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/brussels/">
<meta property="og:title" content="Brussels City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Brussels districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Brussels", "item": "https://landvex.com/cities/brussels/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Brussels</div>
<h1>Brussels &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Brussels&rsquo; districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Brussels briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Brussels at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Brussels&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">1,230,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 5 European (capital)</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">EU Institutions &middot; Finance &middot; Logistics</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Brussels.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Ixelles / Elsene</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Molenbeek</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Anderlecht</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Saint-Gilles / Sint-Gillis</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Uccle</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Schaerbeek</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Etterbeek</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Laeken</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Brussels</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Brussels&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Ixelles / Elsene</td>
<td><span class="score-pill mid">77</span></td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill high">83</span></td>
<td><span class="score-pill mid">79</span></td>
</tr>
<tr>
<td class="district-name">Etterbeek</td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill high">80</span></td>
<td><span class="score-pill high">82</span></td>
</tr>
<tr>
<td class="district-name">Molenbeek</td>
<td><span class="score-pill low">61</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill low">65</span></td>
</tr>
<tr>
<td class="district-name">Schaerbeek</td>
<td><span class="score-pill low">65</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">68</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Brussels &mdash; Ixelles / Molenbeek</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Ixelles: EU quarter spillover driving sustained commercial demand</li>
<li>&#100003 Molenbeek: urban revitalisation programme approved 2024</li>
<li>&#100003 Regional plan targets 15% vacancy reduction by 2026</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Ixelles: institutional demand not translating to street-level retail vitality</li>
<li>&#100007 Molenbeek: revitalisation slower than approved programme timeline</li>
<li>&#100007 Schaerbeek commercial strips showing early distress signals</li>
<li>&#100007 Etterbeek holding stronger than official projections suggest</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">48%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Brussels intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Brussels decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Brussels. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Brussels &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Brussels briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-brussels',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Brussels briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=/cities/">
<title>Redirecting...</title>
<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>
<p>Redirecting to <a href="/cities/">cities page</a>...</p>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Copenhagen City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Copenhagen districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores.">
<link rel="canonical" href="https://landvex.com/cities/copenhagen/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/copenhagen/">
<meta property="og:title" content="Copenhagen City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Copenhagen districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Copenhagen", "item": "https://landvex.com/cities/copenhagen/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Copenhagen</div>
<h1>Copenhagen &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Copenhagen&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Copenhagen briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Copenhagen at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Copenhagen&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">794,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 3 Nordic</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Finance &middot; Life Sciences</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Copenhagen.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Indre By</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Vesterbro</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>N&oslash;rrebro</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>&Oslash;sterbro</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Amager</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Frederiksberg</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Valby</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Gentofte</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Copenhagen</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Copenhagen&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Indre By</td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill low">66</span></td>
<td><span class="score-pill high">84</span></td>
<td><span class="score-pill high">86</span></td>
</tr>
<tr>
<td class="district-name">&Oslash;sterbro</td>
<td><span class="score-pill mid">77</span></td>
<td><span class="score-pill low">69</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill high">89</span></td>
</tr>
<tr>
<td class="district-name">N&oslash;rrebro</td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">72</span></td>
</tr>
<tr>
<td class="district-name">Amager</td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">74</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Copenhagen &mdash; Indre By / N&oslash;rrebro</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Indre By: stable retail core with sustained footfall</li>
<li>&#100003 N&oslash;rrebro: municipal regeneration programme on schedule</li>
<li>&#100003 Development permits: 11 approved 2024&ndash;2025</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Indre By: mid-market retail closures accelerating</li>
<li>&#100007 N&oslash;rrebro: regeneration delayed; vacancy elevated</li>
<li>&#100007 Permit-to-start conversion below forecast</li>
<li>&#100007 Amager outperforming planned growth projections</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">54%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Copenhagen intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Copenhagen decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Copenhagen. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Copenhagen &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Copenhagen briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-copenhagen',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Copenhagen briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=/cities/">
<title>Redirecting...</title>
<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>
<p>Redirecting to <a href="/cities/">cities page</a>...</p>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Helsinki City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Helsinki districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/helsinki/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/helsinki/">
<meta property="og:title" content="Helsinki City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Helsinki districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Helsinki", "item": "https://landvex.com/cities/helsinki/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Helsinki</div>
<h1>Helsinki &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Helsinki&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Helsinki briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Helsinki at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Helsinki&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">660,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 3 Nordic</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Technology &middot; Maritime &middot; Public Sector</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Helsinki.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Eteläinen / Kaartinkaupunki</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Kallio</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Vallila</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>S&ouml;rn&auml;inen</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Kannelmäki</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Lauttasaari</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Pitäjänmäki</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Vuosaari</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Helsinki</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Helsinki&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Eteläinen</td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill low">63</span></td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill high">88</span></td>
</tr>
<tr>
<td class="district-name">Kallio</td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill high">81</span></td>
</tr>
<tr>
<td class="district-name">Vallila</td>
<td><span class="score-pill mid">72</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">78</span></td>
</tr>
<tr>
<td class="district-name">Vuosaari</td>
<td><span class="score-pill low">65</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">69</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Helsinki &mdash; Eteläinen / Vuosaari</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Eteläinen: historic core with stable premium footfall</li>
<li>&#100003 Vuosaari: port logistics zone designated for expansion</li>
<li>&#100003 Helsinki city strategy targets carbon-neutral growth by 2030</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Eteläinen: weekend tourist footfall masking weekday commercial softness</li>
<li>&#100007 Vuosaari expansion pace behind logistics demand signals</li>
<li>&#100007 Kallio creative district showing rent-driven displacement pressures</li>
<li>&#100007 Pitäjänmäki tech campus vacancy above city average</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">55%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Helsinki intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Helsinki decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Helsinki. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Helsinki &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Helsinki briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-helsinki',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Helsinki briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=/cities/">
<title>Redirecting...</title>
<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>
<p>Redirecting to <a href="/cities/">cities page</a>...</p>
</body>
</html>
+128
View File
@@ -0,0 +1,128 @@
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>City Intelligence Reports — Landvex</title>
<meta name="description" content="Landvex city intelligence reports. Continuous scoring of commercial vitality, infrastructure condition, growth velocity and investment confidence.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://landvex.com/cities/">
<meta http-equiv="refresh" content="0; url=https://landvex.com/#cities">
<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/">
<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>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": [
"Organization",
"Corporation"
],
"@id": "https://landvex.com/#organization",
"name": "Landvex",
"alternateName": [
"LandveX",
"Landvex AB",
"LandveX AB"
],
"url": "https://landvex.com",
"logo": {
"@type": "ImageObject",
"url": "https://landvex.com/apple-touch-icon.png",
"width": 180,
"height": 180
},
"foundingDate": "2024",
"foundingLocation": {
"@type": "Place",
"addressLocality": "Gothenburg",
"addressRegion": "Gothenburg",
"addressCountry": "SE"
},
"legalName": "Landvex Inc",
"address": {
"@type": "PostalAddress",
"addressLocality": "Houston",
"addressRegion": "TX",
"addressCountry": "US"
},
"location": [
{
"@type": "Place",
"name": "Houston, Texas, USA (US HQ)",
"address": {
"@type": "PostalAddress",
"addressLocality": "Houston",
"addressRegion": "TX",
"addressCountry": "US"
}
},
{
"@type": "Place",
"name": "Tyresö, Sweden (EU HQ)",
"address": {
"@type": "PostalAddress",
"addressLocality": "Gothenburg",
"addressRegion": "Gothenburg",
"addressCountry": "SE"
}
}
],
"taxID": "pending-EIN",
"description": "Landvex is a decision intelligence company that identifies contradictions between official narratives and observed physical reality. Using the quiXzoom field observation network and the AMOS AI analysis engine, Landvex delivers infrastructure risk indexes, urban intelligence scores, and contradiction reports to infrastructure owners, municipalities, enterprises, and investors globally.",
"disambiguatingDescription": "Landvex (LandveX) is a decision intelligence company with US headquarters in Houston, Texas (Landvex Inc.) and European headquarters in Tyresö, Sweden (Landvex AB, org.nr 559141-7042). Landvex delivers control intelligence — infrastructure risk scores, urban intelligence, and contradiction analysis — to municipalities, enterprises, infrastructure operators and investors. Landvex is not a UK meat wholesaler, food distributor, logistics company, package tracker, or land investment platform.",
"knowsAbout": [
"control intelligence",
"decision intelligence",
"infrastructure risk assessment",
"urban intelligence",
"field data collection",
"contradiction detection",
"physical world analytics",
"geospatial analytics"
],
"brand": {
"@type": "Brand",
"name": "Landvex",
"slogan": "Control intelligence for the physical world."
},
"sameAs": [
"https://landvex.com",
"https://www.linkedin.com/company/landvex",
"https://x.com/landvex",
"https://twitter.com/landvex",
"https://www.crunchbase.com/organization/landvex",
"https://github.com/landvex",
"https://www.instagram.com/landvex"
],
"contactPoint": {
"@type": "ContactPoint",
"email": "contact@landvex.com",
"contactType": "sales"
},
"slogan": "Where reported reality conflicts with observed reality."
}
</script>
</head>
<body>
<nav aria-label="breadcrumb" aria-label="Main navigation">
<a href="/" >Home</a> / <span>cities</span>
</nav>
<script>window.location.replace('https://landvex.com/#cities');</script>
</body>
</html>
+606
View File
@@ -0,0 +1,606 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>London City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across London districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by area.">
<link rel="canonical" href="https://landvex.com/cities/london/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/london/">
<meta property="og:title" content="London City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across London districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by area.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px); font-weight: 800; letter-spacing: -1.2px; line-height: 1.1; color: #1d1d1f; margin-bottom: 24px; }
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 600px; line-height: 1.7; }
.stats-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 40px; }
.stat-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: border-color 0.25s; cursor: pointer; }
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon { width: 36px; height: 36px; margin-bottom: 14px; color: var(--blue); }
.stat-value { font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px; margin-bottom: 4px; }
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--bg-dark); }
.districts-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 40px; }
.district-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 24px; display: flex; align-items: center; gap: 16px; }
.district-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 40px; }
.intel-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; transition: border-color 0.25s, transform 0.2s; cursor: pointer; }
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon { width: 32px; height: 32px; margin-bottom: 24px; color: var(--blue); }
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.scores-table th { text-align: left; padding: 24px; font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); border-bottom: 1px solid var(--border); }
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td { padding: 24px; border-bottom: 1px solid rgba(0,0,0,0.04); color: var(--text-light); }
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill { display: inline-block; font-size: 14px; font-weight: 700; padding: 24px; border-radius: 100px; }
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note { margin-top: 12px; font-size: 12px; color: var(--text-muted); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px; }
.conflict-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px; }
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label { font-size: .75rem; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; margin-bottom: 10px; }
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer { margin-top: 20px; padding-top: 20px; border-top: 1px solid rgba(0,0,0,.1); display: flex; justify-content: space-between; align-items: center; }
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon { width: 28px; height: 28px; margin: 0 auto 10px; color: rgba(0,0,0,0.75); }
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner { background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 48px; }
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-form { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 40px; text-align: left; }
.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); }
.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; }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr !important; }
}
</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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "London",
"item": "https://landvex.com/cities/london/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; London</div>
<h1>London &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across London&rsquo;s boroughs and business districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request London briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">London at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across the Greater London area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">9,700,000</div>
<div class="stat-label">Greater London population &mdash; largest city in the UK</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 3 Global</div>
<div class="stat-label">Financial centre rank &mdash; alongside New York and Singapore</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Finance &middot; Tech &middot; Property</div>
<div class="stat-label">Key sectors: financial services, technology, commercial property</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial, mixed-use, and growth districts across Greater London.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>City of London</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Canary Wharf</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Shoreditch/Hackney</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Southwark</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Westminster</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Camden</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Stratford/Newham</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Croydon</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in London</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each London district. Launching August 2026.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across London&rsquo;s districts and the TfL network.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics or market reports.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which London areas are accelerating, plateauing, or in structural decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">City / Canary Wharf</td>
<td><span class="score-pill high">83</span></td>
<td><span class="score-pill low">64</span></td>
<td><span class="score-pill high">88</span></td>
<td><span class="score-pill high">91</span></td>
</tr>
<tr>
<td class="district-name">Shoreditch / Hackney</td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill high">80</span></td>
</tr>
<tr>
<td class="district-name">Stratford / Newham</td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">73</span></td>
</tr>
<tr>
<td class="district-name">Croydon</td>
<td><span class="score-pill low">62</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">65</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official market statistics diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; London &mdash; Office Market Vacancy vs Observed Activity</div>
<div class="conflict-desc">London office market official vacancy statistics vs observed commercial activity levels. Field data reveals divergence between reported office vacancy figures and measured ground-floor commercial vitality in key districts.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 City of London vacancy rate: within 10-year norm</li>
<li>&#100003 Canary Wharf: anchor tenant commitments renewed</li>
<li>&#100003 Office-to-residential conversions: reducing surplus</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Sub-let market expanding in City: direct vacancy understated</li>
<li>&#100007 Canary Wharf ground floor retail vacancy materially elevated</li>
<li>&#100007 Conversion pipeline slower than reported in planning data</li>
<li>&#100007 Shoreditch commercial rents compressing despite headline growth</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">44%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request London intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your London decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about London. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about London &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request London briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</a>
<a href="mailto:contact@landvex.com">contact@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-city-london', 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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.'; msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request London briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=/cities/">
<title>Redirecting...</title>
<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>
<p>Redirecting to <a href="/cities/">cities page</a>...</p>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Madrid City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Madrid districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/madrid/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/madrid/">
<meta property="og:title" content="Madrid City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Madrid districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Madrid", "item": "https://landvex.com/cities/madrid/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Madrid</div>
<h1>Madrid &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Madrid&rsquo;s districts and metropolitan area. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Madrid briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Madrid at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Madrid&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">3,300,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 5 European</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Finance &middot; Tourism &middot; Technology</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Madrid.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Centro</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Salamanca</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Chamber&iacute;</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Retiro</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Vallecas</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Getafe</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Alc&aacute;l&aacute; de Henares</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>M&oacute;stoles</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Madrid</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Madrid&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Centro</td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill low">64</span></td>
<td><span class="score-pill high">86</span></td>
<td><span class="score-pill high">81</span></td>
</tr>
<tr>
<td class="district-name">Salamanca</td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill low">67</span></td>
<td><span class="score-pill high">88</span></td>
<td><span class="score-pill high">84</span></td>
</tr>
<tr>
<td class="district-name">Vallecas</td>
<td><span class="score-pill low">63</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">67</span></td>
</tr>
<tr>
<td class="district-name">Getafe</td>
<td><span class="score-pill low">66</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">73</span></td>
<td><span class="score-pill low">69</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Madrid &mdash; Centro / Vallecas</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Centro: high-footfall retail corridor rated stable</li>
<li>&#100003 Vallecas: urban renewal investment zone designated</li>
<li>&#100003 Tourism-led recovery projected to sustain 2024&ndash;2026</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Centro: luxury displacement eroding mid-market operators</li>
<li>&#100007 Vallecas: renewal activity slower than designated timeline</li>
<li>&#100007 Short-term rental saturation suppressing residential vitality</li>
<li>&#100007 Getafe industrial cluster outperforming city core projections</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">49%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Madrid intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Madrid decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Madrid. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Madrid &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Madrid briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-madrid',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Madrid briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+749
View File
@@ -0,0 +1,749 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Milan City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Milan districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/milan/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/milan/">
<meta property="og:title" content="Milan City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Milan districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon { width: 36px; height: 36px; margin-bottom: 14px; color: var(--blue); }
.stat-value { font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px; margin-bottom: 4px; }
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon { width: 32px; height: 32px; margin-bottom: 24px; color: var(--blue); }
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note { margin-top: 12px; font-size: 12px; color: var(--text-muted); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px; }
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon { width: 28px; height: 28px; margin: 0 auto 10px; color: rgba(0,0,0,0.75); }
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Milan",
"item": "https://landvex.com/cities/milan/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Milan</div>
<h1>Milan &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Milan&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Milan briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Milan at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Milan&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">1.4 million</div>
<div class="stat-label">City population &mdash; Italy&rsquo;s financial and commercial capital</div>
</div>
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/>
<circle cx="12" cy="10" r="3"/>
</svg>
<div class="stat-value">8 districts</div>
<div class="stat-label">Core districts under active field intelligence monitoring</div>
</div>
<div class="stat-card">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Finance &middot; Fashion</div>
<div class="stat-label">Key sectors: finance, fashion, design, life sciences, technology</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Milan.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Duomo / Centro</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Porta Nuova</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Navigli</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Isola</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Bicocca</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Sesto San Giovanni</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Lambrate</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Bovisa</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Milan</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Milan&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Duomo / Centro</td>
<td><span class="score-pill mid">82</span></td>
<td><span class="score-pill low">65</span></td>
<td><span class="score-pill high">85</span></td>
<td><span class="score-pill high">88</span></td>
</tr>
<tr>
<td class="district-name">Porta Nuova</td>
<td><span class="score-pill high">86</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">82</span></td>
<td><span class="score-pill high">91</span></td>
</tr>
<tr>
<td class="district-name">Sesto San Giovanni</td>
<td><span class="score-pill low">67</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill low">65</span></td>
</tr>
<tr>
<td class="district-name">Navigli</td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill low">69</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill mid">83</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available on request.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official Milan development investment diverges from observed commercial vacancy rates, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Milan &mdash; Development Investment vs Commercial Vacancy</div>
<div class="conflict-desc">Official Milan development investment vs observed commercial vacancy rates. Field observations reveal significant divergence between reported investment flows and on-the-ground commercial conditions across key districts.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Milan ranks among top 5 European investment destinations</li>
<li>&#100003 Porta Nuova: sustained institutional investment 2024&ndash;2025</li>
<li>&#100003 City commercial vacancy rate cited at 4.2% (JLL 2025)</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Centro / Duomo: elevated vacancy on secondary retail streets</li>
<li>&#100007 Sesto San Giovanni: industrial-to-mixed conversion stalling</li>
<li>&#100007 Navigli: hospitality occupancy below pre-2023 levels</li>
<li>&#100007 Isola outperforming official projections for residential demand</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">51%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Milan intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Milan decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Milan. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Milan &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Milan briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</a>
<a href="mailto:contact@landvex.com">contact@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-city-milan',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Milan briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=/cities/">
<title>Redirecting...</title>
<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>
<p>Redirecting to <a href="/cities/">cities page</a>...</p>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Oslo City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Oslo districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/oslo/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/oslo/">
<meta property="og:title" content="Oslo City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Oslo districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Oslo", "item": "https://landvex.com/cities/oslo/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Oslo</div>
<h1>Oslo &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Oslo&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Oslo briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Oslo at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Oslo&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">718,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 5 Nordic (per capita)</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Energy &middot; Maritime &middot; Finance</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Oslo.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Sentrum</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Grünerløkka</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Majorstuen</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Frogner</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Groruddalen</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Sagene</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Søndre Nordstrand</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Ullern</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Oslo</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Oslo&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Sentrum</td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill low">65</span></td>
<td><span class="score-pill high">83</span></td>
<td><span class="score-pill high">86</span></td>
</tr>
<tr>
<td class="district-name">Grünerløkka</td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">72</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill high">80</span></td>
</tr>
<tr>
<td class="district-name">Groruddalen</td>
<td><span class="score-pill low">63</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">66</span></td>
</tr>
<tr>
<td class="district-name">Frogner</td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill low">64</span></td>
<td><span class="score-pill high">84</span></td>
<td><span class="score-pill high">87</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Oslo &mdash; Sentrum / Groruddalen</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Sentrum: waterfront regeneration driving sustained commercial growth</li>
<li>&#100003 Groruddalen: major infrastructure investment corridor active 2023&ndash;2026</li>
<li>&#100003 Oslo master plan targets eastward commercial rebalancing</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Sentrum waterfront: luxury-led development suppressing mixed-use vitality</li>
<li>&#100007 Groruddalen investment slower to materialise than corridor plan implies</li>
<li>&#100007 Frogner holding premium position despite broader market softness</li>
<li>&#100007 Grünerløkka commercial density nearing saturation point</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">52%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Oslo intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Oslo decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Oslo. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Oslo &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Oslo briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-oslo',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Oslo briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+635
View File
@@ -0,0 +1,635 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Paris City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Paris arrondissements and districts. Commercial vitality, infrastructure condition, growth velocity and investment.">
<link rel="canonical" href="https://landvex.com/cities/paris/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/paris/">
<meta property="og:title" content="Paris City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Paris arrondissements and districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65; margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub { font-size: 17px; color: var(--text-dim); max-width: 600px; line-height: 1.7; }
.stats-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 40px; }
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s; cursor: pointer;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon { width: 36px; height: 36px; margin-bottom: 14px; color: var(--blue); }
.stat-value { font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px; margin-bottom: 4px; }
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--bg-dark); }
.districts-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 40px; }
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 40px; }
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s; cursor: pointer;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon { width: 32px; height: 32px; margin-bottom: 24px; color: var(--blue); }
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td { padding: 24px; border-bottom: 1px solid rgba(0,0,0,0.04); color: var(--text-light); }
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill { display: inline-block; font-size: 14px; font-weight: 700; padding: 24px; border-radius: 100px; }
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note { margin-top: 12px; font-size: 12px; color: var(--text-muted); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px; }
.conflict-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px; }
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label { font-size: .75rem; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; margin-bottom: 10px; }
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer { margin-top: 20px; padding-top: 20px; border-top: 1px solid rgba(0,0,0,.1); display: flex; justify-content: space-between; align-items: center; }
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon { width: 28px; height: 28px; margin: 0 auto 10px; color: rgba(0,0,0,0.75); }
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner { background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px; display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 48px; }
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-form { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 40px; text-align: left; }
.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); }
.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; }
@media (max-width: 900px) {
nav { padding: 0 20px; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr !important; }
}
</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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Paris",
"item": "https://landvex.com/cities/paris/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Paris</div>
<h1>Paris &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Paris arrondissements, La D&eacute;fense, and the inner suburbs. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Paris briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Paris at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across the Paris metropolitan area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">2,100,000</div>
<div class="stat-label">City population &mdash; largest city in the EU by municipality</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 5 EU</div>
<div class="stat-label">GDP rank among European metropolitan areas</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Finance &middot; Tech &middot; Retail</div>
<div class="stat-label">Key sectors: financial services, technology, luxury retail</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans major commercial and mixed-use districts across Paris and the inner suburb corridor.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>1er/2e &mdash; Centre</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>3e/4e &mdash; Marais</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>8e &mdash; Champs-&Eacute;lys&eacute;es</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>10e/11e &mdash; R&eacute;publique</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>18e &mdash; Montmartre</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>19e/20e &mdash; Est</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>La D&eacute;fense</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Boulogne-Billancourt</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Paris</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each arrondissement and district. Launching August 2026.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Paris&rsquo;s districts and the M&eacute;tro network.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics or property indices.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in structural decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">1er/2e &mdash; Centre</td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill low">63</span></td>
<td><span class="score-pill high">89</span></td>
<td><span class="score-pill high">86</span></td>
</tr>
<tr>
<td class="district-name">La D&eacute;fense</td>
<td><span class="score-pill high">84</span></td>
<td><span class="score-pill mid">72</span></td>
<td><span class="score-pill high">87</span></td>
<td><span class="score-pill high">83</span></td>
</tr>
<tr>
<td class="district-name">10e/11e &mdash; R&eacute;publique</td>
<td><span class="score-pill mid">73</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill high">81</span></td>
</tr>
<tr>
<td class="district-name">18e &mdash; Montmartre</td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">75</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Paris &mdash; Commercial Investment vs Observed Vacancy</div>
<div class="conflict-desc">Official Paris commercial development investment vs observed storefront vacancy in arrondissements. Field data reveals divergence between stated investment levels and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Paris Plan Local d&rsquo;Urbanisme: commercial priority zones active</li>
<li>&#100003 Invest in Paris: &euro;2.3bn commercial investment committed 2024</li>
<li>&#100003 Arrondissement vacancy rate: below EU major city average</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 8e arrondissement: luxury retail vacancy elevated on secondary streets</li>
<li>&#100007 10e/11e: independent retail closures accelerating post-pandemic</li>
<li>&#100007 La D&eacute;fense: sub-let market expanding, direct vacancy understated</li>
<li>&#100007 Investment permits not translating to observed ground-floor activation</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">48%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Paris intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Paris decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Paris. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Paris &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Paris briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</a>
<a href="mailto:contact@landvex.com">contact@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-city-paris', 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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.'; msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Paris briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rotterdam City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Rotterdam districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/rotterdam/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/rotterdam/">
<meta property="og:title" content="Rotterdam City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Rotterdam districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Rotterdam", "item": "https://landvex.com/cities/rotterdam/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Rotterdam</div>
<h1>Rotterdam &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Rotterdam&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Rotterdam briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Rotterdam at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Rotterdam&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">655,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 3 Port Cities (Europe)</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Logistics &middot; Port Operations &middot; Energy</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Rotterdam.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Centrum</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Kralingen</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Delfshaven</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>IJsselmonde</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Feijenoord</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Overschie</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Prins Alexander</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Charlois</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Rotterdam</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Rotterdam&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Centrum</td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill low">68</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill high">81</span></td>
</tr>
<tr>
<td class="district-name">Kralingen</td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill mid">79</span></td>
</tr>
<tr>
<td class="district-name">Feijenoord</td>
<td><span class="score-pill low">63</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill low">69</span></td>
<td><span class="score-pill low">66</span></td>
</tr>
<tr>
<td class="district-name">Prins Alexander</td>
<td><span class="score-pill low">69</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Rotterdam &mdash; Centrum / Feijenoord</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Centrum: architecture-led regeneration attracting sustained investment</li>
<li>&#100003 Feijenoord: social infrastructure investment programme active</li>
<li>&#100003 Port-adjacent development rated strategically sound by municipality</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Centrum regeneration: design-led investment not penetrating secondary streets</li>
<li>&#100007 Feijenoord social investment slower than programme commitment</li>
<li>&#100007 Logistics demand in Prins Alexander exceeding residential plan assumptions</li>
<li>&#100007 Delfshaven creative cluster emerging ahead of formal recognition</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">50%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Rotterdam intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Rotterdam decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Rotterdam. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Rotterdam &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Rotterdam briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-rotterdam',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Rotterdam briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+792
View File
@@ -0,0 +1,792 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Stockholm City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Stockholm districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/stockholm/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/stockholm/">
<meta property="og:title" content="Stockholm City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Stockholm districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
/* OVERVIEW STATS */
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
/* DISTRICTS */
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
/* INTELLIGENCE PRODUCTS */
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
/* SCORES TABLE */
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
/* CONTRADICTION ENGINE */
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
/* CTA BANNER */
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
/* CONTACT */
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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 */
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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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": "Cities",
"item": "https://landvex.com/cities/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Stockholm",
"item": "https://landvex.com/cities/stockholm/"
}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Stockholm</div>
<h1>Stockholm &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Stockholm&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Stockholm briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Stockholm at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Stockholm&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">975,000</div>
<div class="stat-label">City population &mdash; Sweden&rsquo;s largest urban centre</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 5 Nordic</div>
<div class="stat-label">GDP rank among Nordic cities</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Tech &middot; Finance</div>
<div class="stat-label">Key sectors: technology, finance, public sector</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Stockholm.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Norrmalm (CBD)</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>S&ouml;dermalm</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>&Ouml;stermalm</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Kungsholmen</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Vasastan</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Järva</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Farsta</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Nacka</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Stockholm</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Stockholm&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> ILLUSTRATIVE SAMPLE DATA — These scores are synthetic examples for demonstration purposes only. They do not represent actual measured values.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Norrmalm</td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill low">58</span></td>
<td><span class="score-pill high">88</span></td>
<td><span class="score-pill high">82</span></td>
</tr>
<tr>
<td class="district-name">S&ouml;dermalm</td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">67</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill high">86</span></td>
</tr>
<tr>
<td class="district-name">Järva</td>
<td><span class="score-pill mid">63</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">61</span></td>
</tr>
<tr>
<td class="district-name">Nacka</td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill high">84</span></td>
<td><span class="score-pill mid">73</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div>
ILLUSTRATIVE SAMPLE — not real intelligence
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Stockholm &mdash; Järva / Norrmalm</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Municipal investment zone: Järva priority growth</li>
<li>&#100003 Norrmalm: stable CBD with anchor tenants</li>
<li>&#100003 Development permits: 14 approved 2024&ndash;2025</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Järva commercial vacancy above city average</li>
<li>&#100007 Norrmalm: 3 anchor retailers downsizing footprint</li>
<li>&#100007 Development activity below permit volume</li>
<li>&#100007 Nacka outperforming planned growth projections</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">51%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Stockholm intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Stockholm decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Stockholm. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Stockholm &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Stockholm briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-stockholm',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Stockholm briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vienna City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Vienna districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/vienna/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/vienna/">
<meta property="og:title" content="Vienna City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Vienna districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Vienna", "item": "https://landvex.com/cities/vienna/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Vienna</div>
<h1>Vienna &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Vienna&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Vienna briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Vienna at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Vienna&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">1,970,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 10 European</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Tourism &middot; Public Sector &middot; Technology</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Vienna.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>Innere Stadt</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Mariahilf</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Leopoldstadt</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Favoriten</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Simmering</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Hernals</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Floridsdorf</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Donaustadt</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Vienna</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Vienna&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">Innere Stadt</td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill low">61</span></td>
<td><span class="score-pill high">88</span></td>
<td><span class="score-pill high">91</span></td>
</tr>
<tr>
<td class="district-name">Leopoldstadt</td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">72</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill high">83</span></td>
</tr>
<tr>
<td class="district-name">Favoriten</td>
<td><span class="score-pill low">67</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill mid">71</span></td>
</tr>
<tr>
<td class="district-name">Donaustadt</td>
<td><span class="score-pill mid">72</span></td>
<td><span class="score-pill high">81</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">74</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Vienna &mdash; Innere Stadt / Favoriten</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 Innere Stadt: UNESCO heritage zone with stable premium retail</li>
<li>&#100003 Favoriten: designated affordable housing growth corridor</li>
<li>&#100003 Donaustadt: smart city expansion proceeding to plan</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 Innere Stadt: international tourism dependency creating fragility</li>
<li>&#100007 Favoriten: development pace below municipal targets</li>
<li>&#100007 Commercial vacancy emerging in secondary Favoriten strips</li>
<li>&#100007 Donaustadt tech cluster attracting investment ahead of schedule</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">57%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Vienna intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Vienna decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Vienna. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Vienna &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Vienna briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-vienna',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Vienna briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,follow">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zurich City Intelligence — Landvex</title>
<meta name="description" content="Continuous intelligence across Zurich districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<link rel="canonical" href="https://landvex.com/cities/zurich/">
<meta name="robots" content="noindex,follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://landvex.com/cities/zurich/">
<meta property="og:title" content="Zurich City Intelligence — Landvex">
<meta property="og:description" content="Continuous intelligence across Zurich districts. Commercial vitality, infrastructure condition, growth velocity and investment confidence scores by district.">
<meta property="og:image" content="https://landvex.com/og-image.jpg">
<meta name="twitter:card" content="summary_large_image">
<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="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-dark: #0a0a0a;
--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; }
.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; border-radius: var(--radius-md); }
.hero {
min-height: 90vh;
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: 680px; line-height: 1.65;
margin-bottom: 40px;
}
.hero-ctas { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; }
section { padding: 24px; }
.container { max-width: 1140px; margin: 0 auto; }
.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(28px, 4vw, 44px);
font-weight: 800; letter-spacing: -1.2px; line-height: 1.1;
color: #1d1d1f; margin-bottom: 24px;
}
.section-sub {
font-size: 17px; color: var(--text-dim);
max-width: 600px; line-height: 1.7;
}
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
margin-top: 40px;
}
.stat-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s;
}
.stat-card:hover { border-color: rgba(0,102,255,0.3); }
.stat-icon {
width: 36px; height: 36px; margin-bottom: 14px;
color: var(--blue);
}
.stat-value {
font-size: 32px; font-weight: 800; color: #1d1d1f; letter-spacing: -1px;
margin-bottom: 4px;
}
.stat-label { font-size: 14px; color: var(--text-dim); line-height: 1.5; }
.districts-bg { background: var(--surface); }
.districts-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
margin-top: 40px;
}
.district-chip {
background: var(--bg-dark); border: 1px solid var(--border);
border-radius: var(--radius-md); padding: 24px;
display: flex; align-items: center; gap: 16px;
}
.district-chip .chip-dot {
width: 8px; height: 8px; border-radius: var(--radius-full);
background: var(--blue); flex-shrink: 0;
}
.district-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.intel-grid {
display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
margin-top: 40px;
}
.intel-card {
background: var(--surface-2); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 24px;
transition: border-color 0.25s, transform 0.2s;
}
.intel-card:hover { border-color: rgba(0,102,255,0.35); transform: translateY(-3px); }
.intel-icon {
width: 32px; height: 32px; margin-bottom: 24px;
color: var(--blue);
}
.intel-card h3 { font-size: 17px; font-weight: 700; color: #1d1d1f; margin-bottom: 8px; }
.intel-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.scores-table-wrap { margin-top: 40px; overflow-x: auto; }
.scores-table {
width: 100%; border-collapse: collapse;
font-size: 14px;
}
.scores-table th {
text-align: left; padding: 24px;
font-size: 11px; font-weight: 700; letter-spacing: 0.08em;
text-transform: uppercase; color: var(--text-muted);
border-bottom: 1px solid var(--border);
}
.scores-table th:not(:first-child) { text-align: center; }
.scores-table td {
padding: 24px;
border-bottom: 1px solid rgba(0,0,0,0.04);
color: var(--text-light);
}
.scores-table td:not(:first-child) { text-align: center; }
.scores-table tr:hover td { background: rgba(0,0,0,0.02); }
.score-pill {
display: inline-block;
font-size: 14px; font-weight: 700;
padding: 24px; border-radius: 100px;
background: rgba(0,102,255,0.12);
color: #5599ff;
}
.score-pill.high { background: rgba(0,200,80,0.1); color: #4ade80; }
.score-pill.mid { background: rgba(0,102,255,0.12); color: #60a5fa; }
.score-pill.low { background: rgba(255,180,0,0.1); color: #fbbf24; }
.district-name { font-weight: 600; color: #1d1d1f; }
.table-note {
margin-top: 12px; font-size: 12px; color: var(--text-muted);
}
.contradiction-bg { background: #e8f0fe; }
.contradiction-box {
background: rgba(0,0,0,.05);
border: 1px solid rgba(0,0,0,.1);
border-radius: var(--radius-lg); padding: 24px; margin-bottom: 32px;
}
.conflict-header {
display: flex; align-items: flex-start; gap: 16px; margin-bottom: 24px;
}
.conflict-flag-svg { flex-shrink: 0; margin-top: 2px; }
.conflict-title { color: #f87171; font-weight: 800; font-size: .9375rem; margin-bottom: 4px; }
.conflict-desc { color: rgba(0,0,0,.6); font-size: .875rem; line-height: 1.6; }
.conflict-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.conflict-side { border-radius: var(--radius-md); padding: 16px; }
.conflict-official { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.2); }
.conflict-observed { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.2); }
.conflict-side-label {
font-size: .75rem; font-weight: 700; text-transform: uppercase;
letter-spacing: .08em; margin-bottom: 10px;
}
.conflict-official .conflict-side-label { color: #86efac; }
.conflict-observed .conflict-side-label { color: #fca5a5; }
.conflict-side ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 16px; }
.conflict-side li { color: rgba(0,0,0,.7); font-size: .875rem; }
.conflict-footer {
margin-top: 20px; padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
display: flex; justify-content: space-between; align-items: center;
}
.conflict-footer-label { color: rgba(0,0,0,.75); font-size: .8125rem; }
.conflict-confidence { color: #f87171; font-weight: 800; font-size: 1.125rem; }
.ce-features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ce-feature { text-align: center; padding: 20px; }
.ce-feature-icon {
width: 28px; height: 28px; margin: 0 auto 10px;
color: rgba(0,0,0,0.75);
}
.ce-feature h4 { color: #1d1d1f; font-weight: 700; margin-bottom: 6px; }
.ce-feature p { color: rgba(0,0,0,.75); font-size: .8125rem; }
.cta-banner {
background: #e8f0fe; border-radius: var(--radius-lg); padding: 24px;
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
margin-top: 48px;
}
.cta-banner h3 { color: #1d1d1f; font-size: 1.25rem; font-weight: 800; margin-bottom: 8px; }
.cta-banner p { color: rgba(0,0,0,.7); line-height: 1.65; font-size: .9375rem; }
.cta-banner-text { flex: 1; min-width: 260px; }
.contact-wrapper { max-width: 680px; margin: 0 auto; text-align: center; }
.contact-wrapper .section-title { margin-bottom: 10px; }
.contact-wrapper .section-sub { margin: 0 auto 48px; }
.contact-form {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); padding: 40px; text-align: left;
}
.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; }
.stats-row { grid-template-columns: 1fr 1fr; }
.districts-grid { grid-template-columns: repeat(2, 1fr); }
.intel-grid { grid-template-columns: 1fr; }
.conflict-grid { grid-template-columns: 1fr; }
.ce-features { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
section { padding: 48px 0 !important; }
.stats-row { grid-template-columns: 1fr 1fr !important; }
.districts-grid { grid-template-columns: 1fr 1fr !important; }
.intel-grid { grid-template-columns: 1fr !important; }
.conflict-grid { grid-template-columns: 1fr !important; }
.ce-features { grid-template-columns: 1fr !important; }
.scores-grid { grid-template-columns: 1fr 1fr !important; }
.cta-banner { flex-direction: column !important; gap: 16px; padding: 24px; }
.cta-banner-text { min-width: 0 !important; }
.container { padding: 0 16px !important; box-sizing: border-box; }
.contact-form { padding: 24px; }
nav { padding: 0 16px; }
.hero h1 { letter-spacing: -1px; }
}
@media (max-width: 400px) {
.stats-row { grid-template-columns: 1fr !important; }
.districts-grid { grid-template-columns: 1fr !important; }
.scores-grid { 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}
</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": "Cities", "item": "https://landvex.com/cities/"},
{"@type": "ListItem", "position": 3, "name": "Zurich", "item": "https://landvex.com/cities/zurich/"}
]
}
</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/">
<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="Main navigation">
<a class="nav-logo" href="https://landvex.com/">&larr; Back to Landvex</a>
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch &rarr;</a>
</nav>
<!-- HERO -->
<section class="lv-hero">
<div class="lv-hero-eyebrow">City Intelligence &mdash; Zurich</div>
<h1>Zurich &mdash; City Intelligence Report</h1>
<p class="lv-hero-subtitle">Continuous monitoring of commercial activity, infrastructure conditions and urban development across Zurich&rsquo;s districts. Updated from field observations.</p>
<div class="hero-ctas">
<a class="lv-btn lv-btn--lg" href="#contact">Request Zurich briefing &rarr;</a>
<a class="btn btn-outline btn-lg" href="#overview">City overview</a>
</div>
</section>
<!-- OVERVIEW -->
<section id="overview">
<div class="lv-container">
<div class="section-label">City overview</div>
<h2 class="section-title">Zurich at a glance</h2>
<p class="section-sub">Key statistics informing Landvex intelligence collection and scoring across Zurich&rsquo;s urban area.</p>
<div class="stats-row">
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
</svg>
<div class="stat-value">440,000</div>
<div class="stat-label">City population</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="1" x2="12" y2="23"/>
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
</svg>
<div class="stat-value">Top 5 Global (per capita)</div>
<div class="stat-label">GDP rank in regional context</div>
</div>
<div class="stat-card" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="stat-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
</svg>
<div class="stat-value">Finance &middot; Insurance &middot; Pharma</div>
<div class="stat-label">Key economic sectors</div>
</div>
</div>
</div>
</section>
<!-- DISTRICTS -->
<section id="districts" class="districts-bg">
<div class="lv-container">
<div class="section-label">Coverage</div>
<h2 class="section-title">Districts covered</h2>
<p class="section-sub">Landvex field intelligence spans all major commercial and residential districts across Zurich.</p>
<div class="districts-grid">
<div class="district-chip"><span class="chip-dot"></span><span>City / Altstadt</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Enge</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Wiedikon</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Schwamendingen</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Oerlikon</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Altstetten</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>H&ouml;ngg</span></div>
<div class="district-chip"><span class="chip-dot"></span><span>Wollishofen</span></div>
</div>
</div>
</section>
<!-- ACTIVE INTELLIGENCE -->
<section id="intelligence">
<div class="lv-container">
<div class="section-label">Active intelligence</div>
<h2 class="section-title">What Landvex monitors in Zurich</h2>
<p class="section-sub">Four continuous intelligence streams, updated from field observations and cross-referenced against official sources.</p>
<div class="intel-grid">
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
<polyline points="9 22 9 12 15 12 15 22"/>
</svg>
<h3>Commercial Vitality Score</h3>
<p>Measures vacancy rates, business openings and closures, foot traffic signals, and commercial activity across each district. Launching August 2026 from field observations.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h3>Infrastructure Risk Index</h3>
<p>Identifies infrastructure degradation, transport disruptions, and maintenance backlogs that affect business continuity and investment risk across Zurich&rsquo;s districts.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/>
</svg>
<h3>Development Forecast</h3>
<p>Tracks planning applications, construction activity, and development signals. Identifies emerging opportunities and area trajectories before they appear in official statistics.</p>
</div>
<div class="lv-card lv-card--intel" onclick="location.href='#contact'" role="button" tabindex="0">
<svg class="intel-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<line x1="18" y1="20" x2="18" y2="10"/>
<line x1="12" y1="20" x2="12" y2="4"/>
<line x1="6" y1="20" x2="6" y2="14"/>
</svg>
<h3>Growth Velocity</h3>
<p>How fast is each district changing? Landvex Growth Velocity captures the rate of transformation &mdash; identifying which areas are accelerating, plateauing, or in decline.</p>
</div>
</div>
</div>
</section>
<!-- SCORES TABLE -->
<section id="scores">
<div class="lv-container">
<div class="section-label">District scores</div>
<h2 class="section-title">Sample intelligence scores</h2>
<p class="section-sub">Placeholder scores shown for illustration. Live district intelligence available on request.</p>
<div class="scores-table-wrap">
<table class="scores-table">
<thead>
<tr>
<th>District</th>
<th>Opportunity</th>
<th>Growth</th>
<th>Infra Stability</th>
<th>Vitality</th>
</tr>
</thead>
<tbody>
<tr>
<td class="district-name">City / Altstadt</td>
<td><span class="score-pill high">83</span></td>
<td><span class="score-pill low">62</span></td>
<td><span class="score-pill high">89</span></td>
<td><span class="score-pill high">92</span></td>
</tr>
<tr>
<td class="district-name">Oerlikon</td>
<td><span class="score-pill mid">77</span></td>
<td><span class="score-pill mid">74</span></td>
<td><span class="score-pill high">82</span></td>
<td><span class="score-pill high">81</span></td>
</tr>
<tr>
<td class="district-name">Altstetten</td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill mid">76</span></td>
<td><span class="score-pill mid">78</span></td>
<td><span class="score-pill mid">74</span></td>
</tr>
<tr>
<td class="district-name">Schwamendingen</td>
<td><span class="score-pill low">65</span></td>
<td><span class="score-pill mid">79</span></td>
<td><span class="score-pill mid">71</span></td>
<td><span class="score-pill low">69</span></td>
</tr>
</tbody>
</table>
<p class="table-note">Scores are illustrative placeholders. Live data from field observations available Aug 2026.</p>
</div>
</div>
</section>
<!-- CONTRADICTION ENGINE -->
<section class="contradiction-bg" id="contradiction">
<div class="lv-container">
<div>
<div class="section-label">Contradiction Engine</div>
<h2 class="section-title">Most systems tell you what the data says.<br>Landvex tells you what doesn&rsquo;t add up.</h2>
<p class="section-sub">When official municipal development plans diverge from observed commercial activity, Landvex surfaces the conflict &mdash; not just the consensus.</p>
</div>
<div class="contradiction-box">
<div class="conflict-header">
<svg class="conflict-flag-svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f87171" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/>
<line x1="4" y1="22" x2="4" y2="15"/>
</svg>
<div>
<div class="conflict-title">Narrative Conflict Detected &mdash; Zurich &mdash; City / Altstadt / Schwamendingen</div>
<div class="conflict-desc">Official municipal development plans vs observed commercial activity. Field data reveals divergence between planned urban investment zones and measured commercial vitality on the ground.</div>
</div>
</div>
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul>
<li>&#100003 City / Altstadt: premium commercial core, rated fully stable</li>
<li>&#100003 Schwamendingen: affordable district with long-term growth mandate</li>
<li>&#100003 Infrastructure maintenance rated best-in-class nationally</li>
</ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul>
<li>&#100007 City / Altstadt: office vacancy ticking upward post-remote shift</li>
<li>&#100007 Schwamendingen: investment slower than mandate implies</li>
<li>&#100007 Altstetten emerging as commercial overflow beneficiary</li>
<li>&#100007 Retail footfall in Altstadt below 2019 baseline</li>
</ul>
</div>
</div>
<div class="conflict-footer">
<span class="conflict-footer-label">Confidence in official narrative</span>
<span class="conflict-confidence">62%</span>
</div>
</div>
<div class="ce-features">
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
</svg>
<h4>Show me what I&rsquo;m missing</h4>
<p>Blind spots not visible in official data or internal reports</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
<h4>AI Red Team</h4>
<p>Every conclusion is actively challenged by a second model before delivery</p>
</div>
<div class="ce-feature">
<svg class="ce-feature-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="12" y1="8" x2="12" y2="12"/>
<line x1="12" y1="16" x2="12.01" y2="16"/>
</svg>
<h4>Which assumptions are wrong?</h4>
<p>Identify where your thesis conflicts with observed reality</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section id="briefing">
<div class="lv-container">
<div class="cta-banner">
<div class="cta-banner-text">
<h3>Request Zurich intelligence briefing</h3>
<p>Get field-verified district scores, contradiction analysis, and custom intelligence for your Zurich decision. Delivered in 24&ndash;72 hours.</p>
</div>
<a class="lv-btn lv-btn--lg" href="#contact">Request briefing &rarr;</a>
</div>
</div>
</section>
<!-- CONTACT -->
<section id="contact">
<div class="lv-container">
<div class="contact-wrapper">
<div class="section-label">Request a briefing</div>
<h2 class="section-title">What decision are you trying to make?</h2>
<p class="section-sub">Tell us the question you need answered about Zurich. We&rsquo;ll show you how Landvex can support it.</p>
<form class="contact-form" id="contact-form">
<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 class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" placeholder="Describe the decision you need to make about Zurich &mdash; what you need to know, which districts, and why it matters..."></textarea>
</div>
<button type="submit" class="lv-btn lv-btn--lg">
Request Zurich briefing &rarr;
</button>
<p class="form-note">We don&rsquo;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 &mdash; not investment, financial or legal advice. Landvex AB accepts no liability for decisions made based on these outputs. <a href="/methodology/">Methodology &rarr;</a></p>
</section>
<footer class="lv-footer" role="contentinfo">
<div class="footer-inner">
<div>
<div class="footer-logo">LandveX</div>
<div class="footer-copy">&copy; 2026 Landvex AB &middot; Org.nr 559141-7042</div>
<div class="footer-tagline">Decision intelligence for the physical world.</div>
</div>
<div class="footer-links">
<a href="https://landvex.com/">Home</a>
<a href="/methodology/">Methodology</a>
<a href="/security/">Security</a>
<a href="https://www.quixzoom.com/" target="_blank" rel="noopener">quiXzoom &rarr;</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-city-zurich',
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 = "\u2713 Request received. We\u2019ll 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 directly at contact@landvex.com.';
msgEl.style.display = 'block';
}
btn.disabled = false; btn.textContent = 'Request Zurich briefing \u2192';
});
document.querySelectorAll('a[href^="#"]').forEach(a => {
a.addEventListener('click', e => {
const target = document.querySelector(a.getAttribute('href'));
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
});
});
</script>
</body>
</html>