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
@@ -0,0 +1,2 @@
/// <reference types="react" />
export declare const PromoteIcon: () => JSX.Element;
+11
View File
@@ -0,0 +1,11 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PromoteIcon = void 0;
const react_1 = __importDefault(require("react"));
const PromoteIcon = () => (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20" },
react_1.default.createElement("path", { d: "M15 17v-2.99A4 4 0 0 0 11 10H8v5L2 9l6-6v5h3a6 6 0 0 1 6 6v3h-2z" })));
exports.PromoteIcon = PromoteIcon;
//# sourceMappingURL=Promote.js.map
@@ -0,0 +1 @@
{"version":3,"file":"Promote.js","sourceRoot":"","sources":["../../../../src/ui/components/Icons/Promote.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AAElB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CAC/B,uCAAK,KAAK,EAAC,4BAA4B,EAAC,OAAO,EAAC,WAAW;IACzD,wCAAM,CAAC,EAAC,kEAAkE,GAAG,CACzE,CACP,CAAA;AAJY,QAAA,WAAW,eAIvB"}
+2
View File
@@ -0,0 +1,2 @@
/// <reference types="react" />
export declare const RetryIcon: () => JSX.Element;
+11
View File
@@ -0,0 +1,11 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RetryIcon = void 0;
const react_1 = __importDefault(require("react"));
const RetryIcon = () => (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20" },
react_1.default.createElement("path", { d: "M5 4a2 2 0 0 0-2 2v6H0l4 4 4-4H5V6h7l2-2H5zm10 4h-3l4-4 4 4h-3v6a2 2 0 0 1-2 2H6l2-2h7V8z" })));
exports.RetryIcon = RetryIcon;
//# sourceMappingURL=Retry.js.map
@@ -0,0 +1 @@
{"version":3,"file":"Retry.js","sourceRoot":"","sources":["../../../../src/ui/components/Icons/Retry.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AAElB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAC7B,uCAAK,KAAK,EAAC,4BAA4B,EAAC,OAAO,EAAC,WAAW;IACzD,wCAAM,CAAC,EAAC,2FAA2F,GAAG,CAClG,CACP,CAAA;AAJY,QAAA,SAAS,aAIrB"}
+2
View File
@@ -0,0 +1,2 @@
/// <reference types="react" />
export declare const TrashIcon: () => JSX.Element;
+11
View File
@@ -0,0 +1,11 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TrashIcon = void 0;
const react_1 = __importDefault(require("react"));
const TrashIcon = () => (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20" },
react_1.default.createElement("path", { d: "M6 2l2-2h4l2 2h4v2H2V2h4zM3 6h14l-1 14H4L3 6zm5 2v10h1V8H8zm3 0v10h1V8h-1z" })));
exports.TrashIcon = TrashIcon;
//# sourceMappingURL=Trash.js.map
@@ -0,0 +1 @@
{"version":3,"file":"Trash.js","sourceRoot":"","sources":["../../../../src/ui/components/Icons/Trash.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AAElB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAC7B,uCAAK,KAAK,EAAC,4BAA4B,EAAC,OAAO,EAAC,WAAW;IACzD,wCAAM,CAAC,EAAC,4EAA4E,GAAG,CACnF,CACP,CAAA;AAJY,QAAA,SAAS,aAIrB"}