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
+12 -12
View File
@@ -14,35 +14,35 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #6c757d; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #0066cc; border-bottom-color: #0066cc; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.philosophy { background: #fff; border-radius: 12px; padding: 32px; margin-bottom: 32px; border-left: 4px solid #0066cc; }
.philosophy { background: #fff; border-radius: var(--radius-md); padding: 32px; margin-bottom: 32px; border-left: 4px solid #0066cc; }
.philosophy h2 { font-size: 1.25rem; margin-bottom: 16px; color: #1a1a1a; }
.philosophy p { color: #495057; margin-bottom: 12px; }
.philosophy ul { margin-left: 20px; color: #495057; }
.philosophy li { margin-bottom: 8px; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 20px; margin-bottom: 32px; }
.stat-card { background: #fff; border-radius: 12px; padding: 24px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.stat-card { background: #fff; border-radius: var(--radius-md); padding: 24px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.stat-card h3 { font-size: 0.75rem; color: #6c757d; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px; }
.stat-card .value { font-size: 2rem; font-weight: 700; color: #1a1a1a; }
.stat-card .change { font-size: 0.8rem; margin-top: 4px; }
.stat-card .change.positive { color: #28a745; }
.section { background: #fff; border-radius: 12px; padding: 24px; margin-bottom: 24px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.section { background: #fff; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.section h2 { font-size: 1.1rem; margin-bottom: 16px; color: #1a1a1a; }
.project-card { border: 1px solid #e9ecef; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.project-card { border: 1px solid #e9ecef; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; }
.project-card h3 { font-size: 1rem; margin-bottom: 8px; }
.project-card .meta { font-size: 0.8rem; color: #6c757d; margin-bottom: 8px; }
.project-card .findings { font-size: 0.85rem; color: #495057; }
.project-card .findings li { margin-bottom: 4px; }
.score { display: inline-block; padding: 4px 12px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; }
.score { display: inline-block; padding: 4px 12px; border-radius: var(--radius-sm); font-size: 0.75rem; font-weight: 600; }
.score.high { background: #d4edda; color: #155724; }
.score.medium { background: #fff3cd; color: #856404; }
.score.low { background: #f8d7da; color: #721c24; }
.discrepancy { background: #fff3cd; border: 1px solid #ffeaa7; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.discrepancy { background: #fff3cd; border: 1px solid #ffeaa7; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; }
.discrepancy h4 { color: #856404; margin-bottom: 8px; }
.discrepancy p { font-size: 0.85rem; color: #495057; }
.positive { background: #d4edda; border: 1px solid #c3e6cb; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.positive { background: #d4edda; border: 1px solid #c3e6cb; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; }
.positive h4 { color: #155724; margin-bottom: 8px; }
.framework-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }
.framework-card { border: 1px solid #e9ecef; border-radius: 8px; padding: 16px; }
.framework-card { border: 1px solid #e9ecef; border-radius: var(--radius-md); padding: 16px; }
.framework-card h4 { font-size: 0.95rem; margin-bottom: 8px; }
.framework-card p { font-size: 0.8rem; color: #6c757d; }
</style>
@@ -157,7 +157,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<p style="color: #6c757d; margin-bottom: 16px;">These findings indicate areas where additional verification may be valuable. They are not conclusions of wrongdoing.</p>
<div class="discrepancy">
<h4>⚠️ Schedule Variance - Mogadishu Primary School</h4>
<h4><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> Schedule Variance - Mogadishu Primary School</h4>
<p><strong>Reported:</strong> 95% complete (June 2026)<br>
<strong>Observed:</strong> 85% complete (July 2026)<br>
<strong>Evidence:</strong> Field observation, Satellite, AI analysis<br>
@@ -166,7 +166,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="discrepancy">
<h4>⚠️ Activity Gap - Lagos Road Rehabilitation</h4>
<h4><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> Activity Gap - Lagos Road Rehabilitation</h4>
<p><strong>Reported:</strong> Active construction<br>
<strong>Observed:</strong> No activity for 90 days, equipment removed<br>
<strong>Evidence:</strong> Field observation, Satellite time-series<br>
@@ -180,14 +180,14 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<p style="color: #6c757d; margin-bottom: 16px;">Projects demonstrating strong implementation and sustained operation. These enable benchmarking and dissemination of successful practices.</p>
<div class="positive">
<h4> Accra Solar Microgrid - Ghana</h4>
<h4><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Accra Solar Microgrid - Ghana</h4>
<p><strong>SII Score:</strong> 89/100 | <strong>Confidence:</strong> 92%<br>
<strong>Strengths:</strong> Strong implementation, Sustained operation (24+ months), High community utilization, Long-term maintenance observed, Positive environmental outcomes<br>
<strong>Benchmark Category:</strong> Energy Infrastructure</p>
</div>
<div class="positive">
<h4> Nairobi Digital Health Records - Kenya</h4>
<h4><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Nairobi Digital Health Records - Kenya</h4>
<p><strong>SII Score:</strong> 84/100 | <strong>Confidence:</strong> 86%<br>
<strong>Strengths:</strong> Operational continuity, Staff training evident, Patient utilization increasing, Data transparency<br>
<strong>Benchmark Category:</strong> Digital Health</p>
+8 -8
View File
@@ -15,18 +15,18 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a:hover, .nav a.active { color: #fff; background: #222; }
.main { padding: 40px; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 20px; margin-bottom: 40px; }
.stat-card { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.stat-card { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.stat-card h3 { font-size: 0.75rem; color: #666; margin-bottom: 8px; text-transform: uppercase; }
.stat-card .value { font-size: 2rem; font-weight: 700; color: #fff; }
.stat-card .change { font-size: 0.8rem; color: #34c759; margin-top: 4px; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; }
.section h2 { font-size: 1.1rem; margin-bottom: 16px; color: #fff; }
.map-placeholder { background: #1a1a1a; border-radius: 8px; height: 400px; display: flex; align-items: center; justify-content: center; color: #666; }
.map-placeholder { background: #1a1a1a; border-radius: var(--radius-md); height: 400px; display: flex; align-items: center; justify-content: center; color: #666; }
table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }
th, td { text-align: left; padding: 12px; border-bottom: 1px solid #333; }
th { color: #666; font-size: 0.75rem; text-transform: uppercase; }
tr:hover { background: #1a1a1a; }
.status { display: inline-block; padding: 4px 12px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; }
.status { display: inline-block; padding: 4px 12px; border-radius: var(--radius-sm); font-size: 0.75rem; font-weight: 600; }
.status.active { background: #1a3a1a; color: #34c759; }
.status.completed { background: #1a1a3a; color: #5ac8fa; }
.status.delayed { background: #3a1a1a; color: #ff3b30; }
@@ -34,11 +34,11 @@ tr:hover { background: #1a1a1a; }
.score.high { color: #34c759; }
.score.medium { color: #ff9500; }
.score.low { color: #ff3b30; }
.alert { background: #3a1a1a; border: 1px solid #ff3b30; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.alert { background: #3a1a1a; border: 1px solid #ff3b30; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; }
.alert h4 { color: #ff3b30; margin-bottom: 8px; }
.alert p { color: #ccc; font-size: 0.85rem; }
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.country-card { background: #1a1a1a; border-radius: 8px; padding: 16px; display: flex; justify-content: space-between; align-items: center; }
.country-card { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; display: flex; justify-content: space-between; align-items: center; }
.country-card h4 { font-size: 1rem; }
.country-card .score { font-size: 1.5rem; }
</style>
@@ -112,11 +112,11 @@ Interactive Map<br>
<div class="section">
<h2>Risk Alerts</h2>
<div class="alert">
<h4>⚠️ Abandoned Project Detected</h4>
<h4><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> Abandoned Project Detected</h4>
<p><strong>Lagos Road Rehabilitation</strong> - No activity for 90 days. Equipment removed.</p>
</div>
<div class="alert" style="background: #3a3a1a; border-color: #ff9500;">
<h4 style="color: #ff9500;">⚠️ Infrastructure Deterioration</h4>
<h4 style="color: #ff9500;"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> Infrastructure Deterioration</h4>
<p><strong>Nairobi Health Clinic</strong> - Accelerated deterioration observed.</p>
</div>
</div>
+8 -8
View File
@@ -10,22 +10,22 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.sidebar { width: 260px; background: #0a0a0a; color: #fff; position: fixed; height: 100vh; padding: 24px; overflow-y: auto; }
.sidebar h1 { font-size: 1.25rem; margin-bottom: 8px; }
.sidebar .subtitle { font-size: 0.75rem; color: #666; margin-bottom: 32px; }
.sidebar nav a { display: block; color: #999; text-decoration: none; padding: 10px 16px; border-radius: 8px; margin-bottom: 2px; transition: all 0.2s; font-size: 0.875rem; cursor: pointer; }
.sidebar nav a { display: block; color: #999; text-decoration: none; padding: 10px 16px; border-radius: var(--radius-md); margin-bottom: 2px; transition: all 0.2s; font-size: 0.875rem; cursor: pointer; }
.sidebar nav a:hover, .sidebar nav a.active { color: #fff; background: rgba(255,255,255,0.1); }
.sidebar nav .section { color: #666; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 1px; margin: 16px 0 8px 16px; }
.main { margin-left: 260px; padding: 32px; }
.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 32px; }
.header h2 { font-size: 1.75rem; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px; }
.stat-card { background: #fff; border-radius: 12px; padding: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); cursor: pointer; transition: transform 0.2s; }
.stat-card { background: #fff; border-radius: var(--radius-md); padding: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); cursor: pointer; transition: transform 0.2s; }
.stat-card:hover { transform: translateY(-2px); }
.stat-card h3 { font-size: 0.75rem; color: #666; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px; }
.stat-card .value { font-size: 1.75rem; font-weight: 700; }
.stat-card .change { font-size: 0.8rem; margin-top: 4px; }
.stat-card .change.positive { color: #34c759; }
.section { background: #fff; border-radius: 12px; padding: 24px; margin-bottom: 24px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.section { background: #fff; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.section h3 { font-size: 1.1rem; margin-bottom: 16px; display: flex; align-items: center; gap: 8px; }
.status-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.status-dot { width: 8px; height: 8px; border-radius: var(--radius-full); display: inline-block; }
.status-dot.green { background: #34c759; }
.status-dot.yellow { background: #ff9500; }
.status-dot.red { background: #ff3b30; }
@@ -33,20 +33,20 @@ table { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
th, td { text-align: left; padding: 10px 12px; border-bottom: 1px solid #eee; }
th { font-weight: 600; color: #666; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px; }
tr:hover { background: #f9f9f9; cursor: pointer; }
.status { display: inline-block; padding: 3px 10px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; }
.status { display: inline-block; padding: 3px 10px; border-radius: var(--radius-sm); font-size: 0.7rem; font-weight: 600; }
.status.published { background: #e8f5e9; color: #2e7d32; }
.status.active { background: #e3f2fd; color: #1565c0; }
.btn { display: inline-block; padding: 8px 16px; border-radius: 6px; border: none; cursor: pointer; font-size: 0.8rem; font-weight: 600; }
.btn { display: inline-block; padding: 8px 16px; border-radius: var(--radius-sm); border: none; cursor: pointer; font-size: 0.8rem; font-weight: 600; }
.btn-primary { background: #0066cc; color: #fff; }
.btn-secondary { background: #f5f5f5; color: #333; }
.actions { display: flex; gap: 8px; }
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.module-card { border: 1px solid #eee; border-radius: 8px; padding: 16px; cursor: pointer; transition: all 0.2s; }
.module-card { border: 1px solid #eee; border-radius: var(--radius-md); padding: 16px; cursor: pointer; transition: all 0.2s; }
.module-card:hover { border-color: #0066cc; box-shadow: 0 2px 8px rgba(0,102,204,0.1); }
.module-card h4 { font-size: 0.9rem; margin-bottom: 8px; display: flex; align-items: center; gap: 8px; }
.module-card p { font-size: 0.8rem; color: #666; }
.loading { text-align: center; padding: 40px; color: #666; }
.error { background: #ffebee; color: #c62828; padding: 16px; border-radius: 8px; margin-bottom: 16px; }
.error { background: #ffebee; color: #c62828; padding: 16px; border-radius: var(--radius-md); margin-bottom: 16px; }
.hidden { display: none; }
</style>
</head>
+14 -14
View File
@@ -10,21 +10,21 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header { background: #0a0a0a; border-bottom: 1px solid #333; padding: 20px 40px; display: flex; justify-content: space-between; align-items: center; }
.header h1 { font-size: 1.5rem; color: #00d4ff; }
.status { display: flex; gap: 12px; }
.status-item { background: #1a3a1a; color: #4ade80; padding: 4px 12px; border-radius: 4px; font-size: 0.8rem; }
.status-item { background: #1a3a1a; color: #4ade80; padding: 4px 12px; border-radius: var(--radius-sm); font-size: 0.8rem; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px; margin-bottom: 32px; }
.metric { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; text-align: center; }
.metric { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; text-align: center; }
.metric-value { font-size: 2rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.8rem; color: #888; margin-top: 4px; }
.agents { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; margin-bottom: 32px; }
.agent { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; }
.agent { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; }
.agent-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
.agent-name { font-weight: 600; color: #fff; }
.agent-status { font-size: 0.75rem; padding: 2px 8px; border-radius: 4px; }
.agent-status { font-size: 0.75rem; padding: 2px 8px; border-radius: var(--radius-sm); }
.status-active { background: #1a3a1a; color: #4ade80; }
.agent-stats { font-size: 0.85rem; color: #888; }
.agent-stats div { margin: 4px 0; }
.log { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; height: 400px; overflow-y: auto; }
.log { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; height: 400px; overflow-y: auto; }
.log h2 { font-size: 1.1rem; margin-bottom: 12px; color: #00d4ff; }
.log-entry { font-family: monospace; font-size: 0.8rem; padding: 4px 0; border-bottom: 1px solid #222; }
.log-time { color: #666; }
@@ -39,9 +39,9 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<h1>LIFE Agent Swarm</h1>
</div>
<div class="status">
<div class="status-item"> 6 Agents Active</div>
<div class="status-item"> 281 Nodes</div>
<div class="status-item"> 924 Edges</div>
<div class="status-item"> 6 Agents Active</div>
<div class="status-item"> 281 Nodes</div>
<div class="status-item"> 924 Edges</div>
</div>
</div>
@@ -77,7 +77,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="agents">
<div class="agent">
<div class="agent-header">
<div class="agent-name">🕷️ Crawler Agent</div>
<div class="agent-name"> Crawler Agent</div>
<div class="agent-status status-active">ACTIVE</div>
</div>
<div class="agent-stats">
@@ -89,7 +89,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="agent">
<div class="agent-header">
<div class="agent-name">👁️ Observation Agent</div>
<div class="agent-name"> Observation Agent</div>
<div class="agent-status status-active">ACTIVE</div>
</div>
<div class="agent-stats">
@@ -101,7 +101,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="agent">
<div class="agent-header">
<div class="agent-name"> Validation Agent</div>
<div class="agent-name"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Validation Agent</div>
<div class="agent-status status-active">ACTIVE</div>
</div>
<div class="agent-stats">
@@ -113,7 +113,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="agent">
<div class="agent-header">
<div class="agent-name">📈 Confidence Agent</div>
<div class="agent-name"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Confidence Agent</div>
<div class="agent-status status-active">ACTIVE</div>
</div>
<div class="agent-stats">
@@ -125,7 +125,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="agent">
<div class="agent-header">
<div class="agent-name">🎯 Mission Agent</div>
<div class="agent-name"> Mission Agent</div>
<div class="agent-status status-active">ACTIVE</div>
</div>
<div class="agent-stats">
@@ -137,7 +137,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="agent">
<div class="agent-header">
<div class="agent-name">🧠 Learning Agent</div>
<div class="agent-name"> Learning Agent</div>
<div class="agent-status status-active">ACTIVE</div>
</div>
<div class="agent-stats">
+19 -19
View File
@@ -14,13 +14,13 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2.5rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1.1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.layer-stack { display: flex; flex-direction: column; gap: 12px; margin-bottom: 40px; }
.layer { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; display: flex; align-items: center; gap: 20px; transition: all 0.3s; }
.layer { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; display: flex; align-items: center; gap: 20px; transition: all 0.3s; }
.layer:hover { border-color: #00d4ff; transform: translateX(8px); }
.layer-number { width: 40px; height: 40px; background: linear-gradient(135deg, #00d4ff, #7c3aed); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1.1rem; }
.layer-number { width: 40px; height: 40px; background: linear-gradient(135deg, #00d4ff, #7c3aed); border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1.1rem; }
.layer-info { flex: 1; }
.layer-info h3 { font-size: 1.1rem; margin-bottom: 4px; }
.layer-info p { font-size: 0.85rem; color: #888; }
@@ -28,16 +28,16 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.layer-meta .count { font-size: 1.25rem; font-weight: 700; color: #00d4ff; }
.layer-meta .label { font-size: 0.75rem; color: #666; }
.core-blocks { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-bottom: 40px; }
.core-block { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; text-align: center; }
.core-block { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; text-align: center; }
.core-block .icon { font-size: 2rem; margin-bottom: 12px; }
.core-block h3 { font-size: 1rem; margin-bottom: 8px; }
.core-block p { font-size: 0.85rem; color: #888; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px; margin-bottom: 40px; }
.stat-card { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; text-align: center; }
.stat-card { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; text-align: center; }
.stat-card .value { font-size: 1.75rem; font-weight: 700; color: #00d4ff; }
.stat-card .label { font-size: 0.75rem; color: #666; margin-top: 4px; }
.applications { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
.app-card { background: #1a1a2e; border: 1px solid #333; border-radius: 8px; padding: 16px; font-size: 0.9rem; }
.app-card { background: #1a1a2e; border: 1px solid #333; border-radius: var(--radius-md); padding: 16px; font-size: 0.9rem; }
.app-card:hover { border-color: #7c3aed; }
</style>
</head>
@@ -180,19 +180,19 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="core-blocks" id="blocks">
<div class="core-block">
<div class="icon">🎯</div>
<div class="icon"></div>
<h3>Decision Engine</h3>
<p>Vad bör användaren göra nu? Omvandlar intelligens till konkreta rekommendationer</p>
</div>
<div class="core-block">
<div class="icon">🧠</div>
<div class="icon"></div>
<h3>Learning Engine</h3>
<p>Självutvärdering och kontinuerlig förbättring av modeller</p>
</div>
<div class="core-block">
<div class="icon">🔌</div>
<div class="icon"></div>
<h3>Integration Layer</h3>
<p>REST API, webhooks, streaming, SDK och enterprise-integrationer</p>
</div>
@@ -202,16 +202,16 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<p style="color: #888; margin-bottom: 20px;">LIFE är en generell motor. Bistånd är en tillämpning, inte identitet.</p>
<div class="applications" id="apps">
<div class="app-card">🏗️ Infrastrukturhantering</div>
<div class="app-card">🏙️ Stadsplanering</div>
<div class="app-card">🌱 Miljöövervakning</div>
<div class="app-card">🛡️ Försäkringsrisk</div>
<div class="app-card">🏛️ Kommunal tillsyn</div>
<div class="app-card">🚨 Katastrofhantering</div>
<div class="app-card">🏢 Fastighetsförvaltning</div>
<div class="app-card">📦 Supply chain</div>
<div class="app-card">🔒 Säkerhetsanalys</div>
<div class="app-card">🌍 Biståndsövervakning</div>
<div class="app-card"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg> Infrastrukturhantering</div>
<div class="app-card"> Stadsplanering</div>
<div class="app-card"> Miljöövervakning</div>
<div class="app-card"> Försäkringsrisk</div>
<div class="app-card"> Kommunal tillsyn</div>
<div class="app-card"> Katastrofhantering</div>
<div class="app-card"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H7M6 8H7M6 11H7M9 5H10M9 8H10M9 11H10" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg> Fastighetsförvaltning</div>
<div class="app-card"> Supply chain</div>
<div class="app-card"> Säkerhetsanalys</div>
<div class="app-card"> Biståndsövervakning</div>
</div>
</div>
+9 -9
View File
@@ -14,30 +14,30 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.components { display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 20px; margin-bottom: 40px; }
.component { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.component { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.component-number { font-size: 0.75rem; color: #00d4ff; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
.component h3 { font-size: 1.1rem; margin-bottom: 12px; }
.component p { color: #888; font-size: 0.85rem; margin-bottom: 12px; }
.component-items { list-style: none; }
.component-items li { color: #aaa; font-size: 0.8rem; padding: 4px 0; padding-left: 16px; position: relative; }
.component-items li::before { content: "→"; position: absolute; left: 0; color: #00d4ff; }
.separation { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.separation { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.separation h2 { font-size: 1.5rem; margin-bottom: 16px; color: #7c3aed; }
.separation p { color: #888; margin-bottom: 16px; }
.entities { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; margin-top: 16px; }
.entity { background: #1a1a1a; border-radius: 8px; padding: 16px; }
.entity { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; }
.entity-name { color: #00d4ff; font-weight: 600; }
.entity-type { color: #888; font-size: 0.8rem; }
.entity-desc { color: #aaa; font-size: 0.75rem; margin-top: 8px; }
.product-story { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; text-align: center; }
.product-story { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; text-align: center; }
.product-story h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.product-story p { font-size: 1.1rem; color: #aaa; max-width: 800px; margin: 0 auto; line-height: 1.8; }
.evolution { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 12px; margin-bottom: 40px; }
.evo { background: #111; border: 1px solid #333; border-radius: 8px; padding: 12px; text-align: center; }
.evo { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 12px; text-align: center; }
.evo-version { font-size: 1.1rem; font-weight: 700; color: #00d4ff; }
.evo-name { font-size: 0.75rem; color: #aaa; }
</style>
@@ -108,7 +108,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="components" id="components">
<div class="component">
<div class="component-number">Komponent 1</div>
<h3>📦 Reference Implementations</h3>
<h3> Reference Implementations</h3>
<p>Öppna referensimplementationer som sänker tröskeln för externa utvecklare</p>
<ul class="component-items">
<li>Reference Server (Python/FastAPI)</li>
@@ -121,7 +121,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="component">
<div class="component-number">Komponent 2</div>
<h3> Conformance Program</h3>
<h3><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Conformance Program</h3>
<p>Certifieringsprogram som ger tydlig kvalitetsnivå för RIS-integrationer</p>
<ul class="component-items">
<li>RIS Compatible (gratis)</li>
@@ -134,7 +134,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="component">
<div class="component-number">Komponent 3</div>
<h3>📄 Public Specification</h3>
<h3> Public Specification</h3>
<p>Öppen specifikation som gör att andra kan implementera RIS oberoende</p>
<ul class="component-items">
<li>Terminologi och begrepp</li>
+9 -9
View File
@@ -14,22 +14,22 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.pillars { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin-bottom: 40px; }
.pillar { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.pillar { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.pillar-number { font-size: 0.75rem; color: #00d4ff; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
.pillar h3 { font-size: 1.1rem; margin-bottom: 12px; }
.pillar p { color: #888; font-size: 0.85rem; margin-bottom: 12px; }
.pillar-features { list-style: none; }
.pillar-features li { color: #aaa; font-size: 0.8rem; padding: 4px 0; padding-left: 16px; position: relative; }
.pillar-features li::before { content: "→"; position: absolute; left: 0; color: #00d4ff; }
.product-def { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; text-align: center; }
.product-def { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; text-align: center; }
.product-def h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.product-def p { font-size: 1.1rem; color: #aaa; max-width: 700px; margin: 0 auto; line-height: 1.8; }
.stats { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 16px; margin-bottom: 40px; }
.stat { background: #111; border: 1px solid #333; border-radius: 8px; padding: 16px; text-align: center; }
.stat { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 16px; text-align: center; }
.stat-value { font-size: 1.5rem; font-weight: 700; color: #00d4ff; }
.stat-label { font-size: 0.75rem; color: #666; margin-top: 4px; }
</style>
@@ -85,7 +85,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="pillars" id="pillars">
<div class="pillar">
<div class="pillar-number">Pillar 1</div>
<h3>🔐 Trust Layer</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="7" width="10" height="7" rx="1" stroke="#666" stroke-width="1.5"/><path d="M5 7V5C5 3.3 6.3 2 8 2C9.7 2 11 3.3 11 5V7" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="10.5" r="1" fill="#666"/></svg> Trust Layer</h3>
<p>Varje insikt ska kunna besvara tillitsfrågor</p>
<ul class="pillar-features">
<li>Vilka källor ligger bakom?</li>
@@ -98,7 +98,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="pillar">
<div class="pillar-number">Pillar 2</div>
<h3>📋 Governance Layer</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H10M6 8H10M6 11H8" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg> Governance Layer</h3>
<p>Tydliga regler för modeller, data och beslut</p>
<ul class="pillar-features">
<li>Versionshantering av AI-modeller</li>
@@ -111,7 +111,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="pillar">
<div class="pillar-number">Pillar 3</div>
<h3>🔮 Simulation Layer</h3>
<h3> Simulation Layer</h3>
<p>Simulera scenarier, inte bara beskriva nuläge</p>
<ul class="pillar-features">
<li>Vad händer om en väg stängs?</li>
@@ -124,7 +124,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="pillar">
<div class="pillar-number">Pillar 4</div>
<h3>👥 Collaboration Layer</h3>
<h3> Collaboration Layer</h3>
<p>Flera aktörer arbetar i samma informationsmodell</p>
<ul class="pillar-features">
<li>Kommentera observationer</li>
@@ -137,7 +137,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="pillar">
<div class="pillar-number">Pillar 5</div>
<h3>🔌 Reality API</h3>
<h3> Reality API</h3>
<p>Semantiskt API för domänorienterad åtkomst</p>
<ul class="pillar-features">
<li>/objects - Fysiska objekt</li>
+6 -6
View File
@@ -12,7 +12,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header .subtitle { color: #666; font-size: 0.85rem; }
.main { padding: 40px; max-width: 1200px; margin: 0 auto; }
.pyramid { display: flex; flex-direction: column; gap: 16px; }
.level { border-radius: 12px; padding: 24px; position: relative; }
.level { border-radius: var(--radius-md); padding: 24px; position: relative; }
.level-mission { background: linear-gradient(135deg, #7c3aed, #00d4ff); }
.level-customer { background: #1a1a2e; border: 2px solid #7c3aed; }
.level-platform { background: #1a1a2e; border: 2px solid #00d4ff; }
@@ -21,15 +21,15 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.level-label { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 8px; opacity: 0.8; }
.level h2 { font-size: 1.3rem; margin-bottom: 8px; }
.level p { font-size: 0.9rem; opacity: 0.9; }
.metric-highlight { display: inline-block; background: rgba(255,255,255,0.1); padding: 8px 16px; border-radius: 8px; margin-top: 12px; font-size: 1.1rem; font-weight: 600; }
.metric-highlight { display: inline-block; background: rgba(255,255,255,0.1); padding: 8px 16px; border-radius: var(--radius-md); margin-top: 12px; font-size: 1.1rem; font-weight: 600; }
.metrics-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-top: 16px; }
.metric-card { background: rgba(0,0,0,0.3); border-radius: 8px; padding: 12px; }
.metric-card { background: rgba(0,0,0,0.3); border-radius: var(--radius-md); padding: 12px; }
.metric-name { font-size: 0.8rem; opacity: 0.8; }
.metric-value { font-size: 1.5rem; font-weight: 700; margin-top: 4px; }
.metric-target { font-size: 0.75rem; opacity: 0.6; }
.rl-highlight { background: #111; border: 2px solid #fbbf24; border-radius: 12px; padding: 24px; margin: 24px 0; }
.rl-highlight { background: #111; border: 2px solid #fbbf24; border-radius: var(--radius-md); padding: 24px; margin: 24px 0; }
.rl-highlight h2 { color: #fbbf24; margin-bottom: 12px; }
.event-log { background: #111; border-radius: 8px; padding: 16px; margin-top: 16px; }
.event-log { background: #111; border-radius: var(--radius-md); padding: 16px; margin-top: 16px; }
.event-item { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #222; }
.event-item:last-child { border-bottom: none; }
</style>
@@ -114,7 +114,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<!-- Reality Latency -->
<div class="rl-highlight">
<h2> Reality Latency (RL)</h2>
<h2><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M9 2L5 9H8L7 14L11 7H8L9 2Z" fill="#f59e0b"/></svg> Reality Latency (RL)</h2>
<p><strong>Signature Metric:</strong> Time between reality changing and LIFE knowing about it.</p>
<p>Current Average: <strong id="rl-value">Loading...</strong> hours | Target: 24h</p>
<div class="event-log" id="event-log">
+16 -16
View File
@@ -14,10 +14,10 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.north-star { background: #111; border: 2px solid #00d4ff; border-radius: 12px; padding: 32px; margin-bottom: 40px; text-align: center; }
.north-star { background: #111; border: 2px solid #00d4ff; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; text-align: center; }
.north-star h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.north-star .metric-value { font-size: 3rem; font-weight: 700; color: #00d4ff; }
.north-star .metric-label { font-size: 0.9rem; color: #888; margin-bottom: 16px; }
@@ -26,24 +26,24 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.target-year { font-size: 0.8rem; color: #666; }
.target-value { font-size: 1.2rem; font-weight: 600; }
.dimensions { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 20px; margin-bottom: 40px; }
.dimension { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.dimension { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.dimension h3 { font-size: 1rem; margin-bottom: 8px; color: #00d4ff; }
.dimension .current { font-size: 2rem; font-weight: 700; color: #fff; }
.dimension .target { font-size: 0.85rem; color: #888; margin-top: 4px; }
.framework { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.framework { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.framework h2 { font-size: 1.5rem; margin-bottom: 16px; color: #7c3aed; }
.framework p { color: #888; margin-bottom: 16px; }
.categories { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }
.category { background: #1a1a1a; border-radius: 8px; padding: 16px; }
.category { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; }
.category-name { color: #00d4ff; font-weight: 600; }
.category-desc { color: #888; font-size: 0.8rem; margin-top: 4px; }
.category-example { color: #aaa; font-size: 0.75rem; margin-top: 8px; font-style: italic; }
.roadmap { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.roadmap { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.roadmap h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.phase { margin-bottom: 20px; padding: 16px; background: #1a1a1a; border-radius: 8px; }
.phase { margin-bottom: 20px; padding: 16px; background: #1a1a1a; border-radius: var(--radius-md); }
.phase-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.phase-name { font-weight: 600; color: #fff; }
.phase-priority { font-size: 0.75rem; padding: 2px 8px; border-radius: 4px; }
.phase-priority { font-size: 0.75rem; padding: 2px 8px; border-radius: var(--radius-sm); }
.priority-critical { background: #7c3aed; }
.priority-high { background: #00d4ff; color: #000; }
.priority-medium { background: #333; }
@@ -97,27 +97,27 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="dimensions">
<div class="dimension">
<h3>📊 Object Coverage</h3>
<h3> Object Coverage</h3>
<div class="current">78%</div>
<div class="target">Target: 95%</div>
</div>
<div class="dimension">
<h3>🔍 Multi-source Verification</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="7" cy="7" r="5" stroke="#666" stroke-width="2"/><path d="M11 11L14 14" stroke="#666" stroke-width="2" stroke-linecap="round"/></svg> Multi-source Verification</h3>
<div class="current">34%</div>
<div class="target">Target: 60%</div>
</div>
<div class="dimension">
<h3> Evidence Freshness</h3>
<h3>⏱ Evidence Freshness</h3>
<div class="current">14.2d</div>
<div class="target">Target: 7d</div>
</div>
<div class="dimension">
<h3>🎯 Average Confidence</h3>
<h3> Average Confidence</h3>
<div class="current">68</div>
<div class="target">Target: 80</div>
</div>
<div class="dimension">
<h3>🔗 Traceability</h3>
<h3> Traceability</h3>
<div class="current">92%</div>
<div class="target">Target: 98%</div>
</div>
@@ -129,17 +129,17 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="categories">
<div class="category">
<div class="category-name">🎯 Vision</div>
<div class="category-name"> Vision</div>
<div class="category-desc">What we aim to achieve long-term</div>
<div class="category-example">"LIFE aims to establish an open framework for Reality Intelligence."</div>
</div>
<div class="category">
<div class="category-name">🏗️ Architecture</div>
<div class="category-name"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg> Architecture</div>
<div class="category-desc">How the system is designed</div>
<div class="category-example">"RIS defines objects, evidence, confidence, and interoperability."</div>
</div>
<div class="category">
<div class="category-name"> Validated Results</div>
<div class="category-name"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Validated Results</div>
<div class="category-desc">What we have actually demonstrated</div>
<div class="category-example">"In Pilot X, Y changes identified with Z% verification rate."</div>
</div>
+18 -18
View File
@@ -14,34 +14,34 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2.5rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1.1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.platform-stack { display: flex; flex-direction: column; gap: 16px; margin-bottom: 40px; }
.level { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.level { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.level-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
.level-number { font-size: 0.75rem; color: #00d4ff; text-transform: uppercase; letter-spacing: 1px; }
.level h3 { font-size: 1.25rem; }
.level p { color: #888; font-size: 0.9rem; }
.components { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-top: 16px; }
.component { background: #1a1a1a; border-radius: 8px; padding: 12px; font-size: 0.85rem; }
.component { background: #1a1a1a; border-radius: var(--radius-md); padding: 12px; font-size: 0.85rem; }
.component-name { color: #fff; font-weight: 600; }
.component-desc { color: #666; font-size: 0.75rem; margin-top: 4px; }
.sdk-section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.sdk-section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.sdk-section h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.sdk-section p { color: #888; margin-bottom: 20px; }
.code-block { background: #1a1a1a; border-radius: 8px; padding: 20px; font-family: 'Monaco', monospace; font-size: 0.85rem; overflow-x: auto; }
.code-block { background: #1a1a1a; border-radius: var(--radius-md); padding: 20px; font-family: 'Monaco', monospace; font-size: 0.85rem; overflow-x: auto; }
.code-block .comment { color: #666; }
.code-block .keyword { color: #7c3aed; }
.code-block .string { color: #00d4ff; }
.object-model { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.object-model { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.object-model h2 { font-size: 1.5rem; margin-bottom: 16px; color: #7c3aed; }
.object-attrs { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; margin-top: 16px; }
.attr { background: #1a1a1a; border-radius: 8px; padding: 16px; }
.attr { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; }
.attr-name { color: #00d4ff; font-weight: 600; }
.attr-desc { color: #888; font-size: 0.8rem; margin-top: 4px; }
.domains { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
.domain { background: #1a1a2e; border: 1px solid #333; border-radius: 8px; padding: 16px; text-align: center; }
.domain { background: #1a1a2e; border: 1px solid #333; border-radius: var(--radius-md); padding: 16px; text-align: center; }
.domain:hover { border-color: #7c3aed; }
.domain-icon { font-size: 1.5rem; margin-bottom: 8px; }
.domain-name { font-size: 0.9rem; }
@@ -312,52 +312,52 @@ client.deploy(module)
<div class="domains" id="domains">
<div class="domain">
<div class="domain-icon">🏗️</div>
<div class="domain-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="domain-name">Infrastructure</div>
<div class="domain-status">Tillgänglig</div>
</div>
<div class="domain">
<div class="domain-icon">🌍</div>
<div class="domain-icon"></div>
<div class="domain-name">Aid</div>
<div class="domain-status">Tillgänglig</div>
</div>
<div class="domain">
<div class="domain-icon">🌱</div>
<div class="domain-icon"></div>
<div class="domain-name">Environmental</div>
<div class="domain-status">Beta</div>
</div>
<div class="domain">
<div class="domain-icon">🛡️</div>
<div class="domain-icon"></div>
<div class="domain-name">Insurance</div>
<div class="domain-status">Utveckling</div>
</div>
<div class="domain">
<div class="domain-icon">🏙️</div>
<div class="domain-icon"></div>
<div class="domain-name">City</div>
<div class="domain-status">Beta</div>
</div>
<div class="domain">
<div class="domain-icon">🌾</div>
<div class="domain-icon"></div>
<div class="domain-name">Agriculture</div>
<div class="domain-status">Beta</div>
</div>
<div class="domain">
<div class="domain-icon"></div>
<div class="domain-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M9 2L5 9H8L7 14L11 7H8L9 2Z" fill="#f59e0b"/></svg></div>
<div class="domain-name">Energy</div>
<div class="domain-status">Utveckling</div>
</div>
<div class="domain">
<div class="domain-icon">📦</div>
<div class="domain-icon"></div>
<div class="domain-name">Supply Chain</div>
<div class="domain-status">Utveckling</div>
</div>
<div class="domain">
<div class="domain-icon">🔒</div>
<div class="domain-icon"></div>
<div class="domain-name">Security</div>
<div class="domain-status">Utveckling</div>
</div>
<div class="domain">
<div class="domain-icon">🏢</div>
<div class="domain-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H7M6 8H7M6 11H7M9 5H10M9 8H10M9 11H10" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg></div>
<div class="domain-name">Property</div>
<div class="domain-status">Utveckling</div>
</div>
+14 -14
View File
@@ -14,36 +14,36 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 80px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 80px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2.5rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1.1rem; color: #aaa; max-width: 800px; margin: 0 auto 24px; }
.hero .tagline { font-size: 1rem; color: #00d4ff; font-weight: 600; }
.vision { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; text-align: center; }
.vision { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; text-align: center; }
.vision h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.vision p { font-size: 1.1rem; color: #aaa; max-width: 800px; margin: 0 auto; line-height: 1.8; }
.evolution { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 12px; margin-bottom: 40px; }
.evo { background: #111; border: 1px solid #333; border-radius: 8px; padding: 12px; text-align: center; }
.evo { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 12px; text-align: center; }
.evo-version { font-size: 1.1rem; font-weight: 700; color: #00d4ff; }
.evo-name { font-size: 0.75rem; color: #aaa; }
.components { display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 20px; margin-bottom: 40px; }
.component { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.component { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.component h3 { font-size: 1.1rem; margin-bottom: 12px; color: #00d4ff; }
.component p { color: #888; font-size: 0.85rem; margin-bottom: 12px; }
.component-items { list-style: none; }
.component-items li { color: #aaa; font-size: 0.8rem; padding: 4px 0; padding-left: 16px; position: relative; }
.component-items li::before { content: "→"; position: absolute; left: 0; color: #00d4ff; }
.separation { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.separation { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.separation h2 { font-size: 1.5rem; margin-bottom: 16px; color: #7c3aed; }
.separation p { color: #888; margin-bottom: 16px; }
.entities { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; margin-top: 16px; }
.entity { background: #1a1a1a; border-radius: 8px; padding: 16px; }
.entity { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; }
.entity-name { color: #00d4ff; font-weight: 600; }
.entity-type { color: #888; font-size: 0.8rem; }
.entity-desc { color: #aaa; font-size: 0.75rem; margin-top: 8px; }
.cta { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #1a1a2e 0%, #0a0a0a 100%); border-radius: 16px; }
.cta { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #1a1a2e 0%, #0a0a0a 100%); border-radius: var(--radius-lg); }
.cta h2 { font-size: 2rem; margin-bottom: 16px; color: #fff; }
.cta p { font-size: 1rem; color: #aaa; margin-bottom: 24px; }
.cta-button { display: inline-block; background: linear-gradient(90deg, #00d4ff, #7c3aed); color: #fff; padding: 12px 32px; border-radius: 8px; text-decoration: none; font-weight: 600; }
.cta-button { display: inline-block; background: linear-gradient(90deg, #00d4ff, #7c3aed); color: #fff; padding: 12px 32px; border-radius: var(--radius-md); text-decoration: none; font-weight: 600; }
</style>
</head>
<body>
@@ -113,7 +113,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="components" id="components">
<div class="component">
<h3>🔬 Reality Intelligence</h3>
<h3> Reality Intelligence</h3>
<p>Analyzes the physical world, not just text and documents</p>
<ul class="component-items">
<li>Geospatial data fusion</li>
@@ -124,7 +124,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="component">
<h3>📋 Evidence Before Opinion</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H10M6 8H10M6 11H8" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg> Evidence Before Opinion</h3>
<p>Starts with observations, not conclusions</p>
<ul class="component-items">
<li>Traceable evidence chains</li>
@@ -135,7 +135,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="component">
<h3>🌐 Multi-source Fusion</h3>
<h3> Multi-source Fusion</h3>
<p>Combines satellite, field, open data, and AI</p>
<ul class="component-items">
<li>Satellite imagery (Sentinel-2, etc.)</li>
@@ -146,7 +146,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="component">
<h3>🔍 Explainability</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="7" cy="7" r="5" stroke="#666" stroke-width="2"/><path d="M11 11L14 14" stroke="#666" stroke-width="2" stroke-linecap="round"/></svg> Explainability</h3>
<p>Every insight is explainable and auditable</p>
<ul class="component-items">
<li>Decision lineage</li>
@@ -157,7 +157,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="component">
<h3>📦 Open Standards (RIS)</h3>
<h3> Open Standards (RIS)</h3>
<p>Six open standards for Reality Intelligence</p>
<ul class="component-items">
<li>RIS-001: Reality Object Standard</li>
@@ -170,7 +170,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="component">
<h3>🚀 Reference Implementation</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2L10 8L14 9L8 14L6 8L2 7L8 2Z" fill="#666"/></svg> Reference Implementation</h3>
<p>Open source implementation of RIS</p>
<ul class="component-items">
<li>LIFE Server (Python/FastAPI)</li>
+6 -6
View File
@@ -14,29 +14,29 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.standards { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin-bottom: 40px; }
.standard { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.standard { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.standard-id { font-size: 0.75rem; color: #00d4ff; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
.standard h3 { font-size: 1.1rem; margin-bottom: 12px; }
.standard p { color: #888; font-size: 0.85rem; margin-bottom: 12px; }
.standard-attrs { list-style: none; }
.standard-attrs li { color: #aaa; font-size: 0.8rem; padding: 4px 0; padding-left: 16px; position: relative; }
.standard-attrs li::before { content: "→"; position: absolute; left: 0; color: #00d4ff; }
.ontology { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.ontology { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.ontology h2 { font-size: 1.5rem; margin-bottom: 16px; color: #7c3aed; }
.ontology-levels { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; margin-top: 16px; }
.level { background: #1a1a1a; border-radius: 8px; padding: 16px; }
.level { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; }
.level-name { color: #00d4ff; font-weight: 600; }
.level-desc { color: #888; font-size: 0.8rem; margin-top: 4px; }
.level-concepts { color: #aaa; font-size: 0.75rem; margin-top: 8px; }
.product-def { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; text-align: center; }
.product-def { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; text-align: center; }
.product-def h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.product-def p { font-size: 1.1rem; color: #aaa; max-width: 700px; margin: 0 auto; line-height: 1.8; }
.evolution { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; margin-bottom: 40px; }
.evo { background: #111; border: 1px solid #333; border-radius: 8px; padding: 12px; text-align: center; }
.evo { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 12px; text-align: center; }
.evo-version { font-size: 1.1rem; font-weight: 700; color: #00d4ff; }
.evo-name { font-size: 0.8rem; color: #aaa; }
</style>
+13 -13
View File
@@ -14,32 +14,32 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.philosophy { background: #111; border-radius: 12px; padding: 32px; margin-bottom: 32px; border-left: 4px solid #00d4ff; }
.philosophy { background: #111; border-radius: var(--radius-md); padding: 32px; margin-bottom: 32px; border-left: 4px solid #00d4ff; }
.philosophy h2 { font-size: 1.25rem; margin-bottom: 16px; color: #fff; }
.philosophy p { color: #aaa; margin-bottom: 12px; }
.process { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 20px; }
.process-step { background: #1a1a1a; border-radius: 8px; padding: 16px; text-align: center; }
.process-step { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; text-align: center; }
.process-step .number { font-size: 1.5rem; font-weight: 700; color: #00d4ff; }
.process-step .name { font-size: 0.9rem; color: #fff; margin-top: 8px; }
.process-step .desc { font-size: 0.75rem; color: #666; margin-top: 4px; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 20px; margin-bottom: 32px; }
.stat-card { background: #111; border-radius: 12px; padding: 24px; border: 1px solid #333; }
.stat-card { background: #111; border-radius: var(--radius-md); padding: 24px; border: 1px solid #333; }
.stat-card h3 { font-size: 0.75rem; color: #666; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px; }
.stat-card .value { font-size: 2rem; font-weight: 700; color: #fff; }
.stat-card .change { font-size: 0.8rem; margin-top: 4px; }
.stat-card .change.positive { color: #00d4ff; }
.component-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin-bottom: 32px; }
.component-card { background: #111; border-radius: 12px; padding: 24px; border: 1px solid #333; }
.component-card { background: #111; border-radius: var(--radius-md); padding: 24px; border: 1px solid #333; }
.component-card h3 { font-size: 1rem; margin-bottom: 12px; color: #00d4ff; display: flex; align-items: center; gap: 8px; }
.component-card p { font-size: 0.85rem; color: #aaa; margin-bottom: 8px; }
.component-card .stats { font-size: 0.8rem; color: #666; }
.section { background: #111; border-radius: 12px; padding: 24px; margin-bottom: 24px; border: 1px solid #333; }
.section { background: #111; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; border: 1px solid #333; }
.section h2 { font-size: 1.1rem; margin-bottom: 16px; color: #fff; }
.hypothesis-card { background: #1a1a1a; border-radius: 8px; padding: 16px; margin-bottom: 12px; border-left: 3px solid #00d4ff; }
.hypothesis-card { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; border-left: 3px solid #00d4ff; }
.hypothesis-card h4 { font-size: 0.95rem; margin-bottom: 8px; color: #fff; }
.hypothesis-card p { font-size: 0.85rem; color: #aaa; }
.hypothesis-card .confidence { font-size: 0.8rem; color: #00d4ff; margin-top: 8px; }
.dna-bar { background: #1a1a1a; border-radius: 4px; height: 24px; overflow: hidden; margin-top: 8px; display: flex; }
.dna-bar { background: #1a1a1a; border-radius: var(--radius-sm); height: 24px; overflow: hidden; margin-top: 8px; display: flex; }
.dna-bar .segment { height: 100%; display: flex; align-items: center; justify-content: center; font-size: 0.7rem; color: #fff; }
</style>
</head>
@@ -128,14 +128,14 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="component-grid" id="components">
<div class="component-card">
<h3>🔗 Evidence Graph (EG)</h3>
<h3> Evidence Graph (EG)</h3>
<p>Hierarkisk graf där varje observation är en spårbar nod</p>
<p style="font-size: 0.8rem; color: #666;">Observation → Object → Project → Programme → Organisation → Region → Country</p>
<div class="stats">125,000 noder | 450,000 edges</div>
</div>
<div class="component-card">
<h3>📜 Evidence Lineage</h3>
<h3> Evidence Lineage</h3>
<p>Komplett ursprung för varje datapunkt</p>
<p style="font-size: 0.8rem; color: #666;">Source → Collected → Validated → Cross-validated → AI confidence → Human verification</p>
<div class="stats">45,000 observationer spårade</div>
@@ -149,28 +149,28 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="component-card">
<h3>⚠️ Contradiction Knowledge Base</h4>
<h3><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> Contradiction Knowledge Base</h4>
<p>Alla avvikelser lagras för AI-träning</p>
<p style="font-size: 0.8rem; color: #666;">Efter några år: hundratusentals verkliga exempel</p>
<div class="stats">1,247 avvikelser | 6 kategorier</div>
</div>
<div class="component-card">
<h3>🧬 Reality DNA</h3>
<h3> Reality DNA</h3>
<p>Projektets fingeravtryck för benchmarking</p>
<p style="font-size: 0.8rem; color: #666;">9 dimensioner: Activity, Maintenance, Infrastructure, Community Usage, Traffic, Economic Activity, Environmental Status, Safety, Operational Continuity</p>
<div class="stats">1,250 profiler | Jämförbara</div>
</div>
<div class="component-card">
<h3>💾 Reality Memory</h3>
<h3> Reality Memory</h3>
<p>LIFE kastar aldrig bort något</p>
<p style="font-size: 0.8rem; color: #666;">Varje observation, AI-bedömning och förändring sparas permanent</p>
<div class="stats">2.4 TB | Full reproducerbarhet</div>
</div>
<div class="component-card">
<h3>🧠 Reality Hypothesis Engine</h3>
<h3> Reality Hypothesis Engine</h3>
<p>Inte "Det här är orsaken" utan "Här är möjliga förklaringar..."</p>
<p style="font-size: 0.8rem; color: #666;">Rangordnade efter hur väl de stöds av observerbara data</p>
<div class="stats">3,400 hypoteser | Med osäkerhetsintervall</div>
+16 -16
View File
@@ -14,30 +14,30 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #666; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #00d4ff; border-bottom-color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: 16px; margin-bottom: 40px; }
.hero { text-align: center; padding: 60px 20px; background: linear-gradient(180deg, #0a0a0a 0%, #1a1a2e 100%); border-radius: var(--radius-lg); margin-bottom: 40px; }
.hero h2 { font-size: 2rem; margin-bottom: 16px; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hero p { font-size: 1rem; color: #aaa; max-width: 800px; margin: 0 auto; }
.phases { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin-bottom: 40px; }
.phase { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; }
.phase { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; }
.phase-number { font-size: 0.75rem; color: #00d4ff; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
.phase h3 { font-size: 1.1rem; margin-bottom: 12px; }
.phase p { color: #888; font-size: 0.85rem; margin-bottom: 12px; }
.phase-objs { list-style: none; }
.phase-objs li { color: #aaa; font-size: 0.8rem; padding: 4px 0; padding-left: 16px; position: relative; }
.phase-objs li::before { content: "→"; position: absolute; left: 0; color: #00d4ff; }
.metrics { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.metrics { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.metrics h2 { font-size: 1.5rem; margin-bottom: 16px; color: #7c3aed; }
.metrics p { color: #888; margin-bottom: 16px; }
.metric-dims { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; margin-top: 16px; }
.dim { background: #1a1a1a; border-radius: 8px; padding: 16px; }
.dim { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; }
.dim-name { color: #00d4ff; font-weight: 600; }
.dim-desc { color: #888; font-size: 0.8rem; margin-top: 4px; }
.dim-kpis { color: #aaa; font-size: 0.75rem; margin-top: 8px; }
.spec { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 40px; }
.spec { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 40px; }
.spec h2 { font-size: 1.5rem; margin-bottom: 16px; color: #00d4ff; }
.spec p { color: #888; margin-bottom: 16px; }
.spec-sections { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
.spec-section { background: #1a1a1a; border-radius: 8px; padding: 12px; }
.spec-section { background: #1a1a1a; border-radius: var(--radius-md); padding: 12px; }
.spec-num { color: #00d4ff; font-size: 0.75rem; }
.spec-title { color: #fff; font-size: 0.85rem; }
</style>
@@ -70,7 +70,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="phases" id="phases">
<div class="phase">
<div class="phase-number">Fas 1</div>
<h3>🛣️ Infrastruktur</h3>
<h3> Infrastruktur</h3>
<p>6 månader — Vägar, broar, arbeten</p>
<ul class="phase-objs">
<li>Hitta vägskador (>80% precision)</li>
@@ -82,7 +82,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="phase">
<div class="phase-number">Fas 2</div>
<h3>🏙️ Kommun</h3>
<h3> Kommun</h3>
<p>6 månader — Parker, belysning, skyltning</p>
<ul class="phase-objs">
<li>Följa parker (veckovis)</li>
@@ -95,7 +95,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="phase">
<div class="phase-number">Fas 3</div>
<h3>🏢 Fastigheter</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="3" y="2" width="10" height="12" rx="1" stroke="#666" stroke-width="1.5"/><path d="M6 5H7M6 8H7M6 11H7M9 5H10M9 8H10M9 11H10" stroke="#666" stroke-width="1.5" stroke-linecap="round"/></svg> Fastigheter</h3>
<p>6 månader — Byggnader, skador, underhåll</p>
<ul class="phase-objs">
<li>Följa byggnader (månadsvis)</li>
@@ -107,7 +107,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="phase">
<div class="phase-number">Fas 4</div>
<h3>🌍 Bistånd</h3>
<h3> Bistånd</h3>
<p>12 månader — Projekt, observationer, verifiering</p>
<ul class="phase-objs">
<li>Följa projekt över tid (±15%)</li>
@@ -124,32 +124,32 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<div class="metric-dims">
<div class="dim">
<div class="dim-name">📊 Datatäckning</div>
<div class="dim-name"> Datatäckning</div>
<div class="dim-desc">Andel objekt med aktuell data</div>
<div class="dim-kpis">Object Coverage >95%<br>Geographic Coverage >90%</div>
</div>
<div class="dim">
<div class="dim-name"> Aktualitet</div>
<div class="dim-name">⏱ Aktualitet</div>
<div class="dim-desc">Tid från förändring till observation</div>
<div class="dim-kpis">Detection Time <48h<br>Alert Latency <1h</div>
</div>
<div class="dim">
<div class="dim-name">🔍 Evidenskvalitet</div>
<div class="dim-name"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="7" cy="7" r="5" stroke="#666" stroke-width="2"/><path d="M11 11L14 14" stroke="#666" stroke-width="2" stroke-linecap="round"/></svg> Evidenskvalitet</div>
<div class="dim-desc">Konfidens och verifiering</div>
<div class="dim-kpis">Avg Confidence >75<br>Verification Rate >30%</div>
</div>
<div class="dim">
<div class="dim-name">🎯 Analyskvalitet</div>
<div class="dim-name"> Analyskvalitet</div>
<div class="dim-desc">Användbarhet och korrekthet</div>
<div class="dim-kpis">User Satisfaction >80%<br>Decision Adoption >60%</div>
</div>
<div class="dim">
<div class="dim-name">📈 Adoption</div>
<div class="dim-name"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Adoption</div>
<div class="dim-desc">Externa implementationer</div>
<div class="dim-kpis">External Impl >10<br>Partner Integrations >20</div>
</div>
<div class="dim">
<div class="dim-name">🔗 Interoperabilitet</div>
<div class="dim-name"> Interoperabilitet</div>
<div class="dim-desc">System som utbyter data</div>
<div class="dim-kpis">RIS Compatible >15<br>Data Exchange >1TB/mån</div>
</div>
+3 -3
View File
@@ -11,15 +11,15 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header h1 { font-size: 1.5rem; color: #00d4ff; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px; }
.metric { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; }
.metric { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; }
.metric-value { font-size: 2.5rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.85rem; color: #888; margin-top: 4px; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; }
.section h2 { font-size: 1.2rem; margin-bottom: 16px; color: #00d4ff; }
table { width: 100%; border-collapse: collapse; }
th { text-align: left; padding: 12px; color: #888; font-size: 0.8rem; }
td { padding: 12px; border-top: 1px solid #222; font-size: 0.9rem; }
.status { display: inline-block; padding: 4px 8px; border-radius: 4px; font-size: 0.75rem; }
.status { display: inline-block; padding: 4px 8px; border-radius: var(--radius-sm); font-size: 0.75rem; }
.status-normal { background: #1a3a1a; color: #4ade80; }
.status-warning { background: #3a3a1a; color: #facc15; }
.status-critical { background: #3a1a1a; color: #f87171; }
+23 -23
View File
@@ -14,43 +14,43 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.nav a { color: #94a3b8; text-decoration: none; padding: 12px 20px; font-size: 0.85rem; transition: all 0.2s; border-bottom: 2px solid transparent; }
.nav a:hover, .nav a.active { color: #38bdf8; border-bottom-color: #38bdf8; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.philosophy { background: #1e293b; border-radius: 12px; padding: 32px; margin-bottom: 32px; border-left: 4px solid #38bdf8; }
.philosophy { background: #1e293b; border-radius: var(--radius-md); padding: 32px; margin-bottom: 32px; border-left: 4px solid #38bdf8; }
.philosophy h2 { font-size: 1.25rem; margin-bottom: 16px; color: #f8fafc; }
.philosophy p { color: #cbd5e1; margin-bottom: 12px; }
.philosophy .process { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 20px; }
.process-step { background: #334155; border-radius: 8px; padding: 16px; text-align: center; }
.process-step { background: #334155; border-radius: var(--radius-md); padding: 16px; text-align: center; }
.process-step .number { font-size: 1.5rem; font-weight: 700; color: #38bdf8; }
.process-step .name { font-size: 0.9rem; color: #f8fafc; margin-top: 8px; }
.process-step .desc { font-size: 0.75rem; color: #94a3b8; margin-top: 4px; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 20px; margin-bottom: 32px; }
.stat-card { background: #1e293b; border-radius: 12px; padding: 24px; border: 1px solid #334155; }
.stat-card { background: #1e293b; border-radius: var(--radius-md); padding: 24px; border: 1px solid #334155; }
.stat-card h3 { font-size: 0.75rem; color: #94a3b8; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.5px; }
.stat-card .value { font-size: 2rem; font-weight: 700; color: #f8fafc; }
.stat-card .change { font-size: 0.8rem; margin-top: 4px; }
.stat-card .change.positive { color: #4ade80; }
.section { background: #1e293b; border-radius: 12px; padding: 24px; margin-bottom: 24px; border: 1px solid #334155; }
.section { background: #1e293b; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; border: 1px solid #334155; }
.section h2 { font-size: 1.1rem; margin-bottom: 16px; color: #f8fafc; }
.data-source { display: flex; align-items: center; gap: 12px; padding: 12px; background: #334155; border-radius: 8px; margin-bottom: 8px; }
.data-source .icon { width: 40px; height: 40px; background: #475569; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 1.2rem; }
.data-source { display: flex; align-items: center; gap: 12px; padding: 12px; background: #334155; border-radius: var(--radius-md); margin-bottom: 8px; }
.data-source .icon { width: 40px; height: 40px; background: #475569; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: 1.2rem; }
.data-source .info { flex: 1; }
.data-source .info h4 { font-size: 0.9rem; color: #f8fafc; }
.data-source .info p { font-size: 0.75rem; color: #94a3b8; }
.data-source .status { font-size: 0.75rem; padding: 4px 8px; border-radius: 4px; }
.data-source .status { font-size: 0.75rem; padding: 4px 8px; border-radius: var(--radius-sm); }
.data-source .status.active { background: #166534; color: #4ade80; }
.event-card { background: #334155; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.event-card { background: #334155; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; }
.event-card h4 { font-size: 0.95rem; margin-bottom: 8px; }
.event-card .meta { font-size: 0.8rem; color: #94a3b8; margin-bottom: 8px; }
.event-card .severity { display: inline-block; padding: 3px 10px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; }
.event-card .severity { display: inline-block; padding: 3px 10px; border-radius: var(--radius-sm); font-size: 0.7rem; font-weight: 600; }
.event-card .severity.high { background: #7f1d1d; color: #fca5a5; }
.event-card .severity.medium { background: #713f12; color: #fde047; }
.event-card .severity.low { background: #1e3a5f; color: #93c5fd; }
.confidence-bar { background: #334155; border-radius: 4px; height: 8px; overflow: hidden; margin-top: 8px; }
.confidence-bar .fill { height: 100%; border-radius: 4px; }
.confidence-bar { background: #334155; border-radius: var(--radius-sm); height: 8px; overflow: hidden; margin-top: 8px; }
.confidence-bar .fill { height: 100%; border-radius: var(--radius-sm); }
.confidence-bar .fill.high { background: #4ade80; }
.confidence-bar .fill.medium { background: #fbbf24; }
.confidence-bar .fill.low { background: #f87171; }
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.insight-card { background: #334155; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
.insight-card { background: #334155; border-radius: var(--radius-md); padding: 16px; margin-bottom: 12px; }
.insight-card h4 { font-size: 0.9rem; margin-bottom: 8px; color: #38bdf8; }
.insight-card p { font-size: 0.85rem; color: #cbd5e1; }
</style>
@@ -142,7 +142,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<h2>Continuous Data Acquisition</h2>
<div class="data-source">
<div class="icon">📊</div>
<div class="icon"></div>
<div class="info">
<h4>Official Project Information</h4>
<p>Development agency portals, government databases, procurement portals, evaluation reports</p>
@@ -151,7 +151,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="data-source">
<div class="icon">📰</div>
<div class="icon"></div>
<div class="info">
<h4>News Intelligence</h4>
<p>International, national, regional news, RSS feeds, development and humanitarian news</p>
@@ -160,7 +160,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="data-source">
<div class="icon">🌐</div>
<div class="icon"></div>
<div class="info">
<h4>Public Communications</h4>
<p>Press releases, official websites, social media, research publications</p>
@@ -169,7 +169,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="data-source">
<div class="icon">🛰️</div>
<div class="icon"></div>
<div class="info">
<h4>Geospatial Intelligence</h4>
<p>Satellite imagery, night lights, land cover, construction detection, environmental monitoring</p>
@@ -178,7 +178,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="data-source">
<div class="icon">📱</div>
<div class="icon"></div>
<div class="info">
<h4>QUIXZOOM Reality Network</h4>
<p>Field observations, photographic evidence, infrastructure inspections, community observations</p>
@@ -187,7 +187,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="data-source">
<div class="icon">📈</div>
<div class="icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 12L6 8L9 11L14 5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 5H14V9" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div class="info">
<h4>Open Data</h4>
<p>Population, weather, climate, health indicators, economic data, conflict datasets</p>
@@ -201,7 +201,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<h2>Recent Events Detected</h2>
<div class="event-card">
<h4>🌊 Severe flooding in Mogadishu region</h4>
<h4> Severe flooding in Mogadishu region</h4>
<div class="meta">Somalia • June 15, 2026 • Natural Disaster</div>
<p style="font-size: 0.85rem; color: #cbd5e1; margin-bottom: 8px;">Heavy rainfall caused flooding affecting infrastructure accessibility</p>
<div>
@@ -214,7 +214,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="event-card">
<h4>🏗️ Construction delay due to seasonal rainfall</h4>
<h4><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14H14M4 14V8L8 4L12 8V14" stroke="#666" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 14V10H10V14" stroke="#666" stroke-width="1.5"/></svg> Construction delay due to seasonal rainfall</h4>
<div class="meta">Nigeria • May 20, 2026 • Construction Delay</div>
<p style="font-size: 0.85rem; color: #cbd5e1; margin-bottom: 8px;">Road rehabilitation delayed due to extended rainy season</p>
<div>
@@ -231,7 +231,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<h2>Recent Fusion Insights</h2>
<div class="insight-card">
<h4>🔗 Mogadishu Primary School</h4>
<h4> Mogadishu Primary School</h4>
<p>Construction delay likely due to flooding + poor drainage</p>
<div style="margin-top: 8px;">
<span style="font-size: 0.75rem; color: #94a3b8;">Confidence: 78% • Sources fused: 5</span>
@@ -239,7 +239,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="insight-card">
<h4>🔗 Kampala Water Supply</h4>
<h4> Kampala Water Supply</h4>
<p>Operational sustainability high based on maintenance records + community feedback</p>
<div style="margin-top: 8px;">
<span style="font-size: 0.75rem; color: #94a3b8;">Confidence: 88% • Sources fused: 6</span>
@@ -247,7 +247,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
</div>
<div class="insight-card">
<h4>🔗 Accra Solar Microgrid</h4>
<h4> Accra Solar Microgrid</h4>
<p>24 months continuous operation verified across 4 independent sources</p>
<div style="margin-top: 8px;">
<span style="font-size: 0.75rem; color: #94a3b8;">Confidence: 92% • Sources fused: 4</span>
+10 -10
View File
@@ -10,19 +10,19 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header { background: #0a0a0a; border-bottom: 1px solid #333; padding: 20px 40px; display: flex; justify-content: space-between; align-items: center; }
.header h1 { font-size: 1.5rem; color: #00d4ff; }
.live-indicator { display: flex; align-items: center; gap: 8px; }
.pulse { width: 8px; height: 8px; background: #4ade80; border-radius: 50%; animation: pulse 2s infinite; }
.pulse { width: 8px; height: 8px; background: #4ade80; border-radius: var(--radius-full); animation: pulse 2s infinite; }
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px; }
.metric { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; }
.metric { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; }
.metric-value { font-size: 2.5rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.85rem; color: #888; margin-top: 4px; }
.metric-change { font-size: 0.75rem; margin-top: 4px; }
.change-up { color: #4ade80; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; }
.section h2 { font-size: 1.2rem; margin-bottom: 16px; color: #00d4ff; }
.source-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
.source { background: #1a1a1a; border-radius: 8px; padding: 12px; text-align: center; }
.source { background: #1a1a1a; border-radius: var(--radius-md); padding: 12px; text-align: center; }
.source-name { font-size: 0.8rem; color: #888; }
.source-value { font-size: 1.5rem; font-weight: 700; color: #fff; margin-top: 4px; }
.source-status { font-size: 0.7rem; color: #4ade80; margin-top: 4px; }
@@ -85,32 +85,32 @@ td { padding: 12px; border-top: 1px solid #222; font-size: 0.9rem; }
<div class="source">
<div class="source-name">Trafikverket</div>
<div class="source-value" id="src-trafikverket"></div>
<div class="source-status"> Active</div>
<div class="source-status"> Active</div>
</div>
<div class="source">
<div class="source-name">SMHI</div>
<div class="source-value" id="src-smhi"></div>
<div class="source-status"> Active</div>
<div class="source-status"> Active</div>
</div>
<div class="source">
<div class="source-name">Satellite</div>
<div class="source-value" id="src-satellite"></div>
<div class="source-status"> Active</div>
<div class="source-status"> Active</div>
</div>
<div class="source">
<div class="source-name">quiXzoom</div>
<div class="source-value" id="src-quixzoom"></div>
<div class="source-status"> Active</div>
<div class="source-status"> Active</div>
</div>
<div class="source">
<div class="source-name">Manual</div>
<div class="source-value" id="src-manual"></div>
<div class="source-status"> Active</div>
<div class="source-status"> Active</div>
</div>
<div class="source">
<div class="source-name">Sensor</div>
<div class="source-value" id="src-sensor"></div>
<div class="source-status"> Active</div>
<div class="source-status"> Active</div>
</div>
</div>
</div>
+4 -4
View File
@@ -11,20 +11,20 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header h1 { font-size: 1.5rem; color: #00d4ff; }
.header p { color: #888; font-size: 0.9rem; }
.main { padding: 40px; max-width: 1200px; margin: 0 auto; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; }
.section h2 { font-size: 1.2rem; margin-bottom: 16px; color: #00d4ff; }
.source { display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid #222; }
.source:last-child { border-bottom: none; }
.source-name { font-weight: 600; }
.source-type { font-size: 0.8rem; padding: 2px 8px; border-radius: 4px; }
.source-type { font-size: 0.8rem; padding: 2px 8px; border-radius: var(--radius-sm); }
.type-real { background: #1a3a1a; color: #4ade80; }
.type-simulated { background: #3a1a1a; color: #f87171; }
.source-count { font-size: 1.2rem; font-weight: 700; }
.metric { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
.metric-card { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; }
.metric-card { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; }
.metric-value { font-size: 2rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.85rem; color: #888; }
.status { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; }
.status { display: inline-block; width: 8px; height: 8px; border-radius: var(--radius-full); margin-right: 8px; }
.status-active { background: #4ade80; }
.status-inactive { background: #f87171; }
</style>
+5 -5
View File
@@ -9,13 +9,13 @@
body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; background: #000; color: #fff; line-height: 1.6; }
.header { background: #0a0a0a; border-bottom: 1px solid #333; padding: 20px 40px; display: flex; justify-content: space-between; align-items: center; }
.header h1 { font-size: 1.5rem; color: #00d4ff; }
.header .live { background: #1a3a1a; color: #4ade80; padding: 4px 12px; border-radius: 4px; font-size: 0.8rem; font-weight: 600; }
.header .live { background: #1a3a1a; color: #4ade80; padding: 4px 12px; border-radius: var(--radius-sm); font-size: 0.8rem; font-weight: 600; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px; }
.metric { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; text-align: center; }
.metric { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; text-align: center; }
.metric-value { font-size: 2.5rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.85rem; color: #888; margin-top: 4px; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; }
.section h2 { font-size: 1.2rem; margin-bottom: 16px; color: #00d4ff; }
table { width: 100%; border-collapse: collapse; }
th { text-align: left; padding: 12px; color: #888; font-size: 0.8rem; text-transform: uppercase; }
@@ -24,7 +24,7 @@ td { padding: 12px; border-top: 1px solid #222; font-size: 0.9rem; }
.severity-medium { color: #fbbf24; }
.severity-high { color: #f87171; }
.severity-critical { color: #ef4444; font-weight: 600; }
.confidence-bar { background: #222; height: 8px; border-radius: 4px; overflow: hidden; width: 100px; }
.confidence-bar { background: #222; height: 8px; border-radius: var(--radius-sm); overflow: hidden; width: 100px; }
.confidence-fill { height: 100%; background: linear-gradient(90deg, #ef4444, #fbbf24, #4ade80); }
</style>
</head>
@@ -34,7 +34,7 @@ td { padding: 12px; border-top: 1px solid #222; font-size: 0.9rem; }
<div>
<h1>RIVP Pilot 1</h1>
</div>
<div class="live"> LIVE DATA</div>
<div class="live"> LIVE DATA</div>
</div>
<div class="main">
+7 -7
View File
@@ -11,19 +11,19 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header h1 { font-size: 1.5rem; color: #00d4ff; }
.header .subtitle { color: #666; font-size: 0.85rem; }
.main { padding: 40px; max-width: 1200px; margin: 0 auto; }
.status { display: inline-block; padding: 4px 12px; border-radius: 4px; font-size: 0.8rem; font-weight: 600; }
.status { display: inline-block; padding: 4px 12px; border-radius: var(--radius-sm); font-size: 0.8rem; font-weight: 600; }
.status-live { background: #1a3a1a; color: #4ade80; }
.results { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 24px; }
.results { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 24px; }
.results h2 { font-size: 1.3rem; margin-bottom: 16px; color: #00d4ff; }
.metric-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
.metric { background: #1a1a1a; border-radius: 8px; padding: 16px; text-align: center; }
.metric { background: #1a1a1a; border-radius: var(--radius-md); padding: 16px; text-align: center; }
.metric-value { font-size: 2rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.8rem; color: #888; margin-top: 4px; }
.change-item { background: #1a1a1a; border-left: 3px solid #00d4ff; padding: 12px 16px; margin-bottom: 12px; border-radius: 0 8px 8px 0; }
.change-type { font-weight: 600; color: #fff; }
.change-details { color: #888; font-size: 0.85rem; margin-top: 4px; }
.change-confidence { color: #4ade80; font-size: 0.8rem; }
.map-placeholder { background: #1a1a1a; border-radius: 8px; height: 300px; display: flex; align-items: center; justify-content: center; color: #666; }
.map-placeholder { background: #1a1a1a; border-radius: var(--radius-md); height: 300px; display: flex; align-items: center; justify-content: center; color: #666; }
</style>
</head>
<body>
@@ -63,13 +63,13 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<h2>E4 (Motorway) — 45 km</h2>
<div class="change-item">
<div class="change-type">🕳️ Pothole Detected</div>
<div class="change-type"> Pothole Detected</div>
<div class="change-details">Location: 59.85°N, 17.65°E | Size: 12 m² | Severity: Medium</div>
<div class="change-confidence">Confidence: 82%</div>
</div>
<div class="change-item">
<div class="change-type">🚧 Construction Zone</div>
<div class="change-type"> Construction Zone</div>
<div class="change-details">Location: 59.88°N, 17.72°E | Size: 2,500 m² | Severity: High</div>
<div class="change-confidence">Confidence: 95%</div>
</div>
@@ -83,7 +83,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
<h2>Länsväg 272 (County Road) — 23 km</h2>
<div class="change-item">
<div class="change-type">🛣️ Surface Damage</div>
<div class="change-type"> Surface Damage</div>
<div class="change-details">Location: 59.92°N, 17.55°E | Size: 45 m² | Severity: Low</div>
<div class="change-confidence">Confidence: 78%</div>
</div>
+4 -4
View File
@@ -12,16 +12,16 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header .subtitle { color: #888; font-size: 0.9rem; }
.main { padding: 40px; max-width: 1400px; margin: 0 auto; }
.metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px; }
.metric { background: #111; border: 1px solid #333; border-radius: 12px; padding: 20px; }
.metric { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 20px; }
.metric-value { font-size: 2.5rem; font-weight: 700; color: #00d4ff; }
.metric-label { font-size: 0.85rem; color: #888; margin-top: 4px; }
.metric-status { font-size: 0.75rem; margin-top: 8px; padding: 4px 8px; border-radius: 4px; display: inline-block; }
.metric-status { font-size: 0.75rem; margin-top: 8px; padding: 4px 8px; border-radius: var(--radius-sm); display: inline-block; }
.status-ok { background: #1a3a1a; color: #4ade80; }
.status-warn { background: #3a3a1a; color: #facc15; }
.status-critical { background: #3a1a1a; color: #f87171; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 24px; margin-bottom: 24px; }
.section h2 { font-size: 1.2rem; margin-bottom: 16px; color: #00d4ff; }
.chart { height: 200px; background: #1a1a1a; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #666; }
.chart { height: 200px; background: #1a1a1a; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; color: #666; }
table { width: 100%; border-collapse: collapse; }
th { text-align: left; padding: 12px; color: #888; font-size: 0.8rem; }
td { padding: 12px; border-top: 1px solid #222; font-size: 0.9rem; }
+3 -3
View File
@@ -10,18 +10,18 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', sans-serif; back
.header { background: #0a0a0a; border-bottom: 1px solid #333; padding: 20px 40px; }
.header h1 { font-size: 1.5rem; background: linear-gradient(90deg, #00d4ff, #7c3aed); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.main { padding: 40px; max-width: 900px; margin: 0 auto; }
.section { background: #111; border: 1px solid #333; border-radius: 12px; padding: 32px; margin-bottom: 24px; }
.section { background: #111; border: 1px solid #333; border-radius: var(--radius-md); padding: 32px; margin-bottom: 24px; }
.section h2 { font-size: 1.3rem; margin-bottom: 16px; color: #00d4ff; }
.section h3 { font-size: 1rem; margin: 16px 0 8px; color: #7c3aed; }
.section p { color: #aaa; margin-bottom: 12px; font-size: 0.95rem; }
.section ul { margin-left: 20px; color: #aaa; }
.section li { margin-bottom: 8px; }
.status { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; }
.status { display: inline-block; padding: 2px 8px; border-radius: var(--radius-sm); font-size: 0.75rem; font-weight: 600; }
.status-concept { background: #333; color: #888; }
.status-code { background: #1a3a1a; color: #4ade80; }
.status-pilot { background: #3a2a1a; color: #fbbf24; }
.status-production { background: #1a1a3a; color: #60a5fa; }
.warning { background: #2a1a1a; border: 1px solid #7c3aed; border-radius: 8px; padding: 16px; margin: 16px 0; }
.warning { background: #2a1a1a; border: 1px solid #7c3aed; border-radius: var(--radius-md); padding: 16px; margin: 16px 0; }
.warning strong { color: #f87171; }
</style>
</head>