@baas-id/react 0.3.0 → 0.3.5

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.
Files changed (39) hide show
  1. package/README.md +2 -2
  2. package/dist/esm/baas-id-react.css +1 -1
  3. package/dist/esm/chunks/ContinueFlow-C2PNt2ZN.js +10122 -0
  4. package/dist/esm/continue.js +1 -1
  5. package/dist/esm/index.js +2 -2
  6. package/dist/esm/preview.js +22 -22
  7. package/dist/esm/workers/{detector.worker-DrerkwUk.js → detector.worker-Bpzz3rZ5.js} +1191 -1191
  8. package/dist/types/react/capture/keyframes.d.ts +8 -1
  9. package/dist/types/react/document/CardFrame.d.ts +11 -0
  10. package/dist/types/react/document/cornerOrder.d.ts +1 -0
  11. package/dist/types/react/document/follow.d.ts +26 -0
  12. package/dist/types/react/document/resolution.d.ts +1 -0
  13. package/dist/types/react/document/review.d.ts +1 -1
  14. package/dist/types/react/document/sideCheck.d.ts +1 -0
  15. package/dist/types/react/document/stats.d.ts +1 -1
  16. package/dist/types/react/document/steady.d.ts +0 -6
  17. package/dist/types/react/document/upright.d.ts +1 -0
  18. package/dist/types/react/document/useDocumentCapture.d.ts +23 -2
  19. package/dist/types/react/face/bestFrame.d.ts +17 -0
  20. package/dist/types/react/face/faceView.d.ts +3 -0
  21. package/dist/types/react/face/runLiveness.d.ts +2 -0
  22. package/dist/types/react/flows/FlowShell.d.ts +2 -0
  23. package/dist/types/react/flows/types.d.ts +1 -0
  24. package/dist/types/react/handoff/ContinueFlow.d.ts +15 -2
  25. package/dist/types/react/handoff/ContinueOnPhone.d.ts +19 -1
  26. package/dist/types/react/handoff/api.d.ts +5 -0
  27. package/dist/types/react/i18n/types.d.ts +12 -0
  28. package/dist/types/react/theme/scheme.d.ts +17 -0
  29. package/dist/types/react/version.d.ts +1 -1
  30. package/dist/types/react/vision/corners.d.ts +1 -1
  31. package/dist/types/react/vision/face.d.ts +13 -0
  32. package/dist/types/react/vision/quality.d.ts +5 -2
  33. package/dist/types/react/vision/refine.d.ts +71 -0
  34. package/dist/types/react/vision/tinyDetector.d.ts +6 -0
  35. package/dist/types/react/vision/types.d.ts +9 -2
  36. package/package.json +1 -1
  37. package/dist/esm/chunks/ContinueFlow-vn9wv0tZ.js +0 -9147
  38. package/dist/types/react/document/flow.d.ts +0 -52
  39. package/dist/types/react/document/latch.d.ts +0 -25
@@ -11,9 +11,16 @@ export declare function keyframeSize(w: number, h: number, maxSide?: number): {
11
11
  h: number;
12
12
  };
13
13
  export declare function admit(tags: readonly string[], tag: string, max?: number): boolean;
14
+ type Frame = HTMLVideoElement | HTMLCanvasElement;
14
15
  export declare class KeyframeRecorder {
15
16
  private pending;
16
17
  private tags;
17
- grab(video: HTMLVideoElement | null, tag: string, tMs: number): void;
18
+ private best;
19
+ private copy;
20
+ private encode;
21
+ offer(src: Frame | null, tag: string, tMs: number, score: number): void;
22
+ commit(tag: string, fallback: Frame | null, tMs: number): void;
23
+ grab(frame: Frame | null, tag: string, tMs: number): void;
18
24
  collect(): Promise<Keyframe[]>;
19
25
  }
26
+ export {};
@@ -1,6 +1,17 @@
1
1
  import type { Strings } from "../i18n";
2
+ import { type Quad } from "./overlay";
2
3
  import type { QuadSource } from "./track";
3
4
  export type FrameState = "searching" | "tracking" | "holding" | "locked";
5
+ export interface OutlinePath {
6
+ d: string;
7
+ length: number;
8
+ corners: Array<[number, number]>;
9
+ sides: number[];
10
+ }
11
+ export declare function outlinePath(q: Quad, radius: number): OutlinePath;
12
+ export type Dash = readonly [string, string];
13
+ export declare function dashOnly(from: number, to: number, length: number): Dash;
14
+ export declare function dashProgress(o: OutlinePath, pct: number): Dash;
4
15
  export declare function CardFrame({ source, pct, state, label, t, }: {
5
16
  source: QuadSource | null;
6
17
  pct: number;
@@ -31,6 +31,7 @@ export declare class CornerOrder {
31
31
  read(raw: Quad, fromModel: boolean, orient?: readonly number[] | null): Quad;
32
32
  private canonLock;
33
33
  rotationFor(stable: Quad): number;
34
+ headRotation(): number | null;
34
35
  settle(held: Quad, k: number): number;
35
36
  flip(stable: Quad): number;
36
37
  orientQuad(q: Quad): Quad;
@@ -0,0 +1,26 @@
1
+ import type { Quad } from "./overlay";
2
+ export declare const FOLLOW_TAU_MS = 40;
3
+ export declare const HOLD_MS = 350;
4
+ export declare const JUMP = 0.25;
5
+ export declare const TOUCH_SHIFT = 0.03;
6
+ export declare const TOUCH_SCALE = 1.1;
7
+ export declare const TOUCH_MAX_MS = 500;
8
+ export declare class CardFollower {
9
+ private meas;
10
+ private measAt;
11
+ private shown;
12
+ private shownAt;
13
+ private gap;
14
+ measure(q: Quad, t: number): void;
15
+ private lastReal;
16
+ private hold;
17
+ touch(box: {
18
+ left: number;
19
+ top: number;
20
+ right: number;
21
+ bottom: number;
22
+ }, t: number): boolean;
23
+ last(t: number, maxAge?: number): Quad | null;
24
+ at(now: number): Quad | null;
25
+ reset(): void;
26
+ }
@@ -7,6 +7,7 @@ export interface Box {
7
7
  export declare const WORK_LONG_SIDE = 1280;
8
8
  export declare const UPLOAD_LONG_MAX = 1600;
9
9
  export declare const UPLOAD_MARGIN = 0.03;
10
+ export declare const RECT_MARGIN = 0.015;
10
11
  export declare const UPLOAD_JPEG_QUALITY = 0.9;
11
12
  export declare const EXTRA_JPEG_QUALITY = 0.85;
12
13
  export declare const EXTRA_JPEG_QUALITY_LOW = 0.75;
@@ -69,7 +69,7 @@ export interface CardInset {
69
69
  x: number;
70
70
  y: number;
71
71
  }
72
- export declare function cardInset(margin: number, aspect?: number): CardInset;
72
+ export declare function cardInset(margin: number, _aspect?: number): CardInset;
73
73
  export interface ReviewView {
74
74
  image: string;
75
75
  aspect: number;
@@ -17,6 +17,7 @@ export type SideOutcome = {
17
17
  suggest: "continue" | "retake";
18
18
  } & SideCopy);
19
19
  export declare function sideOutcomeOf(side: Side, res: unknown): SideOutcome;
20
+ export declare const QUALITY_RETAKE_REASONS: readonly string[];
20
21
  export declare function fallbackCopy(o: Exclude<SideOutcome, {
21
22
  kind: "ok";
22
23
  }>, side: Side, t: Strings): {
@@ -10,7 +10,7 @@ export declare class CaptureStats {
10
10
  private coach;
11
11
  private mode;
12
12
  constructor(t0: number);
13
- frame(found: boolean, confidence: number, veto?: "geometry" | "edges" | "content"): void;
13
+ frame(found: boolean, confidence: number, veto?: "geometry" | "edges" | "content" | "face", relaxed?: "held" | "stable"): void;
14
14
  outline(mode: "edges" | "box" | null): void;
15
15
  tick(gate: Gate | null, pFront: number | null, motion: number | null, stillOk: boolean | null, hold: number, coach: string): void;
16
16
  searching(coach: string): void;
@@ -82,9 +82,3 @@ export declare class OneEuro {
82
82
  filter(v: number, t: number): number;
83
83
  reset(): void;
84
84
  }
85
- export declare class CornerFilter {
86
- private f;
87
- constructor(minCutoff?: number, beta?: number);
88
- filter(q: Quad, t: number): Quad;
89
- reset(): void;
90
- }
@@ -3,3 +3,4 @@ export type Turn = 0 | 90 | 180 | 270;
3
3
  export declare function rotateCanvas(src: HTMLCanvasElement, deg: Turn): HTMLCanvasElement;
4
4
  export declare function uprightFace(f: FaceDetection): boolean;
5
5
  export declare function portraitTurn(crop: HTMLCanvasElement, faces: (c: HTMLCanvasElement) => Promise<FaceDetection[]>): Promise<Turn | null>;
6
+ export declare function uprightAt(crop: HTMLCanvasElement, faces: (c: HTMLCanvasElement) => Promise<FaceDetection[]>, deg: Turn): Promise<boolean>;
@@ -4,7 +4,7 @@ import { type Chip, type Guidance, type Phase } from "./gate";
4
4
  import { type MrzStage } from "./mrz";
5
5
  import { type Advisory } from "./advisory";
6
6
  import { type Box, type Quad } from "./overlay";
7
- import { type QuadSource } from "./track";
7
+ import type { QuadSource } from "./track";
8
8
  import { type ReviewView } from "./review";
9
9
  export interface SnapshotFrom {
10
10
  l: number;
@@ -20,13 +20,34 @@ export interface Snapshot {
20
20
  export declare const LOCK_MS = 520;
21
21
  export declare const REVIEW_MS = 2600;
22
22
  export declare const CROP_TURN_MIN = 1;
23
- export declare const OUTLINE_BETA = 0.015;
24
23
  export declare const FLIP_MANUAL_MS = 15000;
24
+ export declare const TURN_HEAD_MIN = 0.6;
25
+ export declare const CONFIRM_MS = 700;
26
+ export declare const CONFIRM_SHAPE = 0.015;
27
+ export declare function confirmed(q: Quad, prev: {
28
+ q: Quad;
29
+ t: number;
30
+ } | null, t: number): boolean;
25
31
  export declare function cutUpload(full: HTMLCanvasElement, b: Box): HTMLCanvasElement;
32
+ export declare function poseShape(c: {
33
+ quad: unknown;
34
+ aspect: number;
35
+ tilt: number;
36
+ } | null | undefined): {
37
+ aspect: number;
38
+ tilt: number;
39
+ } | null;
40
+ export declare function heldPortrait(q: Quad): boolean;
26
41
  export interface UploadCandidate {
27
42
  canvas: HTMLCanvasElement;
28
43
  quad: Quad | null;
29
44
  }
45
+ export declare const AGREE_MAX = 0.006;
46
+ export declare function confirmCorners(c: UploadCandidate, cam: {
47
+ focal: number;
48
+ cx: number;
49
+ cy: number;
50
+ }): UploadCandidate;
30
51
  export declare function cutCard(full: HTMLCanvasElement, b: Box, quad?: Quad | null): UploadCandidate;
31
52
  export declare function useDocumentCapture(props: DocumentCaptureProps): {
32
53
  t: import("../i18n").Strings;
@@ -0,0 +1,17 @@
1
+ import type { FaceSignals } from "../liveness";
2
+ export declare const PROBE_YAW_MAX = 0.15;
3
+ export declare const PROBE_YAW_CONFIDENCE_MIN = 0.45;
4
+ export declare const PROBE_FILL_MIN = 0.6;
5
+ export declare const PROBE_SHARP_REF = 300;
6
+ export interface ProbeStats {
7
+ sharpness: number;
8
+ luma: number;
9
+ }
10
+ export declare function probeScore(sig: FaceSignals, stats: ProbeStats | null): number;
11
+ export declare class BestFrame {
12
+ private canvas;
13
+ score: number;
14
+ offered: number;
15
+ offer(frame: HTMLCanvasElement | null, score: number): boolean;
16
+ get frame(): HTMLCanvasElement | null;
17
+ }
@@ -6,6 +6,7 @@ export interface Ellipse {
6
6
  rx: number;
7
7
  ry: number;
8
8
  }
9
+ export declare const FACE_LANDSCAPE_AR: number;
9
10
  export declare const faceViewMap: (srcW: number, srcH: number, viewW: number, viewH: number) => ViewMap;
10
11
  export declare function ovalToView(o: Ellipse, m: ViewMap): Ellipse;
11
12
  export declare function trackPoints(g: FaceGeometry): Pt[];
@@ -16,6 +17,8 @@ export interface FaceMark {
16
17
  mouth?: Pt;
17
18
  ears?: [Pt, Pt];
18
19
  }
20
+ export declare const FACE_W_H_MIN = 0.72;
21
+ export declare const FACE_W_H_MAX = 0.8;
19
22
  export declare function faceMarkToView(pts: readonly Pt[], srcW: number, srcH: number, m: ViewMap): FaceMark | null;
20
23
  export declare const ovalFill: (faceW: number, oval: Ellipse) => number;
21
24
  export declare function ellipsePath(e: Ellipse): string;
@@ -13,6 +13,7 @@ export interface LivenessIo {
13
13
  strings(): Strings;
14
14
  now(): number;
15
15
  keyframe?(tag: string): void;
16
+ keyframeOffer?(tag: string, score: number): void;
16
17
  }
17
18
  export interface LivenessUi {
18
19
  locked(): void;
@@ -34,4 +35,5 @@ export type LivenessResult = {
34
35
  } | {
35
36
  k: "aborted";
36
37
  };
38
+ export declare function movementScore(kind: ChallengeKind, sig: FaceSignals): number;
37
39
  export declare function runLiveness(script: ChallengeKind[], tracker: LivenessTracker, io: LivenessIo, ui: LivenessUi): Promise<LivenessResult>;
@@ -23,6 +23,8 @@ export declare function StepRail({ step, t, plan, retakes, }: {
23
23
  plan?: readonly CaptureId[];
24
24
  retakes?: Partial<Record<Side, RetakeNotice>>;
25
25
  }): import("react").JSX.Element;
26
+ export declare function watchModality(): () => void;
27
+ export declare function focusTitle(el: HTMLElement): void;
26
28
  export declare function RetakeNoticeLine({ notice, side, t }: {
27
29
  notice: RetakeNotice;
28
30
  side: Side;
@@ -229,6 +229,7 @@ export interface ConsentChoice {
229
229
  }
230
230
  export interface OpenSessionContext {
231
231
  consent?: ConsentChoice;
232
+ previousSessionId?: string;
232
233
  }
233
234
  export interface VerificationFlowProps {
234
235
  apiUrl: string;
@@ -2,6 +2,11 @@ import { type Formality, type Locale, type StringOverrides, type Strings } from
2
2
  import type { RpidFlowEvent } from "../flows/types";
3
3
  import type { ColorScheme } from "../theme/scheme";
4
4
  export declare function readHandoffCode(search?: string, pathname?: string, hash?: string): string | null;
5
+ export declare function readLastLook(now?: number): {
6
+ locale?: string;
7
+ formality?: Formality;
8
+ } | null;
9
+ export declare const CONTINUE_DEFAULT_LOCALE: Locale;
5
10
  export interface ContinueFlowProps {
6
11
  apiUrl: string;
7
12
  code: string | null;
@@ -18,14 +23,22 @@ export interface ContinueFlowProps {
18
23
  verdict: string;
19
24
  reason: string | null;
20
25
  }) => void;
26
+ onLanguage?: (language: {
27
+ locale: Locale;
28
+ formality: Formality;
29
+ }) => void;
21
30
  }
22
- export declare function ContinueFlow({ apiUrl, code, modelsUrl, locale: hostLocale, strings, formality, colorScheme, privacyNote, source, debug, onEvent, onDone, }: ContinueFlowProps): import("react").JSX.Element;
31
+ export declare function ContinueFlow({ apiUrl, code, modelsUrl, locale: hostLocale, strings, formality, colorScheme, privacyNote, source, debug, onEvent, onDone, onLanguage, }: ContinueFlowProps): import("react").JSX.Element;
23
32
  export declare function ContinueConfirmView({ t, tenant, codeHint, onContinue }: {
24
33
  t: Strings;
25
34
  tenant: string;
26
35
  codeHint: string;
27
36
  onContinue?: () => void;
28
37
  }): import("react").JSX.Element;
29
- export declare function ContinueDoneView({ t }: {
38
+ export type DoneStep = "front" | "back" | "face";
39
+ export declare function ContinueDoneView({ t, tenant, codeHint, steps }: {
30
40
  t: Strings;
41
+ tenant?: string | null;
42
+ codeHint?: string | null;
43
+ steps?: readonly DoneStep[];
31
44
  }): import("react").JSX.Element;
@@ -11,6 +11,11 @@ export interface HandoffCopy {
11
11
  body?: string;
12
12
  }
13
13
  export declare const POLL_MS = 2000;
14
+ export declare function linkOnce(config: RpidClientConfig, previous: {
15
+ sessionId: string;
16
+ captureToken: string;
17
+ }): void;
18
+ export declare function resetLinkedPairs(): void;
14
19
  export interface HandoffPanelProps {
15
20
  config: RpidClientConfig;
16
21
  t: Strings;
@@ -23,6 +28,16 @@ export interface HandoffPanelProps {
23
28
  onEvent?: (e: RpidFlowEvent) => void;
24
29
  pollMs?: number;
25
30
  }
31
+ export declare const FOLLOW_KEY = "rpid.handoff.follow";
32
+ interface FollowRecord {
33
+ apiUrl: string;
34
+ sessionId: string;
35
+ captureToken: string;
36
+ at: number;
37
+ }
38
+ export declare function rememberFollow(cfg: RpidClientConfig): void;
39
+ export declare function forgetFollow(sessionId?: string): void;
40
+ export declare function readFollow(): FollowRecord | null;
26
41
  export declare function HandoffPanel({ config, t, mode, copy, onResult, onContinueHere, onError, onFailed, onEvent, pollMs, }: HandoffPanelProps): import("react").JSX.Element;
27
42
  export interface HandoffViewProps {
28
43
  t: Strings;
@@ -50,8 +65,10 @@ export interface HandoffViewProps {
50
65
  final: boolean;
51
66
  } | null;
52
67
  onAgain?: () => void;
68
+ retrying?: boolean;
69
+ resumed?: boolean;
53
70
  }
54
- export declare function HandoffView({ t, mode, copy, link, leftMs, expired, failed, phase, device, copied, linkId, onCopy, onNewCode, onContinueHere, stopped, onAgain, }: HandoffViewProps): import("react").JSX.Element;
71
+ export declare function HandoffView({ t, mode, copy, link, leftMs, expired, failed, phase, device, copied, linkId, onCopy, onNewCode, onContinueHere, stopped, onAgain, retrying, resumed, }: HandoffViewProps): import("react").JSX.Element;
55
72
  export declare function CodeChip({ t, code, instruction }: {
56
73
  t: Strings;
57
74
  code: string;
@@ -74,3 +91,4 @@ export interface ContinueOnPhoneProps {
74
91
  colorScheme?: ColorScheme;
75
92
  }
76
93
  export declare function ContinueOnPhone(props: ContinueOnPhoneProps): import("react").JSX.Element;
94
+ export {};
@@ -28,6 +28,10 @@ export interface HandoffStatus {
28
28
  export declare function createHandoff(cfg: RpidClientConfig, device?: string, signal?: AbortSignal): Promise<HandoffCode>;
29
29
  export declare function handoffStatus(cfg: RpidClientConfig, signal?: AbortSignal): Promise<HandoffStatus>;
30
30
  export declare function revokeHandoff(cfg: RpidClientConfig, reason: "continue_here" | "cancel"): Promise<void>;
31
+ export declare function linkSession(cfg: RpidClientConfig, previous: {
32
+ sessionId: string;
33
+ captureToken: string;
34
+ }): Promise<boolean>;
31
35
  export interface HandoffPeek {
32
36
  tenant: string;
33
37
  codeHint: string;
@@ -43,6 +47,7 @@ export interface CallLanguage {
43
47
  formality?: "formal" | "informal";
44
48
  }
45
49
  export declare function peekHandoff(apiUrl: string, code: string, signal?: AbortSignal, lang?: CallLanguage): Promise<HandoffPeek>;
50
+ export declare function refusalLanguage(e: unknown): CallLanguage | null;
46
51
  export declare function claimHandoff(apiUrl: string, code: string, device?: string, signal?: AbortSignal, lang?: CallLanguage): Promise<Json>;
47
52
  export declare function reportProgress(cfg: RpidClientConfig, step: "front" | "back" | "face"): Promise<void>;
48
53
  export declare function reportPhone(cfg: RpidClientConfig, event: "heartbeat" | "failed" | "abandoned", info?: {
@@ -138,6 +138,8 @@ export interface Strings {
138
138
  notBackBody: string;
139
139
  noPortraitTitle: string;
140
140
  noPortraitBody: string;
141
+ qualityTitle: string;
142
+ qualityBody: string;
141
143
  backMismatchTitle: string;
142
144
  backMismatchBody: string;
143
145
  frontMismatchTitle: string;
@@ -206,6 +208,16 @@ export interface Strings {
206
208
  phoneClosedBody: string;
207
209
  resumeOnPhone: string;
208
210
  continueHereShort: string;
211
+ phoneRetryWait: string;
212
+ retrying: string;
213
+ resumed: string;
214
+ doneHeading: string;
215
+ doneSent: string;
216
+ doneOnComputer: string;
217
+ doneFor: string;
218
+ doneCode: string;
219
+ doneClose: string;
220
+ doneCloseHint: string;
209
221
  stepWaiting: string;
210
222
  stepConnected: string;
211
223
  stepCapturing: string;
@@ -19,5 +19,22 @@ export declare function darkPalette(a?: Appearance | null): {
19
19
  };
20
20
  export declare function darkGroups(a?: Appearance | null): Array<Record<string, string>>;
21
21
  export declare const DARK_DERIVED: Record<string, string>;
22
+ export declare function parseCssColor(c: string | null | undefined): [number, number, number, number] | null;
23
+ export declare function relLuminance([r, g, b]: readonly number[]): number;
24
+ export declare const ratioOf: (a: readonly number[], b: readonly number[]) => number;
25
+ export type SchemeSource = "prop" | "page" | "color-scheme" | "device";
26
+ export declare function effectiveBackground(from: Element | null): [number, number, number] | null;
27
+ export declare function hostScheme(from: Element | null): {
28
+ scheme: "light" | "dark";
29
+ from: SchemeSource;
30
+ } | null;
31
+ export declare function useSchemeOf(pref: ColorScheme | undefined, ref?: {
32
+ current: Element | null;
33
+ }): {
34
+ scheme: "light" | "dark";
35
+ from: SchemeSource;
36
+ rev: number;
37
+ };
22
38
  export declare function useColorScheme(pref: ColorScheme | undefined): "light" | "dark";
39
+ export declare function guardInk(ink: readonly number[] | null, grounds: ReadonlyArray<readonly number[]>): string | null;
23
40
  export declare const isColorScheme: (v: unknown) => v is ColorScheme;
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "0.3.0";
1
+ export declare const SDK_VERSION = "0.3.5";
@@ -34,7 +34,7 @@ export interface CornerResult {
34
34
  aspect: number;
35
35
  contrast: number;
36
36
  reason: CornerReason | null;
37
- via: "edges" | "hint" | "model" | null;
37
+ via: "edges" | "hint" | "model" | "refined" | null;
38
38
  orient?: [number, number, number, number];
39
39
  }
40
40
  export interface CornerOptions {
@@ -6,12 +6,25 @@ type Oval = {
6
6
  rx: number;
7
7
  ry: number;
8
8
  };
9
+ export declare const SQUARE_SIDE = 384;
10
+ export declare function letterboxSquare(W: number, H: number, side: number): {
11
+ k: number;
12
+ x: number;
13
+ y: number;
14
+ };
15
+ export declare function fromSquare(f: FaceDetection, lb: {
16
+ k: number;
17
+ x: number;
18
+ y: number;
19
+ }): FaceDetection;
9
20
  export interface FaceDetection {
10
21
  topLeft: [number, number];
11
22
  bottomRight: [number, number];
12
23
  landmarks: Array<[number, number]>;
13
24
  }
14
25
  export declare function signalsFromDetection(f: FaceDetection | null, W: number, H: number, brightness: number, oval: Oval): FaceSignals;
26
+ export declare const FACE_W_PER_IOD = 2.03;
27
+ export declare function faceWidthFrom(landmarks: Array<[number, number]>, x1: number, x2: number, W: number, H: number): number;
15
28
  export declare function ovalContainment(pts: Array<[number, number]>, oval: Oval): number;
16
29
  export declare const loadFaceEngine: (modelsUrl: string, onProgress?: ProgressFn) => Promise<FaceEngine>;
17
30
  export {};
@@ -1,7 +1,10 @@
1
1
  import type { CropQuality } from "./types";
2
- export declare function cropQuality(crop: HTMLCanvasElement): CropQuality;
2
+ export declare function cropQuality(crop: HTMLCanvasElement, card?: ReadonlyArray<{
3
+ x: number;
4
+ y: number;
5
+ }> | null): CropQuality;
3
6
  export declare function lightingOf(brightness: number): "good" | "too_dark" | "too_bright";
4
- export declare function frameLuma(video: HTMLVideoElement): number;
7
+ export declare function frameLuma(video: HTMLVideoElement | HTMLCanvasElement): number;
5
8
  export declare function cropCanvas(source: HTMLCanvasElement, box: {
6
9
  left: number;
7
10
  top: number;
@@ -0,0 +1,71 @@
1
+ import { type Quad } from "./corners";
2
+ export interface Luma {
3
+ data: Float32Array;
4
+ width: number;
5
+ height: number;
6
+ }
7
+ export interface Refined {
8
+ quad: Quad | null;
9
+ ok: boolean;
10
+ support: [number, number, number, number];
11
+ aspect: number;
12
+ tilt: number;
13
+ score: number;
14
+ reason: "ok" | "no_lines" | "no_card_shape" | "small";
15
+ }
16
+ export declare const BAND_OUT = 0.08;
17
+ export declare const BAND_IN = 0.24;
18
+ export declare const VALLEY = 2;
19
+ export declare const NEAR = 0.035;
20
+ export declare const SCANS = 28;
21
+ export declare const SIDE_SUPPORT_MIN = 0.45;
22
+ export declare const MEAN_SUPPORT_MIN = 0.6;
23
+ export declare const REFINE_TILT_MAX = 50;
24
+ export declare const MAX_SHIFT = 0.2;
25
+ export declare const refineAspectTol: (tilt: number) => number;
26
+ interface Pt {
27
+ x: number;
28
+ y: number;
29
+ t: number;
30
+ sign: number;
31
+ mag: number;
32
+ }
33
+ interface Line {
34
+ px: number;
35
+ py: number;
36
+ dx: number;
37
+ dy: number;
38
+ support: number;
39
+ mag: number;
40
+ sign: number;
41
+ span: number;
42
+ }
43
+ export declare function sidePoints(g: Luma, a: {
44
+ x: number;
45
+ y: number;
46
+ }, b: {
47
+ x: number;
48
+ y: number;
49
+ }, cen: {
50
+ x: number;
51
+ y: number;
52
+ }, size: number, band?: {
53
+ out: number;
54
+ inn: number;
55
+ }): Pt[];
56
+ export declare function sideLines(pts: Pt[], ux: number, uy: number, max?: number): Line[];
57
+ export declare function refineQuad(g: Luma, coarse: Quad, cam: {
58
+ focal: number;
59
+ cx: number;
60
+ cy: number;
61
+ }, debug?: (x: unknown) => void, opts?: {
62
+ search?: boolean;
63
+ }): Refined;
64
+ export declare function trackQuad(g: Luma, hint: Quad, cam: {
65
+ focal: number;
66
+ cx: number;
67
+ cy: number;
68
+ }): Refined;
69
+ export declare const TRACK_BAND = 0.05;
70
+ export declare function lumaOfRegion(rgba: Uint8ClampedArray, width: number, height: number): Luma;
71
+ export {};
@@ -1,11 +1,17 @@
1
1
  import { type Quad } from "./corners";
2
2
  import type { CardDetection, DocumentEngine, ProgressFn } from "./types";
3
3
  export declare const TINY_FOLDERS: readonly ["card-tinydet-r6", "card-tinydet-r4"];
4
+ export declare const RELAX_STREAK = 3;
5
+ export declare const RELAX_MOTION = 0.04;
6
+ export declare const RELAX_DETAIL = 0.25;
7
+ export declare const RELAX_SIDES = 2;
8
+ export declare const FACE_FILL_MAX = 0.2;
4
9
  export declare const ORIENT_VOTE_MIN = 0.6;
5
10
  export declare const TINY_INPUT = 224;
6
11
  export declare const TINY_GRID = 28;
7
12
  export declare const FOUND_PEAK = 0.03;
8
13
  export declare const LOCK_PEAK = 0.05;
14
+ export declare const RESCUE_PEAK: number;
9
15
  export declare const MIN_AREA_FRAC = 0.02;
10
16
  export declare const EDGE_PRESENT = 0.25;
11
17
  export interface Letterbox {
@@ -13,7 +13,8 @@ export interface CardDetection {
13
13
  };
14
14
  weak?: boolean;
15
15
  corners?: FrameCorners;
16
- veto?: "geometry" | "edges" | "content";
16
+ veto?: "geometry" | "edges" | "content" | "face";
17
+ relaxed?: "held" | "stable";
17
18
  }
18
19
  export interface SideResult {
19
20
  isFront: boolean;
@@ -43,16 +44,22 @@ export interface DocumentEngine {
43
44
  cropTurn?(card: HTMLCanvasElement): Promise<{
44
45
  upsideDown: boolean;
45
46
  margin: number;
47
+ probs?: [number, number, number, number];
46
48
  } | null>;
47
49
  }
48
50
  export interface DetectOptions {
49
51
  corners?: {
50
52
  ks: number;
51
53
  hint?: Quad | null;
54
+ recent?: Quad | null;
55
+ faces?: (source: HTMLCanvasElement) => Promise<Array<{
56
+ topLeft: [number, number];
57
+ bottomRight: [number, number];
58
+ }>>;
52
59
  };
53
60
  }
54
61
  export interface FaceEngine {
55
- signals(video: HTMLVideoElement, oval: {
62
+ signals(video: HTMLVideoElement | HTMLCanvasElement, oval: {
56
63
  cx: number;
57
64
  cy: number;
58
65
  rx: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baas-id/react",
3
- "version": "0.3.0",
3
+ "version": "0.3.5",
4
4
  "description": "BaaS identity verification for React: guided ID and face capture with on-device quality gating, server-side verdicts, phone handoff. Requires a BaaS account.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "BaaS, S.A.",