58ca4e68db
- Go backend API with full CRUD for all modules (CRM, Sales, Finance, HR, Legal, Marketing, Support, Purchase, Inventory, Projects, Automation, Analytics) - Rust analytics service with parallel report generation - C runtime with POSIX shared memory IPC - PostgreSQL schema with 30+ tables, full migrations - Redis cache, sessions, pub/sub - Kafka event streaming with Zookeeper - WebSocket hub for real-time updates - Automation engine with cron jobs, workflows, event triggers - JWT authentication, multi-tenant from start - Docker Compose with all services - Nginx reverse proxy with rate limiting - Integration tests passing - Feature gap analysis against Fortnox/Odoo/Visma Refs: BOC-001
511 lines
34 KiB
HTML
511 lines
34 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://www.landvex.com/cities/bangkok/">
|
|
<meta name="robots" content="index, follow">
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:url" content="https://www.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://www.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">
|
|
<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.88); 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: 6px; padding: 10px 22px; 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: 14px 30px; 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: 120px 24px 80px; position: relative; overflow: hidden; }
|
|
.hero::before { content: ''; position: absolute; top: -200px; left: 50%; transform: translateX(-50%); width: 900px; height: 600px; background: radial-gradient(ellipse at center, rgba(0,102,255,0.12) 0%, transparent 70%); pointer-events: none; }
|
|
.hero-eyebrow { display: inline-flex; align-items: center; gap: 8px; background: rgba(0,102,255,0.1); border: 1px solid rgba(0,102,255,0.25); color: #5599ff; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; padding: 6px 16px; border-radius: 100px; margin-bottom: 28px; }
|
|
.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: 14px; flex-wrap: wrap; justify-content: center; }
|
|
section { padding: 96px 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: 16px; }
|
|
.section-title { font-size: clamp(28px, 4vw, 44px); font-weight: 800; letter-spacing: -1.2px; line-height: 1.1; color: #1d1d1f; margin-bottom: 16px; }
|
|
.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: 20px; margin-top: 40px; }
|
|
.stat-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 28px 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: 12px; margin-top: 40px; }
|
|
.district-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 16px 20px; display: flex; align-items: center; gap: 10px; }
|
|
.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: 20px; margin-top: 40px; }
|
|
.intel-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 32px 28px; 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: 16px; 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: 12px 20px; 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: 16px 20px; 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: 4px 12px; 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: 36px 40px; 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: 6px; }
|
|
.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: 20px; }
|
|
.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: 40px 48px; display: flex; align-items: center; gap: 48px; 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: 8px; margin-bottom: 16px; }
|
|
.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: 12px 16px; 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: 14px 20px; 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: 20px; }
|
|
.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: 24px; 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 !important; padding: 28px 24px; }
|
|
.cta-banner-text { min-width: 0 !important; }
|
|
.container { padding: 0 16px !important; box-sizing: border-box; }
|
|
.contact-form { padding: 24px 20px; }
|
|
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: 12px 16px; 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://www.landvex.com/"
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 2,
|
|
"name": "Cities",
|
|
"item": "https://www.landvex.com/cities/"
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 3,
|
|
"name": "Bangkok",
|
|
"item": "https://www.landvex.com/cities/bangkok/"
|
|
}
|
|
]
|
|
}
|
|
</script>
|
|
<link rel="alternate" hreflang="x-default" href="https://www.landvex.com/">
|
|
<link rel="alternate" hreflang="en" href="https://www.landvex.com/">
|
|
<link rel="alternate" hreflang="sv" href="https://landvex.se/">
|
|
<link rel="alternate" hreflang="de" href="https://landvex.de/">
|
|
<link rel="alternate" hreflang="fr" href="https://landvex.fr/">
|
|
<link rel="alternate" hreflang="en-GB" href="https://landvex.co.uk/">
|
|
<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>
|
|
<a class="nav-logo" href="https://landvex.com/">← Back to Landvex</a>
|
|
<a class="btn btn-outline" href="#contact">Get in touch →</a>
|
|
</nav>
|
|
|
|
<section class="hero">
|
|
<div class="hero-eyebrow">City Intelligence — Bangkok</div>
|
|
<h1>Bangkok — City Intelligence Report</h1>
|
|
<p class="hero-sub">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="btn 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" style="background:var(--surface)">
|
|
<div class="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" style="background: var(--bg-dark)">
|
|
<div class="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" style="background:var(--surface)">
|
|
<div class="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="intel-card">
|
|
<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="intel-card">
|
|
<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="intel-card">
|
|
<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="intel-card">
|
|
<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" style="background: var(--bg-dark)">
|
|
<div class="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="container">
|
|
<div class="section-label">Contradiction Engine</div>
|
|
<h2 class="section-title" style="color: #1d1d1f">Where official narratives diverge from observed reality.</h2>
|
|
<p class="section-sub" style="color:rgba(0,0,0,.75);margin-bottom:40px">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="btn btn-lg" href="#contact" style="white-space:nowrap;flex-shrink:0">Request Bangkok briefing →</a>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CONTACT -->
|
|
<section id="contact" style="background: var(--bg-dark)">
|
|
<div class="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="btn btn-lg" style="width:100%;justify-content:center">Send request →</button>
|
|
<p class="form-note">We respond within 48 hours. Your details are handled in accordance with our <a href="/privacy/" style="color:var(--blue)">privacy policy</a>.</p>
|
|
<div id="form-message"></div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<footer>
|
|
<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 style="max-width:1140px;margin:24px auto 0">
|
|
<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>
|