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
+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>