@casperid/react 1.1.0 → 2.0.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 +40 -29
- package/dist/index.cjs +1 -178
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +217 -3809
- package/dist/index.mjs.map +1 -1
- package/package.json +18 -19
- package/dist/_commonjsHelpers-DKOUU3wS.cjs +0 -2
- package/dist/_commonjsHelpers-DKOUU3wS.cjs.map +0 -1
- package/dist/_commonjsHelpers-DaMA6jEr.js +0 -9
- package/dist/_commonjsHelpers-DaMA6jEr.js.map +0 -1
- package/dist/camera_utils-BQaOSBPu.js +0 -397
- package/dist/camera_utils-BQaOSBPu.js.map +0 -1
- package/dist/camera_utils-wchtqrQn.cjs +0 -2
- package/dist/camera_utils-wchtqrQn.cjs.map +0 -1
- package/dist/face_mesh-DYMPc5Ce.js +0 -4212
- package/dist/face_mesh-DYMPc5Ce.js.map +0 -1
- package/dist/face_mesh-fEvyDoPt.cjs +0 -19
- package/dist/face_mesh-fEvyDoPt.cjs.map +0 -1
- package/dist/style.css +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/shared/GlassContainer.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-right.js","../node_modules/lucide-react/dist/esm/icons/badge-check.js","../node_modules/lucide-react/dist/esm/icons/calendar.js","../node_modules/lucide-react/dist/esm/icons/camera.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../node_modules/lucide-react/dist/esm/icons/circle-check.js","../node_modules/lucide-react/dist/esm/icons/circle-help.js","../node_modules/lucide-react/dist/esm/icons/credit-card.js","../node_modules/lucide-react/dist/esm/icons/delete.js","../node_modules/lucide-react/dist/esm/icons/fingerprint.js","../node_modules/lucide-react/dist/esm/icons/flashlight.js","../node_modules/lucide-react/dist/esm/icons/globe.js","../node_modules/lucide-react/dist/esm/icons/key.js","../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../node_modules/lucide-react/dist/esm/icons/lock.js","../node_modules/lucide-react/dist/esm/icons/mail.js","../node_modules/lucide-react/dist/esm/icons/moon.js","../node_modules/lucide-react/dist/esm/icons/network.js","../node_modules/lucide-react/dist/esm/icons/puzzle.js","../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../node_modules/lucide-react/dist/esm/icons/shield-check.js","../node_modules/lucide-react/dist/esm/icons/shield.js","../node_modules/lucide-react/dist/esm/icons/smartphone.js","../node_modules/lucide-react/dist/esm/icons/sparkles.js","../node_modules/lucide-react/dist/esm/icons/sun.js","../node_modules/lucide-react/dist/esm/icons/user.js","../node_modules/lucide-react/dist/esm/icons/wallet.js","../node_modules/lucide-react/dist/esm/icons/x.js","../src/shared/Header.tsx","../src/shared/Footer.tsx","../src/utils/i18n.ts","../src/screens/AuthSelection.tsx","../src/screens/Login.tsx","../src/utils/webauthn.ts","../src/screens/PasskeyAuth.tsx","../src/screens/PasskeyRegister.tsx","../src/screens/PinVerification.tsx","../src/screens/SecurityUpgrade.tsx","../src/screens/FaceScan.tsx","../src/screens/VerifyIdentityChoice.tsx","../src/screens/DocumentScan.tsx","../src/screens/ReviewData.tsx","../src/screens/MintingIdentity.tsx","../src/screens/IdentityVerified.tsx","../src/screens/PermissionsRequest.tsx","../src/CasperIDModal.tsx","../src/utils/fetchWithTimeout.ts"],"sourcesContent":["import React from 'react';\n\ninterface GlassContainerProps {\n children: React.ReactNode;\n className?: string;\n theme?: string; // Added theme prop\n}\n\nconst GlassContainer: React.FC<GlassContainerProps> = ({ children, className = '', theme = '' }) => ( // Destructure theme and provide default\n <div\n className={`glass-container relative w-full h-full rounded-[var(--casperid-radius,1.5rem)] overflow-hidden flex flex-col shadow-2xl border dark:border-white/10 border-white/40 ${className} ${theme}`} // Added theme to className\n >\n {children}\n </div>\n);\n\nexport default GlassContainer;\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n}).join(\" \");\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowRight = createLucideIcon(\"ArrowRight\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n]);\n\nexport { ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst BadgeCheck = createLucideIcon(\"BadgeCheck\", [\n [\n \"path\",\n {\n d: \"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\n key: \"3c2336\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { BadgeCheck as default };\n//# sourceMappingURL=badge-check.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Calendar = createLucideIcon(\"Calendar\", [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n]);\n\nexport { Calendar as default };\n//# sourceMappingURL=calendar.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Camera = createLucideIcon(\"Camera\", [\n [\n \"path\",\n {\n d: \"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\",\n key: \"1tc9qg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n]);\n\nexport { Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleAlert = createLucideIcon(\"CircleAlert\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n]);\n\nexport { CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheck = createLucideIcon(\"CircleCheck\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleHelp = createLucideIcon(\"CircleHelp\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { CircleHelp as default };\n//# sourceMappingURL=circle-help.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CreditCard = createLucideIcon(\"CreditCard\", [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"5\", rx: \"2\", key: \"ynyp8z\" }],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"10\", y2: \"10\", key: \"1b3vmo\" }]\n]);\n\nexport { CreditCard as default };\n//# sourceMappingURL=credit-card.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Delete = createLucideIcon(\"Delete\", [\n [\"path\", { d: \"M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Z\", key: \"1oy587\" }],\n [\"line\", { x1: \"18\", x2: \"12\", y1: \"9\", y2: \"15\", key: \"1olkx5\" }],\n [\"line\", { x1: \"12\", x2: \"18\", y1: \"9\", y2: \"15\", key: \"1n50pc\" }]\n]);\n\nexport { Delete as default };\n//# sourceMappingURL=delete.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Fingerprint = createLucideIcon(\"Fingerprint\", [\n [\"path\", { d: \"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\", key: \"1nerag\" }],\n [\"path\", { d: \"M14 13.12c0 2.38 0 6.38-1 8.88\", key: \"o46ks0\" }],\n [\"path\", { d: \"M17.29 21.02c.12-.6.43-2.3.5-3.02\", key: \"ptglia\" }],\n [\"path\", { d: \"M2 12a10 10 0 0 1 18-6\", key: \"ydlgp0\" }],\n [\"path\", { d: \"M2 16h.01\", key: \"1gqxmh\" }],\n [\"path\", { d: \"M21.8 16c.2-2 .131-5.354 0-6\", key: \"drycrb\" }],\n [\"path\", { d: \"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\", key: \"1tidbn\" }],\n [\"path\", { d: \"M8.65 22c.21-.66.45-1.32.57-2\", key: \"13wd9y\" }],\n [\"path\", { d: \"M9 6.8a6 6 0 0 1 9 5.2v2\", key: \"1fr1j5\" }]\n]);\n\nexport { Fingerprint as default };\n//# sourceMappingURL=fingerprint.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Flashlight = createLucideIcon(\"Flashlight\", [\n [\n \"path\",\n {\n d: \"M18 6c0 2-2 2-2 4v10a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2V10c0-2-2-2-2-4V2h12z\",\n key: \"1orkel\"\n }\n ],\n [\"line\", { x1: \"6\", x2: \"18\", y1: \"6\", y2: \"6\", key: \"1z11jq\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"12\", y2: \"12\", key: \"1f4yc1\" }]\n]);\n\nexport { Flashlight as default };\n//# sourceMappingURL=flashlight.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Globe = createLucideIcon(\"Globe\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n]);\n\nexport { Globe as default };\n//# sourceMappingURL=globe.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Key = createLucideIcon(\"Key\", [\n [\"path\", { d: \"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\", key: \"g0fldk\" }],\n [\"path\", { d: \"m21 2-9.6 9.6\", key: \"1j0ho8\" }],\n [\"circle\", { cx: \"7.5\", cy: \"15.5\", r: \"5.5\", key: \"yqb3hr\" }]\n]);\n\nexport { Key as default };\n//# sourceMappingURL=key.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"Lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Mail = createLucideIcon(\"Mail\", [\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }]\n]);\n\nexport { Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Moon = createLucideIcon(\"Moon\", [\n [\"path\", { d: \"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\", key: \"a7tn18\" }]\n]);\n\nexport { Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Network = createLucideIcon(\"Network\", [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n]);\n\nexport { Network as default };\n//# sourceMappingURL=network.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Puzzle = createLucideIcon(\"Puzzle\", [\n [\n \"path\",\n {\n d: \"M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.077.877.528 1.073 1.01a2.5 2.5 0 1 0 3.259-3.259c-.482-.196-.933-.558-1.01-1.073-.05-.336.062-.676.303-.917l1.525-1.525A2.402 2.402 0 0 1 12 1.998c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.237 3.237c-.464.18-.894.527-.967 1.02Z\",\n key: \"i0oyt7\"\n }\n ]\n]);\n\nexport { Puzzle as default };\n//# sourceMappingURL=puzzle.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RefreshCw = createLucideIcon(\"RefreshCw\", [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n]);\n\nexport { RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ShieldCheck = createLucideIcon(\"ShieldCheck\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"Shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Smartphone = createLucideIcon(\"Smartphone\", [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n]);\n\nexport { Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sparkles = createLucideIcon(\"Sparkles\", [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n]);\n\nexport { Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sun = createLucideIcon(\"Sun\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n]);\n\nexport { Sun as default };\n//# sourceMappingURL=sun.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst User = createLucideIcon(\"User\", [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n]);\n\nexport { User as default };\n//# sourceMappingURL=user.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Wallet = createLucideIcon(\"Wallet\", [\n [\n \"path\",\n {\n d: \"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\",\n key: \"18etb6\"\n }\n ],\n [\"path\", { d: \"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\", key: \"xoc0q4\" }]\n]);\n\nexport { Wallet as default };\n//# sourceMappingURL=wallet.js.map\n","/**\n * @license lucide-react v0.400.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","import React from 'react';\nimport { Shield, X, Sun, Moon } from 'lucide-react';\n\ninterface HeaderProps {\n onClose?: () => void;\n title?: string;\n subtitle?: string;\n showClose?: boolean;\n theme: 'light' | 'dark';\n toggleTheme: () => void;\n logoUrl?: string;\n}\n\nconst Header: React.FC<HeaderProps> = ({\n onClose,\n title = 'CasperID',\n subtitle = 'SECURE SDK',\n showClose = true,\n theme,\n toggleTheme,\n logoUrl,\n}) => (\n <header className=\"flex items-center justify-between px-6 pt-8 pb-4 relative z-20\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-brand rounded-xl flex items-center justify-center shadow-brand\">\n {logoUrl ? (\n <img src={logoUrl} alt={title} className=\"w-5 h-5 object-contain\" />\n ) : (\n <Shield className=\"text-white w-5 h-5\" />\n )}\n </div>\n <div>\n <h2 className=\"text-lg font-bold tracking-tight text-main\">{title}</h2>\n {subtitle && (\n <p className=\"text-[10px] uppercase tracking-widest text-brand font-bold\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleTheme}\n className=\"p-2 dark:hover:bg-slate-200 dark:bg-white/10 hover:bg-slate-200/50 rounded-xl transition-colors text-muted\"\n aria-label=\"Toggle theme\"\n >\n {theme === 'dark' ? <Sun className=\"w-5 h-5\" /> : <Moon className=\"w-5 h-5\" />}\n </button>\n {showClose && (\n <button\n onClick={onClose}\n className=\"p-2 dark:hover:bg-slate-200 dark:bg-white/10 hover:bg-slate-200/50 rounded-full transition-colors text-muted\"\n aria-label=\"Close\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n </header>\n);\n\nexport default Header;\n","import React from 'react';\n\ninterface FooterProps {\n children: React.ReactNode;\n}\n\nconst Footer: React.FC<FooterProps> = ({ children }) => (\n <footer className=\"p-8 text-center relative z-20\">\n {children}\n </footer>\n);\n\nexport default Footer;\n","type Translations = {\n [key: string]: {\n [key: string]: string;\n };\n};\n\nconst translations: Translations = {\n EN: {\n welcome_back: \"Welcome back\",\n enter_email: \"Enter your email to receive a verification code.\",\n email_address: \"Email Address\",\n continue: \"Continue\",\n sending_code: \"Sending Code...\",\n verify_email: \"Verify Email\",\n enter_code: \"Enter the 6-digit code sent to\",\n verification_failed: \"Verification Failed\",\n verifying: \"Verifying...\",\n resend_code: \"Resend Code\",\n resend_in: \"Resend in\",\n secure_sdk: \"SECURE SDK\",\n permission_request: \"PERMISSION REQUEST\",\n review_data: \"Review Data\",\n mint_identity: \"Mint Identity\",\n face_scan: \"Face Scan\",\n document_scan: \"Document Scan\",\n verification_step: \"VERIFICATION STEP\",\n kyc_required: \"KYC REQUIRED\",\n security_upgrade_required: \"Security Upgrade Required\",\n security_upgrade_desc: \"Your account requires a biometric security upgrade to perform this action.\",\n biometric_secure: \"BIOMETRIC SECURE\",\n zero_knowledge: \"ZERO KNOWLEDGE\",\n start_upgrade: \"Start Upgrade\",\n do_this_later: \"I'll do this later\",\n sign_in_with_extension: \"Sign in with Extension\",\n sign_in_with_otp: \"Sign in with OTP\",\n extension_detected: \"Extension Detected\",\n secure_wallet: \"Secure Wallet\",\n fully_audited: \"FULLY AUDITED\",\n non_custodial: \"NON-CUSTODIAL\",\n verify_identity: \"Verify Your Identity\",\n choose_document: \"Choose a document type to begin verification.\",\n passport: \"Passport\",\n drivers_license: \"Driver License\",\n national_id: \"ID Card\",\n passport_desc: \"All countries supported\",\n drivers_license_desc: \"Government issued card\",\n national_id_desc: \"National identity document\",\n position_face: \"Position your face in the frame\",\n blink_slowly: \"Blink slowly\",\n turn_head_left: \"Turn your head slowly to the left\",\n turn_head_right: \"Turn your head slowly to the right\",\n processing: \"Processing...\",\n camera_permission_denied: \"Camera permission denied\",\n unable_access_camera: \"Unable to access camera\",\n live_camera: \"LIVE CAMERA\",\n initializing: \"INITIALIZING\",\n processing_verification: \"Processing Verification...\",\n processing_liveness: \"Verifying Liveness...\",\n processing_documents: \"Processing Documents...\",\n processing_subtitle: \"Validating your documents and biometrics\",\n minting_identity: \"Minting your Identity...\",\n minting_subtitle: \"Securing your decentralized identity on the Casper Network\",\n identity_minted: \"Identity Minted!\",\n minted_subtitle: \"Your CasperID has been successfully created\",\n verification_failed_subtitle: \"There was an issue with your verification\",\n try_again: \"Try Again\",\n credential_hash: \"Credential Hash\",\n identity_verified: \"Identity Verified\",\n identity_verified_subtitle: \"Your liveness check passed. You are now verified.\",\n identity_verified_desc: \"Your CasperID has been successfully authenticated on the Casper blockchain. You're ready to go.\",\n submitting_for_review: \"Submitting for Review...\",\n submitting_review_subtitle: \"Your documents are being prepared for verification\",\n verification_submitted: \"Verification Submitted\",\n verification_submitted_subtitle: \"Your documents are under review. You'll be notified once verified.\",\n share_data_consent: \"Share Data Consent\",\n authorize_dapps: \"Authorize dApps to access your credentials\",\n return_to_app: \"Return to App\",\n verify_data_desc: \"Verify your extracted identity information. This data will be used to mint your CasperID.\",\n ocr_confidence: \"OCR Confidence\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n document_number: \"Document Number\",\n date_of_birth: \"Date of Birth\",\n nationality: \"Nationality\",\n enter_first_name: \"Enter first name\",\n enter_last_name: \"Enter last name\",\n enter_nationality: \"Enter nationality\",\n scanned_successfully: \"Scanned Successfully\",\n secured_by_casper: \"Secured by CasperID Protocol.\",\n confirm_mint: \"Confirm & Mint\",\n submitting: \"Submitting...\",\n retake_photo: \"Retake Photo\",\n auth_subtitle: \"Secure your Web3 identity with our premium authentication layer.\",\n extension_connect_msg: \"Click the CasperID extension icon in your browser to connect.\",\n extension_not_detected: \"CasperID extension not detected. Please install the extension or use OTP sign-in.\",\n connecting: \"Connecting...\",\n two_factor_auth: \"Two-Factor Auth\",\n security_notice: \"Your data is encrypted and never stored on central servers. Powered by Casper Network.\",\n e2e_encrypted: \"End-to-End Encrypted\",\n error_email_required: \"Please enter your email\",\n error_invalid_email: \"Please enter a valid email address\",\n error_passkey_registered: \"You have a passkey registered. Please use extension sign-in.\",\n error_send_code_failed: \"Failed to send verification code. Please try again.\",\n error_connection_failed: \"Unable to connect. Please check your internet connection.\",\n verify_code: \"Verification Code\",\n code_expired: \"Code expired\",\n invalid_code: \"Invalid code\",\n error_pin_incomplete: \"Please enter all 6 digits\",\n verify: \"Verify\",\n invalid_code_attempts: \"Invalid code. {attempts} attempts remaining.\",\n awaiting_calibration: \"Awaiting Calibration\",\n transaction_status: \"Transaction Status\",\n complete_percent: \"{percent}% Complete\",\n validating_docs: \"Validating documents...\",\n broadcasting_tx: \"Broadcasting to Casper Mainnet Node...\",\n tx_confirmed: \"Transaction confirmed on Casper Network\",\n scan_instruction: \"Scan {side} of your {docType}\",\n review_capture: \"Review your capture. Ensure all text is clearly visible.\",\n align_document: \"Align your document within the glowing frame. Ensure all four corners are visible.\",\n next_back_side: \"Next: Back Side\",\n confirm: \"Confirm\",\n capture: \"Capture\",\n verify_data_carefully: \"Please verify the extracted data carefully.\",\n enter_doc_number: \"Enter document number\",\n date_format: \"DD/MM/YYYY\",\n error_required_fields: \"Please fill in all required fields.\",\n front: \"front\",\n back: \"back\",\n requesting_access: \"Requesting Access\",\n privacy_note: \"Privacy Note\",\n privacy_desc: \"Only cryptographic proofs are shared. No private keys are ever exposed.\",\n approve_verify: \"Approve & Verify\",\n deny: \"Deny\",\n perm_identity: \"Verify Identity Status\",\n perm_profile: \"Read Public Profile\",\n perm_kyc: \"Share KYC Level\",\n \"verify:identity\": \"Verify Identity Status\",\n \"read:profile\": \"Read Public Profile\",\n \"read:kyc_level\": \"Share KYC Level\",\n \"read:email\": \"Access Email Address\",\n \"read:wallet\": \"View Wallet Address\",\n full_name: \"FULL NAME\",\n id_number: \"ID NUMBER\",\n // Passkey Auth\n passkey_auth_subtitle: \"Use your passkey to sign in securely.\",\n signing_in_as: \"Signing in as\",\n use_passkey: \"Use Your Passkey\",\n authenticating: \"Authenticating...\",\n authentication_failed: \"Authentication Failed\",\n passkey_auth_hint: \"Touch ID, Face ID, or security key\",\n passkey_cancelled: \"Authentication was cancelled. Try again when ready.\",\n authenticate: \"Authenticate\",\n use_email_instead: \"Use email code instead\",\n biometric_secured: \"Biometric Secured\",\n webauthn_not_supported: \"Your browser doesn't support passkeys. Please use email verification.\",\n // Passkey Registration\n create_passkey: \"Create Your Passkey\",\n passkey_register_subtitle: \"Set up biometric authentication for secure, passwordless sign-in.\",\n passkey_benefits_title: \"Why use a passkey?\",\n passkey_benefit_1: \"No passwords to remember\",\n passkey_benefit_2: \"Phishing-resistant security\",\n passkey_benefit_3: \"Works across your devices\",\n register_passkey: \"Create Passkey\",\n creating_passkey: \"Creating passkey...\",\n passkey_created: \"Passkey created successfully!\",\n passkey_create_failed: \"Failed to create passkey\",\n // L1 Setup\n l1_setup_title: \"Setting Up Your Identity\",\n l1_setup_subtitle: \"Creating your secure wallet and decentralized identity.\",\n generating_wallet: \"Generating secure wallet...\",\n minting_did: \"Minting your DID...\",\n l1_complete: \"Identity setup complete!\",\n l1_failed: \"Setup failed. Please try again.\",\n facial_verification: \"Facial Verification\",\n secure_face_scan_desc: \"Secure Face Scan • Encrypted\",\n analyzing_liveness: \"Analyzing Liveness\",\n calibration_complete: \"Calibration Complete\",\n },\n ES: {\n welcome_back: \"Bienvenido de nuevo\",\n enter_email: \"Ingrese su correo para recibir un código.\",\n email_address: \"Correo electrónico\",\n continue: \"Continuar\",\n sending_code: \"Enviando código...\",\n verify_email: \"Verificar correo\",\n enter_code: \"Ingrese el código de 6 dígitos enviado a\",\n verification_failed: \"Error de verificación\",\n verifying: \"Verificando...\",\n resend_code: \"Reenviar código\",\n resend_in: \"Reenviar en\",\n secure_sdk: \"SDK SEGURO\",\n permission_request: \"SOLICITUD DE PERMISO\",\n review_data: \"Revisar datos\",\n mint_identity: \"Mint Identidad\",\n face_scan: \"Escaneo facial\",\n document_scan: \"Escaneo de documentos\",\n verification_step: \"PASO DE VERIFICACIÓN\",\n kyc_required: \"KYC REQUERIDO\",\n security_upgrade_required: \"Actualización de Seguridad Requerida\",\n security_upgrade_desc: \"Su cuenta requiere una actualización de seguridad biométrica para esta acción.\",\n biometric_secure: \"BIOMÉTRICO SEGURO\",\n zero_knowledge: \"CONOCIMIENTO CERO\",\n start_upgrade: \"Iniciar actualización\",\n do_this_later: \"Lo haré más tarde\",\n sign_in_with_extension: \"Iniciar sesión con extensión\",\n sign_in_with_otp: \"Iniciar sesión con OTP\",\n extension_detected: \"Extensión detectada\",\n secure_wallet: \"Billetera segura\",\n fully_audited: \"TOTALMENTE AUDITADO\",\n non_custodial: \"SIN CUSTODIA\",\n verify_identity: \"Verifique su identidad\",\n choose_document: \"Elija un tipo de documento para comenzar.\",\n passport: \"Pasaporte\",\n drivers_license: \"Licencia de conducir\",\n national_id: \"DNI / Cédula\",\n passport_desc: \"Todos los países soportados\",\n drivers_license_desc: \"Tarjeta emitida por el gobierno\",\n national_id_desc: \"Documento nacional de identidad\",\n position_face: \"Coloque su cara en el marco\",\n blink_slowly: \"Parpadee lentamente\",\n turn_head_left: \"Gire la cabeza hacia la izquierda\",\n turn_head_right: \"Gire la cabeza hacia la derecha\",\n processing: \"Procesando...\",\n camera_permission_denied: \"Permiso de cámara denegado\",\n unable_access_camera: \"No se puede acceder a la cámara\",\n live_camera: \"CÁMARA EN VIVO\",\n initializing: \"INICIALIZANDO\",\n processing_verification: \"Procesando verificación...\",\n processing_liveness: \"Verificando vivacidad...\",\n processing_documents: \"Procesando documentos...\",\n processing_subtitle: \"Validando sus documentos y biometría\",\n minting_identity: \"Minting identidad...\",\n minting_subtitle: \"Asegurando su identidad descentralizada en Casper Network\",\n identity_minted: \"¡Identidad Minted!\",\n minted_subtitle: \"Su CasperID ha sido creado con éxito\",\n verification_failed_subtitle: \"Hubo un problema con su verificación\",\n try_again: \"Intentar de nuevo\",\n credential_hash: \"Hash de credencial\",\n identity_verified: \"Identidad verificada\",\n identity_verified_subtitle: \"Su verificación de vida fue exitosa. Ahora está verificado.\",\n identity_verified_desc: \"Su CasperID ha sido autenticado con éxito en la cadena de bloques Casper.\",\n submitting_for_review: \"Enviando para revisión...\",\n submitting_review_subtitle: \"Sus documentos están siendo preparados para verificación\",\n verification_submitted: \"Verificación Enviada\",\n verification_submitted_subtitle: \"Sus documentos están en revisión. Le notificaremos una vez verificado.\",\n share_data_consent: \"Consentimiento de datos\",\n authorize_dapps: \"Autorizar dApps para acceder a credenciales\",\n return_to_app: \"Volver a la aplicación\",\n verify_data_desc: \"Verifique su información de identidad. Estos datos se usarán para crear su CasperID.\",\n ocr_confidence: \"Confianza OCR\",\n first_name: \"Nombre\",\n last_name: \"Apellido\",\n document_number: \"Número de documento\",\n date_of_birth: \"Fecha de nacimiento\",\n nationality: \"Nacionalidad\",\n enter_first_name: \"Ingrese nombre\",\n enter_last_name: \"Ingrese apellido\",\n enter_nationality: \"Ingrese nacionalidad\",\n scanned_successfully: \"Escaneado con éxito\",\n secured_by_casper: \"Protegido por CasperID Protocol.\",\n confirm_mint: \"Confirmar y crear\",\n submitting: \"Enviando...\",\n retake_photo: \"Tomar otra foto\",\n auth_subtitle: \"Asegure su identidad Web3 con nuestra capa de autenticación premium.\",\n extension_connect_msg: \"Haga clic en el icono de la extensión CasperID en su navegador para conectarse.\",\n extension_not_detected: \"No se detectó la extensión CasperID. Instale la extensión o use el inicio de sesión OTP.\",\n connecting: \"Conectando...\",\n two_factor_auth: \"Autenticación de dos factores\",\n security_notice: \"Sus datos están encriptados y nunca se almacenan en servidores centrales. Desarrollado por Casper Network.\",\n e2e_encrypted: \"Cifrado de extremo a extremo\",\n error_email_required: \"Por favor ingrese su correo\",\n error_invalid_email: \"Por favor ingrese un correo válido\",\n error_passkey_registered: \"Tiene una clave de paso registrada. Utilice el inicio de sesión por extensión.\",\n error_send_code_failed: \"Error al enviar el código de verificación. Inténtelo de nuevo.\",\n error_connection_failed: \"No se puede conectar. Compruebe su conexión a internet.\",\n verify_code: \"Código de verificación\",\n code_expired: \"Código expirado\",\n invalid_code: \"Código inválido\",\n error_pin_incomplete: \"Por favor ingrese los 6 dígitos\",\n verify: \"Verificar\",\n invalid_code_attempts: \"Código inválido. {attempts} intentos restantes.\",\n awaiting_calibration: \"Esperando calibración\",\n transaction_status: \"Estado de la transacción\",\n complete_percent: \"{percent}% completado\",\n validating_docs: \"Validando documentos...\",\n broadcasting_tx: \"Transmitiendo al nodo principal de Casper...\",\n tx_confirmed: \"Transacción confirmada en Casper Network\",\n scan_instruction: \"Escanee el {side} de su {docType}\",\n review_capture: \"Revise su captura. Asegúrese de que todo el texto sea visible.\",\n align_document: \"Alinee su documento dentro del marco brillante. Asegúrese de que las cuatro esquinas sean visibles.\",\n next_back_side: \"Siguiente: Reverso\",\n confirm: \"Confirmar\",\n capture: \"Capturar\",\n verify_data_carefully: \"Verifique los datos extraídos cuidadosamente.\",\n enter_doc_number: \"Ingrese el número de documento\",\n date_format: \"DD/MM/AAAA\",\n error_required_fields: \"Por favor complete todos los campos obligatorios.\",\n front: \"frente\",\n back: \"reverso\",\n requesting_access: \"Solicitando acceso\",\n privacy_note: \"Nota de privacidad\",\n privacy_desc: \"Solo se comparten pruebas criptográficas. Nunca se exponen las claves privadas.\",\n approve_verify: \"Aprobar y Verificar\",\n deny: \"Denegar\",\n perm_identity: \"Verificar estado de identidad\",\n perm_profile: \"Leer perfil público\",\n perm_kyc: \"Compartir nivel de KYC\",\n \"verify:identity\": \"Verificar estado de identidad\",\n \"read:profile\": \"Leer perfil público\",\n \"read:kyc_level\": \"Compartir nivel de KYC\",\n \"read:email\": \"Acceso a correo electrónico\",\n \"read:wallet\": \"Ver dirección de billetera\",\n full_name: \"NOMBRE COMPLETO\",\n id_number: \"NÚMERO DE IDENTIFICACIÓN\",\n // Passkey Auth\n passkey_auth_subtitle: \"Use su clave de paso para iniciar sesión de forma segura.\",\n signing_in_as: \"Iniciando sesión como\",\n use_passkey: \"Use su clave de paso\",\n authenticating: \"Autenticando...\",\n authentication_failed: \"Autenticación fallida\",\n passkey_auth_hint: \"Touch ID, Face ID o llave de seguridad\",\n passkey_cancelled: \"Autenticación cancelada. Intente de nuevo cuando esté listo.\",\n authenticate: \"Autenticar\",\n use_email_instead: \"Usar código de correo\",\n biometric_secured: \"Biométrico seguro\",\n webauthn_not_supported: \"Su navegador no admite claves de paso. Use verificación por correo.\",\n // Passkey Registration\n create_passkey: \"Crear su clave de paso\",\n passkey_register_subtitle: \"Configure autenticación biométrica para inicio de sesión sin contraseña.\",\n passkey_benefits_title: \"¿Por qué usar clave de paso?\",\n passkey_benefit_1: \"Sin contraseñas que recordar\",\n passkey_benefit_2: \"Seguridad resistente al phishing\",\n passkey_benefit_3: \"Funciona en todos sus dispositivos\",\n register_passkey: \"Crear clave de paso\",\n creating_passkey: \"Creando clave de paso...\",\n passkey_created: \"¡Clave de paso creada!\",\n passkey_create_failed: \"Error al crear clave de paso\",\n // L1 Setup\n l1_setup_title: \"Configurando su identidad\",\n l1_setup_subtitle: \"Creando su billetera segura e identidad descentralizada.\",\n generating_wallet: \"Generando billetera segura...\",\n minting_did: \"Minting su DID...\",\n l1_complete: \"¡Configuración de identidad completa!\",\n l1_failed: \"Configuración fallida. Intente de nuevo.\",\n facial_verification: \"Verificación Facial\",\n secure_face_scan_desc: \"Escaneo Facial Seguro • Encriptado\",\n analyzing_liveness: \"Analizando Vivacidad\",\n calibration_complete: \"Calibración Completa\",\n },\n FR: {\n welcome_back: \"Bon retour\",\n enter_email: \"Entrez votre email pour un code.\",\n email_address: \"Adresse email\",\n continue: \"Continuer\",\n sending_code: \"Envoi du code...\",\n verify_email: \"Vérifier l'email\",\n enter_code: \"Entrez le code à 6 chiffres envoyé à\",\n verification_failed: \"Échec de vérification\",\n verifying: \"Vérification...\",\n resend_code: \"Renvoyer le code\",\n resend_in: \"Renvoyer dans\",\n secure_sdk: \"SDK SÉCURISÉ\",\n permission_request: \"DEMANDE DE PERMISSION\",\n review_data: \"Réviser les données\",\n mint_identity: \"Mint Identité\",\n face_scan: \"Scan du visage\",\n document_scan: \"Scan du document\",\n verification_step: \"ÉTAPE DE VÉRIFICATION\",\n kyc_required: \"KYC REQUIS\",\n security_upgrade_required: \"Mise à niveau de sécurité requise\",\n security_upgrade_desc: \"Votre compte nécessite une mise à niveau biométrique pour cette action.\",\n biometric_secure: \"BIOMÉTRIE SÉCURISÉE\",\n zero_knowledge: \"ZÉRO CONNAISSANCE\",\n start_upgrade: \"Démarrer la mise à jour\",\n do_this_later: \"Je ferai ça plus tard\",\n sign_in_with_extension: \"Connexion avec l'extension\",\n sign_in_with_otp: \"Connexion avec OTP\",\n extension_detected: \"Extension détectée\",\n secure_wallet: \"Portefeuille sécurisé\",\n fully_audited: \"ENTIÈREMENT AUDITÉ\",\n non_custodial: \"NON FONGIBLE\",\n verify_identity: \"Vérifiez votre identité\",\n choose_document: \"Choisissez un type de document.\",\n passport: \"Passeport\",\n drivers_license: \"Permis de conduire\",\n national_id: \"Carte d'identité\",\n passport_desc: \"Tous les pays supportés\",\n drivers_license_desc: \"Carte émise par le gouvernement\",\n national_id_desc: \"Document d'identité national\",\n position_face: \"Placez votre visage dans le cadre\",\n blink_slowly: \"Clignez des yeux lentement\",\n turn_head_left: \"Tournez la tête vers la gauche\",\n turn_head_right: \"Tournez la tête vers la droite\",\n processing: \"Traitement...\",\n camera_permission_denied: \"Permission caméra refusée\",\n unable_access_camera: \"Accès caméra impossible\",\n live_camera: \"CAMÉRA EN DIRECT\",\n initializing: \"INITIALISATION\",\n processing_verification: \"Traitement de la vérification...\",\n processing_liveness: \"Vérification de la vivacité...\",\n processing_documents: \"Traitement des documents...\",\n processing_subtitle: \"Validation de vos documents et biométrie\",\n minting_identity: \"Mint Identité en cours...\",\n minting_subtitle: \"Sécurisation de votre identité sur le réseau Casper\",\n identity_minted: \"Identité créée !\",\n minted_subtitle: \"Votre CasperID a été créé avec succès\",\n verification_failed_subtitle: \"Il y a eu un problème avec votre vérification\",\n try_again: \"Réessayer\",\n credential_hash: \"Hachage de créance\",\n identity_verified: \"Identité vérifiée\",\n identity_verified_subtitle: \"Votre vérification de vivacité a réussi. Vous êtes maintenant vérifié.\",\n identity_verified_desc: \"Votre CasperID a été authentifié avec succès sur la blockchain Casper.\",\n submitting_for_review: \"Soumission pour révision...\",\n submitting_review_subtitle: \"Vos documents sont en cours de préparation pour la vérification\",\n verification_submitted: \"Vérification Soumise\",\n verification_submitted_subtitle: \"Vos documents sont en cours de révision. Vous serez notifié une fois vérifié.\",\n share_data_consent: \"Partage de données\",\n authorize_dapps: \"Autoriser dApps à accéder aux identifiants\",\n return_to_app: \"Retour à l'application\",\n verify_data_desc: \"Vérifiez vos informations d'identité. Ces données seront utilisées pour créer votre CasperID.\",\n ocr_confidence: \"Confiance OCR\",\n first_name: \"Prénom\",\n last_name: \"Nom\",\n document_number: \"Numéro de document\",\n date_of_birth: \"Date de naissance\",\n nationality: \"Nationalité\",\n enter_first_name: \"Entrez le prénom\",\n enter_last_name: \"Entrez le nom\",\n enter_nationality: \"Entrez la nationalité\",\n scanned_successfully: \"Scanné avec succès\",\n secured_by_casper: \"Sécurisé par CasperID Protocol.\",\n confirm_mint: \"Confirmer et Créer\",\n submitting: \"Soumission...\",\n retake_photo: \"Reprendre la photo\",\n auth_subtitle: \"Sécurisez votre identité Web3 avec notre couche d'authentification premium.\",\n extension_connect_msg: \"Cliquez sur l'icône de l'extension CasperID dans votre navigateur pour vous connecter.\",\n extension_not_detected: \"Extension CasperID non détectée. Veuillez installer l'extension ou utiliser la connexion OTP.\",\n connecting: \"Connexion...\",\n two_factor_auth: \"Authentification à deux facteurs\",\n security_notice: \"Vos données sont cryptées et ne sont jamais stockées sur des serveurs centraux. Propulsé par Casper Network.\",\n e2e_encrypted: \"Chiffré de bout en bout\",\n error_email_required: \"Veuillez entrer votre email\",\n error_invalid_email: \"Veuillez entrer une adresse email valide\",\n error_passkey_registered: \"Vous avez une clé de sécurité enregistrée. Veuillez utiliser la connexion par extension.\",\n error_send_code_failed: \"Échec de l'envoi du code de vérification. Veuillez réessayer.\",\n error_connection_failed: \"Impossible de se connecter. Veuillez vérifier votre connexion internet.\",\n verify_code: \"Code de vérification\",\n code_expired: \"Code expiré\",\n invalid_code: \"Code invalide\",\n error_pin_incomplete: \"Veuillez entrer les 6 chiffres\",\n verify: \"Vérifier\",\n invalid_code_attempts: \"Code invalide. {attempts} tentatives restantes.\",\n awaiting_calibration: \"En attente de calibrage\",\n transaction_status: \"Statut de la transaction\",\n complete_percent: \"{percent}% terminé\",\n validating_docs: \"Validation des documents...\",\n broadcasting_tx: \"Diffusion sur le nœud Casper Mainnet...\",\n tx_confirmed: \"Transaction confirmée sur le réseau Casper\",\n scan_instruction: \"Scannez le {side} de votre {docType}\",\n review_capture: \"Réviser votre capture. Assurez-vous que tout le texte est visible.\",\n align_document: \"Alignez votre document dans le cadre. Assurez-vous que les quatre coins sont visibles.\",\n next_back_side: \"Suivant: Verso\",\n confirm: \"Confirmer\",\n capture: \"Capturer\",\n verify_data_carefully: \"Veuillez vérifier soigneusement les données extraites.\",\n enter_doc_number: \"Entrez le numéro du document\",\n date_format: \"JJ/MM/AAAA\",\n error_required_fields: \"Veuillez remplir tous les champs obligatoires.\",\n front: \"recto\",\n back: \"verso\",\n requesting_access: \"Demande d'accès\",\n privacy_note: \"Note de confidentialité\",\n privacy_desc: \"Seules des preuves cryptographiques sont partagées. Aucune clé privée n'est jamais exposée.\",\n approve_verify: \"Approuver et Vérifier\",\n deny: \"Refuser\",\n perm_identity: \"Vérifier le statut d'identité\",\n perm_profile: \"Lire le profil public\",\n perm_kyc: \"Partager le niveau KYC\",\n \"verify:identity\": \"Vérifier le statut d'identité\",\n \"read:profile\": \"Lire le profil public\",\n \"read:kyc_level\": \"Partager le niveau KYC\",\n \"read:email\": \"Accéder à l'adresse email\",\n \"read:wallet\": \"Voir l'adresse du portefeuille\",\n full_name: \"NOM COMPLET\",\n id_number: \"NUMÉRO DE DOCUMENT\",\n // Passkey Auth\n passkey_auth_subtitle: \"Utilisez votre clé d'accès pour vous connecter en toute sécurité.\",\n signing_in_as: \"Connexion en tant que\",\n use_passkey: \"Utilisez votre clé d'accès\",\n authenticating: \"Authentification...\",\n authentication_failed: \"Échec de l'authentification\",\n passkey_auth_hint: \"Touch ID, Face ID ou clé de sécurité\",\n passkey_cancelled: \"Authentification annulée. Réessayez quand vous êtes prêt.\",\n authenticate: \"Authentifier\",\n use_email_instead: \"Utiliser un code par email\",\n biometric_secured: \"Sécurisé biométrique\",\n webauthn_not_supported: \"Votre navigateur ne prend pas en charge les clés d'accès. Utilisez la vérification par email.\",\n // Passkey Registration\n create_passkey: \"Créer votre clé d'accès\",\n passkey_register_subtitle: \"Configurez l'authentification biométrique pour une connexion sans mot de passe.\",\n passkey_benefits_title: \"Pourquoi utiliser une clé d'accès?\",\n passkey_benefit_1: \"Pas de mot de passe à retenir\",\n passkey_benefit_2: \"Sécurité résistante au phishing\",\n passkey_benefit_3: \"Fonctionne sur tous vos appareils\",\n register_passkey: \"Créer la clé d'accès\",\n creating_passkey: \"Création de la clé d'accès...\",\n passkey_created: \"Clé d'accès créée!\",\n passkey_create_failed: \"Échec de la création de la clé d'accès\",\n // L1 Setup\n l1_setup_title: \"Configuration de votre identité\",\n l1_setup_subtitle: \"Création de votre portefeuille sécurisé et identité décentralisée.\",\n generating_wallet: \"Génération du portefeuille sécurisé...\",\n minting_did: \"Création de votre DID...\",\n l1_complete: \"Configuration d'identité terminée!\",\n l1_failed: \"Échec de la configuration. Réessayez.\",\n facial_verification: \"Vérification Faciale\",\n secure_face_scan_desc: \"Scan Facial Sécurisé • Crypté\",\n analyzing_liveness: \"Analyse de Vivacité\",\n calibration_complete: \"Calibration Terminée\",\n },\n DE: {\n welcome_back: \"Willkommen zurück\",\n enter_email: \"E-Mail für Bestätigungscode eingeben.\",\n email_address: \"E-Mail-Adresse\",\n continue: \"Weiter\",\n sending_code: \"Code wird gesendet...\",\n verify_email: \"E-Mail verifizieren\",\n enter_code: \"6-stelligen Code eingeben, gesendet an\",\n verification_failed: \"Verifizierung fehlgeschlagen\",\n verifying: \"Verifizierung...\",\n resend_code: \"Code erneut senden\",\n resend_in: \"Erneut in\",\n secure_sdk: \"SICHERES SDK\",\n permission_request: \"BERECHTIGUNGSANFRAGE\",\n review_data: \"Daten überprüfen\",\n mint_identity: \"Identität prägen\",\n face_scan: \"Gesichtsscan\",\n document_scan: \"Dokumentenscan\",\n verification_step: \"VERIFIZIERUNGSSCHRITT\",\n kyc_required: \"KYC ERFORDERLICH\",\n security_upgrade_required: \"Sicherheits-Upgrade erforderlich\",\n security_upgrade_desc: \"Ihr Konto erfordert ein biometrisches Upgrade für diese Aktion.\",\n biometric_secure: \"BIOMETRISCH SICHER\",\n zero_knowledge: \"ZERO-KNOWLEDGE\",\n start_upgrade: \"Upgrade starten\",\n do_this_later: \"Später erledigen\",\n sign_in_with_extension: \"Mit Erweiterung anmelden\",\n sign_in_with_otp: \"Mit OTP anmelden\",\n extension_detected: \"Erweiterung erkannt\",\n secure_wallet: \"Sichere Wallet\",\n fully_audited: \"VOLLSTÄNDIG GEPRÜFT\",\n non_custodial: \"NON-CUSTODIAL\",\n verify_identity: \"Identität verifizieren\",\n choose_document: \"Dokumenttyp auswählen.\",\n passport: \"Reisepass\",\n drivers_license: \"Führerschein\",\n national_id: \"Personalausweis\",\n passport_desc: \"Alle Länder unterstützt\",\n drivers_license_desc: \"Staatlicher Ausweis\",\n national_id_desc: \"Nationaler Identitätsnachweis\",\n position_face: \"Gesicht im Rahmen positionieren\",\n blink_slowly: \"Langsam blinzeln\",\n turn_head_left: \"Kopf langsam nach links drehen\",\n turn_head_right: \"Kopf langsam nach rechts drehen\",\n processing: \"Verarbeitung...\",\n camera_permission_denied: \"Kamerazugriff verweigert\",\n unable_access_camera: \"Kamerazugriff nicht möglich\",\n live_camera: \"LIVE-KAMERA\",\n initializing: \"INITIALISIERUNG\",\n processing_verification: \"Verifizierung wird verarbeitet...\",\n processing_liveness: \"Lebendigkeitsprüfung läuft...\",\n processing_documents: \"Dokumente werden verarbeitet...\",\n processing_subtitle: \"Dokumente und Biometrie werden validiert\",\n minting_identity: \"Identität wird geprägt...\",\n minting_subtitle: \"Ihre dezentrale Identität wird im Casper-Netzwerk gesichert\",\n identity_minted: \"Identität geprägt!\",\n minted_subtitle: \"Ihre CasperID wurde erfolgreich erstellt\",\n verification_failed_subtitle: \"Es gab ein Problem mit Ihrer Verifizierung\",\n try_again: \"Erneut versuchen\",\n credential_hash: \"Anmeldedaten-Hash\",\n identity_verified: \"Identität verifiziert\",\n identity_verified_subtitle: \"Ihre Lebendigkeitsprüfung war erfolgreich. Sie sind jetzt verifiziert.\",\n identity_verified_desc: \"Ihre CasperID wurde erfolgreich in der Casper-Blockchain authentifiziert.\",\n submitting_for_review: \"Zur Überprüfung einreichen...\",\n submitting_review_subtitle: \"Ihre Dokumente werden für die Verifizierung vorbereitet\",\n verification_submitted: \"Verifizierung eingereicht\",\n verification_submitted_subtitle: \"Ihre Dokumente werden überprüft. Sie werden benachrichtigt, sobald verifiziert.\",\n share_data_consent: \"Datenfreigabe\",\n authorize_dapps: \"dApps Zugriff auf Anmeldedaten erlauben\",\n return_to_app: \"Zurück zur App\",\n verify_data_desc: \"Überprüfen Sie Ihre Identitätsdaten. Diese werden zur Erstellung Ihrer CasperID verwendet.\",\n ocr_confidence: \"OCR-Vertrauen\",\n first_name: \"Vorname\",\n last_name: \"Nachname\",\n document_number: \"Ausweisnummer\",\n date_of_birth: \"Geburtsdatum\",\n nationality: \"Nationalität\",\n enter_first_name: \"Vorname eingeben\",\n enter_last_name: \"Nachname eingeben\",\n enter_nationality: \"Nationalität eingeben\",\n scanned_successfully: \"Erfolgreich gescannt\",\n secured_by_casper: \"Gesichert durch CasperID Protocol.\",\n confirm_mint: \"Bestätigen & Prägen\",\n submitting: \"Wird gesendet...\",\n retake_photo: \"Foto erneut aufnehmen\",\n auth_subtitle: \"Sichern Sie Ihre Web3-Identität mit unserer Premium-Authentifizierungsschicht.\",\n extension_connect_msg: \"Klicken Sie auf das CasperID-Erweiterungssymbol in Ihrem Browser, um eine Verbindung herzustellen.\",\n extension_not_detected: \"CasperID-Erweiterung nicht erkannt. Bitte installieren Sie die Erweiterung oder verwenden Sie die OTP-Anmeldung.\",\n connecting: \"Verbindung wird hergestellt...\",\n two_factor_auth: \"Zwei-Faktor-Authentifizierung\",\n security_notice: \"Ihre Daten sind verschlüsselt und werden niemals auf zentralen Servern gespeichert. Unterstützt von Casper Network.\",\n e2e_encrypted: \"Ende-zu-Ende verschlüsselt\",\n error_email_required: \"Bitte geben Sie Ihre E-Mail-Adresse ein\",\n error_invalid_email: \"Bitte geben Sie eine gültige E-Mail-Adresse ein\",\n error_passkey_registered: \"Sie haben einen Passkey registriert. Bitte verwenden Sie die Anmeldung über die Erweiterung.\",\n error_send_code_failed: \"Der Verifizierungscode konnte nicht gesendet werden. Bitte versuchen Sie es erneut.\",\n error_connection_failed: \"Verbindung nicht möglich. Bitte überprüfen Sie Ihre Internetverbindung.\",\n verify_code: \"Verifizierungscode\",\n code_expired: \"Code abgelaufen\",\n invalid_code: \"Ungültiger Code\",\n error_pin_incomplete: \"Bitte alle 6 Ziffern eingeben\",\n verify: \"Verifizieren\",\n invalid_code_attempts: \"Ungültiger Code. {attempts} Versuche übrig.\",\n error_verify_failed: \"Verifizierung nicht möglich. Bitte erneut versuchen.\",\n error_resend_failed: \"Code konnte nicht gesendet werden. Bitte erneut versuchen.\",\n sending: \"Senden...\",\n facial_verification: \"Gesichtsverifizierung\",\n secure_face_scan_desc: \"Sicherer Gesichtsscan • Verschlüsselt\",\n analyzing_liveness: \"Lebendigkeitsprüfung\",\n calibration_complete: \"Kalibrierung abgeschlossen\",\n awaiting_calibration: \"Warten auf Kalibrierung\",\n transaction_status: \"Transaktionsstatus\",\n complete_percent: \"{percent}% abgeschlossen\",\n validating_docs: \"Dokumente werden validiert...\",\n broadcasting_tx: \"Übertragung an Casper Mainnet Node...\",\n tx_confirmed: \"Transaktion im Casper-Netzwerk bestätigt\",\n scan_instruction: \"Scannen Sie die {side} Ihres {docType}\",\n review_capture: \"Überprüfen Sie Ihre Aufnahme. Stellen Sie sicher, dass der Text lesbar ist.\",\n align_document: \"Richten Sie Ihr Dokument im Rahmen aus. Alle vier Ecken müssen sichtbar sein.\",\n next_back_side: \"Weiter: Rückseite\",\n confirm: \"Bestätigen\",\n capture: \"Aufnehmen\",\n verify_data_carefully: \"Bitte überprüfen Sie die extrahierten Daten sorgfältig.\",\n enter_doc_number: \"Ausweisnummer eingeben\",\n date_format: \"TT/MM/JJJJ\",\n error_required_fields: \"Bitte füllen Sie alle Pflichtfelder aus.\",\n front: \"Vorderseite\",\n back: \"Rückseite\",\n requesting_access: \"Zugriff anfordern\",\n privacy_note: \"Datenschutzhinweis\",\n privacy_desc: \"Es werden nur kryptografische Beweise geteilt. Private Schlüssel werden niemals offengelegt.\",\n approve_verify: \"Genehmigen & Verifizieren\",\n deny: \"Ablehnen\",\n perm_identity: \"Identitätsstatus überprüfen\",\n perm_profile: \"Öffentliches Profil lesen\",\n perm_kyc: \"KYC-Level teilen\",\n \"verify:identity\": \"Identitätsstatus überprüfen\",\n \"read:profile\": \"Öffentliches Profil lesen\",\n \"read:kyc_level\": \"KYC-Level teilen\",\n \"read:email\": \"E-Mail-Adresse zugreifen\",\n \"read:wallet\": \"Wallet-Adresse anzeigen\",\n full_name: \"VOLLSTÄNDIGER NAME\",\n id_number: \"AUSWEISNUMMER\",\n // Passkey Auth\n passkey_auth_subtitle: \"Verwenden Sie Ihren Passkey für sichere Anmeldung.\",\n signing_in_as: \"Anmeldung als\",\n use_passkey: \"Passkey verwenden\",\n authenticating: \"Authentifizierung...\",\n authentication_failed: \"Authentifizierung fehlgeschlagen\",\n passkey_auth_hint: \"Touch ID, Face ID oder Sicherheitsschlüssel\",\n passkey_cancelled: \"Authentifizierung abgebrochen. Versuchen Sie es erneut.\",\n authenticate: \"Authentifizieren\",\n use_email_instead: \"E-Mail-Code verwenden\",\n biometric_secured: \"Biometrisch gesichert\",\n webauthn_not_supported: \"Ihr Browser unterstützt keine Passkeys. Verwenden Sie E-Mail-Verifizierung.\",\n // Passkey Registration\n create_passkey: \"Passkey erstellen\",\n passkey_register_subtitle: \"Richten Sie biometrische Authentifizierung für passwortlose Anmeldung ein.\",\n passkey_benefits_title: \"Warum einen Passkey verwenden?\",\n passkey_benefit_1: \"Keine Passwörter merken\",\n passkey_benefit_2: \"Phishing-resistente Sicherheit\",\n passkey_benefit_3: \"Funktioniert auf allen Geräten\",\n register_passkey: \"Passkey erstellen\",\n creating_passkey: \"Passkey wird erstellt...\",\n passkey_created: \"Passkey erstellt!\",\n passkey_create_failed: \"Passkey-Erstellung fehlgeschlagen\",\n // L1 Setup\n l1_setup_title: \"Identität einrichten\",\n l1_setup_subtitle: \"Sichere Wallet und dezentrale Identität werden erstellt.\",\n generating_wallet: \"Sichere Wallet wird generiert...\",\n minting_did: \"DID wird geprägt...\",\n l1_complete: \"Identitätseinrichtung abgeschlossen!\",\n l1_failed: \"Einrichtung fehlgeschlagen. Erneut versuchen.\",\n }\n};\n\nexport const t = (key: string, lang: string = 'EN'): string => {\n const language = lang.toUpperCase();\n const currentLang = translations[language] || translations.EN;\n return currentLang[key] || translations.EN[key] || key;\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { motion } from 'framer-motion';\nimport { Fingerprint, Puzzle, ChevronRight, Smartphone, ShieldCheck, RefreshCw, Loader2, AlertCircle } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface ExtensionUserData {\n wallet: string;\n cnsName?: string;\n email?: string;\n tier?: string;\n humanId?: string;\n}\n\ninterface AuthSelectionProps {\n onNext: (method: 'extension' | 'otp') => void;\n onExtensionSuccess?: (userData: ExtensionUserData) => void;\n onError?: (error: string) => void;\n language?: string;\n platform?: 'desktop' | 'mobile';\n}\n\nconst AuthSelection: React.FC<AuthSelectionProps> = ({\n onNext,\n onExtensionSuccess,\n onError,\n language = 'EN',\n platform = 'desktop'\n}) => {\n const [isCheckingExtension, setIsCheckingExtension] = useState(false);\n const [extensionInstalled, setExtensionInstalled] = useState<boolean | null>(null);\n const [error, setError] = useState('');\n\n // Check if extension is installed on mount\n useEffect(() => {\n checkExtensionInstalled();\n }, []);\n\n // Listen for extension login events\n useEffect(() => {\n const handleExtensionLogin = (event: CustomEvent<ExtensionUserData>) => {\n setIsCheckingExtension(false);\n if (event.detail && event.detail.wallet) {\n onExtensionSuccess?.(event.detail);\n }\n };\n\n window.addEventListener('casperid-login', handleExtensionLogin as EventListener);\n return () => {\n window.removeEventListener('casperid-login', handleExtensionLogin as EventListener);\n };\n }, [onExtensionSuccess]);\n\n const checkExtensionInstalled = useCallback(() => {\n // Check for extension anchor or localStorage data\n const anchor = document.getElementById('casperid-draggable-anchor');\n let storedUser: string | null = null;\n\n try {\n storedUser = localStorage.getItem('casperid_user');\n } catch {\n // localStorage may not be available in some contexts\n }\n\n if (anchor || storedUser) {\n setExtensionInstalled(true);\n return true;\n }\n\n // Also check if we can detect extension via a brief timeout\n // Extension injects its content script which adds the anchor\n setTimeout(() => {\n const anchorAfterDelay = document.getElementById('casperid-draggable-anchor');\n setExtensionInstalled(!!anchorAfterDelay);\n }, 500);\n\n return false;\n }, []);\n\n const isValidUserData = (data: unknown): data is ExtensionUserData => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'wallet' in data &&\n typeof (data as ExtensionUserData).wallet === 'string' &&\n (data as ExtensionUserData).wallet.length > 0\n );\n };\n\n const handleExtensionLogin = async () => {\n setIsCheckingExtension(true);\n setError('');\n\n // Check if already logged in via extension\n try {\n const storedUser = localStorage.getItem('casperid_user');\n if (storedUser) {\n const userData = JSON.parse(storedUser);\n if (isValidUserData(userData)) {\n setIsCheckingExtension(false);\n onExtensionSuccess?.(userData);\n return;\n }\n }\n } catch {\n // Invalid stored data or localStorage not available, continue with extension trigger\n }\n\n // Check if extension anchor exists\n const anchor = document.getElementById('casperid-draggable-anchor');\n\n if (anchor) {\n // Trigger click on the anchor to initiate login\n anchor.click();\n\n // Set a timeout to show error if no response\n setTimeout(() => {\n setIsCheckingExtension(false);\n // Check again if login succeeded\n try {\n const newStoredUser = localStorage.getItem('casperid_user');\n if (!newStoredUser) {\n setError(t('extension_connect_msg', language));\n }\n } catch {\n setError(t('extension_connect_msg', language));\n }\n }, 3000);\n } else {\n // Extension not detected\n setIsCheckingExtension(false);\n setError(t('extension_not_detected', language));\n onError?.('Extension not installed');\n }\n };\n\n const handleOTPLogin = () => {\n setError('');\n onNext('otp');\n };\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n className=\"flex-1 px-8 flex flex-col justify-center gap-8\"\n >\n <div className=\"text-center space-y-3\">\n <div className=\"relative w-24 h-24 mx-auto mb-6\">\n <div className=\"absolute inset-0 bg-brand-20 blur-2xl rounded-full\" />\n <div className=\"relative w-full h-full glass-container flex items-center justify-center rounded-2xl border border-brand-30\">\n <Fingerprint className=\"w-10 h-10 text-brand\" />\n </div>\n </div>\n <h1 className=\"text-2xl font-extrabold leading-tight tracking-tight text-main\">{t('welcome_back', language)}</h1>\n <p className=\"text-muted text-sm leading-relaxed\">\n {t('auth_subtitle', language)}\n </p>\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"flex items-start gap-3 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-2xl\">\n <AlertCircle className=\"w-5 h-5 text-red-500 shrink-0 mt-0.5\" />\n <p className=\"text-red-600 dark:text-red-400 text-sm font-medium\">{error}</p>\n </div>\n )}\n\n <div className=\"space-y-4\">\n {platform === 'desktop' && (\n <button\n onClick={handleExtensionLogin}\n disabled={isCheckingExtension}\n className=\"w-full group relative overflow-hidden flex items-center gap-4 bg-brand hover:bg-brand-90 text-white py-5 px-6 rounded-2xl font-bold transition-all transform active:scale-[0.98] disabled:opacity-70 disabled:cursor-not-allowed shadow-brand\"\n >\n <div className=\"bg-white/20 p-2 rounded-lg\">\n {isCheckingExtension ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Puzzle className=\"w-5 h-5\" />\n )}\n </div>\n <div className=\"flex flex-col items-start\">\n <span className=\"text-base\">\n {isCheckingExtension ? t('connecting', language) : t('sign_in_with_extension', language)}\n </span>\n <span className=\"text-[10px] uppercase tracking-widest text-slate-600 dark:text-white/70\">\n {extensionInstalled === true ? t('extension_detected', language) : t('secure_wallet', language)}\n </span>\n </div>\n <ChevronRight className=\"ml-auto w-4 h-4 opacity-50 group-hover:opacity-100 transition-opacity\" />\n </button>\n )}\n\n <button\n onClick={handleOTPLogin}\n disabled={isCheckingExtension}\n className=\"w-full group relative overflow-hidden flex items-center gap-4 dark:bg-white/5 bg-slate-100/50 hover:dark:bg-white/10 hover:bg-slate-200/80 border dark:border-white/10 border-slate-200 text-main py-5 px-6 rounded-2xl font-bold transition-all transform active:scale-[0.98] disabled:opacity-50\"\n >\n <div className=\"bg-brand-10 p-2 rounded-lg\">\n <Smartphone className=\"w-5 h-5 text-brand\" />\n </div>\n <div className=\"flex flex-col items-start\">\n <span className=\"text-base\">{t('sign_in_with_otp', language)}</span>\n <span className=\"text-[10px] uppercase tracking-widest text-brand font-bold\">{t('two_factor_auth', language)}</span>\n </div>\n <ChevronRight className=\"ml-auto w-4 h-4 opacity-50 group-hover:opacity-100 transition-opacity\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"glass-container p-4 rounded-2xl flex flex-col items-center gap-2 text-center border-slate-200/50\">\n <ShieldCheck className=\"w-5 h-5 text-brand\" />\n <span className=\"text-[10px] font-bold text-muted\">{t('fully_audited', language)}</span>\n </div>\n <div className=\"glass-container p-4 rounded-2xl flex flex-col items-center gap-2 text-center border-slate-200/50\">\n <RefreshCw className=\"w-5 h-5 text-brand\" />\n <span className=\"text-[10px] font-bold text-muted\">{t('non_custodial', language)}</span>\n </div>\n </div>\n </motion.div>\n );\n};\n\nexport default AuthSelection;\n","import React, { useState } from 'react';\nimport { motion } from 'framer-motion';\nimport { Mail, Verified, Lock, ArrowRight, Loader2 } from 'lucide-react';\nimport type { SendOTPResponse } from '../types';\nimport { t } from '../utils/i18n';\n\ninterface LoginProps {\n onNext: (email: string, verificationId: string) => void;\n onPasskeyUser?: (email: string) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst Login: React.FC<LoginProps> = ({\n onNext,\n onPasskeyUser,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n const [email, setEmail] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSubmit = async () => {\n if (!email.trim()) {\n setError(t('error_email_required', language));\n return;\n }\n\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setError(t('error_invalid_email', language));\n return;\n }\n\n setIsLoading(true);\n setError('');\n\n if (previewMode) {\n // Mock delay and success for preview\n setTimeout(() => {\n setIsLoading(false);\n onNext(email.trim().toLowerCase(), 'mock-v-id-123456789');\n }, 1000);\n return;\n }\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/auth/send-otp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n body: JSON.stringify({ email: email.trim().toLowerCase() }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Request failed with status ${response.status}`);\n }\n\n const data: SendOTPResponse = await response.json();\n\n if (data.success) {\n // Returning user with passkey - route to passkey auth\n if (data.userExists && data.hasPasskey) {\n if (onPasskeyUser) {\n onPasskeyUser(email.trim().toLowerCase());\n } else {\n // Fallback: show message if no handler provided\n setError(t('error_passkey_registered', language));\n }\n setIsLoading(false);\n return;\n }\n\n // New user or user without passkey - proceed to OTP\n if (data.verificationId) {\n onNext(email.trim().toLowerCase(), data.verificationId);\n } else {\n setError(t('error_send_code_failed', language));\n }\n } else {\n setError(data.error || t('error_send_code_failed', language));\n onError?.(data.error || t('error_send_code_failed', language));\n }\n } catch (err) {\n const errorMessage = t('error_connection_failed', language);\n setError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !isLoading) {\n handleSubmit();\n }\n };\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"mb-8\">\n <h2 className=\"text-3xl font-extrabold text-main tracking-tight leading-tight\">{t('welcome_back', language)}</h2>\n <p className=\"text-muted mt-3 text-sm leading-relaxed\">\n {t('enter_email', language)}\n </p>\n </div>\n\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-bold text-slate-500 uppercase tracking-widest ml-1\">\n {t('email_address', language)}\n </label>\n <div className=\"relative\">\n <input\n className={`w-full dark:bg-black/20 bg-slate-100/50 border ${error ? 'border-red-400 dark:border-red-500' : 'dark:border-white/10 border-slate-200'} rounded-2xl h-14 px-5 text-main placeholder:text-slate-400 focus:outline-none focus:ring-2 focus:ring-brand-30 transition-all font-medium`}\n placeholder=\"name@example.com\"\n type=\"email\"\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n if (error) setError('');\n }}\n onKeyDown={handleKeyDown}\n disabled={isLoading}\n autoComplete=\"email\"\n autoFocus\n />\n <div className=\"absolute right-4 top-1/2 -translate-y-1/2 flex items-center text-slate-400\">\n <Mail className=\"w-5 h-5\" />\n </div>\n </div>\n {error && (\n <p className=\"text-red-500 text-xs font-medium ml-1 mt-1\">{error}</p>\n )}\n </div>\n <button\n onClick={handleSubmit}\n disabled={isLoading}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl shadow-xl shadow-brand flex items-center justify-center gap-2 transition-transform active:scale-[0.98] disabled:opacity-70 disabled:cursor-not-allowed\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span>{t('sending_code', language)}</span>\n </>\n ) : (\n <>\n <span>{t('continue', language)}</span>\n <ArrowRight className=\"w-5 h-5\" />\n </>\n )}\n </button>\n </div>\n\n <div className=\"mt-auto pb-8\">\n <div className=\"p-4 dark:bg-white/5 bg-slate-100/50 rounded-2xl mb-6\">\n <div className=\"flex items-start gap-3\">\n <Verified className=\"text-[#6DE8EC] w-5 h-5 mt-0.5 shrink-0\" />\n <p className=\"text-[11px] text-muted leading-normal font-medium\">\n {t('security_notice', language)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-center gap-2 opacity-50\">\n <Lock className=\"text-muted w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-[0.2em] font-bold text-muted\">{t('e2e_encrypted', language)}</span>\n </div>\n </div>\n </motion.div>\n );\n};\n\nexport default Login;\n","/**\n * WebAuthn utilities for CasperID SDK\n * Handles base64url encoding/decoding and credential formatting\n */\n\nimport type {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON\n} from '../types';\n\n/**\n * Convert ArrayBuffer to base64url string\n * Used for encoding WebAuthn credential data for server transport\n */\nexport function arrayBufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n}\n\n/**\n * Convert base64url string to ArrayBuffer\n * Used for decoding server challenge data for WebAuthn API\n */\nexport function base64urlToArrayBuffer(base64url: string): ArrayBuffer {\n // Add padding if needed\n const padding = '='.repeat((4 - (base64url.length % 4)) % 4);\n const base64 = base64url\n .replace(/-/g, '+')\n .replace(/_/g, '/') + padding;\n\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Check if WebAuthn is supported in the current browser\n */\nexport function isWebAuthnSupported(): boolean {\n return !!(\n window.PublicKeyCredential &&\n typeof window.PublicKeyCredential === 'function'\n );\n}\n\n/**\n * Check if platform authenticator (Touch ID, Face ID, Windows Hello) is available\n */\nexport async function isPlatformAuthenticatorAvailable(): Promise<boolean> {\n if (!isWebAuthnSupported()) return false;\n try {\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n } catch {\n return false;\n }\n}\n\n/**\n * Detect device type for credential metadata\n */\nexport function detectDeviceType(): 'mobile' | 'tablet' | 'desktop' {\n const userAgent = navigator.userAgent.toLowerCase();\n\n if (/iphone|ipod|android.*mobile|windows phone|blackberry/i.test(userAgent)) {\n return 'mobile';\n }\n if (/ipad|android(?!.*mobile)|tablet/i.test(userAgent)) {\n return 'tablet';\n }\n return 'desktop';\n}\n\n/**\n * Get device info for credential metadata\n */\nexport function getDeviceInfo(): { platform: string; userAgent: string; deviceType: string } {\n return {\n platform: navigator.platform || 'unknown',\n userAgent: navigator.userAgent,\n deviceType: detectDeviceType()\n };\n}\n\n/**\n * Convert server registration options to WebAuthn API format\n */\nexport function prepareRegistrationOptions(\n serverOptions: PublicKeyCredentialCreationOptionsJSON\n): PublicKeyCredentialCreationOptions {\n return {\n ...serverOptions,\n challenge: base64urlToArrayBuffer(serverOptions.challenge),\n user: {\n ...serverOptions.user,\n id: base64urlToArrayBuffer(serverOptions.user.id)\n },\n excludeCredentials: serverOptions.excludeCredentials?.map(cred => ({\n ...cred,\n id: base64urlToArrayBuffer(cred.id)\n }))\n };\n}\n\n/**\n * Convert server authentication options to WebAuthn API format\n */\nexport function prepareAuthenticationOptions(\n serverOptions: PublicKeyCredentialRequestOptionsJSON\n): PublicKeyCredentialRequestOptions {\n return {\n ...serverOptions,\n challenge: base64urlToArrayBuffer(serverOptions.challenge),\n allowCredentials: serverOptions.allowCredentials?.map(cred => ({\n ...cred,\n id: base64urlToArrayBuffer(cred.id)\n }))\n };\n}\n\n/**\n * Format registration credential for server transport\n */\nexport function formatRegistrationCredential(\n credential: PublicKeyCredential\n): {\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n attestationObject: string;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n deviceInfo: { platform: string; userAgent: string; deviceType: string };\n} {\n const response = credential.response as AuthenticatorAttestationResponse;\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n attestationObject: arrayBufferToBase64url(response.attestationObject)\n },\n clientExtensionResults: credential.getClientExtensionResults(),\n deviceInfo: getDeviceInfo()\n };\n}\n\n/**\n * Format authentication credential for server transport\n */\nexport function formatAuthenticationCredential(\n credential: PublicKeyCredential\n): {\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle: string | null;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n} {\n const response = credential.response as AuthenticatorAssertionResponse;\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n signature: arrayBufferToBase64url(response.signature),\n userHandle: response.userHandle\n ? arrayBufferToBase64url(response.userHandle)\n : null\n },\n clientExtensionResults: credential.getClientExtensionResults()\n };\n}\n\n/**\n * Create a passkey (registration)\n */\nexport async function createPasskey(\n options: PublicKeyCredentialCreationOptionsJSON\n): Promise<{\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n attestationObject: string;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n deviceInfo: { platform: string; userAgent: string; deviceType: string };\n}> {\n if (!isWebAuthnSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const preparedOptions = prepareRegistrationOptions(options);\n\n const credential = await navigator.credentials.create({\n publicKey: preparedOptions\n }) as PublicKeyCredential | null;\n\n if (!credential) {\n throw new Error('Passkey creation was cancelled or failed');\n }\n\n return formatRegistrationCredential(credential);\n}\n\n/**\n * Authenticate with a passkey\n */\nexport async function authenticateWithPasskey(\n options: PublicKeyCredentialRequestOptionsJSON\n): Promise<{\n id: string;\n rawId: string;\n type: string;\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle: string | null;\n };\n clientExtensionResults: AuthenticationExtensionsClientOutputs;\n}> {\n if (!isWebAuthnSupported()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n\n const preparedOptions = prepareAuthenticationOptions(options);\n\n const credential = await navigator.credentials.get({\n publicKey: preparedOptions\n }) as PublicKeyCredential | null;\n\n if (!credential) {\n throw new Error('Passkey authentication was cancelled or failed');\n }\n\n return formatAuthenticationCredential(credential);\n}\n","import React, { useState, useEffect } from 'react';\nimport { motion } from 'framer-motion';\nimport { Fingerprint, Loader2, ShieldCheck, AlertCircle, RefreshCw } from 'lucide-react';\nimport { t } from '../utils/i18n';\nimport {\n isWebAuthnSupported,\n isPlatformAuthenticatorAvailable,\n authenticateWithPasskey\n} from '../utils/webauthn';\nimport type { PasskeyAuthInitResponse, PasskeyAuthCompleteResponse } from '../types';\n\ninterface PasskeyAuthProps {\n email: string;\n onSuccess: (sessionToken: string, user: PasskeyAuthCompleteResponse['user'], businessToken?: string) => void;\n onError?: (error: string) => void;\n onFallbackToOTP?: () => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst PasskeyAuth: React.FC<PasskeyAuthProps> = ({\n email,\n onSuccess,\n onError,\n onFallbackToOTP,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n const [isSupported, setIsSupported] = useState(true);\n const [autoTriggered, setAutoTriggered] = useState(false);\n\n // Check WebAuthn support on mount\n useEffect(() => {\n const checkSupport = async () => {\n const supported = isWebAuthnSupported();\n const platformAvailable = await isPlatformAuthenticatorAvailable();\n setIsSupported(supported && platformAvailable);\n\n if (!supported || !platformAvailable) {\n setError(t('webauthn_not_supported', language));\n }\n };\n checkSupport();\n }, [language]);\n\n // Auto-trigger passkey auth on mount (better UX)\n useEffect(() => {\n if (isSupported && !autoTriggered && !previewMode) {\n setAutoTriggered(true);\n // Small delay to let the UI render first\n const timer = setTimeout(() => {\n handleAuthenticate();\n }, 500);\n return () => clearTimeout(timer);\n }\n }, [isSupported, autoTriggered, previewMode]);\n\n const handleAuthenticate = async () => {\n if (isLoading) return;\n\n setIsLoading(true);\n setError('');\n\n if (previewMode) {\n // Mock success for preview\n setTimeout(() => {\n setIsLoading(false);\n onSuccess('mock-session-token', {\n user_id: 'mock-user-id',\n email: email,\n tier: 'layer_1'\n });\n }, 1500);\n return;\n }\n\n try {\n // Step 1: Get authentication options from server\n const initResponse = await fetch(`${apiBaseUrl}/api/passkey/auth/begin`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include',\n body: JSON.stringify({ email })\n });\n\n if (!initResponse.ok) {\n const errorData = await initResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to initialize authentication');\n }\n\n const initData: PasskeyAuthInitResponse = await initResponse.json();\n\n if (!initData.success || !initData.options) {\n throw new Error(initData.error || 'Invalid authentication options');\n }\n\n // Step 2: Trigger WebAuthn authentication\n const credential = await authenticateWithPasskey(initData.options);\n\n // Step 3: Complete authentication with server\n const completeResponse = await fetch(`${apiBaseUrl}/api/passkey/auth/finish`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include',\n body: JSON.stringify({\n email,\n challengeId: initData.challengeId,\n credential\n })\n });\n\n if (!completeResponse.ok) {\n const errorData = await completeResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Authentication failed');\n }\n\n const completeData: PasskeyAuthCompleteResponse = await completeResponse.json();\n\n if (completeData.success && completeData.session_token) {\n onSuccess(completeData.session_token, completeData.user, completeData.business_token);\n } else {\n throw new Error(completeData.error || 'Authentication failed');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Authentication failed';\n\n // Handle user cancellation gracefully\n if (message.includes('cancelled') || message.includes('NotAllowedError')) {\n setError(t('passkey_cancelled', language));\n } else {\n setError(message);\n onError?.(message);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"mb-8\">\n <h2 className=\"text-3xl font-extrabold text-main tracking-tight leading-tight\">\n {t('welcome_back', language)}\n </h2>\n <p className=\"text-muted mt-3 text-sm leading-relaxed\">\n {t('passkey_auth_subtitle', language)}\n </p>\n </div>\n\n {/* Email display */}\n <div className=\"mb-6 p-4 dark:bg-white/5 bg-slate-100/50 rounded-2xl\">\n <p className=\"text-xs text-muted mb-1\">{t('signing_in_as', language)}</p>\n <p className=\"text-main font-semibold\">{email}</p>\n </div>\n\n {/* Passkey animation area */}\n <div className=\"flex-1 flex flex-col items-center justify-center py-8\">\n <motion.div\n animate={isLoading ? {\n scale: [1, 1.1, 1],\n opacity: [1, 0.7, 1]\n } : {}}\n transition={{\n duration: 1.5,\n repeat: isLoading ? Infinity : 0,\n ease: \"easeInOut\"\n }}\n className={`w-24 h-24 rounded-full flex items-center justify-center mb-6 ${\n isLoading\n ? 'bg-brand/20 border-2 border-brand'\n : error\n ? 'bg-red-500/10 border-2 border-red-400'\n : 'bg-brand/10 border-2 border-brand/30'\n }`}\n >\n {isLoading ? (\n <Loader2 className=\"w-10 h-10 text-brand animate-spin\" />\n ) : error ? (\n <AlertCircle className=\"w-10 h-10 text-red-400\" />\n ) : (\n <Fingerprint className=\"w-10 h-10 text-brand\" />\n )}\n </motion.div>\n\n <p className=\"text-main font-semibold text-center mb-2\">\n {isLoading\n ? t('authenticating', language)\n : error\n ? t('authentication_failed', language)\n : t('use_passkey', language)\n }\n </p>\n\n {error && (\n <p className=\"text-red-500 text-sm text-center mb-4 max-w-xs\">\n {error}\n </p>\n )}\n\n {!isLoading && (\n <p className=\"text-muted text-sm text-center max-w-xs\">\n {t('passkey_auth_hint', language)}\n </p>\n )}\n </div>\n\n {/* Action buttons */}\n <div className=\"space-y-3 pb-8\">\n {!isLoading && (\n <button\n onClick={handleAuthenticate}\n disabled={!isSupported}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl shadow-xl shadow-brand/30 flex items-center justify-center gap-2 transition-transform active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {error ? (\n <>\n <RefreshCw className=\"w-5 h-5\" />\n <span>{t('try_again', language)}</span>\n </>\n ) : (\n <>\n <Fingerprint className=\"w-5 h-5\" />\n <span>{t('authenticate', language)}</span>\n </>\n )}\n </button>\n )}\n\n {onFallbackToOTP && (\n <button\n onClick={onFallbackToOTP}\n disabled={isLoading}\n className=\"w-full h-12 bg-transparent border dark:border-white/10 border-slate-200 text-muted hover:text-main font-medium rounded-2xl flex items-center justify-center gap-2 transition-colors disabled:opacity-50\"\n >\n {t('use_email_instead', language)}\n </button>\n )}\n </div>\n\n {/* Security badge */}\n <div className=\"flex items-center justify-center gap-2 pb-4 opacity-50\">\n <ShieldCheck className=\"text-muted w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-[0.2em] font-bold text-muted\">\n {t('biometric_secured', language)}\n </span>\n </div>\n </motion.div>\n );\n};\n\nexport default PasskeyAuth;\n","import React, { useState, useEffect } from 'react';\nimport { motion } from 'framer-motion';\nimport { Fingerprint, Loader2, ShieldCheck, AlertCircle, CheckCircle2, Key, Smartphone, Lock } from 'lucide-react';\nimport { t } from '../utils/i18n';\nimport {\n isWebAuthnSupported,\n isPlatformAuthenticatorAvailable,\n createPasskey\n} from '../utils/webauthn';\nimport type { PasskeyRegisterInitResponse, PasskeyRegisterCompleteResponse } from '../types';\n\ninterface PasskeyRegisterProps {\n email: string;\n sessionToken: string;\n onSuccess: (user: PasskeyRegisterCompleteResponse['user'], businessToken?: string) => void;\n onError?: (error: string) => void;\n onSkip?: () => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst PasskeyRegister: React.FC<PasskeyRegisterProps> = ({\n email,\n sessionToken,\n onSuccess,\n onError,\n onSkip,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n const [isSupported, setIsSupported] = useState(true);\n const [isSuccess, setIsSuccess] = useState(false);\n\n // Check WebAuthn support on mount\n useEffect(() => {\n const checkSupport = async () => {\n const supported = isWebAuthnSupported();\n const platformAvailable = await isPlatformAuthenticatorAvailable();\n setIsSupported(supported && platformAvailable);\n\n if (!supported || !platformAvailable) {\n setError(t('webauthn_not_supported', language));\n }\n };\n checkSupport();\n }, [language]);\n\n const handleRegister = async () => {\n if (isLoading) return;\n\n setIsLoading(true);\n setError('');\n\n if (previewMode) {\n // Mock success for preview\n setTimeout(() => {\n setIsLoading(false);\n setIsSuccess(true);\n setTimeout(() => {\n onSuccess({\n user_id: 'mock-user-id',\n email: email,\n tier: 'layer_0'\n });\n }, 1000);\n }, 1500);\n return;\n }\n\n try {\n // Step 1: Get registration options from server\n const initResponse = await fetch(`${apiBaseUrl}/api/passkey/register/begin`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`,\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include',\n body: JSON.stringify({ email })\n });\n\n if (!initResponse.ok) {\n const errorData = await initResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to initialize registration');\n }\n\n const initData: PasskeyRegisterInitResponse = await initResponse.json();\n\n if (!initData.success || !initData.options) {\n throw new Error(initData.error || 'Invalid registration options');\n }\n\n // Step 2: Create passkey using WebAuthn\n const credential = await createPasskey(initData.options);\n\n // Step 3: Complete registration with server\n const completeResponse = await fetch(`${apiBaseUrl}/api/passkey/register/finish`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`,\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include',\n body: JSON.stringify({\n userId: initData.userId,\n credential,\n deviceInfo: {\n userAgent: navigator.userAgent\n }\n })\n });\n\n if (!completeResponse.ok) {\n const errorData = await completeResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Registration failed');\n }\n\n const completeData: PasskeyRegisterCompleteResponse = await completeResponse.json();\n\n if (completeData.success) {\n setIsSuccess(true);\n // Brief delay to show success state\n setTimeout(() => {\n onSuccess(completeData.user, completeData.business_token);\n }, 1000);\n } else {\n throw new Error(completeData.error || 'Registration failed');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Registration failed';\n\n // Handle user cancellation gracefully\n if (message.includes('cancelled') || message.includes('NotAllowedError')) {\n setError(t('passkey_cancelled', language));\n } else {\n setError(message);\n onError?.(message);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const benefits = [\n { icon: Key, text: t('passkey_benefit_1', language) },\n { icon: ShieldCheck, text: t('passkey_benefit_2', language) },\n { icon: Smartphone, text: t('passkey_benefit_3', language) }\n ];\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"mb-8\">\n <h2 className=\"text-3xl font-extrabold text-main tracking-tight leading-tight\">\n {t('create_passkey', language)}\n </h2>\n <p className=\"text-muted mt-3 text-sm leading-relaxed\">\n {t('passkey_register_subtitle', language)}\n </p>\n </div>\n\n {/* Email display */}\n <div className=\"mb-6 p-4 dark:bg-white/5 bg-slate-100/50 rounded-2xl\">\n <p className=\"text-xs text-muted mb-1\">{t('signing_in_as', language)}</p>\n <p className=\"text-main font-semibold\">{email}</p>\n </div>\n\n {/* Benefits list */}\n <div className=\"mb-8\">\n <p className=\"text-sm font-semibold text-main mb-4\">{t('passkey_benefits_title', language)}</p>\n <div className=\"space-y-3\">\n {benefits.map((benefit, index) => (\n <div key={index} className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-xl bg-brand/10 flex items-center justify-center\">\n <benefit.icon className=\"w-5 h-5 text-brand\" />\n </div>\n <span className=\"text-sm text-muted\">{benefit.text}</span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Status indicator */}\n {(isLoading || isSuccess || error) && (\n <div className=\"flex-1 flex flex-col items-center justify-center py-4\">\n <motion.div\n animate={isLoading ? {\n scale: [1, 1.1, 1],\n opacity: [1, 0.7, 1]\n } : {}}\n transition={{\n duration: 1.5,\n repeat: isLoading ? Infinity : 0,\n ease: \"easeInOut\"\n }}\n className={`w-20 h-20 rounded-full flex items-center justify-center mb-4 ${\n isSuccess\n ? 'bg-green-500/20 border-2 border-green-400'\n : isLoading\n ? 'bg-brand/20 border-2 border-brand'\n : 'bg-red-500/10 border-2 border-red-400'\n }`}\n >\n {isSuccess ? (\n <CheckCircle2 className=\"w-10 h-10 text-green-400\" />\n ) : isLoading ? (\n <Loader2 className=\"w-10 h-10 text-brand animate-spin\" />\n ) : (\n <AlertCircle className=\"w-10 h-10 text-red-400\" />\n )}\n </motion.div>\n\n <p className=\"text-main font-semibold text-center\">\n {isSuccess\n ? t('passkey_created', language)\n : isLoading\n ? t('creating_passkey', language)\n : t('passkey_create_failed', language)\n }\n </p>\n\n {error && (\n <p className=\"text-red-500 text-sm text-center mt-2 max-w-xs\">\n {error}\n </p>\n )}\n </div>\n )}\n\n {/* Action buttons */}\n <div className=\"mt-auto space-y-3 pb-8\">\n {!isSuccess && (\n <button\n onClick={handleRegister}\n disabled={!isSupported || isLoading}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl shadow-xl shadow-brand/30 flex items-center justify-center gap-2 transition-transform active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span>{t('creating_passkey', language)}</span>\n </>\n ) : (\n <>\n <Fingerprint className=\"w-5 h-5\" />\n <span>{t('register_passkey', language)}</span>\n </>\n )}\n </button>\n )}\n\n {onSkip && !isLoading && !isSuccess && (\n <button\n onClick={onSkip}\n className=\"w-full h-12 bg-transparent border dark:border-white/10 border-slate-200 text-muted hover:text-main font-medium rounded-2xl flex items-center justify-center transition-colors\"\n >\n {t('do_this_later', language)}\n </button>\n )}\n </div>\n\n {/* Security badge */}\n <div className=\"flex items-center justify-center gap-2 pb-4 opacity-50\">\n <Lock className=\"text-muted w-3 h-3\" />\n <span className=\"text-[10px] uppercase tracking-[0.2em] font-bold text-muted\">\n {t('e2e_encrypted', language)}\n </span>\n </div>\n </motion.div>\n );\n};\n\nexport default PasskeyRegister;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { motion } from 'framer-motion';\nimport { Delete, ArrowRight, Loader2, RefreshCw } from 'lucide-react';\nimport type { VerifyOTPResponse } from '../types';\nimport { t } from '../utils/i18n';\n\ninterface UserAccountInfo {\n user_id: string;\n wallet?: string;\n tier?: string;\n did_address?: string;\n}\n\ninterface PinVerificationProps {\n email: string;\n verificationId: string;\n onNext: (sessionToken: string, userAccount?: UserAccountInfo | null, businessToken?: string) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst PinVerification: React.FC<PinVerificationProps> = ({\n email,\n verificationId,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey,\n previewMode = false,\n language = 'EN'\n}) => {\n const [pin, setPin] = useState<string[]>(['', '', '', '', '', '']);\n const [isVerifying, setIsVerifying] = useState(false);\n const [isResending, setIsResending] = useState(false);\n const [error, setError] = useState('');\n const [resendCooldown, setResendCooldown] = useState(0);\n const [currentVerificationId, setCurrentVerificationId] = useState(verificationId);\n\n // Cooldown timer for resend\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n // Auto-verify when all digits are entered\n useEffect(() => {\n if (pin.every(digit => digit !== '') && !isVerifying) {\n handleVerify();\n }\n }, [pin]);\n\n const handleDigitPress = useCallback((digit: string) => {\n setError('');\n setPin(prev => {\n const newPin = [...prev];\n const emptyIndex = newPin.findIndex(d => d === '');\n if (emptyIndex !== -1) {\n newPin[emptyIndex] = digit;\n }\n return newPin;\n });\n }, []);\n\n const handleDelete = useCallback(() => {\n setError('');\n setPin(prev => {\n const newPin = [...prev];\n // Find last filled digit\n for (let i = newPin.length - 1; i >= 0; i--) {\n if (newPin[i] !== '') {\n newPin[i] = '';\n break;\n }\n }\n return newPin;\n });\n }, []);\n\n // Keyboard input support\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isVerifying) return;\n\n // Handle number keys (both main keyboard and numpad)\n if (/^[0-9]$/.test(e.key)) {\n e.preventDefault();\n handleDigitPress(e.key);\n }\n // Handle backspace/delete\n else if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n handleDelete();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isVerifying, handleDigitPress, handleDelete]);\n\n const handleVerify = async () => {\n const otp = pin.join('');\n if (otp.length !== 6) {\n setError(t('error_pin_incomplete', language));\n return;\n }\n\n setIsVerifying(true);\n setError('');\n\n if (previewMode) {\n setTimeout(() => {\n setIsVerifying(false);\n onNext('mock-session-token', null);\n }, 1000);\n return;\n }\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/auth/verify-otp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-ID': apiKey || ''\n },\n body: JSON.stringify({\n verificationId: currentVerificationId,\n otp\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Verification failed with status ${response.status}`);\n }\n\n const data: VerifyOTPResponse = await response.json();\n\n if (data.success && data.sessionToken) {\n onNext(data.sessionToken, data.userAccount, data.business_token);\n } else {\n setError(data.error || t('invalid_code', language));\n if (data.attemptsLeft !== undefined) {\n setError(t('invalid_code_attempts', language).replace('{attempts}', data.attemptsLeft.toString()));\n }\n // Clear pin on error\n setPin(['', '', '', '', '', '']);\n onError?.(data.error || t('verification_failed', language));\n }\n } catch (err) {\n const errorMessage = t('error_verify_failed', language);\n setError(errorMessage);\n setPin(['', '', '', '', '', '']);\n onError?.(errorMessage);\n } finally {\n setIsVerifying(false);\n }\n };\n\n const handleResend = async () => {\n if (resendCooldown > 0 || isResending) return;\n\n setIsResending(true);\n setError('');\n\n if (previewMode) {\n setTimeout(() => {\n setIsResending(false);\n setResendCooldown(60);\n setPin(['', '', '', '', '', '']);\n }, 800);\n return;\n }\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/auth/resend-otp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ verificationId: currentVerificationId }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data.success) {\n setResendCooldown(60); // 60 second cooldown\n setPin(['', '', '', '', '', '']);\n // Note: verificationId stays the same for resend\n } else {\n setError(data.error || t('error_resend_failed', language));\n }\n } catch (err) {\n setError(t('error_resend_failed', language));\n } finally {\n setIsResending(false);\n }\n };\n\n // Mask email for display\n const maskedEmail = email.replace(/(.{2})(.*)(@.*)/, '$1***$3');\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 1.05 }}\n className=\"flex-1 flex flex-col px-8 pt-12\"\n >\n <div className=\"space-y-2 mb-8\">\n <h1 className=\"text-3xl font-bold tracking-tight text-main\">{t('verify_email', language)}</h1>\n <p className=\"text-muted text-sm font-medium\">\n {t('enter_code', language)} <span className=\"text-main font-semibold\">{maskedEmail}</span>\n </p>\n </div>\n\n {/* PIN Display */}\n <div className=\"flex justify-between gap-2 mb-6\">\n {pin.map((digit, i) => (\n <div\n key={i}\n className={`size-12 rounded-2xl dark:bg-black/20 bg-slate-100/50 flex items-center justify-center text-xl font-bold border transition-all ${digit\n ? 'text-brand dark:border-brand-30 border-brand-50'\n : 'text-muted dark:border-white/10 border-slate-200'\n } ${error ? 'border-red-400 dark:border-red-500' : ''}`}\n >\n {digit}\n {!digit && pin.findIndex(d => d === '') === i && (\n <div className=\"w-0.5 h-6 bg-brand animate-pulse\" />\n )}\n </div>\n ))}\n </div>\n\n {/* Error Message */}\n {error && (\n <p className=\"text-red-500 text-xs font-medium text-center mb-4\">{error}</p>\n )}\n\n {/* Number Pad */}\n <div className=\"grid grid-cols-3 gap-4 mb-8\">\n {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => (\n <button\n key={num}\n onClick={() => handleDigitPress(num.toString())}\n disabled={isVerifying}\n className=\"h-14 rounded-2xl dark:hover:bg-slate-100 dark:bg-white/5 hover:bg-slate-100 flex items-center justify-center text-xl font-bold transition-colors text-main disabled:opacity-50\"\n >\n {num}\n </button>\n ))}\n <div className=\"h-14\" />\n <button\n onClick={() => handleDigitPress('0')}\n disabled={isVerifying}\n className=\"h-14 rounded-2xl dark:hover:bg-slate-100 dark:bg-white/5 hover:bg-slate-100 flex items-center justify-center text-xl font-bold transition-colors text-main disabled:opacity-50\"\n >\n 0\n </button>\n <button\n onClick={handleDelete}\n disabled={isVerifying}\n className=\"h-14 rounded-2xl dark:hover:bg-slate-100 dark:bg-white/5 hover:bg-slate-100 flex items-center justify-center transition-colors text-main disabled:opacity-50\"\n >\n <Delete className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Action Buttons */}\n <div className=\"mt-auto pb-8 space-y-4\">\n <button\n onClick={handleVerify}\n disabled={isVerifying || pin.some(d => d === '')}\n className=\"w-full h-14 bg-brand hover:bg-brand/90 text-white font-bold rounded-2xl transition-all shadow-lg shadow-brand flex items-center justify-center gap-2 group disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isVerifying ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n <span>{t('verifying', language)}</span>\n </>\n ) : (\n <>\n <span>{t('verify', language)}</span>\n <ArrowRight className=\"w-5 h-5 group-hover:translate-x-1 transition-transform\" />\n </>\n )}\n </button>\n <button\n onClick={handleResend}\n disabled={resendCooldown > 0 || isResending}\n className=\"w-full h-14 dark:bg-white/5 hover:dark:bg-white/10 bg-slate-100 hover:bg-slate-200 text-muted font-bold rounded-2xl transition-all border dark:border-white/10 border-slate-200 flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isResending ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n <span>{t('sending', language)}</span>\n </>\n ) : resendCooldown > 0 ? (\n <span>{t('resend_code', language)} ({resendCooldown}s)</span>\n ) : (\n <>\n <RefreshCw className=\"w-4 h-4\" />\n <span>{t('resend_code', language)}</span>\n </>\n )}\n </button>\n </div>\n </motion.div>\n );\n};\n\nexport default PinVerification;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { Verified, RefreshCw } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface SecurityUpgradeProps {\n onNext: () => void;\n onSkip?: () => void;\n language?: string;\n}\n\nconst SecurityUpgrade: React.FC<SecurityUpgradeProps> = ({ onNext, onSkip, language = 'EN' }) => (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col\"\n >\n <div className=\"p-6 pb-2\">\n <div className=\"flex justify-between items-center mb-4\">\n <span className=\"text-xs font-semibold uppercase tracking-widest text-brand/80\">\n {t('verification_step', language)}\n </span>\n <span className=\"text-xs font-bold text-muted\">{t('kyc_required', language)}</span>\n </div>\n <div className=\"w-full bg-brand-10 h-1.5 rounded-full overflow-hidden\">\n <div\n className=\"bg-brand h-full rounded-full\"\n style={{ width: '40%' }}\n />\n </div>\n </div>\n\n <div className=\"flex-1 flex flex-col items-center justify-center px-8 text-center gap-8\">\n <div className=\"relative group\">\n <div className=\"absolute inset-0 bg-cyan-400/20 blur-3xl rounded-full scale-75 group-hover:scale-100 transition-transform duration-500\" />\n <div className=\"relative w-32 h-32 rounded-full bg-gradient-to-tr from-brand-20 to-brand-5 flex items-center justify-center border border-brand-30 shadow-inner\">\n <Verified className=\"w-16 h-16 text-brand\" />\n </div>\n <div className=\"absolute bottom-1 right-1 w-8 h-8 rounded-full glass-container border-2 border-brand flex items-center justify-center\">\n <RefreshCw className=\"w-4 h-4 text-brand\" />\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <h1 className=\"text-2xl font-bold tracking-tight text-main leading-tight\">\n {t('security_upgrade_required', language)}\n </h1>\n <p className=\"text-muted text-base leading-relaxed font-medium\">\n {t('security_upgrade_desc', language)}\n </p>\n </div>\n\n <div className=\"flex flex-wrap justify-center gap-2\">\n <span className=\"px-3 py-1 bg-brand/10 rounded-xl text-[10px] font-bold text-brand uppercase tracking-tighter border border-brand-10\">\n {t('biometric_secure', language)}\n </span>\n <span className=\"px-3 py-1 bg-cyan-400/10 rounded-xl text-[10px] font-bold text-cyan-500 uppercase tracking-tighter border border-cyan-400/10\">\n {t('zero_knowledge', language)}\n </span>\n </div>\n </div>\n\n <div className=\"p-8 space-y-4\">\n <button\n onClick={onNext}\n className=\"w-full bg-brand hover:bg-brand/90 text-white rounded-2xl py-4 font-bold text-lg shadow-xl shadow-brand transition-all active:scale-[0.98]\"\n >\n {t('start_upgrade', language)}\n </button>\n {onSkip && (\n <button\n onClick={onSkip}\n className=\"w-full text-muted text-sm font-bold hover:text-main transition-colors\"\n >\n {t('do_this_later', language)}\n </button>\n )}\n </div>\n </motion.div>\n);\n\nexport default SecurityUpgrade;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\ninterface FaceScanProps {\n requestId: string;\n onNext: (livenessVerified: boolean) => Promise<void>;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst instructions = [\n 'Position your face in the frame',\n 'Blink 3 times naturally',\n 'Open your mouth',\n 'Hold still',\n 'Processing verification...',\n];\n\n// Helper function to calculate Euclidean distance\nconst euclideanDist = (p1: any, p2: any) =>\n Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n\nconst FaceScan: React.FC<FaceScanProps> = ({\n requestId,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const framesRef = useRef<Blob[]>([]);\n const faceMeshRef = useRef<any>(null);\n const cameraRef = useRef<any>(null);\n\n const [step, setStep] = useState(0);\n const [cameraReady, setCameraReady] = useState(false);\n const [error, setError] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [cameraPermissionDenied, setCameraPermissionDenied] = useState(false);\n const [blinkCount, setBlinkCount] = useState(0);\n const [isBlinking, setIsBlinking] = useState(false);\n const [mouthOpenProgress, setMouthOpenProgress] = useState(0);\n\n // Use refs for values accessed in MediaPipe callback to avoid stale closures\n const stepRef = useRef(0);\n const blinkCountRef = useRef(0);\n const isBlinkingRef = useRef(false);\n const mouthOpenProgressRef = useRef(0);\n const submissionStartedRef = useRef(false);\n\n // Helper functions to update both state and ref together\n const updateStep = (value: number) => {\n stepRef.current = value;\n setStep(value);\n };\n\n const updateBlinkCount = (value: number) => {\n blinkCountRef.current = value;\n setBlinkCount(value);\n };\n\n const updateIsBlinking = (value: boolean) => {\n isBlinkingRef.current = value;\n setIsBlinking(value);\n };\n\n const updateMouthOpenProgress = (value: number) => {\n mouthOpenProgressRef.current = value;\n setMouthOpenProgress(value);\n };\n\n // Calculate progress percentage\n const progress = step === 0 ? 0 :\n step === 1 ? (blinkCount / 3) * 100 :\n step === 2 ? mouthOpenProgress :\n step === 3 ? 100 :\n Math.min(100, Math.round((step / (instructions.length - 1)) * 100));\n\n // Load MediaPipe FaceMesh\n useEffect(() => {\n const loadFaceMesh = async () => {\n try {\n // Dynamically import MediaPipe (cast as any - no TS types available)\n const { FaceMesh } = await import('@mediapipe/face_mesh' as any);\n const { Camera } = await import('@mediapipe/camera_utils' as any);\n\n const faceMesh = new FaceMesh({\n locateFile: (file: string) => `https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh/${file}`\n });\n\n faceMesh.setOptions({\n maxNumFaces: 1,\n refineLandmarks: true,\n minDetectionConfidence: 0.3,\n minTrackingConfidence: 0.3\n });\n\n console.log('✅ MediaPipe FaceMesh loaded successfully');\n\n faceMesh.onResults(onFaceMeshResults);\n faceMeshRef.current = faceMesh;\n\n // Initialize camera\n if (videoRef.current) {\n const camera = new Camera(videoRef.current, {\n onFrame: async () => {\n if (faceMeshRef.current && videoRef.current) {\n await faceMeshRef.current.send({ image: videoRef.current });\n }\n },\n width: 640,\n height: 480\n });\n\n await camera.start();\n cameraRef.current = camera;\n setCameraReady(true);\n console.log('📹 Camera started successfully');\n }\n } catch (err: any) {\n console.error('FaceMesh initialization error:', err);\n if (err.name === 'NotAllowedError') {\n setCameraPermissionDenied(true);\n setError('Camera permission denied. Please enable camera access.');\n } else {\n setError('Unable to initialize face detection. Please try again.');\n }\n onError?.('FaceMesh initialization failed');\n }\n };\n\n loadFaceMesh();\n\n return () => {\n if (cameraRef.current) {\n cameraRef.current.stop();\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n };\n }, []);\n\n // Process face landmarks from MediaPipe\n const onFaceMeshResults = (results: any) => {\n if (!canvasRef.current || isProcessing) return;\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx || !results.image) return;\n\n // Draw video frame to canvas (mirrored)\n ctx.save();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(results.image, 0, 0, canvas.width, canvas.height);\n ctx.restore();\n\n if (results.multiFaceLandmarks && results.multiFaceLandmarks.length > 0) {\n const landmarks = results.multiFaceLandmarks[0];\n processFaceLandmarks(landmarks);\n } else {\n console.log('⚠️ No face detected in frame');\n }\n };\n\n // Process face landmarks for blink and mouth detection\n const processFaceLandmarks = (landmarks: any[]) => {\n // Use ref values to avoid stale closures\n const currentStep = stepRef.current;\n const currentBlinkCount = blinkCountRef.current;\n const currentIsBlinking = isBlinkingRef.current;\n\n if (currentStep === 0) {\n // Positioning step - check if face is centered\n const nose = landmarks[1];\n const isCentered = nose.x > 0.35 && nose.x < 0.65 && nose.y > 0.35 && nose.y < 0.65;\n\n // Log positioning info occasionally\n if (Math.random() < 0.05) {\n console.log(`📍 Face position: x=${nose.x.toFixed(2)}, y=${nose.y.toFixed(2)} (centered: ${isCentered})`);\n }\n\n if (isCentered) {\n console.log('✅ Face centered! Advancing to blink detection...');\n // Auto-advance to blink step after positioned\n setTimeout(() => updateStep(1), 500);\n }\n } else if (currentStep === 1) {\n // Blink detection\n const leftEyeOpen = euclideanDist(landmarks[159], landmarks[145]);\n const leftEyeWidth = euclideanDist(landmarks[33], landmarks[133]);\n const eyeRatio = leftEyeOpen / leftEyeWidth;\n\n // Log eye ratio every few frames for debugging\n if (Math.random() < 0.1) { // Log ~10% of frames to avoid spam\n console.log(`👁️ Eye ratio: ${eyeRatio.toFixed(3)} (threshold: 0.16, ${eyeRatio < 0.16 ? 'CLOSED' : 'OPEN'})`);\n }\n\n if (eyeRatio < 0.16) {\n // Eye is closed\n if (!currentIsBlinking) {\n console.log('👁️ Blink started (eye closed)');\n updateIsBlinking(true);\n }\n } else {\n // Eye is open\n if (currentIsBlinking) {\n const newBlinkCount = currentBlinkCount + 1;\n console.log(`✅ Blink detected! Count: ${newBlinkCount}/3`);\n updateIsBlinking(false);\n updateBlinkCount(newBlinkCount);\n\n // Capture frame after blink\n captureFrame();\n\n if (newBlinkCount >= 3) {\n console.log('🎉 All 3 blinks completed! Moving to mouth opening step...');\n // Move to mouth opening step\n setTimeout(() => {\n updateStep(2);\n updateMouthOpenProgress(0);\n }, 300);\n }\n }\n }\n } else if (currentStep === 2) {\n // Mouth opening detection\n const upperLip = landmarks[13];\n const lowerLip = landmarks[14];\n const mouthOpen = euclideanDist(upperLip, lowerLip);\n\n const topHead = landmarks[10];\n const chin = landmarks[152];\n const faceHeight = euclideanDist(topHead, chin);\n const mouthOpenRatio = mouthOpen / faceHeight;\n\n // Update progress based on mouth opening\n const openProgress = Math.min((mouthOpenRatio / 0.15) * 100, 100);\n updateMouthOpenProgress(openProgress);\n\n // Capture frames during mouth opening\n if (framesRef.current.length < 15) {\n captureFrame();\n }\n\n // Check if mouth is wide open and we haven't started submitting yet\n if (mouthOpenRatio > 0.12 && framesRef.current.length >= 10 && !submissionStartedRef.current) {\n // Mark as started to avoid double submission during the timeout\n submissionStartedRef.current = true;\n \n // Capture final frame and submit\n captureFrame();\n setTimeout(() => {\n updateStep(3);\n submitLiveness();\n }, 500);\n }\n }\n };\n\n // Capture frame from canvas\n const captureFrame = () => {\n if (!canvasRef.current || framesRef.current.length >= 25) return;\n\n canvasRef.current.toBlob((blob) => {\n if (blob) {\n framesRef.current.push(blob);\n }\n }, 'image/jpeg', 0.8);\n };\n\n // Submit liveness check\n const submitLiveness = async () => {\n setIsProcessing(true);\n updateStep(4); // \"Processing...\"\n\n if (previewMode) {\n setTimeout(() => {\n setIsProcessing(false);\n onNext(true);\n }, 2000);\n return;\n }\n\n try {\n const formData = new FormData();\n const isV2Flow = !!requestId;\n const endpoint = isV2Flow \n ? `${apiBaseUrl}/api/v2/verification/liveness`\n : `${apiBaseUrl}/api/ai/verify-liveness-sequence`;\n\n // Order matters for Multer: append text fields BEFORE files\n if (isV2Flow) {\n formData.append('requestId', requestId);\n \n // V2 server expects all metadata in a single JSON string\n const metadata = {\n totalFrames: framesRef.current.length,\n stepSequence: ['blink', 'open_mouth'],\n timestamp: Date.now()\n };\n formData.append('metadata', JSON.stringify(metadata));\n\n // Limit to 10 frames for V2\n const relevantFrames = framesRef.current.slice(-10);\n relevantFrames.forEach((frame, index) => {\n formData.append('imageFrames', frame, `frame_${index}.jpg`);\n });\n } else {\n // Legacy flow\n framesRef.current.forEach((frame, index) => {\n formData.append(`frame_${index}`, frame, `frame_${index}.jpg`);\n });\n formData.append('totalFrames', framesRef.current.length.toString());\n formData.append('stepSequence', JSON.stringify(['blink', 'open_mouth']));\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n body: formData,\n credentials: 'include'\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Liveness check failed with status ${response.status}`);\n }\n\n const data = await response.json();\n\n // Handle response format for both endpoints\n // AI flow: data.passed\n // V2 flow: data.liveness.status === 'completed'\n const passed = isV2Flow \n ? (data.success && (data.liveness?.success || data.liveness?.status === 'completed' || data.liveness?.status === 'approved'))\n : (data.success && data.passed);\n\n if (passed) {\n // Stop camera\n if (cameraRef.current) {\n cameraRef.current.stop();\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n onNext(true);\n } else {\n const errorMsg = data.error || data.liveness?.error || 'Liveness check failed. Please try again.';\n setError(errorMsg);\n // Reset for retry\n updateStep(0);\n updateBlinkCount(0);\n updateMouthOpenProgress(0);\n framesRef.current = [];\n setIsProcessing(false);\n submissionStartedRef.current = false;\n }\n } catch (err) {\n setError('Verification failed. Please try again.');\n updateStep(0);\n updateBlinkCount(0);\n updateMouthOpenProgress(0);\n framesRef.current = [];\n setIsProcessing(false);\n onError?.('Liveness submission failed');\n }\n };\n\n // Retry handler\n const handleRetry = () => {\n setError('');\n updateStep(0);\n updateBlinkCount(0);\n updateMouthOpenProgress(0);\n framesRef.current = [];\n setIsProcessing(false);\n submissionStartedRef.current = false;\n };\n\n if (cameraPermissionDenied) {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"flex-1 flex flex-col items-center justify-center px-8 text-center bg-black\"\n >\n <div className=\"w-16 h-16 text-red-500 mb-6 text-5xl\">⚠️</div>\n <h2 className=\"text-xl font-bold text-white mb-3\">Camera Access Required</h2>\n <p className=\"text-gray-400 text-sm mb-6\">\n Please enable camera access in your browser settings to continue with face verification.\n </p>\n <button\n onClick={() => window.location.reload()}\n className=\"px-6 py-3 bg-[#8651e1] text-white rounded-2xl font-bold\"\n >\n Try Again\n </button>\n </motion.div>\n );\n }\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col relative bg-black overflow-hidden\"\n >\n {/* Hidden video for MediaPipe */}\n <video\n ref={videoRef}\n className=\"hidden\"\n playsInline\n muted\n />\n\n {/* Immersive Atmosphere */}\n <div className=\"absolute inset-0 z-0 bg-gradient-to-b from-transparent via-[#8651e1]/5 to-[#8651e1]/10 pointer-events-none\" />\n\n {/* Main Scanner Area */}\n <div className=\"relative z-20 flex-1 flex flex-col items-center justify-center pt-8\">\n <div className=\"relative w-72 h-96 flex items-center justify-center\">\n {/* Portrait Mask with Live Video */}\n <div className=\"absolute inset-0 rounded-[3rem] overflow-hidden border-2 border-slate-200 dark:border-white/10 shadow-2xl\">\n <canvas\n ref={canvasRef}\n width={640}\n height={480}\n className=\"w-full h-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-[#8651e1]/10 mix-blend-overlay\" />\n <div className=\"absolute inset-0 bg-gradient-to-t from-black via-transparent to-transparent h-1/3 mt-auto\" />\n </div>\n\n {/* Biometric Point Grid */}\n <div className=\"absolute inset-0 z-30 pointer-events-none\">\n {[\n { t: '30%', l: '50%' }, { t: '35%', l: '40%' }, { t: '35%', l: '60%' },\n { t: '45%', l: '50%' }, { t: '52%', l: '35%' }, { t: '52%', l: '65%' },\n { t: '60%', l: '45%' }, { t: '60%', l: '55%' }, { t: '70%', l: '50%' },\n ].map((pos, i) => (\n <motion.div\n key={i}\n initial={{ scale: 0, opacity: 0 }}\n animate={{\n scale: [0, 1.5, 1],\n opacity: progress > (i * 11) ? 1 : 0\n }}\n className=\"absolute w-2 h-2 bg-[#6DE8EC] rounded-full shadow-[0_0_12px_#6DE8EC]\"\n style={{ top: pos.t, left: pos.l }}\n />\n ))}\n </div>\n\n {/* Glowing Brackets */}\n <div className=\"absolute -inset-6 z-40\">\n <motion.div\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute top-0 left-0 w-20 h-20 border-t-4 border-l-4 border-[#14b8a6] rounded-tl-[3.5rem]\"\n />\n <motion.div\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute top-0 right-0 w-20 h-20 border-t-4 border-r-4 border-[#14b8a6] rounded-tr-[3.5rem]\"\n />\n <motion.div\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute bottom-0 left-0 w-20 h-20 border-b-4 border-l-4 border-[#14b8a6] rounded-bl-[3.5rem]\"\n />\n <motion.div\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute bottom-0 right-0 w-20 h-20 border-b-4 border-r-4 border-[#14b8a6] rounded-br-[3.5rem]\"\n />\n </div>\n\n {/* Scanning Line */}\n <motion.div\n animate={{ top: ['0%', '100%'] }}\n transition={{ duration: 3, repeat: Infinity, ease: \"linear\" }}\n className=\"absolute left-0 right-0 h-1 bg-gradient-to-r from-transparent via-[#6DE8EC] to-transparent shadow-[0_0_15px_#6DE8EC] z-50 pointer-events-none\"\n style={{ borderRadius: '100%' }}\n />\n </div>\n </div>\n\n {/* Instructions Area */}\n <div className=\"relative z-50 px-8 pb-20 pt-4 flex flex-col items-center gap-6\">\n {error ? (\n <motion.div\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n className=\"bg-red-900/30 border border-red-500/50 p-6 rounded-3xl w-full text-center\"\n >\n <p className=\"text-red-400 font-bold text-lg mb-4\">{error}</p>\n <button\n onClick={handleRetry}\n className=\"px-8 py-3 bg-red-500 hover:bg-red-600 text-white rounded-xl font-bold transition-colors\"\n >\n Try Again\n </button>\n </motion.div>\n ) : (\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={step === 1 ? `${instructions[step]}-${blinkCount}` : instructions[step]}\n initial={{ opacity: 0, y: 10, filter: 'blur(5px)' }}\n animate={{ opacity: 1, y: 0, filter: 'blur(0px)' }}\n exit={{ opacity: 0, y: -10, filter: 'blur(5px)' }}\n className=\"text-white text-center font-bold text-xl leading-tight min-h-[3rem] flex items-center justify-center drop-shadow-lg flex-col gap-2\"\n >\n {isProcessing && step === 4 ? (\n <span className=\"flex items-center gap-3\">\n <svg className=\"animate-spin h-5 w-5\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" fill=\"none\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n {instructions[step]}\n </span>\n ) : (\n <>\n <span>{instructions[step]}</span>\n {step === 1 && <span className=\"text-[#6DE8EC] text-2xl\">({blinkCount}/3)</span>}\n </>\n )}\n </motion.div>\n </AnimatePresence>\n )}\n\n <div className=\"w-full max-w-[240px] h-1.5 bg-slate-200 dark:bg-white/10 rounded-full overflow-hidden\">\n <motion.div\n className=\"h-full bg-gradient-to-r from-[#8651e1] to-[#6DE8EC]\"\n animate={{ width: `${progress}%` }}\n transition={{ duration: 0.3 }}\n />\n </div>\n\n {!error && (\n <div className=\"flex items-center gap-2 text-gray-400 text-xs\">\n <div className={`w-2 h-2 rounded-full ${cameraReady ? 'bg-[#6DE8EC] shadow-[0_0_8px_#6DE8EC]' : 'bg-yellow-500 animate-pulse'}`} />\n <span className=\"uppercase tracking-widest font-bold\">\n {cameraReady ? 'LIVE CAMERA' : 'INITIALIZING...'}\n </span>\n </div>\n )}\n </div>\n </motion.div>\n );\n};\n\nexport default FaceScan;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { Globe, CreditCard, Smartphone, ShieldCheck, ChevronRight } from 'lucide-react';\nimport type { DocumentType } from '../types';\nimport { t } from '../utils/i18n';\n\ninterface VerifyIdentityChoiceProps {\n onNext: (documentType: DocumentType) => void;\n language?: string;\n}\n\nconst docs: { id: DocumentType; title: string; desc: string; Icon: React.FC<any> }[] = [\n { id: 'passport', title: 'Passport', desc: 'All countries supported', Icon: Globe },\n { id: 'drivers_license', title: 'Driver License', desc: 'Government issued card', Icon: CreditCard },\n { id: 'national_id', title: 'ID Card', desc: 'National identity document', Icon: Smartphone },\n];\n\nconst VerifyIdentityChoice: React.FC<VerifyIdentityChoiceProps> = ({ onNext, language = 'EN' }) => (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"flex-1 px-6 pt-4 flex flex-col\"\n >\n <h3 className=\"text-2xl font-bold mb-2 text-main\">{t('verify_identity', language)}</h3>\n <p className=\"text-muted text-sm mb-8 leading-relaxed\">\n {t('choose_document', language)}\n </p>\n\n <div className=\"space-y-4 overflow-y-auto pr-1 pb-6\">\n {docs.map(({ id, title, desc, Icon }) => (\n <button\n key={id}\n onClick={() => onNext(id)}\n className=\"w-full group cursor-pointer dark:bg-white/5 bg-slate-100/50 border dark:border-white/10 border-slate-200 rounded-2xl p-5 flex items-center gap-4 hover:dark:bg-brand/15 hover:bg-brand/5 hover:dark:border-brand-40 hover:border-brand-30 transition-all transform hover:-translate-y-1\"\n >\n <div className=\"w-14 h-14 rounded-xl dark:bg-slate-800/50 bg-white flex items-center justify-center text-brand group-hover:bg-brand/20 transition-colors border dark:border-transparent border-slate-100\">\n <Icon className=\"w-8 h-8\" />\n </div>\n <div className=\"flex-1 text-left\">\n <h4 className=\"font-bold text-base text-main\">{t(id, language)}</h4>\n <p className=\"text-xs text-muted font-medium\">{t(`${id}_desc`, language)}</p>\n </div>\n <ChevronRight className=\"text-brand w-5 h-5\" />\n </button>\n ))}\n\n <div className=\"mt-8 relative h-32 w-full rounded-2xl overflow-hidden dark:bg-white/5 bg-slate-100/30 flex items-center justify-center border border-dashed dark:border-brand-30 border-brand-40\">\n <div className=\"absolute inset-0 opacity-10 bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-brand via-transparent to-transparent\" />\n <div className=\"text-center z-10\">\n <ShieldCheck className=\"text-brand/40 w-10 h-10 mx-auto mb-1\" />\n <p className=\"text-[10px] text-muted uppercase tracking-tighter font-bold\">Encrypted E2E</p>\n </div>\n </div>\n </div>\n </motion.div>\n);\n\nexport default VerifyIdentityChoice;\n","import React, { useRef, useState, useEffect } from 'react';\nimport { motion } from 'framer-motion';\nimport { Camera, HelpCircle, Flashlight, Loader2, AlertCircle, RotateCcw } from 'lucide-react';\nimport type { DocumentType, DocumentUploadResponse, ExtractedDocumentData } from '../types';\n\nimport { t } from '../utils/i18n';\n\ninterface DocumentScanProps {\n requestId: string;\n documentType: DocumentType;\n onNext: (extractedData: ExtractedDocumentData, docUploadId: string, imageUrls: { frontImageUrl?: string; frontImageFileId?: string; backImageUrl?: string; backImageFileId?: string }) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst getDocumentTypeLabels = (language: string) => ({\n passport: t('passport', language),\n drivers_license: t('drivers_license', language),\n national_id: t('national_id', language)\n});\n\nconst DocumentScan: React.FC<DocumentScanProps> = ({\n requestId,\n documentType,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const streamRef = useRef<MediaStream | null>(null);\n\n const [cameraReady, setCameraReady] = useState(false);\n const [capturedImage, setCapturedImage] = useState<Blob | null>(null);\n const [capturedImageUrl, setCapturedImageUrl] = useState<string | null>(null);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState('');\n const [scanSide, setScanSide] = useState<'front' | 'back'>('front');\n const [frontImage, setFrontImage] = useState<Blob | null>(null);\n\n // Initialize camera\n useEffect(() => {\n const initCamera = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n facingMode: 'environment', // Use back camera for documents\n width: { ideal: 1280 },\n height: { ideal: 720 }\n }\n });\n streamRef.current = stream;\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.onloadedmetadata = () => {\n setCameraReady(true);\n };\n }\n } catch (err: any) {\n // Fallback to front camera\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: 'user', width: { ideal: 1280 }, height: { ideal: 720 } }\n });\n streamRef.current = stream;\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.onloadedmetadata = () => {\n setCameraReady(true);\n };\n }\n } catch (fallbackErr) {\n setError(t('unable_access_camera', language));\n onError?.('Camera access failed');\n }\n }\n };\n\n initCamera();\n\n return () => {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n if (capturedImageUrl) {\n URL.revokeObjectURL(capturedImageUrl);\n }\n };\n }, [onError]);\n\n // Capture photo\n const handleCapture = async () => {\n if (!videoRef.current || !canvasRef.current) return;\n\n const canvas = canvasRef.current;\n const video = videoRef.current;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) return;\n\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n ctx.drawImage(video, 0, 0);\n\n canvas.toBlob((blob) => {\n if (blob) {\n setCapturedImage(blob);\n setCapturedImageUrl(URL.createObjectURL(blob));\n }\n }, 'image/jpeg', 0.9);\n };\n\n // Retake photo\n const handleRetake = () => {\n if (capturedImageUrl) {\n URL.revokeObjectURL(capturedImageUrl);\n }\n setCapturedImage(null);\n setCapturedImageUrl(null);\n setError('');\n };\n\n // Confirm and proceed\n const handleConfirm = async () => {\n setIsUploading(true);\n\n if (previewMode) {\n setTimeout(() => {\n setIsUploading(false);\n onNext({\n first_name: 'JOHN',\n last_name: 'DOE',\n date_of_birth: '01 JAN 1990',\n nationality: ''\n }, 'mock-upload-id-789', {\n frontImageUrl: 'mock-front-url',\n frontImageFileId: 'mock-front-id',\n backImageUrl: 'mock-back-url',\n backImageFileId: 'mock-back-id'\n });\n }, 2000);\n return;\n }\n\n if (!capturedImage) {\n setIsUploading(false); // Ensure loading state is reset if no image\n return;\n }\n\n if (scanSide === 'front' && documentType !== 'passport') {\n // For non-passport documents, need back side too\n setFrontImage(capturedImage);\n setCapturedImage(null);\n setCapturedImageUrl(null);\n setScanSide('back');\n setIsUploading(false); // Reset loading state after setting side\n return;\n }\n\n // Upload document(s)\n setIsUploading(true);\n setError('');\n\n try {\n const formData = new FormData();\n formData.append('document_type', documentType);\n\n if (frontImage) {\n formData.append('front_image', frontImage, 'front.jpg');\n formData.append('back_image', capturedImage, 'back.jpg');\n } else {\n formData.append('front_image', capturedImage, 'document.jpg');\n }\n\n const response = await fetch(`${apiBaseUrl}/api/v2/verification/layer3/documents/upload`, {\n method: 'POST',\n body: formData,\n credentials: 'include',\n headers: {\n 'X-Request-Id': requestId,\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n }\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Document upload failed with status ${response.status}`);\n }\n\n const data: DocumentUploadResponse = await response.json();\n\n if (data.success && data.extracted_data) {\n // Stop camera\n if (streamRef.current) {\n streamRef.current.getTracks().forEach(track => track.stop());\n }\n onNext(data.extracted_data, data.upload_id || '', {\n frontImageUrl: data.front_image_url,\n frontImageFileId: data.front_image_file_id,\n backImageUrl: data.back_image_url,\n backImageFileId: data.back_image_file_id\n });\n } else {\n setError(data.error || 'Failed to process document. Please try again.');\n setIsUploading(false);\n }\n } catch (err) {\n setError('Upload failed. Please try again.');\n setIsUploading(false);\n onError?.('Document upload failed');\n }\n };\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col relative\"\n >\n {/* Hidden canvas for capture */}\n <canvas ref={canvasRef} className=\"hidden\" />\n\n {/* Simulated dark camera background */}\n <div className=\"absolute inset-0 z-0\">\n <div className=\"w-full h-full bg-main opacity-10 flex items-center justify-center\">\n <div className=\"w-full h-full opacity-30 bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-[#6DE8EC]/20 via-transparent to-transparent\" />\n </div>\n <div className=\"absolute inset-0 bg-black/30 backdrop-blur-[2px]\" />\n </div>\n\n {/* Top label */}\n <div className=\"relative z-10 p-6 flex flex-col items-center\">\n <div className=\"text-center px-4 py-2 bg-brand-10 backdrop-blur-xl rounded-full border border-brand-10\">\n <h3 className=\"text-main text-sm font-medium tracking-wide uppercase\">\n {t('scan_instruction', language)\n .replace('{side}', t(scanSide, language))\n .replace('{docType}', getDocumentTypeLabels(language)[documentType])}\n </h3>\n </div>\n </div>\n\n {/* ID frame with video or captured image */}\n <div className=\"relative z-10 flex-1 flex items-center justify-center px-6\">\n <div className=\"w-full aspect-[1.58/1] relative\">\n {/* Video or captured image */}\n {capturedImageUrl ? (\n <img\n src={capturedImageUrl}\n alt=\"Captured document\"\n className=\"absolute inset-0 w-full h-full object-cover rounded-2xl\"\n />\n ) : (\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className=\"absolute inset-0 w-full h-full object-cover rounded-2xl\"\n />\n )}\n\n {/* Frame overlay */}\n <div className=\"absolute inset-0 border border-[#6DE8EC] rounded-2xl shadow-[0_0_20px_rgba(109,232,236,0.3),inset_0_0_15px_rgba(109,232,236,0.2)]\" />\n <div className=\"absolute top-0 left-0 w-8 h-8 border-t-4 border-l-4 border-[#6DE8EC] rounded-tl-2xl\" />\n <div className=\"absolute top-0 right-0 w-8 h-8 border-t-4 border-r-4 border-[#6DE8EC] rounded-tr-2xl\" />\n <div className=\"absolute bottom-0 left-0 w-8 h-8 border-b-4 border-l-4 border-[#6DE8EC] rounded-bl-2xl\" />\n <div className=\"absolute bottom-0 right-0 w-8 h-8 border-b-4 border-r-4 border-[#6DE8EC] rounded-br-2xl\" />\n\n {/* Scanning line (only when video is active) */}\n {!capturedImageUrl && cameraReady && (\n <motion.div\n animate={{ top: ['0%', '100%', '0%'] }}\n transition={{ duration: 4, repeat: Infinity, ease: 'linear' }}\n className=\"absolute left-0 w-full h-[2px] bg-gradient-to-r from-transparent via-[#6DE8EC] to-transparent opacity-50\"\n />\n )}\n\n {/* Loading overlay */}\n {!cameraReady && !capturedImageUrl && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 rounded-2xl\">\n <Loader2 className=\"w-8 h-8 text-[#6DE8EC] animate-spin\" />\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"relative z-10 mx-6 mb-4 p-4 bg-red-500/20 border border-red-500/30 rounded-xl flex items-center gap-3\">\n <AlertCircle className=\"w-5 h-5 text-red-500 shrink-0\" />\n <p className=\"text-red-400 text-sm font-medium\">{error}</p>\n </div>\n )}\n\n {/* Bottom controls */}\n <div className=\"relative z-10 p-8 glass-container backdrop-blur-2xl border-t border-brand-10 rounded-t-3xl\">\n <p className=\"text-muted text-xs text-center mb-6 font-medium\">\n {capturedImageUrl\n ? t('review_capture', language)\n : t('align_document', language)}\n </p>\n\n <div className=\"flex items-center justify-between gap-4\">\n {capturedImageUrl ? (\n <>\n <button\n onClick={handleRetake}\n disabled={isUploading}\n className=\"w-12 h-12 rounded-xl bg-brand-5 flex items-center justify-center text-muted disabled:opacity-50\"\n >\n <RotateCcw className=\"w-6 h-6\" />\n </button>\n <button\n onClick={handleConfirm}\n disabled={isUploading}\n className=\"flex-1 bg-brand hover:bg-brand/90 text-white h-14 rounded-2xl flex items-center justify-center gap-2 font-bold text-lg transition-all active:scale-95 shadow-[0_0_25px_rgba(130,66,240,0.5)] disabled:opacity-70\"\n >\n {isUploading ? (\n <>\n <Loader2 className=\"w-6 h-6 animate-spin\" />\n <span>{t('processing', language)}</span>\n </>\n ) : (\n <span>{scanSide === 'front' && documentType !== 'passport' ? t('next_back_side', language) : t('confirm', language)}</span>\n )}\n </button>\n <div className=\"w-12 h-12\" /> {/* Spacer for alignment */}\n </>\n ) : (\n <>\n <button className=\"w-12 h-12 rounded-xl bg-brand-5 flex items-center justify-center text-muted\">\n <Flashlight className=\"w-6 h-6\" />\n </button>\n <button\n onClick={handleCapture}\n disabled={!cameraReady}\n className=\"flex-1 bg-brand hover:bg-brand/90 text-white h-14 rounded-2xl flex items-center justify-center gap-2 font-bold text-lg transition-all active:scale-95 shadow-[0_0_25px_rgba(130,66,240,0.5)] disabled:opacity-50\"\n >\n <Camera className=\"w-6 h-6\" />\n <span>{t('capture', language)}</span>\n </button>\n <button className=\"w-12 h-12 rounded-xl bg-brand-5 flex items-center justify-center text-muted\">\n <HelpCircle className=\"w-6 h-6\" />\n </button>\n </>\n )}\n </div>\n <div className=\"w-32 h-1.5 bg-brand-10 rounded-full mx-auto mt-8\" />\n </div>\n </motion.div>\n );\n};\n\nexport default DocumentScan;\n","import React, { useState } from 'react';\nimport { motion } from 'framer-motion';\nimport { User, CreditCard, Calendar, Globe, CheckCircle2, Sparkles, AlertCircle, Users } from 'lucide-react';\nimport type { ExtractedDocumentData, DocumentType, Layer3SubmitResponse } from '../types';\n\nimport { t } from '../utils/i18n';\n\ninterface ReviewDataProps {\n requestId: string;\n documentType: DocumentType;\n extractedData: ExtractedDocumentData;\n uploadId: string;\n frontImageUrl?: string;\n frontImageFileId?: string;\n backImageUrl?: string;\n backImageFileId?: string;\n onNext: (confirmedData: ExtractedDocumentData) => void;\n onRetake?: () => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\nconst getDocumentTypeLabels = (language: string) => ({\n passport: t('passport', language),\n drivers_license: t('drivers_license', language),\n national_id: t('national_id', language)\n});\n\nconst ReviewData: React.FC<ReviewDataProps> = ({\n requestId,\n documentType,\n extractedData,\n uploadId,\n frontImageUrl,\n frontImageFileId,\n backImageUrl,\n backImageFileId,\n onNext,\n onRetake,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n // Editable fields state - initialize with extracted data\n const [formData, setFormData] = useState({\n firstName: extractedData.first_name || '',\n lastName: extractedData.last_name || '',\n documentNumber: extractedData.document_number || '',\n dateOfBirth: extractedData.date_of_birth || '',\n nationality: extractedData.nationality || '',\n gender: extractedData.gender || ''\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState('');\n\n const handleInputChange = (field: keyof typeof formData, value: string) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n };\n\n const handleConfirm = async () => {\n // Validate required fields\n if (!formData.firstName || !formData.lastName || !formData.documentNumber) {\n setError(t('error_required_fields', language));\n return;\n }\n\n setIsSubmitting(true);\n setError('');\n\n if (previewMode) {\n setTimeout(() => {\n setIsSubmitting(false);\n onNext({\n first_name: formData.firstName,\n last_name: formData.lastName,\n document_number: formData.documentNumber,\n date_of_birth: formData.dateOfBirth,\n nationality: formData.nationality,\n gender: formData.gender,\n document_type: documentType\n });\n }, 1500);\n return;\n }\n\n try {\n // Submit confirmed data to the backend using /layer3/submit endpoint\n const response = await fetch(`${apiBaseUrl}/api/v2/verification/layer3/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include',\n body: JSON.stringify({\n upload_id: uploadId,\n front_image_url: frontImageUrl,\n front_image_file_id: frontImageFileId,\n back_image_url: backImageUrl,\n back_image_file_id: backImageFileId,\n liveness_verified: false, // Will be updated after FaceScan\n document_data: {\n first_name: formData.firstName,\n last_name: formData.lastName,\n document_number: formData.documentNumber,\n date_of_birth: formData.dateOfBirth,\n nationality: formData.nationality,\n gender: formData.gender,\n document_type: documentType\n }\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Data submission failed with status ${response.status}`);\n }\n\n const data: Layer3SubmitResponse = await response.json();\n\n if (data.success) {\n // Pass confirmed data to parent\n onNext({\n first_name: formData.firstName,\n last_name: formData.lastName,\n document_number: formData.documentNumber,\n date_of_birth: formData.dateOfBirth,\n nationality: formData.nationality,\n gender: formData.gender,\n document_type: documentType\n });\n } else {\n setError(data.error || 'Failed to submit data. Please try again.');\n setIsSubmitting(false);\n }\n } catch (err) {\n setError('Failed to submit data. Please try again.');\n setIsSubmitting(false);\n onError?.('Data submission failed');\n }\n };\n\n const confidence = extractedData.confidence || 0;\n // Assuming backend returns percentage directly (e.g., 21 for 21%)\n const confidencePercent = Math.round(confidence);\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n className=\"flex-1 overflow-y-auto px-6 pb-6\"\n >\n {/* Progress bar */}\n <div className=\"flex gap-1 mb-6\">\n {[1, 2, 3, 0].map((fill, i) => (\n <div\n key={i}\n className={`h-1 flex-1 rounded-xl ${fill ? 'bg-brand' : 'bg-brand/20'}`}\n />\n ))}\n </div>\n\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-main mb-2\">{t('review_data', language)}</h1>\n <p className=\"text-muted text-sm leading-relaxed\">\n {t('verify_data_desc', language)}\n </p>\n </div>\n\n {/* Confidence indicator */}\n {confidence > 0 && (\n <div className=\"mb-6 p-3 rounded-xl bg-brand-5 border border-brand-10\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-semibold text-muted\">{t('ocr_confidence', language)}</span>\n <span className={`text-xs font-bold ${confidencePercent >= 80 ? 'text-green-500' : confidencePercent >= 60 ? 'text-yellow-500' : 'text-red-500'}`}>\n {confidencePercent}%\n </span>\n </div>\n <div className=\"w-full h-1.5 bg-brand-10 rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${confidencePercent >= 80 ? 'bg-green-500' : confidencePercent >= 60 ? 'bg-yellow-500' : 'bg-red-500'}`}\n style={{ width: `${confidencePercent}%` }}\n />\n </div>\n {confidencePercent < 80 && (\n <p className=\"text-[10px] text-yellow-500 mt-2\">\n {t('verify_data_carefully', language)}\n </p>\n )}\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <div className=\"mb-4 p-3 bg-red-500/20 border border-red-500/30 rounded-xl flex items-center gap-2\">\n <AlertCircle className=\"w-4 h-4 text-red-500 shrink-0\" />\n <p className=\"text-red-400 text-xs font-medium\">{error}</p>\n </div>\n )}\n\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-2 gap-4\">\n {/* First Name */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('first_name', language) || 'First Name'}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <User className=\"text-brand mr-3 w-5 h-5 shrink-0\" />\n <div className=\"flex flex-col w-full\">\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-muted\"\n type=\"text\"\n value={formData.firstName}\n onChange={(e) => handleInputChange('firstName', e.target.value)}\n placeholder={t('enter_first_name', language) || 'First name'}\n />\n </div>\n </div>\n </div>\n\n {/* Last Name */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('last_name', language) || 'Last Name'}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <div className=\"flex flex-col w-full\">\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-muted\"\n type=\"text\"\n value={formData.lastName}\n onChange={(e) => handleInputChange('lastName', e.target.value)}\n placeholder={t('enter_last_name', language) || 'Last name'}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* Document Number */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('id_number', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <CreditCard className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-muted\"\n type=\"text\"\n value={formData.documentNumber}\n onChange={(e) => handleInputChange('documentNumber', e.target.value)}\n placeholder={t('enter_doc_number', language)}\n />\n </div>\n </div>\n\n {/* Date of Birth */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('date_of_birth', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <Calendar className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-muted\"\n type=\"text\"\n value={formData.dateOfBirth}\n onChange={(e) => handleInputChange('dateOfBirth', e.target.value)}\n placeholder={t('date_format', language)}\n />\n </div>\n </div>\n\n {/* Nationality */}\n <div className=\"space-y-3\">\n <label className=\"text-xs font-bold uppercase tracking-[0.15em] text-brand ml-1\">\n {t('nationality', language)}\n </label>\n <div className=\"flex items-center px-1 transition-all\">\n <Globe className=\"text-brand mr-4 w-6 h-6 shrink-0\" />\n <input\n className=\"bg-transparent border-none p-0 w-full focus:ring-0 text-main font-bold text-lg focus:outline-none placeholder:text-muted\"\n type=\"text\"\n value={formData.nationality}\n onChange={(e) => handleInputChange('nationality', e.target.value)}\n placeholder={t('enter_nationality', language)}\n />\n </div>\n </div>\n\n {/* Document scan thumbnail */}\n <div className=\"mt-8 relative h-32 w-full rounded-2xl overflow-hidden border border-brand-20 group\">\n <div className=\"absolute inset-0 bg-gradient-to-tr from-brand-20 to-cyan-500/10 blur-sm\" />\n <div className=\"absolute inset-0 bg-brand/10 flex flex-col items-center justify-center p-4\">\n <div className=\"flex items-center gap-3\">\n <CheckCircle2 className=\"text-brand w-5 h-5\" />\n <span className=\"text-xs font-bold text-main\">\n {t('scanned_successfully', language)}\n </span>\n </div>\n {onRetake && (\n <button\n onClick={onRetake}\n className=\"mt-2 text-[10px] text-brand underline font-medium\"\n type=\"button\"\n >\n {t('retake_photo', language)}\n </button>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"mt-8\">\n <button\n onClick={handleConfirm}\n disabled={isSubmitting}\n className=\"w-full bg-brand hover:bg-brand/90 text-white font-bold py-4 rounded-2xl shadow-lg shadow-brand flex items-center justify-center gap-2 transition-transform active:scale-95 disabled:opacity-70\"\n >\n {isSubmitting ? (\n <>\n <div className=\"w-5 h-5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\n <span>{t('submitting', language)}</span>\n </>\n ) : (\n <>\n <span>{t('confirm_mint', language)}</span>\n <Sparkles className=\"w-5 h-5\" />\n </>\n )}\n </button>\n <p className=\"text-center text-[10px] mt-4 text-muted\">\n {t('secured_by_casper', language)}\n </p>\n </div>\n </motion.div>\n );\n};\n\nexport default ReviewData;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { motion } from 'framer-motion';\nimport { Shield, Network, AlertCircle, CheckCircle2, Wallet, Fingerprint } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ntype VerificationTier = 'layer_1' | 'layer_2' | 'layer_3';\n\ninterface MintingIdentityProps {\n tier: VerificationTier;\n sessionToken?: string;\n requestId?: string; // Only needed for L2/L3 submission\n onNext: (result?: { wallet?: string; didAddress?: string; credentialHash?: string }) => void;\n onError?: (error: string) => void;\n apiBaseUrl?: string;\n apiKey?: string;\n previewMode?: boolean;\n language?: string;\n}\n\ntype MintingStatus = 'processing' | 'minting' | 'completed' | 'failed';\n\n// Tier-specific status messages\nconst getStatusMessages = (tier: VerificationTier, language: string) => {\n if (tier === 'layer_1') {\n return {\n processing: {\n title: t('generating_wallet', language),\n subtitle: t('wallet_subtitle', language)\n },\n minting: {\n title: t('minting_did', language),\n subtitle: t('did_subtitle', language)\n },\n completed: {\n title: t('identity_created', language),\n subtitle: t('identity_created_subtitle', language)\n },\n failed: {\n title: t('setup_failed', language),\n subtitle: t('setup_failed_subtitle', language)\n }\n };\n }\n\n // L2 messages (synchronous - liveness already completed)\n if (tier === 'layer_2') {\n return {\n processing: {\n title: t('processing_liveness', language),\n subtitle: t('processing_subtitle', language)\n },\n minting: {\n title: t('minting_identity', language),\n subtitle: t('minting_subtitle', language)\n },\n completed: {\n title: t('identity_verified', language),\n subtitle: t('identity_verified_subtitle', language)\n },\n failed: {\n title: t('verification_failed', language),\n subtitle: t('verification_failed_subtitle', language)\n }\n };\n }\n\n // L3 messages (asynchronous - requires admin review)\n return {\n processing: {\n title: t('processing_documents', language),\n subtitle: t('processing_subtitle', language)\n },\n minting: {\n title: t('submitting_for_review', language),\n subtitle: t('submitting_review_subtitle', language)\n },\n completed: {\n title: t('verification_submitted', language),\n subtitle: t('verification_submitted_subtitle', language)\n },\n failed: {\n title: t('verification_failed', language),\n subtitle: t('verification_failed_subtitle', language)\n }\n };\n};\n\nconst MintingIdentity: React.FC<MintingIdentityProps> = ({\n tier,\n sessionToken,\n requestId,\n onNext,\n onError,\n apiBaseUrl = 'https://apis.casperid.com',\n apiKey = '',\n previewMode = false,\n language = 'EN'\n}) => {\n const [status, setStatus] = useState<MintingStatus>('processing');\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState('');\n const [wallet, setWallet] = useState<string | null>(null);\n const [didAddress, setDidAddress] = useState<string | null>(null);\n const [credentialHash, setCredentialHash] = useState<string | null>(null);\n const [humanId, setHumanId] = useState<string | null>(null);\n\n // Prevent double execution in React StrictMode\n const hasStartedRef = useRef(false);\n\n const statusMessages = getStatusMessages(tier, language);\n const currentMessage = statusMessages[status];\n\n // Main setup effect\n useEffect(() => {\n if (hasStartedRef.current) return;\n hasStartedRef.current = true;\n\n if (previewMode) {\n runPreviewMode();\n } else {\n runSetup();\n }\n }, []);\n\n // Preview mode simulation\n const runPreviewMode = async () => {\n setStatus('processing');\n setProgress(20);\n await sleep(1000);\n setProgress(50);\n await sleep(1000);\n setStatus('minting');\n setProgress(70);\n await sleep(1000);\n setProgress(100);\n setStatus('completed');\n\n if (tier === 'layer_1') {\n setWallet('account-hash-abc123...');\n setHumanId('casper-user-1234');\n setDidAddress('did:casper:abc123...');\n } else {\n setCredentialHash('mock-credential-hash-xyz');\n }\n\n await sleep(1500);\n onNext({\n wallet: 'account-hash-abc123...',\n didAddress: 'did:casper:abc123...',\n credentialHash: 'mock-credential-hash-xyz'\n });\n };\n\n // Real setup based on tier\n const runSetup = async () => {\n try {\n if (tier === 'layer_1') {\n await runL1Setup();\n } else {\n await runL2L3Setup();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Setup failed';\n setError(message);\n setStatus('failed');\n onError?.(message);\n }\n };\n\n // L1 Setup: Wallet + DID creation (synchronous)\n const runL1Setup = async () => {\n // Step 1: Generate wallet\n setStatus('processing');\n setProgress(10);\n\n const walletResponse = await fetch(`${apiBaseUrl}/api/passkey/wallet/generate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`,\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include'\n });\n\n if (!walletResponse.ok) {\n const errorData = await walletResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to generate wallet');\n }\n\n const walletData = await walletResponse.json();\n if (!walletData.success || !walletData.walletInfo?.walletAddress) {\n throw new Error(walletData.error || 'Wallet generation failed');\n }\n\n setWallet(walletData.walletInfo.walletAddress);\n if (walletData.walletInfo.humanId) {\n setHumanId(walletData.walletInfo.humanId);\n }\n setProgress(50);\n\n // Step 2: Mint DID\n setStatus('minting');\n setProgress(60);\n\n const didResponse = await fetch(`${apiBaseUrl}/api/passkey/did/mint`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`,\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include'\n });\n\n if (!didResponse.ok) {\n const errorData = await didResponse.json().catch(() => ({}));\n throw new Error(errorData.error || 'Failed to mint DID');\n }\n\n const didData = await didResponse.json();\n if (!didData.success) {\n throw new Error(didData.error || 'DID minting failed');\n }\n\n setDidAddress(didData.did_address);\n setCredentialHash(didData.transaction_hash);\n setProgress(100);\n setStatus('completed');\n\n // Auto-proceed after showing success\n await sleep(1500);\n onNext({\n wallet: walletData.walletInfo.walletAddress,\n didAddress: didData.did_address,\n credentialHash: didData.transaction_hash\n });\n };\n\n // L2 Setup: Poll verification status (liveness already submitted via FaceScan)\n const runL2Setup = async () => {\n setStatus('processing');\n setProgress(20);\n\n if (!requestId) {\n throw new Error('No verification request ID provided');\n }\n\n // Poll for L2 completion (should be quick since liveness was already processed)\n const maxAttempts = 10;\n const pollInterval = 1500;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await fetch(`${apiBaseUrl}/api/v2/verification/${requestId}/status`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-App-Id': apiKey } : {})\n },\n credentials: 'include'\n });\n\n if (!response.ok) {\n throw new Error('Failed to check verification status');\n }\n\n const data = await response.json();\n const verificationStatus = data.verification?.status;\n\n // Update progress based on attempt\n setProgress(Math.min(20 + (attempt * 8), 80));\n\n if (verificationStatus === 'completed') {\n setStatus('minting');\n setProgress(90);\n await sleep(500);\n setProgress(100);\n setStatus('completed');\n\n // Extract credential info if available\n const proofHash = data.verification?.results?.proofHash;\n\n await sleep(1500);\n onNext({ credentialHash: proofHash || requestId });\n return;\n }\n\n if (verificationStatus === 'failed') {\n throw new Error(data.verification?.error || 'Verification failed');\n }\n\n // Still pending/in_progress, wait and retry\n await sleep(pollInterval);\n\n } catch (err) {\n // On last attempt, throw the error\n if (attempt === maxAttempts - 1) {\n throw err;\n }\n await sleep(pollInterval);\n }\n }\n\n // If we exhausted attempts, the liveness might still be processing\n // Proceed anyway since liveness was already submitted\n setStatus('minting');\n setProgress(90);\n await sleep(500);\n setProgress(100);\n setStatus('completed');\n await sleep(1500);\n onNext({ credentialHash: requestId });\n };\n\n // L3 Setup: Show submission confirmation (requires admin review)\n const runL3Setup = async () => {\n setStatus('processing');\n setProgress(30);\n\n // L3 documents were already submitted via ReviewData\n // This screen just confirms the submission\n await sleep(800);\n setProgress(60);\n\n setStatus('minting'); // Shows \"Submitting for Review\" message\n setProgress(80);\n\n await sleep(800);\n setProgress(100);\n setStatus('completed'); // Shows \"Verification Submitted\"\n\n // Auto-proceed after showing success\n // User proceeds with L2 access, L3 will be approved by admin later\n await sleep(2000);\n onNext({ credentialHash: requestId });\n };\n\n // L2/L3 Setup: Route to appropriate handler\n const runL2L3Setup = async () => {\n if (tier === 'layer_2') {\n await runL2Setup();\n } else {\n await runL3Setup();\n }\n };\n\n const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n const handleRetry = () => {\n setStatus('processing');\n setProgress(0);\n setError('');\n hasStartedRef.current = false;\n\n if (previewMode) {\n runPreviewMode();\n } else {\n runSetup();\n }\n };\n\n // Get tier-specific icon\n const getTierIcon = () => {\n if (tier === 'layer_1') {\n return status === 'minting' ? <Fingerprint className=\"text-brand w-4 h-4\" /> : <Wallet className=\"text-brand w-4 h-4\" />;\n }\n return <Shield className=\"text-brand w-4 h-4\" />;\n };\n\n // Get status label for transaction status\n const getStatusLabel = () => {\n if (tier === 'layer_1') {\n if (status === 'processing') return t('creating_wallet', language);\n if (status === 'minting') return t('minting_did_chain', language);\n if (status === 'completed') return t('identity_live', language);\n } else {\n if (status === 'processing') return t('validating_docs', language);\n if (status === 'minting') return t('submitting_verification', language);\n if (status === 'completed') return t('verification_queued', language);\n }\n return '';\n };\n\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex-1 flex flex-col items-center justify-center px-8 text-center\"\n >\n {/* Rotating card animation */}\n <div className=\"relative w-64 h-64 flex items-center justify-center mb-12\">\n <div className=\"absolute inset-0 rounded-full border-4 border-dashed border-brand-20 animate-[spin_10s_linear_infinite]\" />\n <div className=\"absolute inset-4 rounded-full border-2 border-[#6DE8EC]/20 animate-[spin_6s_linear_infinite_reverse]\" />\n\n <motion.div\n animate={status !== 'failed' ? { rotateY: [0, 180, 360], y: [-10, 10, -10] } : {}}\n transition={{ duration: 6, repeat: Infinity, ease: 'easeInOut' }}\n className={`relative w-40 h-56 backdrop-blur-xl border rounded-2xl flex flex-col p-4 ${status === 'completed'\n ? 'bg-green-500/10 border-green-500/30 shadow-[0_0_50px_-12px_rgba(34,197,94,0.5)]'\n : status === 'failed'\n ? 'bg-red-500/10 border-red-500/30 shadow-[0_0_50px_-12px_rgba(239,68,68,0.5)]'\n : 'bg-brand/10 border-brand-30 shadow-[0_0_50px_-12px_rgba(114,43,238,0.5)]'\n }`}\n >\n <div className=\"flex justify-between items-start mb-6\">\n <div className={`w-8 h-8 rounded flex items-center justify-center ${status === 'completed'\n ? 'bg-green-500/30'\n : status === 'failed'\n ? 'bg-red-500/30'\n : 'bg-brand/30'\n }`}>\n {status === 'completed' ? (\n <CheckCircle2 className=\"text-green-500 w-4 h-4\" />\n ) : status === 'failed' ? (\n <AlertCircle className=\"text-red-500 w-4 h-4\" />\n ) : (\n getTierIcon()\n )}\n </div>\n <div className={`w-6 h-1 rounded-full ${status === 'completed'\n ? 'bg-green-500/40'\n : status === 'failed'\n ? 'bg-red-500/40'\n : 'bg-brand/40'\n }`} />\n </div>\n <div className=\"space-y-3 mb-auto\">\n <div className={`h-2 w-3/4 rounded-full ${status === 'completed'\n ? 'bg-green-500/20'\n : status === 'failed'\n ? 'bg-red-500/20'\n : 'bg-brand/20'\n }`} />\n <div className={`h-2 w-1/2 rounded-full ${status === 'completed'\n ? 'bg-green-500/20'\n : status === 'failed'\n ? 'bg-red-500/20'\n : 'bg-brand/20'\n }`} />\n </div>\n <div className=\"flex items-center gap-2 mt-4\">\n <div className={`size-6 rounded-full overflow-hidden border border-slate-200 dark:border-white/10 ${status === 'completed'\n ? 'bg-gradient-to-tr from-green-500 to-[#6DE8EC]'\n : status === 'failed'\n ? 'bg-gradient-to-tr from-red-500 to-orange-500'\n : 'bg-gradient-to-tr from-brand to-[#6DE8EC]'\n }`} />\n <div className=\"flex flex-col items-start max-w-[80px]\">\n {humanId ? (\n <motion.span \n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"text-[10px] font-bold text-slate-800 dark:text-white/90 truncate w-full text-left\"\n >\n {humanId}\n </motion.span>\n ) : (\n <div className=\"h-1.5 w-12 bg-white/20 rounded-full mb-1\" />\n )}\n <div className=\"h-1 w-8 bg-slate-200 dark:bg-white/10 rounded-full\" />\n </div>\n </div>\n {status !== 'failed' && status !== 'completed' && (\n <motion.div\n animate={{ top: ['0%', '100%', '0%'] }}\n transition={{ duration: 2, repeat: Infinity }}\n className=\"absolute inset-0 bg-gradient-to-b from-transparent via-brand-10 to-transparent h-1/2 w-full\"\n />\n )}\n </motion.div>\n </div>\n\n <div className=\"space-y-4\">\n <h2 className={`text-2xl font-bold bg-clip-text ${status === 'completed'\n ? 'text-green-500'\n : status === 'failed'\n ? 'text-red-500'\n : 'dark:bg-gradient-to-r dark:from-slate-100 dark:to-slate-400 bg-slate-900 dark:text-transparent text-slate-900'\n }`}>\n {currentMessage.title}\n </h2>\n <p className=\"dark:text-slate-400 text-slate-500 text-sm leading-relaxed max-w-[280px] mx-auto\">\n {currentMessage.subtitle}\n </p>\n </div>\n\n {/* Error with retry button */}\n {status === 'failed' && (\n <div className=\"mt-6 space-y-3\">\n <p className=\"text-red-500 text-sm\">{error}</p>\n <button\n onClick={handleRetry}\n className=\"px-6 py-3 bg-brand text-white rounded-2xl font-bold\"\n >\n {t('try_again', language)}\n </button>\n </div>\n )}\n\n {/* Wallet/DID display for L1 */}\n {tier === 'layer_1' && wallet && status === 'completed' && (\n <div className=\"mt-6 p-3 dark:bg-white/5 bg-black/5 rounded-xl border dark:border-white/10 border-black/5\">\n <p className=\"text-[10px] text-muted mb-1\">{t('your_wallet', language)}</p>\n <p className=\"text-xs font-mono text-main break-all\">\n {wallet.slice(0, 20)}...{wallet.slice(-10)}\n </p>\n </div>\n )}\n\n {/* Credential hash display for L2/L3 */}\n {tier !== 'layer_1' && credentialHash && status === 'completed' && (\n <div className=\"mt-6 p-3 dark:bg-white/5 bg-black/5 rounded-xl border dark:border-white/10 border-black/5\">\n <p className=\"text-[10px] text-muted mb-1\">{t('verification_id', language)}</p>\n <p className=\"text-xs font-mono text-main break-all\">\n {credentialHash.slice(0, 20)}...\n </p>\n </div>\n )}\n\n {/* Transaction status (only show when not failed) */}\n {status !== 'failed' && (\n <div className=\"w-full mt-12 p-6 dark:bg-brand/5 bg-brand/5 border-t dark:border-white/5 border-black/5\">\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-xs font-medium text-brand uppercase tracking-widest\">\n {tier === 'layer_1' ? t('setup_status', language) : t('transaction_status', language)}\n </span>\n <span className={`text-xs font-bold ${status === 'completed' ? 'text-green-500' : 'text-[#6DE8EC]'\n }`}>\n {t('complete_percent', language).replace('{percent}', progress.toString())}\n </span>\n </div>\n <div className=\"w-full h-1.5 dark:bg-brand/10 bg-brand/10 rounded-full overflow-hidden mb-4\">\n <motion.div\n initial={{ width: '0%' }}\n animate={{ width: `${progress}%` }}\n transition={{ duration: 0.5 }}\n className={`h-full rounded-full ${status === 'completed'\n ? 'bg-gradient-to-r from-green-500 to-[#6DE8EC]'\n : 'bg-gradient-to-r from-brand to-[#6DE8EC]'\n } shadow-[0_0_10px_rgba(114,43,238,0.5)]`}\n />\n </div>\n <div className=\"flex items-center gap-3 px-3 py-2 dark:bg-brand/10 bg-brand/10 rounded-xl border dark:border-brand-10 border-brand-5\">\n <Network className={`w-4 h-4 ${status === 'completed' ? 'text-green-500' : 'text-brand'\n }`} />\n <p className=\"text-[10px] dark:text-slate-300 text-slate-600 font-medium\">\n {getStatusLabel()}\n </p>\n </div>\n </div>\n )}\n </motion.div>\n );\n};\n\nexport default MintingIdentity;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { CheckCircle2, ArrowRight } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface IdentityVerifiedProps {\n onNext: () => void;\n}\n\nconst IdentityVerified: React.FC<IdentityVerifiedProps & { language?: string }> = ({ onNext, language = 'EN' }) => (\n <motion.div\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 1.1 }}\n className=\"flex-1 flex flex-col items-center justify-center px-8 text-center\"\n >\n {/* Success icon with glow */}\n <div className=\"relative mb-10 group\">\n <div className=\"absolute inset-0 bg-[#6fe8ec]/30 rounded-3xl blur-3xl group-hover:blur-2xl transition-all\" />\n <div className=\"relative w-32 h-32 rounded-2xl bg-[#6fe8ec] flex items-center justify-center shadow-[0_0_40px_rgba(111,232,236,0.4)] border-4 dark:border-white border-slate-100\">\n <CheckCircle2 className=\"text-slate-900 w-16 h-16\" />\n </div>\n </div>\n\n <h1 className=\"text-main text-3xl font-bold leading-tight mb-3\">{t('identity_verified', language)}</h1>\n <p className=\"text-muted text-base leading-relaxed mb-12\">\n {t('identity_verified_desc', language)}\n </p>\n\n {/* Data consent toggle */}\n <div className=\"w-full bg-white dark:bg-white/5 shadow-sm border border-slate-200 dark:border-white/10 rounded-2xl p-5 mb-8 flex items-center justify-between text-left\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-main font-bold text-sm\">{t('share_data_consent', language)}</span>\n <p className=\"text-muted text-xs leading-normal\">{t('authorize_dapps', language)}</p>\n </div>\n <div className=\"w-11 h-6 bg-brand rounded-full relative p-1 cursor-pointer\">\n <div className=\"absolute right-1 top-1 size-4 bg-white rounded-full\" />\n </div>\n </div>\n\n <button\n onClick={onNext}\n className=\"w-full bg-[#6fe8ec] hover:brightness-105 active:scale-[0.98] transition-all text-slate-900 font-bold py-4 rounded-2xl shadow-lg shadow-[#6fe8ec]/20 flex items-center justify-center gap-2\"\n >\n {t('return_to_app', language)}\n <ArrowRight className=\"w-5 h-5\" />\n </button>\n </motion.div>\n);\n\nexport default IdentityVerified;\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport { ShieldCheck, CheckCircle2, Verified } from 'lucide-react';\nimport { t } from '../utils/i18n';\n\ninterface PermissionsRequestProps {\n appName?: string;\n appLogo?: string;\n requestedScopes?: string[];\n onApprove: () => void;\n onDeny: () => void;\n language?: string;\n}\n\n// Default permissions if app doesn't specify\nconst defaultPermissions = [\n 'verify:identity',\n 'read:profile',\n 'read:kyc_level',\n];\n\nconst PermissionsRequest: React.FC<PermissionsRequestProps> = ({\n appName = 'This App',\n appLogo,\n requestedScopes,\n onApprove,\n onDeny,\n language = 'EN',\n}) => {\n // Use provided scopes or default\n const permissions = requestedScopes || defaultPermissions;\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n className=\"flex-1 px-8 pt-8 flex flex-col items-center\"\n >\n <div className=\"flex flex-col items-center gap-4 mb-10\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 rounded-full shadow-[0_0_20px_rgba(134,81,225,0.3)] animate-pulse\" />\n <div className=\"relative w-24 h-24 rounded-full border-2 border-brand-40 p-1 dark:bg-black/50 bg-white\">\n {appLogo ? (\n <div className=\"w-full h-full rounded-full overflow-hidden\">\n <img src={appLogo} alt={appName} className=\"w-full h-full object-cover\" />\n </div>\n ) : (\n <div className=\"w-full h-full rounded-full bg-gradient-to-br from-emerald-500 to-teal-700 flex items-center justify-center text-white font-bold text-2xl\">\n {appName.slice(0, 2).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight text-main\">{appName}</h1>\n <p className=\"text-brand/70 text-sm font-medium mt-1 uppercase tracking-wider\">{t('requesting_access', language)}</p>\n </div>\n </div>\n\n <div className=\"w-full space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-widest text-slate-500 mb-4 px-1\">\n {t('permission_request', language)}\n </h3>\n {permissions.map((perm) => (\n <div\n key={perm}\n className=\"flex items-center gap-4 p-4 rounded-2xl dark:bg-white/5 bg-black/5 transition-all\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-cyan-400/10 text-cyan-400 shrink-0\">\n <CheckCircle2 className=\"w-5 h-5\" />\n </div>\n <p className=\"text-sm font-medium text-main\">{t(perm, language)}</p>\n </div>\n ))}\n </div>\n\n <div className=\"mt-8 flex gap-3 p-4 rounded-2xl dark:bg-brand/5 bg-brand/5\">\n <ShieldCheck className=\"text-brand w-5 h-5 shrink-0\" />\n <p className=\"text-xs leading-relaxed text-muted\">\n <span className=\"font-bold text-main\">{t('privacy_note', language)}:</span> {t('privacy_desc', language)}\n </p>\n </div>\n\n <footer className=\"mt-auto w-full pb-8 flex flex-col gap-3\">\n <button\n onClick={onApprove}\n className=\"w-full py-4 rounded-2xl bg-brand hover:bg-brand-90 text-white font-bold text-base shadow-xl shadow-brand transition-all flex items-center justify-center gap-2\"\n >\n {t('approve_verify', language)}\n <Verified className=\"w-5 h-5\" />\n </button>\n <button\n onClick={onDeny}\n className=\"w-full py-3 rounded-2xl bg-transparent dark:hover:bg-slate-100 dark:bg-white/5 hover:bg-black/5 dark:text-slate-400 text-slate-500 font-semibold text-sm transition-all\"\n >\n {t('deny', language)}\n </button>\n </footer>\n </motion.div>\n );\n};\n\nexport default PermissionsRequest;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\n\nimport GlassContainer from './shared/GlassContainer';\nimport Header from './shared/Header';\nimport Footer from './shared/Footer';\n\nimport AuthSelection from './screens/AuthSelection';\nimport Login from './screens/Login';\nimport PasskeyAuth from './screens/PasskeyAuth';\nimport PasskeyRegister from './screens/PasskeyRegister';\nimport PinVerification from './screens/PinVerification';\nimport SecurityUpgrade from './screens/SecurityUpgrade';\nimport FaceScan from './screens/FaceScan';\nimport VerifyIdentityChoice from './screens/VerifyIdentityChoice';\nimport DocumentScan from './screens/DocumentScan';\nimport ReviewData from './screens/ReviewData';\nimport MintingIdentity from './screens/MintingIdentity';\nimport IdentityVerified from './screens/IdentityVerified';\nimport PermissionsRequest from './screens/PermissionsRequest';\n\nimport type {\n CasperIDModalProps,\n Screen,\n SDKMode,\n OTPState,\n KYCState,\n DocumentType,\n ExtractedDocumentData,\n StartVerificationResponse,\n AuthState,\n PasskeyAuthCompleteResponse,\n PasskeyRegisterCompleteResponse,\n AppMetadata,\n AppMetadataResponse,\n CasperIDTheme\n} from './types';\n\n// Resolve 'system' mode to actual light/dark\nfunction resolveMode(mode: SDKMode = 'light'): 'light' | 'dark' {\n if (mode === 'system') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return mode;\n}\n\nconst FOOTER_SCREENS: Screen[] = ['AuthSelection', 'Login', 'PasskeyAuth', 'PinVerification', 'PasskeyRegister'];\n\n// Default API base URL\nconst DEFAULT_API_BASE_URL = 'https://apis.casperid.com';\n\n// Initial KYC state\nconst initialKYCState: KYCState = {\n requestId: '',\n verificationTier: 'layer_3'\n};\n\nexport const CasperIDModal: React.FC<CasperIDModalProps> = ({\n isOpen,\n apiKey,\n theme = {},\n requiredTier,\n onSuccess,\n onClose,\n onError,\n mode = 'login',\n previewMode = false,\n initialScreen,\n apiBaseUrl,\n termsUrl = '#',\n privacyUrl = '#',\n logoUrl,\n language = 'EN',\n layout,\n platform,\n}) => {\n const [cloudTheme, setCloudTheme] = useState<CasperIDTheme>({});\n // Track loading state for cloud theme - prevents flash of default colors\n const [isLoadingCloudTheme, setIsLoadingCloudTheme] = useState(!previewMode && !!apiKey);\n\n const {\n primaryColor: propPrimaryColor,\n borderRadius: propBorderRadius,\n fontFamily: propFontFamily,\n mode: themeMode = 'light',\n layout: propLayout,\n platform: themePlatform,\n } = theme || {};\n\n // Helper to detect mobile devices automatically\n const isMobileDevice = typeof navigator !== 'undefined' && /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n\n // Merge cloud theme with props (props take precedence)\n const primaryColor = propPrimaryColor || cloudTheme.primaryColor || '#8651e1';\n const borderRadius = propBorderRadius || cloudTheme.borderRadius || '12';\n const fontFamily = propFontFamily || cloudTheme.fontFamily || 'Inter';\n const finalLayout = layout || propLayout || cloudTheme.layout || 'auto';\n\n // Platform logic: Prop -> Theme Prop -> Cloud Sync -> Auto-Detect -> Default Desktop\n const finalPlatform = platform || themePlatform || cloudTheme.platform || (isMobileDevice ? 'mobile' : 'desktop');\n\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>(resolveMode(themeMode));\n const [screen, setScreen] = useState<Screen>(\n initialScreen ?? (mode === 'verify' ? 'SecurityUpgrade' : 'AuthSelection')\n );\n\n // OTP flow state\n const [otpState, setOtpState] = useState<OTPState>({ email: '', verificationId: '' });\n const [sessionToken, setSessionToken] = useState<string | null>(null);\n\n // Auth state - tracks user status through the flow\n const [authState, setAuthState] = useState<AuthState>({\n email: '',\n userExists: false,\n hasPasskey: false,\n userAccount: null\n });\n\n // KYC flow state\n const [kycState, setKycState] = useState<KYCState>(initialKYCState);\n const [uploadId, setUploadId] = useState<string>('');\n const [credentialHash, setCredentialHash] = useState<string>('');\n const [appMetadata, setAppMetadata] = useState<AppMetadata | null>(null);\n\n // API base URL - use custom URL if provided, otherwise default\n const finalApiBaseUrl = apiBaseUrl || DEFAULT_API_BASE_URL;\n\n // Normalize border radius to always have 'px' suffix\n const normalizedRadius = borderRadius.toString().endsWith('px')\n ? borderRadius.toString()\n : `${borderRadius}px`;\n\n // Normalize font family\n const normalizedFont = fontFamily.includes(' ')\n ? `\"${fontFamily}\", sans-serif`\n : `${fontFamily}, sans-serif`;\n\n // Generate a unique ID for scoped styles\n const modalId = React.useId().replace(/:/g, '');\n\n // Apply CSS variables + theme class to the modal root\n const cssVars = {\n '--casperid-primary': primaryColor,\n '--casperid-radius': normalizedRadius,\n '--casperid-font': normalizedFont,\n } as React.CSSProperties;\n\n // Generate a unique key for the style element to force re-application when theme changes\n const styleKey = `${modalId}-${primaryColor}-${normalizedRadius}-${normalizedFont}`;\n\n // Generate scoped CSS for proper variable inheritance with !important to override :root defaults\n const scopedStyles = `\n #casperid-modal-${modalId},\n #casperid-modal-${modalId} * {\n --casperid-primary: ${primaryColor} !important;\n --casperid-radius: ${normalizedRadius} !important;\n --casperid-font: ${normalizedFont} !important;\n }\n `;\n\n // Sync system theme\n useEffect(() => {\n if (themeMode === 'system') {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setResolvedTheme(e.matches ? 'dark' : 'light');\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n } else {\n setResolvedTheme(resolveMode(themeMode));\n }\n }, [themeMode]);\n\n // Sync screen in previewMode when initialScreen prop changes\n useEffect(() => {\n if (previewMode && initialScreen) {\n setScreen(initialScreen);\n }\n }, [previewMode, initialScreen]);\n\n // Reset to first screen when opened (for real usage)\n useEffect(() => {\n if (isOpen && !previewMode) {\n setScreen(initialScreen ?? (mode === 'verify' ? 'SecurityUpgrade' : 'AuthSelection'));\n setOtpState({ email: '', verificationId: '' });\n setSessionToken(null);\n setAuthState({ email: '', userExists: false, hasPasskey: false, userAccount: null });\n setKycState(initialKYCState);\n setUploadId('');\n setCredentialHash('');\n }\n }, [isOpen, mode, previewMode, initialScreen]);\n\n // Fetch App Metadata on mount\n useEffect(() => {\n if (!apiKey || previewMode) {\n setIsLoadingCloudTheme(false);\n return;\n }\n\n const fetchAppMetadata = async () => {\n try {\n const response = await fetch(`${finalApiBaseUrl}/api/business/app-metadata/${apiKey}`);\n if (response.ok) {\n const data: AppMetadataResponse = await response.json();\n if (data.success && data.app) {\n setAppMetadata(data.app);\n // Apply brand theme from cloud\n if (data.app.theme) {\n setCloudTheme({\n primaryColor: data.app.theme.primaryColor,\n borderRadius: data.app.theme.borderRadius,\n fontFamily: data.app.theme.fontFamily,\n layout: data.app.theme.layout,\n platform: data.app.theme.platform\n });\n }\n }\n }\n } catch (err) {\n console.warn('[CasperID] Failed to fetch app metadata:', err);\n } finally {\n setIsLoadingCloudTheme(false);\n }\n };\n\n fetchAppMetadata();\n }, [apiKey, finalApiBaseUrl, previewMode]);\n\n const toggleTheme = () =>\n setResolvedTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n\n const go = useCallback((next: Screen) => setScreen(next), []);\n\n // Start KYC verification flow\n const startVerification = useCallback(async (tier: 'layer_2' | 'layer_3') => {\n try {\n // Use the correct endpoint for each layer\n const endpoint = tier === 'layer_2'\n ? `${apiBaseUrl}/api/v2/verification/layer2/start`\n : `${apiBaseUrl}/api/v2/verification/layer3/start`;\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey\n },\n credentials: 'include',\n body: JSON.stringify({\n purpose: 'sdk_verification',\n ...(tier === 'layer_3' ? { verificationMethod: 'document' } : {})\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Request failed with status ${response.status}`);\n }\n\n const data: StartVerificationResponse = await response.json();\n\n if (data.success && data.verification) {\n setKycState(prev => ({\n ...prev,\n requestId: data.verification!.requestId,\n verificationTier: tier\n }));\n return data.verification.requestId;\n } else {\n throw new Error(data.error || 'Failed to start verification');\n }\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to start verification'));\n return null;\n }\n }, [apiBaseUrl, apiKey, onError]);\n\n // Handle successful OTP verification - new user needs passkey registration\n const handleOTPSuccess = useCallback((token: string, userAccount?: AuthState['userAccount'], businessToken?: string) => {\n setSessionToken(token);\n setAuthState(prev => ({\n ...prev,\n sessionToken: token,\n businessToken: businessToken,\n userAccount: userAccount || null\n }));\n\n // Check if user already has L1 setup (wallet + DID)\n if (userAccount?.wallet && userAccount?.did_address) {\n // User has L1, check if they need passkey registration\n if (!authState.hasPasskey) {\n go('PasskeyRegister');\n } else {\n // Has passkey and L1, check tier requirements\n proceedBasedOnTier(userAccount.tier);\n }\n } else {\n // New user - needs passkey registration then L1 setup\n go('PasskeyRegister');\n }\n }, [go, authState.hasPasskey]);\n\n // Handle passkey user detected (returning user with passkey)\n const handlePasskeyUser = useCallback((email: string) => {\n setAuthState(prev => ({ ...prev, email, hasPasskey: true, userExists: true }));\n go('PasskeyAuth');\n }, [go]);\n\n // Handle successful passkey authentication (returning user)\n const handlePasskeyAuthSuccess = useCallback((token: string, user?: PasskeyAuthCompleteResponse['user'], businessToken?: string) => {\n setSessionToken(token);\n setAuthState(prev => ({\n ...prev,\n sessionToken: token,\n businessToken: businessToken,\n userAccount: user ? {\n user_id: user.user_id,\n wallet: user.wallet,\n tier: user.tier,\n did_address: user.did_address\n } : null\n }));\n\n // Returning user - check tier requirements\n proceedBasedOnTier(user?.tier);\n }, []);\n\n // Handle successful passkey registration (new user)\n const handlePasskeyRegisterSuccess = useCallback((user?: PasskeyRegisterCompleteResponse['user'], businessToken?: string) => {\n setAuthState(prev => ({\n ...prev,\n hasPasskey: true,\n businessToken: businessToken,\n userAccount: user ? {\n user_id: user.user_id,\n tier: user.tier\n } : prev.userAccount\n }));\n\n // After passkey registration, proceed to MintingIdentity for L1 setup\n go('MintingIdentity');\n }, [go]);\n\n // Determine next step based on user's tier and required tier\n const proceedBasedOnTier = useCallback((currentTier?: string) => {\n const tier = currentTier || 'layer_0';\n\n // If no specific tier required, or user meets requirement, go to success\n if (!requiredTier) {\n go('IdentityVerified');\n return;\n }\n\n // Map requiredTier to layer format\n const requiredLayer = requiredTier === 'L1' ? 'layer_1' :\n requiredTier === 'L2' ? 'layer_2' :\n requiredTier === 'L3' ? 'layer_3' : 'layer_1';\n\n // Check if user already meets the requirement\n const tierOrder = ['layer_0', 'layer_1', 'layer_2', 'layer_3'];\n const currentIndex = tierOrder.indexOf(tier);\n const requiredIndex = tierOrder.indexOf(requiredLayer);\n\n if (currentIndex >= requiredIndex) {\n // User meets requirement\n go('IdentityVerified');\n } else if (requiredIndex >= 2) {\n // Need L2 or L3 - start with SecurityUpgrade prompt\n go('SecurityUpgrade');\n } else {\n // Just need L1, which should be done by now\n go('IdentityVerified');\n }\n }, [requiredTier, go]);\n\n // Handle MintingIdentity completion (wallet + DID created for L1, or verification submitted for L2/L3)\n const handleMintingSuccess = useCallback(async (result?: { wallet?: string; didAddress?: string; credentialHash?: string }) => {\n if (result?.wallet) {\n setAuthState(prev => ({\n ...prev,\n userAccount: {\n ...prev.userAccount,\n user_id: prev.userAccount?.user_id || '',\n wallet: result.wallet,\n did_address: result.didAddress,\n tier: 'layer_1'\n }\n }));\n }\n\n if (result?.credentialHash) {\n setCredentialHash(result.credentialHash);\n }\n\n // REFRESH TOKEN: Get a fresh token that includes the new verified wallet and humanId\n if (sessionToken && !previewMode) {\n try {\n const response = await fetch(`${finalApiBaseUrl}/api/casperid/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token: sessionToken, apiKey })\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.token) {\n console.log('[CasperID SDK] Token refreshed after verification');\n setSessionToken(data.token);\n setAuthState(prev => ({\n ...prev,\n sessionToken: data.token,\n businessToken: data.business_token || prev.businessToken\n }));\n }\n }\n } catch (err) {\n console.warn('[CasperID SDK] Failed to refresh token after verification:', err);\n }\n }\n\n // Check tier requirements after minting\n // Determine what our tier SHOULD be now based on what we just did\n let currentTier = result?.wallet ? 'layer_1' : (authState.userAccount?.tier || 'layer_1');\n \n // If we just finished a Layer 2 verification, we know the tier is now layer_2\n // regardless of whether the token refresh succeeded yet.\n if (kycState.livenessVerified && kycState.verificationTier === 'layer_2') {\n currentTier = 'layer_2';\n } else if (kycState.documentType && kycState.verificationTier === 'layer_3') {\n currentTier = 'layer_3';\n }\n\n proceedBasedOnTier(currentTier);\n }, [authState.userAccount?.tier, proceedBasedOnTier, sessionToken, finalApiBaseUrl, previewMode, kycState]);\n\n // Handle extension login success\n const handleExtensionSuccess = useCallback((userData: any) => {\n // Extension auth is complete - use token from extension if provided\n const token = userData?.sessionToken || userData?.token;\n const bToken = userData?.business_token || userData?.businessToken;\n\n if (token) {\n setSessionToken(token);\n }\n\n if (bToken) {\n setAuthState(prev => ({ ...prev, businessToken: bToken }));\n }\n\n // Skip to appropriate screen based on user's tier\n go('SecurityUpgrade');\n }, [go]);\n\n // Handle SecurityUpgrade start\n const handleSecurityUpgradeNext = useCallback(async () => {\n // For L3, start with document verification first\n if (requiredTier === 'L3') {\n const requestId = await startVerification('layer_3');\n if (requestId) {\n go('VerifyIdentityChoice');\n }\n } else {\n // For L2, start with face scan\n const requestId = await startVerification('layer_2');\n if (requestId) {\n go('FaceScan');\n }\n }\n }, [requiredTier, startVerification, go]);\n\n // Handle FaceScan completion\n const handleFaceScanNext = useCallback(async (livenessVerified: boolean) => {\n setKycState(prev => ({ ...prev, livenessVerified }));\n\n // For both L2 and L3, after face scan, go to minting\n // (For L3, document scan already happened before face scan)\n go('MintingIdentity');\n }, [go]);\n\n // Handle document type selection\n const handleDocumentTypeSelected = useCallback((documentType: DocumentType) => {\n setKycState(prev => ({ ...prev, documentType }));\n go('DocumentScan');\n }, [go]);\n\n // Handle document scan completion\n const handleDocumentScanNext = useCallback((extractedData: ExtractedDocumentData, docUploadId: string, imageUrls: { frontImageUrl?: string; frontImageFileId?: string; backImageUrl?: string; backImageFileId?: string }) => {\n setKycState(prev => ({\n ...prev,\n extractedData,\n frontImageUrl: imageUrls.frontImageUrl,\n frontImageFileId: imageUrls.frontImageFileId,\n backImageUrl: imageUrls.backImageUrl,\n backImageFileId: imageUrls.backImageFileId\n }));\n setUploadId(docUploadId);\n go('ReviewData');\n }, [go]);\n\n // Handle review data confirmation\n const handleReviewDataNext = useCallback((confirmedData: ExtractedDocumentData) => {\n setKycState(prev => ({ ...prev, extractedData: confirmedData }));\n // For L3, after document review, proceed to liveness check (FaceScan)\n go('FaceScan');\n }, [go]);\n\n // Handle document retake\n const handleDocumentRetake = useCallback(() => {\n setKycState(prev => ({ ...prev, extractedData: undefined }));\n setUploadId('');\n go('DocumentScan');\n }, [go]);\n\n\n // Handle final success (after permissions approved)\n const handleSuccess = useCallback(() => {\n if (!sessionToken) {\n onError?.(new Error('No valid session token available'));\n return;\n }\n onSuccess?.(sessionToken, {\n businessToken: authState.businessToken\n });\n onClose?.();\n }, [sessionToken, authState.businessToken, onSuccess, onClose, onError]);\n\n // Handle errors\n const handleError = useCallback((error: string) => {\n onError?.(new Error(error));\n }, [onError]);\n\n // Login screen handlers\n const handleLoginNext = useCallback((email: string, verificationId: string) => {\n setOtpState({ email, verificationId });\n setAuthState(prev => ({ ...prev, email }));\n go('PinVerification');\n }, [go]);\n\n if (!isOpen && !previewMode) return null;\n\n // Show loading state while fetching cloud theme (prevents flash of default colors)\n if (isLoadingCloudTheme && !previewMode) {\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\"\n style={{ backgroundColor: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(6px)' }}\n >\n <div className=\"w-12 h-12 border-3 border-white/20 border-t-white/80 rounded-full animate-spin\" />\n </div>\n );\n }\n\n // Render screen content\n const renderScreen = () => {\n switch (screen) {\n case 'AuthSelection':\n return (\n <AuthSelection\n onNext={(method) => go(method === 'otp' ? 'Login' : 'SecurityUpgrade')}\n onExtensionSuccess={handleExtensionSuccess}\n onError={handleError}\n language={language}\n platform={finalPlatform}\n />\n );\n case 'Login':\n return (\n <Login\n onNext={handleLoginNext}\n onPasskeyUser={handlePasskeyUser}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'PasskeyAuth':\n return (\n <PasskeyAuth\n email={authState.email}\n onSuccess={handlePasskeyAuthSuccess}\n onError={handleError}\n onFallbackToOTP={() => go('Login')}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'PasskeyRegister':\n return (\n <PasskeyRegister\n email={authState.email || otpState.email}\n sessionToken={sessionToken || ''}\n onSuccess={handlePasskeyRegisterSuccess}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'PinVerification':\n return (\n <PinVerification\n email={otpState.email}\n verificationId={otpState.verificationId}\n onNext={handleOTPSuccess}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'SecurityUpgrade':\n return (\n <SecurityUpgrade\n onNext={handleSecurityUpgradeNext}\n onSkip={() => go('IdentityVerified')}\n language={language}\n />\n );\n case 'FaceScan':\n return (\n <FaceScan\n requestId={kycState.requestId}\n onNext={handleFaceScanNext}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'VerifyIdentityChoice':\n return (\n <VerifyIdentityChoice\n onNext={handleDocumentTypeSelected}\n language={language}\n />\n );\n case 'DocumentScan':\n return (\n <DocumentScan\n requestId={kycState.requestId}\n documentType={kycState.documentType!}\n onNext={handleDocumentScanNext}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'ReviewData':\n return (\n <ReviewData\n requestId={kycState.requestId}\n documentType={kycState.documentType!}\n extractedData={kycState.extractedData!}\n uploadId={uploadId}\n frontImageUrl={kycState.frontImageUrl}\n frontImageFileId={kycState.frontImageFileId}\n backImageUrl={kycState.backImageUrl}\n backImageFileId={kycState.backImageFileId}\n onNext={handleReviewDataNext}\n onRetake={() => go('DocumentScan')}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'MintingIdentity':\n // Determine the tier based on current state\n const mintingTier = kycState.requestId ? kycState.verificationTier : 'layer_1';\n return (\n <MintingIdentity\n tier={mintingTier}\n sessionToken={sessionToken || ''}\n requestId={kycState.requestId}\n onNext={handleMintingSuccess}\n onError={handleError}\n apiBaseUrl={finalApiBaseUrl}\n apiKey={apiKey}\n previewMode={previewMode}\n language={language}\n />\n );\n case 'IdentityVerified':\n return <IdentityVerified onNext={() => go('PermissionsRequest')} language={language} />;\n case 'PermissionsRequest':\n return (\n <PermissionsRequest\n onApprove={handleSuccess}\n onDeny={() => onClose?.()}\n language={language}\n appName={appMetadata?.name}\n appLogo={logoUrl || appMetadata?.logo_url}\n requestedScopes={appMetadata?.requested_scopes}\n />\n );\n default:\n return null;\n }\n };\n\n // In previewMode, render the card directly (no fixed overlay)\n if (previewMode) {\n return (\n <>\n <style key={styleKey}>{scopedStyles}</style>\n <div id={`casperid-modal-${modalId}`} style={cssVars} className={`relative ${resolvedTheme}`}>\n <GlassContainer className=\"backdrop-blur-3xl\" theme={resolvedTheme}>\n {screen !== 'FaceScan' && (\n <Header\n onClose={onClose}\n showClose={screen !== 'AuthSelection'}\n subtitle={screen === 'PermissionsRequest' ? 'PERMISSION REQUEST' : 'SECURE SDK'}\n theme={resolvedTheme}\n toggleTheme={toggleTheme}\n />\n )}\n <div className=\"flex-1 flex flex-col relative overflow-hidden\">\n <AnimatePresence mode=\"wait\">\n <motion.div key={screen} className=\"flex-1 flex flex-col\">\n {renderScreen()}\n </motion.div>\n </AnimatePresence>\n </div>\n {FOOTER_SCREENS.includes(screen) && (\n <Footer>\n <p className=\"text-[11px] text-slate-500 font-medium\">\n By connecting, you agree to our{' '}\n <a className=\"text-brand hover:underline ml-1\" href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">Terms of Service</a>\n {' '}&{' '}\n <a className=\"text-brand hover:underline ml-1\" href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a>\n </p>\n </Footer>\n )}\n </GlassContainer>\n </div>\n </>\n );\n }\n\n return (\n <>\n <style key={styleKey}>{scopedStyles}</style>\n {/* Overlay backdrop — sits on top of the host app */}\n <div\n className={`fixed inset-0 z-[9999] flex items-center justify-center ${finalLayout === 'fullscreen' ? 'p-0' : 'p-4'}`}\n style={{ backgroundColor: finalLayout === 'fullscreen' ? 'transparent' : 'rgba(0,0,0,0.6)', backdropFilter: finalLayout === 'fullscreen' ? 'none' : 'blur(6px)' }}\n onClick={(e) => e.target === e.currentTarget && onClose?.()}\n >\n {/* Ambient glows — inside the overlay, behind the card */}\n {finalLayout !== 'fullscreen' && (\n <div className=\"absolute inset-0 pointer-events-none overflow-hidden\">\n <div\n className=\"absolute top-[-10%] left-[-10%] w-[60%] h-[40%] rounded-full blur-[120px]\"\n style={{ backgroundColor: `${primaryColor}1a` }}\n />\n <div className=\"absolute bottom-[-5%] right-[-5%] w-[50%] h-[30%] bg-[#6DE8EC]/5 blur-[100px] rounded-full\" />\n </div>\n )}\n\n {/* The glass modal card */}\n <motion.div\n id={`casperid-modal-${modalId}`}\n initial={finalLayout === 'fullscreen' ? { opacity: 0 } : { opacity: 0, scale: 0.95, y: 20 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={finalLayout === 'fullscreen' ? { opacity: 0 } : { opacity: 0, scale: 0.95, y: 20 }}\n transition={{ type: 'spring', damping: 28, stiffness: 300 }}\n style={cssVars}\n className={`relative selection:bg-brand/30 ${resolvedTheme} ${\n finalLayout === 'fullscreen'\n ? 'w-full h-full'\n : finalPlatform === 'mobile'\n ? 'w-full max-w-md h-[90vh] max-h-[800px]'\n : 'w-full max-w-xl h-[85vh] max-h-[900px]'\n }`}\n >\n <GlassContainer className={`backdrop-blur-3xl ${finalLayout === 'fullscreen' ? 'w-full h-full rounded-none' : ''}`} theme={resolvedTheme}>\n {screen !== 'FaceScan' && (\n <Header\n onClose={onClose}\n showClose={screen !== 'AuthSelection'}\n subtitle={screen === 'PermissionsRequest' ? 'PERMISSION REQUEST' : 'SECURE SDK'}\n theme={resolvedTheme}\n toggleTheme={toggleTheme}\n />\n )}\n\n <div className=\"flex-1 flex flex-col relative overflow-hidden\">\n <AnimatePresence mode=\"wait\">\n <motion.div key={screen} className=\"flex-1 flex flex-col\">\n {renderScreen()}\n </motion.div>\n </AnimatePresence>\n </div>\n\n {/* Footer with ToS links, shown on early screens */}\n {FOOTER_SCREENS.includes(screen) && (\n <Footer>\n <p className=\"text-[11px] text-slate-500 font-medium\">\n By connecting, you agree to our{' '}\n <a className=\"text-brand hover:underline ml-1\" href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Terms of Service\n </a>{' '}\n &{' '}\n <a className=\"text-brand hover:underline ml-1\" href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Privacy Policy\n </a>\n </p>\n </Footer>\n )}\n </GlassContainer>\n </motion.div>\n </div>\n </>\n );\n};\n\nexport default CasperIDModal;\n","/**\n * Fetch wrapper with timeout support\n * @param url - The URL to fetch\n * @param options - Fetch options\n * @param timeout - Timeout in milliseconds (default: 30000)\n * @returns Promise<Response>\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeout: number = 30000\n): Promise<Response> {\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal\n });\n return response;\n } finally {\n clearTimeout(id);\n }\n}\n\n/**\n * Error class for API errors with status code\n */\nexport class ApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n }\n}\n\n/**\n * Helper to handle API response and throw on error\n */\nexport async function handleApiResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new ApiError(\n errorData.error || errorData.message || `Request failed with status ${response.status}`,\n response.status\n );\n }\n return response.json();\n}\n"],"names":["GlassContainer","children","className","theme","jsx","toKebabCase","string","mergeClasses","classes","index","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","ArrowRight","BadgeCheck","Calendar","Camera","ChevronRight","CircleAlert","CircleCheck","CircleHelp","CreditCard","Delete","Fingerprint","Flashlight","Globe","Key","LoaderCircle","Lock","Mail","Moon","Network","Puzzle","RefreshCw","RotateCcw","ShieldCheck","Shield","Smartphone","Sparkles","Sun","User","Wallet","X","Header","onClose","title","subtitle","showClose","toggleTheme","logoUrl","jsxs","Footer","translations","key","lang","language","AuthSelection","onNext","onExtensionSuccess","onError","platform","isCheckingExtension","setIsCheckingExtension","useState","extensionInstalled","setExtensionInstalled","error","setError","useEffect","checkExtensionInstalled","handleExtensionLogin","event","useCallback","anchor","storedUser","anchorAfterDelay","isValidUserData","data","userData","handleOTPLogin","motion","AlertCircle","Loader2","Login","onPasskeyUser","apiBaseUrl","apiKey","previewMode","email","setEmail","isLoading","setIsLoading","handleSubmit","response","errorData","errorMessage","handleKeyDown","e","Fragment","Verified","arrayBufferToBase64url","buffer","bytes","binary","i","base64urlToArrayBuffer","base64url","padding","base64","binaryString","isWebAuthnSupported","isPlatformAuthenticatorAvailable","detectDeviceType","userAgent","getDeviceInfo","prepareRegistrationOptions","serverOptions","_a","cred","prepareAuthenticationOptions","formatRegistrationCredential","credential","formatAuthenticationCredential","createPasskey","options","preparedOptions","authenticateWithPasskey","PasskeyAuth","onSuccess","onFallbackToOTP","isSupported","setIsSupported","autoTriggered","setAutoTriggered","supported","platformAvailable","timer","handleAuthenticate","initResponse","initData","completeResponse","completeData","err","message","PasskeyRegister","sessionToken","onSkip","isSuccess","setIsSuccess","handleRegister","benefits","benefit","CheckCircle2","PinVerification","verificationId","pin","setPin","isVerifying","setIsVerifying","isResending","setIsResending","resendCooldown","setResendCooldown","currentVerificationId","setCurrentVerificationId","digit","handleVerify","handleDigitPress","prev","newPin","emptyIndex","d","handleDelete","otp","handleResend","maskedEmail","num","SecurityUpgrade","instructions","euclideanDist","p1","p2","FaceScan","requestId","videoRef","useRef","canvasRef","streamRef","framesRef","faceMeshRef","cameraRef","step","setStep","cameraReady","setCameraReady","isProcessing","setIsProcessing","cameraPermissionDenied","setCameraPermissionDenied","blinkCount","setBlinkCount","isBlinking","setIsBlinking","mouthOpenProgress","setMouthOpenProgress","stepRef","blinkCountRef","isBlinkingRef","mouthOpenProgressRef","submissionStartedRef","updateStep","value","updateBlinkCount","updateIsBlinking","updateMouthOpenProgress","progress","FaceMesh","n","faceMesh","file","onFaceMeshResults","camera","track","results","canvas","ctx","landmarks","processFaceLandmarks","currentStep","currentBlinkCount","currentIsBlinking","nose","isCentered","leftEyeOpen","leftEyeWidth","eyeRatio","newBlinkCount","captureFrame","upperLip","lowerLip","mouthOpen","topHead","chin","faceHeight","mouthOpenRatio","openProgress","submitLiveness","blob","formData","isV2Flow","endpoint","metadata","frame","_b","_c","errorMsg","_d","handleRetry","pos","AnimatePresence","docs","VerifyIdentityChoice","id","desc","getDocumentTypeLabels","DocumentScan","documentType","capturedImage","setCapturedImage","capturedImageUrl","setCapturedImageUrl","isUploading","setIsUploading","scanSide","setScanSide","frontImage","setFrontImage","stream","handleCapture","video","handleRetake","handleConfirm","HelpCircle","ReviewData","extractedData","uploadId","frontImageUrl","frontImageFileId","backImageUrl","backImageFileId","onRetake","setFormData","isSubmitting","setIsSubmitting","handleInputChange","field","confidence","confidencePercent","fill","getStatusMessages","tier","MintingIdentity","status","setStatus","setProgress","wallet","setWallet","didAddress","setDidAddress","credentialHash","setCredentialHash","humanId","setHumanId","hasStartedRef","currentMessage","runPreviewMode","runSetup","sleep","runL1Setup","runL2L3Setup","walletResponse","walletData","didResponse","didData","runL2Setup","maxAttempts","pollInterval","attempt","verificationStatus","proofHash","runL3Setup","ms","resolve","getTierIcon","getStatusLabel","IdentityVerified","defaultPermissions","PermissionsRequest","appName","appLogo","requestedScopes","onApprove","onDeny","permissions","perm","resolveMode","mode","FOOTER_SCREENS","DEFAULT_API_BASE_URL","initialKYCState","CasperIDModal","isOpen","requiredTier","initialScreen","termsUrl","privacyUrl","layout","cloudTheme","setCloudTheme","isLoadingCloudTheme","setIsLoadingCloudTheme","propPrimaryColor","propBorderRadius","propFontFamily","themeMode","propLayout","themePlatform","isMobileDevice","primaryColor","borderRadius","fontFamily","finalLayout","finalPlatform","resolvedTheme","setResolvedTheme","screen","setScreen","otpState","setOtpState","setSessionToken","authState","setAuthState","kycState","setKycState","setUploadId","appMetadata","setAppMetadata","finalApiBaseUrl","normalizedRadius","normalizedFont","modalId","React","cssVars","styleKey","scopedStyles","mq","handler","go","next","startVerification","handleOTPSuccess","token","userAccount","businessToken","proceedBasedOnTier","handlePasskeyUser","handlePasskeyAuthSuccess","user","handlePasskeyRegisterSuccess","currentTier","requiredLayer","tierOrder","currentIndex","requiredIndex","handleMintingSuccess","result","handleExtensionSuccess","bToken","handleSecurityUpgradeNext","handleFaceScanNext","livenessVerified","handleDocumentTypeSelected","handleDocumentScanNext","docUploadId","imageUrls","handleReviewDataNext","confirmedData","handleSuccess","handleError","handleLoginNext","renderScreen","method","mintingTier","fetchWithTimeout","url","timeout","controller","ApiError","handleApiResponse"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/hostedAuthorization.ts","../src/CasperIDButton.tsx","../src/useHostedAuthorizationCallback.ts"],"sourcesContent":["const TRANSACTION_PREFIX = 'casperid_authorization:';\nconst RESULT_PREFIX = 'casperid_authorization_result:';\nconst POPUP_PREFIX = 'casperid_authorization_popup:';\nconst DEFAULT_HOSTED_AUTHORIZATION_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport interface HostedAuthorizationOptions {\n clientId: string;\n redirectUri: string;\n accountUrl?: string;\n state?: string;\n mode?: 'auto' | 'popup' | 'redirect';\n /**\n * Maximum time to wait for popup authorization. Defaults to 30 minutes so\n * signup and cross-device verification can complete. Set to 0 to disable.\n */\n timeoutMs?: number;\n}\n\nexport interface HostedAuthorizationResult {\n code: string;\n state: string;\n codeVerifier: string;\n redirectUri: string;\n authorizationStatus?: 'complete' | 'provisional';\n verificationStatus?: 'approved' | 'pending';\n grantedTier?: string;\n requiredTier?: string;\n}\n\ninterface StoredTransaction {\n state: string;\n codeVerifier: string;\n redirectUri: string;\n accountOrigin: string;\n}\n\ninterface StoredResult {\n code?: string;\n state: string;\n error?: string;\n errorDescription?: string;\n authorizationStatus?: 'complete' | 'provisional';\n verificationStatus?: 'approved' | 'pending';\n grantedTier?: string;\n requiredTier?: string;\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n let binary = '';\n bytes.forEach((byte) => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nfunction randomValue(byteLength = 32): string {\n const bytes = new Uint8Array(byteLength);\n crypto.getRandomValues(bytes);\n return toBase64Url(bytes);\n}\n\nasync function sha256(value: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return toBase64Url(new Uint8Array(digest));\n}\n\nfunction transactionKey(state: string): string {\n return `${TRANSACTION_PREFIX}${state}`;\n}\n\nfunction resultKey(state: string): string {\n return `${RESULT_PREFIX}${state}`;\n}\n\nfunction popupKey(state: string): string {\n return `${POPUP_PREFIX}${state}`;\n}\n\nfunction saveTransaction(transaction: StoredTransaction): void {\n sessionStorage.setItem(transactionKey(transaction.state), JSON.stringify(transaction));\n}\n\nfunction loadTransaction(state: string): StoredTransaction | null {\n const stored = sessionStorage.getItem(transactionKey(state));\n if (!stored) return null;\n try {\n return JSON.parse(stored) as StoredTransaction;\n } catch {\n return null;\n }\n}\n\nfunction consumeTransaction(state: string): StoredTransaction | null {\n const transaction = loadTransaction(state);\n sessionStorage.removeItem(transactionKey(state));\n return transaction;\n}\n\nfunction storeResult(result: StoredResult): void {\n localStorage.setItem(resultKey(result.state), JSON.stringify(result));\n}\n\nfunction loadResult(state: string): StoredResult | null {\n const stored = localStorage.getItem(resultKey(state));\n if (!stored) return null;\n try {\n return JSON.parse(stored) as StoredResult;\n } catch {\n return null;\n }\n}\n\nfunction clearResult(state: string): void {\n localStorage.removeItem(resultKey(state));\n}\n\nfunction markPopupTransaction(state: string): void {\n localStorage.setItem(popupKey(state), '1');\n}\n\nfunction isPopupTransaction(state: string): boolean {\n return localStorage.getItem(popupKey(state)) === '1';\n}\n\nfunction clearPopupTransaction(state: string): void {\n localStorage.removeItem(popupKey(state));\n}\n\n// ═══════════════════════════════════════════\n// DEBUG: enable logging via URL param or localStorage flag\n// ═══════════════════════════════════════════\nfunction isDebugEnabled(): boolean {\n return (\n new URLSearchParams(window.location.search).get('casperid_debug') === 'true' ||\n localStorage.getItem('casperid_debug') === 'true'\n );\n}\nconst DEBUG = /* @__PURE__ */ isDebugEnabled();\nfunction debug(...args: unknown[]) {\n if (DEBUG) console.log('[CasperID SDK DEBUG]', ...args);\n}\n// ═══════════════════════════════════════════\n\nfunction isMobileBrowser(): boolean {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n}\n\nexport async function buildHostedAuthorizationUrl(options: HostedAuthorizationOptions): Promise<{ url: string; state: string }> {\n const accountUrl = new URL(options.accountUrl || 'https://account.casperid.com');\n const state = options.state || randomValue();\n const codeVerifier = randomValue(48);\n const codeChallenge = await sha256(codeVerifier);\n const redirectUri = new URL(options.redirectUri).toString();\n\n accountUrl.pathname = '/authorize';\n accountUrl.search = new URLSearchParams({\n response_type: 'code',\n client_id: options.clientId,\n redirect_uri: redirectUri,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n }).toString();\n\n saveTransaction({\n state,\n codeVerifier,\n redirectUri,\n accountOrigin: accountUrl.origin,\n });\n\n debug('buildHostedAuthorizationUrl → url:', accountUrl.toString(), 'state:', state);\n return { url: accountUrl.toString(), state };\n}\n\nexport async function authorizeWithCasperID(options: HostedAuthorizationOptions): Promise<HostedAuthorizationResult> {\n const mode = options.mode === 'auto' || !options.mode\n ? (isMobileBrowser() ? 'redirect' : 'popup')\n : options.mode;\n const authorization = await buildHostedAuthorizationUrl(options);\n\n debug('authorizeWithCasperID → mode:', mode, 'authUrl:', authorization.url);\n\n if (mode === 'redirect') {\n window.location.assign(authorization.url);\n return new Promise(() => undefined);\n }\n\n const popupUrl = new URL(authorization.url);\n popupUrl.searchParams.set('response_mode', 'web_message');\n popupUrl.searchParams.set('response_origin', window.location.origin);\n markPopupTransaction(authorization.state);\n const popup = window.open(popupUrl.toString(), 'casperid_authorization', 'popup=yes,width=520,height=720');\n if (!popup) {\n debug('popup was blocked!');\n clearPopupTransaction(authorization.state);\n if (!options.mode || options.mode === 'auto') {\n window.location.assign(authorization.url);\n return new Promise(() => undefined);\n }\n consumeTransaction(authorization.state);\n throw new Error('CasperID authorization popup was blocked.');\n }\n const openedPopup = popup;\n\n debug('popup opened successfully. popup.closed:', openedPopup.closed, 'origin:', window.location.origin);\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const timeoutMs = options.timeoutMs ?? DEFAULT_HOSTED_AUTHORIZATION_TIMEOUT_MS;\n const timeout = timeoutMs > 0\n ? window.setTimeout(() => finish(new Error('CasperID authorization timed out.')), timeoutMs)\n : null;\n let tickCount = 0;\n const poll = window.setInterval(() => {\n tickCount++;\n const sharedResult = loadResult(authorization.state);\n if (sharedResult?.error) {\n finish(new Error(sharedResult.errorDescription || sharedResult.error));\n return;\n }\n if (sharedResult?.code) {\n debug(`tick #${tickCount}: shared result found via localStorage`);\n finish(undefined, sharedResult.code, sharedResult);\n return;\n }\n\n if (openedPopup.closed) {\n debug(`tick #${tickCount}: popup.closed === true; ignored because opener isolation can sever the reference`);\n }\n\n try {\n const popupUrl = new URL(openedPopup.location.href);\n debug(`tick #${tickCount}: popup URL readable → origin: ${popupUrl.origin}, pathname: ${popupUrl.pathname}`);\n if (popupUrl.origin !== window.location.origin) {\n return;\n }\n\n const code = popupUrl.searchParams.get('code');\n const state = popupUrl.searchParams.get('state');\n debug(`tick #${tickCount}: same origin! code=${code}, state=${state}, expected_state=${authorization.state}`);\n if (!code || state !== authorization.state) {\n return;\n }\n\n finish(undefined, code, {\n authorizationStatus: popupUrl.searchParams.get('authorization_status') as StoredResult['authorizationStatus'] || undefined,\n verificationStatus: popupUrl.searchParams.get('verification_status') as StoredResult['verificationStatus'] || undefined,\n grantedTier: popupUrl.searchParams.get('granted_tier') || undefined,\n requiredTier: popupUrl.searchParams.get('required_tier') || undefined,\n });\n } catch {\n // Still on the account origin; continue polling.\n }\n }, 500);\n\n const onStorage = (event: StorageEvent) => {\n if (event.key !== resultKey(authorization.state) || !event.newValue) {\n return;\n }\n\n try {\n const sharedResult = JSON.parse(event.newValue) as StoredResult;\n if (sharedResult.state === authorization.state) {\n if (sharedResult.error) finish(new Error(sharedResult.errorDescription || sharedResult.error));\n else if (sharedResult.code) finish(undefined, sharedResult.code, sharedResult);\n }\n } catch {\n // Ignore malformed cross-window payloads.\n }\n };\n\n const onMessage = (event: MessageEvent) => {\n const transaction = loadTransaction(authorization.state);\n if (!transaction || event.origin !== transaction.accountOrigin || event.source !== openedPopup) return;\n const result = event.data as { type?: string; state?: string; code?: string; error?: string; error_description?: string } & StoredResult;\n if (result.type !== 'casperid:authorization' || result.state !== authorization.state) return;\n if (result.error) finish(new Error(result.error_description || result.error));\n else if (result.code) finish(undefined, result.code, result);\n };\n\n function finish(error?: Error, code?: string, metadata: Partial<StoredResult> = {}) {\n if (settled) { debug('finish called but already settled — skipping'); return; }\n debug('finish called — error:', error?.message, 'code:', code);\n settled = true;\n if (timeout !== null) window.clearTimeout(timeout);\n window.clearInterval(poll);\n window.removeEventListener('storage', onStorage);\n window.removeEventListener('message', onMessage);\n try {\n openedPopup.close();\n } catch {\n debug('popup reference is inaccessible due to opener isolation');\n }\n if (error) {\n consumeTransaction(authorization.state);\n clearResult(authorization.state);\n clearPopupTransaction(authorization.state);\n debug('rejecting with:', error.message);\n reject(error);\n return;\n }\n const transaction = consumeTransaction(authorization.state);\n if (!transaction || !code) {\n debug('transaction missing or no code — rejecting');\n clearResult(authorization.state);\n clearPopupTransaction(authorization.state);\n reject(new Error('CasperID authorization transaction is missing.'));\n return;\n }\n clearResult(authorization.state);\n clearPopupTransaction(authorization.state);\n debug('resolving successfully');\n resolve({\n code,\n state: transaction.state,\n codeVerifier: transaction.codeVerifier,\n redirectUri: transaction.redirectUri,\n authorizationStatus: metadata.authorizationStatus,\n verificationStatus: metadata.verificationStatus,\n grantedTier: metadata.grantedTier,\n requiredTier: metadata.requiredTier,\n });\n }\n\n window.addEventListener('storage', onStorage);\n window.addEventListener('message', onMessage);\n });\n}\n\nexport function consumeHostedAuthorizationCallback(url = window.location.href): HostedAuthorizationResult | null {\n const callbackUrl = new URL(url);\n const code = callbackUrl.searchParams.get('code');\n const state = callbackUrl.searchParams.get('state');\n const error = callbackUrl.searchParams.get('error');\n const errorDescription = callbackUrl.searchParams.get('error_description');\n const metadata: Partial<StoredResult> = {\n authorizationStatus: callbackUrl.searchParams.get('authorization_status') as StoredResult['authorizationStatus'] || undefined,\n verificationStatus: callbackUrl.searchParams.get('verification_status') as StoredResult['verificationStatus'] || undefined,\n grantedTier: callbackUrl.searchParams.get('granted_tier') || undefined,\n requiredTier: callbackUrl.searchParams.get('required_tier') || undefined,\n };\n if ((!code && !error) || !state) return null;\n\n const transaction = consumeTransaction(state);\n if (!transaction) throw new Error('CasperID authorization state is invalid or expired.');\n\n if (window.opener || isPopupTransaction(state)) {\n debug('popup callback detected; publishing result for opener');\n storeResult({ code: code || undefined, state, error: error || undefined, errorDescription: errorDescription || undefined, ...metadata });\n clearPopupTransaction(state);\n window.close();\n return null;\n }\n\n if (error) throw new Error(errorDescription || error);\n\n return {\n code: code as string,\n state,\n codeVerifier: transaction.codeVerifier,\n redirectUri: transaction.redirectUri,\n authorizationStatus: metadata.authorizationStatus,\n verificationStatus: metadata.verificationStatus,\n grantedTier: metadata.grantedTier,\n requiredTier: metadata.requiredTier,\n };\n}\n","import React, { useState } from 'react';\nimport {\n authorizeWithCasperID,\n HostedAuthorizationOptions,\n HostedAuthorizationResult,\n} from './utils/hostedAuthorization';\n\nexport interface CasperIDButtonProps extends HostedAuthorizationOptions {\n onSuccess?: (result: HostedAuthorizationResult) => void;\n onError?: (error: Error) => void;\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n id?: string;\n}\n\nexport function CasperIDButton({\n onSuccess,\n onError,\n children = 'Continue with CasperID',\n className,\n disabled,\n id,\n ...options\n}: CasperIDButtonProps) {\n const [isLoading, setIsLoading] = useState(false);\n\n const authorize = async () => {\n setIsLoading(true);\n try {\n const result = await authorizeWithCasperID(options);\n onSuccess?.(result);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error('CasperID authorization failed.'));\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <button id={id} type=\"button\" className={className} disabled={disabled || isLoading} onClick={authorize}>\n {isLoading ? 'Opening CasperID...' : children}\n </button>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport {\n consumeHostedAuthorizationCallback,\n HostedAuthorizationResult,\n} from './utils/hostedAuthorization';\n\nexport function useHostedAuthorizationCallback(\n onSuccess: (result: HostedAuthorizationResult) => void,\n onError?: (error: Error) => void\n) {\n const handled = useRef(false);\n const successRef = useRef(onSuccess);\n const errorRef = useRef(onError);\n successRef.current = onSuccess;\n errorRef.current = onError;\n\n useEffect(() => {\n if (handled.current) return;\n handled.current = true;\n try {\n const result = consumeHostedAuthorizationCallback();\n if (result) successRef.current(result);\n } catch (error) {\n errorRef.current?.(error instanceof Error ? error : new Error('CasperID authorization callback failed.'));\n }\n }, []);\n}\n"],"names":["TRANSACTION_PREFIX","RESULT_PREFIX","POPUP_PREFIX","DEFAULT_HOSTED_AUTHORIZATION_TIMEOUT_MS","toBase64Url","bytes","binary","byte","randomValue","byteLength","sha256","value","digest","transactionKey","state","resultKey","popupKey","saveTransaction","transaction","loadTransaction","stored","consumeTransaction","storeResult","result","loadResult","clearResult","markPopupTransaction","isPopupTransaction","clearPopupTransaction","isDebugEnabled","DEBUG","debug","args","isMobileBrowser","buildHostedAuthorizationUrl","options","accountUrl","codeVerifier","codeChallenge","redirectUri","authorizeWithCasperID","mode","authorization","popupUrl","popup","openedPopup","resolve","reject","settled","timeoutMs","timeout","finish","tickCount","poll","sharedResult","code","onStorage","event","onMessage","error","metadata","consumeHostedAuthorizationCallback","url","callbackUrl","errorDescription","CasperIDButton","onSuccess","onError","children","className","disabled","id","isLoading","setIsLoading","useState","authorize","jsx","useHostedAuthorizationCallback","handled","useRef","successRef","errorRef","useEffect","_a"],"mappings":"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"}
|