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
+4 -4
View File
@@ -69,10 +69,10 @@
.step:last-child { border-bottom: none; }
.step:hover { opacity: 0.85; }
.step-num-wrap { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; }
.step-num { width: 32px; height: 32px; border-radius: 50%; background: rgba(0,102,255,0.12); color: var(--accent); font-size: 13px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.step-num { width: 32px; height: 32px; border-radius: var(--radius-full); background: rgba(0,102,255,0.12); color: var(--accent); font-size: 13px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.step-line { width: 1.5px; flex: 1; min-height: 12px; background: rgba(0,102,255,0.18); margin-top: 4px; }
.step:last-child .step-line { display: none; }
.step-icon { width: 36px; height: 36px; border-radius: 9px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.step-icon { width: 36px; height: 36px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.step-body { flex: 1; }
.step-label { font-size: 15px; font-weight: 600; color: var(--label); }
.step-sub { font-size: 13px; color: var(--label3); margin-top: 3px; line-height: 1.55; }
@@ -99,13 +99,13 @@
/* CTA */
.cta-row { display: flex; justify-content: center; margin: 16px 0 4px; }
.cta-btn { display: inline-block; background: var(--accent); color: #1d1d1f; font-size: 15px; font-weight: 600; padding: 13px 24px; border-radius: 12px; text-decoration: none; transition: opacity 0.15s; }
.cta-btn { display: inline-block; background: var(--accent); color: #1d1d1f; font-size: 15px; font-weight: 600; padding: 13px 24px; border-radius: var(--radius-md); text-decoration: none; transition: opacity 0.15s; }
.cta-btn:hover { opacity: 0.88; }
/* Related docs */
.row { display: flex; align-items: flex-start; gap: 12px; padding: 12px 0; border-bottom: 0.5px solid var(--separator); }
.row:last-child { border-bottom: none; }
.row-icon { width: 36px; height: 36px; border-radius: 8px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.row-icon { width: 36px; height: 36px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.row-content { flex: 1; }
.row-label { font-size: 15px; font-weight: 600; color: var(--label); }
.row-sub { font-size: 13px; color: var(--label3); margin-top: 2px; line-height: 1.5; }