@koraidv/react 1.7.7 → 1.7.8

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/dist/index.js CHANGED
@@ -2354,6 +2354,7 @@ function LivenessScreen({
2354
2354
  const canvasRef = (0, import_react8.useRef)(null);
2355
2355
  const [stream, setStream] = (0, import_react8.useState)(null);
2356
2356
  const [cameraError, setCameraError] = (0, import_react8.useState)(null);
2357
+ const [phase, setPhase] = (0, import_react8.useState)("preparing");
2357
2358
  const [countdown, setCountdown] = (0, import_react8.useState)(3);
2358
2359
  const [capturing, setCapturing] = (0, import_react8.useState)(false);
2359
2360
  (0, import_react8.useEffect)(() => {
@@ -2401,6 +2402,7 @@ function LivenessScreen({
2401
2402
  }, [stream]);
2402
2403
  (0, import_react8.useEffect)(() => {
2403
2404
  if (!currentChallenge) return;
2405
+ setPhase("preparing");
2404
2406
  setCountdown(3);
2405
2407
  }, [currentChallenge?.id]);
2406
2408
  const captureFrame = (0, import_react8.useCallback)(async () => {
@@ -2429,12 +2431,17 @@ function LivenessScreen({
2429
2431
  (0, import_react8.useEffect)(() => {
2430
2432
  if (!currentChallenge || capturing) return;
2431
2433
  if (countdown === 0) {
2432
- captureFrame();
2434
+ if (phase === "preparing") {
2435
+ setPhase("capturing");
2436
+ setCountdown(3);
2437
+ } else {
2438
+ captureFrame();
2439
+ }
2433
2440
  return;
2434
2441
  }
2435
2442
  const t = setTimeout(() => setCountdown((c) => c - 1), 1e3);
2436
2443
  return () => clearTimeout(t);
2437
- }, [countdown, currentChallenge?.id, capturing, captureFrame]);
2444
+ }, [countdown, currentChallenge?.id, capturing, captureFrame, phase]);
2438
2445
  (0, import_react8.useEffect)(() => {
2439
2446
  if (session && !currentChallenge && completedChallenges > 0) {
2440
2447
  onComplete();
@@ -2460,15 +2467,17 @@ function LivenessScreen({
2460
2467
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h1", { style: styles.darkScreenTitle, children: "Liveness Check" }),
2461
2468
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { style: styles.glassCloseButton, onClick: onCancel, children: "\u2715" })
2462
2469
  ] }),
2463
- currentChallenge && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { padding: "16px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { style: styles.challengeTitle, children: currentChallenge.instruction }) }),
2464
2470
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2465
2471
  "div",
2466
2472
  {
2467
2473
  style: {
2468
2474
  flex: 1,
2469
2475
  display: "flex",
2476
+ flexDirection: "column",
2470
2477
  alignItems: "center",
2471
- justifyContent: "center"
2478
+ justifyContent: "center",
2479
+ gap: "24px",
2480
+ padding: "16px 0"
2472
2481
  },
2473
2482
  children: [
2474
2483
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { position: "relative" }, children: [
@@ -2520,7 +2529,7 @@ function LivenessScreen({
2520
2529
  rx: "124",
2521
2530
  ry: "154",
2522
2531
  fill: "none",
2523
- stroke: colors.teal,
2532
+ stroke: phase === "capturing" ? colors.teal : "rgba(13,148,136,0.4)",
2524
2533
  strokeWidth: "5",
2525
2534
  strokeDasharray: `${completedChallenges / totalChallenges * 880} 880`,
2526
2535
  transform: "rotate(-90 128 158)",
@@ -2528,20 +2537,62 @@ function LivenessScreen({
2528
2537
  }
2529
2538
  )
2530
2539
  }
2531
- ),
2532
- currentChallenge && countdown > 0 && !capturing && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles.countdownBadge, children: countdown }),
2533
- capturing && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2534
- "div",
2535
- {
2536
- style: {
2537
- ...styles.countdownBadge,
2538
- fontSize: "14px",
2539
- padding: "8px 14px"
2540
- },
2541
- children: "Checking..."
2542
- }
2543
2540
  )
2544
2541
  ] }),
2542
+ currentChallenge && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2543
+ "div",
2544
+ {
2545
+ style: {
2546
+ textAlign: "center",
2547
+ padding: "20px 24px",
2548
+ borderRadius: "16px",
2549
+ backgroundColor: phase === "capturing" ? "rgba(13,148,136,0.18)" : "rgba(255,255,255,0.06)",
2550
+ border: phase === "capturing" ? `1px solid ${colors.teal}` : "1px solid rgba(255,255,255,0.08)",
2551
+ minWidth: "260px",
2552
+ transition: "background-color 200ms, border-color 200ms"
2553
+ },
2554
+ children: [
2555
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2556
+ "p",
2557
+ {
2558
+ style: {
2559
+ margin: 0,
2560
+ fontSize: "12px",
2561
+ fontWeight: 600,
2562
+ letterSpacing: "0.08em",
2563
+ textTransform: "uppercase",
2564
+ color: phase === "capturing" ? colors.teal : "rgba(255,255,255,0.5)"
2565
+ },
2566
+ children: capturing ? "Checking..." : phase === "preparing" ? "Get ready" : "Now \u2014 hold the pose"
2567
+ }
2568
+ ),
2569
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2570
+ "h2",
2571
+ {
2572
+ style: {
2573
+ ...styles.challengeTitle,
2574
+ margin: "8px 0 0",
2575
+ fontSize: "26px"
2576
+ },
2577
+ children: currentChallenge.instruction
2578
+ }
2579
+ ),
2580
+ !capturing && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2581
+ "p",
2582
+ {
2583
+ style: {
2584
+ margin: "12px 0 0",
2585
+ fontSize: "32px",
2586
+ fontWeight: 700,
2587
+ color: phase === "capturing" ? colors.teal : "rgba(255,255,255,0.75)",
2588
+ lineHeight: 1
2589
+ },
2590
+ children: countdown
2591
+ }
2592
+ )
2593
+ ]
2594
+ }
2595
+ ),
2545
2596
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("canvas", { ref: canvasRef, style: { display: "none" } })
2546
2597
  ]
2547
2598
  }
@@ -2573,7 +2624,7 @@ function LivenessScreen({
2573
2624
  fontSize: "13px",
2574
2625
  margin: 0
2575
2626
  },
2576
- children: "Position your face inside the oval and follow the prompt."
2627
+ children: phase === "preparing" ? "Position your face inside the oval. Get ready for the next prompt." : "Hold the pose until the capture completes."
2577
2628
  }
2578
2629
  ) })
2579
2630
  ] });
package/dist/index.mjs CHANGED
@@ -2305,6 +2305,7 @@ function LivenessScreen({
2305
2305
  const canvasRef = useRef4(null);
2306
2306
  const [stream, setStream] = useState5(null);
2307
2307
  const [cameraError, setCameraError] = useState5(null);
2308
+ const [phase, setPhase] = useState5("preparing");
2308
2309
  const [countdown, setCountdown] = useState5(3);
2309
2310
  const [capturing, setCapturing] = useState5(false);
2310
2311
  useEffect6(() => {
@@ -2352,6 +2353,7 @@ function LivenessScreen({
2352
2353
  }, [stream]);
2353
2354
  useEffect6(() => {
2354
2355
  if (!currentChallenge) return;
2356
+ setPhase("preparing");
2355
2357
  setCountdown(3);
2356
2358
  }, [currentChallenge?.id]);
2357
2359
  const captureFrame = useCallback4(async () => {
@@ -2380,12 +2382,17 @@ function LivenessScreen({
2380
2382
  useEffect6(() => {
2381
2383
  if (!currentChallenge || capturing) return;
2382
2384
  if (countdown === 0) {
2383
- captureFrame();
2385
+ if (phase === "preparing") {
2386
+ setPhase("capturing");
2387
+ setCountdown(3);
2388
+ } else {
2389
+ captureFrame();
2390
+ }
2384
2391
  return;
2385
2392
  }
2386
2393
  const t = setTimeout(() => setCountdown((c) => c - 1), 1e3);
2387
2394
  return () => clearTimeout(t);
2388
- }, [countdown, currentChallenge?.id, capturing, captureFrame]);
2395
+ }, [countdown, currentChallenge?.id, capturing, captureFrame, phase]);
2389
2396
  useEffect6(() => {
2390
2397
  if (session && !currentChallenge && completedChallenges > 0) {
2391
2398
  onComplete();
@@ -2411,15 +2418,17 @@ function LivenessScreen({
2411
2418
  /* @__PURE__ */ jsx9("h1", { style: styles.darkScreenTitle, children: "Liveness Check" }),
2412
2419
  /* @__PURE__ */ jsx9("button", { style: styles.glassCloseButton, onClick: onCancel, children: "\u2715" })
2413
2420
  ] }),
2414
- currentChallenge && /* @__PURE__ */ jsx9("div", { style: { padding: "16px 0" }, children: /* @__PURE__ */ jsx9("h2", { style: styles.challengeTitle, children: currentChallenge.instruction }) }),
2415
2421
  /* @__PURE__ */ jsxs8(
2416
2422
  "div",
2417
2423
  {
2418
2424
  style: {
2419
2425
  flex: 1,
2420
2426
  display: "flex",
2427
+ flexDirection: "column",
2421
2428
  alignItems: "center",
2422
- justifyContent: "center"
2429
+ justifyContent: "center",
2430
+ gap: "24px",
2431
+ padding: "16px 0"
2423
2432
  },
2424
2433
  children: [
2425
2434
  /* @__PURE__ */ jsxs8("div", { style: { position: "relative" }, children: [
@@ -2471,7 +2480,7 @@ function LivenessScreen({
2471
2480
  rx: "124",
2472
2481
  ry: "154",
2473
2482
  fill: "none",
2474
- stroke: colors.teal,
2483
+ stroke: phase === "capturing" ? colors.teal : "rgba(13,148,136,0.4)",
2475
2484
  strokeWidth: "5",
2476
2485
  strokeDasharray: `${completedChallenges / totalChallenges * 880} 880`,
2477
2486
  transform: "rotate(-90 128 158)",
@@ -2479,20 +2488,62 @@ function LivenessScreen({
2479
2488
  }
2480
2489
  )
2481
2490
  }
2482
- ),
2483
- currentChallenge && countdown > 0 && !capturing && /* @__PURE__ */ jsx9("div", { style: styles.countdownBadge, children: countdown }),
2484
- capturing && /* @__PURE__ */ jsx9(
2485
- "div",
2486
- {
2487
- style: {
2488
- ...styles.countdownBadge,
2489
- fontSize: "14px",
2490
- padding: "8px 14px"
2491
- },
2492
- children: "Checking..."
2493
- }
2494
2491
  )
2495
2492
  ] }),
2493
+ currentChallenge && /* @__PURE__ */ jsxs8(
2494
+ "div",
2495
+ {
2496
+ style: {
2497
+ textAlign: "center",
2498
+ padding: "20px 24px",
2499
+ borderRadius: "16px",
2500
+ backgroundColor: phase === "capturing" ? "rgba(13,148,136,0.18)" : "rgba(255,255,255,0.06)",
2501
+ border: phase === "capturing" ? `1px solid ${colors.teal}` : "1px solid rgba(255,255,255,0.08)",
2502
+ minWidth: "260px",
2503
+ transition: "background-color 200ms, border-color 200ms"
2504
+ },
2505
+ children: [
2506
+ /* @__PURE__ */ jsx9(
2507
+ "p",
2508
+ {
2509
+ style: {
2510
+ margin: 0,
2511
+ fontSize: "12px",
2512
+ fontWeight: 600,
2513
+ letterSpacing: "0.08em",
2514
+ textTransform: "uppercase",
2515
+ color: phase === "capturing" ? colors.teal : "rgba(255,255,255,0.5)"
2516
+ },
2517
+ children: capturing ? "Checking..." : phase === "preparing" ? "Get ready" : "Now \u2014 hold the pose"
2518
+ }
2519
+ ),
2520
+ /* @__PURE__ */ jsx9(
2521
+ "h2",
2522
+ {
2523
+ style: {
2524
+ ...styles.challengeTitle,
2525
+ margin: "8px 0 0",
2526
+ fontSize: "26px"
2527
+ },
2528
+ children: currentChallenge.instruction
2529
+ }
2530
+ ),
2531
+ !capturing && /* @__PURE__ */ jsx9(
2532
+ "p",
2533
+ {
2534
+ style: {
2535
+ margin: "12px 0 0",
2536
+ fontSize: "32px",
2537
+ fontWeight: 700,
2538
+ color: phase === "capturing" ? colors.teal : "rgba(255,255,255,0.75)",
2539
+ lineHeight: 1
2540
+ },
2541
+ children: countdown
2542
+ }
2543
+ )
2544
+ ]
2545
+ }
2546
+ ),
2496
2547
  /* @__PURE__ */ jsx9("canvas", { ref: canvasRef, style: { display: "none" } })
2497
2548
  ]
2498
2549
  }
@@ -2524,7 +2575,7 @@ function LivenessScreen({
2524
2575
  fontSize: "13px",
2525
2576
  margin: 0
2526
2577
  },
2527
- children: "Position your face inside the oval and follow the prompt."
2578
+ children: phase === "preparing" ? "Position your face inside the oval. Get ready for the next prompt." : "Hold the pose until the capture completes."
2528
2579
  }
2529
2580
  ) })
2530
2581
  ] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koraidv/react",
3
- "version": "1.7.7",
3
+ "version": "1.7.8",
4
4
  "description": "Kora IDV React Components for Identity Verification",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -21,7 +21,7 @@
21
21
  "test": "vitest run"
22
22
  },
23
23
  "dependencies": {
24
- "@koraidv/core": "^1.7.7"
24
+ "@koraidv/core": "^1.7.8"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/react": "^18.2.0",