6989a98d75
- 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
507 lines
33 KiB
HTML
507 lines
33 KiB
HTML
<!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/">← Back to Landvex</a>
|
|
<a class="lv-btn lv-btn--outline" href="#contact">Get in touch →</a>
|
|
</nav>
|
|
|
|
<section class="lv-hero">
|
|
<div class="lv-hero-eyebrow">City Intelligence — Bangkok</div>
|
|
<h1>Bangkok — 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 →</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 — 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 · Tech · 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’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’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’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’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–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’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 →</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 →</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">© 2026 Landvex AB · 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. © 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>
|