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
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>IQOA Condition Pre-Screening</h3>
<p>Field observations structured to support IQOA classification workflows. Identify 2E, 3 and 3U priority candidates before formal inspection deployment, enabling efficient use of CEREMA and DIR inspection resources.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; IQOA last survey: 28 months ago, classification 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: on schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No restriction orders active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 IQOA last survey: 28 months ago, classification 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: on schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No restriction orders active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Advanced carbonation of concrete at three pier bases</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Pavement deformation above central span consistent with deck movement</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Joint sealant failure on four of six expansion joints</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Corrosion staining on soffit indicates active reinforcement attack</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Advanced carbonation of concrete at three pier bases</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Pavement deformation above central span consistent with deck movement</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Joint sealant failure on four of six expansion joints</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Corrosion staining on soffit indicates active reinforcement attack</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>DIN 1076 Condition Assessment Support</h3>
<p>Field observation data structured to complement DIN 1076 inspection requirements. Identify priority assets before the next mandatory Hauptpruefung cycle without deploying physical inspection teams.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Hauptpruefung completed 22 months ago: Zustandsnote 2.7</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: within schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No load restriction active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Hauptpruefung completed 22 months ago: Zustandsnote 2.7</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: within schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No load restriction active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Chloride-induced rebar corrosion visible on east parapet</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Expansion joint displacement 18mm above threshold on two spans</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active water seepage through deck on south abutment</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Bearing deterioration consistent with grade 3.5+ condition</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Chloride-induced rebar corrosion visible on east parapet</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Expansion joint displacement 18mm above threshold on two spans</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active water seepage through deck on south abutment</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Bearing deterioration consistent with grade 3.5+ condition</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>NEN 2767 Condition Monitoring Support</h3>
<p>Field observations structured to support NEN 2767 condition assessment workflows. Identify deterioration trends and priority assets between formal inspection intervals without physical inspection deployment.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; NEN 2767 last inspection: 19 months ago, condition score 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; RWS maintenance programme: within cycle</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No restrictions active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 NEN 2767 last inspection: 19 months ago, condition score 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 RWS maintenance programme: within cycle</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No restrictions active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Visible concrete cracking on three viaduct spans above threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Bridge deck waterproofing failure on two sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Expansion joint displacement beyond tolerance at four locations</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Sediment accumulation blocking drainage outlets at two abutments</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Visible concrete cracking on three viaduct spans above threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Bridge deck waterproofing failure on two sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Expansion joint displacement beyond tolerance at four locations</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Sediment accumulation blocking drainage outlets at two abutments</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Structural Condition Assessment</h3>
<p>Systematic visual surveys of bridge decks, bearings, expansion joints, parapets, and approach slabs across the Swedish national and municipal bridge inventory. AI-reviewed, geo-tagged, and delivered as structured data.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Last inspection: 14 months ago, passed</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance schedule: on track</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No load restrictions active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Last inspection: 14 months ago, passed</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance schedule: on track</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No load restrictions active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Visible spalling on three pier caps</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Expansion joint separation exceeds specification on two spans</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Approach slab subsidence visible on northbound carriageway</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage outfall blockage confirmed at abutment E4-107</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Visible spalling on three pier caps</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Expansion joint separation exceeds specification on two spans</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Approach slab subsidence visible on northbound carriageway</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage outfall blockage confirmed at abutment E4-107</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>DMRB-Aligned Condition Pre-Screening</h3>
<p>Field observations structured to support BD 63 and CS 450 inspection workflows. Identify priority assets before formal Principal or General Inspections without deploying physical teams to every structure.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Last Principal Inspection: 38 months ago, condition grade B</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: within programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No interim restrictions active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Last Principal Inspection: 38 months ago, condition grade B</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: within programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No interim restrictions active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Visible concrete delamination on three spans approaching carriageway edge</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Bearing shelf corrosion consistent with grade C/D condition</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Half-joint cracking at two locations exceeds intervention threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Retaining wall settlement visible at southbound approach</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Visible concrete delamination on three spans approaching carriageway edge</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Bearing shelf corrosion consistent with grade C/D condition</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Half-joint cracking at two locations exceeds intervention threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Retaining wall settlement visible at southbound approach</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Route Nationale Condition Intelligence</h3>
<p>Continuous monitoring of RN pavement condition, markings, drainage, and barrier integrity between IQRN and IQROA survey cycles. Detect emerging deterioration before it triggers reactive emergency maintenance.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; IQRN survey: 17 months ago, score B</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance plan: within schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No emergency intervention orders</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 IQRN survey: 17 months ago, score B</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance plan: within schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No emergency intervention orders</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Longitudinal cracking extending 600m beyond surveyed section</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Edge deterioration at 8 locations unreported</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage failures at 5 culverts not on maintenance programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Road marking fading below IQROA threshold on 22km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Longitudinal cracking extending 600m beyond surveyed section</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Edge deterioration at 8 locations unreported</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage failures at 5 culverts not on maintenance programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Road marking fading below IQROA threshold on 22km</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Bundesautobahn Network Monitoring</h3>
<p>Continuous observation of pavement condition, drainage, signage, and barrier integrity across the Autobahn network. Detect deterioration between ZEB survey cycles to support interim maintenance decisions.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; ZEB last survey: 26 months ago, PCR value 1.4</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: within cycle</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No service restrictions</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 ZEB last survey: 26 months ago, PCR value 1.4</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: within cycle</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No service restrictions</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Rut depth exceeding ZEB trigger threshold on 4.2km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage failure at seven locations not captured in last survey</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Crash barrier corrosion failure at two segments</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Retroreflective marking degradation across 18km of carriageway</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Rut depth exceeding ZEB trigger threshold on 4.2km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage failure at seven locations not captured in last survey</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Crash barrier corrosion failure at two segments</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Retroreflective marking degradation across 18km of carriageway</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Rijkswaterstaat Network Monitoring</h3>
<p>Continuous observation of RWS motorway and waterway infrastructure. Monitor pavement condition, hydraulic structures, barriers, and drainage between formal inspection intervals.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; NEN 2767 inspection: 21 months ago, condition score 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance plan: within programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No service disruption logged</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 NEN 2767 inspection: 21 months ago, condition score 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance plan: within programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No service disruption logged</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Pavement cracking above NEN 2767 score 3 threshold on 3.1km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage blockage at six culverts outside maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Crash barrier corrosion failure on 4 segments not on programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Cycle path surface deterioration exceeding 2 score on 8km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Pavement cracking above NEN 2767 score 3 threshold on 3.1km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage blockage at six culverts outside maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Crash barrier corrosion failure on 4 segments not on programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Cycle path surface deterioration exceeding 2 score on 8km</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Road Network Condition Monitoring</h3>
<p>Systematic monitoring of road surface conditions, markings, signage, and drainage across Swedish national and municipal networks. Updated continuously, delivered as structured intelligence.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Road condition survey: 11 months ago, IRI within standard</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: on schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No service alerts active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Road condition survey: 11 months ago, IRI within standard</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: on schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No service alerts active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Pavement cracking extending 340m beyond surveyed section</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage channel blockage at four culvert locations</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Safety barrier damage at three segments unreported</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Lane marking fading below retroreflectivity threshold on 12km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Pavement cracking extending 340m beyond surveyed section</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage channel blockage at four culvert locations</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Safety barrier damage at three segments unreported</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Lane marking fading below retroreflectivity threshold on 12km</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>SRN Condition Monitoring</h3>
<p>Continuous observation of National Highways assets between SCANNER and SCRIM survey cycles. Detect surface deterioration, drainage failure, and barrier damage to inform interim maintenance scheduling.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; SCANNER survey: 14 months ago, Road Condition Indicator: green</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Highway maintenance programme: within budget</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No section 58 defences active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 SCANNER survey: 14 months ago, Road Condition Indicator: green</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Highway maintenance programme: within budget</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No section 58 defences active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Transverse cracking at 11 locations exceeding CVI defect thresholds</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Carriageway edge deterioration on 7.4km unreported</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Gully blockages identified at 23 locations beyond maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Street lighting column corrosion at 14 locations above intervention level</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Transverse cracking at 11 locations exceeding CVI defect thresholds</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Carriageway edge deterioration on 7.4km unreported</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Gully blockages identified at 23 locations beyond maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Street lighting column corrosion at 14 locations above intervention level</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -138,7 +138,7 @@
.evidence-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.cta-banner {
background: #e8f0fe; border-radius: 16px; padding: 40px 48px;
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; }
@@ -184,13 +184,13 @@
.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: 8px;
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:12px 16px;background:rgba(0,0,0,.04);border-radius:8px;line-height:1.6;max-width:800px}
.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,.65);text-decoration:underline}
@media (max-width: 900px) {
@@ -138,7 +138,7 @@
.evidence-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.cta-banner {
background: #e8f0fe; border-radius: 16px; padding: 40px 48px;
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; }
@@ -184,13 +184,13 @@
.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: 8px;
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:12px 16px;background:rgba(0,0,0,.04);border-radius:8px;line-height:1.6;max-width:800px}
.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,.65);text-decoration:underline}
@media (max-width: 900px) {
@@ -138,7 +138,7 @@
.evidence-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.cta-banner {
background: #e8f0fe; border-radius: 16px; padding: 40px 48px;
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; }
@@ -184,13 +184,13 @@
.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: 8px;
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:12px 16px;background:rgba(0,0,0,.04);border-radius:8px;line-height:1.6;max-width:800px}
.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,.65);text-decoration:underline}
@media (max-width: 900px) {
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Centre-Ville Retail Assessment</h3>
<p>Field-verified assessment of French town centre retail performance: occupier mix, vacancy indicators, pedestrian environment quality, and competition from periurban formats. Evidence for Action Coeur de Ville investment decisions.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Vacancy rate: 8.4% (PROCOS Q2)</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Pedestrianisation programme: improving footfall</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No exceptional distress signals in planning register</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Vacancy rate: 8.4% (PROCOS Q2)</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Pedestrianisation programme: improving footfall</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No exceptional distress signals in planning register</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active vacancy on 17 of 71 units — effective rate 23.9%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Pop-up and temporary units masking structural vacancy on 5 units</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Two anchor occupiers with reduced opening hours and degraded fit-out</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Street environment maintenance below prime standard on 40% of frontage</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active vacancy on 17 of 71 units — effective rate 23.9%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Pop-up and temporary units masking structural vacancy on 5 units</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Two anchor occupiers with reduced opening hours and degraded fit-out</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Street environment maintenance below prime standard on 40% of frontage</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Innenstadt Retail Location Assessment</h3>
<p>Field-verified assessment of German Innenstadt retail performance: occupier mix, vacancy rate, pedestrian environment quality, and physical asset condition. Evidence-based input for 1A-Lage and secondary location decisions.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Vacancy rate: 6.1% (BulwienGesa Q4)</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Footfall trend: recovering post-pandemic</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; 1A-Lage classification: maintained</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Vacancy rate: 6.1% (BulwienGesa Q4)</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Footfall trend: recovering post-pandemic</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 1A-Lage classification: maintained</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active vacancy on 14 of 62 units — effective rate 22.6%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Six units operating as temporary or charity lets masking structural vacancy</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Four anchor occupiers showing evidence of lease-end reduction in fit-out investment</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Street environment maintenance at B-Lage standard on central 300m stretch</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active vacancy on 14 of 62 units — effective rate 22.6%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Six units operating as temporary or charity lets masking structural vacancy</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Four anchor occupiers showing evidence of lease-end reduction in fit-out investment</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Street environment maintenance at B-Lage standard on central 300m stretch</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Winkelgebied Performance Assessment</h3>
<p>Field-verified assessment of Dutch winkelgebieden: occupier mix, vacancy indicators, physical environment quality, and competitive dynamics. Evidence-based input for acquisition, lease negotiation, and disposal decisions.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Locatus vacancy: 7.8%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Pedestrian footfall: stable year-on-year</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No structural distress in gemeentelijk monitor</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Locatus vacancy: 7.8%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Pedestrian footfall: stable year-on-year</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No structural distress in gemeentelijk monitor</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active structural vacancy on 13 of 58 units — effective rate 22.4%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; 4 pop-up units and 2 charity shops masking structural vacancy</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Two anchor occupiers showing fit-out disinvestment consistent with lease-end</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Public realm condition below Centrum-standard on three block frontages</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active structural vacancy on 13 of 58 units — effective rate 22.4%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 4 pop-up units and 2 charity shops masking structural vacancy</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Two anchor occupiers showing fit-out disinvestment consistent with lease-end</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Public realm condition below Centrum-standard on three block frontages</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Retail Location Assessment</h3>
<p>Field-verified assessment of Swedish retail locations: pedestrian environment quality, competitive positioning, retail mix, vacancy indicators, and physical access. Evidence-based input for lease negotiation and portfolio decisions.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Vacancy rate: 4.2% (official BID survey, Q3)</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Footfall index: stable year-on-year</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No exceptional distress signals in planning data</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Vacancy rate: 4.2% (official BID survey, Q3)</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Footfall index: stable year-on-year</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No exceptional distress signals in planning data</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active vacancy on 11 of 48 units — effective rate 23%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Temporary lets and pop-ups masking structural vacancy on 4 units</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Three anchor occupiers have reduced fit-out quality significantly</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Pedestrian environment maintenance below investment-grade standard</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active vacancy on 11 of 48 units — effective rate 23%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Temporary lets and pop-ups masking structural vacancy on 4 units</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Three anchor occupiers have reduced fit-out quality significantly</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Pedestrian environment maintenance below investment-grade standard</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>High Street Vacancy Monitoring</h3>
<p>Field-verified vacancy monitoring across UK town centres and high streets. Identify structural vacancy, temporary uses masking distress, and deterioration in occupier quality — updated continuously, not on annual survey cycles.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; LDC vacancy rate: 11.3%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Footfall index: improving trend</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; BID health assessment: stable</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 LDC vacancy rate: 11.3%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Footfall index: improving trend</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 BID health assessment: stable</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active structural vacancy on 19 of 74 units — effective rate 25.7%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; 7 pop-up, temporary, and charity units offsetting structural vacancy</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Three former anchor units subdivided or at reduced rental value</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Public realm maintenance below investment-grade standard on main frontage</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active structural vacancy on 19 of 74 units — effective rate 25.7%</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 7 pop-up, temporary, and charity units offsetting structural vacancy</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Three former anchor units subdivided or at reduced rental value</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Public realm maintenance below investment-grade standard on main frontage</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -138,7 +138,7 @@
.evidence-card p { font-size: 14px; color: var(--text-dim); line-height: 1.6; }
.cta-banner {
background: #e8f0fe; border-radius: 16px; padding: 40px 48px;
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; }
@@ -184,13 +184,13 @@
.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: 8px;
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:12px 16px;background:rgba(0,0,0,.04);border-radius:8px;line-height:1.6;max-width:800px}
.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,.65);text-decoration:underline}
@media (max-width: 900px) {
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>IQRN/IQROA Condition Pre-Screening</h3>
<p>Field observations structured to support IQRN and IQROA assessment workflows. Identify priority sections before formal survey deployment, enabling targeted use of CEREMA and DIR survey resources.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; IQROA survey: 20 months ago, score C</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Departmental maintenance programme: within schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No emergency repair orders active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 IQROA survey: 20 months ago, score C</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Departmental maintenance programme: within schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No emergency repair orders active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Longitudinal cracking on 4.2km inconsistent with C-score parameters</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Pothole density on 1.8km exceeds D-score threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage failures at 11 culverts outside maintenance programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Road marking fading below minimum retroreflectivity on 28km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Longitudinal cracking on 4.2km inconsistent with C-score parameters</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Pothole density on 1.8km exceeds D-score threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage failures at 11 culverts outside maintenance programme</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Road marking fading below minimum retroreflectivity on 28km</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>ZEB-Aligned Pavement Assessment</h3>
<p>Field observations structured to supplement ZEB survey data. Identify priority sections for Autobahn GmbH and Landesstrassenbehoerden between formal ZEB cycles — without deploying survey vehicles.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; ZEB survey: 31 months ago, PCR value 1.6</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: within ZEB cycle</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No emergency orders active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 ZEB survey: 31 months ago, PCR value 1.6</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: within ZEB cycle</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No emergency orders active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Rut depth exceeding ZEB trigger threshold on 5.4km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Active cracking patterns consistent with PCR 2.5+ on three sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Safety barrier corrosion failure at six locations</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Leitpfosten damage on 12km unreported in maintenance register</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Rut depth exceeding ZEB trigger threshold on 5.4km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Active cracking patterns consistent with PCR 2.5+ on three sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Safety barrier corrosion failure at six locations</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Leitpfosten damage on 12km unreported in maintenance register</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>NEN 2767 Road Condition Assessment</h3>
<p>Field observations structured to support NEN 2767 condition assessment workflows across the Dutch road network. Identify priority sections for Rijkswaterstaat and provincial authorities between formal inspection intervals.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; NEN 2767 inspection: 24 months ago, condition score 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Provincial maintenance programme: within MJOP</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No emergency repair orders active</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 NEN 2767 inspection: 24 months ago, condition score 2</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Provincial maintenance programme: within MJOP</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No emergency repair orders active</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Rut depth exceeding NEN 2767 score 3 threshold on 2.8km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Edge cracking patterns consistent with score 3+ on three sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Drainage failure at 9 culverts outside MJOP schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Fietspad surface deterioration above score 3 on 5.6km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Rut depth exceeding NEN 2767 score 3 threshold on 2.8km</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Edge cracking patterns consistent with score 3+ on three sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Drainage failure at 9 culverts outside MJOP schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Fietspad surface deterioration above score 3 on 5.6km</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>Pavement Condition Assessment</h3>
<p>Systematic documentation of Swedish road surface conditions: cracking, rutting, surface defects, and IRI indicators across national and municipal networks. AI-reviewed, geo-tagged, and delivered as structured data.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; VTI road condition survey: 13 months ago, IRI 2.1</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Maintenance programme: within standard</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No emergency interventions logged</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 VTI road condition survey: 13 months ago, IRI 2.1</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Maintenance programme: within standard</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No emergency interventions logged</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Transverse cracking on 6.8km not captured in last VTI survey</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Rutting exceeding Swedish standard on two 1.2km sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Gully blockages at 17 locations outside maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Road marking retroreflectivity below NVV threshold on 14km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Transverse cracking on 6.8km not captured in last VTI survey</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Rutting exceeding Swedish standard on two 1.2km sections</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Gully blockages at 17 locations outside maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Road marking retroreflectivity below NVV threshold on 14km</li></ul>
</div>
</div>
<div class="conflict-footer">
@@ -69,16 +69,16 @@
.decisions-bg { background: var(--surface); }
.decisions-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: 40px; }
.decision-chip { background: var(--bg-dark); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 22px; display: flex; align-items: center; gap: 12px; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.decision-chip .chip-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--blue); flex-shrink: 0; }
.decision-chip span { font-size: 14px; font-weight: 600; color: var(--text-light); }
.contradiction-bg { background: #e8f0fe; }
.contradiction-box { background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.1); border-radius: 16px; padding: 36px 40px; margin-bottom: 32px; }
.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 { font-size: 1.5rem; color: #f87171; }
.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: 10px; padding: 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; }
@@ -92,13 +92,13 @@
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: #1d1d1f; }
.breadcrumb .sep { color: var(--border); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: 12px; overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table { width: 100%; border-collapse: collapse; margin-top: 32px; border-radius: var(--radius-md); overflow: hidden; border: 1px solid rgba(0,0,0,0.08); }
.comparison-table th { padding: 14px 16px; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .07em; text-align: left; background: rgba(0,0,0,0.04); color: var(--text-dim); }
.cta-section { background: #e8f0fe; }
.cta-box { border-radius: 16px; padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box { border-radius: var(--radius-lg); padding: 56px 48px; text-align: center; max-width: 680px; margin: 0 auto; }
.cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 800; color: #1d1d1f; margin-bottom: 16px; }
.cta-box p { font-size: 17px; color: rgba(0,0,0,.7); margin-bottom: 36px; line-height: 1.65; }
.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:8px; line-height:1.6; max-width:800px; }
.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,.65); text-decoration:underline; }
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; }
@@ -108,7 +108,7 @@
.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: 8px; display: flex; align-items: center; justify-content: center; transition: border-color 0.2s, background 0.2s; }
.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; } .use-case-grid { grid-template-columns:1fr; } .decisions-grid { grid-template-columns:1fr 1fr; } .conflict-grid { grid-template-columns:1fr; } }
@media (max-width:600px) { section { padding:72px 20px; } .decisions-grid { grid-template-columns:1fr; } nav { padding:0 16px; } .hero h1 { letter-spacing:-1px; } .contradiction-box { padding:24px 20px; } }
@@ -150,7 +150,7 @@
<p class="section-sub">Every engagement is anchored to a specific decision. Select a capability to discuss how Landvex applies it to your context.</p>
<div class="use-case-grid">
<a class="use-case-card" href="/contact/" style="display:block;text-decoration:none;">
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#9650;</span>
<span class="uc-icon" style="font-size:22px;display:block;margin-bottom:16px;color:#5599ff;">&#965050</span>
<h3>SCANNER and CVI Pre-Screening</h3>
<p>Field observations structured to support SCANNER, SCRIM, and CVI inspection workflows. Identify priority sections before formal survey deployment, enabling targeted allocation of highway inspection resources.</p>
<div style="margin-top:14px;font-size:13px;font-weight:700;color:#0066ff;">Learn more &rarr;</div>
@@ -270,16 +270,16 @@
<div class="conflict-grid">
<div class="conflict-side conflict-official">
<div class="conflict-side-label">Official narrative</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; SCANNER survey: 16 months ago, RCI green</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; Highway maintenance programme: within budget</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10003; No section 38 emergency repair orders</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 SCANNER survey: 16 months ago, RCI green</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 Highway maintenance programme: within budget</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100003 No section 38 emergency repair orders</li></ul>
</div>
<div class="conflict-side conflict-observed">
<div class="conflict-side-label">Observed reality</div>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Carriageway cracking at 15 locations exceeding CVI defect threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Edge deterioration on 9.2km inconsistent with green RCI rating</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Gully blockages at 31 locations outside maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#10007; Road marking retroreflectivity below DMRB threshold on 17km</li></ul>
<ul><li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Carriageway cracking at 15 locations exceeding CVI defect threshold</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Edge deterioration on 9.2km inconsistent with green RCI rating</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Gully blockages at 31 locations outside maintenance schedule</li>
<li style='color:rgba(0,0,0,.75);font-size:.875rem;padding:4px 0;'>&#100007 Road marking retroreflectivity below DMRB threshold on 17km</li></ul>
</div>
</div>
<div class="conflict-footer">