@41devs/naya-id-angular 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -193
- package/fesm2022/41devs-naya-id-angular.mjs +197 -1
- package/fesm2022/41devs-naya-id-angular.mjs.map +1 -1
- package/index.d.ts +88 -198
- package/package.json +5 -5
- package/fesm2022/41devs-naya-id-angular-41devs-naya-id-angular-B7t92Ogc.mjs +0 -292
- package/fesm2022/41devs-naya-id-angular-41devs-naya-id-angular-B7t92Ogc.mjs.map +0 -1
- package/fesm2022/41devs-naya-id-angular-naya-flow.launcher-xIwcsV6g.mjs +0 -2066
- package/fesm2022/41devs-naya-id-angular-naya-flow.launcher-xIwcsV6g.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"41devs-naya-id-angular-naya-flow.launcher-xIwcsV6g.mjs","sources":["../../../projects/naya-id/src/lib/i18n/naya-strings.ts","../../../projects/naya-id/src/lib/flow/naya-flow.service.ts","../../../projects/naya-id/src/lib/theme/naya-theme.ts","../../../projects/naya-id/src/lib/components/naya-icon.component.ts","../../../projects/naya-id/src/lib/components/naya-screen.component.ts","../../../projects/naya-id/src/lib/components/naya-ui.ts","../../../projects/naya-id/src/lib/screens/welcome.screen.ts","../../../projects/naya-id/src/lib/screens/document-selection.screen.ts","../../../projects/naya-id/src/lib/utils/image-utils.ts","../../../projects/naya-id/src/lib/screens/document-capture.screen.ts","../../../projects/naya-id/src/lib/liveness/liveness-challenge.ts","../../../projects/naya-id/src/lib/liveness/face-tracker.ts","../../../projects/naya-id/src/lib/screens/liveness.screen.ts","../../../projects/naya-id/src/lib/screens/processing.screen.ts","../../../projects/naya-id/src/lib/screens/result.screen.ts","../../../projects/naya-id/src/lib/flow/naya-flow-host.component.ts","../../../projects/naya-id/src/lib/flow/naya-flow.launcher.ts"],"sourcesContent":["import type { NayaDocumentType, NayaLocale } from '../models/naya-config';\n\n/**\n * Chaînes de l'interface, français et anglais. Reprise fidèle du fichier\n * Flutter `naya_strings.dart` — mêmes intitulés, mêmes étapes.\n */\nexport class NayaStrings {\n constructor(private readonly locale: NayaLocale) {}\n\n private t(fr: string, en: string): string {\n return this.locale === 'fr' ? fr : en;\n }\n\n // Commun\n get poweredBy() { return this.t('Propulsé par Naya ID (41Devs)', 'Powered by Naya ID (41Devs)'); }\n get continueLabel() { return this.t('Continuer', 'Continue'); }\n get backToApp() { return this.t(\"Retourner à l'application\", 'Back to the app'); }\n\n // 1 · Bienvenue\n get welcomeTitle() { return this.t('Vérifiez votre identité', 'Verify your identity'); }\n get welcomeSubtitle() {\n return this.t(\n \"Prêt en moins de 60 secondes.\\nMunissez-vous de votre pièce d'identité.\",\n 'Ready in under 60 seconds.\\nHave your ID document at hand.',\n );\n }\n get welcomeCta() { return this.t('Commencer', 'Get started'); }\n get welcomeSecurity() {\n return this.t(\n 'Vos données sont chiffrées et transmises de façon sécurisée',\n 'Your data is encrypted and transmitted securely',\n );\n }\n get stepDocument() { return this.t('Document', 'Document'); }\n get stepSelfie() { return this.t('Selfie', 'Selfie'); }\n get stepResult() { return this.t('Résultat', 'Result'); }\n\n // 2 · Choix du document\n get docSelectTitle() { return this.t('Quel document\\navez-vous ?', 'Which document\\ndo you have?'); }\n get docSelectSubtitle() {\n return this.t(\n \"Choisissez votre pays et votre pièce d'identité.\",\n 'Choose your country and your ID document.',\n );\n }\n docLabel(doc: NayaDocumentType): string {\n switch (doc) {\n case 'cni': return this.t(\"Carte Nationale d'Identité\", 'National Identity Card');\n case 'passeport': return this.t('Passeport', 'Passport');\n case 'permis': return this.t('Permis de conduire', 'Driving licence');\n }\n }\n\n // 3-4 · Capture\n get captureRectoInstruction() {\n return this.t(\n 'Cadrez le recto de votre document dans le rectangle',\n 'Frame the front of your document inside the rectangle',\n );\n }\n get captureVersoInstruction() {\n return this.t(\n 'Retournez la carte — la bande MRZ doit être lisible',\n 'Flip the card — the MRZ strip must be readable',\n );\n }\n get captureHint() {\n return this.t(\n 'Appuyez sur le déclencheur quand le cadre est vert',\n 'Tap the shutter when the frame turns green',\n );\n }\n get captureReady() {\n return this.t('Image nette — appuyez pour capturer', 'Sharp image — tap to capture');\n }\n get qualityLight() { return this.t('Luminosité', 'Lighting'); }\n get qualitySharpness() { return this.t('Netteté', 'Sharpness'); }\n\n // 5 · Liveness\n get livenessTitle() { return this.t('Un selfie rapide', 'A quick selfie'); }\n get livenessSubtitle() { return this.t(\"Placez votre visage dans l'ovale.\", 'Place your face in the oval.'); }\n get livenessLookStraight() { return this.t('Regardez droit vers la caméra', 'Look straight at the camera'); }\n get livenessBlink() { return this.t('Clignez des yeux', 'Blink your eyes'); }\n get livenessTurnHead() { return this.t('Tournez lentement la tête', 'Slowly turn your head'); }\n get livenessHold() { return this.t('Ne bougez plus…', 'Hold still…'); }\n get livenessStepFace() { return this.t('Visage', 'Face'); }\n get livenessStepBlink() { return this.t('Clignement', 'Blink'); }\n get livenessStepTurn() { return this.t('Rotation', 'Turn'); }\n get livenessPrivacy() {\n return this.t(\n \"L'analyse s'effectue sur votre appareil —\\nla photo n'est envoyée qu'à la fin du défi\",\n 'Analysis runs on your device —\\nthe photo is only sent once the challenge is done',\n );\n }\n\n // 6 · Traitement\n get processingDocument() { return this.t('Document analysé', 'Document analyzed'); }\n get processingFace() { return this.t('Visage comparé', 'Face compared'); }\n get processingCompliance() { return this.t('Contrôles de conformité', 'Compliance checks'); }\n get processingDecision() { return this.t('Décision', 'Decision'); }\n get processingWait() { return this.t('Ne fermez pas la fenêtre', \"Don't close the window\"); }\n\n // 7 · Résultats\n get resultApprovedTitle() { return this.t('Identité vérifiée !', 'Identity verified!'); }\n get resultApprovedSubtitle() {\n return this.t(\n 'Votre vérification a été transmise avec succès.',\n 'Your verification was submitted successfully.',\n );\n }\n get resultReference() { return this.t('Référence', 'Reference'); }\n get resultName() { return this.t('Nom complet', 'Full name'); }\n get resultReviewTitle() { return this.t(\"Vérification en cours d'examen\", 'Verification under review'); }\n get resultReviewSubtitle() {\n return this.t('Un analyste examine votre dossier.', 'An analyst is reviewing your file.');\n }\n get resultReviewB1() { return this.t('Réponse généralement sous 24 h', 'Usually answered within 24 h'); }\n get resultReviewB2() { return this.t(\"Vous serez notifié par l'application\", 'The app will notify you'); }\n get resultReviewB3() { return this.t('Aucune action requise de votre part', 'No action needed from you'); }\n get resultRejectedTitle() { return this.t('Vérification non aboutie', 'Verification unsuccessful'); }\n get resultRejectedReason() { return this.t('Motif', 'Reason'); }\n get retry() { return this.t('Réessayer', 'Try again'); }\n\n // Erreurs\n get errorTitle() { return this.t('Une erreur est survenue', 'Something went wrong'); }\n get errorNetwork() {\n return this.t(\n 'Vérifiez votre connexion internet puis réessayez.',\n 'Check your internet connection and try again.',\n );\n }\n get errorCamera() {\n return this.t(\n \"Impossible d'accéder à la caméra. Vérifiez les autorisations du navigateur.\",\n 'Cannot access the camera. Check the browser permissions.',\n );\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport {\n NayaApiClient,\n type NayaSession,\n type NayaSubmitResponse,\n} from '../api/naya-api.client';\nimport {\n type NayaAuth,\n type NayaCountryCode,\n type NayaDocumentType,\n type ResolvedNayaConfig,\n documentNeedsVerso,\n} from '../models/naya-config';\nimport type { NayaResult } from '../models/naya-result';\nimport { NayaStrings } from '../i18n/naya-strings';\n\n/** Étapes du parcours. L'ordre reflète la progression nominale. */\nexport type NayaStep =\n | 'welcome'\n | 'select'\n | 'capture-recto'\n | 'capture-verso'\n | 'liveness'\n | 'processing'\n | 'result';\n\n/**\n * État partagé du parcours et logique de session — équivalent du\n * `NayaFlowController` Flutter, l'état exposé en **signals** plutôt qu'en champs\n * mutables. Un service, instancié par parcours (fourni par l'hôte), non\n * singleton racine.\n *\n * Aucune dépendance à la vue : ce service est entièrement testable seul, ce qui\n * est l'intérêt de le porter en premier.\n */\n@Injectable()\nexport class NayaFlowService {\n private api!: NayaApiClient;\n private config!: ResolvedNayaConfig;\n private finish!: (result: NayaResult) => void;\n\n /** Chaînes localisées, dérivées de la config. */\n strings!: NayaStrings;\n\n // ── État réactif ───────────────────────────────────────────────────────────\n readonly step = signal<NayaStep>('welcome');\n readonly session = signal<NayaSession | null>(null);\n readonly country = signal<NayaCountryCode | null>(null);\n readonly document = signal<NayaDocumentType | null>(null);\n readonly rectoBase64 = signal<string | null>(null);\n readonly versoBase64 = signal<string | null>(null);\n readonly livenessScore = signal<number>(0);\n readonly selfieBase64 = signal<string | null>(null);\n readonly attemptsUsed = signal<number>(0);\n /** Réponse du submit, transmise à l'écran de résultat. */\n readonly submitResponse = signal<NayaSubmitResponse | null>(null);\n\n /** Pile de navigation, pour le bouton retour. */\n private stepHistory: NayaStep[] = [];\n private documentUpload: Promise<void> | null = null;\n private finished = false;\n\n /** Initialise le service pour un parcours donné. Appelé par l'hôte. */\n init(params: {\n auth: NayaAuth;\n config: ResolvedNayaConfig;\n finish: (result: NayaResult) => void;\n }): void {\n this.config = params.config;\n this.finish = params.finish;\n this.api = new NayaApiClient(params.auth, params.config.baseUrl);\n this.strings = new NayaStrings(params.config.locale);\n this.country.set(params.config.country ?? null);\n }\n\n get resolvedConfig(): ResolvedNayaConfig {\n return this.config;\n }\n\n // ── Navigation ───────────────────────────────────────────────────────────\n /** Empile l'étape courante et avance vers `next`. */\n go(next: NayaStep): void {\n this.stepHistory.push(this.step());\n this.step.set(next);\n }\n\n /** Remplace l'étape courante sans l'empiler (transitions sans retour). */\n replace(next: NayaStep): void {\n this.step.set(next);\n }\n\n get canGoBack(): boolean {\n return this.stepHistory.length > 0;\n }\n\n /** Revient à l'étape précédente si elle existe. */\n back(): void {\n const prev = this.stepHistory.pop();\n if (prev) this.step.set(prev);\n }\n\n get client(): NayaApiClient {\n return this.api;\n }\n\n /** La CNI CEDEAO porte sa MRZ au verso ; les autres pièces n'en ont pas besoin. */\n get needsVerso(): boolean {\n return this.document() === 'cni';\n }\n\n get canRetry(): boolean {\n return this.attemptsUsed() < this.config.maxAttempts;\n }\n\n /** Crée la session serveur si nécessaire (documentType + pays requis). */\n async ensureSession(): Promise<NayaSession> {\n const existing = this.session();\n if (existing) return existing;\n\n const created = await this.api.start({\n documentType: this.document()!,\n country: this.country()!,\n callbackUrl: this.config.callbackUrl,\n });\n this.session.set(created);\n return created;\n }\n\n /**\n * Lance (une seule fois) l'envoi du document en arrière-plan : l'OCR serveur\n * tourne pendant que l'utilisateur fait son selfie.\n */\n startDocumentUpload(): void {\n if (this.documentUpload) return;\n const upload = this.uploadDocument();\n this.documentUpload = upload;\n // Tant que personne n'attend cet envoi (il tourne pendant le selfie), un\n // échec produirait un unhandled rejection. On le neutralise ici sans\n // consommer la promesse stockée : `ensureDocumentUploaded` en relance une\n // fraîche puisque `uploadDocument` a remis `documentUpload` à null.\n upload.catch(() => {});\n }\n\n /**\n * Attend la fin de l'envoi du document, en le (re)lançant si besoin. Après\n * un échec, un nouvel appel retente l'envoi.\n */\n ensureDocumentUploaded(): Promise<void> {\n return (this.documentUpload ??= this.uploadDocument());\n }\n\n private async uploadDocument(): Promise<void> {\n try {\n const s = await this.ensureSession();\n await this.api.uploadDocument(s.verificationId, {\n rectoBase64: this.rectoBase64()!,\n versoBase64: this.versoBase64() ?? undefined,\n });\n } catch (err) {\n this.documentUpload = null; // permet le retry\n throw err;\n }\n }\n\n /**\n * Prépare une nouvelle tentative après un rejet : nouvelle session, captures\n * remises à zéro.\n */\n resetForRetry(): void {\n this.attemptsUsed.update((n) => n + 1);\n this.session.set(null);\n this.rectoBase64.set(null);\n this.versoBase64.set(null);\n this.livenessScore.set(0);\n this.selfieBase64.set(null);\n this.submitResponse.set(null);\n this.documentUpload = null;\n this.stepHistory = [];\n }\n\n /** Un document a-t-il besoin de son verso avant de passer au selfie ? */\n documentTypeNeedsVerso(doc: NayaDocumentType): boolean {\n return documentNeedsVerso(doc);\n }\n\n complete(result: NayaResult): void {\n if (this.finished) return;\n this.finished = true;\n this.finish({ ...result, verificationId: result.verificationId ?? this.session()?.verificationId });\n }\n\n cancel(): void {\n this.complete({ status: 'cancelled' });\n }\n}\n","import type { ResolvedNayaConfig } from '../models/naya-config';\n\n/**\n * Jetons de design Naya — charte produit (navy, ambre, rayons 12/8/24),\n * exposés en variables CSS. Reprend `naya_theme.dart`.\n *\n * `primary` et `accent` sont surchargeables par le client ; le reste est fixe.\n * Toutes les variables sont posées sur l'élément hôte de l'overlay, si bien que\n * le thème du SDK reste isolé de celui de l'application.\n */\n\nexport const NAYA_TOKENS = {\n success: '#27AE60',\n error: '#E74C3C',\n warning: '#F39C12',\n background: '#F7F8FA',\n surface: '#FFFFFF',\n textPrimary: '#1A1A2E',\n textSecondary: '#6B7280',\n line: '#E5E7EB',\n dark: '#0E1C2C',\n radiusCard: '12px',\n radiusInput: '8px',\n radiusButton: '24px',\n} as const;\n\n/** Construit le dictionnaire de variables CSS à appliquer sur l'hôte. */\nexport function buildThemeVars(config: ResolvedNayaConfig): Record<string, string> {\n return {\n '--naya-primary': config.theme.primaryColor,\n '--naya-accent': config.theme.accentColor,\n '--naya-success': NAYA_TOKENS.success,\n '--naya-error': NAYA_TOKENS.error,\n '--naya-warning': NAYA_TOKENS.warning,\n '--naya-bg': NAYA_TOKENS.background,\n '--naya-surface': NAYA_TOKENS.surface,\n '--naya-text': NAYA_TOKENS.textPrimary,\n '--naya-text-2': NAYA_TOKENS.textSecondary,\n '--naya-line': NAYA_TOKENS.line,\n '--naya-dark': NAYA_TOKENS.dark,\n '--naya-r-card': NAYA_TOKENS.radiusCard,\n '--naya-r-input': NAYA_TOKENS.radiusInput,\n '--naya-r-button': NAYA_TOKENS.radiusButton,\n };\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Jeu d'icônes SVG inline (style outline). Aucun emoji, aucune dépendance\n * externe. Les tracés sont de vrais éléments `<path>` du template — pas de\n * `innerHTML`, donc aucun passage par le sanitizer ni risque de dépouillement\n * des balises SVG.\n */\nexport type NayaIconName =\n | 'shield'\n | 'lock'\n | 'fingerprint'\n | 'close'\n | 'back'\n | 'chevron'\n | 'check'\n | 'clock'\n | 'wifi-off'\n | 'refresh'\n | 'id-card'\n | 'passport'\n | 'car'\n | 'sun'\n | 'focus'\n | 'eye'\n | 'rotate'\n | 'hourglass';\n\n@Component({\n selector: 'naya-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [attr.stroke-width]=\"stroke()\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n @switch (name()) {\n @case ('shield') {\n <path d=\"M12 3l7 3v5c0 4.5-3 8.3-7 10-4-1.7-7-5.5-7-10V6l7-3z\" />\n <path d=\"M9 12l2 2 4-4\" />\n }\n @case ('lock') {\n <rect x=\"5\" y=\"11\" width=\"14\" height=\"9\" rx=\"2\" />\n <path d=\"M8 11V8a4 4 0 0 1 8 0v3\" />\n }\n @case ('fingerprint') {\n <path d=\"M12 11a2 2 0 0 1 2 2v1a5 5 0 0 1-.5 2.2\" />\n <path d=\"M8 13a4 4 0 0 1 8 0v1a8 8 0 0 1-.8 3.5\" />\n <path d=\"M5.5 15A7 7 0 0 1 5 12a7 7 0 0 1 12-5\" />\n <path d=\"M12 20v-7\" />\n }\n @case ('close') {\n <path d=\"M6 6l12 12M18 6L6 18\" />\n }\n @case ('back') {\n <path d=\"M15 5l-7 7 7 7\" />\n }\n @case ('chevron') {\n <path d=\"M9 6l6 6-6 6\" />\n }\n @case ('check') {\n <path d=\"M5 12l5 5L20 7\" />\n }\n @case ('clock') {\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <path d=\"M12 8v4l3 2\" />\n }\n @case ('wifi-off') {\n <path d=\"M3 3l18 18\" />\n <path d=\"M5 12a11 11 0 0 1 4-2.5\" />\n <path d=\"M8.5 16.5A5 5 0 0 1 12 15a5 5 0 0 1 2 .4\" />\n <path d=\"M12 20h.01\" />\n }\n @case ('refresh') {\n <path d=\"M4 12a8 8 0 0 1 13.7-5.7L20 8\" />\n <path d=\"M20 4v4h-4\" />\n <path d=\"M20 12a8 8 0 0 1-13.7 5.7L4 16\" />\n <path d=\"M4 20v-4h4\" />\n }\n @case ('id-card') {\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"11\" r=\"2\" />\n <path d=\"M13 10h5M13 14h5M5.5 15a3 3 0 0 1 6 0\" />\n }\n @case ('passport') {\n <rect x=\"5\" y=\"3\" width=\"14\" height=\"18\" rx=\"2\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n <path d=\"M9 16h6\" />\n }\n @case ('car') {\n <path d=\"M5 16l1.5-5A2 2 0 0 1 8.4 10h7.2a2 2 0 0 1 1.9 1l1.5 5\" />\n <rect x=\"3\" y=\"16\" width=\"18\" height=\"4\" rx=\"1\" />\n <circle cx=\"7.5\" cy=\"20\" r=\"1\" />\n <circle cx=\"16.5\" cy=\"20\" r=\"1\" />\n }\n @case ('sun') {\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M5 5l1.5 1.5M17.5 17.5L19 19M19 5l-1.5 1.5M6.5 17.5L5 19\" />\n }\n @case ('focus') {\n <path d=\"M4 8V6a2 2 0 0 1 2-2h2M16 4h2a2 2 0 0 1 2 2v2M20 16v2a2 2 0 0 1-2 2h-2M8 20H6a2 2 0 0 1-2-2v-2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" />\n }\n @case ('eye') {\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n }\n @case ('rotate') {\n <path d=\"M12 4a8 8 0 1 1-7.5 5.3\" />\n <path d=\"M4 4v5h5\" />\n }\n @case ('hourglass') {\n <path d=\"M7 3h10M7 21h10M8 3c0 4 8 5 8 9s-8 5-8 9M16 3c0 4-8 5-8 9s8 5 8 9\" />\n }\n }\n </svg>\n `,\n styles: [':host{display:inline-flex;line-height:0}'],\n})\nexport class NayaIconComponent {\n readonly name = input.required<NayaIconName>();\n readonly size = input(20);\n readonly stroke = input(2);\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NayaIconComponent } from './naya-icon.component';\n\n/**\n * Gabarit d'écran du SDK : en-tête (retour / fermer), contenu projeté, pied\n * « Propulsé par Naya ID ». Reprend `NayaScreen` (widgets/common.dart).\n *\n * `dark` bascule le fond sombre des écrans caméra (phases 3-4).\n */\n@Component({\n selector: 'naya-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NayaIconComponent],\n template: `\n <div class=\"shell\" [class.dark]=\"dark()\">\n <header class=\"bar\">\n @if (canBack()) {\n <button type=\"button\" class=\"round\" (click)=\"back.emit()\" aria-label=\"Retour\">\n <naya-icon name=\"back\" [size]=\"20\" />\n </button>\n } @else {\n <span class=\"spacer\"></span>\n }\n @if (canClose()) {\n <button type=\"button\" class=\"round\" (click)=\"close.emit()\" aria-label=\"Fermer\">\n <naya-icon name=\"close\" [size]=\"20\" />\n </button>\n } @else {\n <span class=\"spacer\"></span>\n }\n </header>\n\n <main class=\"content\">\n <ng-content />\n </main>\n\n <footer class=\"powered\">{{ poweredBy() }}</footer>\n </div>\n `,\n styles: [`\n .shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--naya-bg);\n color: var(--naya-text);\n }\n .shell.dark { background: var(--naya-dark); color: #fff; }\n .bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px 0;\n flex: 0 0 auto;\n }\n .spacer { width: 40px; height: 40px; }\n .round {\n width: 40px; height: 40px;\n display: inline-flex; align-items: center; justify-content: center;\n border: none; border-radius: 50%; cursor: pointer;\n color: var(--naya-primary);\n background: color-mix(in srgb, var(--naya-primary) 8%, transparent);\n transition: background .15s ease;\n }\n .dark .round { color: #fff; background: rgba(255,255,255,.16); }\n .round:hover { background: color-mix(in srgb, var(--naya-primary) 16%, transparent); }\n .round:focus-visible { outline: 2px solid var(--naya-accent); outline-offset: 2px; }\n .content { flex: 1 1 auto; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; }\n .powered {\n flex: 0 0 auto;\n text-align: center;\n padding: 6px 0 12px;\n font-size: 11px; font-weight: 600;\n color: #B3BAC4;\n }\n .dark .powered { color: rgba(255,255,255,.38); }\n `],\n})\nexport class NayaScreenComponent {\n readonly poweredBy = input.required<string>();\n readonly canBack = input(false);\n readonly canClose = input(true);\n readonly dark = input(false);\n\n readonly back = output<void>();\n readonly close = output<void>();\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NayaIconComponent } from './naya-icon.component';\n\n/** Marque Naya (pictogramme + nom). Écrans bienvenue et traitement. */\n@Component({\n selector: 'naya-brand',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NayaIconComponent],\n template: `\n <span class=\"brand\">\n <span class=\"mark\"><naya-icon name=\"fingerprint\" [size]=\"17\" /></span>\n <span class=\"name\">Naya ID</span>\n </span>\n `,\n styles: [`\n .brand { display: inline-flex; align-items: center; gap: 7px; }\n .mark {\n width: 26px; height: 26px; border-radius: 8px;\n display: inline-flex; align-items: center; justify-content: center;\n background: var(--naya-primary); color: var(--naya-accent);\n }\n .name {\n font-size: 17px; font-weight: 800; letter-spacing: -0.2px;\n color: var(--naya-primary);\n }\n `],\n})\nexport class NayaBrandComponent {}\n\n/** CTA principal (plein, ambre) avec état de chargement. */\n@Component({\n selector: 'naya-primary-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NayaIconComponent],\n template: `\n <button\n type=\"button\"\n class=\"btn\"\n [disabled]=\"loading() || disabled()\"\n (click)=\"pressed.emit()\"\n >\n @if (loading()) {\n <span class=\"spinner\" aria-hidden=\"true\"></span>\n } @else {\n @if (icon()) { <naya-icon [name]=\"icon()!\" [size]=\"18\" /> }\n <span>{{ label() }}</span>\n }\n </button>\n `,\n styles: [`\n .btn {\n width: 100%; min-height: 52px;\n display: inline-flex; align-items: center; justify-content: center; gap: 8px;\n border: none; border-radius: var(--naya-r-button); cursor: pointer;\n background: var(--naya-accent); color: var(--naya-primary);\n font-size: 15px; font-weight: 800;\n transition: filter .15s ease;\n }\n .btn:hover:not(:disabled) { filter: brightness(.96); }\n .btn:disabled { opacity: .5; cursor: not-allowed; }\n .btn:focus-visible { outline: 2px solid var(--naya-primary); outline-offset: 2px; }\n .spinner {\n width: 22px; height: 22px; border-radius: 50%;\n border: 2.5px solid color-mix(in srgb, var(--naya-primary) 30%, transparent);\n border-top-color: var(--naya-primary);\n animation: naya-spin .8s linear infinite;\n }\n @keyframes naya-spin { to { transform: rotate(360deg); } }\n @media (prefers-reduced-motion: reduce) { .spinner { animation-duration: 1.6s; } }\n `],\n})\nexport class NayaPrimaryButtonComponent {\n readonly label = input.required<string>();\n readonly loading = input(false);\n readonly disabled = input(false);\n readonly icon = input<'refresh' | 'check' | null>(null);\n readonly pressed = output<void>();\n}\n\n/** Bouton secondaire (contour). */\n@Component({\n selector: 'naya-secondary-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button type=\"button\" class=\"btn\" (click)=\"pressed.emit()\">{{ label() }}</button>\n `,\n styles: [`\n .btn {\n width: 100%; min-height: 52px;\n border: 1.5px solid var(--naya-primary); border-radius: var(--naya-r-button);\n background: transparent; color: var(--naya-primary); cursor: pointer;\n font-size: 15px; font-weight: 800;\n }\n .btn:hover { background: color-mix(in srgb, var(--naya-primary) 6%, transparent); }\n .btn:focus-visible { outline: 2px solid var(--naya-accent); outline-offset: 2px; }\n `],\n})\nexport class NayaSecondaryButtonComponent {\n readonly label = input.required<string>();\n readonly pressed = output<void>();\n}\n\n/** Indicateur des trois grandes étapes (Document · Selfie · Résultat). */\n@Component({\n selector: 'naya-steps-dots',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"dots\">\n @for (label of labels(); track label; let i = $index) {\n <div class=\"step\">\n <span class=\"dot\" [class.on]=\"i <= activeIndex()\"></span>\n <span class=\"label\">{{ label }}</span>\n </div>\n }\n </div>\n `,\n styles: [`\n .dots { display: flex; justify-content: center; gap: 22px; }\n .step { display: flex; flex-direction: column; align-items: center; gap: 5px; }\n .dot {\n width: 9px; height: 9px; border-radius: 50%; background: #D6DCE4;\n }\n .dot.on { background: var(--naya-accent); }\n .label { font-size: 11px; color: var(--naya-text-2); }\n `],\n})\nexport class NayaStepsDotsComponent {\n readonly labels = input.required<string[]>();\n readonly activeIndex = input(0);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { NayaFlowService } from '../flow/naya-flow.service';\nimport { NayaScreenComponent } from '../components/naya-screen.component';\nimport { NayaIconComponent } from '../components/naya-icon.component';\nimport {\n NayaBrandComponent,\n NayaPrimaryButtonComponent,\n NayaStepsDotsComponent,\n} from '../components/naya-ui';\n\n/** Écran 1 — Bienvenue. */\n@Component({\n selector: 'naya-welcome-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NayaScreenComponent,\n NayaIconComponent,\n NayaBrandComponent,\n NayaPrimaryButtonComponent,\n NayaStepsDotsComponent,\n ],\n template: `\n <naya-screen [poweredBy]=\"s.poweredBy\" (close)=\"flow.cancel()\">\n <div class=\"pad\">\n <div class=\"brandRow\">\n <naya-brand />\n @if (config.clientLogoUrl) {\n <span class=\"sep\"></span>\n <img class=\"clientLogo\" [src]=\"config.clientLogoUrl\" alt=\"\" />\n }\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"hero\"><naya-icon name=\"shield\" [size]=\"56\" [stroke]=\"1.6\" /></div>\n <h1 class=\"title\">{{ s.welcomeTitle }}</h1>\n <p class=\"body\">{{ s.welcomeSubtitle }}</p>\n\n <div class=\"steps\">\n <naya-steps-dots [labels]=\"stepLabels()\" [activeIndex]=\"0\" />\n </div>\n\n <div class=\"spacer\"></div>\n\n <naya-primary-button [label]=\"s.welcomeCta\" (pressed)=\"start()\" />\n <div class=\"secure\">\n <naya-icon name=\"lock\" [size]=\"13\" [stroke]=\"2\" />\n <span>{{ s.welcomeSecurity }}</span>\n </div>\n </div>\n </naya-screen>\n `,\n styles: [`\n .pad { display: flex; flex-direction: column; flex: 1; padding: 4px 24px 8px; }\n .brandRow { display: flex; align-items: center; justify-content: center; gap: 14px; }\n .sep { width: 1px; height: 22px; background: var(--naya-line); }\n .clientLogo { height: 24px; width: auto; object-fit: contain; }\n .spacer { flex: 1 1 auto; }\n .hero {\n align-self: center;\n width: 116px; height: 116px; border-radius: 32px;\n display: flex; align-items: center; justify-content: center;\n background: var(--naya-primary); color: var(--naya-accent);\n }\n .title {\n margin: 28px 0 10px; text-align: center; text-wrap: balance;\n font-size: 23px; font-weight: 800; line-height: 1.25;\n letter-spacing: -0.2px; color: var(--naya-primary);\n }\n .body {\n margin: 0; text-align: center; white-space: pre-line;\n font-size: 15px; line-height: 1.5; color: var(--naya-text-2);\n }\n .steps { margin-top: 26px; }\n .secure {\n display: flex; align-items: center; justify-content: center; gap: 5px;\n margin-top: 12px; text-align: center;\n font-size: 11px; color: var(--naya-text-2);\n }\n `],\n})\nexport class WelcomeScreen {\n readonly flow = inject(NayaFlowService);\n readonly s = this.flow.strings;\n readonly config = this.flow.resolvedConfig;\n\n readonly stepLabels = computed(() => [\n this.s.stepDocument,\n this.s.stepSelfie,\n this.s.stepResult,\n ]);\n\n start(): void {\n const cfg = this.config;\n const single = !!cfg.country && cfg.documentTypes.length === 1;\n if (single) {\n this.flow.country.set(cfg.country!);\n this.flow.document.set(cfg.documentTypes[0]);\n this.flow.go('capture-recto');\n } else {\n this.flow.go('select');\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { NayaFlowService } from '../flow/naya-flow.service';\nimport {\n type NayaCountryCode,\n type NayaDocumentType,\n countryLabel,\n} from '../models/naya-config';\nimport { NayaScreenComponent } from '../components/naya-screen.component';\nimport { NayaIconComponent, type NayaIconName } from '../components/naya-icon.component';\nimport { NayaPrimaryButtonComponent } from '../components/naya-ui';\n\n/** Écran 2 — Choix du pays et du type de document. */\n@Component({\n selector: 'naya-document-selection-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NayaScreenComponent, NayaIconComponent, NayaPrimaryButtonComponent],\n template: `\n <naya-screen\n [poweredBy]=\"s.poweredBy\"\n [canBack]=\"flow.canGoBack\"\n (back)=\"flow.back()\"\n (close)=\"flow.cancel()\"\n >\n <div class=\"pad\">\n <h1 class=\"title\">{{ s.docSelectTitle }}</h1>\n <p class=\"body\">{{ s.docSelectSubtitle }}</p>\n\n @if (!lockedCountry) {\n <div class=\"chips\" role=\"listbox\" aria-label=\"Pays\">\n @for (code of config.countries; track code) {\n <button\n type=\"button\"\n class=\"chip\"\n role=\"option\"\n [class.on]=\"code === country()\"\n [attr.aria-selected]=\"code === country()\"\n (click)=\"country.set(code)\"\n >{{ label(code) }}</button>\n }\n </div>\n }\n\n <div class=\"cards\">\n @for (doc of config.documentTypes; track doc) {\n <button\n type=\"button\"\n class=\"card\"\n [class.on]=\"doc === document()\"\n (click)=\"document.set(doc)\"\n >\n <span class=\"ico\"><naya-icon [name]=\"docIcon(doc)\" [size]=\"20\" /></span>\n <span class=\"lbl\">{{ s.docLabel(doc) }}</span>\n <naya-icon name=\"chevron\" [size]=\"20\" [stroke]=\"2\" />\n </button>\n }\n </div>\n\n <div class=\"spacer\"></div>\n <naya-primary-button\n [label]=\"s.continueLabel\"\n [disabled]=\"!document()\"\n (pressed)=\"next()\"\n />\n </div>\n </naya-screen>\n `,\n styles: [`\n .pad { display: flex; flex-direction: column; flex: 1; padding: 8px 24px 16px; }\n .title {\n margin: 0 0 8px; white-space: pre-line; text-wrap: balance;\n font-size: 23px; font-weight: 800; line-height: 1.25;\n letter-spacing: -0.2px; color: var(--naya-primary);\n }\n .body { margin: 0 0 18px; font-size: 15px; line-height: 1.5; color: var(--naya-text-2); }\n .chips { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; margin-bottom: 18px; }\n .chip {\n flex: 0 0 auto; padding: 8px 14px; border-radius: 999px; cursor: pointer;\n background: var(--naya-surface); border: 1px solid var(--naya-line);\n font-size: 13px; font-weight: 500; color: var(--naya-text);\n white-space: nowrap;\n }\n .chip.on {\n border: 1.6px solid var(--naya-accent); font-weight: 700;\n background: color-mix(in srgb, var(--naya-accent) 18%, transparent);\n }\n .chip:focus-visible { outline: 2px solid var(--naya-accent); outline-offset: 2px; }\n .cards { display: flex; flex-direction: column; gap: 10px; }\n .card {\n display: flex; align-items: center; gap: 12px; width: 100%;\n padding: 14px; cursor: pointer; text-align: left;\n background: var(--naya-surface); border: 1px solid var(--naya-line);\n border-radius: var(--naya-r-card);\n }\n .card.on {\n border: 1.8px solid var(--naya-accent);\n background: #FFF9EE;\n }\n .card:focus-visible { outline: 2px solid var(--naya-accent); outline-offset: 2px; }\n .ico {\n width: 36px; height: 36px; border-radius: 8px; flex: 0 0 auto;\n display: inline-flex; align-items: center; justify-content: center;\n background: #EDF3FA; color: var(--naya-primary);\n }\n .lbl { flex: 1; font-size: 14px; font-weight: 700; color: var(--naya-text); }\n .card naya-icon:last-child { color: var(--naya-text-2); }\n .spacer { flex: 1 1 auto; min-height: 16px; }\n `],\n})\nexport class DocumentSelectionScreen {\n readonly flow = inject(NayaFlowService);\n readonly s = this.flow.strings;\n readonly config = this.flow.resolvedConfig;\n\n readonly lockedCountry = !!this.config.country;\n readonly country = signal<NayaCountryCode>(\n this.config.country ?? this.config.countries[0],\n );\n readonly document = signal<NayaDocumentType | null>(\n this.config.documentTypes.length === 1 ? this.config.documentTypes[0] : null,\n );\n\n readonly docIconMap = computed(() => this.document());\n\n label(code: NayaCountryCode): string {\n return countryLabel(code);\n }\n\n docIcon(doc: NayaDocumentType): NayaIconName {\n switch (doc) {\n case 'cni': return 'id-card';\n case 'passeport': return 'passport';\n case 'permis': return 'car';\n }\n }\n\n next(): void {\n const doc = this.document();\n if (!doc) return;\n this.flow.country.set(this.country());\n this.flow.document.set(doc);\n this.flow.go('capture-recto');\n }\n}\n","/**\n * Traitement d'image pour le web — équivalent de `image_utils.dart`, adapté au\n * pipeline canvas du navigateur (le SDK Flutter lisait les plans bruts de la\n * caméra).\n *\n * Les seuils sont repris de Flutter à titre de point de départ. Ils devront\n * être **recalibrés** : la mesure porte ici sur des pixels RGBA issus d'un\n * canvas, pas sur les plans NV21/BGRA natifs, si bien que les valeurs absolues\n * ne se transposent pas telles quelles.\n */\n\n/**\n * Seuil de netteté (variance du Laplacien) au-delà duquel le cadre passe au\n * vert. Volontairement prudent — à ajuster après essais multi-navigateurs.\n */\nexport const SHARPNESS_READY_THRESHOLD = 60;\n\n/** En dessous, l'éclairage est jugé insuffisant (luminance moyenne 0-255). */\nexport const LUMINANCE_MIN = 60;\n/** Au-dessus, l'image est surexposée. */\nexport const LUMINANCE_MAX = 235;\n\n/**\n * Compresse une image (élément vidéo ou canvas) en data-URL JPEG.\n *\n * L'API accepte un corps JSON de 5 Mo ; un JPEG ≤ 1600 px de côté à qualité\n * 0,85 reste largement sous la limite tout en préservant la lisibilité OCR —\n * important sur les réseaux mobiles d'Afrique de l'Ouest.\n */\nexport function canvasToJpegDataUrl(\n source: HTMLCanvasElement | HTMLVideoElement,\n maxDimension = 1600,\n quality = 0.85,\n): string {\n const srcW = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcH = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n const scale = Math.min(1, maxDimension / Math.max(srcW, srcH));\n const w = Math.round(srcW * scale);\n const h = Math.round(srcH * scale);\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return '';\n ctx.drawImage(source, 0, 0, w, h);\n return canvas.toDataURL('image/jpeg', quality);\n}\n\n/**\n * Échantillonne une zone d'une trame vidéo et renvoie luminance moyenne et\n * netteté (variance du Laplacien) en une seule passe, sur un canvas réduit\n * pour limiter le coût. `region` cible la fenêtre du cadre de guidage\n * (fractions 0-1) ; par défaut, la moitié centrale.\n */\nexport interface FrameQuality {\n luminance: number;\n sharpness: number;\n lightOk: boolean;\n sharpOk: boolean;\n}\n\nexport function measureFrameQuality(\n video: HTMLVideoElement,\n scratch: HTMLCanvasElement,\n region = { x: 0.25, y: 0.25, w: 0.5, h: 0.5 },\n sampleWidth = 240,\n): FrameQuality {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n if (vw < 8 || vh < 8) {\n return { luminance: 0, sharpness: 0, lightOk: false, sharpOk: false };\n }\n\n const sx = Math.floor(vw * region.x);\n const sy = Math.floor(vh * region.y);\n const sw = Math.floor(vw * region.w);\n const sh = Math.floor(vh * region.h);\n\n // Réduction : on ramène la région à ~sampleWidth de large.\n const scale = Math.min(1, sampleWidth / sw);\n const w = Math.max(8, Math.round(sw * scale));\n const h = Math.max(8, Math.round(sh * scale));\n\n scratch.width = w;\n scratch.height = h;\n const ctx = scratch.getContext('2d', { willReadFrequently: true });\n if (!ctx) return { luminance: 0, sharpness: 0, lightOk: false, sharpOk: false };\n\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, w, h);\n const { data } = ctx.getImageData(0, 0, w, h);\n\n // Luminance (Rec. 601) par pixel, puis variance du Laplacien 4-voisins.\n const lum = new Float32Array(w * h);\n let sumLum = 0;\n for (let i = 0, p = 0; i < data.length; i += 4, p++) {\n const l = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2];\n lum[p] = l;\n sumLum += l;\n }\n const luminance = sumLum / (w * h);\n\n let sum = 0;\n let sumSq = 0;\n let count = 0;\n for (let y = 1; y < h - 1; y++) {\n for (let x = 1; x < w - 1; x++) {\n const idx = y * w + x;\n const lap =\n 4 * lum[idx] - lum[idx - 1] - lum[idx + 1] - lum[idx - w] - lum[idx + w];\n sum += lap;\n sumSq += lap * lap;\n count++;\n }\n }\n const mean = count ? sum / count : 0;\n const sharpness = count ? sumSq / count - mean * mean : 0;\n\n return {\n luminance,\n sharpness,\n lightOk: luminance >= LUMINANCE_MIN && luminance <= LUMINANCE_MAX,\n sharpOk: sharpness >= SHARPNESS_READY_THRESHOLD,\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n computed,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NayaFlowService } from '../flow/naya-flow.service';\nimport { NayaScreenComponent } from '../components/naya-screen.component';\nimport { NayaIconComponent } from '../components/naya-icon.component';\nimport { canvasToJpegDataUrl, measureFrameQuality } from '../utils/image-utils';\n\n/**\n * Écrans 3-4 — Capture du document (recto puis verso pour la CNI).\n *\n * Caméra arrière, cadre de guidage centré au ratio carte (1,586), contrôles\n * qualité en direct (luminosité + netteté). Quand l'image est nette et bien\n * éclairée, le cadre et le déclencheur passent au vert — **c'est l'utilisateur\n * qui valide**. Reprend `document_capture_screen.dart`.\n *\n * `side` est déduit de l'étape courante ('capture-recto' | 'capture-verso').\n */\n@Component({\n selector: 'naya-document-capture-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NayaScreenComponent, NayaIconComponent],\n template: `\n <naya-screen\n [poweredBy]=\"s.poweredBy\"\n [dark]=\"true\"\n [canBack]=\"flow.canGoBack\"\n (back)=\"flow.back()\"\n (close)=\"flow.cancel()\"\n >\n <div class=\"pad\">\n <p class=\"instruction\">{{ instruction() }}</p>\n\n <div class=\"cardWrap\">\n <div class=\"card\" [class.ready]=\"ready()\">\n @if (cameraError()) {\n <div class=\"camMsg\">{{ cameraError() }}</div>\n } @else {\n <video #video class=\"preview\" playsinline muted autoplay></video>\n @if (!streaming()) {\n <div class=\"camMsg\"><span class=\"loader\"></span></div>\n }\n }\n <!-- Coins de guidage, ambre puis verts quand l'image est bonne -->\n <svg class=\"corners\" viewBox=\"0 0 100 63\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n <path d=\"M2,14 L2,6 Q2,2 6,2 L16,2\" />\n <path d=\"M84,2 L94,2 Q98,2 98,6 L98,14\" />\n <path d=\"M98,49 L98,57 Q98,61 94,61 L84,61\" />\n <path d=\"M16,61 L6,61 Q2,61 2,57 L2,49\" />\n </svg>\n </div>\n </div>\n\n <div class=\"pills\">\n <span class=\"pill\" [class.ok]=\"lightOk()\">\n <naya-icon [name]=\"lightOk() ? 'check' : 'sun'\" [size]=\"15\" [stroke]=\"2.4\" />\n {{ s.qualityLight }}\n </span>\n <span class=\"pill\" [class.ok]=\"sharpOk()\">\n <naya-icon [name]=\"sharpOk() ? 'check' : 'focus'\" [size]=\"15\" [stroke]=\"2.4\" />\n {{ s.qualitySharpness }}\n </span>\n </div>\n\n <button\n type=\"button\"\n class=\"shutter\"\n [class.ready]=\"ready()\"\n [disabled]=\"!streaming() || capturing()\"\n (click)=\"capture()\"\n [attr.aria-label]=\"s.captureHint\"\n >\n @if (capturing()) { <span class=\"loader sm\"></span> }\n </button>\n\n <p class=\"hint\" [class.ready]=\"ready()\">\n {{ ready() ? s.captureReady : s.captureHint }}\n </p>\n </div>\n </naya-screen>\n `,\n styles: [`\n .pad { display: flex; flex-direction: column; flex: 1; align-items: center; padding: 0 16px 16px; }\n .instruction {\n width: 100%; margin: 0 0 12px; padding: 12px 16px; text-align: center;\n background: rgba(0,0,0,.55); border-radius: 12px;\n color: #fff; font-size: 15.5px; line-height: 1.35; font-weight: 600;\n }\n .cardWrap { flex: 1 1 auto; display: flex; align-items: center; width: 100%; min-height: 0; }\n .card {\n position: relative; width: 100%; aspect-ratio: 1.586;\n border-radius: 10px; overflow: hidden; background: rgba(255,255,255,.06);\n }\n .preview { width: 100%; height: 100%; object-fit: cover; display: block; }\n .camMsg {\n position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;\n padding: 16px; text-align: center; color: rgba(255,255,255,.7); font-size: 13px;\n }\n .corners { position: absolute; inset: 0; width: 100%; height: 100%; fill: none;\n stroke: var(--naya-accent); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round;\n transition: stroke .2s ease; pointer-events: none; }\n .card.ready .corners { stroke: var(--naya-success); }\n .pills { display: flex; gap: 8px; justify-content: center; margin: 14px 0; }\n .pill {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 7px 14px; border-radius: 999px;\n background: color-mix(in srgb, var(--naya-warning) 92%, transparent);\n color: #fff; font-size: 12.5px; font-weight: 700;\n }\n .pill.ok { background: color-mix(in srgb, var(--naya-success) 92%, transparent); }\n .shutter {\n width: 72px; height: 72px; border-radius: 50%; cursor: pointer;\n border: 4.5px solid #fff; background: rgba(255,255,255,.3);\n display: inline-flex; align-items: center; justify-content: center;\n transition: border-color .2s ease, background .2s ease;\n }\n .shutter.ready { border-color: var(--naya-success); background: color-mix(in srgb, var(--naya-success) 30%, transparent); }\n .shutter:disabled { cursor: default; }\n .shutter:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }\n .hint { margin: 12px 0 0; text-align: center; font-size: 13px; font-weight: 500; color: #9FB2C6; }\n .hint.ready { color: var(--naya-success); font-weight: 700; }\n .loader {\n width: 30px; height: 30px; border-radius: 50%;\n border: 3px solid rgba(255,255,255,.25); border-top-color: #fff;\n animation: naya-spin .8s linear infinite;\n }\n .loader.sm { width: 24px; height: 24px; border-width: 2.5px; }\n @keyframes naya-spin { to { transform: rotate(360deg); } }\n @media (prefers-reduced-motion: reduce) { .loader { animation-duration: 1.6s; } }\n `],\n})\nexport class DocumentCaptureScreen implements OnInit, OnDestroy {\n readonly flow = inject(NayaFlowService);\n readonly s = this.flow.strings;\n\n /** Face capturée par cet écran. */\n readonly side = input<'recto' | 'verso'>('recto');\n\n private readonly videoRef = viewChild<ElementRef<HTMLVideoElement>>('video');\n\n readonly streaming = signal(false);\n readonly capturing = signal(false);\n readonly cameraError = signal<string | null>(null);\n readonly lightOk = signal(false);\n readonly sharpOk = signal(false);\n readonly ready = computed(() => this.lightOk() && this.sharpOk() && !this.capturing());\n\n private stream: MediaStream | null = null;\n private qualityTimer?: ReturnType<typeof setInterval>;\n private readonly scratch =\n typeof document !== 'undefined' ? document.createElement('canvas') : null;\n\n readonly instruction = computed(() =>\n this.side() === 'recto' ? this.s.captureRectoInstruction : this.s.captureVersoInstruction,\n );\n\n ngOnInit(): void {\n void this.startCamera();\n }\n\n ngOnDestroy(): void {\n this.stopCamera();\n }\n\n private async startCamera(): Promise<void> {\n if (!navigator.mediaDevices?.getUserMedia) {\n this.cameraError.set(this.s.errorCamera);\n return;\n }\n try {\n // Caméra arrière privilégiée pour le document ; repli sur défaut.\n this.stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: { ideal: 'environment' }, width: { ideal: 1920 } },\n audio: false,\n });\n // L'écran a pu être quitté pendant l'attente d'autorisation.\n const video = this.videoRef()?.nativeElement;\n if (!video) { this.stopCamera(); return; }\n video.srcObject = this.stream;\n await video.play().catch(() => {});\n this.streaming.set(true);\n this.startQualityLoop(video);\n } catch {\n this.cameraError.set(this.s.errorCamera);\n }\n }\n\n private startQualityLoop(video: HTMLVideoElement): void {\n if (!this.scratch) return;\n // Cadence alignée sur Flutter (~350 ms) : suffisant pour un retour fluide\n // sans saturer le thread principal avec des getImageData.\n this.qualityTimer = setInterval(() => {\n if (this.capturing() || video.videoWidth < 8) return;\n const q = measureFrameQuality(video, this.scratch!);\n if (q.lightOk !== this.lightOk()) this.lightOk.set(q.lightOk);\n if (q.sharpOk !== this.sharpOk()) this.sharpOk.set(q.sharpOk);\n }, 350);\n }\n\n private stopCamera(): void {\n if (this.qualityTimer) clearInterval(this.qualityTimer);\n this.qualityTimer = undefined;\n this.stream?.getTracks().forEach((t) => t.stop());\n this.stream = null;\n this.streaming.set(false);\n }\n\n async capture(): Promise<void> {\n const video = this.videoRef()?.nativeElement;\n if (!video || this.capturing() || !this.streaming()) return;\n this.capturing.set(true);\n try {\n const dataUrl = canvasToJpegDataUrl(video);\n this.stopCamera();\n\n if (this.side() === 'recto') {\n this.flow.rectoBase64.set(dataUrl);\n if (this.flow.needsVerso) {\n this.flow.go('capture-verso');\n return;\n }\n } else {\n this.flow.versoBase64.set(dataUrl);\n }\n\n // Dernière face : l'envoi (session + document) part en arrière-plan\n // pendant que l'utilisateur enchaîne sur le selfie.\n this.flow.startDocumentUpload();\n this.flow.go('liveness');\n } finally {\n this.capturing.set(false);\n }\n }\n}\n","/**\n * Machine à états du défi de vivacité, exécutée sur l'appareil.\n *\n * Port fidèle de `liveness_challenge.dart`. La logique est identique ; seule\n * l'entrée change : au lieu d'objets ML Kit, elle reçoit des signaux déjà\n * normalisés par l'adaptateur MediaPipe — probabilités d'yeux ouverts (0-1) et\n * lacet approximatif en degrés.\n *\n * Séquence : détection du visage → clignement → rotation de la tête. Chaque\n * trame fait avancer (ou reculer) l'état ; le score final reflète la complétion\n * du défi et la stabilité du suivi.\n */\n\nexport type LivenessStep = 'searching-face' | 'blink' | 'turn-head' | 'done';\n\n/** Signaux extraits d'une trame par l'adaptateur de suivi facial. */\nexport interface FaceSignals {\n /** Nombre de visages détectés. Le défi exige exactement un. */\n faceCount: number;\n /** Probabilité d'œil gauche ouvert (0-1), ou null si indisponible. */\n leftEyeOpen: number | null;\n /** Probabilité d'œil droit ouvert (0-1), ou null si indisponible. */\n rightEyeOpen: number | null;\n /** Lacet de la tête en degrés (négatif/positif selon le côté), ou null. */\n yawDegrees: number | null;\n}\n\n// Seuils repris de Flutter. Valeurs de départ : la source des signaux diffère\n// (blendshapes MediaPipe vs classification ML Kit), un recalibrage sur visages\n// réels est attendu.\nconst EYES_CLOSED_THRESHOLD = 0.25;\nconst EYES_OPEN_THRESHOLD = 0.65;\nconst HEAD_TURN_DEGREES = 16;\nconst FRAMES_TO_LOCK_FACE = 6;\nconst FRAMES_LOST_BEFORE_RESET = 12;\n\nexport class LivenessChallenge {\n step: LivenessStep = 'searching-face';\n\n private framesWithFace = 0;\n private framesWithoutFace = 0;\n private eyesClosedSeen = false;\n private blinkDone = false;\n private turnDone = false;\n\n /** Index numérique de l'étape (pour l'anneau de progression). */\n get stepIndex(): number {\n return { 'searching-face': 0, blink: 1, 'turn-head': 2, done: 3 }[this.step];\n }\n\n get isDone(): boolean {\n return this.step === 'done';\n }\n\n /**\n * Fait avancer la machine avec les signaux d'une trame. Retourne `true` si\n * l'étape courante a changé (pour rafraîchir l'interface).\n */\n onFrame(sig: FaceSignals): boolean {\n const before = this.step;\n\n if (sig.faceCount !== 1) {\n this.framesWithoutFace++;\n // Visage perdu trop longtemps → retour à la détection, sans annuler les\n // défis déjà réussis.\n if (this.framesWithoutFace > FRAMES_LOST_BEFORE_RESET && this.step !== 'done') {\n this.step = 'searching-face';\n this.framesWithFace = 0;\n }\n return this.step !== before;\n }\n\n this.framesWithoutFace = 0;\n this.framesWithFace++;\n\n switch (this.step) {\n case 'searching-face':\n if (this.framesWithFace >= FRAMES_TO_LOCK_FACE) {\n this.step = this.blinkDone ? 'turn-head' : 'blink';\n }\n break;\n\n case 'blink': {\n const { leftEyeOpen: l, rightEyeOpen: r } = sig;\n if (l == null || r == null) break;\n if (l < EYES_CLOSED_THRESHOLD && r < EYES_CLOSED_THRESHOLD) {\n this.eyesClosedSeen = true;\n } else if (this.eyesClosedSeen && l > EYES_OPEN_THRESHOLD && r > EYES_OPEN_THRESHOLD) {\n this.blinkDone = true;\n this.step = this.turnDone ? 'done' : 'turn-head';\n }\n break;\n }\n\n case 'turn-head': {\n const yaw = sig.yawDegrees;\n if (yaw != null && Math.abs(yaw) > HEAD_TURN_DEGREES) {\n this.turnDone = true;\n this.step = 'done';\n }\n break;\n }\n\n case 'done':\n break;\n }\n\n return this.step !== before;\n }\n\n /**\n * Score 0-100 transmis à l'API. Défi complet → 90 + bonus de stabilité de\n * suivi (jusqu'à 8). Jamais de score élevé sans défi réussi.\n */\n score(): number {\n if (!this.isDone) {\n let partial = 20;\n if (this.framesWithFace >= FRAMES_TO_LOCK_FACE) partial += 15;\n if (this.blinkDone) partial += 15;\n return partial;\n }\n const stabilityBonus = Math.min(8, Math.round(this.framesWithFace / 30));\n return 90 + stabilityBonus;\n }\n}\n","import type { FaceSignals } from './liveness-challenge';\n\n/**\n * Adaptateur de suivi facial pour le web, sur MediaPipe Face Landmarker.\n *\n * Remplace ML Kit (indisponible sur navigateur). Deux sorties du modèle sont\n * exploitées :\n *\n * • **Blendshapes** `eyeBlinkLeft` / `eyeBlinkRight` (0 = ouvert, 1 = fermé).\n * ML Kit fournissait l'inverse (probabilité d'œil ouvert) ; on convertit\n * par `ouvert = 1 - clignement`.\n * • **Landmarks** — le lacet de la tête est estimé par la position du nez\n * entre les deux bords du visage. Robuste et indépendant de la convention\n * de la matrice de transformation, au prix d'une échelle approximative\n * (documentée, à recalibrer).\n *\n * Le module `@mediapipe/tasks-vision` et son binaire WASM sont volumineux : ils\n * ne sont importés qu'au démarrage de l'étape de vivacité (import différé\n * depuis l'écran), jamais dans le bundle initial.\n */\n\nexport interface FaceTrackerAssets {\n /** Base des fichiers WASM de `tasks-vision`. Défaut : jsDelivr. */\n wasmBaseUrl?: string;\n /** URL du modèle `.task` de Face Landmarker. Défaut : stockage Google. */\n modelUrl?: string;\n}\n\n// La version du WASM doit correspondre à celle du paquet JS (@mediapipe/\n// tasks-vision) déclaré en dépendance, sous peine d'incompatibilité runtime.\nconst DEFAULT_WASM_BASE =\n 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@1.0.1/wasm';\nconst DEFAULT_MODEL =\n 'https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/1/face_landmarker.task';\n\n// Indices de landmarks (topologie 468 points de MediaPipe Face Mesh).\nconst NOSE_TIP = 1;\nconst FACE_LEFT_EDGE = 234;\nconst FACE_RIGHT_EDGE = 454;\n\nexport class FaceTracker {\n private landmarker: any = null;\n\n /** Charge le modèle. À appeler une fois, avant `detect`. */\n async init(assets: FaceTrackerAssets = {}): Promise<void> {\n const vision = await import('@mediapipe/tasks-vision');\n const { FaceLandmarker, FilesetResolver } = vision;\n\n const fileset = await FilesetResolver.forVisionTasks(\n assets.wasmBaseUrl ?? DEFAULT_WASM_BASE,\n );\n this.landmarker = await FaceLandmarker.createFromOptions(fileset, {\n baseOptions: {\n modelAssetPath: assets.modelUrl ?? DEFAULT_MODEL,\n delegate: 'GPU',\n },\n runningMode: 'VIDEO',\n numFaces: 1,\n outputFaceBlendshapes: true,\n });\n }\n\n get ready(): boolean {\n return !!this.landmarker;\n }\n\n /** Analyse une trame vidéo et renvoie les signaux normalisés du défi. */\n detect(video: HTMLVideoElement, timestampMs: number): FaceSignals {\n if (!this.landmarker || video.videoWidth < 8) {\n return { faceCount: 0, leftEyeOpen: null, rightEyeOpen: null, yawDegrees: null };\n }\n\n const result = this.landmarker.detectForVideo(video, timestampMs);\n const faceCount = result.faceLandmarks?.length ?? 0;\n if (faceCount !== 1) {\n return { faceCount, leftEyeOpen: null, rightEyeOpen: null, yawDegrees: null };\n }\n\n // ── Clignement via blendshapes ────────────────────────────────────────\n let leftEyeOpen: number | null = null;\n let rightEyeOpen: number | null = null;\n const shapes = result.faceBlendshapes?.[0]?.categories as\n | Array<{ categoryName: string; score: number }>\n | undefined;\n if (shapes) {\n for (const c of shapes) {\n if (c.categoryName === 'eyeBlinkLeft') leftEyeOpen = 1 - c.score;\n else if (c.categoryName === 'eyeBlinkRight') rightEyeOpen = 1 - c.score;\n }\n }\n\n // ── Lacet via landmarks ───────────────────────────────────────────────\n let yawDegrees: number | null = null;\n const lm = result.faceLandmarks[0];\n const nose = lm[NOSE_TIP];\n const left = lm[FACE_LEFT_EDGE];\n const right = lm[FACE_RIGHT_EDGE];\n if (nose && left && right) {\n const span = right.x - left.x;\n if (Math.abs(span) > 1e-4) {\n // Position relative du nez entre les bords : 0,5 = centré.\n const ratio = (nose.x - left.x) / span;\n // Conversion en pseudo-degrés : ±0,1 d'écart ≈ ±16°, seuil Flutter.\n yawDegrees = (ratio - 0.5) * 160;\n }\n }\n\n return { faceCount: 1, leftEyeOpen, rightEyeOpen, yawDegrees };\n }\n\n close(): void {\n this.landmarker?.close?.();\n this.landmarker = null;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n computed,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NayaFlowService } from '../flow/naya-flow.service';\nimport { NayaScreenComponent } from '../components/naya-screen.component';\nimport { NayaIconComponent, type NayaIconName } from '../components/naya-icon.component';\nimport { canvasToJpegDataUrl } from '../utils/image-utils';\nimport { LivenessChallenge, type LivenessStep } from '../liveness/liveness-challenge';\nimport { FaceTracker } from '../liveness/face-tracker';\n\n/**\n * Écran 5 — Selfie avec défi de vivacité sur l'appareil (MediaPipe).\n *\n * Caméra frontale, chaque trame alimente le suivi facial puis la machine à\n * états (visage → clignement → rotation). Défi complet → photo capturée,\n * compressée, et passage au traitement. Reprend `liveness_screen.dart`.\n *\n * L'analyse est locale : la photo n'est transmise qu'à la fin du défi.\n */\n@Component({\n selector: 'naya-liveness-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NayaScreenComponent, NayaIconComponent],\n template: `\n <naya-screen [poweredBy]=\"s.poweredBy\" (close)=\"flow.cancel()\">\n <div class=\"pad\">\n <h1 class=\"title\">{{ s.livenessTitle }}</h1>\n <p class=\"sub\">{{ s.livenessSubtitle }}</p>\n\n <div class=\"ovalWrap\">\n <div class=\"oval\" [class.error]=\"!!cameraError()\">\n @if (cameraError()) {\n <div class=\"camMsg\">{{ cameraError() }}</div>\n } @else {\n <video #video class=\"preview\" playsinline muted autoplay></video>\n @if (!streaming()) { <div class=\"camMsg\"><span class=\"loader\"></span></div> }\n }\n </div>\n <svg class=\"ring\" viewBox=\"0 0 210 270\" aria-hidden=\"true\">\n <path class=\"track\" [attr.d]=\"ringPath\" />\n <path\n class=\"prog\" [attr.d]=\"ringPath\"\n pathLength=\"100\" stroke-dasharray=\"100\"\n [attr.stroke-dashoffset]=\"dashOffset()\"\n />\n </svg>\n </div>\n\n <div class=\"instruction\">\n <naya-icon [name]=\"instructionIcon()\" [size]=\"22\" [stroke]=\"2\" />\n <span>{{ instructionText() }}</span>\n </div>\n\n <div class=\"steps\">\n @for (st of challengeSteps(); track st.label) {\n <div class=\"cstep\">\n <span class=\"cdot\" [class.done]=\"st.state === 'done'\" [class.active]=\"st.state === 'active'\">\n @if (st.state === 'done') { <naya-icon name=\"check\" [size]=\"13\" [stroke]=\"3\" /> }\n </span>\n <span class=\"clbl\">{{ st.label }}</span>\n </div>\n }\n </div>\n\n <div class=\"spacer\"></div>\n <p class=\"privacy\">{{ s.livenessPrivacy }}</p>\n </div>\n </naya-screen>\n `,\n styles: [`\n .pad { display: flex; flex-direction: column; flex: 1; align-items: center; padding: 4px 24px 12px; }\n .title { margin: 0; font-size: 23px; font-weight: 800; color: var(--naya-primary); text-align: center; }\n .sub { margin: 6px 0 18px; font-size: 15px; color: var(--naya-text-2); text-align: center; }\n /* Conteneur au ratio carte-visage (210:270) ; responsive sur petits écrans.\n Le ratio fixe garantit que l'ellipse du SVG n'est pas déformée. */\n .ovalWrap { position: relative; width: min(230px, 62vw); aspect-ratio: 210 / 270; margin: 4px 0; }\n .oval {\n position: absolute; inset: 7px; border-radius: 50%; overflow: hidden;\n background: rgba(0,0,0,.04); display: flex; align-items: center; justify-content: center;\n }\n /* Selfie : miroir horizontal, comme un miroir de face. */\n .preview { width: 100%; height: 100%; object-fit: cover; transform: scaleX(-1); }\n .camMsg { padding: 20px; text-align: center; color: var(--naya-text-2); font-size: 12px; }\n /* Anneau elliptique calé exactement sur le cadre photo. Le tracé part du\n haut et tourne dans le sens horaire (pas de rotation : elle déformerait\n une ellipse dont les rayons diffèrent). */\n .ring { position: absolute; inset: 0; width: 100%; height: 100%; fill: none; overflow: visible; }\n .ring .track { stroke: #D8DFE8; stroke-width: 4; }\n .ring .prog {\n stroke: var(--naya-accent); stroke-width: 4; stroke-linecap: round;\n transition: stroke-dashoffset .35s ease;\n }\n .instruction {\n display: inline-flex; align-items: center; gap: 10px; margin: 18px 0 14px;\n padding: 12px 16px; background: var(--naya-surface);\n border: 1px solid var(--naya-line); border-radius: var(--naya-r-card);\n color: var(--naya-primary);\n }\n .instruction span { font-size: 16px; font-weight: 700; color: var(--naya-text); }\n .steps { display: flex; gap: 20px; justify-content: center; }\n .cstep { display: flex; flex-direction: column; align-items: center; gap: 5px; }\n .cdot {\n width: 22px; height: 22px; border-radius: 50%; background: #D6DCE4;\n display: inline-flex; align-items: center; justify-content: center; color: #fff;\n }\n .cdot.active { background: var(--naya-accent); }\n .cdot.done { background: var(--naya-success); }\n .clbl { font-size: 11px; color: var(--naya-text-2); }\n .spacer { flex: 1 1 auto; min-height: 12px; }\n .privacy { margin: 0; text-align: center; white-space: pre-line; font-size: 12.5px; color: var(--naya-text-2); }\n .loader { width: 30px; height: 30px; border-radius: 50%; border: 3px solid rgba(0,0,0,.12); border-top-color: var(--naya-accent); animation: naya-spin .8s linear infinite; }\n @keyframes naya-spin { to { transform: rotate(360deg); } }\n @media (prefers-reduced-motion: reduce) { .loader { animation-duration: 1.6s; } .ring .prog { transition: none; } }\n `],\n})\nexport class LivenessScreen implements OnInit, OnDestroy {\n readonly flow = inject(NayaFlowService);\n readonly s = this.flow.strings;\n\n private readonly videoRef = viewChild<ElementRef<HTMLVideoElement>>('video');\n\n readonly streaming = signal(false);\n readonly cameraError = signal<string | null>(null);\n /** Étape courante, exposée en signal pour piloter l'affichage. */\n readonly step = signal<LivenessStep>('searching-face');\n\n /**\n * Ellipse tracée comme deux demi-arcs partant du sommet (105,4) dans le sens\n * horaire. `pathLength=100` normalise la longueur : l'offset s'exprime alors\n * en pourcentage, indépendamment de la taille rendue.\n */\n readonly ringPath =\n 'M105,4 A101,131 0 0 1 105,266 A101,131 0 0 1 105,4 Z';\n readonly dashOffset = computed(() => {\n const progress = Math.min(1, this.stepIndex() / 3);\n return 100 * (1 - progress);\n });\n private readonly stepIndex = computed(\n () => ({ 'searching-face': 0, blink: 1, 'turn-head': 2, done: 3 })[this.step()],\n );\n\n private readonly challenge = new LivenessChallenge();\n private readonly tracker = new FaceTracker();\n private stream: MediaStream | null = null;\n private rafId = 0;\n private finishing = false;\n\n readonly instructionText = computed(() => {\n switch (this.step()) {\n case 'searching-face': return this.s.livenessLookStraight;\n case 'blink': return this.s.livenessBlink;\n case 'turn-head': return this.s.livenessTurnHead;\n case 'done': return this.s.livenessHold;\n }\n });\n\n readonly instructionIcon = computed<NayaIconName>(() => {\n switch (this.step()) {\n case 'searching-face': return 'focus';\n case 'blink': return 'eye';\n case 'turn-head': return 'rotate';\n case 'done': return 'hourglass';\n }\n });\n\n readonly challengeSteps = computed(() => {\n const cur = this.stepIndex();\n const state = (n: number) => (cur >= n ? 'done' : cur === n - 1 ? 'active' : 'pending');\n return [\n { label: this.s.livenessStepFace, state: state(1) },\n { label: this.s.livenessStepBlink, state: state(2) },\n { label: this.s.livenessStepTurn, state: state(3) },\n ];\n });\n\n async ngOnInit(): Promise<void> {\n await this.start();\n }\n\n ngOnDestroy(): void {\n this.teardown();\n }\n\n private async start(): Promise<void> {\n if (!navigator.mediaDevices?.getUserMedia) {\n this.cameraError.set(this.s.errorCamera);\n return;\n }\n try {\n // Le modèle et son WASM (volumineux) ne sont chargés qu'ici.\n await this.tracker.init(this.flow.resolvedConfig.livenessAssets);\n } catch {\n this.cameraError.set(this.s.errorNetwork);\n return;\n }\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: { ideal: 'user' }, width: { ideal: 1280 } },\n audio: false,\n });\n const video = this.videoRef()?.nativeElement;\n if (!video) { this.teardown(); return; }\n video.srcObject = this.stream;\n await video.play().catch(() => {});\n this.streaming.set(true);\n this.loop();\n } catch {\n this.cameraError.set(this.s.errorCamera);\n }\n }\n\n private loop = (): void => {\n const video = this.videoRef()?.nativeElement;\n if (!video || this.finishing) return;\n if (this.tracker.ready && video.videoWidth > 8) {\n try {\n const signals = this.tracker.detect(video, performance.now());\n this.challenge.onFrame(signals);\n if (this.challenge.step !== this.step()) this.step.set(this.challenge.step);\n if (this.challenge.isDone) { void this.finish(); return; }\n } catch {\n // Trame illisible : ignorée, la suivante arrive au prochain rAF.\n }\n }\n this.rafId = requestAnimationFrame(this.loop);\n };\n\n private async finish(): Promise<void> {\n if (this.finishing) return;\n this.finishing = true;\n cancelAnimationFrame(this.rafId);\n\n // Libérer MediaPipe (contexte WebGL/GPU) AVANT la capture. Sur iOS Safari,\n // dessiner la vidéo sur un canvas 2D pendant que MediaPipe détient sa\n // texture GPU corrompt l'image : striures verticales et dérive magenta —\n // que la détection anti-fraude serveur interprète (à raison) comme une\n // photo d'écran. La libérer d'abord rend au <video> des trames propres,\n // et améliore du même coup la netteté utile à la comparaison faciale.\n this.tracker.close();\n\n const video = this.videoRef()?.nativeElement;\n try {\n // Laisser la caméra composer quelques trames propres, hors emprise GPU,\n // et le temps à l'utilisateur de revenir face caméra.\n await this.waitFrames(3);\n await new Promise((r) => setTimeout(r, 300));\n if (video && video.videoWidth > 8) {\n this.flow.livenessScore.set(this.challenge.score());\n this.flow.selfieBase64.set(canvasToJpegDataUrl(video, 1080));\n }\n this.stopStream();\n this.flow.replace('processing');\n } catch {\n this.finishing = false;\n this.stopStream();\n this.cameraError.set(this.s.errorCamera);\n }\n }\n\n /** Attend `n` trames d'affichage — laisse le compositeur présenter du frais. */\n private waitFrames(n: number): Promise<void> {\n return new Promise((resolve) => {\n let i = 0;\n const tick = () => (++i >= n ? resolve() : requestAnimationFrame(tick));\n requestAnimationFrame(tick);\n });\n }\n\n private stopStream(): void {\n this.stream?.getTracks().forEach((t) => t.stop());\n this.stream = null;\n this.streaming.set(false);\n }\n\n private teardown(): void {\n cancelAnimationFrame(this.rafId);\n this.tracker.close();\n this.stopStream();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n OnDestroy,\n OnInit,\n inject,\n signal,\n} from '@angular/core';\nimport { NayaFlowService } from '../flow/naya-flow.service';\nimport { NayaApiError } from '../api/naya-api.client';\nimport { NayaScreenComponent } from '../components/naya-screen.component';\nimport { NayaIconComponent } from '../components/naya-icon.component';\nimport { NayaBrandComponent, NayaPrimaryButtonComponent } from '../components/naya-ui';\n\n/**\n * Écran 6 — Traitement : envoi du liveness puis `submit` (OCR différé,\n * biométrie, AML, décision — 30 à 90 s). Reprend `processing_screen.dart`.\n */\n@Component({\n selector: 'naya-processing-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NayaScreenComponent,\n NayaIconComponent,\n NayaBrandComponent,\n NayaPrimaryButtonComponent,\n ],\n template: `\n <naya-screen [poweredBy]=\"s.poweredBy\" [canClose]=\"!!error()\" (close)=\"flow.cancel()\">\n @if (error(); as err) {\n <div class=\"pad center\">\n <naya-icon name=\"wifi-off\" [size]=\"48\" [stroke]=\"1.8\" />\n <h1 class=\"title\">{{ s.errorTitle }}</h1>\n <p class=\"body\">{{ err }}</p>\n <div class=\"cta\"><naya-primary-button [label]=\"s.retry\" (pressed)=\"run()\" /></div>\n </div>\n } @else {\n <div class=\"pad\">\n <naya-brand />\n <div class=\"spacer\"></div>\n\n <span class=\"ring\" aria-hidden=\"true\"></span>\n\n <ul class=\"steps\">\n @for (item of steps; track item.index) {\n <li class=\"row\">\n @if (item.index <= visualStep()) {\n <span class=\"dot done\"><naya-icon name=\"check\" [size]=\"12\" [stroke]=\"3\" /></span>\n } @else if (item.index === visualStep() + 1) {\n <span class=\"dot active\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"dot idle\"></span>\n }\n <span class=\"lbl\" [class.dim]=\"item.index > visualStep() + 1\">{{ item.label }}</span>\n </li>\n }\n </ul>\n\n <div class=\"spacer\"></div>\n <p class=\"wait\">{{ s.processingWait }}</p>\n </div>\n }\n </naya-screen>\n `,\n styles: [`\n .pad { display: flex; flex-direction: column; flex: 1; align-items: center; padding: 8px 32px 16px; }\n .pad.center { justify-content: center; text-align: center; }\n .spacer { flex: 1 1 auto; }\n .title { margin: 16px 0 8px; font-size: 23px; font-weight: 800; color: var(--naya-primary); text-wrap: balance; }\n .body { margin: 0; font-size: 15px; line-height: 1.5; color: var(--naya-text-2); }\n .cta { width: 100%; margin-top: 24px; }\n .ring {\n width: 110px; height: 110px; border-radius: 50%;\n border: 7px solid #E1E6EC; border-top-color: var(--naya-primary);\n animation: naya-spin 1s linear infinite;\n }\n @keyframes naya-spin { to { transform: rotate(360deg); } }\n @media (prefers-reduced-motion: reduce) { .ring { animation-duration: 2s; } }\n .steps { list-style: none; margin: 34px 0 0; padding: 0; align-self: flex-start; }\n .row { display: flex; align-items: center; gap: 10px; padding: 5px 0; }\n .dot { width: 20px; height: 20px; border-radius: 50%; flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; }\n .dot.done { background: var(--naya-success); color: #fff; }\n .dot.idle { background: #D6DCE4; }\n .dot.active { border: 2.5px solid var(--naya-accent); border-top-color: transparent; animation: naya-spin .8s linear infinite; }\n .lbl { font-size: 15px; font-weight: 600; color: var(--naya-text); }\n .lbl.dim { color: var(--naya-text-2); font-weight: 500; }\n .wait { font-size: 13px; color: var(--naya-text-2); margin: 0; }\n `],\n})\nexport class ProcessingScreen implements OnInit, OnDestroy {\n readonly flow = inject(NayaFlowService);\n readonly s = this.flow.strings;\n\n readonly visualStep = signal(0);\n readonly error = signal<string | null>(null);\n private timer?: ReturnType<typeof setInterval>;\n\n readonly steps = [\n { label: this.s.processingDocument, index: 0 },\n { label: this.s.processingFace, index: 1 },\n { label: this.s.processingCompliance, index: 2 },\n { label: this.s.processingDecision, index: 3 },\n ];\n\n ngOnInit(): void {\n this.startVisualProgress();\n void this.run();\n }\n\n ngOnDestroy(): void {\n if (this.timer) clearInterval(this.timer);\n }\n\n private startVisualProgress(): void {\n // Progression indicative pendant l'attente réelle du serveur.\n this.timer = setInterval(() => {\n if (this.visualStep() < 2) this.visualStep.update((n) => n + 1);\n }, 9000);\n }\n\n async run(): Promise<void> {\n this.error.set(null);\n this.visualStep.set(0);\n try {\n // L'envoi du document est parti pendant le selfie — on s'assure qu'il\n // est terminé (et on le relance s'il a échoué).\n await this.flow.ensureDocumentUploaded();\n const session = this.flow.session();\n if (!session) throw new NayaApiError('Session introuvable.');\n\n await this.flow.client.submitLiveness(session.verificationId, {\n livenessScore: this.flow.livenessScore(),\n selfieBase64: this.flow.selfieBase64()!,\n });\n\n const response = await this.flow.client.submit(session.verificationId);\n this.flow.submitResponse.set(response);\n this.flow.replace('result');\n } catch (err) {\n const message =\n err instanceof NayaApiError ? err.message : this.s.errorNetwork;\n this.error.set(message);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { NayaFlowService } from '../flow/naya-flow.service';\nimport type { NayaStatus } from '../models/naya-result';\nimport { NayaScreenComponent } from '../components/naya-screen.component';\nimport { NayaIconComponent, type NayaIconName } from '../components/naya-icon.component';\nimport {\n NayaPrimaryButtonComponent,\n NayaSecondaryButtonComponent,\n} from '../components/naya-ui';\n\n/** Écran 7 — Résultat (approuvé / en revue / rejeté). */\n@Component({\n selector: 'naya-result-screen',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NayaScreenComponent,\n NayaIconComponent,\n NayaPrimaryButtonComponent,\n NayaSecondaryButtonComponent,\n ],\n template: `\n <naya-screen [poweredBy]=\"s.poweredBy\">\n <div class=\"pad\">\n <div class=\"spacer\"></div>\n\n <span class=\"badge\" [style.background]=\"view().color\">\n <naya-icon [name]=\"view().icon\" [size]=\"44\" [stroke]=\"3\" />\n </span>\n <h1 class=\"title\">{{ view().title }}</h1>\n @if (view().subtitle) { <p class=\"body\">{{ view().subtitle }}</p> }\n\n @if (status() === 'approved') {\n <div class=\"summary\">\n @if (fullName()) {\n <div class=\"srow\"><span class=\"k\">{{ s.resultName }}</span><span class=\"v\">{{ fullName() }}</span></div>\n }\n <div class=\"srow\"><span class=\"k\">{{ s.resultReference }}</span><span class=\"v mono\">{{ reference() }}</span></div>\n </div>\n }\n\n @if (status() === 'review') {\n <ul class=\"bullets\">\n @for (b of reviewBullets(); track b) {\n <li><span class=\"pip\"></span>{{ b }}</li>\n }\n </ul>\n }\n\n <div class=\"spacer\"></div>\n\n @if (status() === 'rejected' && flow.canRetry) {\n <naya-primary-button [label]=\"s.retry\" icon=\"refresh\" (pressed)=\"retry()\" />\n <div class=\"gap\"></div>\n <naya-secondary-button [label]=\"s.backToApp\" (pressed)=\"done()\" />\n } @else {\n <naya-primary-button [label]=\"doneLabel()\" (pressed)=\"done()\" />\n }\n </div>\n </naya-screen>\n `,\n styles: [`\n .pad { display: flex; flex-direction: column; flex: 1; align-items: center; padding: 8px 24px 16px; }\n .spacer { flex: 1 1 auto; }\n .badge {\n width: 88px; height: 88px; border-radius: 50%; color: #fff;\n display: inline-flex; align-items: center; justify-content: center;\n }\n .title { margin: 18px 0 8px; text-align: center; text-wrap: balance; font-size: 23px; font-weight: 800; color: var(--naya-primary); }\n .body { margin: 0; text-align: center; font-size: 15px; line-height: 1.5; color: var(--naya-text-2); }\n .summary {\n width: 100%; margin-top: 20px; padding: 14px;\n background: var(--naya-surface); border: 1px solid var(--naya-line);\n border-radius: var(--naya-r-card);\n }\n .srow { display: flex; justify-content: space-between; align-items: center; padding: 4px 0; gap: 12px; }\n .k { font-size: 13px; color: var(--naya-text-2); }\n .v { font-size: 13px; font-weight: 800; color: var(--naya-text); text-align: right; }\n .v.mono { font-family: ui-monospace, \"SF Mono\", Menlo, monospace; }\n .bullets { list-style: none; margin: 20px 0 0; padding: 0; align-self: stretch; }\n .bullets li { display: flex; align-items: center; gap: 9px; padding: 4px 0; font-size: 13px; color: var(--naya-text); }\n .pip { width: 6px; height: 6px; border-radius: 50%; background: var(--naya-warning); flex: 0 0 auto; }\n .gap { height: 10px; }\n `],\n})\nexport class ResultScreen {\n readonly flow = inject(NayaFlowService);\n readonly s = this.flow.strings;\n\n readonly response = computed(() => this.flow.submitResponse());\n\n readonly status = computed<NayaStatus>(() => {\n switch (this.response()?.status) {\n case 'approved': return 'approved';\n case 'rejected': return 'rejected';\n default: return 'review';\n }\n });\n\n readonly view = computed<{ icon: NayaIconName; color: string; title: string; subtitle: string }>(() => {\n switch (this.status()) {\n case 'approved':\n return {\n icon: 'check', color: 'var(--naya-success)',\n title: this.s.resultApprovedTitle, subtitle: this.s.resultApprovedSubtitle,\n };\n case 'rejected': {\n const note = this.response()?.note;\n return {\n icon: 'close', color: 'var(--naya-error)',\n title: this.s.resultRejectedTitle,\n subtitle: note ? `${this.s.resultRejectedReason} : ${note}` : '',\n };\n }\n default:\n return {\n icon: 'clock', color: 'var(--naya-warning)',\n title: this.s.resultReviewTitle, subtitle: this.s.resultReviewSubtitle,\n };\n }\n });\n\n readonly fullName = computed(() => {\n const ocr = this.response()?.ocrData;\n return [ocr?.firstName, ocr?.lastName].filter((p) => p && p.length).join(' ');\n });\n\n readonly reference = computed(() => {\n const id = this.flow.session()?.verificationId;\n return id ? id.split('-')[0].toUpperCase() : '—';\n });\n\n readonly reviewBullets = computed(() => [\n this.s.resultReviewB1,\n this.s.resultReviewB2,\n this.s.resultReviewB3,\n ]);\n\n // Des données ont été extraites : l'app cliente prend le relais → « Continuer ».\n readonly doneLabel = computed(() =>\n this.response()?.ocrData ? this.s.continueLabel : this.s.backToApp,\n );\n\n retry(): void {\n this.flow.resetForRetry();\n this.flow.replace('capture-recto');\n }\n\n done(): void {\n const r = this.response();\n this.flow.complete({\n status: this.status(),\n verificationId: this.flow.session()?.verificationId,\n riskScore: r?.riskScore,\n matchScore: r?.matchScore,\n authenticityScore: r?.authenticityScore,\n livenessScore: r?.livenessScore,\n ocrConfidence: r?.ocrConfidence,\n ocrData: r?.ocrData,\n note: r?.note,\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n HostListener,\n inject,\n} from '@angular/core';\nimport { NayaFlowService } from './naya-flow.service';\nimport { buildThemeVars } from '../theme/naya-theme';\nimport { WelcomeScreen } from '../screens/welcome.screen';\nimport { DocumentSelectionScreen } from '../screens/document-selection.screen';\nimport { DocumentCaptureScreen } from '../screens/document-capture.screen';\nimport { LivenessScreen } from '../screens/liveness.screen';\nimport { ProcessingScreen } from '../screens/processing.screen';\nimport { ResultScreen } from '../screens/result.screen';\n\n/**\n * Hôte du parcours : conteneur plein écran monté au-dessus de l'application,\n * fournisseur du `NayaFlowService`, et routeur d'étapes. Équivalent de\n * `NayaFlowHost` (Flutter), le Navigator imbriqué étant remplacé par un\n * `@switch` piloté par le signal `step`.\n *\n * Le thème est appliqué en variables CSS sur l'élément hôte : les styles du\n * SDK n'affectent pas l'application, et inversement.\n */\n@Component({\n selector: 'naya-flow-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [NayaFlowService],\n imports: [\n WelcomeScreen,\n DocumentSelectionScreen,\n DocumentCaptureScreen,\n LivenessScreen,\n ProcessingScreen,\n ResultScreen,\n ],\n template: `\n @switch (flow.step()) {\n @case ('welcome') { <naya-welcome-screen /> }\n @case ('select') { <naya-document-selection-screen /> }\n @case ('capture-recto') { <naya-document-capture-screen side=\"recto\" /> }\n @case ('capture-verso') { <naya-document-capture-screen side=\"verso\" /> }\n @case ('liveness') { <naya-liveness-screen /> }\n @case ('processing') { <naya-processing-screen /> }\n @case ('result') { <naya-result-screen /> }\n }\n `,\n styles: [`\n :host {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n display: block;\n background: var(--naya-bg);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n }\n :host, :host * { box-sizing: border-box; }\n `],\n})\nexport class NayaFlowHostComponent {\n readonly flow = inject(NayaFlowService);\n\n /** Variables de thème posées sur l'hôte (dictionnaire → style inline). */\n @HostBinding('style') get style(): Record<string, string> {\n return buildThemeVars(this.flow.resolvedConfig);\n }\n\n /** Échap ferme le parcours (annulation), comme le bouton système Android. */\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.flow.cancel();\n }\n}\n","import {\n type ApplicationRef,\n type EnvironmentInjector,\n createComponent,\n} from '@angular/core';\nimport type { NayaAuth, ResolvedNayaConfig } from '../models/naya-config';\nimport { type NayaResult, errorResult } from '../models/naya-result';\nimport { NayaFlowService } from './naya-flow.service';\nimport { NayaFlowHostComponent } from './naya-flow-host.component';\n\n/**\n * Monte l'hôte du parcours en plein écran, au-dessus de l'application, et\n * résout le `NayaResult` à la fermeture.\n *\n * Aucune dépendance à `@angular/cdk` : l'overlay est un composant créé\n * dynamiquement (`createComponent`), attaché à `ApplicationRef` et inséré dans\n * `document.body`. Le composant et tout l'arbre d'écrans sont importés ici, si\n * bien qu'ils restent hors du bundle initial de l'application (import différé\n * depuis `NayaIdService`).\n */\nexport async function mountNayaFlow(\n refs: { appRef: ApplicationRef; environmentInjector: EnvironmentInjector },\n auth: NayaAuth,\n config: ResolvedNayaConfig,\n): Promise<NayaResult> {\n if (typeof document === 'undefined') {\n return errorResult('Le SDK Naya nécessite un environnement navigateur.');\n }\n\n const componentRef = createComponent(NayaFlowHostComponent, {\n environmentInjector: refs.environmentInjector,\n });\n\n const flow = componentRef.injector.get(NayaFlowService);\n const previousOverflow = document.body.style.overflow;\n\n return new Promise<NayaResult>((resolve) => {\n let settled = false;\n const finish = (result: NayaResult) => {\n if (settled) return;\n settled = true;\n // Restauration puis démontage : l'ordre évite un flash de l'application.\n document.body.style.overflow = previousOverflow;\n refs.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n resolve(result);\n };\n\n // `init` avant tout rendu : le thème et les écrans lisent la config résolue.\n flow.init({ auth, config, finish });\n\n refs.appRef.attachView(componentRef.hostView);\n document.body.appendChild(componentRef.location.nativeElement);\n document.body.style.overflow = 'hidden'; // fige le défilement de l'app\n componentRef.changeDetectorRef.detectChanges();\n });\n}\n"],"names":[],"mappings":"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"}
|